Emacs與Vi的40年 計算機世上最漫長的競爭

2021-07-24 12:39:39 字數 3463 閱讀 6693

在這個許多軟硬體剛發布就可能面臨淘汰的世界裡,有兩個老對手可以自信的宣稱:我們是有史以來壽命最長的應用程式。這兩個程式都即將進入他們的第五個十年了,兩個都是文字編輯器,用來輸入和編輯**、資料檔案、原始的html網頁以及其他種種東西,兩者是不共戴天的仇敵。

他們分別是emacs和vi(程式設計師稱為「vi」),不誇張地說,他們是古老的傳奇,最少可以追溯到2023年,比大多數正在使用他們的人年紀都要大。兩個程式都是文字編輯器,這意味著他們不是wysiwyg(所見即所得,what you see is what you get),不像文字處理器(比如microsoft word),他們不會格式化螢幕上的文字。程式設計與文書處理有很大的不同,emacs和vi基本的功能都是快速編輯源**(和其他文字檔案)——現在大多已經過時了。但是他們倆以及持續發展了近40年。

從未有兩個程式像他們這樣如此旗鼓相當,如果你身邊有個程式設計師在用其中乙個,那麼很有可能他會討厭另乙個。我用emacs已經有很多年了,但我的妻子卻喜歡用vim(vi的增強版,vi improved),所以我們倆很少討論編輯器的問題,以免引發所謂的「編輯器之戰」。

emacs的擁護者說對於vi,你只需要之道乙個命令——三個字元的組合「:q!」,因為這是退出命令。第一次用vi的時候,我都懵逼了,因為我甚至連怎樣輸入文字都搞不清,打字只聽到噼里啪啦聲,箭頭連動都沒動一下,當然了,我也不知道怎麼退出(尷尬)。我的乙個同學向我解釋了這是為什麼,因為vi是以常規模式啟動的,不允許輸入新的文字,只能夠編輯現有的文字。你需要先鍵入「i」以進入輸入模式,在輸入模式下才可以正常輸入文字。按下esc鍵,就可以回到常規模式,然後我就鍵入了「:q!」(也是剛知道),慌忙地切換到了emacs。

