vim 的誕生

原文:Where Vim Came From

翻譯:batkiz & RUInsYi @ Par-Tuner

我最近偶然發現了一個名為 Intel HEX 的文件格式。據我所瞭解,Intel HEX 文件(使用 .hex 擴展名),將二值圖像編碼為一行一行的十六進制數字,為了使它們更透明。顯然它們被應用於單片機編程或將數據燒錄進 ROM。無論如何,當我第一次在 Vim 中打開一個 HEX 文件時,我發現了一些令人震驚的事。這個文件格式——至少對我來說——非常難懂,但 Vim 已經知道了有關它的一切。HEX 文件的每一行都是一個被分為不同字段的記錄——Vim 已經先我一步為每一字段著了色。我敬畏地問道,set ft?。filetype=hex,Vim 得意洋洋地回答。

Vim 無處不在。它被無數人使用,因此對 HEX 文件的支持並不令人意外。Vim 在 Mac OS 上被預裝,且在 Linux 世界有著大批擁躉。甚至討厭它的人也對其非常熟悉,大多數命令行工具會默認將用戶扔向 Vim,以至於被困在 Vim 中的新手已經成為了一個梗。很多的網站,包括 Facebook,會在你按 j 鍵時向下滾動,按 k 鍵時向上——Vim 在數字文化中奇蹟般以高水準傳播。

然而 Vim 還是一個謎。不像 React,每個人都知道它被 Facebook 開發與維護,Vim 並沒有明顯的贊助者。儘管它極為普遍和重要,仍沒有任何形式的委員會或組織機構為 Vim 的事宜做決定。你可以花費幾分鐘在 Vim 官網 上閒逛,卻不會在誰創造了 Vim 或者為什麼創造了 vim 上得到更好的結果。如果你徑直打開 Vim,不加任何文件參數,你就會看到 Vim 的啟動信息,稱 Vim 被“Bram Moolenaar 等人”開發。但這也僅止於此。誰是 Bram Moolenaar,誰又是他暗中的合作伙伴?

可能更重要的是,當我們在問問題時,為什麼退出 Vim 需要鍵入 :wq?當然,這是一個“寫入”操作,其後是“退出”操作,但這並不是一個特別直觀的約定。又是誰決定複製文本應被稱為“yanking”?(譯註:在 Emacs 中,"yanking" 代表的是粘貼(或者說,重新插入剛才刪掉的內容),而並不是複製。)為什麼 :%s/foo/bar/gc 是“查找並替換”的簡稱?Vim 的特質看起來太武斷了,但它們又從何而來呢?

答案是,事實通常如此,這些開始於初始之計算機的火爐,貝爾實驗室。某種意義上,Vim 僅僅是一個軟件作品——被稱為“wq 文本編輯器”——最新的迭代。這個軟件自 Unix 紀元的黎明開始就不斷地被開發和改進。

Ken Thompson 與一個行編輯器

1966 年,貝爾實驗室僱傭了 Ken Thompson。Thompson 剛在加州大學伯克利分校完成了電子工程與計算機科學方向的碩士學位。在那裡,他用過一個名為 QED 的文本編輯器,這個編輯器在 1965 年與 1966 年之間為伯克利分時系統而寫。1 Thompson 在到達貝爾實驗室後的頭等要事便是為 MIT 相容分時系統重寫了 QED。後來他會為了 Multics 計劃而編寫另一個版本的 QED。期間,他擴展了程序以使得用戶能夠在一個文件中搜索行,並使用正則表達式進行替換。

2

Multics 計劃,與伯克利分時系統相似,尋求於創造一個商業上可行的分時操作系統,是 MIT,通用電氣及貝爾實驗室間的合作產物。AT&T 最終認定這個計劃沒有進展並選擇退出。Thompson 與他的同事——貝爾實驗室研究員 Dennis Ritchie,現在沒有了分時系統,失去了系統所提供的“交互式計算的感覺”,便開始著手製作他們自己的版本——最終會聞名為 Unix。3 1969 年八月,在他的妻子與兒子在加利福尼亞度假時,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 時,他們看起來像是這樣:

