Vim 是从何而来?智慧积累的伟大力量

更多精彩 第一时间直达

我最近偶然间发现了一种名为Intel HEX的文件格式。据我所知,为了使二进制图像不那么容易被破解,Intel HEX文件(扩展名为.hex)将它们编码成多行十六进制数字。显然,它们是供程序微控制器开发者或是需要将数据烧成ROM的人使用的,无论如何,当我第一次在Vim中打开一个HEX文件时,我发现了一些令人震惊的东西。这种文件格式,至少对我来说,是极其深奥的,但Vim却是对这种文件格式了如指掌。一个HEX文件的每一行都是一个记录,只是被划分为不同的字段——Vim已经抢先一步将每个字段涂成不同的颜色。set ft?我敬畏的询问。filetype=hex,Vim得意洋洋的回答道。

Vim无处不在。太多的人使用过它,像是支持HEX文件这种事根本算不上是一个惊喜。Vim被预装在Mac OS上,同时在Linux世界中有着一大批拥趸。即使那些讨厌它的人对它也很是熟悉,因为有足够多的主流命令行工具会在默认情况下把用户扔到Vim中,以至于外行人被困在Vim中不知所措,仿佛vim是一种病毒一样。有一些主流的网站,包括Facebook,当你按下j键时,页面会向下滚动,当你按下k键时会向上滚动——这种不可思议现象正是Vim通过数字文化广泛传播的高水位标志。

然而,Vim也是一个谜。比如说React,每个人都知道它是由Facebook开发和维护的,Vim并没有明显的赞助者。尽管它如此普遍、如此重要,似乎没有任何一个委员会或组织可以对Vim做出决策。你大可以花上几分钟在Vim网站上闲逛,但对谁创建了Vim或者为什么创建仍是一无所知。如果你在不输入文件参数的情况下启动Vim,会看到Vim的启动消息,上面会说Vim是由“Bram Moolenaar等人”开发的,但这并不能说明什么。谁是Bram Moolenaar,他的影子同伙又是谁?

也许更重要的是,当我们在提问时,为什么退出Vim操作会涉及到输入:wq?这显然先是一个“写”操作,然后是一个“退出”操作,但这不是一个特别直观的约定。谁决定复制文本应该被称为“yanking”?为什么:%s/foo/bar/gc是“查找和替换”的简写?Vim的特性似乎太过武断,不可能被编造出来,但是它们从何而来呢?

答案就像通常的情况一样,是从那个古老的计算机熔炉——贝尔实验室开始。从某种意义上说,Vim只是一款被称为“wq文本编辑器”的软件的最新版本,自Unix时代诞生以来,它一直在不断地被开发和改进。

Ken Thompson写了一个行编辑器

1966年,贝尔实验室聘请了Ken Thompson。Thompson刚刚在加州大学伯克利分校得到了电气工程和计算机科学的硕士学位。在那里,他使用了一个名为QED的文本编辑器,它是在1965年到1960年之间为伯克利分时系统编写的。在到达贝尔实验室后,汤普森做的第一件事就是为麻省理工学院兼容的分时系统重写QED。他后来又为Multics项目写了另一个版本的QED。在此过程中,他扩展了程序,使用户可以在文件中搜索行,并使用正则表达式进行替换。

Multics项目,和伯克利分时系统一样,试图创造一个商业上可行的分时操作系统,它的合作伙伴包括麻省理工学院、通用电气和贝尔实验室。AT&T最终认为这个项目毫无进展并终止了它。Thompson和他的同事,贝尔实验室资深研究员Dennis Ritchie,因为苦于没有一个分时系统以及怀念交互式计算的“感觉”,所以决定着手创建他们自己的版本,这就是世人所熟知的Unix。 1969年8月,在妻子和年幼的儿子外出加州度假时, Thompson将新系统的基本组件拼凑在一起,各花了一周时间来配置出了操作系统,命令解析器,编辑器和汇编程序。

编辑器被命名为ed,它是基于QED的,但并不是一个完全的重新实现。Thompson决定放弃某些QED功能。削减了对正则表达式的支持,只支持相对简单的正则表达式。QED允许用户通过打开多个缓冲区同时编辑多个文件,但是ed只会一次使用一个缓冲区。QED可以执行包含命令的缓冲区,而ed不会这样做。这些简化也许是有意为之的。Dennis Ritchie曾说过,没有QED的高级正则表达式“并不是很大的损失”。

ed现在是POSIX规范的一部分,所以如果你有一个符合POSIX的系统,你可以在那台计算机上安装它。它还是值得一用的,因为时至今日,许多ed命令都成为了Vim的一部分。例如,为了给磁盘写一个缓冲区,你必须使用w命令。为了退出编辑器,你必须使用q命令。这两个命令可以同时在同一行上使用——因此,wq产生了。像Vim一样,ed是一个模态编辑器;要从命令模式进入输入模式,你需要使用insert命令(i)、append命令(a)或change命令(c),这取决于您想要以何种方式转换文本。ed还引入了s/foo/bar/g语法来查找和取代,或者说“替换”文本。

