歷史的道路不是涅瓦大街上的人行道,它完全是在田野中前進的,有時穿過塵埃,有時穿過泥濘,有時橫渡沼澤,有時行經叢林。---- 車爾尼雪夫斯基
當我們每天打開電腦,使用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
。