Vim 的起源介紹

導讀Vim 無所不在且受衆極其廣泛,以至於其支持 HEX 文件也應該在預料之中。Mac OS 中預裝了 Vim,同時,Linux 世界中也有很多 Vim 的支持者。即使那些討厭 Vim 的人也對它很熟悉,因爲太多的流行命令行工具默認使用 Vim,不熟悉 Vim 的用戶往往身陷其中,這已經變成了一個meme。

我最近偶然發現了一種名爲 Intel HEX 的文件格式。據我所知,Intel HEX 文件(使用.hex擴展名)通過將二進制圖像編碼成十六進制數字行,使二進制圖像不那麼晦澀難懂。顯然,當人們需要對微控制器進行編程或者將數據燒錄進 ROM 時會用到這種文件。無論如何,當我第一次在 Vim 中打開一個 HEX 文件時,我發現了一些震驚的東西。至少對我來說,這種文件格式是非常深奧難懂的,但 Vim 已經掌握了它。HEX 文件的每一行都是一條被劃分爲不同字段的記錄—— Vim 已經預先將每個字段顯示成不同的顏色。set ft 嗎? 我充滿敬畏地發問。filetype=hex,Vim 得意地回答。

Vim 無所不在且受衆極其廣泛,以至於其支持 HEX 文件也應該在預料之中。Mac OS 中預裝了 Vim,同時,Linux 世界中也有很多 Vim 的支持者。即使那些討厭 Vim 的人也對它很熟悉,因爲太多的流行命令行工具默認使用 Vim,不熟悉 Vim 的用戶往往身陷其中,這已經變成了一個meme。包括 Facebook 在內的一些大型網站,當你按下 j 鍵時,會向下滾動,而當你按下 k 鍵時,會向上滾動——這意味着 Vim 通過數字文化傳播達到了難以想象的高水準。

然而,Vim 也是謎一般的存在。例如,與人盡皆知的由 Facebook 開發和維護的 React 不同,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 到 1966 年間被開發用於伯克利分時系統。 Thompson 到達貝爾實驗室後做的第一件事就是爲麻省理工學院兼容分時系統重寫 QED。他後來又爲 Multics 項目寫了另一個版本的QED。在重寫過程中,他對程序進行了擴展,以便用戶可以在文件中搜索某一行,並使用正則表達式進行替換。

與伯克利的分時系統一樣,由麻省理工學院、通用電氣和貝爾實驗室合作的 Multics 項目試圖創建一個可行的商業分時操作系統。最終,AT&T 認爲這個項目毫無進展並退出。在沒有分時系統的情況下,Thompson 和貝爾實驗室資深研究員 Dennis Ritchie,開始懷念分時系統所提供的“交互式計算的感覺”,並着手創建他們自己的版本,該版本最終發展成爲 Unix。3 1969 年 8 月,在妻子和幼子外出去加州度假時,Thompson “給操作系統、shell、編輯器和彙編程序分別分配了一個星期”,將新系統的基本組件組合在一起。

這個編輯器被稱爲 ed 。它是基於 QED 的,但並不完全是 QED 的復現。 Thompson 決定放棄某些 QED 的功能,弱化了對常規的表達式的支持,因此 ed 只能理解相對簡單的正則表達式。QED 允許用戶打開多個緩衝區同時編輯多個文件,但是 ed 一次只使用一個緩衝區。QED 可以執行包含命令的緩衝區,而 ed 則不能。這些簡化可能是必要的。Dennis Ritchie 曾說過,去掉 QED 的高級正則表達式是“並不大的損失”。

ed 現在是 POSIX 規範的一部分,所以如果你有一個符合 POSIX 的系統,你的電腦上就安裝了 ed 。現在,許多 ed 命令都是 Vim 的一部分,因此,這就值得擺弄一番了。例如,你必須使用 w 命令來寫入磁盤緩衝區,必須使用 q 命令來退出編輯器。這兩個命令可以寫在同一行命令中,也就是 wq。ed 與 Vim 一樣,是一個模態編輯器;若要從命令模式進入輸入模式,取決於你試圖如何轉換文本,需使用 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 沒有任何機制來“清除”屏幕上的內容,因爲”屏幕“就是一張紙,所有已經輸出的東西都像是已經用墨水打印出來了。在必要的時候,你可以使用列表命令(l)要求 ed 打印出一系列的行,但是大多數時候,你都是在你看不到的文本上操作。因此,使用 ed 就像是嘗試用一個低電量的手電筒在黑暗房間中摸索。每次你只能看到那麼一點兒,所以必須盡最大努力去記住每件東西的位置。

