歡迎光臨
每天分享高質量文章

一文帶你瞭解 Vim 的起源

(點選上方公眾號,可快速關註)


編譯:伯樂線上/Abandon_first 

http://blog.jobbole.com/114461/


我最近偶然發現了一種名為 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 在內的一些大型網站,當你按下 鍵時,會向下滾動,而當你按下 鍵時,會向上滾動——這意味著 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。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 命令來退出編輯器。這兩個命令可以寫在同一行命令中,也就是 wqed 與 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 對新手敵意的例子而臭名昭著。在 1975 年,一個名叫 George Coulouris 的人在倫敦瑪麗皇后學院的 Unix 系統上開發了一個改進版 ed 。Coulouris 利用他在瑪麗女王學院的影片顯示器開發他的編輯器。與 ed 不同的是,Coulouris 的程式允許使用者編輯在螢幕中的一行程式碼,透過一次次擊鍵的方式來操作行(想象一下在 Vim 中每次編輯一行)。 Thompson 拜訪瑪麗女王學院時,看到 Coulouris 已經寫好的程式,駁斥道他不需要在編輯檔案的時候看到它的狀態。受此啟發,Coulouris 將他的程式命名為 em,或者“為凡人而生的編輯器”。

(George Coulouris)

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 單行編輯成為可能,還有一種“可見”樣式,這種樣式會佔據整個螢幕,並且可以像我們今天所習慣的那樣,對整個檔案進行實時編輯。

(Bill Joy)

1979 年的第 2 版 BSD 引入了一個名為 vi 的可執行檔案,它只在可視樣式下開啟 ex 。

ex/vi (後來稱為 vi)建立了我們現在使用的 Vim 中大多數的約定,但這些約定當時並不是 ed 的一部分。Bill Joy 使用的影片終端是 Lear Siegler ADM-3A,它的鍵盤沒有游標鍵。而是,hj和 上繪製游標鍵,所以 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瞭如指掌。所以在 1988 年,Moolenaar 使用當時的 STEVIE vi克隆版本開始在 Vim 上工作。

(Bram Moolenaar,2006 年加入 Google)

Moolenaar 接觸到 STEVIE 緣於其曾經出現在一個叫 Fred Fish 的磁碟上。Fred Fish 是一名美國程式員,每個月都會寄出一張軟盤,內含為 Amiga 平臺提供的精選可用開源軟體。任何人只要支付郵費就可以得到一張這樣的磁碟。有若干版本的 STEVIE 曾在 Fred Fish 磁碟上釋出。Moolenaar 使用的 STEVIE 版本在 Fred Fish 256 號磁碟上釋出。(令人失望的是,Fred Fish 磁碟似乎與 Freddi Fish 沒有任何關係。)

Moolenaar 喜歡 STEVIE,但很快就註意到其缺失了很多 vi 命令。因此,在第一次釋出 Vim 時,Moolenaar 優先考慮了 vi 的相容性。當時已經有其他人編寫了一系列的 vi 宏,當執行一個合適的 vi 相容編輯器時,可以求解一個隨機生成的迷宮。Moolenaar 能夠讓這些宏在 Vim 中執行。1991年,Vim 以 Vi模擬為名第一次釋出於 Fred Fish 591 號磁碟。Moolenaar 添加了一些特性(包括多級撤銷和解決編譯器錯誤的“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 人員)。在 1980 年代末和整個 1990 年代,程式員一度發起了“編輯器戰爭”,將 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 提醒我們,這種協作和增量的方式同樣能產生奇跡。

推薦閱讀(點選圖片可跳轉閱讀)


【關於投稿】


如果大家有原創好文投稿,請直接給公號傳送留言。


① 留言格式:
【投稿】+《 文章標題》+ 文章連結

② 示例:
【投稿】《不要自稱是程式員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/

③ 最後請附上您的個人簡介哈~


覺得本文有幫助?請分享給更多人

關註「演演算法愛好者」,修煉程式設計內功

贊(0)

分享創造快樂