local pluginKeys = {} -- 设定映射函数 -- set map function local map = vim.api.nvim_set_keymap local opt = { noremap = true, silent = true } local wk = require("which-key") -- basic operation for write and quit -- 文件写入退出基本操作 wk.register({ ["s"] = { ":w!", "Save File" }, ["q"] = { ":qa", "Quit All" }, ["S"] = { ":wa", "Save All" }, }) -- lsp 回调快捷键设置 pluginKeys.maplsp = function(mapbuf) -- go xx mapbuf("n", "]d", "lua vim.lsp.buf.definition()", opt) -- mapbuf("n", "gh", "lua vim.lsp.buf.hover()", opt) mapbuf("n", "]D", "lua vim.lsp.buf.declaration()", opt) mapbuf("n", "]i", "lua vim.lsp.buf.implementation()", opt) mapbuf("n", "]r", "lua vim.lsp.buf.references()", opt) -- diagnostic mapbuf("n", "]p", "lua vim.diagnostic.goto_prev()", opt) mapbuf("n", "]n", "lua vim.diagnostic.goto_next()", opt) mapbuf("n", "]a", "lua vim.lsp.buf.code_action()", opt) mapbuf("n", "]h", "lua vim.lsp.buf.hover()", opt) end -- code related -- 代码相关 map("n", ",", ":Jaq", opt) -- markdown related -- markdown 相关 wk.register({ ["m"] = { ":MarkdownPreview", "Markdown preview" }, }) -- git related -- git 相关 wk.register({ ["g"] = { ":LazyGit", "Open lazygit" }, }) -- file related -- 文件相关操作 wk.register({ [""] = { "", "Last file" }, }) wk.register({ ["f"] = { name = "+File", p = { ":Telescope projects", "Open project" }, r = { ":Telescope oldfiles", "Recent files" }, b = { ":Telescope file_browser", "File browser" }, n = { ":AdvancedNewFile", "New file" }, s = { ":Telescope live_grep", "Search in project" }, f = { ":Telescope find_files", "Search file" }, }, }) -- jk map to esc -- jk映射为esc键 map("i", "jk", "", opt) -- window operate by which-key -- 窗口操作(使用which-key快捷键设置) wk.register({ ["w"] = { name = "+Window", h = { "h", "To left" }, j = { "j", "To up" }, k = { "k", "To down" }, l = { "l", "To right" }, s = { ":sp", "Split window" }, v = { ":vsplit", "Vsplit window" }, d = { ":close", "Close window" }, o = { ":only", "Close others" }, }, }) -- base operation for visual mode -- 可视模式下基本操作 map("v", "<", "", ">gv", opt) -- neoTree map("n", "T", ":NeoTreeFocusToggle", opt) -- Packer wk.register({ ["p"] = { name = "+Packer", i = { ":PackerSync", "PackerSync" }, s = { ":PackerStatus", "PackerStatus" }, c = { ":PackerClean", "PackerClean" }, }, }) -- Bufferline and buffer related wk.register({ ["b"] = { name = "+Buffer", k = { ":bd!", "Kill buffer" }, o = { ":BufferLineCloseRight:BufferLineCloseLeft", "Close other buffer" }, b = { ":Telescope buffers", "Open buffers" }, n = { ":ls", "Buffer numbers" }, c = { ":noh", "Cancel highlight" }, C = { ":call setqflist([], 'r')", "Clear quickfix" }, q = { ":copen", "Open quickfix" }, s = { ":Telescope current_buffer_fuzzy_find", "Searching in buffer" }, }, }) wk.register({ ["j"] = { ":HopLineStart", "Quick jump line" }, }) -- 快速切换主题 wk.register({ ["c"] = { ":Telescope colorscheme", "Quick change colortheme" }, }) map("n", "", "za", opt) -- insert 模式下ctrl a e跳转开头结尾 map("i", "", "I", opt) map("i", "", "A", opt) -- change left and right tab -- 左右Tab切换 map("n", "", ":BufferLineCyclePrev", opt) map("n", "", ":BufferLineCycleNext", opt) map("i", "", ":BufferLineCyclePrev", opt) map("i", "", ":BufferLineCycleNext", opt) -- Mason wk.register({ ["l"] = { name = "+Lsp", i = { ":LspInstall", "Install lsp" }, I = { ":MasonInstall ", "Install any" }, r = { ":LspRestart", "Lsp restart" }, m = { ":Mason", "Mason info" }, u = { ":MasonUninstall", "Uninstall lsp" }, U = { ":MasonUninstallAll", "Unistall all" }, l = { ":LspInfo", "Lsp infos" }, R = { vim.lsp.buf.rename, "Buffer var rename" }, }, }) -- cmpeletion keys -- 补全快捷键 pluginKeys.cmp = function(cmp) return { -- next option [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif require("luasnip").expand_or_jumpable() then require("luasnip").expand_or_jump() else fallback() end end, { "i", "s" }), -- 下一个 [""] = cmp.mapping.select_prev_item(), [""] = cmp.mapping.confirm({ select = true, behavior = cmp.ConfirmBehavior.Replace, }), } end -- dap keymaps wk.register({ ["d"] = { name = "+Debug", r = { ":lua require('dap').continue()", "Start debug" }, b = { ":lua require('dap').toggle_breakpoint()", "Set breakpoint" }, c = { ":lua require('dap').clear_breakpoints()", "Clear breakpoint" }, e = { ":lua require'dap'.close()" .. ":lua require'dap'.terminate()" .. ":lua require'dap.repl'.close()" .. ":lua require'dapui'.close()" .. ":DapVirtualTextDisable" .. "o", "Stop debug", }, }, }) map("i", "", ":lua require'dap'.continue()", opt) map("n", "", ":lua require'dap'.step_into()", opt) map("n", "", ":lua require'dap'.step_over()", opt) -- set keymap based on file type vim.cmd("autocmd FileType * lua SetKeybinds()") function SetKeybinds() local fileTy = vim.api.nvim_buf_get_option(0, "filetype") local opts = { prefix = "", buffer = 0 } if fileTy == "markdown" then wk.register({ ["t"] = { ":InsertNToc", "Insert table of content" }, ["d"] = { ":HeaderDecrease", "All header decrease" }, ["i"] = { ":HeaderIncrease", "All header increase" }, }, opts) elseif fileTy == "python" then wk.register({ ["r"] = { ":MagmaEvaluateOperator", "Jupyter evaluate" }, ["c"] = { ":MagmaEvaluateCell", "Jupyter evaluate cell" }, }, opts) -- elseif fileTy == "sh" then -- wk.register({ -- ["W"] = { ":w", "test write" }, -- ["Q"] = { ":q", "test quit" }, -- }, opts) end end return pluginKeys