歷史的道路不是涅瓦大街上的人行道,它徹底是在田野中前進的,有時穿過塵埃,有時穿過泥濘,有時橫渡沼澤,有時行經叢林。---- 車爾尼雪夫斯基
當咱們天天打開電腦,使用vi的時候,一切顯得是那麼瓜熟蒂落,以爲vi
這個編輯器從古老的Unix
走來,彷佛理所應當地成爲咱們系統中的默認編輯器,殊不知道它曾經經歷了怎樣的曲折甚至是九死一輩子。咱們用它,咱們恨它,最終咱們又離不了它,這就是vi
。html
1964
年,一個21
歲的年輕人Butler Lampson從哈佛大學文學院畢業,來到加州大學伯克利分校讀博,在這裏,他遇到了另外一個天才少年,18
歲的Peter Deutsch在這裏讀本科,他們的任務是共同爲一臺SDS-940
電腦編寫一個分時操做系統:正則表達式
在當時,絕大部分計算機使用的都是批處理方式運行指令,一個用戶的使用是獨佔式的,在他的程序運行期間不會被別的程序打斷。而Butler Lampson
他們編寫的操做系統是第一款通用型的分時操做系統。所以他們須要編寫一個內核和一個命令行界面,須要能夠可以編輯文本,因此他們開發了一個小程序叫作QED
,它的名稱的來源是Quick Editor
(快速編輯器)。express
除此以外,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
的編輯界面(下文標黑的粗體字是屏幕顯示的內容,其他是用戶輸入的命令):ui
a
ed is the standard Unix text editor.
This is line number two.
.
2ispa
.
,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
。