问题

你对 NeoVim 怎么看?

回答
NeoVim 是一个相对年轻但发展迅猛的文本编辑器项目,它源自 Vim。要详细地评价 NeoVim,我们需要从它的起源、核心理念、关键特性、生态系统、以及它与其他编辑器的比较等多个方面来深入探讨。

NeoVim 的起源与核心理念

NeoVim 的诞生是为了解决 Vim 本身在现代软件开发环境下的一些局限性,并拥抱更现代化的开发模式。它的核心理念可以概括为:

1. 现代化和可维护性 (Modernization & Maintainability): NeoVim 的一个主要目标是用更现代的语言(主要是 C,但引入了 Lua 作为核心配置语言)重写 Vim 的 codebase。这意味着更清晰的代码结构、更好的模块化、更方便的调试和贡献,从而提升了项目的可维护性和长期发展潜力。
2. 异步和并行处理 (Asynchronous & Parallel Processing): 这是 NeoVim 最具革命性的特性之一。传统的 Vim 在执行耗时操作(如文件搜索、插件执行)时会阻塞 UI,导致编辑器卡顿。NeoVim 通过引入异步 API,允许这些操作在后台进行,而不会阻塞主线程,从而提供了更流畅的用户体验。
3. 插件生态系统的改进 (Improved Plugin Ecosystem): NeoVim 致力于改进插件的加载和管理方式,使其更加高效和灵活。例如,它原生支持异步插件和外部进程,为插件开发者提供了更强大的能力,也为用户带来了更好的插件体验。
4. 易于嵌入和扩展 (Embeddability & Extensibility): NeoVim 的设计使其更容易被嵌入到其他应用程序中,或者作为一种可编程的文本编辑引擎。这为更复杂的工具集成和自定义开发打开了新的可能性。
5. 提升用户体验 (Enhanced User Experience): NeoVim 不仅仅是代码重写,它还引入了许多提升用户体验的特性,例如更好的终端集成、更好的 UI 元素支持等。

NeoVim 的关键特性

基于以上理念,NeoVim 带来了一系列令人兴奋的特性:

