feat: VSCode 风格 Neovim 配置
- 分层架构: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
This commit is contained in:
@@ -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")
|
||||
@@ -0,0 +1,126 @@
|
||||
-- =============================================================================
|
||||
-- keymaps.lua — 基础键位映射
|
||||
-- =============================================================================
|
||||
-- 【来源】从原 init.lua 提取 + 参考配置精华合并。
|
||||
-- 【保留】你的 <C-h/j/k/l> 窗口跳转、<leader>w/q 保存退出、oil 键位等。
|
||||
-- 【新增】已用 ✅ 标注,【修改】已用 🔧 标注。
|
||||
|
||||
local keymap = vim.keymap.set
|
||||
local M = {}
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- Leader 键
|
||||
-- ─────────────────────────────────────────────
|
||||
vim.g.mapleader = " "
|
||||
vim.g.maplocalleader = " "
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- 编辑器操作
|
||||
-- ─────────────────────────────────────────────
|
||||
keymap("n", "<leader>w", "<cmd>w<cr>", { desc = "保存" })
|
||||
keymap("n", "<leader>q", "<cmd>q<cr>", { desc = "退出" })
|
||||
keymap("n", "<leader>Q", "<cmd>qa<cr>", { desc = "✅ 新增:全部退出" })
|
||||
keymap("n", "<leader>/", "<cmd>noh<cr>", { desc = "清除搜索高亮" })
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- 窗口导航(保留你的 C-h/j/k/l 跳转)
|
||||
-- ─────────────────────────────────────────────
|
||||
keymap("n", "<C-h>", "<C-w>h", { desc = "跳到左边窗口" })
|
||||
keymap("n", "<C-j>", "<C-w>j", { desc = "跳到下面窗口" })
|
||||
keymap("n", "<C-k>", "<C-w>k", { desc = "跳到上面窗口" })
|
||||
keymap("n", "<C-l>", "<C-w>l", { desc = "跳到右边窗口" })
|
||||
|
||||
-- ✅ 新增:窗口操作(用 <leader>W 前缀,不与跳转冲突)
|
||||
keymap("n", "<leader>W", "<Nop>", { desc = "窗口操作" })
|
||||
keymap("n", "<leader>Wv", "<cmd>vsplit<cr>", { desc = "垂直分割" })
|
||||
keymap("n", "<leader>Wh", "<cmd>split<cr>", { desc = "水平分割" })
|
||||
keymap("n", "<leader>Wc", "<cmd>close<cr>", { desc = "关闭窗口" })
|
||||
keymap("n", "<leader>Wo", "<cmd>only<cr>", { desc = "关闭其他" })
|
||||
keymap("n", "<leader>Wr", "<cmd>wincmd r<cr>", { desc = "旋转窗口" })
|
||||
keymap("n", "<leader>W=", "<cmd>wincmd =<cr>", { desc = "平衡窗口" })
|
||||
|
||||
-- ✅ 新增:用 Alt+方向键调整窗口大小(不占用 C-h/j/k/l)
|
||||
keymap("n", "<A-Up>", "<cmd>resize +3<cr>", { desc = "增加高度" })
|
||||
keymap("n", "<A-Down>", "<cmd>resize -3<cr>", { desc = "减少高度" })
|
||||
keymap("n", "<A-Left>", "<cmd>vertical resize -3<cr>", { desc = "减少宽度" })
|
||||
keymap("n", "<A-Right>", "<cmd>vertical resize +3<cr>", { desc = "增加宽度" })
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- 翻页居中
|
||||
-- ─────────────────────────────────────────────
|
||||
-- ✅ 新增:翻页后光标居中,大幅提升阅读体验
|
||||
keymap("n", "<C-d>", "<C-d>zz", { desc = "向下翻页(居中)" })
|
||||
keymap("n", "<C-u>", "<C-u>zz", { desc = "向上翻页(居中)" })
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- 插入模式
|
||||
-- ─────────────────────────────────────────────
|
||||
-- ✅ 新增:jj 快速退出插入模式(比 Esc 近)
|
||||
keymap("i", "jj", "<Esc>", { desc = "退出插入模式" })
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- 可视模式
|
||||
-- ─────────────────────────────────────────────
|
||||
-- ✅ 新增:移动选中行
|
||||
keymap("v", "<A-j>", ":m '>+1<CR>gv=gv", { desc = "下移选中" })
|
||||
keymap("v", "<A-k>", ":m '<-2<CR>gv=gv", { desc = "上移选中" })
|
||||
-- ✅ 新增:缩进时保持选中
|
||||
keymap("v", "<", "<gv", { desc = "左缩进" })
|
||||
keymap("v", ">", ">gv", { desc = "右缩进" })
|
||||
-- ✅ 新增:粘贴不覆盖寄存器
|
||||
keymap("v", "p", '"_dP', { desc = "粘贴不覆盖" })
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- 终端
|
||||
-- ─────────────────────────────────────────────
|
||||
-- ✅ 新增:终端模式 Esc 退出
|
||||
keymap("t", "<Esc>", "<C-\\><C-n>", { desc = "退出终端" })
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- bufferline 标签栏操作
|
||||
-- ─────────────────────────────────────────────
|
||||
-- ✅ 新增:Shift+H/L 切换 buffer(VSCode 风格)
|
||||
keymap("n", "<S-h>", "<cmd>BufferLineCyclePrev<CR>", { desc = "上一个标签" })
|
||||
keymap("n", "<S-l>", "<cmd>BufferLineCycleNext<CR>", { desc = "下一个标签" })
|
||||
keymap("n", "<leader>bc", "<cmd>Bdelete<CR>", { desc = "关闭当前标签" })
|
||||
keymap("n", "<leader>bo", "<cmd>BufferLineCloseOthers<CR>", { desc = "关闭其他标签" })
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- 集成终端(toggleterm)
|
||||
-- ─────────────────────────────────────────────
|
||||
-- ✅ 新增:Ctrl+\ 打开/关闭浮动终端
|
||||
keymap("n", "<C-\\>", "<cmd>ToggleTerm<CR>", { 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("<leader>rn", vim.lsp.buf.rename, "重命名")
|
||||
map("<leader>ca", vim.lsp.buf.code_action, "代码操作")
|
||||
map("<leader>lf", function() vim.lsp.buf.format({ async = true }) end, "格式化")
|
||||
map("[d", vim.diagnostic.goto_prev, "上一诊断")
|
||||
map("]d", vim.diagnostic.goto_next, "下一诊断")
|
||||
map("<leader>dd", vim.diagnostic.open_float, "行诊断")
|
||||
end
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- Git
|
||||
-- ─────────────────────────────────────────────
|
||||
keymap("n", "<leader>g", "<Nop>", { desc = "Git" })
|
||||
keymap("n", "<leader>gg", "<cmd>LazyGit<CR>", { desc = "LazyGit" })
|
||||
|
||||
return M
|
||||
@@ -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",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -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("@-@") -- ✅ 新增:文件名识别 @ 符号
|
||||
@@ -0,0 +1,15 @@
|
||||
-- =============================================================================
|
||||
-- autopairs.lua — 自动括号补全
|
||||
-- =============================================================================
|
||||
-- 【保留】你的配置。
|
||||
-- 【修改】🔧 添加 check_ts = true 让括号补全感知 Treesitter 语法。
|
||||
|
||||
return {
|
||||
{
|
||||
"windwp/nvim-autopairs",
|
||||
event = "InsertEnter",
|
||||
opts = {
|
||||
check_ts = true, -- 🔧 新增:Treesitter 感知,避免在字符串/注释里自动配对
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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 = {
|
||||
{ "<leader>cg", "<cmd>CMakeGenerate<cr>", desc = "CMake 生成" },
|
||||
{ "<leader>cb", "<cmd>CMakeBuild<cr>", desc = "CMake 构建" },
|
||||
{ "<leader>cr", "<cmd>CMakeRun<cr>", desc = "CMake 运行" },
|
||||
{ "<leader>cd", "<cmd>CMakeDebug<cr>", desc = "CMake 调试" },
|
||||
{ "<leader>cc", "<cmd>CMakeClean<cr>", desc = "CMake 清理" },
|
||||
{ "<leader>cs", "<cmd>CMakeSelectBuildType<cr>", desc = "选择构建类型" },
|
||||
{ "<leader>ct", "<cmd>CMakeSelectBuildTarget<cr>", desc = "选择构建目标" },
|
||||
{ "<leader>cl", "<cmd>CMakeSelectLaunchTarget<cr>", desc = "选择运行目标" },
|
||||
{ "<leader>ck", "<cmd>CMakeSelectKit<cr>", desc = "选择编译器" },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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,
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
-- =============================================================================
|
||||
-- completion.lua — 智能补全
|
||||
-- =============================================================================
|
||||
-- 【保留】你的 blink.cmp 配置完整保留,这是现代选择,比 nvim-cmp 更快。
|
||||
-- 【无修改】不改动任何已有逻辑。
|
||||
|
||||
return {
|
||||
{
|
||||
"saghen/blink.cmp",
|
||||
version = "*",
|
||||
lazy = false,
|
||||
opts = {
|
||||
keymap = {
|
||||
preset = "super-tab",
|
||||
["<C-j>"] = { "select_next" },
|
||||
["<C-k>"] = { "select_prev" },
|
||||
["<C-u>"] = { "scroll_documentation_up" },
|
||||
["<C-n>"] = { "scroll_documentation_down" },
|
||||
["<CR>"] = { "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" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
-- =============================================================================
|
||||
-- conform.lua — 自动格式化
|
||||
-- =============================================================================
|
||||
-- 【保留】你的完整 conform 配置。
|
||||
-- 【修改】🔧 键位从 <leader>cf 改为 <leader>lf(与 LSP 格式化键统一);
|
||||
-- ✅ 新增更多语言的 formatter。
|
||||
|
||||
return {
|
||||
{
|
||||
"stevearc/conform.nvim",
|
||||
event = { "BufWritePre" },
|
||||
cmd = { "ConformInfo" },
|
||||
keys = {
|
||||
-- 🔧 修改:<leader>cf → <leader>lf,与 keymaps.lua 中的 LSP 格式化键一致
|
||||
{ "<leader>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}" },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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" },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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" },
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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 = { "<C-\\" },
|
||||
opts = {
|
||||
size = function(term)
|
||||
if term.direction == "horizontal" then
|
||||
return vim.o.lines * 0.3
|
||||
elseif term.direction == "vertical" then
|
||||
return vim.o.columns * 0.4
|
||||
end
|
||||
end,
|
||||
direction = "float",
|
||||
float_opts = {
|
||||
border = "curved",
|
||||
winblend = 0,
|
||||
},
|
||||
shell = vim.o.shell,
|
||||
},
|
||||
},
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- flash.nvim: 快速跳转
|
||||
-- ─────────────────────────────────────────────
|
||||
{
|
||||
"folke/flash.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {},
|
||||
},
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- indent-blankline: 缩进参考线
|
||||
-- ─────────────────────────────────────────────
|
||||
{
|
||||
"lukas-reineke/indent-blankline.nvim",
|
||||
event = { "BufReadPost", "BufNewFile" },
|
||||
main = "ibl",
|
||||
opts = {
|
||||
indent = { char = "│" },
|
||||
scope = { enabled = true },
|
||||
},
|
||||
},
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- nvim-ufo: 代码折叠
|
||||
-- ─────────────────────────────────────────────
|
||||
{
|
||||
"kevinhwang91/nvim-ufo",
|
||||
dependencies = { "kevinhwang91/promise-async" },
|
||||
event = { "BufReadPost", "BufNewFile" },
|
||||
config = function()
|
||||
vim.o.foldmethod = "expr"
|
||||
vim.o.foldexpr = "v:lua.vim.treesitter.foldexpr()"
|
||||
vim.o.foldlevel = 99
|
||||
vim.o.foldlevelstart = 99
|
||||
|
||||
require('ufo').setup({
|
||||
provider_selector = function(bufnr, filetype, buftype)
|
||||
return { "treesitter", "indent" }
|
||||
end,
|
||||
})
|
||||
|
||||
vim.keymap.set('n', 'zM', require('ufo').closeAllFolds, { desc = "关闭所有折叠" })
|
||||
vim.keymap.set('n', 'zR', require('ufo').openAllFolds, { desc = "展开所有折叠" })
|
||||
end,
|
||||
},
|
||||
|
||||
-- ─────────────────────────────────────────────
|
||||
-- rainbow-delimiters: 彩虹括号
|
||||
-- ─────────────────────────────────────────────
|
||||
{
|
||||
"HiPhish/rainbow-delimiters.nvim",
|
||||
dependencies = { "nvim-treesitter/nvim-treesitter" },
|
||||
config = function()
|
||||
local rainbow_delimiters = require("rainbow-delimiters")
|
||||
vim.g.rainbow_delimiters = {
|
||||
strategy = { [''] = rainbow_delimiters.strategy.global },
|
||||
query = { [''] = 'rainbow-delimiters' },
|
||||
}
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
-- =============================================================================
|
||||
-- git.lua — Git 集成
|
||||
-- =============================================================================
|
||||
-- 【保留】你的 gitsigns + diffview 配置完整保留。
|
||||
-- 【新增】✅ lazygit 集成(参考配置有,你缺的)。
|
||||
|
||||
return {
|
||||
|
||||
-- gitsigns: 行内 diff 标记
|
||||
{
|
||||
"lewis6991/gitsigns.nvim",
|
||||
event = "BufReadPre",
|
||||
opts = {
|
||||
signs = {
|
||||
add = { text = "▍" },
|
||||
change = { text = "▍" },
|
||||
delete = { text = "▍" },
|
||||
topdelete = { text = "▍" },
|
||||
changedelete = { text = "▍" },
|
||||
},
|
||||
on_attach = function(bufnr)
|
||||
local gs = require("gitsigns")
|
||||
|
||||
-- 导航
|
||||
vim.keymap.set("n", "]h", function() gs.nav_hunk("next") end, { buffer = bufnr, desc = "下一个修改块" })
|
||||
vim.keymap.set("n", "[h", function() gs.nav_hunk("prev") end, { buffer = bufnr, desc = "上一个修改块" })
|
||||
|
||||
-- Hunk 操作
|
||||
vim.keymap.set("n", "<leader>hs", gs.stage_hunk, { buffer = bufnr, desc = "暂存修改块" })
|
||||
vim.keymap.set("n", "<leader>hr", gs.reset_hunk, { buffer = bufnr, desc = "撤销修改块" })
|
||||
vim.keymap.set("n", "<leader>hp", gs.preview_hunk, { buffer = bufnr, desc = "预览修改块" })
|
||||
|
||||
-- 文件操作
|
||||
vim.keymap.set("n", "<leader>hS", gs.stage_buffer, { buffer = bufnr, desc = "暂存文件" })
|
||||
vim.keymap.set("n", "<leader>hR", gs.reset_buffer, { buffer = bufnr, desc = "撤销文件修改" })
|
||||
|
||||
-- Blame
|
||||
vim.keymap.set("n", "<leader>hb", gs.blame_line, { buffer = bufnr, desc = "查看行 blame" })
|
||||
vim.keymap.set("n", "<leader>hl", gs.toggle_current_line_blame, { buffer = bufnr, desc = "切换行 blame" })
|
||||
|
||||
-- 其他
|
||||
vim.keymap.set("n", "<leader>hw", gs.setqflist, { buffer = bufnr, desc = "列出所有 hunk" })
|
||||
vim.keymap.set("n", "<leader>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 = {
|
||||
{ "<leader>go", "<cmd>DiffviewOpen<cr>", desc = "查看改动" },
|
||||
{ "<leader>gq", "<cmd>DiffviewClose<cr>", desc = "关闭 diff" },
|
||||
{ "<leader>gl", "<cmd>DiffviewFileHistory %<cr>", desc = "文件历史" },
|
||||
},
|
||||
opts = {
|
||||
file_panel = {
|
||||
listing_style = "tree",
|
||||
tree_options = {
|
||||
flatten_dirs = true,
|
||||
folder_statuses = "only_folded",
|
||||
},
|
||||
},
|
||||
keymaps = {
|
||||
view = {
|
||||
{ "n", "<leader>q", "<cmd>DiffviewClose<cr>", { desc = "关闭 diffview" } },
|
||||
},
|
||||
file_panel = {
|
||||
{ "n", "<leader>q", "<cmd>DiffviewClose<cr>", { desc = "关闭 diffview" } },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- ✅ 新增:lazygit 集成
|
||||
{
|
||||
"kdheepak/lazygit.nvim",
|
||||
cmd = { "LazyGit", "LazyGitCurrentFile" },
|
||||
keys = {
|
||||
{ "<leader>gg", ":LazyGit<CR>", desc = "LazyGit" },
|
||||
},
|
||||
dependencies = { "nvim-lua/plenary.nvim" },
|
||||
},
|
||||
}
|
||||
@@ -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,
|
||||
},
|
||||
}
|
||||
@@ -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 = {
|
||||
["<CR>"] = "actions.select",
|
||||
["<C-p>"] = "actions.preview",
|
||||
["<C-c>"] = "actions.close",
|
||||
["<C-r>"] = "actions.refresh",
|
||||
["<C-h>"] = "actions.toggle_hidden",
|
||||
["g?"] = "actions.show_help",
|
||||
},
|
||||
view_options = {
|
||||
show_hidden = true,
|
||||
},
|
||||
float = {
|
||||
padding = 2,
|
||||
max_width = 90,
|
||||
border = "rounded",
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "-", "<cmd>Oil<cr>", desc = "打开父目录" },
|
||||
{ "<leader>fe", "<cmd>Oil<cr>", desc = "文件浏览器" },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
-- =============================================================================
|
||||
-- runner.lua — 统一构建/运行/调试分发器
|
||||
-- =============================================================================
|
||||
-- 【保留】你的 runner.lua 配置和 keymap 完整保留。
|
||||
-- 【无修改】这是你的优秀设计,不需要改动。
|
||||
|
||||
return {
|
||||
{
|
||||
"mfussenegger/nvim-dap",
|
||||
keys = {
|
||||
-- 调试控制
|
||||
{ "<F5>", function() require("dap").continue() end, desc = "继续调试" },
|
||||
{ "<F10>", function() require("dap").step_over() end, desc = "单步跳过" },
|
||||
{ "<F11>", function() require("dap").step_into() end, desc = "单步进入" },
|
||||
{ "<F12>", function() require("dap").step_out() end, desc = "单步跳出" },
|
||||
-- 🔧 修改:断点键位从 <leader>b 改为 <leader>db(避免与 buffer 分组冲突)
|
||||
{ "<leader>db", function() require("dap").toggle_breakpoint() end, desc = "断点" },
|
||||
{ "<leader>du", function() require("dapui").toggle() end, desc = "调试界面" },
|
||||
|
||||
-- 统一构建/运行/调试/测试
|
||||
{ "<leader>rb", function() require("runner").build() end, desc = "构建" },
|
||||
{ "<leader>rr", function() require("runner").run() end, desc = "运行" },
|
||||
{ "<leader>rd", function() require("runner").debug() end, desc = "调试" },
|
||||
{ "<leader>rt", function() require("runner").test() end, desc = "测试" },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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 = {
|
||||
{ "<leader>ff", "<cmd>Telescope find_files<cr>", desc = "查找文件" },
|
||||
{ "<leader>fg", "<cmd>Telescope live_grep<cr>", desc = "全局搜索" },
|
||||
{ "<leader>fb", "<cmd>Telescope buffers<cr>", desc = "切换缓冲区" },
|
||||
{ "<leader>fh", "<cmd>Telescope help_tags<cr>", desc = "帮助文档" },
|
||||
{ "<leader>fk", "<cmd>Telescope keymaps<cr>", desc = "查找键位" },
|
||||
{ "<leader>fr", "<cmd>Telescope oldfiles<cr>", desc = "最近文件" },
|
||||
-- ✅ 新增:当前文件搜索和诊断
|
||||
{ "<leader>fc", "<cmd>Telescope current_buffer_fuzzy_find<cr>", desc = "当前文件搜索" },
|
||||
{ "<leader>fd", "<cmd>Telescope diagnostics<cr>", 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,
|
||||
},
|
||||
}
|
||||
@@ -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 },
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -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 },
|
||||
}
|
||||
@@ -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({
|
||||
{ "<leader>f", group = "搜索" },
|
||||
{ "<leader>g", group = "Git" },
|
||||
{ "<leader>h", group = "Hunk 操作" },
|
||||
{ "<leader>l", group = "LSP" },
|
||||
{ "<leader>r", group = "运行/调试" },
|
||||
{ "<leader>c", group = "CMake/C++" },
|
||||
{ "<leader>b", group = "标签操作" },
|
||||
{ "<leader>bc", desc = "关闭标签" },
|
||||
{ "<leader>bo", desc = "关闭其他标签" },
|
||||
{ "<leader>d", group = "调试操作" },
|
||||
{ "<leader>db", desc = "切换断点" },
|
||||
{ "<leader>du", desc = "调试界面" },
|
||||
{ "<leader>dd", desc = "行诊断" },
|
||||
{ "<leader>W", group = "窗口操作" },
|
||||
{ "<leader>e", group = "文件浏览" },
|
||||
{ "z", group = "折叠" },
|
||||
{ "zM", desc = "关闭所有折叠" },
|
||||
{ "zR", desc = "展开所有折叠" },
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user