Vim还是Neovim?为什么你应该使用后者?

25,261 阅读12分钟

新维姆

在Vim和/或Neovim之间感到困惑?下面是我说服你今天使用Neovim的理由。

A GIF of Vim vs Neovim

Vim与Neovim。该用哪一个?

如果你以前听说过Vim,你就会知道它的分叉在最近几年出现的所有情况!有Neovim (Neovim),也有Vim (Neovim)。有Neovim(最流行的分叉),LunarVim(最有前途的分叉之一)和无数其他的分叉。显而易见,为自己选择一个合适的分叉可能是一个困难的任务(已经有了,也做了)。

因此,为了帮助你做出决定,这篇文章将阐明选择Neovim而不是Vim的一些原因。更具体地说,我们将在比较两者的同时研究每天的使用情况。反正在比较消费者产品的时候,分析日常使用情况更有意义。

但在我们进入文章的真正内容之前,像往常一样,先上一点历史课。

Vim本身是由Bram Moolenaar在90年代初对已经过时的Vi进行改进的克隆。Moolenaar本人忽略了Vim的发展和行动过程。经过几十年的发展,Vim的源代码开始变得陈旧和难以维护。它很臃肿,一些代码没有被优化,而且它目前的功能集也没有很好的老化。

但是,Neovim是从头开始重建的。冗余的和几十年前的代码被清除掉了。与此同时,维护者们试图为用户提供和Vim一样的功能。虽然,它确实预先打包了 "可选类固醇"来消费。在文章的其余部分会有更多关于它的内容。

说到这里,让我们深入了解一下,为什么今天你应该使用Neovim而不是Vim。请注意,这篇文章并不是要嘲弄Vim或它的忠实用户。相反,我们将尝试分析这两个编辑器的不同功能,看看它们在日常工作中的作用。

为什么Neovim比Vim更受欢迎?

如前所述,Vim已经很老了,因此它的源代码很陈旧,难以维护。这也是目前Neovim的开发团队分叉Vim并开始自己的旅程的一个主要原因。

与一些流传的谣言不同,Neovim的分叉并不是因为 "Bram是个独裁者"之类的。Neovim的创建也不是为了给社区更多的权力。但后者绝对是分叉的一个无意的结果,是个好办法。

因为,Neovim是从头开始重建的,它打开了大门。

  1. 添加有用的功能,如语言服务器协议(LSP),嵌入式Lua 5.1(和LuaJIT)运行时间等,更容易。
  2. 更加干净和优化的源代码,使之更容易维护和减少加载时间。
  3. 更好的插件开发环境。
  4. 如果有必要,可以通过改进插件来扩展Neovim的核心功能。

而这些只是分叉Vim源代码的几个好结果。但实际上,这个清单是永无止境的,而且有可能随着Neovim的不断成熟,会有另一个理由来扩展这个清单。

其他一些同样突出的功能包括。

  1. 底层的Neovim API供插件开发者用来构建几乎所有的东西。
  2. 可选的嵌入式Lua 5.1环境也是Neovim受到社区喜爱的一个原因。如果用户愿意,Neovim可以用Lua而不是VimScript进行配置。
  3. 一个内置的标准库,包括有用的函数,如CheckHealth和/或全局vim Object。这些都是用来检查一个插件是否被正确地设置了。或者用来配置全局Neovim设置。
  4. 预先打包了合理的默认设置,使 "Vim体验"更加愉快。

如果还不明显的话,Neovim在有用的功能方面已经领先很多。例如,可以选择用VimScript或Lua来配置Neovim。或者,如果你愿意的话,你甚至可以同时使用这两种东西,选择权在你手中!如果使用Vim,你就会被困于VimScript和Lua。

如果使用Vim,你就会被可怕的VimScript所困。虽然通过插件支持LSP功能,但其体验并不像它的表弟那样流畅和开箱即用。

说到这里,让我们对上面提到的一些最常用的功能采取更详细的方法。

Neovim明显比Vim更快

如前所述,分叉Vim的主要原因之一是它的源代码太过陈旧。由于Vim已经存在了近三十年,它的源代码现在已经相当臃肿了。它很难维护,而且简单地从头开始重建要容易得多,所以开发者们做了必要的工作。