内置终端 (Builtin Terminal): NeoVim 允许你在编辑器内部打开一个真实的终端模拟器。这意味着你可以在不离开 NeoVim 的情况下,编译代码、运行脚本、使用 Git、甚至 SSH 到远程服务器。这极大地提高了工作效率,尤其是在需要频繁切换终端和编辑器的情况下。你可以将终端放置在任何你想要的位置(如底部、侧边),并像编辑普通缓冲区一样操作它。
异步 API (Asynchronous API): 这是 NeoVim 的“杀手级”特性。它允许插件和命令在后台执行,而不会冻结 UI。这意味着你可以进行文件搜索、代码补全、 Linting 等操作,同时依然可以流畅地输入和导航。对于大型项目或复杂的插件,这种流畅性是不可或缺的。开发者可以通过 `nvim_exec_async` 等函数来利用这一能力。
远程插件 (Remote Plugins) 和 Jobs: NeoVim 的插件系统更加强大和灵活。你可以使用任何支持 IPC (InterProcess Communication) 的语言来编写插件,例如 Python, Ruby, Node.js, Go 等,而不仅仅局限于 Vimscript。这些插件可以在独立的进程中运行,不会影响 NeoVim 的主进程稳定性。同时,Jobs API 提供了一种更底层的机制来启动和管理外部进程,为异步操作提供了更多可能性。
Lua 作为主要配置语言 (Lua as Primary Configuration Language): 虽然 Vimscript 仍然受支持,但 NeoVim 将 Lua 定位为其首选的配置和插件开发语言。Lua 是一种轻量级、高性能的脚本语言,非常适合嵌入式场景。使用 Lua 配置 NeoVim 带来了以下优势:
更强的表达能力和灵活性: Lua 提供了更现代的编程特性,如模块系统、闭包等,使得配置更加模块化、可读性和可维护。
更好的性能: Lua 通常比 Vimscript 运行得更快。
更易于集成: 许多现代插件和工具都倾向于使用 Lua。
类型安全(通过插件): 可以借助一些工具(如 `nvimlspconfig` 的 Lua 代码)实现更安全、更易于调试的配置。
新式 UI 元素和扩展性 (Newer UI Elements & Extensibility): NeoVim 在 UI 方面也做了不少改进,例如对浮动窗口 (Floating Windows) 的原生支持,这使得弹窗、提示信息、LSP 诊断等 UI 元素的展示更加灵活和美观。此外,它还为插件提供了更强大的能力来绘制自定义 UI 组件。
更好的 LSP 支持 (Better LSP Support): Language Server Protocol (LSP) 是现代 IDE 的核心功能,提供了代码补全、定义跳转、查找引用、重构等智能代码辅助。NeoVim 对 LSP 的支持非常出色,通过 `nvimlspconfig` 等插件,可以轻松配置各种语言的 LSP 服务器,获得媲美甚至超越传统 IDE 的开发体验。
Treesitter 集成 (Treesitter Integration): Treesitter 是一个高效的语法解析器生成工具,它可以提供更精确的语法树,从而实现更高级的文本操作和高亮显示。NeoVim 原生集成了 Treesitter,这使得它在代码高亮、代码导航、代码折叠等方面表现得更加智能和强大。
RPC API 和远程控制 (RPC API & Remote Control): NeoVim 暴露了一个 RPC (Remote Procedure Call) 接口,允许外部程序与之通信。这意味着你可以通过编写脚本或程序来控制 NeoVim,例如打开文件、执行命令、获取文本等。这为构建更复杂的自动化流程或与其他工具集成提供了可能。
更简洁的默认配置 (Simpler Default Configuration): 相比于 Vim,NeoVim 的默认配置更加简洁,移除了许多已经被弃用的选项和一些过时的功能,这使得它更容易上手,也减少了不必要的复杂性。

NeoVim 的生态系统

NeoVim 的生态系统非常活跃且在快速发展中,主要体现在以下几个方面:

插件管理 (Plugin Management): 尽管 NeoVim 本身不直接提供插件管理器,但它与许多优秀的插件管理器完美兼容,如:
packer.nvim: 一个非常流行的 Lua 插件管理器,以其速度和灵活性著称。
lazy.nvim: 另一个快速、功能齐全的 Lua 插件管理器,拥有延迟加载等高级功能。
vimplug: 一个经典的 Vim 插件管理器,对 NeoVim 也同样适用。
dein.vim: 另一个高性能的插件管理器。
社区驱动的开发 (CommunityDriven Development): NeoVim 的开发很大程度上由社区驱动,许多贡献者来自 Vim 和其他开源社区。这种开放的开发模式使得 NeoVim 能够快速适应用户需求和技术趋势。
大量的第三方插件和配置 (Abundant ThirdParty Plugins & Configurations): 由于其强大的扩展性和 Lua 的易用性,涌现出了大量的第三方插件,涵盖了代码补全、 LSP、文件浏览器、 Git 集成、主题、代码片段等方方面面。同时,也有很多优秀的配置模板和社区配置分享,极大地降低了新用户的上手门槛。
NvimRPC 和 NvimRemote: 这两个项目提供了与 NeoVim 进行外部交互的能力,例如可以使用 Python、JavaScript 等语言编写控制脚本。
LSP 服务器和客户端 (LSP Servers & Clients): NeoVim 的 LSP 支持离不开各种语言的 LSP 服务器(如 `clangd` 用于 C++, `pyright` 用于 Python)和 NeoVim 上的 LSP 客户端插件(如 `nvimlspconfig`, `lsp.nvim`)。

NeoVim 与 Vim 的比较

理解 NeoVim,就不能不提它与 Vim 的关系。可以这样理解:NeoVim 是 Vim 的一个“分支”或“现代化重写”,它继承了 Vim 的核心理念和绝大部分操作方式,但在技术实现和一些关键功能上进行了重大革新。

