移除 vim-fugitive 和 mini.diff,引入三层 Git 工具栈(对齐 nvchad 分支): - gitsigns.nvim:buffer 级 inline gutter + hunk 操作(BufReadPost 懒加载) - neogit:仓库级 status 客户端(<leader>gg,依赖 plenary) - codediff.nvim:文件级 side-by-side diff(<leader>gd/gD) 键位变更: - ghs/ghr/ghp/ghb/ghB/ghd/ghD + ]h/[h 改由 gitsigns 提供 - <leader>gg → Neogit、<leader>gd/gD → CodeDiff - 移除 <leader>gl(GcLog,由 neogit 内部 log 视图取代) 三个独立插件统一采用 load_X() → packadd → require().setup() 加载风格
99 lines
4.2 KiB
Lua
99 lines
4.2 KiB
Lua
-- =============================================================================
|
||
-- 用户自定义命令 (lua/usercmds.lua)
|
||
-- =============================================================================
|
||
-- 定义 Neovim 命令行可用的自定义命令,封装 vim.pack API 的日常操作。
|
||
--
|
||
-- Neovim 0.12+ 内置 vim.pack 插件管理,提供:
|
||
-- vim.pack.add(urls, opts) - 添加/安装插件
|
||
-- vim.pack.del(names) - 删除插件
|
||
-- vim.pack.update(names?) - 更新插件
|
||
--
|
||
-- 以下命令是对这些 API 的友好封装,支持命令行参数解析。
|
||
-- =============================================================================
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- :PackAdd — 添加插件
|
||
-- ---------------------------------------------------------------------------
|
||
-- 用法::PackAdd user/repo1 user/repo2 ...
|
||
-- 示例::PackAdd stevearc/conform.nvim lewis6991/gitsigns.nvim
|
||
--
|
||
-- 原理:
|
||
-- 将命令行参数(opts.fargs,已按空格分割的字符串数组)
|
||
-- 直接传递给 vim.pack.add()。
|
||
-- vim.pack 会从 GitHub 下载插件到 stdpath("data")/site/pack/core/opt/。
|
||
--
|
||
-- nargs = "+" 表示至少需要 1 个参数。
|
||
vim.api.nvim_create_user_command("PackAdd", function(opts)
|
||
vim.pack.add(opts.fargs)
|
||
end, { nargs = "+", desc = "添加插件 (:PackAdd user/repo1 user/repo2)" })
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- :PackDel — 删除插件
|
||
-- ---------------------------------------------------------------------------
|
||
-- 用法::PackDel plugin1 plugin2 ...
|
||
-- 示例::PackDel conform.nvim gitsigns.nvim
|
||
--
|
||
-- 注意:
|
||
-- 参数是插件目录名(即 repo 名),不是完整 URL。
|
||
-- Neovim 0.13 Nightly 已内置此命令,这里为 0.12 提供兼容。
|
||
--
|
||
-- nargs = "+" 表示至少需要 1 个参数。
|
||
vim.api.nvim_create_user_command("PackDel", function(opts)
|
||
vim.pack.del(opts.fargs)
|
||
end, { nargs = "+", desc = "删除插件 (:PackDel plugin1 plugin2)" })
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- :PackUpdate — 更新插件
|
||
-- ---------------------------------------------------------------------------
|
||
-- 用法:
|
||
-- :PackUpdate → 更新所有插件
|
||
-- :PackUpdate name1 name2 ... → 更新指定插件
|
||
--
|
||
-- 原理:
|
||
-- 检查 opts.args 是否包含非空白字符(%S 匹配任意非空白)。
|
||
-- 如果有参数,按空白分割为数组后逐个更新;
|
||
-- 如果无参数,调用无参版本更新所有插件。
|
||
--
|
||
-- nargs = "*" 表示接受 0 个或多个参数。
|
||
vim.api.nvim_create_user_command("PackUpdate", function(opts)
|
||
-- 检查是否有传入任何参数(包含非空白字符)
|
||
if opts.args:match("%S") then
|
||
-- 按空白字符分割参数,trimempty 去除空字符串
|
||
local plugins = vim.split(opts.args, "%s+", { trimempty = true })
|
||
-- 仅更新指定的插件
|
||
vim.pack.update(plugins)
|
||
else
|
||
-- 无参数,更新所有插件
|
||
vim.pack.update()
|
||
end
|
||
end, { nargs = "*", desc = "更新所有插件或指定插件" })
|
||
|
||
-- ---------------------------------------------------------------------------
|
||
-- :PackClean — 清理已从配置移除的插件
|
||
-- ---------------------------------------------------------------------------
|
||
-- 用法::PackClean
|
||
--
|
||
-- 原理:
|
||
-- 从 vim.pack.get() 获取所有 vim.pack 管理的插件,
|
||
-- 过滤出 active = false 的插件(即从 pack.lua 移除后未加载的),
|
||
-- 批量调用 vim.pack.del() 删除本地文件。
|
||
-- 如果没有需要清理的插件,会提示 "No unused plugins to clean"。
|
||
--
|
||
-- 注意:
|
||
-- 必须先 :restart Neovim,让 vim.pack 识别到插件已不在当前配置中,
|
||
-- 否则 active 仍为 true,不会被清理。
|
||
vim.api.nvim_create_user_command("PackClean", function()
|
||
local to_clean = vim.iter(vim.pack.get())
|
||
:filter(function(x) return not x.active end)
|
||
:map(function(x) return x.spec.name end)
|
||
:totable()
|
||
|
||
if #to_clean == 0 then
|
||
vim.notify("No unused plugins to clean", vim.log.levels.INFO)
|
||
return
|
||
end
|
||
|
||
vim.pack.del(to_clean)
|
||
vim.notify("Cleaned " .. #to_clean .. " plugin(s): " .. table.concat(to_clean, ", "), vim.log.levels.INFO)
|
||
end, { desc = "删除已从配置移除的本地插件" })
|