mirror of
https://github.com/d0zingcat/dotfiles.git
synced 2026-05-14 15:09:44 +00:00
refactor(nvim): 完整重写配置,支持 Go/Rust/Python/TypeScript 开发
- 架构重构:新增 plugins/lang/ 子目录,按语言拆分配置 - 补全引擎:nvim-cmp → blink.cmp + LuaSnip - 文件浏览:新增 neo-tree(<Space>e) - 语言支持: - Go: ray-x/go.nvim + dap-go + neotest-go - Rust: rustaceanvim + crates.nvim - Python: venv-selector + dap-python + neotest-python - TypeScript: typescript-tools.nvim(替换 ts_ls) - LSP: lazydev + mason + mason-lspconfig + fidget + inc-rename - 格式化: conform.nvim(lsp_format fallback,保存时自动格式化) - Lint: nvim-lint(selene 替换 luacheck,Mason 可直接安装) - UI: snacks.nvim(dashboard+notifier+picker)+ noice + lualine + bufferline - 编辑增强: mini.ai + mini.surround + grug-far + flash + ufo + trouble v3 - 删除废弃文件: cmp/coding/null-ls/mason/lspconfig/go/python 等旧文件 - 修复: Neovim 0.12 treesitter query 校验报错(noice routes 过滤) - 新增: NVIM_GUIDE.md 快捷键使用手册 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -1,27 +1,10 @@
|
||||
-- editor.lua - 编辑器增强插件配置
|
||||
-- 包含:telescope, gitsigns, flash, todo-comments, which-key, mini.bufremove,
|
||||
-- autopairs, illuminate, ufo(折叠), rainbow-delimiters, toggleterm,
|
||||
-- trouble(v3), persistence, luasnip, ts-comments, vim-visual-multi
|
||||
|
||||
return {
|
||||
-- LazyGit 集成
|
||||
{
|
||||
"kdheepak/lazygit.nvim",
|
||||
cmd = {
|
||||
"LazyGit",
|
||||
"LazyGitConfig",
|
||||
"LazyGitCurrentFile",
|
||||
"LazyGitFilter",
|
||||
"LazyGitFilterCurrentFile",
|
||||
},
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim",
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>gg", "<cmd>LazyGit<cr>", desc = "打开 LazyGit" },
|
||||
{ "<leader>gf", "<cmd>LazyGitCurrentFile<cr>", desc = "当前文件 Git 历史" },
|
||||
{ "<leader>gc", "<cmd>LazyGitConfig<cr>", desc = "LazyGit 配置" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 模糊搜索
|
||||
-- 模糊搜索(保留 telescope 作为备选/LSP 操作入口)
|
||||
{
|
||||
"nvim-telescope/telescope.nvim",
|
||||
cmd = "Telescope",
|
||||
@@ -35,34 +18,7 @@ return {
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
-- 文件查找
|
||||
{ "<leader>ff", "<cmd>Telescope find_files<cr>", desc = "查找文件" },
|
||||
{ "<leader>fr", "<cmd>Telescope oldfiles<cr>", desc = "最近文件" },
|
||||
{ "<leader>fb", "<cmd>Telescope buffers<cr>", desc = "查找缓冲区" },
|
||||
|
||||
-- 内容搜索
|
||||
{ "<leader>fg", "<cmd>Telescope live_grep<cr>", desc = "全局搜索" },
|
||||
{ "<leader>fw", "<cmd>Telescope grep_string<cr>", desc = "搜索当前单词" },
|
||||
|
||||
-- 其他功能
|
||||
{ "<leader>fh", "<cmd>Telescope help_tags<cr>", desc = "帮助标签" },
|
||||
{ "<leader>fm", "<cmd>Telescope marks<cr>", desc = "跳转到书签" },
|
||||
{ "<leader>fc", "<cmd>Telescope commands<cr>", desc = "命令" },
|
||||
{ "<leader>fk", "<cmd>Telescope keymaps<cr>", desc = "快捷键" },
|
||||
|
||||
-- 工作区相关
|
||||
{ "<leader>ws", "<cmd>Telescope lsp_workspace_symbols<cr>", desc = "工作区符号" },
|
||||
|
||||
-- LSP 相关
|
||||
{ "<leader>cs", "<cmd>Telescope lsp_document_symbols<cr>", desc = "文档符号" },
|
||||
{ "<leader>cr", "<cmd>Telescope lsp_references<cr>", desc = "引用" },
|
||||
{ "<leader>ci", "<cmd>Telescope lsp_implementations<cr>", desc = "实现" },
|
||||
{ "<leader>cd", "<cmd>Telescope lsp_definitions<cr>", desc = "定义" },
|
||||
{ "<leader>ct", "<cmd>Telescope lsp_type_definitions<cr>", desc = "类型定义" },
|
||||
|
||||
-- 诊断
|
||||
{ "<leader>xx", "<cmd>Telescope diagnostics bufnr=0<cr>", desc = "当前文件诊断" },
|
||||
{ "<leader>xw", "<cmd>Telescope diagnostics<cr>", desc = "工作区诊断" },
|
||||
{ "<leader>fp", "<cmd>Telescope projects<cr>", desc = "项目" },
|
||||
},
|
||||
opts = {
|
||||
defaults = {
|
||||
@@ -70,228 +26,230 @@ return {
|
||||
selection_caret = " ",
|
||||
mappings = {
|
||||
i = {
|
||||
["<C-j>"] = function(...)
|
||||
return require("telescope.actions").move_selection_next(...)
|
||||
end,
|
||||
["<C-k>"] = function(...)
|
||||
return require("telescope.actions").move_selection_previous(...)
|
||||
end,
|
||||
["<C-n>"] = function(...)
|
||||
return require("telescope.actions").cycle_history_next(...)
|
||||
end,
|
||||
["<C-p>"] = function(...)
|
||||
return require("telescope.actions").cycle_history_prev(...)
|
||||
end,
|
||||
["<C-c>"] = function(...)
|
||||
return require("telescope.actions").close(...)
|
||||
end,
|
||||
["<C-u>"] = function(...)
|
||||
return require("telescope.actions").preview_scrolling_up(...)
|
||||
end,
|
||||
["<C-d>"] = function(...)
|
||||
return require("telescope.actions").preview_scrolling_down(...)
|
||||
end,
|
||||
},
|
||||
n = {
|
||||
["q"] = function(...)
|
||||
return require("telescope.actions").close(...)
|
||||
end,
|
||||
["<C-j>"] = function(...) return require("telescope.actions").move_selection_next(...) end,
|
||||
["<C-k>"] = function(...) return require("telescope.actions").move_selection_previous(...) end,
|
||||
["<C-c>"] = function(...) return require("telescope.actions").close(...) end,
|
||||
},
|
||||
n = { ["q"] = function(...) return require("telescope.actions").close(...) end },
|
||||
},
|
||||
},
|
||||
pickers = {
|
||||
find_files = {
|
||||
-- 默认包含隐藏文件
|
||||
find_command = { "rg", "--files", "--hidden", "--glob", "!.git" },
|
||||
},
|
||||
find_files = { find_command = { "rg", "--files", "--hidden", "--glob", "!.git" } },
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
local telescope = require("telescope")
|
||||
telescope.setup(opts)
|
||||
|
||||
-- 加载扩展
|
||||
pcall(telescope.load_extension, "fzf")
|
||||
end,
|
||||
},
|
||||
|
||||
-- LazyGit 集成
|
||||
|
||||
-- Git 变更标记
|
||||
{
|
||||
"kdheepak/lazygit.nvim",
|
||||
cmd = {
|
||||
"LazyGit",
|
||||
"LazyGitConfig",
|
||||
"LazyGitCurrentFile",
|
||||
"LazyGitFilter",
|
||||
"LazyGitFilterCurrentFile",
|
||||
},
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim",
|
||||
},
|
||||
keys = {
|
||||
{ "<leader>gg", "<cmd>LazyGit<cr>", desc = "打开 LazyGit" },
|
||||
{ "<leader>gf", "<cmd>LazyGitCurrentFile<cr>", desc = "当前文件 Git 历史" },
|
||||
{ "<leader>gc", "<cmd>LazyGitConfig<cr>", desc = "LazyGit 配置" },
|
||||
"lewis6991/gitsigns.nvim",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
opts = {
|
||||
signs = {
|
||||
add = { text = "▎" }, change = { text = "▎" }, delete = { text = "" },
|
||||
topdelete = { text = "" }, changedelete = { text = "▎" }, untracked = { text = "▎" },
|
||||
},
|
||||
on_attach = function(buffer)
|
||||
local gs = package.loaded.gitsigns
|
||||
local function map(mode, l, r, desc)
|
||||
vim.keymap.set(mode, l, r, { buffer = buffer, desc = desc })
|
||||
end
|
||||
map("n", "]h", gs.next_hunk, "下一个变更")
|
||||
map("n", "[h", gs.prev_hunk, "上一个变更")
|
||||
map({ "n", "v" }, "<leader>gs", ":Gitsigns stage_hunk<CR>", "暂存变更")
|
||||
map({ "n", "v" }, "<leader>gr", ":Gitsigns reset_hunk<CR>", "重置变更")
|
||||
map("n", "<leader>gS", gs.stage_buffer, "暂存文件")
|
||||
map("n", "<leader>gu", gs.undo_stage_hunk, "取消暂存变更")
|
||||
map("n", "<leader>gR", gs.reset_buffer, "重置文件")
|
||||
map("n", "<leader>gp", gs.preview_hunk, "预览变更")
|
||||
map("n", "<leader>gb", function() gs.blame_line({ full = true }) end, "查看责任")
|
||||
map("n", "<leader>gB", gs.toggle_current_line_blame, "开关行责任")
|
||||
map("n", "<leader>gd", gs.diffthis, "文件差异")
|
||||
map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "选择变更")
|
||||
end,
|
||||
},
|
||||
},
|
||||
|
||||
-- 高级语法高亮
|
||||
-- 快速跳转
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
build = ":TSUpdate",
|
||||
event = { "BufReadPost", "BufNewFile" },
|
||||
dependencies = {
|
||||
"nvim-treesitter/nvim-treesitter-textobjects",
|
||||
},
|
||||
"folke/flash.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {
|
||||
-- 自动安装的语法
|
||||
ensure_installed = {
|
||||
"bash",
|
||||
"c",
|
||||
"cmake",
|
||||
"comment",
|
||||
"cpp",
|
||||
"css",
|
||||
"dockerfile",
|
||||
"gitignore",
|
||||
"go",
|
||||
"gomod",
|
||||
"gowork",
|
||||
"html",
|
||||
"http",
|
||||
"java",
|
||||
"javascript",
|
||||
"json",
|
||||
"kotlin",
|
||||
"lua",
|
||||
"make",
|
||||
"markdown",
|
||||
"markdown_inline",
|
||||
"python",
|
||||
"regex",
|
||||
"ruby",
|
||||
"rust",
|
||||
"sql",
|
||||
"toml",
|
||||
"tsx",
|
||||
"typescript",
|
||||
"vim",
|
||||
"vimdoc",
|
||||
"xml",
|
||||
"yaml",
|
||||
},
|
||||
|
||||
-- 启用特性
|
||||
highlight = { enable = true },
|
||||
indent = { enable = true },
|
||||
incremental_selection = {
|
||||
enable = true,
|
||||
keymaps = {
|
||||
init_selection = "<C-space>",
|
||||
node_incremental = "<C-space>",
|
||||
scope_incremental = false,
|
||||
node_decremental = "<bs>",
|
||||
},
|
||||
},
|
||||
|
||||
-- 文本对象
|
||||
textobjects = {
|
||||
select = {
|
||||
enable = true,
|
||||
lookahead = true,
|
||||
keymaps = {
|
||||
["af"] = "@function.outer",
|
||||
["if"] = "@function.inner",
|
||||
["ac"] = "@class.outer",
|
||||
["ic"] = "@class.inner",
|
||||
["aa"] = "@parameter.outer",
|
||||
["ia"] = "@parameter.inner",
|
||||
},
|
||||
},
|
||||
move = {
|
||||
enable = true,
|
||||
set_jumps = true,
|
||||
goto_next_start = {
|
||||
["]f"] = "@function.outer",
|
||||
["]c"] = "@class.outer",
|
||||
},
|
||||
goto_next_end = {
|
||||
["]F"] = "@function.outer",
|
||||
["]C"] = "@class.outer",
|
||||
},
|
||||
goto_previous_start = {
|
||||
["[f"] = "@function.outer",
|
||||
["[c"] = "@class.outer",
|
||||
},
|
||||
goto_previous_end = {
|
||||
["[F"] = "@function.outer",
|
||||
["[C"] = "@class.outer",
|
||||
},
|
||||
},
|
||||
search = { multi_window = false, wrap = true },
|
||||
modes = { char = { enabled = true, keys = { "f", "F", "t", "T", ";", "," } } },
|
||||
},
|
||||
keys = {
|
||||
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash 跳转" },
|
||||
{ "S", mode = { "n", "x", "o" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
|
||||
{ "r", mode = "o", function() require("flash").remote() end, desc = "Flash 远程" },
|
||||
{ "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Flash Treesitter 搜索" },
|
||||
},
|
||||
},
|
||||
|
||||
-- TODO 注释高亮
|
||||
{
|
||||
"folke/todo-comments.nvim",
|
||||
dependencies = { "nvim-lua/plenary.nvim" },
|
||||
event = "BufReadPost",
|
||||
opts = { signs = true },
|
||||
keys = {
|
||||
{ "]t", function() require("todo-comments").jump_next() end, desc = "下一个 TODO" },
|
||||
{ "[t", function() require("todo-comments").jump_prev() end, desc = "上一个 TODO" },
|
||||
{ "<leader>ft", "<cmd>TodoTelescope<cr>", desc = "TODO 列表" },
|
||||
},
|
||||
},
|
||||
|
||||
-- which-key 按键提示
|
||||
{
|
||||
"folke/which-key.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {
|
||||
plugins = {
|
||||
marks = true, registers = true,
|
||||
spelling = { enabled = true, suggestions = 20 },
|
||||
presets = { operators = true, motions = true, text_objects = true, windows = true, nav = true, z = true, g = true },
|
||||
},
|
||||
icons = { breadcrumb = "»", separator = "➜", group = "+" },
|
||||
win = { border = "rounded" },
|
||||
show_help = true,
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("nvim-treesitter.configs").setup(opts)
|
||||
local wk = require("which-key")
|
||||
wk.setup(opts)
|
||||
wk.add({
|
||||
{ "<leader>b", group = "缓冲区" },
|
||||
{ "<leader>c", group = "代码" },
|
||||
{ "<leader>d", group = "调试" },
|
||||
{ "<leader>f", group = "查找/文件" },
|
||||
{ "<leader>g", group = "Git" },
|
||||
{ "<leader>n", group = "通知" },
|
||||
{ "<leader>q", group = "退出/会话" },
|
||||
{ "<leader>r", group = "Rust" },
|
||||
{ "<leader>s", group = "搜索" },
|
||||
{ "<leader>t", group = "TypeScript/终端" },
|
||||
{ "<leader>u", group = "UI 切换" },
|
||||
{ "<leader>x", group = "诊断" },
|
||||
{ "<leader>p", group = "Python" },
|
||||
{ "<leader>gt", group = "Go 测试" },
|
||||
{ "<leader>gg", group = "Go 生成" },
|
||||
{ "<leader>dt", group = "调试 - 测试" },
|
||||
{ "<leader>dp", group = "调试 - Python" },
|
||||
{ "<leader>rc", group = "Rust Crate" },
|
||||
{ "<leader>sn", group = "Noice" },
|
||||
})
|
||||
end,
|
||||
},
|
||||
|
||||
-- 代码注释
|
||||
|
||||
-- Trouble v3 - 诊断列表
|
||||
{
|
||||
"numToStr/Comment.nvim",
|
||||
"folke/trouble.nvim",
|
||||
cmd = "Trouble",
|
||||
opts = {
|
||||
padding = true, -- 在注释分隔符后添加空格
|
||||
sticky = true, -- 注释时光标不移动
|
||||
toggler = {
|
||||
line = "gcc", -- 行注释切换
|
||||
block = "gbc", -- 块注释切换
|
||||
},
|
||||
opleader = {
|
||||
line = "gc", -- 行注释操作
|
||||
block = "gb", -- 块注释操作
|
||||
},
|
||||
extra = {
|
||||
above = "gcO", -- 在当前行上方添加注释
|
||||
below = "gco", -- 在当前行下方添加注释
|
||||
eol = "gcA", -- 在当前行尾添加注释
|
||||
},
|
||||
mappings = {
|
||||
basic = true, -- 基本映射
|
||||
extra = true, -- 额外映射
|
||||
modes = {
|
||||
lsp = {
|
||||
win = { position = "right" },
|
||||
},
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
{ "gcc", mode = "n", desc = "行注释" },
|
||||
{ "gbc", mode = "n", desc = "块注释" },
|
||||
{ "gc", mode = { "n", "o" }, desc = "行注释操作" },
|
||||
{ "gb", mode = { "n", "o" }, desc = "块注释操作" },
|
||||
{ "<leader>xx", "<cmd>Trouble diagnostics toggle<cr>", desc = "诊断" },
|
||||
{ "<leader>xX", "<cmd>Trouble diagnostics toggle filter.buf=0<cr>", desc = "当前文件诊断" },
|
||||
{ "<leader>xL", "<cmd>Trouble loclist toggle<cr>", desc = "位置列表" },
|
||||
{ "<leader>xQ", "<cmd>Trouble qflist toggle<cr>", desc = "快速修复" },
|
||||
{ "<leader>xs", "<cmd>Trouble symbols toggle<cr>", desc = "符号" },
|
||||
{
|
||||
"[q",
|
||||
function()
|
||||
if require("trouble").is_open() then
|
||||
require("trouble").prev({ skip_groups = true, jump = true })
|
||||
else
|
||||
local ok, err = pcall(vim.cmd.cprev)
|
||||
if not ok then vim.notify(err, vim.log.levels.ERROR) end
|
||||
end
|
||||
end,
|
||||
desc = "上一个问题",
|
||||
},
|
||||
{
|
||||
"]q",
|
||||
function()
|
||||
if require("trouble").is_open() then
|
||||
require("trouble").next({ skip_groups = true, jump = true })
|
||||
else
|
||||
local ok, err = pcall(vim.cmd.cnext)
|
||||
if not ok then vim.notify(err, vim.log.levels.ERROR) end
|
||||
end
|
||||
end,
|
||||
desc = "下一个问题",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 代码折叠
|
||||
|
||||
-- 缓冲区删除(保留分割窗口)
|
||||
{
|
||||
"kevinhwang91/nvim-ufo",
|
||||
dependencies = {
|
||||
"kevinhwang91/promise-async",
|
||||
"echasnovski/mini.bufremove",
|
||||
keys = {
|
||||
{ "<leader>bd", function() require("mini.bufremove").delete(0, false) end, desc = "关闭缓冲区" },
|
||||
{ "<leader>bD", function() require("mini.bufremove").delete(0, true) end, desc = "强制关闭缓冲区" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 自动括号配对
|
||||
{
|
||||
"windwp/nvim-autopairs",
|
||||
event = "InsertEnter",
|
||||
opts = {
|
||||
check_ts = true,
|
||||
ts_config = {
|
||||
lua = { "string", "source" },
|
||||
javascript = { "string", "template_string" },
|
||||
},
|
||||
fast_wrap = { map = "<M-e>" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 高亮相同单词
|
||||
{
|
||||
"RRethy/vim-illuminate",
|
||||
event = "BufReadPost",
|
||||
opts = {
|
||||
provider_selector = function()
|
||||
return { "treesitter", "indent" }
|
||||
end,
|
||||
delay = 200,
|
||||
large_file_cutoff = 2000,
|
||||
large_file_overrides = { providers = { "lsp" } },
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("illuminate").configure(opts)
|
||||
local function map(key, dir, buffer)
|
||||
vim.keymap.set("n", key, function()
|
||||
require("illuminate")["goto_" .. dir .. "_reference"](false)
|
||||
end, { desc = dir .. " 引用", buffer = buffer })
|
||||
end
|
||||
map("]]", "next")
|
||||
map("[[", "prev")
|
||||
vim.api.nvim_create_autocmd("LspAttach", {
|
||||
callback = function(args)
|
||||
map("]]", "next", args.buf)
|
||||
map("[[", "prev", args.buf)
|
||||
end,
|
||||
})
|
||||
end,
|
||||
keys = { { "]]", desc = "下一个引用" }, { "[[", desc = "上一个引用" } },
|
||||
},
|
||||
|
||||
-- 代码折叠(基于 LSP/treesitter)
|
||||
{
|
||||
"kevinhwang91/nvim-ufo",
|
||||
dependencies = { "kevinhwang91/promise-async" },
|
||||
event = "BufReadPost",
|
||||
opts = {
|
||||
provider_selector = function() return { "treesitter", "indent" } end,
|
||||
open_fold_hl_timeout = 150,
|
||||
close_fold_kinds_for_ft = {},
|
||||
preview = {
|
||||
win_config = {
|
||||
border = { "", "─", "", "", "", "─", "", "" },
|
||||
winhighlight = "Normal:Folded",
|
||||
winblend = 0,
|
||||
},
|
||||
mappings = {
|
||||
scrollU = "<C-u>",
|
||||
scrollD = "<C-d>",
|
||||
jumpTop = "[",
|
||||
jumpBot = "]",
|
||||
},
|
||||
win_config = { border = { "", "─", "", "", "", "─", "", "" }, winhighlight = "Normal:Folded", winblend = 0 },
|
||||
mappings = { scrollU = "<C-u>", scrollD = "<C-d>", jumpTop = "[", jumpBot = "]" },
|
||||
},
|
||||
},
|
||||
init = function()
|
||||
@@ -303,12 +261,29 @@ return {
|
||||
keys = {
|
||||
{ "zR", function() require("ufo").openAllFolds() end, desc = "打开所有折叠" },
|
||||
{ "zM", function() require("ufo").closeAllFolds() end, desc = "关闭所有折叠" },
|
||||
{ "zr", function() require("ufo").openFoldsExceptKinds() end, desc = "打开一级折叠" },
|
||||
{ "zm", function() require("ufo").closeFoldsWith() end, desc = "关闭一级折叠" },
|
||||
{ "zp", function() require("ufo").peekFoldedLinesUnderCursor() end, desc = "预览当前折叠" },
|
||||
{ "zr", function() require("ufo").openFoldsExceptKinds() end, desc = "展开一级" },
|
||||
{ "zm", function() require("ufo").closeFoldsWith() end, desc = "折叠一级" },
|
||||
{ "zp", function() require("ufo").peekFoldedLinesUnderCursor() end, desc = "预览折叠" },
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
-- 彩虹括号
|
||||
{
|
||||
"HiPhish/rainbow-delimiters.nvim",
|
||||
event = "BufReadPost",
|
||||
config = function()
|
||||
local rd = require("rainbow-delimiters")
|
||||
vim.g.rainbow_delimiters = {
|
||||
strategy = { [""] = rd.strategy["global"], vim = rd.strategy["local"] },
|
||||
query = { [""] = "rainbow-delimiters", lua = "rainbow-blocks" },
|
||||
highlight = {
|
||||
"RainbowDelimiterRed", "RainbowDelimiterYellow", "RainbowDelimiterBlue",
|
||||
"RainbowDelimiterOrange", "RainbowDelimiterGreen", "RainbowDelimiterViolet", "RainbowDelimiterCyan",
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- 终端集成
|
||||
{
|
||||
"akinsho/toggleterm.nvim",
|
||||
@@ -317,222 +292,126 @@ return {
|
||||
{ "<leader>tf", "<cmd>ToggleTerm direction=float<cr>", desc = "浮动终端" },
|
||||
{ "<leader>th", "<cmd>ToggleTerm direction=horizontal<cr>", desc = "水平终端" },
|
||||
{ "<leader>tv", "<cmd>ToggleTerm direction=vertical size=40<cr>", desc = "垂直终端" },
|
||||
{ "<leader>tt", "<cmd>ToggleTerm<cr>", desc = "切换终端" },
|
||||
{ "<C-\\>", "<cmd>ToggleTerm<cr>", desc = "切换终端" },
|
||||
},
|
||||
opts = {
|
||||
size = function(term)
|
||||
if term.direction == "horizontal" then
|
||||
return 15
|
||||
elseif term.direction == "vertical" then
|
||||
return vim.o.columns * 0.4
|
||||
if term.direction == "horizontal" then return 15
|
||||
elseif term.direction == "vertical" then return vim.o.columns * 0.4
|
||||
end
|
||||
end,
|
||||
open_mapping = [[<c-\>]],
|
||||
hide_numbers = true,
|
||||
shade_filetypes = {},
|
||||
autochdir = true,
|
||||
shade_terminals = true,
|
||||
shading_factor = 2,
|
||||
start_in_insert = true,
|
||||
insert_mappings = true,
|
||||
terminal_mappings = true,
|
||||
persist_size = true,
|
||||
persist_mode = true,
|
||||
direction = "float",
|
||||
float_opts = { border = "curved", winblend = 3 },
|
||||
autochdir = true,
|
||||
start_in_insert = true,
|
||||
close_on_exit = true,
|
||||
shell = vim.o.shell,
|
||||
float_opts = {
|
||||
border = "curved",
|
||||
winblend = 3,
|
||||
highlights = {
|
||||
border = "Normal",
|
||||
background = "Normal",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 代码片段
|
||||
|
||||
-- 会话管理
|
||||
{
|
||||
"L3MON4D3/LuaSnip",
|
||||
dependencies = {
|
||||
"rafamadriz/friendly-snippets",
|
||||
config = function()
|
||||
require("luasnip.loaders.from_vscode").lazy_load()
|
||||
end,
|
||||
},
|
||||
"folke/persistence.nvim",
|
||||
event = "BufReadPre",
|
||||
opts = {
|
||||
history = true,
|
||||
delete_check_events = "TextChanged",
|
||||
dir = vim.fn.expand(vim.fn.stdpath("state") .. "/sessions/"),
|
||||
options = { "buffers", "curdir", "tabpages", "winsize" },
|
||||
},
|
||||
keys = {
|
||||
{
|
||||
"<tab>",
|
||||
function()
|
||||
return require("luasnip").jumpable(1) and "<Plug>luasnip-jump-next" or "<tab>"
|
||||
end,
|
||||
expr = true, silent = true, mode = "i",
|
||||
},
|
||||
{ "<tab>", function() require("luasnip").jump(1) end, mode = "s" },
|
||||
{ "<s-tab>", function() require("luasnip").jump(-1) end, mode = { "i", "s" } },
|
||||
{ "<leader>qs", function() require("persistence").load() end, desc = "恢复上次会话" },
|
||||
{ "<leader>ql", function() require("persistence").load({ last = true }) end, desc = "恢复最后会话" },
|
||||
{ "<leader>qd", function() require("persistence").stop() end, desc = "不保存会话" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 自动括号配对
|
||||
{
|
||||
"windwp/nvim-autopairs",
|
||||
event = "InsertEnter",
|
||||
opts = {
|
||||
check_ts = true, -- 检查 treesitter
|
||||
ts_config = {
|
||||
lua = { "string", "source" },
|
||||
javascript = { "string", "template_string" },
|
||||
java = false,
|
||||
},
|
||||
fast_wrap = {
|
||||
map = "<M-e>",
|
||||
chars = { "{", "[", "(", '"', "'" },
|
||||
pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], "%s+", ""),
|
||||
offset = 0,
|
||||
end_key = "$",
|
||||
keys = "qwertyuiopzxcvbnmasdfghjkl",
|
||||
check_comma = true,
|
||||
highlight = "PmenuSel",
|
||||
highlight_grey = "LineNr",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- Git 集成
|
||||
{
|
||||
"lewis6991/gitsigns.nvim",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
opts = {
|
||||
signs = {
|
||||
add = { text = "▎" },
|
||||
change = { text = "▎" },
|
||||
delete = { text = "▁" },
|
||||
topdelete = { text = "▔" },
|
||||
changedelete = { text = "▎" },
|
||||
untracked = { text = "▎" },
|
||||
},
|
||||
on_attach = function(buffer)
|
||||
local gs = package.loaded.gitsigns
|
||||
|
||||
local function map(mode, l, r, desc)
|
||||
vim.keymap.set(mode, l, r, { buffer = buffer, desc = desc })
|
||||
end
|
||||
|
||||
-- 导航
|
||||
map("n", "]h", gs.next_hunk, "下一个变更")
|
||||
map("n", "[h", gs.prev_hunk, "上一个变更")
|
||||
|
||||
-- 操作
|
||||
map({ "n", "v" }, "<leader>gs", ":Gitsigns stage_hunk<CR>", "暂存变更")
|
||||
map({ "n", "v" }, "<leader>gr", ":Gitsigns reset_hunk<CR>", "重置变更")
|
||||
map("n", "<leader>gS", gs.stage_buffer, "暂存文件")
|
||||
map("n", "<leader>gu", gs.undo_stage_hunk, "取消暂存变更")
|
||||
map("n", "<leader>gR", gs.reset_buffer, "重置文件")
|
||||
map("n", "<leader>gp", gs.preview_hunk, "预览变更")
|
||||
map("n", "<leader>gb", function() gs.blame_line({ full = true }) end, "查看责任")
|
||||
map("n", "<leader>gB", gs.toggle_current_line_blame, "开关行责任")
|
||||
map("n", "<leader>gd", gs.diffthis, "文件差异")
|
||||
map("n", "<leader>gD", function() gs.diffthis("~") end, "与HEAD差异")
|
||||
map("n", "<leader>gt", gs.toggle_deleted, "开关显示删除")
|
||||
|
||||
-- 文本对象
|
||||
map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "选择变更")
|
||||
end,
|
||||
},
|
||||
},
|
||||
|
||||
-- 多光标编辑
|
||||
|
||||
-- 多光标(<C-n> 选择当前词,<C-Down/Up> 添加光标)
|
||||
{
|
||||
"mg979/vim-visual-multi",
|
||||
event = "BufReadPost",
|
||||
init = function()
|
||||
vim.g.VM_leader = ";"
|
||||
-- 使用默认 <C-n> 而非覆盖 <C-d>(<C-d> 已用于滚动)
|
||||
vim.g.VM_maps = {
|
||||
["Find Under"] = "<C-d>",
|
||||
["Find Subword Under"] = "<C-d>",
|
||||
["Find Under"] = "<C-n>",
|
||||
["Find Subword Under"] = "<C-n>",
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
-- 高亮相同单词
|
||||
|
||||
-- TypeScript/JSX 注释增强
|
||||
{
|
||||
"RRethy/vim-illuminate",
|
||||
"JoosepAlviste/nvim-ts-context-commentstring",
|
||||
lazy = true,
|
||||
opts = { enable_autocmd = false },
|
||||
},
|
||||
|
||||
-- 注释插件(支持 context commentstring)
|
||||
{
|
||||
"numToStr/Comment.nvim",
|
||||
event = "BufReadPost",
|
||||
opts = {
|
||||
delay = 200,
|
||||
large_file_cutoff = 2000,
|
||||
large_file_overrides = {
|
||||
providers = { "lsp" },
|
||||
padding = true,
|
||||
sticky = true,
|
||||
toggler = { line = "gcc", block = "gbc" },
|
||||
opleader = { line = "gc", block = "gb" },
|
||||
extra = { above = "gcO", below = "gco", eol = "gcA" },
|
||||
pre_hook = function()
|
||||
return require("ts_context_commentstring.integrations.comment_nvim").create_pre_hook()()
|
||||
end,
|
||||
},
|
||||
},
|
||||
|
||||
-- 增强文本对象(mini.ai)
|
||||
-- af/if=函数, ac/ic=类, aa/ia=参数, ab/ib=块, aq/iq=引号, at/it=标签
|
||||
{
|
||||
"echasnovski/mini.ai",
|
||||
event = "VeryLazy",
|
||||
opts = {
|
||||
n_lines = 500,
|
||||
custom_textobjects = {
|
||||
-- 整个文件
|
||||
e = function()
|
||||
local from = { line = 1, col = 1 }
|
||||
local to = { line = vim.fn.line("$"), col = math.max(vim.fn.getline("$"):len(), 1) }
|
||||
return { from = from, to = to }
|
||||
end,
|
||||
},
|
||||
},
|
||||
config = function(_, opts)
|
||||
require("illuminate").configure(opts)
|
||||
|
||||
local function map(key, dir, buffer)
|
||||
vim.keymap.set("n", key, function()
|
||||
require("illuminate")["goto_" .. dir .. "_reference"](false)
|
||||
end, { desc = dir:sub(1, 1):upper() .. dir:sub(2) .. " 引用", buffer = buffer })
|
||||
end
|
||||
|
||||
-- 下一个/上一个引用导航
|
||||
map("]]", "next")
|
||||
map("[[", "prev")
|
||||
|
||||
-- 同时也是 LSP 附加时设置键绑定
|
||||
vim.api.nvim_create_autocmd("LspAttach", {
|
||||
callback = function(args)
|
||||
local buffer = args.buf
|
||||
map("]]", "next", buffer)
|
||||
map("[[", "prev", buffer)
|
||||
},
|
||||
|
||||
-- 括号/引号包围操作(mini.surround)
|
||||
-- saiw" = 用 " 包围单词, sd" = 删除 ", sr"' = 替换 " 为 '
|
||||
{
|
||||
"echasnovski/mini.surround",
|
||||
event = "VeryLazy",
|
||||
opts = {
|
||||
mappings = {
|
||||
add = "gsa", -- 添加包围
|
||||
delete = "gsd", -- 删除包围
|
||||
find = "gsf", -- 向前查找包围
|
||||
find_left = "gsF", -- 向后查找包围
|
||||
highlight = "gsh", -- 高亮包围
|
||||
replace = "gsr", -- 替换包围
|
||||
update_n_lines = "gsn", -- 更新搜索范围
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
-- 项目范围搜索替换(grug-far)
|
||||
{
|
||||
"MagicDuck/grug-far.nvim",
|
||||
cmd = "GrugFar",
|
||||
keys = {
|
||||
{
|
||||
"<leader>sr",
|
||||
function()
|
||||
local ext = vim.bo.filetype ~= "" and ("." .. vim.bo.filetype) or ""
|
||||
require("grug-far").open({ prefills = { filesFilter = "*" .. ext } })
|
||||
end,
|
||||
})
|
||||
end,
|
||||
keys = {
|
||||
{ "]]", desc = "下一个引用" },
|
||||
{ "[[", desc = "上一个引用" },
|
||||
mode = { "n", "v" },
|
||||
desc = "搜索替换(项目范围)",
|
||||
},
|
||||
},
|
||||
opts = { headerMaxWidth = 80 },
|
||||
},
|
||||
|
||||
-- 缓冲区删除
|
||||
{
|
||||
"echasnovski/mini.bufremove",
|
||||
keys = {
|
||||
{ "<leader>bd", function() require("mini.bufremove").delete(0, false) end, desc = "删除缓冲区" },
|
||||
{ "<leader>bD", function() require("mini.bufremove").delete(0, true) end, desc = "强制删除缓冲区" },
|
||||
},
|
||||
},
|
||||
|
||||
-- 括号高亮配对
|
||||
{
|
||||
"HiPhish/rainbow-delimiters.nvim",
|
||||
event = "BufReadPost",
|
||||
config = function()
|
||||
local rainbow_delimiters = require("rainbow-delimiters")
|
||||
|
||||
vim.g.rainbow_delimiters = {
|
||||
strategy = {
|
||||
[""] = rainbow_delimiters.strategy["global"],
|
||||
vim = rainbow_delimiters.strategy["local"],
|
||||
},
|
||||
query = {
|
||||
[""] = "rainbow-delimiters",
|
||||
lua = "rainbow-blocks",
|
||||
},
|
||||
highlight = {
|
||||
"RainbowDelimiterRed",
|
||||
"RainbowDelimiterYellow",
|
||||
"RainbowDelimiterBlue",
|
||||
"RainbowDelimiterOrange",
|
||||
"RainbowDelimiterGreen",
|
||||
"RainbowDelimiterViolet",
|
||||
"RainbowDelimiterCyan",
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user