| 特性 | Vim | NeoVim |
| : | : | : |
| 核心代码 | C | C (重写了许多部分),Lua 核心 API |
| 异步处理 | 有限,许多操作会阻塞 UI | 原生支持异步 API,UI 流畅 |
| 插件开发语言 | Vimscript,少数其他语言 | Lua (首选),其他语言通过远程插件 |
| 内置终端 | 无 (需要插件如 `vimslime`, `ConqueShell`) | 原生支持 |
| RPC API | 有限 | 原生支持,易于外部程序控制 |
| UI 扩展性 | 相对有限 | 更好的浮动窗口支持,更强的自定义 UI 能力 |
| LSP 支持 | 依赖插件,配置相对复杂 | 原生且强大的 LSP 支持,通过 `nvimlspconfig` 等易于配置 |
| Treesitter 集成 | 需要插件 | 原生集成,提供更精确的语法解析 |
| 可维护性 | 代码库庞大且部分老旧 | 代码结构更清晰,易于维护和贡献 |
| 学习曲线 | 相似,核心操作方式相同 | 核心操作方式相同,但配置和生态需要一定学习成本 |
| 插件加载速度 | 可能较慢,尤其是有大量插件时 | 通常更快,尤其借助 Lua 插件管理器和延迟加载 |
| 社区活跃度 | 非常活跃 | 极度活跃,增长迅速 |

NeoVim 的优点

极致的性能和流畅性: 异步处理和优化的 codebase 带来了无与伦比的流畅体验。
强大的扩展性和自定义能力: Lua 的引入,以及对远程插件和 Jobs 的支持,使得 NeoVim 的可定制性达到了新的高度。
现代化开发体验: 内置终端、出色的 LSP 支持、Treesitter 集成等特性,让 NeoVim 成为一个全能型的开发工具。
活跃的社区和生态系统: 大量的插件、主题和配置,以及热情的社区支持,使得解决问题和探索新功能变得容易。
简洁高效的 VIM 工作流: 在保留了 VIM 高效的编辑模式和快捷键的同时,加入了现代化的功能。

NeoVim 的缺点/挑战

学习曲线: 虽然核心编辑理念与 Vim 相同,但配置 NeoVim 和掌握其现代特性需要一定的时间和精力,尤其是对于完全没有使用过 Vim 的新手。
配置复杂度: 随着 Lua 配置的普及,虽然带来了强大的自定义能力,但初期配置也可能显得复杂,需要学习 Lua 语法和各种插件的配置方法。
插件兼容性: 虽然 NeoVim 在很大程度上兼容 Vim 的插件,但某些高度依赖 Vim 特定的内部机制的插件可能需要移植或更新。
部分旧插件的支持: 一些历史悠久的 Vim 插件可能还没有完全适配 NeoVim 的新特性或异步模型。

总结

NeoVim 是一个雄心勃勃且非常成功的项目,它成功地在保留 Vim 强大编辑能力的基础上,融入了现代软件开发的最新理念和技术。对于寻求极致性能、高度自定义、并且乐于投入时间学习和配置的用户来说,NeoVim 绝对是一个值得认真考虑的文本编辑器。它将 Vim 的哲学推向了一个新的高度,使其不仅仅是一个文本编辑器,更是一个高度集成的开发环境和强大的文本处理引擎。

如果你是 Vim 用户,迁移到 NeoVim 会相对平滑,并且会获得很多改进。如果你是其他编辑器的用户,并且对 Vim 的模式编辑和效率感兴趣,同时又希望拥有现代 IDE 的智能化功能,那么 NeoVim 提供了一个非常有吸引力的选择,虽然初期需要一些学习的投入,但长远来看,它带来的生产力提升是巨大的。

网友意见

user avatar

Bram 估计急了,最新的几个Vim版本中新功能十分给力,

目前(7.4.1689)已经包含几个 NeoVim 类似的特性:

