From 8ad2067a64db9729a0c245bded04a708a2edc42b Mon Sep 17 00:00:00 2001 From: Super_Z <1401203083@qq.com> Date: Thu, 16 Jul 2026 11:45:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20VSCode=20=E9=A3=8E=E6=A0=BC=20Neovim=20?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 分层架构:config/{options,keymaps,lazy} + plugins/ - 保留:blink.cmp, oil.nvim, runner.lua, cmake-tools, diffview, tokyonight - 新增 UI:bufferline, lualine, noice, nvim-notify, dashboard, dressing - 新增编辑器:Comment, nvim-surround, vim-illuminate, toggleterm, flash - 新增视觉:indent-blankline, nvim-ufo, rainbow-delimiters - 新增 Git:lazygit 集成 - 新增 DAP:persistent-breakpoints, nvim-dap-virtual-text - 修复:which-key 启用, rustaceanvim 填充, 键位冲突解决 - 语法检查:22/22 文件全部通过 luajit -b --- init.lua | 9 ++ lua/config/keymaps.lua | 126 ++++++++++++++++++++++ lua/config/lazy.lua | 55 ++++++++++ lua/config/options.lua | 91 ++++++++++++++++ lua/plugins/autopairs.lua | 15 +++ lua/plugins/cmake-tools.lua | 50 +++++++++ lua/plugins/colorscheme.lua | 48 +++++++++ lua/plugins/completion.lua | 56 ++++++++++ lua/plugins/conform.lua | 46 ++++++++ lua/plugins/dap.lua | 99 ++++++++++++++++++ lua/plugins/devicons.lua | 29 ++++++ lua/plugins/editor.lua | 126 ++++++++++++++++++++++ lua/plugins/git.lua | 91 ++++++++++++++++ lua/plugins/lsp.lua | 161 ++++++++++++++++++++++++++++ lua/plugins/oil.lua | 37 +++++++ lua/plugins/runner.lua | 27 +++++ lua/plugins/rustaceanvim.lua | 23 ++++ lua/plugins/telescope.lua | 61 +++++++++++ lua/plugins/treesitter.lua | 24 +++++ lua/plugins/ui.lua | 197 +++++++++++++++++++++++++++++++++++ lua/plugins/whichkey.lua | 65 ++++++++++++ lua/runner.lua | 91 ++++++++++++++++ 22 files changed, 1527 insertions(+) create mode 100644 init.lua create mode 100644 lua/config/keymaps.lua create mode 100644 lua/config/lazy.lua create mode 100644 lua/config/options.lua create mode 100644 lua/plugins/autopairs.lua create mode 100644 lua/plugins/cmake-tools.lua create mode 100644 lua/plugins/colorscheme.lua create mode 100644 lua/plugins/completion.lua create mode 100644 lua/plugins/conform.lua create mode 100644 lua/plugins/dap.lua create mode 100644 lua/plugins/devicons.lua create mode 100644 lua/plugins/editor.lua create mode 100644 lua/plugins/git.lua create mode 100644 lua/plugins/lsp.lua create mode 100644 lua/plugins/oil.lua create mode 100644 lua/plugins/runner.lua create mode 100644 lua/plugins/rustaceanvim.lua create mode 100644 lua/plugins/telescope.lua create mode 100644 lua/plugins/treesitter.lua create mode 100644 lua/plugins/ui.lua create mode 100644 lua/plugins/whichkey.lua create mode 100644 lua/runner.lua diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..6e7a2d5 --- /dev/null +++ b/init.lua @@ -0,0 +1,9 @@ +-- ============================================================================= +-- init.lua — Neovim 入口文件 +-- ============================================================================= +-- 【结构变更】原 init.lua 中 options + keymaps + lazy 全部内联, +-- 现拆分为 config/options.lua + config/keymaps.lua + config/lazy.lua 三层, +-- 更利于 :Lazy reload 和后续维护。 +require("config.options") +require("config.keymaps") +require("config.lazy") diff --git a/lua/config/keymaps.lua b/lua/config/keymaps.lua new file mode 100644 index 0000000..d6277e0 --- /dev/null +++ b/lua/config/keymaps.lua @@ -0,0 +1,126 @@ +-- ============================================================================= +-- keymaps.lua — 基础键位映射 +-- ============================================================================= +-- 【来源】从原 init.lua 提取 + 参考配置精华合并。 +-- 【保留】你的 窗口跳转、w/q 保存退出、oil 键位等。 +-- 【新增】已用 ✅ 标注,【修改】已用 🔧 标注。 + +local keymap = vim.keymap.set +local M = {} + +-- ───────────────────────────────────────────── +-- Leader 键 +-- ───────────────────────────────────────────── +vim.g.mapleader = " " +vim.g.maplocalleader = " " + +-- ───────────────────────────────────────────── +-- 编辑器操作 +-- ───────────────────────────────────────────── +keymap("n", "w", "w", { desc = "保存" }) +keymap("n", "q", "q", { desc = "退出" }) +keymap("n", "Q", "qa", { desc = "✅ 新增:全部退出" }) +keymap("n", "/", "noh", { desc = "清除搜索高亮" }) + +-- ───────────────────────────────────────────── +-- 窗口导航(保留你的 C-h/j/k/l 跳转) +-- ───────────────────────────────────────────── +keymap("n", "", "h", { desc = "跳到左边窗口" }) +keymap("n", "", "j", { desc = "跳到下面窗口" }) +keymap("n", "", "k", { desc = "跳到上面窗口" }) +keymap("n", "", "l", { desc = "跳到右边窗口" }) + +-- ✅ 新增:窗口操作(用 W 前缀,不与跳转冲突) +keymap("n", "W", "", { desc = "窗口操作" }) +keymap("n", "Wv", "vsplit", { desc = "垂直分割" }) +keymap("n", "Wh", "split", { desc = "水平分割" }) +keymap("n", "Wc", "close", { desc = "关闭窗口" }) +keymap("n", "Wo", "only", { desc = "关闭其他" }) +keymap("n", "Wr", "wincmd r", { desc = "旋转窗口" }) +keymap("n", "W=", "wincmd =", { desc = "平衡窗口" }) + +-- ✅ 新增:用 Alt+方向键调整窗口大小(不占用 C-h/j/k/l) +keymap("n", "", "resize +3", { desc = "增加高度" }) +keymap("n", "", "resize -3", { desc = "减少高度" }) +keymap("n", "", "vertical resize -3", { desc = "减少宽度" }) +keymap("n", "", "vertical resize +3", { desc = "增加宽度" }) + +-- ───────────────────────────────────────────── +-- 翻页居中 +-- ───────────────────────────────────────────── +-- ✅ 新增:翻页后光标居中,大幅提升阅读体验 +keymap("n", "", "zz", { desc = "向下翻页(居中)" }) +keymap("n", "", "zz", { desc = "向上翻页(居中)" }) + +-- ───────────────────────────────────────────── +-- 插入模式 +-- ───────────────────────────────────────────── +-- ✅ 新增:jj 快速退出插入模式(比 Esc 近) +keymap("i", "jj", "", { desc = "退出插入模式" }) + +-- ───────────────────────────────────────────── +-- 可视模式 +-- ───────────────────────────────────────────── +-- ✅ 新增:移动选中行 +keymap("v", "", ":m '>+1gv=gv", { desc = "下移选中" }) +keymap("v", "", ":m '<-2gv=gv", { desc = "上移选中" }) +-- ✅ 新增:缩进时保持选中 +keymap("v", "<", "", ">gv", { desc = "右缩进" }) +-- ✅ 新增:粘贴不覆盖寄存器 +keymap("v", "p", '"_dP', { desc = "粘贴不覆盖" }) + +-- ───────────────────────────────────────────── +-- 终端 +-- ───────────────────────────────────────────── +-- ✅ 新增:终端模式 Esc 退出 +keymap("t", "", "", { desc = "退出终端" }) + +-- ───────────────────────────────────────────── +-- bufferline 标签栏操作 +-- ───────────────────────────────────────────── +-- ✅ 新增:Shift+H/L 切换 buffer(VSCode 风格) +keymap("n", "", "BufferLineCyclePrev", { desc = "上一个标签" }) +keymap("n", "", "BufferLineCycleNext", { desc = "下一个标签" }) +keymap("n", "bc", "Bdelete", { desc = "关闭当前标签" }) +keymap("n", "bo", "BufferLineCloseOthers", { desc = "关闭其他标签" }) + +-- ───────────────────────────────────────────── +-- 集成终端(toggleterm) +-- ───────────────────────────────────────────── +-- ✅ 新增:Ctrl+\ 打开/关闭浮动终端 +keymap("n", "", "ToggleTerm", { desc = "浮动终端" }) + +-- ───────────────────────────────────────────── +-- 快速跳转(flash.nvim) +-- ───────────────────────────────────────────── +-- ✅ 新增:s 键快速跳转 +keymap({ "n", "x", "o" }, "s", function() require("flash").jump() end, { desc = "Flash 跳转" }) + +-- ───────────────────────────────────────────── +-- LSP(基础键位,插件配置中会补充) +-- ───────────────────────────────────────────── +-- 🔧 修改:统一 LSP 键位到 on_attach,保留你的风格但增加更多功能 +function M.lsp_on_attach(client, bufnr) + local map = function(keys, func, desc) + vim.keymap.set("n", keys, func, + { buffer = bufnr, noremap = true, silent = true, desc = "LSP: " .. desc }) + end + map("K", vim.lsp.buf.hover, "悬浮文档") + map("gd", vim.lsp.buf.definition, "跳转到定义") + map("gr", vim.lsp.buf.references, "查找引用") + map("rn", vim.lsp.buf.rename, "重命名") + map("ca", vim.lsp.buf.code_action, "代码操作") + map("lf", function() vim.lsp.buf.format({ async = true }) end, "格式化") + map("[d", vim.diagnostic.goto_prev, "上一诊断") + map("]d", vim.diagnostic.goto_next, "下一诊断") + map("dd", vim.diagnostic.open_float, "行诊断") +end + +-- ───────────────────────────────────────────── +-- Git +-- ───────────────────────────────────────────── +keymap("n", "g", "", { desc = "Git" }) +keymap("n", "gg", "LazyGit", { desc = "LazyGit" }) + +return M diff --git a/lua/config/lazy.lua b/lua/config/lazy.lua new file mode 100644 index 0000000..02ce6fe --- /dev/null +++ b/lua/config/lazy.lua @@ -0,0 +1,55 @@ +-- ============================================================================= +-- lazy.lua — 插件管理器初始化 +-- ============================================================================= +-- 【来源】从原 init.lua 提取。 +-- 【修改】🔧 install.colorscheme 改为 tokyonight(你的主题); +-- 🔧 添加 ui.border = "rounded" 统一圆角; +-- 🔧 添加 performance.rtp 禁用内置插件提升启动速度。 + +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not vim.uv.fs_stat(lazypath) then + vim.fn.system({ + "git", "clone", "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", lazypath, + }) +end +vim.opt.rtp:prepend(lazypath) + +require("lazy").setup({ + spec = { + { import = "plugins" }, + }, + + -- 🔧 修改:安装时尝试加载你的主题 + install = { + colorscheme = { "tokyonight", "habamax" }, + }, + + -- 🔧 修改:关闭自动检查更新(你的原设置),但保留手动 :Lazy check + checker = { + enabled = false, + notify = false, + }, + + -- 🔧 修改:统一 UI 圆角边框 + ui = { + border = "rounded", + }, + + -- ✅ 新增:禁用内置插件提升启动速度 + performance = { + rtp = { + disabled_plugins = { + "gzip", + "matchit", + "matchparen", + "netrwPlugin", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/lua/config/options.lua b/lua/config/options.lua new file mode 100644 index 0000000..a5598ca --- /dev/null +++ b/lua/config/options.lua @@ -0,0 +1,91 @@ +-- ============================================================================= +-- options.lua — 编辑器基础选项 +-- ============================================================================= +-- 【来源】从原 init.lua 提取,补充了参考配置中缺失的选项。 +-- 【新增项】已用 ✅ 标注,【修改项】已用 🔧 标注。 + +local opt = vim.opt + +-- ───────────────────────────────────────────── +-- 行号 +-- ───────────────────────────────────────────── +opt.number = true -- 当前行绝对行号 +opt.relativenumber = true -- 相对行号(保留你的设置,方便 5j/5k 跳转) + +-- ───────────────────────────────────────────── +-- 缩进 +-- ───────────────────────────────────────────── +opt.tabstop = 4 -- Tab 宽度 4(保留你的设置,适配 C/C++) +opt.shiftwidth = 4 -- 缩进宽度 4 +opt.expandtab = true -- Tab 转空格 +opt.autoindent = true -- ✅ 新增:新行继承上一行缩进 +opt.smartindent = true -- 智能缩进 + +-- ───────────────────────────────────────────── +-- 搜索 +-- ───────────────────────────────────────────── +opt.ignorecase = true -- 搜索忽略大小写 +opt.smartcase = true -- 含大写字母时区分大小写 +opt.hlsearch = true -- ✅ 新增:高亮搜索匹配 +opt.incsearch = true -- ✅ 新增:实时预览搜索 + +-- ───────────────────────────────────────────── +-- 显示 & 界面 +-- ───────────────────────────────────────────── +opt.termguicolors = true -- 真彩色 +opt.cursorline = true -- 高亮当前行 +opt.signcolumn = "yes" -- 始终显示符号列 +opt.wrap = false -- 不自动换行 +opt.scrolloff = 8 -- ✅ 新增:光标距上下边缘保持 8 行 +opt.sidescrolloff = 8 -- ✅ 新增:光标距左右边缘保持 8 列 +opt.showmode = false -- ✅ 新增:隐藏 --INSERT--(状态栏会显示) +opt.pumheight = 10 -- 补全菜单最大高度 +opt.winborder = "rounded" -- 全局浮动窗口圆角(保留你的设置) + +-- ───────────────────────────────────────────── +-- 分割窗口 +-- ───────────────────────────────────────────── +opt.splitright = true -- 垂直分割在右侧 +opt.splitbelow = true -- 水平分割在下方 + +-- ───────────────────────────────────────────── +-- 文件 & 编码 +-- ───────────────────────────────────────────── +opt.encoding = "utf-8" -- ✅ 新增:显式指定 UTF-8 +opt.fileencoding = "utf-8" -- ✅ 新增 +opt.swapfile = false -- ✅ 新增:关闭交换文件 +opt.backup = false -- ✅ 新增:关闭备份文件 +opt.undofile = true -- 持久化撤销 + +-- ───────────────────────────────────────────── +-- 鼠标 & 剪贴板 +-- ───────────────────────────────────────────── +opt.mouse = "a" -- ✅ 新增:所有模式启用鼠标 +opt.clipboard = "unnamedplus" -- 系统剪贴板 + +-- ───────────────────────────────────────────── +-- 性能 +-- ───────────────────────────────────────────── +opt.updatetime = 250 -- LSP 悬浮提示触发延迟 +opt.timeoutlen = 300 -- 快捷键序列超时 +opt.wildmenu = true -- 命令行补全增强 +opt.wildmode = "longest:full,full" + +-- ───────────────────────────────────────────── +-- 补全 +-- ───────────────────────────────────────────── +-- 🔧 修改:completeopt 改为 blink.cmp 推荐的配置 +opt.completeopt = { "menuone", "noselect" } + +-- ───────────────────────────────────────────── +-- 折叠(为 nvim-ufo 准备) +-- ───────────────────────────────────────────── +opt.foldlevel = 99 +opt.foldlevelstart = 99 -- ✅ 新增:启动时展开所有折叠 +opt.foldenable = true -- ✅ 新增:启用折叠 + +-- ───────────────────────────────────────────── +-- 其他 +-- ───────────────────────────────────────────── +opt.conceallevel = 0 -- ✅ 新增:不隐藏特殊字符 +opt.isfname:append("@-@") -- ✅ 新增:文件名识别 @ 符号 diff --git a/lua/plugins/autopairs.lua b/lua/plugins/autopairs.lua new file mode 100644 index 0000000..b261f2c --- /dev/null +++ b/lua/plugins/autopairs.lua @@ -0,0 +1,15 @@ +-- ============================================================================= +-- autopairs.lua — 自动括号补全 +-- ============================================================================= +-- 【保留】你的配置。 +-- 【修改】🔧 添加 check_ts = true 让括号补全感知 Treesitter 语法。 + +return { + { + "windwp/nvim-autopairs", + event = "InsertEnter", + opts = { + check_ts = true, -- 🔧 新增:Treesitter 感知,避免在字符串/注释里自动配对 + }, + }, +} diff --git a/lua/plugins/cmake-tools.lua b/lua/plugins/cmake-tools.lua new file mode 100644 index 0000000..553f38e --- /dev/null +++ b/lua/plugins/cmake-tools.lua @@ -0,0 +1,50 @@ +-- ============================================================================= +-- cmake-tools.lua — CMake 工具 +-- ============================================================================= +-- 【保留】你的完整 cmake-tools 配置。 +-- 【无修改】不改动任何已有逻辑。 + +return { + { + "Civitasv/cmake-tools.nvim", + dependencies = { "nvim-lua/plenary.nvim" }, + ft = { "cmake", "c", "cpp" }, + opts = { + cmake_command = "cmake", + ctest_command = "ctest", + cmake_use_preset = true, + cmake_regenerate_on_save = true, + cmake_generate_options = { "-DCMAKE_EXPORT_COMPILE_COMMANDS=1" }, + cmake_build_directory = "build", + cmake_soft_link_compile_commands = true, + cmake_dap_configuration = { + name = "cpp", + type = "codelldb", + request = "launch", + stopOnEntry = false, + runInTerminal = true, + console = "integratedTerminal", + }, + cmake_executor = { + name = "quickfix", + opts = { + show = "always", + position = "belowright", + size = 10, + auto_close_when_success = true, + }, + }, + }, + keys = { + { "cg", "CMakeGenerate", desc = "CMake 生成" }, + { "cb", "CMakeBuild", desc = "CMake 构建" }, + { "cr", "CMakeRun", desc = "CMake 运行" }, + { "cd", "CMakeDebug", desc = "CMake 调试" }, + { "cc", "CMakeClean", desc = "CMake 清理" }, + { "cs", "CMakeSelectBuildType", desc = "选择构建类型" }, + { "ct", "CMakeSelectBuildTarget", desc = "选择构建目标" }, + { "cl", "CMakeSelectLaunchTarget", desc = "选择运行目标" }, + { "ck", "CMakeSelectKit", desc = "选择编译器" }, + }, + }, +} diff --git a/lua/plugins/colorscheme.lua b/lua/plugins/colorscheme.lua new file mode 100644 index 0000000..a2ed7ff --- /dev/null +++ b/lua/plugins/colorscheme.lua @@ -0,0 +1,48 @@ +-- ============================================================================= +-- colorscheme.lua — 主题 +-- ============================================================================= +-- 【保留】你的 tokyonight 配置完整保留,透明背景不变。 +-- 【修改】🔧 添加更多 integrations 让主题适配新增的 bufferline/lualine/noice 等。 + +return { + { + "folke/tokyonight.nvim", + lazy = false, + priority = 1000, + opts = { + style = "night", + transparent = true, + styles = { + sidebars = "transparent", + floats = "transparent", + }, + -- ✅ 新增:让 tokyonight 知道新装的插件,颜色更协调 + on_highlights = function(hl, c) + -- bufferline 标签栏背景透明 + hl.BufferLineFill = { bg = "NONE" } + hl.BufferLineBackGround = { bg = "NONE", fg = c.fg_gutter } + hl.BufferLineBackGroundVisible = { bg = "NONE", fg = c.fg } + hl.BufferLineBackGroundSelected = { bg = c.bg_highlight, fg = c.fg, bold = true } + hl.BufferLineSeparator = { fg = c.fg_gutter } + hl.BufferLineSeparatorSelected = { fg = c.blue } + end, + }, + config = function(_, opts) + require("tokyonight").setup(opts) + vim.cmd.colorscheme("tokyonight") + + -- inlay hints 去掉背景(保留你的设置) + vim.api.nvim_create_autocmd("ColorScheme", { + pattern = "tokyonight", + callback = function() + vim.api.nvim_set_hl(0, "LspInlayHint", { + bg = "NONE", fg = "#565f89", italic = true, + }) + end, + }) + vim.api.nvim_set_hl(0, "LspInlayHint", { + bg = "NONE", fg = "#565f89", italic = true, + }) + end, + }, +} diff --git a/lua/plugins/completion.lua b/lua/plugins/completion.lua new file mode 100644 index 0000000..27ceba7 --- /dev/null +++ b/lua/plugins/completion.lua @@ -0,0 +1,56 @@ +-- ============================================================================= +-- completion.lua — 智能补全 +-- ============================================================================= +-- 【保留】你的 blink.cmp 配置完整保留,这是现代选择,比 nvim-cmp 更快。 +-- 【无修改】不改动任何已有逻辑。 + +return { + { + "saghen/blink.cmp", + version = "*", + lazy = false, + opts = { + keymap = { + preset = "super-tab", + [""] = { "select_next" }, + [""] = { "select_prev" }, + [""] = { "scroll_documentation_up" }, + [""] = { "scroll_documentation_down" }, + [""] = { "accept", "fallback" }, + }, + appearance = { + use_nvim_cmp_as_default = true, + nerd_font_variant = "normal", + }, + sources = { + default = { "lsp", "path", "buffer", "snippets" }, + }, + cmdline = { + enabled = true, + sources = function() + if vim.fn.getcmdline():find("/") then + return { "buffer" } + end + return { "cmdline" } + end, + completion = { menu = { auto_show = true } }, + }, + completion = { + menu = { + border = "rounded", + draw = { + columns = { + { "label", "label_description", gap = 1 }, + { "source_name" }, + }, + }, + }, + documentation = { + auto_show = true, + auto_show_delay_ms = 500, + window = { border = "rounded" }, + }, + }, + }, + }, +} diff --git a/lua/plugins/conform.lua b/lua/plugins/conform.lua new file mode 100644 index 0000000..092e17b --- /dev/null +++ b/lua/plugins/conform.lua @@ -0,0 +1,46 @@ +-- ============================================================================= +-- conform.lua — 自动格式化 +-- ============================================================================= +-- 【保留】你的完整 conform 配置。 +-- 【修改】🔧 键位从 cf 改为 lf(与 LSP 格式化键统一); +-- ✅ 新增更多语言的 formatter。 + +return { + { + "stevearc/conform.nvim", + event = { "BufWritePre" }, + cmd = { "ConformInfo" }, + keys = { + -- 🔧 修改:cf → lf,与 keymaps.lua 中的 LSP 格式化键一致 + { "lf", function() require("conform").format({ async = true, lsp_fallback = true }) end, desc = "格式化" }, + }, + opts = { + format_on_save = { + timeout_ms = 500, + lsp_fallback = true, + }, + formatters_by_ft = { + rust = { "rustfmt" }, + lua = { "stylua" }, + c = { "clang-format" }, + cpp = { "clang-format" }, + -- ✅ 新增:更多语言 + python = { "black", "isort" }, + javascript = { "prettier" }, + typescript = { "prettier" }, + json = { "prettier" }, + yaml = { "prettier" }, + markdown = { "prettier" }, + html = { "prettier" }, + css = { "prettier" }, + go = { "gofmt", "goimports" }, + sh = { "shfmt" }, + }, + formatters = { + ["clang-format"] = { + args = { "--style={BasedOnStyle: LLVM, IndentWidth: 4, TabWidth: 4, UseTab: Never, ColumnLimit: 0}" }, + }, + }, + }, + }, +} diff --git a/lua/plugins/dap.lua b/lua/plugins/dap.lua new file mode 100644 index 0000000..af0c448 --- /dev/null +++ b/lua/plugins/dap.lua @@ -0,0 +1,99 @@ +-- ============================================================================= +-- dap.lua — DAP 调试器 +-- ============================================================================= +-- 【保留】你的完整 DAP 配置(codelldb + dap-ui + mason-nvim-dap)。 +-- 【新增】✅ persistent-breakpoints 持久化断点; +-- ✅ nvim-dap-virtual-text 虚拟变量值显示。 + +return { + { + "mfussenegger/nvim-dap", + dependencies = { + "rcarriga/nvim-dap-ui", + "nvim-neotest/nvim-nio", + "williamboman/mason.nvim", + -- ✅ 新增:虚拟文本显示变量值 + { "theHamsta/nvim-dap-virtual-text", opts = {} }, + -- ✅ 新增:持久化断点 + { "Weissle/persistent-breakpoints.nvim", opts = { load_breakpoints_event = { "BufReadPost" } } }, + }, + config = function() + local dap = require("dap") + local dapui = require("dapui") + + -- 断点图标(保留你的设置) + vim.fn.sign_define("DapBreakpoint", + { text = "●", texthl = "DapBreakpoint", linehl = "", numhl = "" }) + vim.fn.sign_define("DapBreakpointCondition", + { text = "◆", texthl = "DapBreakpointCondition", linehl = "", numhl = "" }) + vim.fn.sign_define("DapStopped", + { text = "▶", texthl = "DapStopped", linehl = "CursorLine", numhl = "" }) + + -- dap-ui 布局(保留你的设置) + dapui.setup({ + layouts = { + { + elements = { + { id = "stacks", size = 0.25 }, + { id = "scopes", size = 0.25 }, + { id = "breakpoints", size = 0.25 }, + { id = "watches", size = 0.25 }, + }, + position = "left", + size = 40, + }, + { + elements = { + { id = "repl", size = 0.5 }, + { id = "console", size = 0.5 }, + }, + position = "bottom", + size = 10, + }, + }, + }) + + -- 调试会话自动打开/关闭 UI + dap.listeners.before.attach.dapui_config = function() dapui.open() end + dap.listeners.before.launch.dapui_config = function() dapui.open() end + dap.listeners.before.event_terminated.dapui_config = function() dapui.close() end + dap.listeners.before.event_exited.dapui_config = function() dapui.close() end + + -- codelldb 适配器 + dap.adapters.codelldb = { + type = "server", + port = "${port}", + executable = { + command = vim.fn.stdpath("data") .. "/mason/bin/codelldb", + args = { "--port", "${port}" }, + }, + } + + -- C/C++ 调试配置 + dap.configurations.c = { + { + name = "Launch", + type = "codelldb", + request = "launch", + program = function() + return vim.fn.input("可执行文件路径: ", vim.fn.getcwd() .. "/", "file") + end, + cwd = "${workspaceFolder}", + stopOnEntry = false, + args = {}, + }, + } + dap.configurations.cpp = dap.configurations.c + end, + }, + + -- Mason DAP 自动安装 + { + "jay-babu/mason-nvim-dap.nvim", + dependencies = { "williamboman/mason.nvim", "mfussenegger/nvim-dap" }, + lazy = false, + opts = { + ensure_installed = { "codelldb" }, + }, + }, +} diff --git a/lua/plugins/devicons.lua b/lua/plugins/devicons.lua new file mode 100644 index 0000000..6ecfc41 --- /dev/null +++ b/lua/plugins/devicons.lua @@ -0,0 +1,29 @@ +-- ============================================================================= +-- devicons.lua — 文件图标 +-- ============================================================================= +-- 【保留】你的配置。 +-- 【修改】🔧 扩展 override_by_extension 让更多文件类型有图标。 + +return { + { + "nvim-tree/nvim-web-devicons", + lazy = true, + opts = { + override = { + rs = { icon = "󱘗", color = "#dea584", name = "Rust" }, + }, + -- 🔧 新增:更多文件类型图标 + override_by_extension = { + lua = { icon = "", color = "#7dcfff", name = "lua" }, + py = { icon = "", color = "#bb9af7", name = "py" }, + ts = { icon = "", color = "#7dcfff", name = "ts" }, + js = { icon = "", color = "#e0af68", name = "js" }, + go = { icon = "", color = "#2ac3de", name = "go" }, + html = { icon = "", color = "#f7768e", name = "html" }, + css = { icon = "", color = "#7dcfff", name = "css" }, + json = { icon = "", color = "#e0af68", name = "json" }, + md = { icon = "", color = "#c0caf5", name = "md" }, + }, + }, + }, +} diff --git a/lua/plugins/editor.lua b/lua/plugins/editor.lua new file mode 100644 index 0000000..e7828e2 --- /dev/null +++ b/lua/plugins/editor.lua @@ -0,0 +1,126 @@ +-- ============================================================================= +-- editor.lua — 编辑器增强插件 +-- ============================================================================= +-- 【全新文件】补全你缺少的编辑器功能插件。 + +return { + + -- ───────────────────────────────────────────── + -- Comment.nvim: 注释快捷键 gcc / gc + -- ───────────────────────────────────────────── + { + "numToStr/Comment.nvim", + event = { "BufReadPre", "BufNewFile" }, + opts = {}, + }, + + -- ───────────────────────────────────────────── + -- nvim-surround: 环绕操作 ysiw" / cs"' / ds" + -- ───────────────────────────────────────────── + { + "kylechui/nvim-surround", + event = { "BufReadPre", "BufNewFile" }, + version = "*", + opts = {}, + }, + + -- ───────────────────────────────────────────── + -- vim-illuminate: 高亮光标下相同单词 + -- ───────────────────────────────────────────── + { + "RRethy/vim-illuminate", + event = { "BufReadPre", "BufNewFile" }, + opts = { + delay = 200, + large_file_cutoff = 2000, + }, + config = function(_, opts) + require("illuminate").configure(opts) + end, + }, + + -- ───────────────────────────────────────────── + -- toggleterm.nvim: 集成终端 + -- ───────────────────────────────────────────── + { + "akinsho/toggleterm.nvim", + version = "*", + keys = { "hs", gs.stage_hunk, { buffer = bufnr, desc = "暂存修改块" }) + vim.keymap.set("n", "hr", gs.reset_hunk, { buffer = bufnr, desc = "撤销修改块" }) + vim.keymap.set("n", "hp", gs.preview_hunk, { buffer = bufnr, desc = "预览修改块" }) + + -- 文件操作 + vim.keymap.set("n", "hS", gs.stage_buffer, { buffer = bufnr, desc = "暂存文件" }) + vim.keymap.set("n", "hR", gs.reset_buffer, { buffer = bufnr, desc = "撤销文件修改" }) + + -- Blame + vim.keymap.set("n", "hb", gs.blame_line, { buffer = bufnr, desc = "查看行 blame" }) + vim.keymap.set("n", "hl", gs.toggle_current_line_blame, { buffer = bufnr, desc = "切换行 blame" }) + + -- 其他 + vim.keymap.set("n", "hw", gs.setqflist, { buffer = bufnr, desc = "列出所有 hunk" }) + vim.keymap.set("n", "hd", gs.toggle_word_diff, { buffer = bufnr, desc = "切换行内 diff" }) + end, + }, + config = function(_, opts) + require("gitsigns").setup(opts) + vim.api.nvim_set_hl(0, "GitSignsAdd", { fg = "#4CAF50" }) + vim.api.nvim_set_hl(0, "GitSignsChange", { fg = "#2196F3" }) + vim.api.nvim_set_hl(0, "GitSignsDelete", { fg = "#F44336" }) + end, + }, + + -- diffview: Git diff 视图 + { + "sindrets/diffview.nvim", + cmd = "DiffviewOpen", + keys = { + { "go", "DiffviewOpen", desc = "查看改动" }, + { "gq", "DiffviewClose", desc = "关闭 diff" }, + { "gl", "DiffviewFileHistory %", desc = "文件历史" }, + }, + opts = { + file_panel = { + listing_style = "tree", + tree_options = { + flatten_dirs = true, + folder_statuses = "only_folded", + }, + }, + keymaps = { + view = { + { "n", "q", "DiffviewClose", { desc = "关闭 diffview" } }, + }, + file_panel = { + { "n", "q", "DiffviewClose", { desc = "关闭 diffview" } }, + }, + }, + }, + }, + + -- ✅ 新增:lazygit 集成 + { + "kdheepak/lazygit.nvim", + cmd = { "LazyGit", "LazyGitCurrentFile" }, + keys = { + { "gg", ":LazyGit", desc = "LazyGit" }, + }, + dependencies = { "nvim-lua/plenary.nvim" }, + }, +} diff --git a/lua/plugins/lsp.lua b/lua/plugins/lsp.lua new file mode 100644 index 0000000..b579662 --- /dev/null +++ b/lua/plugins/lsp.lua @@ -0,0 +1,161 @@ +-- ============================================================================= +-- lsp.lua — LSP 语言服务器 +-- ============================================================================= +-- 【保留】你的完整 LSP 配置(lua_ls/bashls/clangd/neocmake/rust_analyzer)。 +-- 【修改】🔧 on_attach 改为引用 config.keymaps 的 lsp_on_attach(统一管理键位); +-- 🔧 diagnostic 配补 sign 图标和 float 边框。 + +return { + -- Mason: 外部工具管理 + { + "williamboman/mason.nvim", + cmd = "Mason", + opts = { + ui = { + border = "rounded", -- ✅ 新增:圆角边框 + icons = { + package_installed = "✓", + package_pending = "➜", + package_uninstalled = "✗", + }, + }, + }, + }, + + -- Mason 与 LSP 桥接 + { + "williamboman/mason-lspconfig.nvim", + dependencies = { "williamboman/mason.nvim" }, + opts = { + ensure_installed = { + "lua_ls", + "bashls", + "clangd", + "neocmake", + }, + automatic_installation = function(server_name) + -- 🔧 保留你的逻辑:rust_analyzer 由 rustup 管理 + return server_name ~= "rust_analyzer" + end, + }, + }, + + -- LSP 配置 + { + "neovim/nvim-lspconfig", + event = { "BufReadPre", "BufNewFile" }, + dependencies = { + "williamboman/mason.nvim", + "williamboman/mason-lspconfig.nvim", + "saghen/blink.cmp", + }, + config = function() + local caps = require("blink.cmp").get_lsp_capabilities() + local keymaps = require("config.keymaps") + + -- ✅ 新增:诊断图标和样式 + vim.diagnostic.config({ + virtual_text = { + prefix = "●", + spacing = 4, + }, + signs = true, + update_in_insert = false, + severity_sort = true, + float = { + border = "rounded", + source = "always", + }, + }) + + local signs = { Error = " ", Warn = " ", Hint = "󰠠 ", Info = " " } + for type, icon in pairs(signs) do + local hl = "DiagnosticSign" .. type + vim.fn.sign_define(hl, { text = icon, texthl = hl, numhl = "" }) + end + + -- LSP 附加时绑定键位 + vim.api.nvim_create_autocmd("LspAttach", { + callback = function(args) + -- 🔧 修改:使用统一 on_attach + keymaps.lsp_on_attach(nil, args.buf) + + -- 保留你的 inlay hints 开启 + vim.lsp.inlay_hint.enable(true, { bufnr = args.buf }) + end, + }) + + -- Lua + vim.lsp.config['lua_ls'] = { + cmd = { 'lua-language-server' }, + filetypes = { 'lua' }, + root_markers = { '.luarc.json', '.luarc.jsonc', '.git', 'init.lua' }, + capabilities = caps, + settings = { + Lua = { + runtime = { version = "LuaJIT" }, + workspace = { checkThirdParty = false }, + diagnostics = { globals = { "vim" } }, + }, + }, + } + + -- Bash + vim.lsp.config['bashls'] = { + cmd = { 'bash-language-server', 'start' }, + filetypes = { 'sh', 'bash' }, + root_markers = { '.git' }, + capabilities = caps, + } + + -- C/C++ (clangd) + vim.lsp.config['clangd'] = { + cmd = { 'clangd' }, + filetypes = { 'c', 'cpp', 'objc', 'objcpp' }, + root_markers = { '.clangd', 'compile_commands.json', '.git' }, + capabilities = caps, + } + + -- CMake + vim.lsp.config['neocmake'] = { + cmd = { 'neocmakelsp', 'stdio' }, + filetypes = { 'cmake' }, + root_markers = { 'CMakeLists.txt', '.git' }, + capabilities = caps, + init_options = { + format = { enable = true }, + lint = { enable = true }, + }, + } + + -- Rust (rust-analyzer) + vim.lsp.config['rust_analyzer'] = { + cmd = { 'rust-analyzer' }, + filetypes = { 'rust' }, + root_markers = { 'Cargo.toml', '.git' }, + capabilities = caps, + settings = { + ["rust-analyzer"] = { + cargo = { + allFeatures = true, + loadOutDirsFromCheck = true, + buildScripts = { enable = true }, + }, + checkOnSave = true, + diagnostics = { enable = true }, + procMacro = { enable = true }, + files = { + exclude = { + ".direnv", ".git", ".jj", ".github", ".gitlab", + "bin", "node_modules", "target", "venv", ".venv", + }, + watcher = "client", + }, + }, + }, + } + + vim.lsp.enable({ 'lua_ls', 'bashls', 'clangd', 'neocmake', 'rust_analyzer' }) + end, + }, +} diff --git a/lua/plugins/oil.lua b/lua/plugins/oil.lua new file mode 100644 index 0000000..8a59249 --- /dev/null +++ b/lua/plugins/oil.lua @@ -0,0 +1,37 @@ +-- ============================================================================= +-- oil.lua — 文件浏览器 +-- ============================================================================= +-- 【保留】你的完整 oil.nvim 配置。 +-- 【无修改】oil 作为默认文件浏览器不变。 + +return { + { + "stevearc/oil.nvim", + dependencies = { + "nvim-tree/nvim-web-devicons", + }, + opts = { + default_file_explorer = true, + keymaps = { + [""] = "actions.select", + [""] = "actions.preview", + [""] = "actions.close", + [""] = "actions.refresh", + [""] = "actions.toggle_hidden", + ["g?"] = "actions.show_help", + }, + view_options = { + show_hidden = true, + }, + float = { + padding = 2, + max_width = 90, + border = "rounded", + }, + }, + keys = { + { "-", "Oil", desc = "打开父目录" }, + { "fe", "Oil", desc = "文件浏览器" }, + }, + }, +} diff --git a/lua/plugins/runner.lua b/lua/plugins/runner.lua new file mode 100644 index 0000000..bda3cb7 --- /dev/null +++ b/lua/plugins/runner.lua @@ -0,0 +1,27 @@ +-- ============================================================================= +-- runner.lua — 统一构建/运行/调试分发器 +-- ============================================================================= +-- 【保留】你的 runner.lua 配置和 keymap 完整保留。 +-- 【无修改】这是你的优秀设计,不需要改动。 + +return { + { + "mfussenegger/nvim-dap", + keys = { + -- 调试控制 + { "", function() require("dap").continue() end, desc = "继续调试" }, + { "", function() require("dap").step_over() end, desc = "单步跳过" }, + { "", function() require("dap").step_into() end, desc = "单步进入" }, + { "", function() require("dap").step_out() end, desc = "单步跳出" }, + -- 🔧 修改:断点键位从 b 改为 db(避免与 buffer 分组冲突) + { "db", function() require("dap").toggle_breakpoint() end, desc = "断点" }, + { "du", function() require("dapui").toggle() end, desc = "调试界面" }, + + -- 统一构建/运行/调试/测试 + { "rb", function() require("runner").build() end, desc = "构建" }, + { "rr", function() require("runner").run() end, desc = "运行" }, + { "rd", function() require("runner").debug() end, desc = "调试" }, + { "rt", function() require("runner").test() end, desc = "测试" }, + }, + }, +} diff --git a/lua/plugins/rustaceanvim.lua b/lua/plugins/rustaceanvim.lua new file mode 100644 index 0000000..51a833e --- /dev/null +++ b/lua/plugins/rustaceanvim.lua @@ -0,0 +1,23 @@ +-- ============================================================================= +-- rustaceanvim.lua — Rust 开发增强 +-- ============================================================================= +-- 【修复】原文件是空 return {},现在填上完整配置。 +-- 【修改】🔧 填充 rustaceanvim 配置,与你的 lspconfig rust_analyzer 配合。 + +return { + "mrcjkb/rustaceanvim", + ft = { "rust" }, + dependencies = { + "neovim/nvim-lspconfig", + "nvim-lua/plenary.nvim", + "mfussenegger/nvim-dap", + }, + opts = { + server = { + standalone = true, + }, + }, + config = function(_, opts) + vim.g.rustaceanvim = opts + end, +} diff --git a/lua/plugins/telescope.lua b/lua/plugins/telescope.lua new file mode 100644 index 0000000..6a27549 --- /dev/null +++ b/lua/plugins/telescope.lua @@ -0,0 +1,61 @@ +-- ============================================================================= +-- telescope.lua — 模糊搜索 +-- ============================================================================= +-- 【保留】你的 telescope 配置和 ui-select 扩展。 +-- 【新增】✅ telescope-fzf-native 扩展提升搜索速度; +-- ✅ file_ignore_patterns 忽略常见无用目录。 + +return { + { + "nvim-telescope/telescope.nvim", + branch = "0.1.x", + dependencies = { + "nvim-lua/plenary.nvim", + "nvim-telescope/telescope-ui-select.nvim", + -- ✅ 新增:fzf 原生加速 + { + "nvim-telescope/telescope-fzf-native.nvim", + build = "make", + cond = function() return vim.fn.executable("make") == 1 end, + }, + }, + cmd = "Telescope", + keys = { + { "ff", "Telescope find_files", desc = "查找文件" }, + { "fg", "Telescope live_grep", desc = "全局搜索" }, + { "fb", "Telescope buffers", desc = "切换缓冲区" }, + { "fh", "Telescope help_tags", desc = "帮助文档" }, + { "fk", "Telescope keymaps", desc = "查找键位" }, + { "fr", "Telescope oldfiles", desc = "最近文件" }, + -- ✅ 新增:当前文件搜索和诊断 + { "fc", "Telescope current_buffer_fuzzy_find", desc = "当前文件搜索" }, + { "fd", "Telescope diagnostics", desc = "诊断信息" }, + }, + lazy = false, + opts = { + defaults = { + prompt_prefix = " > ", + selection_caret = " > ", + layout_strategy = "flex", + -- ✅ 新增:忽略无用目录 + file_ignore_patterns = { + "node_modules", ".git/", "dist/", "build/", "%.lock", + }, + }, + }, + config = function(_, opts) + local telescope = require("telescope") + + opts.extensions = { + ["ui-select"] = { + require("telescope.themes").get_dropdown({}), + }, + } + + telescope.setup(opts) + pcall(telescope.load_extension, "ui-select") + -- ✅ 新增:加载 fzf 扩展 + pcall(telescope.load_extension, "fzf") + end, + }, +} diff --git a/lua/plugins/treesitter.lua b/lua/plugins/treesitter.lua new file mode 100644 index 0000000..7374ddf --- /dev/null +++ b/lua/plugins/treesitter.lua @@ -0,0 +1,24 @@ +-- ============================================================================= +-- treesitter.lua — 语法高亮 +-- ============================================================================= +-- 【保留】你的完整 ensure_installed 列表。 +-- 【新增】✅ fold 配置让 nvim-ufo 可以使用 treesitter 折叠。 + +return { + { + "nvim-treesitter/nvim-treesitter", + event = { "BufReadPre", "BufNewFile" }, + build = ":TSUpdate", + opts = { + ensure_installed = { + "lua", "bash", "rust", "c", "cpp", "cmake", + "python", "java", "go", "json", "toml", + "markdown", "regex", "vim", + }, + highlight = { enable = true }, + indent = { enable = true }, + -- ✅ 新增:启用 treesitter 折叠(nvim-ufo 依赖) + fold = { enable = true }, + }, + }, +} diff --git a/lua/plugins/ui.lua b/lua/plugins/ui.lua new file mode 100644 index 0000000..39448e6 --- /dev/null +++ b/lua/plugins/ui.lua @@ -0,0 +1,197 @@ +-- ============================================================================= +-- ui.lua — UI 美化套件(VSCode 风格核心) +-- ============================================================================= +-- 【全新文件】这是从参考配置提取 + 定制的 UI 套件。 +-- 包含:bufferline(标签栏)、lualine(状态栏)、noice(命令行)、 +-- nvim-notify(通知)、dashboard(启动页)、dressing(输入框)。 + +return { + + -- ───────────────────────────────────────────── + -- bufferline: 顶部标签栏(VSCode 核心) + -- ───────────────────────────────────────────── + { + "akinsho/bufferline.nvim", + version = "*", + event = "BufReadPre", + dependencies = "nvim-tree/nvim-web-devicons", + config = function() + require("bufferline").setup({ + options = { + mode = "buffers", + style_preset = require("bufferline").style_preset.default, + themable = true, + numbers = "none", + close_command = "Bdelete!", + right_mouse_command = "Bdelete!", + indicator = { style = "icon", icon = "▎" }, + buffer_close_icon = "󰅖", + modified_icon = "●", + close_icon = "", + left_trunc_marker = "", + right_trunc_marker = "", + max_name_length = 18, + max_prefix_length = 15, + truncate_names = true, + tab_size = 18, + diagnostics = "nvim_lsp", + diagnostics_update_in_insert = false, + -- ✅ 适配 oil.nvim:左侧文件浏览器偏移 + offsets = { + { + filetype = "oil", + text = "文件浏览器", + highlight = "Directory", + text_align = "left", + }, + }, + color_icons = true, + show_buffer_icons = true, + show_buffer_close_icons = true, + show_close_icon = false, + show_tab_indicators = true, + persist_buffer_sort = true, + separator_style = "thin", + enforce_regular_tabs = false, + always_show_bufferline = true, + hover = { + enabled = true, + delay = 200, + reveal = { "close" }, + }, + }, + }) + end, + }, + + -- ───────────────────────────────────────────── + -- lualine: 底部状态栏(VSCode 核心) + -- ───────────────────────────────────────────── + { + "nvim-lualine/lualine.nvim", + event = "VimEnter", + dependencies = { + "nvim-tree/nvim-web-devicons", + }, + opts = { + options = { + component_separators = "|", + section_separators = "", + globalstatus = true, + theme = "tokyonight", + }, + sections = { + lualine_a = { "mode" }, + lualine_b = { "branch", "diff", "diagnostics" }, + lualine_c = { { "filename", path = 1 } }, + lualine_x = { "encoding", "fileformat", "filetype" }, + lualine_y = { "progress" }, + lualine_z = { "location" }, + }, + }, + }, + + -- ───────────────────────────────────────────── + -- noice.nvim: 命令行美化 + -- ───────────────────────────────────────────── + { + "folke/noice.nvim", + event = "VeryLazy", + opts = { + cmdline = { + view = "cmdline_popup", + format = { + search_down = { icon = " " }, + search_up = { icon = " " }, + }, + }, + messages = { + enabled = true, + view = "notify", + view_error = "notify", + view_warn = "notify", + }, + popupmenu = { + enabled = true, + backend = "nui", + }, + presets = { + bottom_search = false, + command_palette = true, + long_message_to_split = true, + inc_rename = true, + lsp_doc_border = true, + }, + }, + dependencies = { + "MunifTanjim/nui.nvim", + "rcarriga/nvim-notify", + }, + }, + + -- ───────────────────────────────────────────── + -- nvim-notify: 通知美化 + -- ───────────────────────────────────────────── + { + "rcarriga/nvim-notify", + opts = { + timeout = 3000, + max_width = 50, + render = "compact", + stages = "fade", + }, + config = function(_, opts) + local notify = require("notify") + notify.setup(opts) + vim.notify = notify + end, + }, + + -- ───────────────────────────────────────────── + -- dressing.nvim: 输入框美化 + -- ───────────────────────────────────────────── + { + "stevearc/dressing.nvim", + event = "VeryLazy", + opts = {}, + }, + + -- ───────────────────────────────────────────── + -- dashboard-nvim: 启动首页 + -- ───────────────────────────────────────────── + { + "nvimdev/dashboard-nvim", + event = "VimEnter", + dependencies = { "nvim-tree/nvim-web-devicons" }, + opts = { + theme = "doom", + config = { + header = { + "", + " ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗ ██╗██╗███╗ ███╗", + " ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║ ██║██║████╗ ████║", + " ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║ ██║██║██╔████╔██║", + " ██║╚██╗██║██╔══╝ ██║ ██║╚██╗ ██╔╝╚██╗ ██╔╝██║██║╚██╔╝██║", + " ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║", + " ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═══╝ ╚═╝╚═╝ ╚═╝", + "", + }, + center = { + { icon = " ", key = "f", desc = "查找文件", action = "Telescope find_files" }, + { icon = " ", key = "r", desc = "最近文件", action = "Telescope oldfiles" }, + { icon = " ", key = "g", desc = "全局搜索", action = "Telescope live_grep" }, + { icon = " ", key = "l", desc = "插件管理", action = "Lazy" }, + { icon = " ", key = "m", desc = "LSP 管理", action = "Mason" }, + { icon = " ", key = "q", desc = "退出", action = "qa" }, + }, + footer = { " atdunbg · Neovim" }, + }, + }, + }, + + -- ───────────────────────────────────────────── + -- 通用依赖(多个插件共用) + -- ───────────────────────────────────────────── + { "nvim-lua/plenary.nvim", lazy = true }, + { "MunifTanjim/nui.nvim", lazy = true }, +} diff --git a/lua/plugins/whichkey.lua b/lua/plugins/whichkey.lua new file mode 100644 index 0000000..5c335e4 --- /dev/null +++ b/lua/plugins/whichkey.lua @@ -0,0 +1,65 @@ +-- ============================================================================= +-- whichkey.lua — 键位提示 +-- ============================================================================= +-- 【修复】原配置 enabled = false 直接禁用了,现在启用。 +-- 【修改】🔧 enabled 改为 true; +-- 🔧 更完善的分组和图标配置。 + +return { + { + "folke/which-key.nvim", + event = "VeryLazy", + opts = { + preset = "modern", + delay = 200, + icons = { + breadcrumb = "»", + separator = "➜", + group = "+", + }, + win = { + border = "rounded", + padding = { 1, 1 }, + wo = { winblend = 0 }, + }, + plugins = { + spelling = { enabled = true, suggestions = 20 }, + presets = { + operators = false, + motions = false, + text_objects = false, + windows = false, + nav = false, + z = true, + g = true, + }, + }, + }, + config = function(_, opts) + local wk = require("which-key") + wk.setup(opts) + + -- ✅ 新增:键位分组提示 + wk.add({ + { "f", group = "搜索" }, + { "g", group = "Git" }, + { "h", group = "Hunk 操作" }, + { "l", group = "LSP" }, + { "r", group = "运行/调试" }, + { "c", group = "CMake/C++" }, + { "b", group = "标签操作" }, + { "bc", desc = "关闭标签" }, + { "bo", desc = "关闭其他标签" }, + { "d", group = "调试操作" }, + { "db", desc = "切换断点" }, + { "du", desc = "调试界面" }, + { "dd", desc = "行诊断" }, + { "W", group = "窗口操作" }, + { "e", group = "文件浏览" }, + { "z", group = "折叠" }, + { "zM", desc = "关闭所有折叠" }, + { "zR", desc = "展开所有折叠" }, + }) + end, + }, +} diff --git a/lua/runner.lua b/lua/runner.lua new file mode 100644 index 0000000..c6dd619 --- /dev/null +++ b/lua/runner.lua @@ -0,0 +1,91 @@ +-- ============================================================================= +-- runner.lua — 统一构建/运行/调试分发器 +-- ============================================================================= +-- 【保留】你的完整 runner.lua 模块。 +-- 【无修改】这是你的优秀设计,不需要改动。 + +local M = {} + +--- 检测当前项目类型 +---@return "rust"|"cmake"|"python"|"go"|"unknown" +function M.detect() + local cwd = vim.fn.getcwd() + + if vim.fn.filereadable(cwd .. "/Cargo.toml") == 1 then return "rust" end + if vim.fn.filereadable(cwd .. "/CMakeLists.txt") == 1 then return "cmake" end + if vim.fn.filereadable(cwd .. "/go.mod") == 1 then return "go" end + if vim.fn.filereadable(cwd .. "/pyproject.toml") == 1 then return "python" end + if vim.fn.filereadable(cwd .. "/setup.py") == 1 then return "python" end + + return "unknown" +end + +--- 构建 +function M.build() + local project = M.detect() + + if project == "rust" then + vim.cmd("terminal cargo build") + elseif project == "cmake" then + vim.cmd("CMakeBuild") + elseif project == "go" then + local result = vim.fn.system("go build ./...") + if vim.v.shell_error == 0 then + vim.notify("go build 成功", vim.log.levels.INFO) + else + vim.notify("go build 失败:\n" .. result, vim.log.levels.ERROR) + end + else + vim.notify("未识别的项目类型,无法自动构建", vim.log.levels.WARN) + end +end + +--- 运行 +function M.run() + local project = M.detect() + + if project == "rust" then + vim.cmd("terminal cargo run") + elseif project == "cmake" then + vim.cmd("CMakeRun") + elseif project == "go" then + vim.cmd("terminal go run .") + elseif project == "python" then + vim.cmd("terminal python " .. vim.fn.expand("%")) + else + vim.notify("未识别的项目类型,无法自动运行", vim.log.levels.WARN) + end +end + +--- 调试 +function M.debug() + local project = M.detect() + + if project == "rust" then + require("dap").continue() + elseif project == "cmake" then + vim.cmd("CMakeDebug") + else + require("dap").continue() + end +end + +--- 测试 +function M.test() + local project = M.detect() + + if project == "rust" then + vim.cmd("terminal cargo test") + elseif project == "cmake" then + vim.cmd("CMakeBuild") + vim.cmd("terminal ctest --test-dir build") + elseif project == "go" then + vim.cmd("terminal go test ./...") + elseif project == "python" then + vim.cmd("terminal pytest") + else + vim.notify("未识别的项目类型,无法自动测试", vim.log.levels.WARN) + end +end + +return M