Vim OR Emacs?

Posted by ChaosNyaruko on July 23, 2022

随便聊聊我对Vim和Emacs的看法吧,说说我对这两大成名已久的古老编辑器的看法以及我的立场。

我并不打算在这里详细说明Vim或Emacs是怎么使用的,因为互联网上已经有足够多的资料,肯定比我讲的好的多。而且我自己也只用了Vim两年左右,并不资深,而Emacs我更是几乎等于一窍不通。所以我仅列出Vim和Emacs在我有限的了解里表现出的优点和缺点。可以的话,尽量互相对应。

免责声明:这场旷日持久的战争对于很多人,尤其是Linux爱好者来说,恐怕已经不是什么新鲜事了。我相信每个人都有自己的立场,也有自己的理由。所以在这里,我只是表达我的个人看法,对特性的总结可能有偏差,但立场没有对错,也没有优劣。

Vim

“编辑器之神”

严格来说Vim是上个世纪90年代才诞生的,远不如Emacs来的古老(70年代)。但其前身Vi(Vim = Vi IMproved,但好像有个说法是谦虚的Bram Moolenaar最一开始将m定义为IMitation1),也是在70年代诞生的。这段历史其实很有意思,可以从TAOUP中略窥一二,但这里暂且不说。Vi和Vim在纯文本的操作逻辑上是非常非常相似的,而这种操作模式也是Vim最广为人知的特性,所以通常意义上我认为Vim和Emacs同样古老。 Vim 作为最有名的“模式”编辑器之一,我认为这种“模式”正是Vim给后继者/现代编辑器提供的最宝贵的财富。初学者一般会认为Vim的学习曲线非常陡峭,但实际上,跨过了模式编辑的适应期之后,多数人-可能是主体是程序员吧:),在大多场景下应该会爱上这种方式。因为它解放了键盘上的很多按键,进而解放了很多操作,从而让一种“操作文本”的迷你语言(我认为这就是一个层面的语言)成为一种高效而核心的理念。这种操作模式现在可以说是广泛应用在现代编辑器中,例如VSCode、JetBrains家的IDE,都有对应的vim插件。这类插件本质上提供的就是这个操作模式。甚至不少人表示,即使Vim这个软件看起来有些过时,但如果重新实现一个,仍然会保留这种模式。其集大成者自然是NeoVim。这里不展开。

优点

  • 模式编辑,以及引入模式带来的默认情况下更高效/人性化的键位设置,和这套模式在现代其他编辑器里的广泛移植。
  • 完美运行在TUI环境下,劫持全键盘操作
  • 跨平台,而且几乎在所有的UNIX发行版上都默认安装,至少是Vi。这也是为什么Linux运维人员使用Vi/Vim的比例要高得多
  • 占用资源少
  • 超高度的扩展和定制性。你几乎可以修改所有你能想到的配置来满足自己平常的编辑需求
  • 开源软件,活跃的社区。
  • 完备的内部帮助文档
  • 更符合UNIX哲学(小而精工具组合完成更复杂的任务)

缺点

  • 不好上手。StackOverflow点击最多的问题之一, “How do I exit Vim?”
  • 图形界面支持一般,不管是Windows上的GVim还是MacOS上的MacVim,都只是TUI版本Vim的一层简单包装。所以很多在现代编辑器上习以为常的操作,像右击唤出菜单什么的,可能做需要额外配置。可能也正因如此,Vim作为本质上为Terminal开发的编辑器,在“前端交互”或者说“作为其他开发工具的前端”这点上,远不如Emacs灵活
  • 中文支持不好。一方面是字符集的问题,像分词之类的功能受到影响;另一方面是输入法的问题,在中文输入法下,Normal模式的很多操作会被输入法劫持,需要额外的解决方案。多数情况下,这些方案或许管用,但都并不优雅。英语母语者就很少有这两个问题
  • Vimscript(原生Vim使用的脚本语言)比起lisp虽然形式上更像现代的脚本语言,但真的足够晦涩难懂,表达力欠缺。NeoVim的蓬勃发展或许能解决这个问题
  • 作为一个软件本身看上去有点过时,而且软件工程组织并不好,维护也更多是集中在一个人身上

Emacs

“神之编辑器”

Emacs我使用的并不多,只是偶尔看到Battle贴心血来潮会偶尔使用一下,或者是看到颇具盛名的doomemacs/spacemacs的安利贴时进行一些尝试,但我仍然斗胆表达一下我的看法。另外说一句,Emacs是自由软件运动的标志性产物,自由软件运动更多的是一种思想解放:)。

它是“伪装成编辑器的操作系统”