1. timer:

以前没有timer,需要周期运行只有做 CursorHold/CursorHoldI/CursorMoved 几个事件的autocmd来模拟,十分山寨,默认timeout是4秒,最短的触发周期是4秒,修改短了又会影响其他插件,自从有了timer_start, timer_stop,这件时间容易很多了,比如:

       func! MyHandler(timer)     echo 'Handler called' endfunc let timer = timer_start(500, 'MyHandler', {'repeat': 3})      

这样 MyHandler就会每隔500毫秒以后被调用,并持续3次。

使用前判断下 has('timers') 即可,有了这个东西,实现后台任务就比较容易了,python用后台线程跑一个编译任务,实时把stdout/stderr的内容不断的投递到前台队列,然后vim script 里面起一个100毫秒的时钟去检查队列,并把刚才保存的 stdout/stderr 内容输出到 quickfix中,几百行代码,一个异步编译系统就可以构建出来了。

从此,可以象ide一样异步编译大工程,一边编辑文件,一边实时查看 quickfix中编译信息的输出,不必在那里傻等着。

2. Jobs:

jobs可以异步执行任务(其实我们上面已经用timer+python模拟了),为什么不直接用jobs呢?因为目前 jobs依赖的版本太新了,估计还有个几个月才能更新到各大系统,同时测试后发现vim的job实现类似上面的python后台线程监控状态,并投递内容给前台,但是前台更新比较慢,好像2秒才更新一次,就是说后台job结束了,你可能两秒后才能收到结束callback,当然如果你不在乎也可以无视直接使用更直接的 jobs。需要检查下 has('job'):

       :echo has('job')      

返回1代表你的版本支持job,这下那些什么 vimproc等异步任务模拟插件可以淘汰了,之前各种黑客手段来实现后台任务的也可以消停了。

3. channels:

vimscript中使用socket+json(或者换行分割原始字符串) 来和远程服务端通信,链接成功后可以发送命令,收到数据后会触发回调。需要检查 has('channel') 来判断。

4. guirenderoption:

windows下 gvim支持 direct2d 渲染,vimrc里面设置这么一行,渲染就使用directx了,效果更好,需要最新版本支持:

set renderoptions=type:directx,renmode:5,taamode:1

有了 guirenderoption,在 windows下字体能更加漂亮,而有了 timer/job/channel 三个套件,vim异步问题终于被官方解决了,很多依赖异步机制的插件再也不用搞一大堆飞线来实现这些事情了。

-----

估计被NeoVim 逼着更新了这么多东西,不过也是好事。


---

2016.7.20 更新:上面是四月份 jobs, timer, channel 刚出来不久的评价,随着5月份几个重要bug的修改(上面1689中提到的job更新慢问题5月已经得到修正),以及六七月的相继改进,jobs, timer, channel 如今很稳定了,:help channel 里面的文字已经由 DRAFT 变为非 DRAFT。

我一直在用,今天这些接口确实稳定不少了,上面的回答是 vim 7.4.1689,如今已经到了 vim 7.4.2078,经历了一共 389 次改进后

Vim.org

这月出了一条关于 8.0 的新闻:

Work on Vim 8 makes good progress

[2016-07-03] The past months many new features have been included, such as asynchronous communication, job control, timers and much more. The number of reported problems is steadily going down. This is an indication the quality is getting to an adequate level. There are still a few pieces to get in place and patches to include. (Bram Moolenaar)

user avatar

长期以来 vim 并没有竞争者,所以 Bram 乐得去打工就业做自己的事,在 Vim 方面的发展自然就慢慢跟不上了。

neovim 给 vim 增加新鲜血液还是很重要的,不过在它被 Linux 发行版当作标准 vi 取代 vim 之前,可能都还并不能真正替代 vim 。

不过现在看来,只要 vim 还在维护,那么 Linux 发行版的标准 vi 命令用 neovim 取代 vim 可能性不太大。多等等看吧。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有