logo一言堂

VI 和 EMACS 之争

我自己是一个忠实的 emacs用户,但在 emacs 不存在的地方也常常需要使用 vi. vi 和 emacs 之争贯穿 UNIX 和 LINUX 的几乎全部历史,不知道引起过多少口水。在21世纪的今天,有人为它们都过时了,但我觉得未必。今天我试图用尽可能中立的态度回顾一下我所知道的全部历史,不仅有一定科普意义,对自由软件从何处来,到何处去这个问题也能提供一些思考的原材料。

史前时代

Emacs vs VI
Emacs vs VI

很久很久以前,这世界上即没有 vi 也没有 emacs. 1970年带给人类 UNIX 和阴极射线管 (CRT)终端,但人机交互仅限于严格意义上的命令行,即你敲一条命令,电脑回一些结果。那程序是怎么写的呢?也是一行一行敲进去,用其他命令一行一行改。你并不能在看到多行程序上下文的情况下,移动光标到位置,然后插入或修改文字。这个一行一行敲,一行一行改文件的工具在 Unix 下叫 ed , 当然也是 unix 之父 Ken Thomson 的杰作。Ken 是一个真正的大拿,他直到后来也不是很理解,你为啥要看到程序上下文才能写程序? 不都在你脑子里吗?

1976: 原始 emacs

在 MIT AI 实验室有另外一个操作系统 ITS, 上面的类似 ed 的程序叫 TECO. TECO 在技术上比 ed 高级一些,它已经是一屏一屏显示,然后有一个命令行界面可以再输入命令,比如在第三行第五个字符后面插入字符串 "hello" 什么的。当然这样也不方便,但它还有一个功能,可以定义宏 (macro),把某个命令序列绑定到一个热键上。于是许多人就写了许多宏,让 TECO 变的好用很多。机房管理员叫 Richard Stallman, 就是后来大名鼎鼎的 RMS, 他搜集整理了大家的有用的宏放在一起并持续维护,最后大家都用他的了。RMS 把这些宏的总和起了个名字: Extended MACroS,简称: emacs

1977: VI

在大致同时期,美国西岸的加大伯克利分校有个研究生叫Bill Joy. 伯克利是最早的 unix 使用者,Bill 也买了二手 CRT 终端拨号连到学校上机写程序。他发现, ed 太他妈难用了,于是就找出源码一阵改,改的新版叫 em, Ed for Mortals. 后来越改越来劲,并利用到终端的新特性,添加了全屏模式,新程序叫 ex. 这个程序迅速得到了同学们的一致好评,Joy 发现人人都用全屏模式,没人用保留的兼容ed的行编辑模式了,于是他再改名,叫 VIsual, 命令仍只取两个字母: vi. 随着 BSD 攻占全美大学机房,这个程序也被 AT&T 采纳,进入 unix 主流。

1981: Goosling emacs

随着 unix 的流行,ITS 逐渐式微。大家都用 unix 系统和 c语言,但不是所有人都喜欢vi。很多人怀念 emacs 的强大功能和用户可扩展性,出现了几个 emacs 克隆版本, 其中最著名的是 James Gosling 的版本。Gosling 10年之后以 JAVA 之父闻名天下,但初露头角时靠的是重写 emacs. 他的版本在技术上有不少创新:

  1. 核心用 C 语言写就,运行在 UNIX 上
  2. 主要应用逻辑用一种自带的 lisp 实现
  3. 麻雀虽小,但已经有原始的 VM 和 GC

很快,这个版本就在学术圈流行开来,成为高端编辑器的代名词。当然, vi 的地位也无可撼动,有人形象地说:

Vi is like masturbation: it is not as good as the alternative, but it is always there.

1985: GNU

RMS 在这一年重操老本行,在 Gosling 的基础上,重写了一个更强大的 lisp 引擎,整理了所有代码,作为他实现一个完全自由的操作系统 GNU 的奠基石。第一个版本就叫 GNU EMACS 13. 从技术角度而言,这个 emacs 并无太大创新,但它的政治意义非常深远。我这里提过的所有软件,从 Ken 到 Joy 到 Gosling 写的,都是开源的,但并非自由的。原因有二: 一,虽然这些软件是自发写的,但他们都有雇主,软件著作权属于雇主;二,个人开发者源码互相借鉴抄来抄去,说不清根源了,所以, AT&T 和其他公司的著作权在法理上难以挑战,最后这些软件的新版本连开源都做不到了。RMS 对软件权益有切身之痛,一年前就辞了职,成为完全自由职业者,gnu emacs 虽一开始基于 Gosling 版本,但不到一年的时间,彻底重写了每一行代码,而且全部著作权交给刚成立的自由软件基金会。这样,gnu emacs 成为史上第一在法理上无可辩驳的自由软件。这个版本也迅速取代了 Gosling 版的江湖地位。