由于这个决定,源代码被清理和优化了。如果你注意到Neovim比它的前辈快得多,这就很明显了。

重建Neovim也为开发方便的功能打开了许多大门。该编辑器最重要的功能之一是嵌入Lua 5.1(和_LuaJIT)_环境。

开发人员还采取了其他性能优化的行动。其中之一就是让Neovim在事件循环中运行。因此,你终于可以告别早先会挂起的插件了。

除此之外,开发者还确保了与VimScript的向后兼容。所以,如果你是一个长期的Vim用户,想试试Neovim,不要着急,你会没事的。你可以配置Neovim来读取你的旧版.vimrc,尽管在这里和那里做了一些微不足道的改动。

但是,如果你致力于使用Neovim,并准备好接受挑战了呢?那么我建议将你目前的VimScript配置迁移到Lua代码上。你会注意到性能的提升。

为了让大家了解我在这里所说的性能提升的种类,我将分享我的经验。我的Neovim加载时间从500多毫秒减少到237毫秒。通过简单地从VimScript迁移到Lua,这大约是50%的改进!可以想象,它的速度有多快。

可以想象,如果配置加载过程得到进一步优化,它的表现会有多快。

不过从另一个角度来看,通过Lua进行配置是一个可选功能。所以,你不需要感到有义务 "学习另一种语言"。在文章的下一节会有更多介绍。

抛弃VimScript和拥抱Lua的选项

Neovim团队的目标之一是 "开发一流的Lua/LuaJIT脚本来替代VimL"。为了忠实于他们的话,开发者并没有强制要求放弃VimScript而采用Lua。我怀疑我们中的任何一个人在有生之年会看到这种情况的发生。

所以,如果你想继续使用你以前的Vim配置,你根本不需要担心。但是,如果你肯定需要Lua代码,比如说配置内置的LSP呢?

对于这样的情况,Vim heredoc将为你提供帮助。你可以在VimScript中嵌入Lua代码,其语法看起来像这样。

medium.com/media/933bc…

然后你就可以出去了,不用担心它会破坏你以前的Vim配置。Vim仍然知道如何解析这些代码并使其合理化。

虽然,在这里有一点个人意见,如果可以的话,尽量不要使用VimScript。在Lua中编码是一种更愉快的体验。即使你不得不学习它,这种语言在Vim环境之外也有许多现实生活中的应用。所以,你并不是在浪费你的时间去学习一种多余的编程语言。如果你决定开始用Lua配置Neovim,请仔细阅读这篇《Neovim与Lua使用指南》。

也就是说,Neovim的嵌入式Lua环境的有用性是通过它内置的标准库和API来实现的。如果你是一个插件开发者或普通的Vim用户,标准库可以在很多方面发挥作用。它封装了许多有用的功能和命令,以满足你的日常开发需要。

因此,在下一节中,我们将对它进行更详细的了解。

内置的标准库和API是💖。

在Neovim的开发目标列表中,第二项是为插件作者创造一个合适的环境。这样,插件作者就可以很容易地扩展Neovim的核心功能。核心开发团队通过创建Neovim API层和配套的 "_标准库 "_来实现这一壮举。

底层API层向用户公开了有用的函数,以便对Neovim进行编程控制。这些函数是通过一个名为vim的全局命名空间暴露的。

因此,假设我们想配置Neovim来显示数字列。那么就像在init.lua(或init.vim )_文件_中编写vim.api.nvim_set_option("number", true)一样容易。然后你就可以开始了!

当然,第一眼看到全局vim命名空间可能会感到困惑,但请跟着我,我会帮助你理解它的。

vim命名空间提供了一些日常使用的函数。最值得注意的包括vim.api、vim.lsp和vim.expect函数。还有更多的函数,解释所有这些函数已经超出了本文的范围。但是,你可以在Lua forNeovim指南"vim_命名空间部分 "_中找到这些函数的全面清单