优点

  • 上手快
  • 跨平台,TUI/GUI下都能很好地使用,在GUI工作得更好,同时也支持全键盘操作
  • lisp/elisp的最佳学习平台
  • 比Vim更高的扩展性,因为它自己就是个Lisp解释器,Lisp是图灵完备的语言。所以,你可以在Emacs里面实现一个Vim,甚至可以用它煮咖啡,字面意义上的。
  • 开源软件,较活跃的社区
  • 完备的帮助和提示系统,我认为这里做的比Vim更好,比如可以通过 C-h + k 来查看对应快捷键绑定了什么功能
  • Org mode,可能是最强的GTD工具
  • 作为软件工程实践更加出色,Richard Stallman的开发和维护工具顺利交接给了其他人。比Vim具有更低的选择复杂度,这点在TAOUP中也有提到

缺点

  • 默认情况下近乎反人类的键位设置,以及其小拇指的伤害:(,因为默认键位用到大量功能键,有的还会与操作系统默认配置,或者与其他软件冲突。比如ctrl+space很多情况下会被操作系统设置为切换输入法,从而使其在Emacs中的功能失效,需要额外配置
  • 多数情况下占用资源相对Vim较多,启动也更慢,这在现代计算机上这并不是什么问题,但在很多小型或嵌入式设备上,可能无法使用自己顺手的Emacs配置
  • 容易陷入“玩”Emacs的“陷阱”中,而且lisp是一门经典且值得学习,但并不广泛应用的语言,你几乎只会在Emacs中大量用到它。相比之下,Vim可以使用python、lua等语言进行插件编写,不用重复造轮子
  • 与传统UNIX哲学稍稍相悖,everything in one and elisp.
  • 现代流行度稍逊于Vim,很多问题可能得自己解决,很让人头秃

两者的选择

简单概括2

Emacs, “a great operating system, lacking only a decent editor

Vim, “a great editor, utterly lacking a decent window manager”

我的看法:Vim是一个更纯粹的,甚至在某种意义上,更好的编辑器;而Emacs有一个理念是“Live in Emacs”,每天打开电脑第一件事就是打开Emacs,然后所有操作都能在Emacs里完成了。但我认为在现代环境下后者根本没有必要,你没有必要为了浏览网页而用elisp实现自己的浏览器(尽管它可以),因为我们有Chrome/Firefox这类更专业更优秀的替代。 在我看来如果只是想完成一个编辑任务,Vim更合适,这也是我目前主要选择Vim的原因,我想可能也是Vim在程序员世界里也相对更主流的原因之一3

In our findings, we found 93% of the users on all our clients’ projects use Vi/Vim as their primary file editor.

Vi/Vim: 93%

Nano: 5%

Emacs: 2%

Even more interesting – look at how small the Emacs footprint is. Nano actually beats Emacs by 3% to 2%! We didn’t see that coming!

So there you have it. The debate is pretty much over. We live in a Vim world.

但如果想把编辑器打造成通用IDE甚至是操作环境,Emacs显然有自己的优势。不过Vim/NeoVim也具备打造成IDE的能力,这里不展开了。
尽管我个人不是将编辑器打造成IDE的拥趸,但是“Why do we do this? Just because we can!”。这就是程序员的乐趣和浪漫,在数字世界中定义自己的规则,实现自己的目标。

另外附上几个现代环境在我认为可以用作选择参考的建议:

  • 要学习lisp/elisp -> Emacs
  • 需要Org mode -> Emacs
  • 即开即用,甚至是通用操作方式 -> Vim
  • 主流代码编辑/浏览 -> Vim
  • 多数时间活在终端里 -> Vim
  • 超级极客,就是要自己撸一切 -> Emacs!!!!!

当然,最佳推荐当然是都试试,然后自己决定!适合自己的才是最好的

私货:99%的人都不会自己去写插件,但99%的程序员都会需要一些定制化配置,这类需求大多用Vim就足够了。Emacs或者是比Vim更强的编辑器,但不见得是更适合自己的编辑器。 另外,这两者也不是互斥的,正如spacemacs4所说:

The best editor is neither Emacs nor Vim, it’s Emacs and Vim!

对我来说,并不是用了“神的编辑器”我就能成为神了,我还不具备驾驭Emacs的能力,只能被“编辑器之神”驾驭。

另一方面,以VSCode为首的现代编辑器们似乎也具备相似的能力,使用门槛也很低,Vim/Emacs似乎已经过时了,没有必要花额外精力去学习。但我仍然建议程序员们至少对这两个编辑器有最基本的了解,因为它们的很多操作方式已经被各种其他应用借鉴,像shell、more/less、tmux、macOS的各种默认光标操作等等等等。这是通用的,而且可能是具备长期回报的提效技能之一。

写在最后

尽管去尝试吧!最后送给大家,7个高效的编辑习惯5

  1. https://en.wikipedia.org/wiki/Vim_(text_editor) 

  2. https://news.ycombinator.com/item?id=7978048 

  3. https://cmd.com/blog/vim-or-emacs-the-debate-is-over/ 

  4. https://www.spacemacs.org/ 

  5. https://moolenaar.net/habits.html