剑网3指尖江湖职业推荐 www.1468054.com

我最近無意中發現一個名為Intel HEX的文件格式。據我所知,Intel HEX文件(使用.hex后綴)是通過將二進制文件變為十六進制數據來降低它的不可讀性。明顯它們由那些編寫微控制器程序或者將數據刻錄到ROM中的人使用。無論如何,當我首次使用Vim打開一個十六進制文件,我感到震驚。至少對我來說,這種文件格式非常深奧,但是Vim已經對其了如指掌。每行十六進制文件都分成不同區域——Vim已經先一步為每一個字段都標記了不同的顏色。set ft? 我敬畏地問道。filetype-hex,Vim得意地回答。

Vim無處不在。這么多人都在使用它,像對十六進制文件的支持并不值得驚訝。Vim是Mac OS的預裝程序,而且在Linux世界廣泛應用。它甚至對討厭它的人來說都很熟悉,由于很多熱門的命令行工具都默認讓用戶進入Vim,以至于那些未入門的人會被困到Vim中,這已經變成了一個熱門問題。有一些主流網站,包括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 年間的伯克利分時系統編寫的。1Thompson 抵達貝爾實驗室后所做的第一件事就是為麻省理工學院兼容的分時系統重寫了 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”命令?!癥anking”和“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 贏了。162018 Stack Overflow 開發者調查顯示這是真的;只有 4.1% 的受訪者使用過 Emacs。

Vim是如何變得如此成功的?顯然人們喜歡Vim所提供的功能。但我認為,Vim背后的悠久歷史表明它擁有比其功能集更多的優勢。Vim的代碼庫可以追溯到1988年,當時Moolenaar開始致力于此。另一方面,“wq文本編輯器” – 一個關于Unix風格的文本編輯器應該如何工作的更寬泛視角 – 可以追溯到半個世紀之前?!皐q文本編輯器”有一些不同的具體表達方式,但部分歸功于Bill Joy和Bram Moolenaar對后向兼容性的特別關注,隨著時間的推移逐漸積累了好的想法。從這個意義上說,“wq文本編輯器”是運行時間最長、最成功的開源項目之一,享用了計算機世界一些最偉大的思想家的貢獻。我不認為“初創公司 – 拋棄所有先例 – 并創造 – 破壞性 – 全新-軟件”的發展方法必然是壞事,但Vim提醒世人:協作和增量方法也可以產生奇跡。

余下全文(1/3)

本文最初發表在oschina,文章內容屬作者個人觀點,不代表本站立場。

分享這篇文章:

請關注我們:

發表評論

電子郵件地址不會被公開。 必填項已用*標注