下面有一個 ed 會話的例子。我添加了註釋(在字符 #之後)來解釋了每一行,不過如果這些註釋真的被輸入,ed 並不會把它們當作註釋並且會報錯:

[sinclairtarget 09:49 ~]$ ed
i # Enter input mode
Hello world!
Isn't it a nice day?
. # Finish input
1,2l # List lines 1 to 2
Hello world!$
$
2d # Delete line 2
,l # List entire buffer
Hello world!$
Isn't it a nice day?$
s/nice/terrible/g # Substitute globally
,l
Hello world!$
Isn't it a terrible day?$
w foo.txt # Write to foo.txt
38 # (bytes written)
q # Quit
[sinclairtarget 10:50 ~]$ cat foo.txt
Hello world!
Isn't it a terrible day?

正如你所看到的,ed 並不是一個特別友好的程序。

Bill Joy 創建了文本編輯器

對 Thompson 和 Ritchie 來說, ed 已經足夠好了。但是其他人則認爲它很難用,而且它作爲一個淋漓盡致地表現 Unix 對新手敵意的例子而臭名昭著。6在 1975 年,一個名叫 George Coulouris 的人在倫敦瑪麗皇后學院的 Unix 系統上開發了一個改進版 ed 。Coulouris 利用他在瑪麗女王學院的視頻顯示器開發他的編輯器。與 ed 不同的是,Coulouris 的程序允許用戶編輯在屏幕中的一行代碼,通過一次次擊鍵的方式來操作行(想象一下在 Vim 中每次編輯一行)。 Thompson 拜訪瑪麗女王學院時,看到 Coulouris 已經寫好的程序,駁斥道他不需要在編輯文件的時候看到它的狀態。受此啓發,Coulouris 將他的程序命名爲 em,或者“爲凡人而生的編輯器”。

1976年,Coulouris 把 em 引入了加州大學伯克利分校,在那裏他用了一個夏天的時間在 CS 系訪學。這是 Ken Thompson 離開伯克利去貝爾實驗室工作十年之後的事了。在伯克利,Coulouris 遇到了 Bill Joy,一名伯克利軟件發行公司(BSD)的研究生。Coulouris 斯向Joy 展示了 em, Joy 以 Coulouris 的源代碼爲基礎,爲擴展 ed 建立了一個名爲 ex 的改進版 ed。1978年,1.1 版本的 ex 與第 1 個版本的 BSD Unix 捆綁在一起。ex 在很大程度上與 ed 兼容,但它增加了兩種模式:一種“開放”模式,這種模式可以使 em 單行編輯成爲可能,還有一種“可見”模式,這種模式會佔據整個屏幕,並且可以像我們今天所習慣的那樣,對整個文件進行實時編輯。

1979 年的第 2 版 BSD 引入了一個名爲 vi 的可執行文件,它只在可視模式下打開 ex 。

ex/vi (後來稱爲 vi)建立了我們現在使用的 Vim 中大多數的約定,但這些約定當時並不是 ed 的一部分。Bill Joy 使用的視頻終端是 Lear Siegler ADM-3A,它的鍵盤沒有光標鍵。而是, h、j、k 和 l 鍵上繪製光標鍵,所以 Bill Joy 在vi 中就使用這些鍵來進行光標移動。ADM-3A 鍵盤上 escape 鍵位置是今天我們所使用的鍵盤上的 tab 鍵,這也就解釋了爲什麼這樣一個難以夠着的鍵會被用來實現像退出當前模式這麼常見的操作。前綴命令的” :”字符同樣也來自 i,它在常規模式下(即運行 ex 進入的模式)使用 : 作爲提示。這解決了一個 ed 中被長期詬病的問題,也就是一旦啓動之後,沒有任何反饋信息向用戶致以問候。在可見模式下,保存和退出需要使用現在仍在使用的經典 wq。“Yanking”和“puttng”、標記、以及用於設置選項的 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 的一個嘗試。在荷蘭 Venlo 一家影印公司工作的軟件工程師 Bram Moolenaar 想要爲他全新的 Amiga 2000 準備一款類似於 vi 的編輯器。Moolenaar 已經習慣了在大學時使用的 Unix 系統上的 vi ,當時他 已經對vi瞭如指掌。10 所以在 1988 年,Moolenaar 使用當時的 STEVIE vi克隆版本開始在 Vim 上工作。

Moolenaar 接觸到 STEVIE 緣於其曾經出現在一個叫 Fred Fish 的磁盤上。Fred Fish 是一名美國程序員,每個月都會寄出一張軟盤,內含爲 Amiga 平臺提供的精選可用開源軟件。任何人只要支付郵費就可以得到一張這樣的磁盤。有若干版本的 STEVIE 曾在 Fred Fish 磁盤上發佈。Moolenaar 使用的 STEVIE 版本在 Fred Fish 256 號磁盤上發佈。

Moolenaar 喜歡 STEVIE,但很快就注意到其缺失了很多 vi 命令。因此,在第一次發佈 Vim 時,Moolenaar 優先考慮了 vi 的兼容性。當時已經有其他人編寫了一系列的 vi 宏,當運行一個合適的 vi 兼容編輯器時,可以求解一個隨機生成的迷宮。Moolenaar 能夠讓這些宏在 Vim 中運行。1991年,Vim 以 Vi模擬爲名第一次發佈於 Fred Fish 591 號磁盤。13Moolenaar 添加了一些特性(包括多級撤銷和解決編譯器錯誤的“quickfix”模式),這意味着 Vim 已經完成了對 Vi 的超越。在 1993 年通過 FTP 發佈 Vim 2.0 之前,Vim 都仍以 Vi模擬 的身份存在。

在衆多互聯網合作者的幫助下,Moolenaar 穩健地在 Vim 中加入了一些功能。Vim 2.0 引入了對wrap選項的支持,以及對長行文本進行水平滾動的支持。受到了vi克隆nvi的啓發,Vim 3.0 增加了對分割窗口和緩衝區的支持。Vim 現在還將每個緩衝區保存到交換文件中以避免程序崩潰造成文件丟失。Vimscript 支持語法高亮顯示,第一次出現是在 Vim 5.0 中。與此同時,Vim 的受歡迎程度也在不斷增長。它被移植到 MS-DOS、 Windows、Mac,甚至被移植到 Unix 與原來的 vi競爭。

2006 年,Vim 被Linux Journal 讀者評爲最受歡迎的編輯器。如今,根據 2018 年 Stack Overflow 的開發者調查,Vim 是最受歡迎的文本模式(即終端模擬器)編輯器,受用於 25.8% 的軟件開發人員(和 40% 的 Sysadmin / DevOps 人員)。15 在 1980 年代末和整個 1990 年代,程序員一度發起了“編輯器戰爭”,將 Emacs 用戶與 vi (即最終的 Vim )用戶進行了對比。雖然 Emacs 肯定仍有一些追隨者,但有些人認爲編輯器戰爭已經以 Vim 獲勝而結束。16 2018年 Stack Overflow 的開發者調查顯示只有 4.1% 的受訪者使用 Emacs,也驗證了這個事實。

Vim 是如何變得如此成功的?顯然,人們喜歡 Vim 所提供的特性。但我認爲,Vim 背後的悠久歷史表明了它的優勢遠不僅僅體現在其功能集上。Vim 的代碼庫可以追溯到 1988 年,當時 Moolenaar 開始研究它。另一方面,“ wq 文本編輯器”——關於 Unix-y 文本編輯器應該如何工作的更廣泛的願景——可以追溯到半個世紀以前。“ wq 文本編輯器”有一些不同的具體表達方式,但在某種程度上要感謝 Bill Joy 和 Bram Moolenaar 對向後兼容性非比尋常的關注,才使好的想法逐漸積累起來。從這個意義上說,“ wq 文本編輯器”是運行時間最長、最成功的開源項目之一,得益於計算機世界中一些最偉大的思想貢獻。我不認爲“創業公司無視所有先例來創造顛覆性的新軟件”的開發方式都是不妥的,但 Vim 提醒我們,這種協作和增量的方式同樣能產生奇蹟。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章