當前位置:
首頁 > 知識 > Vim是從何而來:智慧積累的偉大力量

Vim是從何而來:智慧積累的偉大力量


我最近偶然間發現了一種名為Intel HEX的文件格式。據我所知,為了使二進位圖像不那麼容易被破解,Intel HEX文件(擴展名為.hex)將它們編碼成多行十六進位數字。顯然,它們是供程序微控制器開發者或是需要將數據燒成ROM的人使用的,無論如何,當我第一次在Vim中打開一個HEX文件時,我發現了一些令人震驚的東西。這種文件格式,至少對我來說,是極其深奧的,但Vim卻是對這種文件格式了如指掌。一個HEX文件的每一行都是一個記錄,只是被劃分為不同的欄位——Vim已經搶先一步將每個欄位塗成不同的顏色。

set ft?

我敬畏的詢問。

filetype=hex

,Vim得意洋洋的回答道。



Vim無處不在。太多的人使用過它,像是支持HEX文件這種事根本算不上是一個驚喜。Vim被預裝在Mac OS上,同時在Linux世界中有著一大批擁躉。即使那些討厭它的人對它也很是熟悉,因為有足夠多的主流命令行工具會在默認情況下把用戶扔到Vim中,以至於外行人被困在Vim中不知所措,彷彿vim是一種病毒一樣。有一些主流的網站,包括Facebook,當你按下j鍵時,頁面會向下滾動,當你按下k鍵時會向上滾動——這種不可思議現象正是Vim通過數字文化廣泛傳播的高水位標誌。




然而,Vim也是一個謎。比如說React,每個人都知道它是由Facebook開發和維護的,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年到1960年之間為伯克利分時系統編寫的。在到達貝爾實驗室後,湯普森做的第一件事就是為麻省理工學院兼容的分時系統重寫QED。他後來又為Multics項目寫了另一個版本的QED。在此過程中,他擴展了程序,使用戶可以在文件中搜索行,並使用正則表達式進行替換。




Multics項目,和伯克利分時系統一樣,試圖創造一個商業上可行的分時操作系統,它的合作夥伴包括麻省理工學院、通用電氣和貝爾實驗室。AT&T最終認為這個項目毫無進展並終止了它。Thompson和他的同事,貝爾實驗室資深研究員Dennis Ritchie,因為苦於沒有一個分時系統以及懷念互動式計算的「感覺」,所以決定著手創建他們自己的版本,這就是世人所熟知的Unix。 1969年8月,在妻子和年幼的兒子外出加州度假時, Thompson將新系統的基本組件拼湊在一起,各花了一周時間來配置出了操作系統,命令解析器,編輯器和彙編程序。



編輯器被命名為ed,它是基於QED的,但並不是一個完全的重新實現。Thompson決定放棄某些QED功能。削減了對正則表達式的支持,只支持相對簡單的正則表達式。QED允許用戶通過打開多個緩衝區同時編輯多個文件,但是ed只會一次使用一個緩衝區。QED可以執行包含命令的緩衝區,而ed不會這樣做。這些簡化也許是有意為之的。Dennis Ritchie曾說過,沒有QED的高級正則表達式「並不是很大的損失」。




ed現在是POSIX規範的一部分,所以如果你有一個符合POSIX的系統,你可以在那台計算機上安裝它。它還是值得一用的,因為時至今日,許多ed命令都成為了Vim的一部分。例如,為了給磁碟寫一個緩衝區,你必須使用w命令。為了退出編輯器,你必須使用q命令。這兩個命令可以同時在同一行上使用——因此,wq產生了。像Vim一樣,ed是一個模態編輯器;要從命令模式進入輸入模式,你需要使用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沒有任何機制來「清除」屏幕的內容,因為屏幕只是一張紙,任何東西都是用墨水輸出的。在必要時,你可以使用list命令(l)來要求ed列印出一個範圍內的所有行,但大多數情況下,你都在操作那些你看不到的文本。因此使用ed就像是,你在用一個快沒有電的手電筒在一間漆黑的房子里試圖尋找到來時的路一樣。你只能一次看到這麼多,必須盡最大努力去記住所有東西的位置。




