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.add({ { "s", ":w!", desc = "Save File" }, { "q", ":qa", desc = "Quit All" }, { "S", ":wa", desc = "Save All" }, }) -- iron related wk.add({ { "i", group = "Iron" }, { "il", "lua require('iron.core').send_line()", desc = "Send line" }, { "if", "lua require('iron.core').send_file()", desc = "Send file" }, { "ic", "lua require('iron.core').send_until_cursor()", desc = "Send to cursor" }, }) -- 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 wk.add({ { "m", ":RenderMarkdown toggle", desc = "Markdown preview" }, }) -- git related wk.add({ { "g", ":LazyGit", desc = "Open lazygit" }, }) -- file related wk.add({ { "", "", desc = "Last file" }, }) wk.add({ { "f", group = "File" }, { "fp", ":Telescope projects", desc = "Open project" }, { "fr", ":Telescope oldfiles", desc = "Recent files" }, { "fb", ":Telescope file_browser", desc = "File browser" }, { "fn", ":AdvancedNewFile", desc = "New file" }, { "fs", ":Telescope live_grep", desc = "Search in project" }, { "ff", ":Telescope find_files", desc = "Search file" }, { "fc", ":source $MYVIMRC", desc = "Reload config file" }, }) -- jk map to esc -- jk映射为esc键 map("i", "jk", "", opt) -- window operate by which-key wk.add({ { "w", group = "Window" }, { "wh", "h", desc = "To left" }, { "wj", "j", desc = "To up" }, { "wk", "k", desc = "To down" }, { "wl", "l", desc = "To right" }, { "ws", ":sp", desc = "Split window" }, { "wv", ":vsplit", desc = "Vsplit window" }, { "wd", ":close", desc = "Close window" }, { "wo", ":only", desc = "Close others" }, }) -- base operation for visual mode -- 可视模式下基本操作 map("v", "<", "", ">gv", opt) -- neoTree map("n", "T", ":NeoTreeFocusToggle", opt) -- 定义开关quickfix窗口的函数 local function toggle_quickfix() -- 获取所有窗口的信息 local wininfo = vim.fn.getwininfo() -- 遍历所有窗口 for _, win in pairs(wininfo) do -- 如果这个窗口是 quickfix 窗口 if win.quickfix == 1 then -- 关闭 quickfix 窗口 vim.cmd("cclose") -- 返回,不再继续查找 return end end -- 如果没有找到 quickfix 窗口,就打开一个 vim.cmd("copen") end -- Bufferline and buffer related wk.add({ { "b", group = "Buffer" }, { "bk", ":bd!", desc = "Kill buffer" }, { "bo", ":BufferLineCloseRight:BufferLineCloseLeft", desc = "Close other buffer" }, { "bb", ":Telescope buffers", desc = "Open buffers" }, { "bn", ":ls", desc = "Buffer numbers" }, { "bc", ":noh", desc = "Cancel highlight" }, { "bC", ":call setqflist([], 'r')", desc = "Clear quickfix" }, { "bq", function() toggle_quickfix() end, desc = "Toggle quickfix", }, { "bs", ":Telescope current_buffer_fuzzy_find", desc = "Searching in buffer" }, }) wk.add({ { "j", ":HopLineStart", desc = "Quick jump line" }, }) wk.add({ { "c", group = "GPT" }, { "ct", ":CodeCompanionChat Toggle", desc = "Code companion chat" }, { mode = { "n", "v" }, -- NORMAL and VISUAL mode { "ca", "CodeCompanionActions", desc = "Code companion actions" }, }, }) -- 快速切换主题 -- 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.add({ { "l", group = "Lsp" }, { "li", ":LspInstall", desc = "Install lsp" }, { "lI", ":MasonInstall ", desc = "Install any" }, { "lr", ":LspRestart", desc = "Lsp restart" }, { "lm", ":Mason", desc = "Mason info" }, { "lu", ":MasonUninstall", desc = "Uninstall lsp" }, { "lU", ":MasonUninstallAll", desc = "Unistall all" }, { "ll", ":LspInfo", desc = "Lsp infos" }, { "lR", vim.lsp.buf.rename, desc = "Buffer var rename" }, }) -- dap keymaps wk.add({ { "d", group = "Debug" }, { "dr", ":lua require('dap').continue()", desc = "Start debug" }, { "db", ":lua require('dap').toggle_breakpoint()", desc = "Set breakpoint" }, { "dc", ":lua require('dap').clear_breakpoints()", desc = "Clear breakpoint" }, { "de", ":lua require'dap'.close():lua require'dap'.terminate():lua require'dap.repl'.close():lua require'dapui'.close():DapVirtualTextDisableo", desc = "Stop debug", }, }) -- 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 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.add({ { "t", ":InsertNToc", desc = "Insert table of content", buffer = 0 }, { "d", ":HeaderDecrease", desc = "All header decrease", buffer = 0 }, { "i", ":HeaderIncrease", desc = "All header increase", buffer = 0 }, }) elseif fileTy == "python" then wk.add({ { "r", ":MagmaEvaluateOperator", desc = "Jupyter evaluate", buffer = 0 }, { "c", ":MagmaEvaluateCell", desc = "Jupyter evaluate cell", buffer = 0 }, }) elseif fileTy == "dart" then wk.add({ { "r", ":FlutterRun", desc = "FlutterRun", buffer = 0 }, { "q", ":FlutterQuit", desc = "FlutterQuit", buffer = 0 }, { "c", ":FlutterCopyProfilerUrl", desc = "FlutterCopyProfilerUrl", buffer = 0 }, { "w", ":FlutterDevTools", desc = "FlutterDevTools", buffer = 0 }, }) -- elseif fileTy == "sh" then -- wk.add({ -- { "W", ":w", desc = "test write", buffer = 0 }, -- { "Q", ":q", desc = "test quit", buffer = 0 }, -- }) end end return pluginKeys