内容简介:我们用它,我们恨它,最终我们又离不了它,这就是vi。历史的道路不是涅瓦大街上的人行道,它完全是在田野中前进的,有时穿过尘埃,有时穿过泥泞,有时横渡沼泽,有时行经丛林。—- 车尔尼雪夫斯基
我们用它,我们恨它,最终我们又离不了它,这就是vi。
历史的道路不是涅瓦大街上的人行道,它完全是在田野中前进的,有时穿过尘埃,有时穿过泥泞,有时横渡沼泽,有时行经丛林。—- 车尔尼雪夫斯基
当我们每天打开电脑,使用 vi 的时候,一切显得是那么顺理成章,觉得 vi
这个编辑器从古老的 Unix
走来,似乎理所应当地成为我们系统中的默认编辑器,却不知道它曾经经历了怎样的曲折甚至是九死一生。我们用它,我们恨它,最终我们又离不了它,这就是 vi
。
混沌初开
1964
年,一个 21
岁的年轻人 Butler Lampson 从哈佛大学文学院毕业,来到加州大学伯克利分校读博,在这里,他遇到了另一个天才少年, 18
岁的 Peter Deutsch 在这里读本科,他们的任务是共同为一台 SDS-940
电脑编写一个分时操作系统:
在当时,绝大部分计算机使用的都是批处理方式运行指令,一个用户的使用是独占式的,在他的程序运行期间不会被别的程序打断。而 Butler Lampson
他们编写的操作系统是第一款通用型的分时操作系统。因此他们需要编写一个内核和一个命令行界面,需要可以能够编辑文本,所以他们开发了一个小程序叫做 QED
,它的名称的来源是 Quick Editor
( 快速编辑器 )。
除此之外, Butler Lampson
的贡献还包括后来在施乐公司期间领导开发了 Alto
,这个操作系统就是日后激发乔布斯灵感并从施乐偷师学艺的那一款操作系统。并且 Butler
本人在 1992
年获得了计算机学界最高奖 图灵奖 。
这时候,加州大学伯克利分校的另一个天才少年 Ken Thompson (这个名字日后将如雷贯耳,因为是他发明了 Unix
),刚刚获得了电子工程学士学位,一年后,获得了计算机科学硕士学位,并拿到了贝尔实验室的 Offer
。
在贝尔实验室, Ken
的工作之一是把他母校的 QED
移植到另一个比较大型的分时操作系统 CTSS
上, 只不过这个 CTSS
是另一个学校的产物——麻省理工学院。在移植的过程中, Ken
加入了他当时正在研究的,也是他最喜欢的 Regular Expression
( 正则表达式 )。在此过程中, Ken
对 QED
变得非常熟悉。
Ken
最终在 1969
年发明了 Unix
,而 Unix
系统中一个重要组件是 ed
,这个 ed
的很多功能直接来源于 Ken
的母校加州大学伯克利分校的 QED
。由 ed
而又衍生出来了一系列著名的 Unix
命令,例如 grep
和 sed
。 grep
这个名词的来源其实是 g/re/p
,第一个字母 g
代表 global
( 全局检索 ), re
代表 regular express
( 正则表达式 ),而 p
表示 print
( 显示 )。 sed
里面则加入了很多 ed
里没有实现的 script
( 脚本 )功能。
至此, ed
已经成为 Unix
操作系统的标配。
我们来看一下一个标准的 ed
的编辑界面(下文标黑的粗体字是屏幕显示的内容,其余是用户输入的命令):
a ed is the standard Unix text editor. This is line number two. . 2i
. ,l ed is the standard Unix text editor.$ $ This is line number two.$ 3s/two/three/ ,l ed is the standard Unix text editor.$ $ This is line number three.$ w text 65 q
是不是已经看到了一些 vi
的影子了呢?只是这时的 ed
还只是一个行编辑器,远远不是后来 vi
的样子。
脱胎换骨
在 Ken
发明 Unix
的 6
年之后, 1975
年,他回到母校伯克利分校,这一次,他的使命是在伯克利分校的电脑系统上安装他自己发明的 Unix
,而这一套 Unix
日后将成为 Unix
界极富盛名的 BSD
( Berkeley Software Distribution
, 伯克利软件套装 )。也就是这一年的夏天, Ken
在伯克利分校遇到了我们故事的主人公 Bill Joy ,那一年, Bill
是 21
岁,正在伯克利分校读研。
Bill
后来回忆说:
Ken Thompson
来到伯克利并且带来了一台坏掉的 Pascal
系统,而我们准备在那个暑期修好它。当我们对它进行修理时,发现我们正在使用的名为 ed
的编辑器完全无法使用了。
由于 Unix
系统的广为流行,远在伦敦玛丽王后大学担任讲师的 George Coulouris 也不得不使用 ed
,但他得出的结论是: ed
的难用程度达到了神级,根本就不是给人用的。所以他开始着手改进 ed
,并把改进之后的软件版本起名为 em
( editor for mortal
给人类使用的编辑器 )。 1976
年夏天, George
访问伯克利分校,他带着一卷磁带,里面包含了他的 em
代码,并演示给别人看。其他人对此不感兴趣,而 Bill Joy
对此很受启发,他要来了 em
的源码,并在此基础上不断做改进,起名为 en
,然后又在 en
的基础上不断改进,一直改进到了 ex
(中间是否还有 eo
, ep
, eq
, …已经不得而知)。
1977
年 10
月, Bill Joy
在 ex
的基础上,增加了全屏幕显示的功能,并将此功能命名为 ex
的可视化模式( visual mode
),别名—— vi
。
因为 Bill Joy
在开发 vi
的时候用的是一台 ADM-3A
电脑:
而这台电脑的键盘排布方式是这样的:
这个键盘上并没有上下左右方向键,而上下左右键是印在了 HJKL
这四个字母上,通过按下 Ctrl+HJKL
来实现上下左右移动,所以 vi
里的上下左右是通过 HJKL
来实现的,和游戏玩家里热爱的 WASD
是如此不同,以至于很多人认为这是一种反人类的设计。但你们要知道, WASD
是 很多很多年之后才被大多数人接受的设置 。
在当时的各款主流电脑上,方向键要么没有,要么也是一字排开。例如苹果的 Apple II
系统:
同时还应该注意到, ADM-3A
电脑键盘上 Esc
键的位置有多么特殊,就在 Q
键的左侧,正好是我们目前 Tab
键的位置,简直是触手可及,所以 vi
用它来做模式切换键是非常自然,而不像现在的 Esc
键离我们的手那么远,要把小指伸出去很远才能够得到。
还有一个细节是在 ADM-3A
键盘上,除了上下左右四个键外,还有一个 Home
键,它也可以通过按下 Ctrl
来实现回到行头的效果,而更关键的是这个键同时也是 ~
键,这也就是为什么 Unix
系统里会用 ~
来代表 home
目录的原因。
黯淡时光
vi
的第一个正式版本是在 1978
年 3
月随着 BSD 1.0
同时发布的,这注定了它以后将走过一段不平凡的岁月。
Bill Joy
继续对 vi
进行升级,中间经过无数次叠代,在 1979
年 6
月发表了 vi
的 2.7
版本后,退出主要开发者行列,但仍持续贡献到 1980
年 8
月的 3.5
版本,从那以后彻底淡出。在谈到他为什么要退出 vi
开发者行列时,他说:
我希望我们没有用尽键盘上的每一个键。我觉得 vi
一个最有趣的特点是它是一款基于模式的编辑器。作为一款基于模式的编辑器, vi
做的非常棒。 EMACS
的优点之一是它是一款无模式的编辑器。但我从来没有想过要把 vi
做成 EMACS
那样。我也不擅长于优化 vi
的代码。我觉得编辑器的重绘功能非常棘手。 vi
完成它目前的工作非常不错,但你总是在学习的过程中编写程序……所以我不再继续这样做了。 实际上,我当时正在试图给 vi
加上多窗口编辑的功能,那是 1978
年的 12
月。我的磁带机坏了,而我没有任何备份。我的代码都丢失了,而我连文件目录都没有。我必须重写关于多窗口编辑功能的所有代码,我放弃了。我退回到上一版本,给代码增加了一些说明文档,完成了用户手册,然后就退出了。如果不是那一次事故的话,也许 vi
就会有多窗口编辑功能了,但,谁知道呢? vi
的最根本问题是它没有鼠标,所以才有了各式各样的命令。但你不能用现在的眼光去看当时的软件。我觉得如果能加上多级回退这个功能也很不错。但无论如何, vi
的内核实际上还是 ed
,你不可能脱离这个事实。 这就有点像用一层层纸包裹起来的糖果,它没有一个统一的概念。我觉得如果可以回到过去,我不会回去重新再来一遍。
1982
年 2
月 24
日, 3
个斯坦福大学毕业的学生 Vinod Khosla , Andy Bechtolsheim 和 Scott McNealy 创办了 Sun
公司,他们挖来了伯克利分校毕业的 Bill Joy
,从而导致伯克利分校 Unix
BSD
的 vi
被锁死在 3.7
版本上。其他各家商业公司,包括 IBM
, Sun
, HP
, DEC
都能在 Bill Joy
开发的 vi
的代码基础之上做改进,但其他人却不可以了。因为 AT&T
开始了那场臭名昭著的官司,控告 BSD
侵犯了他们的知识产权,而 vi
是基于 BSD
里面的 ed
做开发的,也属于被禁止使用之列。
关于这场官司,详细情况可以看阮一峰的文章《 Unix 版权史 》。阮一峰在文章中评论道:
AT&T
与 BSD
之间的诉讼,是当代版权制度最恶劣的应用之一。 为什么这么说? 首先,起诉者其实与 Unix
毫无关系。这是 AT&T
经理层的决定,而不是开发者的决定。事实上,包括 Ken Thompson
在内的技术人员一直希望,公司能够公开源码。他们完全有理由这么要求,因为 Unix
从来不是 AT&T
的业务重点,最初是个人项目,后来也没有占用公司太多资源。销售 Unix
的利润,在公司全部业务中,几乎可以忽略不计。为了一点点钱,去打击一个使许多人受益的产品,何必这样做呢。 其次, AT&T
根本不关心 Unix
的发展。它真正关心的是金钱和削弱对手。 1994
年,官司还没有结束,它就把 Unix
卖给了 Novell
公司,从此不再与 Unix
发生关系,官司也因此不了了之。既然你不想要这个产品,为什么要提起诉讼呢?真是不可理解。 最后,所谓的侵权几乎是不存在的。因为 Novell
从 AT&T
买下 Unix
版权后,检查了 BSD
的源码,在 18000
个组成文件中删除了 3
个,并对其他文件做了一些小修改,然后 BSD
就重新获得了自由发布源码的许可。这意味着,至多只有千分之一的 BSD
代码有版权问题,但是就因为这千分之一的问题,导致百分之百的产品被迫中断,完全不符合比例原则。 所以,这场版权官司就是一家利益至上的公司,以微不足道的理由,为了一个自己根本不在乎的产品,悍然发动一场损人不利己的战争。
BSD
在法律纠纷中艰难前行,并分裂出了 3
个版本分支: FreeBSD
, NetBSD
和 OpenBSD
。而在此之前,乔布斯黯然离开苹果,开始自己的第二次创业的时候,开发的 NexT
操作系统,也是从 BSD
上拉的分支,最后还吸取了很多 FreeBSD
的成果,最后成就了今天的 Mac OSX
,以及你手机里使用的 iOS
。
凤凰涅磐
在这场旷日持久的官司当中, vi
不能用了,但是 vi
的热爱者并不愿意切换到 emacs
上,直到 1990
年, Steve Kirkendall
才发布了一个 vi
的克隆版,起名叫 Elvis
。 1992
年, Elvis
被纳入 BSD
, 1994
年, Keith Bostic 在 Elvis
基础上开发了 nvi
,一直沿用至今。
花开两朵,各表一枝。 1991
年,芬兰大学生 Linus Torvalds ,他想学习 Unix
,但是买不起工作站,就自己写了一个能在 386
上运行的操作系统内核,并以自己的名字命名为: Linux
。 Linus Torvalds
后来说:
如果我早知道 BSD
没有法律问题,并且可以被移植到 386
,我会加入 BSD
的开发,而不会自己动手写一个。
Linus
写的 Linux
并不是一个完整的操作系统,它只是一个内核,在内核之外,还应该有像 vi
这样的编辑器。于是在 2000
年 6
月, Gunnar Ritter
基于 Bill Joy
的 vi
源代码,把 vi
发布到了 Linux
操作系统和 FreeBSD
操作系统上(这时候的 BSD
由于法律诉讼的原因已经被拆分成了 FreeBSD
, NetBSD
和 OpenBSD
三个分支)。一开始,这又是一个违法的举动,因为 Ritter
根本就没有获得 AT&T
的授权,但是随着 2002
年 1
月,对相关授权限制的逐渐解除,这个版本才正式成为一个合法的版本,也就是我们今天使用的 Linux
上的 vi
。
然而,令人唏嘘的是,虽然现在 vi
已经可以用在 BSD
的直系后裔 FreeBSD
上了,但是 FreeBSD
已经有了自己的替代品 nvi
,不愿再使用 vi
。反倒是那些一开始没有 vi
的 Unix
版本,例如 HP-UX
, AIX
等等,可以继续堂而皇之地使用 vi
。
虽然如此,但是由于 Linux
的普及,以及 Mac OSX
这个 BSD
的变种的流行, vi
依然成为了各大操作系统中事实上的标配。 vi
这个编辑器的王者称号当之无愧,并将随着开源软件的发展一直永远流传。
最后,让我们记住 vi
的作者 Bill Joy
。是他,给我们带来了 vi
。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX编程艺术
Eric S. Raymond / 姜宏、何源、蔡晓俊 / 电子工业出版社 / 2011-1 / 69.00元
本书主要介绍了Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验,由公认的Unix编程大师、开源运动领袖人物之一Eric S. Raymond倾力多年写作而成。包括Unix设计者在内的多位领域专家也为本书贡献了宝贵的内容。本书内容涉及社群文化、软件开发设计与实现,覆盖面广、内容深邃,完全展现了作者极其深厚的经验积累和领域智慧。一起来看看 《UNIX编程艺术》 这本书的介绍吧!