return { { "nvzone/menu", dependencies = { "nvzone/volt" }, keys = { { "", function() require("menu").open(_G.YoumuMenu, { border = true }) end, mode = "n", desc = "打开主菜单", }, { "", "lua require('menu').open(_G.YoumuMenu, { border = true })", mode = "i", desc = "打开主菜单", }, { "", "lua require('menu').open(_G.YoumuMenu, { border = true })", mode = "t", desc = "打开主菜单", }, }, config = function() -- 菜单关闭并恢复原窗口后,调用现有快捷键。 -- 与直接按键使用同一套 LazyVim 功能。 local function run_keys(keys) return function() vim.schedule(function() local input = vim.api.nvim_replace_termcodes(keys, true, false, true) vim.api.nvim_feedkeys(input, "m", false) end) end end local function item(name, keys) return { name = name, rtxt = keys, cmd = run_keys(keys), } end _G.YoumuMenu = { { name = "文件", keybind = "f", items = { item("查找项目文件", ""), item("已打开的文件", ","), item("保存当前文件", ""), { name = "保存全部", cmd = "wall", }, item("关闭当前文件", "bd"), item("关闭其他文件", "bo"), { name = "退出 Neovim", cmd = "confirm qa", }, }, }, { name = "代码", keybind = "c", items = { item("跳转到定义", "gd"), item("查找引用", "gr"), item("查看文档", "K"), item("重命名符号", "cr"), item("代码操作", "ca"), item("格式化文件", "cf"), item("当前文件符号", "ss"), item("查看诊断", "cd"), }, }, { name = "视图", keybind = "v", items = { item("文件树", "e"), item("项目终端", "ft"), item("向右分屏", "|"), item("向下分屏", "-"), item("最大化/还原窗格", "wm"), item("上一个文件", ""), item("下一个文件", ""), }, }, { name = "设置", keybind = "s", items = { item("搜索快捷键", "sk"), item("搜索命令", "sC"), item("选择主题", "uC"), { name = "插件管理", cmd = "Lazy", }, { name = "语言工具管理", cmd = "Mason", }, }, { name = "切换工作区域", rtxt = "w", cmd = function() vim.schedule(function() vim.cmd("ChooseWindow") end) end, }, }, } -- 只修改菜单窗口的按键,不影响代码编辑。 vim.api.nvim_create_autocmd("FileType", { group = vim.api.nvim_create_augroup("YoumuMenuNavigation", { clear = true }), pattern = "NvMenu", callback = function(event) local opts = { buffer = event.buf, silent = true, } vim.keymap.set("n", "", "k", opts) vim.keymap.set("n", "", "j", opts) local remap_opts = { buffer = event.buf, silent = true, remap = true, } -- 复用菜单自身的操作,包含关闭后的焦点恢复。 vim.keymap.set("n", "", "h", remap_opts) vim.keymap.set("n", "", "", remap_opts) vim.keymap.set("n", "", "q", remap_opts) end, }) end, }, }