Emacs 和 Vim 开发者,大家沿着不同的道路和目标前进,但总是会在某个点交叉相遇,见面就扔石头和臭鸡蛋,砸得对方鼻青脸肿,然后擦擦眼泪和口水继续前行。
但无人能否认 Vim 的江湖地位。在无数的编程工具里,Vim 独树一帜,历久弥新。可以说,Vim 是最简朴的编辑器,也可以说,Vim 是最繁复的编程工具,还可以说,Vim 是一款史诗般的编程软件。回想早年用 Vim 编程的场景,当可体现“专注”二字。那个年月的网络没有这么多诱惑,编写代码时差不多只开一个终端工具,噼噼啪啪地敲击键盘,累了就躺在办公室外的沙发上休息,也可以站起身看看窗外,舒缓一下疲惫涣散的眼光,车流尚慢,夕阳正好。时过境迁,现在靠着硬盘的快、内存的大,我常常同时开几十个程序,用 command+tab 一切,屏幕中央一排几毫米见方的小图标一字排开,看着它们我有时候茫然若失,不知道自己到底想点开哪个,估计它们看着我也郁闷,「这孙子把我们都打开想干什么?」环境变好,硬件充沛,软件强劲,我们的效率好像并没有随之提高。而 Vim,正是为效率而生的。我和这个神器的结缘,得从 2000 年说起。结缘 20 年前,正值第一波互联网浪潮。我刚毕业不久,一如现在的热血青年,投身到互联网的大熔炉中。我所在的公司叫洪恩教育,公司里聚集了很多清华北大的同学,技术牛人扎堆,大家清一色使用 Vim 在服务器端编程,语法高亮都不设,内部 BBS 也是水木清华那种,通过终端访问,非常极客。走进办公室一眼望去,满目皆是黑漆漆的屏,绿瓦瓦的字,每个人都在那里噼噼啪啪的敲击键盘,韵律十足,我想,这简直酷毙了。你看,水木清华也是一种生活方式。我最初还在使用 Editplus 编程,隶属菜鸟帮。别人的开发、编译和发布环境都在服务器端,而我则需要在本地编写好程序,通过 Editplus 的 ftp 功能上传到服务器端,再进行调试、测试和发布,不仅麻烦,而且不够酷。那时候,不酷是不行的。有一次我的师兄站在我电脑旁边看我完成了上传、编译和执行的全过程,像看一个怪物一样对我说,你这是干啥哩?给我推荐了 Vim 这个神器。由于我的菜鸟行为遭到了小伙伴的无情嘲讽,于是我把愤怒都发泄在键盘上,每天在满天星斗的夜色中学习 Vim 技法,在清晨的微光中编译 Linux 内核,上午敲打键盘输出 Perl 程序,中午吃完五又四分之一口米饭之后开始研习 Vim 的多窗口和标签……等我掌握了 Vim 的使用方法和十几个快捷键之后,每次编程双手上下翻飞,再也没有上传的事,连编译执行都不用离开 Vim,我彻底喜欢上了这个编辑器,再也回不到用 EditPlus 写东西的世界。到了 2009 年,我开始把工作环境完全切换到了 Mac 上,记得当时打开 Mac 的终端时,欣喜若狂地想,这不就是 Vim、Shell 和 IDE 的完美集成么?十几年过去了,我在工作中一直没有离开过 Vim,一直用到现在。
神器
Vim,作为一款完全面向程序员的软件,优点和缺点同样明显,某种程度上,优点就是它的缺点。写过程序的人都知道,编程的时候,双手大部分时间都放在键盘上,或编码、或插入、或移动、或定位、或查找,这种连续操作的时间和频率远远大于阅读、翻页、设置字体、摆弄样式等文案工作,而二者往往产生很多停顿和间隙。编程时的停顿,是非常影响编程效率的。所以 Vim 的设计理念就是通过模式的转换、命令的组合和数以万计的插件,保证程序员在编程的过程中,双手尽可能保留在键盘中央的区域,并且,不需要鼠标。所以,Vim 的模式和普通的编辑器有所不同,命令繁多千变万化,初期的学习曲线较高。我还对比过 Vim 和 Emacs 的学习曲线:
Vim 的曲线异常陡峭,但是当你度过了那一段艰难时候,就会领略到千帆竞发、百舸争流的美妙,并且从此天堑变通途。Emacs 则是初期似乎不过尔尔,但是学习愈深愈艰,而且还会出现回退,反复,360 度大回环等匪夷所思的情况,到最后你终于明白,Emacs 原来是个伪装成编辑器的操作系统,满眼都是泪!
学 Vim 最常见的笑话就是,在命令行输入 vim,然后就永远退不出去了……最后只好关上整个终端。因为退出 vim 的命令是 :q但是一旦你坚持练习并且度过了最早的平台期,就会领略 Vim 的妙和全键盘的好。唯快不破,这个词用来形容 Vim 最合适不过。毕竟,工具之间确实存在优劣和效率上的差异。想做到快如闪电,就需要记住四种模式切换:普通模式、插入模式、可视模式、命令模式,大量的快捷键和命令,想通过死记硬背记住这些东西是不现实的,唯有长期坚持不懈的练习和使用,才能达到随心所欲的地步,就像乔峰一般,任何平坦无奇的武功到了他的手里,均可化腐朽为神奇。在不同的场景下,采用最合适的工具,永远是最佳选择。如此强大的 Vim 适合什么场景呢?简单说来,Vim 比较适合 Unix/Linux 服务器端编程,如果你使用 Mac 电脑,Vim 是直接集成在你的终端环境中的,用起来十分方便。我以前用 Vim 主要用来进行 Shell/Python/C 编程。在 Unix/Linux 服务器端编辑和修改文件也离不开 Vim,另外由于我个人工作环境是 Mac,所以修改文本文件、Code Reiview、批量替换文件、比对文件等工作,用 Vim 顺手就做了。写 Java 程序、前端的 HTML/CSS/JS、Objective-C 和 Swift,最优方案依次是 IDEA、VS Code、XCode 等。这些优秀的工具可以帮助我们提升效率,减少错误,但是如果你还想更进一步,那么 Vim 绝对值得拥有。事实上,这些编辑器内部全部内置了 Vim 编程模式,或者有 Vim 插件扩展。可谓一通百通。不过编辑器历史久远,这些年产品不知凡几,为什么 Vim 如此风靡?因为它的创造者是Bram Moolenaar 。
诞生
Vim 源于 Vi,但不是 Vi。Vi 作为计算机的文本编辑器历史极为悠远,它是由美国计算机科学家比尔·乔伊编写并于 1976 年发布的,同年苹果公司成立。比尔·乔伊,是 Sun 公司的联合创始人和首席科学家,一位传奇的技术天才,我个人以为,他最伟大的贡献是独立编写 BSD 操作系统,开发 Vi 编辑器,创立 Sun 公司。当然,他还是 Java 语言的主要贡献者之一。任何人有幸完成其中一项工作已经足以名垂计算机发展史,而比尔·乔伊则通过一己之力完成了这些科技成果,推动了整个计算机科技的发展。在 1984 年 Emacs 出现之前,Vi 是所有程序员的标准 Unix 编辑器。比尔·乔伊自己也点评过 Vi 和 Emacs:“我觉得 Vi 一个最有趣的特点是它是一款基于模式的编辑器,作为一款基于模式的编辑器,Vi 做的非常棒。Emacs 的优点之一是,它是一款无模式的编辑器。但我从来没有想过要把 Vi 做成那样。Vi 最根本问题是它没有鼠标,所以才有了各式各样的命令,但你不能用现在的眼光去看当时的软件。对于 Vi,我希望,我们没有用尽键盘上的每一个键。”Vim 的诞生要晚一些。第一个版本由 Bram Moolenaar 在 1991 年发布。作为一位声名显赫的程序员,80 年代,他买了一台 Amiga 2000 电脑,打开电脑一看,鼻子差点气歪了,居然没有他在 Unix 系统上最常用的 Vi 编辑器!这是不可接受的。愤怒的Bram决定自己开发一个文本编辑器,完全复制 Vi 的功能,并起名为 Vi IMitation(模拟)。事实证明,天才程序员都具备这种能力,对现实不满意,就会写个东西出来,要么完善一下,要么创新一下,要么是你写,要么是我写,于是,很多伟大的软件程序就发明出来了。随着 Vim 的不断发展,更多更好的功能被加了进来,正式名称改成了 Vi IMproved(增强),也就形成了我们所熟知的现代的 Vim。其实还有一个小插曲,90 年代,Bram发布自己开发出的 Vi 模拟后,市面上也有不少人发布了自己 Vi 克隆编辑器,比如 Elvis、Nvi、Xvi。最终 Vim 脱颖而出。到底有多优秀,同行评价是最客观的。有人就问过 Xvi 的开发者,既然自己写了一个编辑器 Xvi,为什么还要使用 Vim?回答是这样的:“写一个 vi 是任何程序员都可以做的事情,只要他们付出努力。但把 vi 写成像 Vim 这样的好东西,只有像Bram这样的人才能做到。显然,我会用更好的工具。”Bram的个人网站有一个专题“FUN”,https://moolenaar.net/fortunes.txt,他收集了一些“有趣的、有智慧的或值得一读的言论”,其中一条是:Emacs 和 Vi 之间的战争已经结束。Vi 以 3 比 1 获胜。推荐阅读:用 Vim 吗?退不出来那种 Vim 学习卡和提鞋的问题(上) Vim 学习卡和提鞋的问题(下) VIM——为效率而生