这里再着重提一下 RMS 这个人。RMS 以圣徒自诩,人们也通常以为他是唐吉柯德式的傻瓜。从技术水平和贡献上他比不了 Ken, Joy 或 Gosling, 但他创立了自由软件基金会和 GNU 项目,并身体力行,一直以身做则,为我们今天蓬勃发展的自由软件事业奠定了基石。从这个意义上说,他比这些大拿们更伟大。

1991: vim

事实上今天我们用的 vi 并非 Bill Joy 的 vi,如果想体验一下老 vi 朋友可以尝试在 debian 下安装 nvi (BSD vi), 当然这也不是老 vi, 但毕竟接近的多. 老 vi 正如 RMS 所预料的一样,从开源的共享软件变成了厂家的商业软件。当 FreeBSD 要发布的时候,必须把所有和 AT&T 有关的代码移除,所以只能重新写了 nvi. BSD 的朋友们比较保守,整出的 nvi 和老 vi 相当接近,但另一批人就没这么多历史包袱。

vim 起源于 Amiga 平台,但在新兴的 Linux 平台迅速找到了自己的家。自称 vi improved,它迅速成为 linux 上最主流的 vi ,并大胆添加了语法高亮,用户程序扩展等贴近程序员使用的功能。和之前的 vi 或 emacs 不同,vim 的开发团队并无够分量的大拿坐镇,但赶上了 linux 和互联网的爆发,兼收并蓄的吸纳社区里各种贡献,虽然从软件工程学上不一定严谨,也没有什么特别值得一提的技术独创,却走进了 Linux 社区的心里,和 linux 一起在90年代病毒式扩张。同期的另几个重要软件如 apache,mysql,php 莫不如是。

1992: lucid Xemacs

再说 emacs 这边。90年之后,RMS 的主要精力放在社会活动上,FSF 请了新人继续开发 emacs. 但 FSF 没什么钱,光靠情怀请不到什么牛人,何况上面还有一个要求甚高的原作者 RMS 指手画脚,所以 gnu emacs 开发陷于停滞。此时有个公司 lucid 要做基于 emacs 的IDE, 自己搞了一套 lucid emacs, 主要贡献者是 Jamie Zawinski(JWZ). 此人在 lucid 94年关门后又去了 Netscape,然后又在三藩市开了个夜店 DNA Lounge, 非常值得一去。JWZ和 RMS 在技术路线上有严重分歧,自由软件早期最著名的一次分裂和骂战上演了。回头看实际上双方都是好人,但矛盾不可调和。Lucid emacs 演变成了 XEmacs, 在 GNU 体系之外独立发展。90年代中后期实际上有三大编辑器,vim, emacs 和 Xemacs.

Vim 在编程功能上渐渐追上来了,到96年左右实际上在程序员需要的功能上超越了 emacs。emacs 一直以来都有个劣势,就是比较慢,占内存,毕竟是基于高级语言的。当时有个说法:

EMACS: Eight Megabyte And Constantly Swapping.

早期 pc linux 用户都穷,没多少内存,结果你功能还不行,所以 gnu emacs 比起 vim 就不受欢迎了。 Xemacs 倒是功能更强,但更耗资源,还有个乱臣贼子的骂名,也没有大火。

2001: 新世纪

2001年,xemacs 和 emacs 相继推出了 v21, vim 也推出了 6.0。编辑器功能的进化放缓,emacs 在编程功能上终于基本追上了时代,21世纪的电脑也都够快有够多内存,emacs用起来也不觉得比vim慢多少了,我自己也是大致在这段时间成为 emacs 用户的。

那边厢 xemacs 问题逐渐暴露出来。它其实一直没有找准定位,一个更新更潮的 emacs? 问题是真正追求新潮的人也不会去用可以追溯到1976年的软件了不是? 用 emacs 或 vi的人要的是 get the job done. 所以 xemacs 一直没有足够大的社区来好好维护这么大这么复杂的程序。它还坚持了近十年,但最近一个正式版本发布已经是十年前了。

但不管怎么发展,vi 和 emacs 还都坚持着自己的原则. vi 的哲学就是 unix 的哲学:每个工具做好自己的事.emacs 的哲学则更古老一点:别让贫穷束缚了你的想像.这两个哲学对立而互补,驱动着自由软件不断进步.

总结

vi 的历史非常平稳,在两个关键的时间节点上搭上了历史的快车.而 emacs 的历史相对就跌宕起伏了:emacs 所瞄准的目标远比 vi 的高,摔的也比 vi 狠的多.其实,vi 和 emacs 并不是敌人,而是在不同层面上互补的伙伴.大家共同的阵营叫自由软件,而对于自由软件阵营里的程序员来说,什么又比我们手中用来写代码写文档的工具更重要呢?