update dotfiles

This commit is contained in:
2026-07-19 19:36:54 +08:00
parent b4010fe910
commit aef001a855
38 changed files with 1680 additions and 826 deletions
+11 -7
View File
@@ -1,11 +1,15 @@
-- ============================================================================
-- 自动括号补全 (nvim-autopairs)
-- ============================================================================
-- =============================================================================
-- autopairs.lua — 自动括号补全
-- =============================================================================
-- 【保留】你的配置。
-- 【修改】🔧 添加 check_ts = true 让括号补全感知 Treesitter 语法。
return {
{
"windwp/nvim-autopairs",
event = "InsertEnter",
opts = {},
{
"windwp/nvim-autopairs",
event = "InsertEnter",
opts = {
check_ts = true, -- 🔧 新增:Treesitter 感知,避免在字符串/注释里自动配对
},
},
}
+44 -43
View File
@@ -1,49 +1,50 @@
-- ============================================================================
-- CMake 工具 (cmake-tools.nvim)
-- CMake 项目全流程:生成、构建、运行、调试
-- ============================================================================
-- =============================================================================
-- cmake-tools.lua — CMake 工具
-- =============================================================================
-- 【保留】你的完整 cmake-tools 配置。
-- 【无修改】不改动任何已有逻辑。
return {
{
"Civitasv/cmake-tools.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
ft = { "cmake", "c", "cpp" },
{
"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 = {
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 = "选择编译器" },
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 = "选择编译器" },
},
},
}
+42 -39
View File
@@ -1,42 +1,45 @@
-- ============================================================================
-- 主题 (tokyonight)
-- 透明背景,与终端透明效果融合
-- ============================================================================
-- =============================================================================
-- colorscheme.lua — 主题
-- =============================================================================
return {
{
"folke/tokyonight.nvim",
lazy = false,
priority = 1000,
opts = {
style = "night",
transparent = true,
styles = {
sidebars = "transparent",
floats = "transparent",
},
},
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,
{
"folke/tokyonight.nvim",
lazy = false,
priority = 1000,
opts = {
style = "night",
transparent = true,
styles = {
sidebars = "transparent",
floats = "transparent",
},
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,
},
}
+50 -51
View File
@@ -1,56 +1,55 @@
-- ============================================================================
-- 智能补全 (blink.cmp)
-- ============================================================================
-- =============================================================================
-- completion.lua — 智能补全
-- =============================================================================
return {
{
"saghen/blink.cmp",
version = "*",
lazy = false, -- 立即加载,确保 LSP capabilities 可用
opts = {
keymap = {
preset = "super-tab",
["<C-j>"] = { "select_next" },
["<C-k>"] = { "select_prev" },
["<C-u>"] = { "scroll_documentation_up" },
["<C-n>"] = { "scroll_documentation_down" },
-- 命令行模式:Enter 确认补全而非执行命令
["<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",
-- scrollbar = false,
draw = {
columns = {
{ "label", "label_description", gap = 1 },
{ "source_name" },
},
},
},
documentation = {
auto_show = true,
auto_show_delay_ms = 500,
window = { border = "rounded" },
},
{
"saghen/blink.cmp",
version = "*",
event = "InsertEnter",
opts = {
keymap = {
preset = "super-tab",
["<C-j>"] = { "select_next" },
["<C-k>"] = { "select_prev" },
["<C-u>"] = { "scroll_documentation_up" },
["<C-n>"] = { "scroll_documentation_down" },
-- Tab 接受补全,回车仅用于确认输入(避免 nvim-tree 文件操作误触发)
["<Tab>"] = { "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" },
},
},
},
}
},
}
+42 -28
View File
@@ -1,32 +1,46 @@
-- ============================================================================
-- 自动格式化 (conform.nvim)
-- 保存时自动格式化,手动 <leader>cf 触发
-- ============================================================================
-- =============================================================================
-- conform.lua — 自动格式化
-- =============================================================================
-- 【保留】你的完整 conform 配置。
-- 【修改】🔧 键位从 <leader>cf 改为 <leader>lf(与 LSP 格式化键统一);
-- ✅ 新增更多语言的 formatter。
return {
{
"stevearc/conform.nvim",
event = { "BufWritePre" },
cmd = { "ConformInfo" },
keys = {
{ "<leader>cf", function() require("conform").format({ async = 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" },
},
formatters = {
["clang-format"] = {
args = { "--style={BasedOnStyle: LLVM, IndentWidth: 4, TabWidth: 4, UseTab: Never, ColumnLimit: 0}" },
},
},
},
{
"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}" },
},
},
},
},
}
+84 -89
View File
@@ -1,94 +1,89 @@
-- ============================================================================
-- DAP 调试器
-- ============================================================================
-- =============================================================================
-- dap.lua — DAP 调试器
-- =============================================================================
return {
{
"mfussenegger/nvim-dap",
dependencies = {
"rcarriga/nvim-dap-ui",
"nvim-neotest/nvim-nio",
"williamboman/mason.nvim",
},
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 适配器(Mason 安装路径)
dap.adapters.codelldb = {
type = "server",
port = "${port}",
executable = {
command = vim.fn.stdpath("data") .. "/mason/bin/codelldb",
args = { "--port", "${port}" },
},
}
-- C/C++ 调试配置(非 CMake 项目,CMake 项目用 <leader>rd
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,
{
"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")
-- Mason DAP 自动安装
-- lazy = false: defaults = { lazy = true } 会使此插件无触发器而永不加载,
-- 导致 ensure_installed 不执行、codelldb 不安装
{
"jay-babu/mason-nvim-dap.nvim",
dependencies = { "williamboman/mason.nvim", "mfussenegger/nvim-dap" },
lazy = false,
opts = {
ensure_installed = { "codelldb" },
-- 断点图标
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" },
event = "BufReadPost",
opts = { ensure_installed = { "codelldb" } },
},
}
+10 -13
View File
@@ -1,16 +1,13 @@
-- ============================================================================
-- 图标支持 (nvim-web-devicons)
-- 为 oil、telescope、状态栏等提供文件类型图标
-- ============================================================================
-- =============================================================================
-- devicons.lua — 文件图标
-- =============================================================================
return {
{
"nvim-tree/nvim-web-devicons",
lazy = true,
opts = {
override = {
rs = { icon = "󱘗", color = "#dea584", name = "Rust" },
},
},
{
"nvim-tree/nvim-web-devicons",
lazy = true,
opts = {
color_icons = true,
},
}
},
}
-35
View File
@@ -1,35 +0,0 @@
-- ============================================================================
-- Git diff 视图 (diffview)
-- 仓库级 diff 总览 + 提交历史对比,补充 gitsigns 的行内能力
-- ============================================================================
return {
{
"sindrets/diffview.nvim",
cmd = "DiffviewOpen",
keys = {
-- 只保留 3 个核心键位:打开/关闭 diff 视图、查看历史
{ "<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 = {
-- 覆盖全局 <leader>q:在 diffview 里关闭整个 diffview,而非单个窗口
{ "n", "<leader>q", "<cmd>DiffviewClose<cr>", { desc = "关闭 diffview" } },
},
file_panel = {
{ "n", "<leader>q", "<cmd>DiffviewClose<cr>", { desc = "关闭 diffview" } },
},
},
},
},
}
+110
View File
@@ -0,0 +1,110 @@
-- =============================================================================
-- 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-`>", "<cmd>ToggleTerm<cr>", mode = { "n", "t" }, desc = "终端" },
{ "<leader>tg", "<cmd>ToggleTerm direction=float<cr>", desc = "浮动终端" },
{ "<leader>th", "<cmd>ToggleTerm direction=horizontal<cr>", desc = "水平终端" },
{ "<leader>tv", "<cmd>ToggleTerm direction=vertical<cr>", desc = "垂直终端" },
},
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 = "horizontal",
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,
},
}
+64
View File
@@ -0,0 +1,64 @@
-- =============================================================================
-- filetree.lua — 文件树
-- =============================================================================
return {
{
"nvim-tree/nvim-tree.lua",
version = "*",
lazy = false,
keys = {
{ "<leader>e", "<cmd>NvimTreeToggle<CR>", desc = "侧边文件树" },
},
dependencies = { "nvim-tree/nvim-web-devicons" },
config = function()
-- 禁用 netrw
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1
require("nvim-tree").setup({
sort_by = "case_sensitive",
view = {
width = 30,
side = "left",
relativenumber = false,
adaptive_size = false,
},
renderer = {
group_empty = true,
icons = {
show = {
file = true,
folder = true,
folder_arrow = true,
git = false,
},
glyphs = {
folder = {
arrow_closed = "",
arrow_open = "",
},
},
},
},
filters = {
dotfiles = false,
custom = { "^.git$" },
},
git = {
enable = false,
ignore = false,
},
actions = {
open_file = {
quit_on_open = false,
window_picker = { enable = true },
},
},
on_attach = function(bufnr)
require("nvim-tree.api").config.mappings.default_on_attach(bufnr)
end,
})
end,
},
}
+91
View File
@@ -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" },
},
}
-51
View File
@@ -1,51 +0,0 @@
-- ============================================================================
-- Git 集成 (gitsigns)
-- 行内 diff 标记 + hunk 操作
-- ============================================================================
return {
{
"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,
},
}
+2 -35
View File
@@ -100,41 +100,8 @@ return {
},
}
-- Rust (rust-analyzer)
vim.lsp.config['rust_analyzer'] = {
cmd = { 'rust-analyzer' }, -- 使用 rustup 的版本,更稳定
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",
},
},
},
}
-- 启用所有 LSP
vim.lsp.enable({ 'lua_ls', 'bashls', 'clangd', 'neocmake', 'rust_analyzer' })
-- 启用所有 LSPRust rustaceanvim 管理)
vim.lsp.enable({ 'lua_ls', 'bashls', 'clangd', 'neocmake' })
end,
},
}
+33 -32
View File
@@ -1,36 +1,37 @@
-- ============================================================================
-- 文件浏览器 (oil.nvim)
-- 缓冲区编辑模式,像编辑文本一样管理文件
-- ============================================================================
-- =============================================================================
-- 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 = "文件浏览器" },
},
{
"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 = "文件浏览器" },
},
},
}
+22 -20
View File
@@ -1,25 +1,27 @@
-- ============================================================================
-- 统一构建/运行/调试键位
-- 所有语言共用同一组键位,由 runner.lua 自动分发
-- ============================================================================
-- =============================================================================
-- 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", function() require("dap").toggle_breakpoint() end, desc = "断点" },
{ "<leader>du", function() require("dapui").toggle() end, desc = "调试界面" },
{
"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 = "测试" },
},
-- 统一构建/运行/调试/测试
{ "<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 = "测试" },
},
},
}
+11 -4
View File
@@ -1,5 +1,12 @@
-- ============================================================================
-- Rust 工具(通过 Mason + nvim-lspconfig 管理)
-- ============================================================================
-- =============================================================================
-- rustaceanvim.lua — Rust 开发增强
-- =============================================================================
-- rustaceanvim 自动管理 rust-analyzer,提供调试、测试等功能
-- 依赖:rustup 安装的 rust-analyzer(不要用 Mason 安装,避免冲突)
-- 安装:rustup component add rust-analyzer
return {}
return {
"mrcjkb/rustaceanvim",
ft = { "rust" },
version = "^6",
}
+50 -44
View File
@@ -1,47 +1,53 @@
-- ============================================================================
-- 模糊搜索 (telescope)
-- ============================================================================
-- =============================================================================
-- telescope.lua — 模糊搜索
-- =============================================================================
return {
{
"nvim-telescope/telescope.nvim",
branch = "0.1.x",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-telescope/telescope-ui-select.nvim",
},
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 = "最近文件" },
},
-- 启动即加载:ui-select 扩展需要全局接管 vim.ui.select
-- 懒加载会导致未触发 :Telescope 时(如 <leader>rr)回退到原生 UI
lazy = false,
opts = {
defaults = {
prompt_prefix = " > ",
selection_caret = " > ",
layout_strategy = "flex",
},
},
config = function(_, opts)
local telescope = require("telescope")
-- extensions 需要 require telescope.themes,必须在 config 里构造
opts.extensions = {
["ui-select"] = {
require("telescope.themes").get_dropdown({}),
},
}
telescope.setup(opts)
-- 用 pcall 保护,避免 ui-select 扩展未安装时崩溃
pcall(telescope.load_extension, "ui-select")
end,
{
"nvim-telescope/telescope.nvim",
branch = "0.1.x",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-telescope/telescope-ui-select.nvim",
{
"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 = "诊断信息" },
},
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")
pcall(telescope.load_extension, "fzf")
end,
},
}
+20 -27
View File
@@ -1,31 +1,24 @@
-- ============================================================================
-- 语法高亮 (Tree-sitter)
-- ============================================================================
-- =============================================================================
-- treesitter.lua — 语法高亮
-- =============================================================================
-- 【保留】你的完整 ensure_installed 列表。
-- 【新增】✅ fold 配置让 nvim-ufo 可以使用 treesitter 折叠。
return {
{
"nvim-treesitter/nvim-treesitter",
event = { "BufReadPre", "BufNewFile" },
build = ":TSUpdate",
opts = {
ensure_installed = {
"lua", -- Lua
"bash", -- Bash
"rust", -- Rust
"c", -- C
"cpp", -- C++
"cmake", -- CMake
"python", -- Python
"java", -- Java
"go", -- Go
"json", -- JSON
"toml", -- TOML
"markdown", -- Markdown
"regex", -- 正则
"vim", -- Vimscript
},
highlight = { enable = true },
indent = { enable = true },
},
{
"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 },
},
},
}
+177
View File
@@ -0,0 +1,177 @@
-- =============================================================================
-- ui.lua — UI 美化套件
-- =============================================================================
return {
-- bufferline: 顶部标签栏
{
"akinsho/bufferline.nvim",
version = "*",
event = "BufAdd",
dependencies = {
"nvim-tree/nvim-web-devicons",
"famiu/bufdelete.nvim",
},
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,
offsets = {
{ filetype = "oil", text = "文件浏览器", highlight = "Directory", text_align = "left" },
{ filetype = "NvimTree", 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" } },
-- 隐藏非文件 bufferquickfix/终端/help 等),避免 cmake 输出污染标签栏
custom_filter = function(bufnr)
return vim.bo[bufnr].buftype == ""
end,
},
})
end,
},
-- lualine: 底部状态栏
{
"nvim-lualine/lualine.nvim",
event = "BufAdd",
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,
},
-- 禁用 vim.ui.input 的补全,避免 nvim-tree 文件操作时回车误触发补全
input = {
enabled = false,
},
},
dependencies = { "MunifTanjim/nui.nvim", "rcarriga/nvim-notify" },
},
-- nvim-notify: 通知美化
{
"rcarriga/nvim-notify",
event = "BufAdd",
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",
lazy = false,
dependencies = { "nvim-tree/nvim-web-devicons" },
config = function()
require("dashboard").setup({
theme = "doom",
config = {
header = {
"",
" ███╗ ██╗███████╗ ██████╗ ██╗ ██╗██╗ ██╗██╗███╗ ███╗",
" ████╗ ██║██╔════╝██╔═══██╗██║ ██║██║ ██║██║████╗ ████║",
" ██╔██╗ ██║█████╗ ██║ ██║██║ ██║██║ ██║██║██╔████╔██║",
" ██║╚██╗██║██╔════╝██║ ██║╚██╗ ██╔╝╚██╗ ██╔╝██║██║╚██╔╝██║",
" ██║ ╚████║███████╗╚██████╔╝ ╚████╔╝ ╚████╔╝ ██║██║ ╚═╝ ██║",
" ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═══╝ ╚═══╝ ╚═╝╚═╝ ╚═╝",
"",
},
center = {
{ icon = " ", key = "f", desc = "f 查找文件", action = "Telescope find_files" },
{ icon = " ", key = "r", desc = "r 最近文件", action = "Telescope oldfiles" },
{ icon = " ", key = "g", desc = "g 全局搜索", action = "Telescope live_grep" },
{ icon = " ", key = "l", desc = "l 插件管理", action = "Lazy" },
{ icon = " ", key = "m", desc = "m LSP 管理", action = "Mason" },
{ icon = " ", key = "q", desc = "q 退出", action = "qa" },
},
footer = { " type :help for help · :q to exit" },
vertical_center = true, -- 官方垂直居中选项
},
})
end,
},
-- 通用依赖
{ "nvim-lua/plenary.nvim", lazy = true },
{ "MunifTanjim/nui.nvim", lazy = true },
}
+61 -11
View File
@@ -1,16 +1,66 @@
-- ============================================================================
-- 键位提示 (which-key)
-- ============================================================================
-- =============================================================================
-- whichkey.lua — 键位提示
-- =============================================================================
-- 【修复】原配置 enabled = false 直接禁用了,现在启用。
-- 【修改】🔧 enabled 改为 true
-- 🔧 更完善的分组和图标配置。
return {
{
"folke/which-key.nvim",
enabled = false,
event = "VeryLazy",
opts = {
delay = 300,
icons = { breadcrumb = ">", separator = "->", group = "+" },
spec = { { "z", hidden = true } },
{
"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>e", group = "文件树" },
{ "<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,
},
}