Vim 和 Neovim 到底有什么区别?现在该选哪个?
从一次被拒绝的补丁说起
2014 年,巴西开发者 Thiago de Arruda 向 Vim 项目提交了一组补丁,核心诉求是给 Vim 加上异步执行能力。Vim 的作者 Bram Moolenaar 拒绝了这组补丁——理由是对一个有二十多年历史的代码库做这么大的架构改动,风险太高。Thiago 随后 fork 了 Vim,通过众筹筹到一万美元,Neovim 项目就此诞生。这不是一次意气用事的分叉,而是一场关于"编辑器该往哪走"的根本分歧。
历史分叉:2014 年发生了什么
Vim 的代码库从 1991 年开始积累,到 2014 年已经超过 30 万行 C 代码,包含大量对 Amiga、OS/2 等早已无人使用的平台的支持。Bram 坚持通过邮件列表接收 patch 的开发流程,合并代码的节奏非常保守。Thiago 认为这种模式已经严重阻碍了 Vim 的进化,他的目标很明确:砍掉过时代码、引入现代架构、建立更开放的社区治理。
2015 年 12 月,Neovim 第一个公开版本 0.1 发布。有意思的是,Neovim 的出现反而刺激了 Vim 自身的开发——2016 年 Vim 8.0 发布,加入了异步 job 和 timer 功能,这在一定程度上是对 Neovim 竞争的回应。2023 年 Bram Moolenaar 去世后,Vim 社区的开发节奏明显放缓,而 Neovim 仍在高速迭代。
配置语言:Lua 对阵 VimScript
这是用户感受最直接的区别。Vim 的配置语言是 VimScript,一门诞生于编辑器内部的脚本语言,语法松散、执行效率低、调试困难。Vim9 script 试图改善性能,但生态基本没有跟上。
Neovim 选择 Lua 作为一等配置语言。Lua 本身就是一门成熟的嵌入式脚本语言,执行速度远超 VimScript,JIT 编译后差距更大。实际写起来:
- VimScript 配置:
let g:mapleader = ',' - Lua 配置:
vim.g.mapleader = ','
语法差异不大,但 Lua 的优势在于模块化。你可以把配置拆成多个 .lua 文件,用 require 加载,而不是在一个巨大的 init.vim 里用 source 拼接。Neovim 仍然兼容 VimScript,所以迁移不是一步到位的,可以在 init.lua 里混用 vim.cmd 调用 VimScript 命令。
内置 LSP:IDE 级别的语言支持
Neovim 0.5(2021 年 7 月发布)引入了原生 LSP 客户端 vim.lsp。这意味着你不需要安装 coc.nvim 或 ALE 这样的第三方插件,Neovim 开箱就能连接语言服务器,获得代码补全、跳转定义、悬浮文档、重命名、诊断等能力。
Vim 至今没有内置 LSP 客户端。如果你想在 Vim 里获得类似体验,只能依赖 coc.nvim(基于 Node.js)或 vim-lsp,配置复杂度和资源占用都更高。
配合 mason.nvim 插件,Neovim 可以一键安装和管理语言服务器,整个 LSP 工作流已经和 VS Code 一样顺畅。
Tree-sitter:语法高亮的范式转变
Vim 的语法高亮基于正则表达式,这是 90 年代的设计。正则匹配无法理解代码结构,所以高亮经常出错,尤其是嵌套模板、JSX、混合语言文件这类场景。
Neovim 集成了 Tree-sitter,一个基于抽象语法树(AST)的增量解析器。它不是在文本上跑正则,而是真正解析代码结构,然后根据语法节点类型做高亮。结果是:
- 高亮更准确,不会把字符串里的关键字标红
- 支持语义级高亮(区分函数调用、变量定义、类型注解等)
- 增量解析速度极快,编辑时几乎无延迟
- 内置 50 多种语言的 parser
Vim 社区也有 tree-sitter 的移植项目,但远不如 Neovim 的深度集成。
异步架构:libuv 带来的质变
Neovim 的底层用 libuv 重写了事件循环,所有 I/O 操作——文件读写、语言服务器通信、插件加载、shell 命令执行——都是异步的。这意味着你在跑测试、格式化代码、等待 LSP 响应的时候,编辑器界面不会卡顿。
Vim 8.0 也加入了 job_start 和 timer_start,提供了基本的异步能力,但深度不够。很多 Vim 插件仍然在主线程上做同步操作,因为 Vim 的 API 设计没有强制插件作者考虑异步。
实测数据:空配置启动,Neovim 约 12ms,Vim 约 28ms。配置了完整 LSP + 补全 + 文件搜索的开发环境后,Neovim 的响应优势更明显。
浮动窗口与弹窗
Neovim 原生支持浮动窗口(floating window),可以在编辑区上方弹出半透明的面板,用于显示补全菜单、文档预览、诊断信息等。这是现代编辑器体验的关键组件。
Vim 8.2 加入了 popup window,功能类似但 API 灵活度不如 Neovim 的实现。Neovim 的浮动窗口可以叠加、设置透明度、精确控制位置和大小,插件生态围绕这个能力构建了 telescope 的预览窗口、nvim-cmp 的文档浮窗、lspsaga 的代码操作面板等体验。
内置终端
Neovim 内置了终端模拟器,通过 :terminal 命令可以直接在编辑器里打开一个 shell。配合浮动窗口插件(如 toggleterm.nvim、FTerm.nvim),可以一键弹出/隐藏终端,不需要离开编辑器切换到外部终端。
Vim 也有 :terminal,但 Neovim 的终端实现和窗口系统的集成更紧密,配合浮动窗口和终端模式的键位映射,使用体验更接近 VS Code 的集成终端。
插件生态:两条不同的路
Neovim 的插件生态已经完全 Lua 化,形成了现代化工具链:
| 功能 | Neovim 插件 | Vim 插件 |
|---|---|---|
| 插件管理 | lazy.nvim | vim-plug |
| 模糊搜索 | telescope.nvim | fzf.vim |
| 自动补全 | nvim-cmp | coc.nvim |
| LSP 配置 | nvim-lspconfig | coc.nvim |
| LSP 安装 | mason.nvim | 手动安装 |
| 语法高亮 | nvim-treesitter | 正则语法文件 |
| Git 集成 | gitsigns.nvim | vim-fugitive |
关键差异不在单个插件,而在整体协同。Neovim 的 Lua 插件之间可以无缝通信——telescope 的搜索结果可以直接预览文件,nvim-cmp 的补全源可以来自 LSP、Tree-sitter 和 snippet,lazy.nvim 可以延迟加载插件到毫秒级。Vim 的插件生态更成熟但更碎片化,很多流行插件最后更新时间在 2023 年之前。
迁移成本:从 Vim 到 Neovim 有多难
答案是:很低。Neovim 兼容绝大部分 VimScript 配置,你可以直接把 .vimrc 软链到 Neovim 的配置路径,几乎不用改任何东西就能跑起来。然后按自己的节奏逐步把 VimScript 配置迁移到 Lua。
迁移路径通常是:
- 把
init.vim改名为init.lua,内容不变 - 逐个模块用 Lua 重写,通过
require引入 - 把 vim-plug 换成 lazy.nvim
- 加入 LSP 和 Tree-sitter 配置
- 替换旧插件为 Lua 原生替代品
整个过程可以持续几周甚至几个月,不需要一次性全换。
性能对比
空配置下 Neovim 启动更快(12ms vs 28ms),但空闲内存占用 Vim 略低(12MB vs 18MB)。加载完整开发配置后,Neovim 的异步优势开始显现:大文件编辑、LSP 诊断、插件操作都不会阻塞 UI。在几千行代码的文件里,Tree-sitter 的高亮刷新是增量的,而 Vim 的正则高亮需要重新扫描整个文件。
GitHub 数据也能说明趋势:Neovim 88k+ stars,Vim 35k+ stars。2024-2025 年,Neovim 的提交量是 Vim 的 4-5 倍。这不是说 Vim 不好——它仍然是最稳定的编辑器之一,但社区活力确实在向 Neovim 倾斜。
选型建议
选 Vim 的情况:
- 你是资深 Vim 用户,现有配置已经很稳定,没有改造的动力
- 你经常在远程服务器上编辑文件,Vim 几乎到处都有预装
- 你的机器资源非常有限,每兆内存都要精打细算
- 你只需要一个可靠的文本编辑器,不需要 IDE 功能
选 Neovim 的情况:
- 你是新用户,从零开始学,没有历史包袱
- 你想要 LSP、智能补全、代码导航等现代 IDE 功能
- 你对 Lua 配置感兴趣,或者想用 Neovim 搭建个人开发环境
- 你喜欢折腾编辑器,享受配置和优化的过程
一个务实的策略: 在服务器上继续用 Vim,在本地开发机上用 Neovim。两者键位操作完全一致,切换没有任何学习成本。Neovim 的配置也可以通过版本管理在多台机器间同步。
写在最后
Vim 和 Neovim 的区别,本质上是两种开发哲学的区别。Vim 追求稳定和向后兼容,三十年来始终如一;Neovim 追求进化和现代化,愿意为了更好的架构砍掉历史包袱。两者不是替代关系——Vim 是 Neovim 的根,Neovim 是 Vim 的一种可能未来。 Bram Moolenaar 拒绝了那组补丁,但那个决定催生了编辑器领域最有活力的开源项目之一,这大概是 2014 年没有人预料到的。