這個貌似殘酷的介紹也反映了vi的學習曲線,一旦你掌握了vi神秘的命令集(它就會變身為乙個強大的、如閃電般快速的編輯器。我相信專業的vi使用者能夠讓vi比其他所有的程式都更快,不僅是因為相關命令已經被極度壓縮,非常簡短,而且vi本身的記憶體開銷非常非常小,所有的任務幾乎都能實現瞬時響應。vi是無可匹敵的,larry marburger將其稱為「文字手術」。倒退5個單詞?「5b」!刪除後面6行?「d6j」!在檔案中的每一行放置匹配的引號?只需按下18個按鍵:「:%s/\(^\|$\)/\」/g」。

巧合的是,大多數人看到這串命令時反映都跟我一樣,罵罵咧咧( obscenicons,無中文翻譯,意義參看大致就是詛咒的意思)。我對這些命令比較生疏,寫出這串組合花了我幾分鐘的時間,但真的不騙你,vi的老手只需要幾秒鐘。

vi出生的時代,計算機非常慢以至於你不希望任何東西造成不必要的延時,比如額外的按鍵或圖形細節。joy說vi是為那些有網路連線的電腦定製的(那時候顯示文字的速度還趕不上人閱讀的速度)。就像joy在2023年所說,「我試圖讓他能夠在乙個300波特率數據機上使用……vi被優化到你在編輯的過程中就能明顯感受到它驚人的效率」。即使到現在,vi無與倫比的效率也使它保有相當多的粉絲,對他們來說,絲毫的延遲就會讓他們發狂(比如軟體工程師)。vi是少有的幾個使用過程中甚至不需要移動手位置(標準打字姿勢)的程式,甚至連箭頭鍵也不需要(用h、j、k、l就可以)。

但是,如果emacs止步於此的話,它也不會變得如此特別。emacs的過人之處在於它的靈活性,你可以自定義所有東西。例如,大多數命令都是以esc或者ctrl鍵開頭的,包括esc-x——可以自動補全所有的命令。但是,這兩個按鍵常被程式設計師指責**了他們的小拇指,因為重複性地使用小指以致於小指勞損了;甚至在我寫這篇文章的時候,小指還有刺痛感。但對於emacs來說,這不會成為乙個問題,因為emacs可以輕鬆的完成鍵對映繫結,所以你可以把ctrl的鍵改為capslk鍵,esc鍵改為alt鍵。除此之外,幾乎所有的命令都可以被對映到任何鍵或組合鍵,程式設計師可以在很微小的細節方面進行定製以滿足個人特定的需求。上帝保佑那些那些試圖用你的emacs的笨蛋不被氣死,當然那不是你的問題,如果你也曾嘗試用其他人的emacs你就知道了。

emacs有自己內部的程式語言——lisp的乙個變種,能夠讓你編輯程式中的所有功能:絕不僅僅是文字編輯和格式化功能,而是真正所有的東西,它是乙個檔案系統,乙個時鐘,乙個web瀏覽器,乙個文字冒險遊戲,乙個即時通訊軟體等等等。如果你願意的話,你可以在emacs中完成大部分的日常工作,就像我所知的許多emacs忠實粉絲一樣——你完全不需要切換視窗!相比vi,emacs的初始學習曲線更加平滑,但曲線永遠不會結束,只有陷入不斷增長的複雜性,emacs的無窮可能性會一直消耗你的生命和生產力。

這麼看來,兩大交戰程式的特點就很明晰了。vi以優雅著稱,幫助你在盡可能少的移動手指的情況下完成任務;而emacs,支援自定義,支援拓展,包羅永珍,非常靈活,能夠滿足你幾乎所有的特殊要求。vi標準化的完善和emacs抽象的普遍性是兩個工程師的最高理想。這兩個程式的戰爭也告訴我們這些想法與特性往往是不相容的。

有時候這兩個程式的選擇要歸結為個人的性格:是否是願意屈從於乙個剛性的但更受歡迎的系統(vi),還是願意自己創造乙個奇特的定製化環境(emacs)。tim o『reilly在他自定義設定的emacs無意中被毀以後,開始轉向vi。他決定要遵循「vi崇拜」,讚美vi的普遍性,「不管我用什麼系統,它都在那裡,不離不棄」,(他也說,「我並不想火上澆油」)。而linux的發明人linus torvalds,不僅更喜歡emacs(準確的說,是精簡版的emacs,microemacs),甚至還修改了emacs的底層**以使它更符合自己的需求。

儘管emacs能夠**vi,但效能上卻不能跟真正的vi比。即使最激烈的vi詆毀者也不會否認,vi比emacs更快(vi的狂熱支持者甚至說,你可以在啟動emacs的時間內學習vi的命令集)。事實上,emacs遠遠快於其他圖形化編輯器,例如eclipse和microsoft visual studio,但是vi黨仍然表示,找不到任何理由為了emacs的臃腫而犧牲其效率。而emacs黨則回應稱,一旦你啟動了emacs,就最好不要停下來,直到永遠,讓emacs成為你的作業系統。

所有程式設計師逗不可避免要在不同的作業系統上工作,也許還是乙個沒有安裝emacs的作業系統(恐怖),到那個時候沒有emacs將會嚴重的拖慢你的工作速度,所以許多emacs使用者都會勉強地學習一些vi的基礎知識,以便在不得以的情況下使用。而相反,vi的固執在近些年已經有所軟化,像它的轉殖軟體vim,也新增了諸多新的特性和拓展,提供了那些使得emacs更受歡迎的主流編輯功能(包括俄羅斯方塊)。

現在,兩個曾經的敵人也已經逐漸走向趨同。偏愛其中一種常常是不實際不理智的,專注與靈活,哪個更貼近你的心?如果房子著火了,你會首先搶救出什麼東西?軟體工程在很大程度上也是應對不完美、不相容的一門藝術,做出妥協絕不是純粹的功利主義,而是反映出了乙個工程師的審美理念,什麼是美的,或者至少——什麼是醜的。

北航2023年計算機複試上機

第一題 從輸入的字串中,統計空格,回車,tab出現的次數 include include include int main buf i 0 len strlen buf for i 0 i 第二題 將兩個公升序字串合併成乙個公升序字串,相同的字母,出現一次。include include int c...

2023年計算機考研程式設計

題目 請設計乙個演算法,將給定的表示式樹 二叉樹 轉換為等價的中綴表示式 通過括 號反映操作符的計算次序 並輸出。例如,當下列兩棵表示式樹作為演算法的輸入時 二叉樹結點定義如下 typedef struct node btree 要求 1 給出演算法的基本設計思想。2 根據設計思想,採用c或c 語言...

學了一年計算機的感受

現在,我的大學生活已經過了一年半了,感覺不是很踏實。我是學計算機的,但選此專業前對計算機知之甚少,只想學一門最先進的工程科學。然而,隨著時間的流失,過去的朦朧變成現在的熱愛。計算機學科很龐大,而且發展很快,因此我們一定要找準方向。可以說,我的一年半實際是在了解計算機行業。從軟體到硬體,從理論到實踐,...