vim 的誕生

Ken_Thompson_(sitting)andDennis_Ritchie_at_PDP

ed 不允許你在打開的緩衝區裡的其他行中編輯恰當的行,或者是移動光標,因為每當你改變了文件,ed 會必須重印整個文件。1969 年並沒有讓 ed“清除”屏幕上內容的機制,因為屏幕其實僅僅是一張紙,輸出的所有東西都已經被墨水印到了紙上。如有必要,你可以使用列出命令(l)讓 ed 為你打印出一行行內容,但大多數時間你都在操控著你不能看見的文本。因此使用 ed 就像是在一個昏暗的房子裡用著一個幾乎沒電的手電筒,嘗試著找對路。你一次能看到如此多東西,所以你必須盡你所能來記住一切都在哪裡。

下面是一個 ed 會話的例子。我已經添加了註釋(在 # 標記之後)來解釋每行的用途,儘管 ed並不會將輸入的這些識別為註釋且會報錯:

[sinclairtarget 09:49 ~]$ ed
i # 進入輸入模式
Hello world!
Isn't it a nice day?
. # 結束輸入
1,2l # 列出1、2行
Hello world!$
$
2d # 刪除第 2 行
,l # 列出整個緩衝區
Hello world!$
Isn't it a nice day?$
s/nice/terrible/g # 全局替換

,l
Hello world!$
Isn't it a terrible day?$
w foo.txt # 寫入 foo.txt
38 # (寫入的字節數)
q # 退出
[sinclairtarget 10:50 ~]$ cat foo.txt
Hello world!
Isn't it a terrible day?

正如你所見到的,ed 並不是一個特別健談的程序。

ed 對 Thompson 和 Ritchie 來說完全夠用。其他人則認為其難於使用,並且它成為了 Unix 對新手的敵意的一個臭名昭著的例子。6 1975 年,一個名叫 George Coulouris 的男子在倫敦瑪麗王后大學的 Unix 系統上開發了 ed 的一個改進版本。Coulouris 寫了他的編輯器是為了利用他在倫敦瑪麗王后大學能獲得的顯示屏。不像 ed,Coulouris 的程序允許用戶編輯屏幕上恰當的一行,通過一下下的擊鍵來在行間移動(想象下你一次只在一行裡使用 Vim)。Coulouris 稱他的程序為 em,或稱"editor for mortals(模式編輯器)",這可能是在 Thompson 造訪倫敦瑪麗王后大學,見了 Coulouris 所寫的程序並駁斥之,稱他不需要在編輯一個文件時查看它的狀態之後。

1976 年,Coulouris 帶著 em 到了加州大學伯克利分校,他在那裡作為計算機科學系的訪問者待了一整個夏天。這剛好是在 Ken Thompson 離開伯克利前往貝爾實驗室的十年之後。在伯克利,Coulouris 見到了 Bill Joy,一個正在工作於伯克利軟件套件(BSD)的研究生。Coulouris 給 Joy 展示了 em,Joy 便在 Coulouris 的源代碼上開始構建 ed 的一個改進版本,稱之為 ex,即"extended ed(擴展版 ed)"。1978 年,ex 的 1.1 版本與 BSD 的首個發佈版本捆綁釋出。ex 很大程度上與 ed 兼容,但添加了兩個模式:一個“打開”模式,啟用與 em 上相似的單行編輯;一個“可視”模式,接管整個屏幕並允許我們像今天那樣實時編輯整個文件。

在 1979 年 BSD 的第二個發佈版本中,一個名為 vi 的可執行程序被引進,它能比可視模式的 ex 做的稍多一些。

ex/vi(自此以後便是 vi)確立了很多不是 ed 一部分但我們現在在用的大部分約定。Joy 使用的視頻終端是一臺 Lear Siegler ADM-3A,其鍵盤上沒有方向鍵。作為替代,箭頭被印在 h, j, k 與 l 鍵上,這便是為何 Joy 使用這些按鍵作為 vi 中的光標移動。ADM-3A 鍵盤上的 ESC 鍵則位於如今的 Tab 鍵的位置上,這解釋了為何一個極其難按到的按鍵會被分配為常用到的退出一個模式的操作。使用 : 字符作為命令前綴也是來自 vi,在正常模式(也就是運行 ex 進入的模式)中使用 : 作為提示。這解決了 ed 中存在已久的一個抱怨,即,一旦啟動,用戶只會得到徹底的沉默。在可視模式,保存並退出現在是鍵入經典的 :wq。"Yanking" 與 "putting"(譯註:即複製與粘貼)出現了,且 set 命令打開設置選項都是最初的 vi 的一部分。我們現在在 Vim 中使用的基本的文本編輯功能大部分都是 vi 的功能。

vim 的誕生

LSI-ADM3A-full-keyboard

vi 是 BSD 上除了 ed 唯一捆綁安裝的文本編輯器。在那時,Emacs 需要花費數百美元(這是在 GNU Emacs 出現之前),所以 vi 變得極其流行。但 vi 是 ed 的直接後代,這意味著如果沒有 AT&T 的源代碼許可,源代碼不能被改動。這使幾個人創造了 vi 的開源版本。1987 年 STEVIE (ST Editor for VI Enthusiasts)(為 vi 愛好者的 ST 編輯器)出現了,Elvis 出現在 1990 年,nvi 則在 1994 年出現。這些克隆中的某些添加了額外的功能,例如語法高亮顯示與分割窗口。因為很多 Elvis 用戶的推動,Elvis 的許多功能被合併進了 Vim。

Bram Moolenaar 與 Vim

Vim,現在是"Vi Improved"的縮寫,最初卻意味著"Vi Imitation"(Vi 的模仿)。如同許多其他的 vi 克隆,Vim 最初是一個 vi 不能工作的平臺上的移植。Bram Moolenaar,一個在荷蘭芬洛的一個複印機公司工作的荷蘭工程師,想要在他全新的 Amiga 2000 上擁有一個像 vi 一樣的東西。Moolenaar 在大學時代已習慣於在 Unix 系統上使用 vi,且它現在“瞭如指掌”。7 所以在 1988 年,以已存在的 vi 克隆 STEVIE 作為起點,Moolenaar 開始著手於 Vim。

Moolenaar 已經有了 STEVIE,因為 STEVIE 已在一個叫 Fred Fish disk 的東西上出現了。Fred Fish 是一個美國程序員,每個月都會寄出一個軟盤,其中是 Amiga 平臺上可用的最好的開源軟件的輯選。每個人都能要一份,只需付出郵費而已。Moolenaar 使用的版本是在 Fred Fish disk 256 上發佈的版本。

8(很遺憾,看起來 Fred Fish disk 與 Freddi Fish 並沒有什麼關係。)

Moolenaar 很喜歡 STEVIE 但很快就注意到很多 vi 命令缺失了。9 所以,在 Vim 的首個發佈版本中,Moolenaar 將與 vi 的兼容作為首要工作。有人曾寫了一系列的 vi 宏,在一個與 vi 正確兼容的編輯器上運行時,能解決一個 隨機生成的迷宮。Moolenaar 能使這些宏在 Vim 上工作。1991 年,Vim 在 Fred Fish disk 591 上第一次以"Vi Imitation"發佈。10 Moolenaar 已經添加了一些功能(包括多級撤銷,與對編譯錯誤的"quickfix"模式),這意味著 Vim 已經超越了 vi。但 Vim 會保持"Vi Imitation"直到 1993 年通過 FTP 發佈的 Vim 2.0。

Moolenaar 在許多網上合作者的偶爾協助下,以穩健的步伐給 Vim 添加功能。Vim 2.0 引入了 wrap 選項與較長行內水平滾動的支持。Vim 3.0 添加了對分割窗口與緩衝區的支持,這些功能來自 vi 的克隆 nvi。Vim 現在也能將每個緩衝區存入一個交換文件,所以已更改的文本能在崩潰中倖免於難。Vimscript 在 Vim 5.0 中首次出現,一同出現的還有對語法高亮顯示的支持。在這期間,Vim 的流行程度一直在增長。它被移植到 MS-DOS, Windows, Mac, 甚至 Unix,在其上 Vim 與最初的 vi 相競爭。

2006 年,在 Linux Journal 讀者中,Vim 被投票為最流行的編輯器。11 如今,根據 Stack Overflow 的 2018 年開發者調查,Vim 是最流行的文本模式(即終端模擬器)編輯器,被所有軟件開發者中的 25.8% 所使用(以及 40% 的系統管理員/運維)。

12 從 1980 年代末期,貫穿整個 90 年代的時間裡,程序員們發起了“編輯器戰爭”,使 EMacs 與 vi (後來變成了 Vim)用戶相鬥爭。儘管 Emacs 還有著一批追隨者,一些人認為編輯器戰爭已經結束且 Vim 勝利了。13 2018 年 Stack Overflow 開發者調查佐證了這一說法;只有 4.1% 的調查對象使用 Emacs。

Vim 是怎麼變得這麼成功的?很明顯人們喜歡 Vim 提供的功能。但我認為 Vim 背後悠久的歷史說明了它有著比之功能更多的好處。回溯 Vim 的代碼庫,只是到達 1988 年 Moolenaar 開始在其上工作。"wq text editor"在另一方面——一個類似 Unix 環境的文本編輯器該如何工作的宏大願景——已走過半個世紀。"wq text editor" 有著幾種不同的表達,但幸虧 Bill Joy 與 Bram Moolenaar 兩人對兼容性不同尋常的注重,好的想法隨著時間不斷積累。某種意義上,"wq text editor" 是運行時間最長的、最成功的開源項目之一,享受著計算機世界最偉大思想的貢獻。我並不認為“初創公司拋棄先例創造了製造混亂的軟件”的開發方式一定很壞,但 Vim 證明了以合作與遞增的方式也能創造奇蹟。


  1. Butler Lampson, “Systems,” Butler Lampson, accessed August 5, 2018, http://bwlampson.site/Systems.htm.
  2. Dennis Ritchie, “An Incomplete History of the QED Editor,” accessed August 5, 2018, https://www.bell-labs.com/usr/dmr/www/qed.html.
  3. Peter Salus, “The Daemon, the GNU, and the Penguin,” Groklaw, April 14, 2005, accessed August 5, 2018, http://www.groklaw.net/article.php?story=20050414215646742.
  4. ibid.(譯註:同上)
  5. Dennis Ritchie, “An Incomplete History of the QED Editor,” accessed August 5, 2018, https://www.bell-labs.com/usr/dmr/www/qed.html.
  6. Donald Norman, “The Truth about Unix: The User Interface Is Horrid,” Datamation, accessed August 5, 2018, http://www.ceri.memphis.edu/people/smalley/ESCI7205_misc_files/The_truth_about_Unix_cleaned.pdf.
  7. Bram Moolenaar, “Vim 25” (lecture, Zurich, November 2, 2016), December 13, 2016, accessed August 5, 2018, https://www.youtube.com/watch?v=ayc_qpB-93o&t=4m58s
  8. ibid(譯註:同上). (?t=6m15s)
  9. ibid(譯註:同上). (?t=7m6s)
  10. “Fish Disks 1 - 1120,” Amiga Stuff, accessed August 5, 2018, http://www.amiga-stuff.com/pd/fish.html.
  11. “2005 Linux Journal Reader’s Choice Awards,” Linux Journal, September 28, 2005, accessed August 5, 2018, https://www.linuxjournal.com/article/8520#N0x850cd80.0x87983bc.
  12. “Stack Overflow Developer Survey 2018,” Stack Overflow, accessed August 5, 2018, https://insights.stackoverflow.com/survey/2018/#development-environments-and-tools.
  13. Bruce Byfield, “The End of the Editor Wars,” Linux Magazine, May 11, 2015, accessed August 5, 2018, http://www.linux-magazine.com/Online/Blogs/Off-the-Beat-Bruce-Byfield-s-Blog/The-End-of-the-Editor-Wars.


分享到:


相關文章: