当你的 lua/plugins/ 目录比项目代码还长,也许是时候重新思考了
从 493 行到 55 行:一个真实案例
最近在 Fosstodon 上看到一位开发者分享他的 Neovim 配置重构经历:配置文件从 493 行骤降到 55 行,减少了近 90% 的代码量。
他不是在删功能,而是在做一件事:用 Neovim 原生能力和轻量替代品,替换掉堆砌的插件。
如果你也有这样的感受:
• 启动 Neovim 要等好几秒
• lua/plugins/ 目录下躺着几十个配置文件
• 很多插件的功能你只用到了 10%
• 每次更新插件都提心吊胆怕崩
那这篇文章就是为你写的。
第一步:重新审视"必需品"
在动手之前,先问自己一个问题:我真的需要这个插件吗?
Neovim 在 0.11 和 0.12 版本中引入了大量内置功能。很多以前必须靠插件实现的需求,现在原生就能搞定。
一个深度优先的配置哲学值得借鉴:从完全未修改的 Neovim 开始,慢慢添加功能——但只在完全理解已有功能之后。毕竟,80% 的工作流只包含少数几个操作,让这些操作变快,远比堆砌一堆不常用的功能重要。
第二步:原生插件管理器 vim.pack
Neovim 0.12 引入的 vim.pack API 让你彻底告别第三方插件管理器。
以前用 lazy.nvim 或 packer.nvim 需要写一堆启动配置,现在只需要:
lua
vim.pack.add({
{ src = "neovim/nvim-lspconfig" },
{ src = "nvim-treesitter/nvim-treesitter" }
})
优势:无需启动开销,没有锁文件困扰,插件加载逻辑完全透明。
不过要注意,vim.pack 的设计哲学是"做最少的事",不提供版本锁定、自动更新等高级功能。如果你需要这些,可以权衡利弊。
第三步:用 Mini.nvim 替代"全家桶"
Mini.nvim 是目前配置瘦身运动中最受关注的工具集。它提供了一套模块化的轻量替代品,每个模块独立可用。
一位在 400 万行代码、4 万文件的 monorepo 中工作的系统程序员分享了他的替换经验:
已经换掉的(5个)
vim-startify → Mini.starter
启动页换了之后轻快不少,Lua 写配置比原来那套 Vimscript 清爽多了。
illuminate.nvim → Mini.cursorword
光标下的词高亮,功能一模一样,没感觉出差别,算是无缝替换。
which-key.nvim → Mini.clue
键位提示用浮动窗口展示,比 which-key 的布局更紧凑,用着挺顺手。
自定义会话管理 → Mini.session
以前自己折腾了五十多行 Vimscript 管会话,现在几行 Lua 搞定,省心。
gitsigns.nvim → Mini.diff
Git 行号标记能用了,不过不像 gitsigns 那样开箱即用,得自己额外配一点东西。
暂时没换的(4个)
Oil.nvim 继续用,没换 Mini.files
Oil 是直接在缓冲区里操作文件,跟平常编辑文本一样顺手。Mini.files 做成浮动窗口的形式,用起来总觉得隔了一层,不太习惯。
fzf-lua 继续用,没换 Mini.pick
在大型项目里 Fuzzy 查找,Mini.pick 的速度明显跟不上,而且缺少侧边预览窗口,看结果不方便。
fugitive.vim 继续用,没换 Mini.git
fugitive 最核心的 :Git status 看暂存区状态,Mini.git 目前还做不到,光看 diff 和 log 不够用。
fidget.nvim 继续用,没换 Mini.notify
Mini.notify 弹出来的通知,长文本对齐有问题,看着乱糟糟的。而且 LSP 的进度条展示也不如 fidget 清楚。
核心结论是:Mini 系列在小功能上表现优异,但核心复杂功能暂时还无法完全替代成熟的主流插件。
第四步:精简 LSP 和补全配置
在 LSP 方面,Neovim 内置的 LSP 支持已经相当完善。
对比两种路线:
路线一:使用 Mason + lspconfig(常规做法)
• 优点:安装方便,一键安装语言服务器
• 缺点:多了一层依赖,跨机器同步配置可能出问题
路线二:手动安装 LSP,直接用内置 LSP
• 优点:减少插件依赖,配置更可控
• 缺点:需要手动管理语言服务器版本
补全方面,blink.cmp 正在成为新宠。它比 nvim-cmp 更轻量,配置更简洁,目前已成为许多精简配置的首选。
第五步:目录结构瘦身
一个典型的精简配置目录结构应该是这样的:
text
~/.config/nvim/
└── init.lua # 单文件搞定一切
或者适度拆分:
text
~/.config/nvim/
├── init.lua
└── lua/
├── options.lua # 基础选项
├── keymaps.lua # 快捷键
└── plugins.lua # 插件列表原则是"够用就好" ,不要为了所谓的"工程化"而创建十几个配置目录。
实战对照清单
插件管理
堆砌方案 ❌ lazy.nvim —— 数百行配置,依赖懒加载玩出花
瘦身方案 ✅ vim.pack —— 几行代码,原生管理器足够用
补全
堆砌方案 ❌ nvim-cmp + source 全家桶 —— 每种补全单独配
瘦身方案 ✅ blink.cmp —— 单文件完成所有配置
文件查找
堆砌方案 ❌ telescope.nvim —— 功能齐全但配置复杂
瘦身方案 ✅ mini.pick 或精简 fzf-lua —— 保留核心查找能力
Git 标记
堆砌方案 ❌ gitsigns.nvim —— 高亮虚拟文本预览全都要调
瘦身方案 ✅ mini.diff —— 行号标记开箱即用
键位提示
堆砌方案 ❌ which-key.nvim —— 样式分组布局自定义项太多
瘦身方案 ✅ mini.clue —— 极简浮动窗口默认好看
启动页
堆砌方案 ❌ alpha.nvim / startify —— Lua 或 Vimscript 布局写到烦
瘦身方案 ✅ mini.starter —— 清爽简洁配置量极少
最后:何时保留插件
配置瘦身不是"为删而删"。以下情况建议保留原插件:
- 工作流依赖:如果某个插件已经成为你日常开发的核心环节,不要轻易替换
- 性能无明显优势:mini 替代品有时在大型项目上性能略逊
- 功能差异明显:如 fugitive.vim 的完整 Git 工作流,mini.git 暂无法替代
写在最后
配置瘦身的本质不是追求"代码最少",而是让每一行配置都服务于你的实际需求。
从 493 行到 55 行,减掉的不是功能,而是冗余。留下的每一行配置,都是你真正理解和需要的东西。
这或许才是 Neovim 配置的"终极形态":简洁、可控、够用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。