翻譯 | Vim 的起源

我最近無意中發現一個名為Intel HEX的檔案格式。據我所知,Intel HEX檔案(使用.hex字尾)是通過將二進位制檔案變為十六進位制資料來降低它的不可讀性。明顯它們由那些編寫微控制器程式或者將資料刻錄到ROM中的人使用。無論如何,當我首次使用Vim開啟一個十六進位制檔案,我感到震驚。至少對我來說,這種檔案格式非常深奧,但是Vim已經對其瞭如指掌。每行十六進位制檔案都分成不同區域——Vim已經先一步為每一個欄位都標記了不同的顏色。set ft? 我敬畏地問道。filetype-hex,Vim得意地回答。
Vim無處不在。這麼多人都在使用它,像對十六進位制檔案的支援並不值得驚訝。Vim是Mac OS的預裝程式,而且在Linux世界廣泛應用。它甚至對討厭它的人來說都很熟悉,由於很多熱門的命令列工具都預設讓使用者進入Vim,以至於那些未入門的人會被困到Vim中,這已經變成了一個 ofollow,noindex" target="_blank">熱門問題 。有一些主流網站,包括Facebook,當你按下j鍵之後,頁面會滾到下面,而當按下k鍵則會滾到上面——Vim在數字文化中的廣泛傳播達到了意想不到的程度。
Vim仍然很神祕。例如,它不像React,每個人都知道它是由Facebook開發和維護的,Vim沒有明確的作者。儘管它是如此的普遍和重要,卻沒有任何型別的委員會或組織來為Vim做決策。你可能花了幾分鐘來瀏覽 Vim網站 ,但是卻找不到關於誰建立了Vim或者為什麼創造它的有效資訊。如果你啟動Vim時沒有提供檔案引數,你會看到Vim的啟動資訊,說的是Vim是由“Bram Moolenaar等人”開發的。但是沒有更多資訊。誰是Bram Moolenaar,他的神祕同盟都有誰?
當我們在提問的時候,也許更重要的是,為什麼退出Vim需要輸入:wq?沒錯,這是一個“寫(write)”操作,後面還跟了一個“退出(quit)”操作,但是這並不是一個特別直觀的慣例。誰來決定當複製文字的時候應該呼叫“複製命令(yanking)”?為什麼:%s/foo/bar/gc是“查詢並替換”的縮寫?Vim的用法太隨意了,看起來沒有好好決策,但是它們到底源於何處?
情況往往如此,問題答案源自於古老的計算機構,貝爾實驗室。從某種意義上來說,Vim只是一個軟體——名為“wq檔案編輯器”——的最新版本,它從Unix時代開始已經持續開發並完善。
Ken Thompson 寫了一個行編輯器(Line Editor)
1966年,貝爾實驗室騁請了 Ken Thompson。Thompson 剛剛在加州大學伯克利分校獲得了電子工程和電腦科學碩士學位。在那裡,他使用了一個叫 QED 的檔案編輯器,這是為 1965 年至 1966 年間的伯克利分時系統編寫的。 1 Thompson 抵達貝爾實驗室後所做的第一件事就是為麻省理工學院相容的分時系統重寫了 QED。後來他為 Multics 專案編寫了另一個版本的 QED。在此過程中,他擴充套件了程式,以便使用者可以搜尋檔案中的行並使用正則表示式進行替換。 2
Multics 專案,跟伯克利分時系統(Berkeley Timesharing System)一樣,旨在建立一個商業上可行的分時作業系統,由麻省理工學院、通用電氣和貝爾實驗室之間協作進行。AT&T 最終認為該專案前途堪憂而選擇退出。Thompson 和貝爾實驗室的研究員 Dennis Ritchie,當時沒有訪問分時系統的許可權,失去了這種系統帶來的“互動式計算感”,於是著手建立自己的版本,最終在 1969 年 8 月被稱為 Unix 3。當時他的妻子和年少的兒子正在加里福尼亞度假,Thompson 將新系統的基本元件整合到一起,分配開發作業系統、shell、編輯器、彙編程式的時間為每週一項。 4
編輯器被命名為 ed。它基於 QED,但不是一個完全的重新實現。Thompson 決定放棄某些 QED 特性。對正則表示式的支援被削減,因此只能理解相對簡單的正則表示式。QED 允許使用者通過開啟多個緩衝區並同時編輯多個檔案,但是 ed 同時只能使用一個緩衝區工作。而且 QED 可以執行一個包含命令的緩衝區,而 ed 則不會這樣做。這些簡化是需要的。Dennis Ritchie 表示,沒有 QED 的高階正則表示式並“沒有太大的損失”。 5
ed 現在是 POSIX 規範的一部分,所以如果你有一個符合 POSIX 標準的系統,你可以將它安裝到你的計算機上。這值得一試,因為許多 ed 的命令都是今天的 Vim 的一部分。舉例來說,為了將緩衝區的內容寫入磁碟,你需要使用 w 命令;為了退出編輯器,你需要使用 q 命令。這兩個命令可以同時寫到同一行 —— 即 wq。與 Vim 相似,ed 是一個模態編輯器;從命令模式進入輸入模式,你可以使用插入命令(i),追加命令(a),或者修改命令(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 寫了一個文字編輯器
ed 對於 Thompson 和 Ritchie 來說已經足夠用了。不過其他人覺得它很難使用,並因其成為 Unix 對新手來說很困難的一個特別典型例子而出名。 6 1975年,一個叫 George Coulouris 的人在倫敦瑪麗皇后學院安裝的 Unix 系統上開發了 ed 的一個改進版。Coulouris 利用他在瑪麗皇后學院得到的視訊顯示來編寫他的編輯器。Coulouris 的程式允許使用者在螢幕上編輯某一行,在這一行上進行碼字(想像一下在一行上使用 VIM)。Coulouris 將他的程式稱為 em,或者“普通人的編輯器”,這是他在 Thompson 訪問了瑪麗皇后學院後受到的啟發,據說 Thompson 看到了 Coulouris 構建的程式,然後駁回了它,並說他在編輯的時候不需要看檔案的狀態。 7
1976年,Coulouris 帶著 em 到了加州大學伯克利分校,在這裡,他在計算機學院度過了一個夏天。這距 Ken Thompson 離開加州大學伯克利分校到貝爾實驗室工作已經整整十年。在加州大學伯克利分校,Coulouris 遇到了 Bill Joy,一個在伯克利軟體發行版(BSD)工作的研究生。Coulouris 向 Joy 展示了 em,Joy 從 Coulouris 的原始碼開始,開發了一個 ed 的改進版,被稱為 ex,意思是“擴充套件的 ed”。ex 的 1.1 版本與1978年第一版 BSD Unix 捆綁在一起。ex 在很大程度上與 ed 相容,但是它添加了兩個模式:一個“open”模式,它可以進行單行編輯,就像在 em 中一樣,還有一個“visual”模式,接管了整個螢幕,並啟用了我們今天習慣的整個檔案的實時編輯。
對於 1979 年釋出的第二個 BSD 版本,引入了一個名叫 vi 的可執行程式,它只能在可視模式下開啟 ex。 8
ex/vi(以下稱為 vi)定義了現在我們使用 Vim 的大多數規則,這些規則已經不是 ed 的一部分。Joy 使用的視訊終端是 Lear Siegler ADM-3A,它有一個沒有游標的鍵盤。取而代之的是在 h,j,k,和 l 鍵的地方繪製了一個箭頭,這就是 Joy 在 vi 中使用這些鍵來移動游標的原因、ADM-3A 鍵盤上的退出鍵也是今天我們可以找到 tab 鍵的地方,它解釋瞭如何為這樣一個難以觸及的鍵分配了一個與退出模式相同的操作。命令的字首冒號“:”也是來自於 vi,在常規模式下(即執行 ex 後進入的模式)使用冒號“:”作為提示。這解決了關於 ed 的長期抱怨,曾經的 ed 在這種情況下是不會提示使用者的。在可視模式下,儲存和退出現在可以輸入經典的“:wq”命令。“Yanking”和“puts”標記以及用於設定選項的 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 使用者都為此做出了努力。 9
Bram Moolenaar 編寫了 Vim
“Vim”,現在可稱為“Vi Improved”(Vi改進版),原來也被稱為“Vi Imitation”(Vi模擬版)。與許多其它 vi 克隆版一樣,Vim 的初衷是嘗試複製 Vi,使其在不支援 Vi 的平臺上使用。Bram Moolenaar,一位在荷蘭芬洛一家影印公司工作的軟體工程師,想要為他的全新 Amiga 2000 提供類似 vi 的東西。Moolenaar 已經習慣於在他的大學的 Unix 系統上使用 vi,現在已經熟練到“就像在使用他的手指”。 10 因此,在 1988 年,使用現有的 vi 克隆版 STEVIE 作為起點,Moolenaar 開始開發 Vim。
Moolenaar 使用 STEVIE,是因為 STEVIE 之前曾出現在 Fred Fish 磁碟上。Fred Fish 是一名美國程式設計師每個月選擇 Amiga 平臺上最好的開源軟體,放到一張軟盤上並寄出。任何人都可以請求索取磁碟,而僅僅只需要郵費。STEVIE 的若干個版本在 Fred Fish Disk 上被髮布。Moolenaar 使用的版本已在 Fred Fish Disk 256 上釋出。 11 (令人失望的是,Fred Fish Disk 似乎與 Freddi Fish 無關)。
Moolenaar 喜歡 STEVIE,但是他很快發現缺少了許多 vi 命令。 12 因此,對於 Vim 的第一個版本,Moolenaar 將 vi 相容性作為他的首要任務。其他人編寫了一系列 vi 巨集,當通過正確的 vi 相容編輯器執行時,可以解決 隨機生成的迷宮 。Moolenaar 能夠讓這些巨集在 Vim 中執行。1991年,Vim 首次釋出於 Fred Fish Disk 591 中,被稱為“Vi Imitation”。 13 Moolenaar 添加了一些功能(包括多級撤消和編譯錯誤的“quickfix”模式),這意味著 Vim 超越了 vi。但是 Vim 在 1993 年通過 FTP 釋出 Vim 2.0 之前,一直保持著“Vi Imitation”的名字。
在各種網際網路合作者的偶爾幫助下,Moolenaar 為 Vim 增加了一些穩定的功能。Vim 2.0 引入了對 wrap 選項的支援以及通過長行文字的水平滾動。Vim 3.0 增加了對分割視窗和緩衝區的支援,這一功能的靈感來自 vi,克隆了 nvi。Vim 現在還將每個緩衝區儲存到交換檔案中,以便編輯後的文字可以在崩潰中存活。Vimscript 首次亮相於 Vim 5.0,同時支援語法高亮。一直以來,Vim 的受歡迎程度都在增長。它被移植到 MS-DOS,Windows,Mac,甚至 Unix,在以上作業系統與原始的 vi 競爭。
2006年,Vim 被《Linux Journal》讀者選為最受歡迎的編輯工具。 14 今天,根據 Stack Overflow 的 2018 年開發者調查,Vim 是最受歡迎的文字模式(即終端模擬器)編輯器,25.8% 的軟體開發者使用它(和 40% 的系統管理員/DevOps 工程師)。 15 有一段時間,在20世紀80年代後期和整個20世紀90年代,程式設計師發起了“編輯器戰爭”,使得 Emacs 使用者與 vi(以及最終的Vim)使用者進行了對抗。雖然 Emacs 肯定還會繼續發展,但有些人認為編輯大戰已經結束,Vim 贏了。 16 2018 Stack Overflow 開發者調查顯示這是真的;只有 4.1% 的受訪者使用過 Emacs。
Vim是如何變得如此成功的?顯然人們喜歡Vim所提供的功能。但我認為,Vim背後的悠久歷史表明它擁有比其功能集更多的優勢。Vim的程式碼庫可以追溯到1988年,當時Moolenaar開始致力於此。另一方面,“wq文字編輯器” – 一個關於Unix風格的文字編輯器應該如何工作的更寬泛視角 – 可以追溯到半個世紀之前。“wq文字編輯器”有一些不同的具體表達方式,但部分歸功於Bill Joy和Bram Moolenaar對後向相容性的特別關注,隨著時間的推移逐漸積累了好的想法。從這個意義上說,“wq文字編輯器”是執行時間最長、最成功的開源專案之一,享用了計算機世界一些最偉大的思想家的貢獻。我不認為“初創公司 – 拋棄所有先例 – 並創造 – 破壞性 – 全新-軟體”的發展方法必然是壞事,但Vim提醒世人:協作和增量方法也可以產生奇蹟。