這是一個真實的ed 會話的例子。(在字元#之後)我添加了注釋,解釋了每一行的作用,但是即使這些真的都被輸入進去,ed也不會認為他們是注釋並且會開始抱怨:


正如你所看到的,ed並不是一個特別適合交互的程序。




Bill Joy寫了一個文本編輯器




對Thompson 和 Ritchie來說,ed使用起來很順手。有一些人則發現它很難用,並且它作為Unix對新手不友好的一個典型示例而獲得了一些不好的名聲。1975年,一個名叫George Coulouris的人在倫敦瑪麗女王學院安裝了一個改進版的ed。Coulouris利用他在瑪麗女王學院觀看視頻展示的機會,編寫了他自己的編輯器。與ed不同的是,Coulouris的程序允許用戶在屏幕上編輯一行後,通過按鍵來切換行(想像一下每次在一行上使用Vim)。Coulouris將他的項目稱為em,或者叫做「凡人的編輯器」。Thompson隨後拜訪了瑪麗女王學院,見到了Coulouris已經開發的程序,並嗤之以鼻,說他並不需要在編輯文件的時候同時看到它的狀態。這給了Coulouris很大的啟發進行後續開發。




1976年,Coulouris將em帶到了加州大學伯克利分校。在那裡他作為計算機科學學院的訪問者度過了一整個夏天。這距離Ken Thompson離開伯克利去貝爾實驗室工作有整整十年之久。在伯克利,Coulouris遇到了Bill Joy,那時Bill Joy還是伯克利軟體發行公司(BSD)的一名研究生。Coulouris向Joy展示了em。那之後,Joy從Coulouris的源代碼開始,開發了一個改進版的ed,名為ex。在1978年,第一個版本的ex與第一個版本的BSD Unix捆綁在一起發行。ex在很大程度上與ed兼容,但它又增加了兩種模式:一種「開放」模式,它支持像em那樣的單行編輯,以及一種「可視化」模式,它佔據了整個屏幕,並支持像我們今天所習慣的整個文件的實時編輯。




在1979年的第二個BSD發行版中,引入了一個名為vi的可執行文件,相比於ex,它在可視化模式下可以做的更多。




ex/vi(此後的vi)初步建立了現在我們與Vim的大多數約定,而這些約定並不是ed的一部分。Joy使用的視頻終端是一台Lear Siegler ADM-3A,它搭配一個沒有游標鍵的鍵盤。相對的,是將箭頭畫在h,j,k和l鍵,這就是為什麼Joy會在vi里使用這些鍵來移動游標。在ADM-3A鍵盤上的escape鍵也就是今天我們使用的tab鍵,這解釋了這樣一個難於觸及的鍵為什麼會分配給一個常用的操作-退出。前綴命令的字元:也來自vi,常規模式下(即運行ex進入的模式)使用:作為一個提示。這解決了一個長期以來被忽略的關於ed的抱怨。在視覺模式下,保存和退出會涉及到經典的輸入命令:wq。「Yanking」和「putting」標記,以及設置選項的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。在荷蘭芬洛的一家影印公司工作的荷蘭軟體工程師Bram Moolenaar需要一個像vi一樣的東西來完成他全新的Amiga 2000。Moolenaar從他大學時期起,就習慣在Unix系統上使用vi,所有操作對他來說都是易如反掌。所以在1988年,利用現有的STEVIE vi克隆作為起點,Moolenaar開始了對Vim的研究。




Moolenaar可以有機會接觸到STEVIE,那是因為STEVIE之前曾出現在一個叫做弗雷德魚磁碟的東西上。弗雷德魚磁碟是一種軟盤,某位不知名的美國程序員每個月都會為Amiga平台精選一些優秀的開源軟體並放在弗雷德魚磁碟上。任何人都可以請求獲得一張磁碟,而且郵資接近於無。有好幾個版本的STEVIE曾經在弗雷德魚磁碟上發布。Moolenaar使用的版本是在弗雷德魚磁碟256上發布的(令人失望的是,弗雷德魚磁碟似乎與弗雷德魚沒有任何關係)。




Moolenaar對STEVIE愛不釋手,但他很快就注意到這其中缺失了許多vi命令。因此,在Vim的第一個發布版本中,Moolenaar將vi的兼容性作為最高優先順序。其他人編寫了一系列的vi宏,將其運行在一個vi-兼容的編輯器中時,可以用來解決一個隨機生成的迷宮。Moolenaar能夠讓這些宏同樣也能在Vim中運行。1991年,Vim第一次以「Vi模仿者」的方式發布在Fred Fish磁碟591上。Moolenaar添加了一些新特性(包括多級撤銷和編譯器錯誤的「quickfix」模式),這意味著Vim已經超過了Vi,但是Vim仍然是「Vi模仿者」,直到1993年通過FTP發布了Vim 2.0。




在各種互聯網合作者的幫助下,Moolenaar在一些穩定的版本中對Vim加入了一些功能。Vim 2.0引入了對wrap選項的支持,以及對長行文本的水平滾動。Vim 3.0增加了對分割窗口和緩衝區的支持,這是一個受vi克隆版nvi啟發的特性。Vim現在還是將每個緩衝區保存到交換文件中,這樣即使Vim崩潰,經過編輯的文本還可以存活。Vimscript第一次出現在Vim 5.0中,並支持語法高亮顯示。與此同時,Vim的受歡迎程度也在不斷增長。它被移植到MS-DOS,到Windows,到Mac,甚至到Unix,在那裡它與原來的vi進行競爭。



2006年,Vim被Linux雜誌讀者評為最受歡迎的編輯器。現在,根據Stack Overflow的2018年開發者調查,Vim是最流行的文本模式(即終端模擬器)編輯器,在所有軟體開發人員中有25.8%的人(和sysadmin/devops人員的40%)使用過Vim。在20世紀80年代末和整個90年代,程序員們進行了「編輯器戰爭」,這使得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提醒我們,這種協作和增量法也能創造奇蹟。




英文原文:https://twobithistory.org/2018/08/05/where-vim-came-from.html


譯者:任宇は神様



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python程序員 的精彩文章:

提高Python程序性能的七個習慣
Python比特朗普更受關註:關於Python的五個事實

TAG:Python程序員 |