在消磨三年时光之后,我终于明白这个编辑器还远远称不上稳定,在道路的尽头之前,我能做的其实只有观望。

记得之前看到过一个例子, 发动机能够成功的关键在于它成功将"运动"这一复杂的行为集合抽象成了旋转运动, 一切运动皆旋转, 所以发动机只需要做好旋转就可以了, 用户可以踩油门, 可以拧把手, 可以做出各种各样不同的操作行为, 但是这些行为具体作用到发动机的时候, 就统统变成了旋转多快, 往哪里旋转. 由于发动机对运动集合进行了高度的抽象, 因此使得其原理变得简单而易于迁移, 进而让发动机的抽象成为了动力机器的事实意义上的标准. 从一个理科生的视角来看, 这是一个浪漫且实用的设计.

再来看另一个极端的案例, 假设有这么一台机器, 它并不像发动机那样对运动集合进行抽象, 它将所有的运动方式都保存在一张HashMap中, 但是它提供了一个轮盘, 用户只需要将轮盘转动到合适的位置, 就可以从HashMap中找到用户所期望执行的运动方式. 这是一个很怪的案例, 因为它所做的正好与发动机所做的事情相反, 它并不对动力机器的行为做出抽象, 而是对用户的行为进行抽线, 将用户执行的所有操作都抽象为旋转. 当然, 这样的机器就算被发明出来, 也早就被彻底抛弃了, 但是类似的, 不那么极端的设计, 依旧存在, 比如这篇文章要说的vim.

vim所提倡的全键盘操作确实让人眼前一新,其基本的操作逻辑是将用户的行为抽象为四个模式(Normal Insert Visual Command),之后的所有插件,不管是语法补全还是其他,都是在这个操作逻辑上进行的补充。不得不说,如果习惯了这样的操作逻辑,使用起来确实是比较舒适的,只要你不遇到一些问题

忘记了键位

作为一个自定义程度极高的编辑器,自定义键位是不可避免的事情,并且由于vim缺乏有效的鼠标操作,所以需要定义键位数量和普通的IDE相比会多得多。举个例子,在IDE下用括号去包裹一个词,需要用鼠标选中那个字符串然后按下括号就可以了,但是在neovim中,需要使用插件surround.nvim,使用ysiw(为它添加,且不说这个操作行为需要你连续又快速按下五个键(慢了nvim就不认了),这个键位只适用于光标所处在的词语,如果要为一段话添加呢?那还会有别的键位,但是如果是鼠标的话就还是同样的操作。

从这里就可以暴露出vim/neovim的第一个问题:全键盘操作迫使vim用户将更多的键位分配给更加细粒度的操作行为上,给原本疲于应付工作的大脑再加上一根稻草

插件之间缺乏隔离

这个问题在我折腾期间确实存在,即便不明显,但是时不时会跳出来绊你一下。我在github的issue中看到过太多因为安装了别的插件而导致这个插件的运行出现了问题。举一个恼人的典型案例,这个案例也是让我第一次对neovim的插件生态产生了怀疑,那就是nvim-tree,这个插件很好,非常好,只是有一个小小的缺点:它做不到自动退出,简单来说,就是当你关掉当前编辑的这个文件之后,如果你的nvim-tree开着,那么就要多执行一次:q,这是一个很恼人的问题,而在nvim-tree的wiki上写到

Unfortunately such functionality is problematic and is not present in nvim-tree:

  • vim events are the only mechanism we can use for auto close
  • vim events are unpredictably ordered, especially when other plugins and automation are involved
  • BufEnter is the last event that can be acted upon and that event can have side effects
  • Event nesting may be disabled by other plugins / automation, resulting in missing events

other plugins ! 这不禁让我想到了旧版火狐插件,高自由度必定和隔离性有序性相互违背,尤其是对于正处于新兴阶段迅猛发展的neovim更是如此。

插件生态的混乱

我在写这篇吐槽的前一天逐个检查我平时使用的插件,发现已经有几个插件的作者在github页面上写着类似于“不再更新了,去用xxx吧,那个更好”的话,这距离我上次检查才过去两个月啊。有些作者仅仅只是觉得自己写的东西比较差就索性不再更新了,emmmmmm,确实,不能怪作者,要怪就怪用户倒霉吧,谁让这是开源呢,包括我在内的大部分用户只能被迫从一个插件换到另一个插件,从kommentary换到Comment.nvim,从lspinstaller换到mason.nvim……我不知道我在追逐什么,在我这个外行看来他们做的事情不应该是一样的吗?

怀疑越积越多,最终我累了,我停下了脚步,选择了vscode。或许哪天等插件生态逐渐稳定下来之后我会再回来看看吧。

写这么多,不是因为讨厌,只是为了记录。回望neovim这几年的发展,可以看出其势头非常凶猛,尤其是在这两年增加了lsp和treesitter之后,希望它未来会越来越好吧,因为它对我来说不仅仅是一个编辑器了,它还是我大学懵懂时期乐趣的一部分,是回忆里的一块拼图了。