考虑到所有这些相似之处,你可能会认为普遍的Vim用户在使用ed时不会有任何问题,但是ed在另一个重要方面与Vim完全不同。ed是一个真正的行编辑器。它是在电传打字机时代被广泛使用和广泛使用的。当Ken Thompson 和 Dennis Ritchie在Unix上进行编辑操作时,他们看起来是这样的:

ed不允许你在开放缓冲区的其他行中进行行编辑,或是移动光标,因为ed在每次你修改它的时候都要重新打印整个文件。那时是在1969年,ed没有任何机制来“清除”屏幕的内容,因为屏幕只是一张纸,任何东西都是用墨水输出的。在必要时,你可以使用list命令(l)来要求ed打印出一个范围内的所有行,但大多数情况下,你都在操作那些你看不到的文本。因此使用ed就像是,你在用一个快没有电的手电筒在一间漆黑的房子里试图寻找到来时的路一样。你只能一次看到这么多,必须尽最大努力去记住所有东西的位置。

这是一个真实的ed 会话的例子。(在字符#之后)我添加了注释,解释了每一行的作用,但是即使这些真的都被输入进去,ed也不会认为他们是注释并且会开始抱怨:

正如你所看到的,ed并不是一个特别适合交互的程序。

Bill Joy写了一个文本编辑器

对Thompson 和 Ritchie来说,ed使用起来很顺手。有一些人则发现它很难用,并且它作为Unix对新手不友好的一个典型示例而获得了一些不好的名声。1975年,一个名叫George Coulouris的人在伦敦玛丽女王学院安装了一个改进版的ed。Coulouris利用他在玛丽女王学院观看视频展示的机会,编写了他自己的编辑器。与ed不同的是,Coulouris的程序允许用户在屏幕上编辑一行后,通过按键来切换行(想象一下每次在一行上使用Vim)。Coulouris将他的项目称为em,或者叫做“凡人的编辑器”。Thompson随后拜访了玛丽女王学院,见到了Coulouris已经开发的程序,并嗤之以鼻,说他并不需要在编辑文件的时候同时看到它的状态。这给了Coulouris很大的启发进行后续开发。

1976年,Coulouris将em带到了加州大学伯克利分校。在那里他作为计算机科学学院的访问者度过了一整个夏天。这距离Ken Thompson离开伯克利去贝尔实验室工作有整整十年之久。在伯克利,Coulouris遇到了Bill Joy,那时Bill Joy还是伯克利软件发行公司(BSD)的一名研究生。Coulouris向Joy展示了em。那之后,Joy从Coulouris的源代码开始,开发了一个改进版的ed,名为ex。在1978年,第一个版本的ex与第一个版本的BSD Unix捆绑在一起发行。ex在很大程度上与ed兼容,但它又增加了两种模式:一种“开放”模式,它支持像em那样的单行编辑,以及一种“可视化”模式,它占据了整个屏幕,并支持像我们今天所习惯的整个文件的实时编辑。

在1979年的第二个BSD发行版中,引入了一个名为vi的可执行文件,相比于ex,它在可视化模式下可以做的更多。

ex/vi(此后的vi)初步建立了现在我们与Vim的大多数约定,而这些约定并不是ed的一部分。Joy使用的视频终端是一台Lear Siegler ADM-3A,它搭配一个没有光标键的键盘。相对的,是将箭头画在h,j,k和l键,这就是为什么Joy会在vi里使用这些键来移动光标。在ADM-3A键盘上的escape键也就是今天我们使用的tab键,这解释了这样一个难于触及的键为什么会分配给一个常用的操作-退出。前缀命令的字符:也来自vi,常规模式下(即运行ex进入的模式)使用:作为一个提示。这解决了一个长期以来被忽略的关于ed的抱怨。在视觉模式下,保存和退出会涉及到经典的输入命令:wq。“Yanking”和“putting”标记,以及设置选项的set命令都是原始vi的一部分,我们在Vim中文本编辑过程中使用的特性在很大程度上是vi的特性。

vi是除ed之外的唯一一个与BSD Unix捆绑在一起的文本编辑器,在那个时候,Emacs可能要花费数百美元(这是在GNU Emacs出现之前),所以vi变得非常流行。但是vi是ed的直系后代,这意味着如果没有AT&T的源码许可证,源代码是不能被修改的。这促使一些人创建了vi的开源版本,STEVIE(VI爱好者的ST编辑器)出现在1987年,Elvis出现在1990年,nvi出现在1994年。其中一些克隆版添加了额外的功能,如语法高亮和分割窗口。尤其是Elvis将其许多功能整合到Vim中,因为许多Elvis的用户都在背后推动它们的加入。

Bram Moolenaar开发了Vim

“Vim”,现在是“Vi改进者”的缩写,最初含义是“Vi模拟者”。和其他许多vi克隆产品一样,Vim最开始尝试在一个vi不支持的平台上复制vi。在荷兰芬洛的一家影印公司工作的荷兰软件工程师Bram Moolenaar需要一个像vi一样的东西来完成他全新的Amiga 2000。Moolenaar从他大学时期起,就习惯在Unix系统上使用vi,所有操作对他来说都是易如反掌。所以在1988年,利用现有的STEVIE vi克隆作为起点,Moolenaar开始了对Vim的研究。

Moolenaar可以有机会接触到STEVIE,那是因为STEVIE之前曾出现在一个叫做弗雷德鱼磁盘的东西上。弗雷德鱼磁盘是一种软盘,某位不知名的美国程序员每个月都会为Amiga平台精选一些优秀的开源软件并放在弗雷德鱼磁盘上。任何人都可以请求获得一张磁盘,而且邮资接近于无。有好几个版本的STEVIE曾经在弗雷德鱼磁盘上发布。Moolenaar使用的版本是在弗雷德鱼磁盘256上发布的(令人失望的是,弗雷德鱼磁盘似乎与弗雷德鱼没有任何关系)。

Moolenaar对STEVIE爱不释手,但他很快就注意到这其中缺失了许多vi命令。因此,在Vim的第一个发布版本中,Moolenaar将vi的兼容性作为最高优先级。其他人编写了一系列的vi宏,将其运行在一个vi-兼容的编辑器中时,可以用来解决一个随机生成的迷宫。Moolenaar能够让这些宏同样也能在Vim中运行。1991年,Vim第一次以“Vi模仿者”的方式发布在Fred Fish磁盘591上。Moolenaar添加了一些新特性(包括多级撤销和编译器错误的“quickfix”模式),这意味着Vim已经超过了Vi,但是Vim仍然是“Vi模仿者”,直到1993年通过FTP发布了Vim 2.0。

在各种互联网合作者的帮助下,Moolenaar在一些稳定的版本中对Vim加入了一些功能。Vim 2.0引入了对wrap选项的支持,以及对长行文本的水平滚动。Vim 3.0增加了对分割窗口和缓冲区的支持,这是一个受vi克隆版nvi启发的特性。Vim现在还是将每个缓冲区保存到交换文件中,这样即使Vim崩溃,经过编辑的文本还可以存活。Vimscript第一次出现在Vim 5.0中,并支持语法高亮显示。与此同时,Vim的受欢迎程度也在不断增长。它被移植到MS-DOS,到Windows,到Mac,甚至到Unix,在那里它与原来的vi进行竞争。

2006年,Vim被Linux杂志读者评为最受欢迎的编辑器。现在,根据Stack Overflow的2018年开发者调查,Vim是最流行的文本模式(即终端模拟器)编辑器,在所有软件开发人员中有25.8%的人(和sysadmin/devops人员的40%)使用过Vim。在20世纪80年代末和整个90年代,程序员们进行了“编辑器战争”,这使得Emacs用户与vi(以及最终的Vim)用户之间产生了激烈的冲突。虽然Emacs肯定还有一些追随者,但更多的人认为编辑器的战争已经结束,而结果就是Vim赢了。2018年Stack Overflow开发者调查支持了这一说法;只有4.1%的受访者还在使用Emacs。

Vim是如何变得如此成功的?这很明显,人们喜欢Vim提供的特性。而且我认为,Vim背后的悠久历史表明,它本身比它的功能集有着更多的优势。Vim的代码库可以追溯到1988年,那时正是Moolenaar开始研究它。另一方面,“wq文本编辑器”——一个关于Unix-y文本编辑器应该如何工作的更广泛的愿景——甚至可以追溯到半个世纪前。“wq文本编辑器”有着一些与众不同的具体表达方式,但在一定程度上要感谢Bill Joy和Bram Moolenaar对向后兼容性的特别关注,优秀的想法是被积累起来的。从这个意义上说,“wq文本编辑器”是运行时间最长、最成功的开源项目之一,它享受到了计算机世界中一些最伟大思想的无私贡献。我不认为“创业公司应抛弃所有的先例,去创造颠覆性的新软件”的开发方法都是不好的,但Vim提醒我们,这种协作和增量法也能创造奇迹。

英文原文:https://twobithistory.org/2018/08/05/where-vim-came-from.html

译者:任宇は神様

转自:Python 程序员

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181008B1I5D600?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券