为了与本文相关,以下是vim.api命名空间所暴露的一些最有用的函数。

  1. 设置选项的函数,如vim.api.nvim_set_option()。或者用vim.api.nvim_get_option()来获取全局选项的值。在类似的路线上,有缓冲区本地和/或窗口本地的函数。这些函数看起来像vim.api.nvim_buf_set_option() & vim.api.nvim_win_set_option()。
  2. 如果不定制个性化的键绑定,"Vim体验"就几乎是不完整的。而且,也有一个非常漂亮的函数可以做到这一点!vim.api.nvim_set_keymap()函数需要四个参数。模式_",你的自定义键绑定,表达式/默认键绑定和选项(如 "沉默")传递给它。_
  3. 我发现另一个在日常工作中很有用的函数是vim.api.replace_termcodes()。它用于转义终端和Vim的键码。因为VimScript默认会这样做,所以你不必担心像"\"这样的转义次数。但在通过Lua代码进行配置时,这并不像预期的那样工作。因此,这个函数在某些时候是非常方便的。

还有很多这样的函数,我们几乎没有触及到可能的表面关于vim命名空间的更多信息,请参考上面提到的" Lua_for Neovim guide"_。官方文档h: api也很方便,可以找到更多关于vim.api命名空间所暴露的函数的信息。

有了这些能力,在Neovim的核心功能之外,进一步扩展Neovim就有了很大的可能性。所以,你可以自己去想办法,并毫不犹豫地与Neo(Vim)社区分享它们。

合理的默认设置带来更好的初次使用体验

如果你对你的编辑器的程序化配置不感兴趣。或者,你早些时候尝试过Vim,但发现它难以使用?或者你不想花一整个周末的时间来配置Vim以满足你的特定需求?那么对于你,我的朋友,有一个好消息。降低首次使用Vim的用户的门槛是Neovim开发者的首要开发目标。

那么,对于不熟悉的人来说,这意味着什么呢?

这意味着,Neovim,开箱即用,看起来和感觉都不错。它不需要太多的配置,可以满足你所有的软件开发需求。当然,这个功能并不像Neovim的其他 "杀手锏"那样有趣,比如内置的LSP。或者它通过嵌入式Lua环境的程序化配置系统。但它仍然是一个值得注意的重要功能。

当你想要一个为你服务的编辑器,帮助你完成每天的任务时,你不会想花一天(或两天)来配置它,不是吗?如果你是属于这种类型的人,Neovim值得一试。谁知道呢,你可能会喜欢它,并在你剩下的开发生涯中坚持使用它。

最后的话和你进入Neovim领域的资源

现在,在我回答这个问题之前,"Vim或Neovim。使用哪一个?“.下面是对我们之前所谈的一切的简短总结。

  1. 为什么Neovim一开始就存在?以及它是如何影响社区的。
  2. 我们现在知道,Neovim的源代码是经过清理、优化和从头开始重写的。因此,它明显地比它的老表Vim快。
  3. 允许Neovim被重写为包括许多有用的功能,如LSP、异步执行等,提供了机会。
  4. 包含了一个 "标准库",增强了可选的嵌入式Lua环境的可配置性。合理的默认配置,以减轻第一次使用Vim的用户的体验。

...还有更多这个清单是永无止境的,我在上面列出的只是蛋糕上的樱桃。这些功能也是Neovim在与Vim相比时脱颖而出的原因。但是,如果有一天Vim也支持Neovim的大部分(如果不是全部)功能,也不应该感到惊讶。

也就是说,你应该使用Neovim,理由如下。

  1. 你需要一个基于终端的编辑器,并具有稳定的跨平台可用性。
  2. 你是Vim的长期用户,并且发现该编辑器的某些功能,如VimScript,很烦人,令人沮丧。
  3. 你需要类似于IDE的现代功能,比如开箱即用的LSP支持,或者你需要一些默认的配置,而不需要进一步修补。
  4. 最后,如果你需要一个现代的极简主义文本编辑器,Neovim应该是你的首选。

你认为这些是试用Neovim的一些有效理由吗,让我知道你的想法

原文发表于 https://jarmos.netlify.app 2021年7月15日。


Vim还是Neovim?这就是为什么你应该使用后者的原因,该文章最初发表在Medium的Dev Genius上,人们通过强调和回应这个故事来继续对话。