1. 程式人生 > >Emacs和Vim:神的編輯器和編輯器之神(ZZ)

Emacs和Vim:神的編輯器和編輯器之神(ZZ)

0. 序章:神器的傳說

在這個蔚藍色的星球上,流傳著兩大神器的傳說:據說Emacs是神的編輯器,而Vim是編輯器之神。

追求獨步天下的高手和低手們爭著一睹它們的風采,可看到它們樸素單薄的介面後,不禁心下懷疑:這就是神器嗎?甚至有人生了輕視之心。

膚淺的人嗤之以鼻,說:什麼年代了,還抱著這麼老土的玩意不放,真他媽Geek!同學,請冷靜下來,聽我說:它們的確夠老了,都幾十年的壽命了,但你想想為什麼,為什麼這麼古老的編輯器,卻有越來越多的人皈依它們。

Windows下用UltraEdit和Editplus的人質問:它們到底比UltraEdit和Editplus好在哪裡?我說:不可同日而語。

連UltraEdit和EditPlus都沒用過的同學問:它們就相當於Linux上的 Notepad吧?我說:請你從我的眼前消失。

一些人勇敢地拾起了Vim或Emacs,卻發現學習曲線陡峭而漫長,於是在沒發現它們的強大之前就放棄了,說:太難用了,把鍵盤當滑鼠用的爛玩意,有什麼好的?

還是有一些人留下來了,堅定地守護著這兩大神器。一些說葡萄太酸的人想離開又不甘心,總是問:它們到底神在哪裡啊?我不禁想起了李宗盛的幾句歌詞::

有人問我你究竟是哪裡好,

這麼多年我還忘不掉?

春風再美也比不上你的笑,

沒見過你的人不會明瞭。

也許你不會明瞭,我還是要努力講一講。

主流編輯器學習曲線圖 

主流編輯器學習曲線圖

1. 無敵的可擴充套件性

1.1 可擴充套件性給了軟體強大的生命

曾幾何時,Windows使用者對軟體的可擴充套件性沒有概念,他們只能對他們使用的軟體進行非常有限的定製。擴充套件軟體的權利保留在軟體開發者手中。軟體的使用者如果想要新的功能和特性,只能等待軟體的升級。有能力的使用者等不及了,為了新增自己想要的功能,從0開始寫了一款新的軟體。就這樣,新的功能意味著新的軟體,Windows下的軟體前赴後繼,迅速地更新換代著。因此, Windows下的軟體都很短命。

Linux和開源軟體漸漸流行起來,人們才發現:可擴充套件性才能給軟體強大的生命。在MS的VS橫行的今天,Eclipse為什麼被評為最好的IDE?就是因為它在IDE中最具可擴充套件性。在IE幾乎一統天下的時候,為什麼Firefox能奪走越來越多的使用者,也是因為它的可擴充套件性。提供了良好的擴充套件介面,使用者自然會寫出各種各樣的外掛,來滿足使用者自己形形色色的要求。這樣,軟體在使用者的推動下自然變得強大了。

Emacs和Vim沒有被時代淘汰,反而越發強大,也正是因為在數不清的編輯器中,他們具有無可匹敵的可擴充套件性。

1.2 Emacs是偽裝成編輯器的作業系統

有句誇張的話說:Emacs是偽裝成編輯器的作業系統。細細想來,這句話並不誇張。

Emacs其實是個Lisp的直譯器,因此可以用Lisp靈活地擴充套件。 Lisp是什麼東西,這同樣是種很有生命力的程式語言。在C語言還沒有發明的年代,MIT的人工智慧實驗室寫ITS作業系統時,一部分用的是組合語言,還有一部分就是用的Lisp。現在,Lisp仍在人工智慧研究領域廣泛使用著。

有這麼牛逼的擴充套件語言,註定Emacs向著無所不能的方向發展。漸漸地,人們用Emacs不再限於寫程式,寫文件,而且在Emacs裡管理檔案系統,執行終端,收郵件,上網,聽音樂……,真是一發不可收拾。甚至,有人用Emacs控制咖啡機煮咖啡。

這種大而全的擴充套件,背離了“一個程式只做一件事並做好它”的 Unix哲學,被Unix的忠誠使用者所詬病。可是真的背離了嗎? Emacs說過自己是一個編輯器嗎?

正是因為Emacs的無敵的可擴充套件性,人們才分不清Emacs到底是不是一個編輯器了。但,就是有人喜歡這種All-in-One的哲學,喜歡在Emacs中完成每件事。所以才會有人寫《生活在Emacs中》,所以, Emacs才會成為一種信仰。

1.3 Vim不只是Vi

Vim是Vi最受歡迎的變種之一,除了繼承了Vi迅捷的編輯方式, Vim的功能已經比原始的Vi強大得多。這也得益於它可以用Vim指令碼無限地擴充套件。 Vim.org 上已經有數千個指令碼了,給Vim增加各種各樣的特性和功能。

為了證明Vim的可擴充套件性不輸於Emacs,也有使用者寫了在Vim中玩遊戲、執行Shell、和整合GDB在Vim內部除錯的外掛。客觀地講,Vim的指令碼語言與Emacs的ELisp相比,略顯遜色,但這絲毫不妨礙它把Vim擴充套件成非常優秀的編輯器。

說到底,Vim的前身Vi和Emacs的設計採用了不同的哲學, Vi更符合Unix傳統,它通過管道機制和系統內各種積木工具打交道,它講究的是和系統內的工具程式協作來完成使用者的任務。和Emacs相比,它的定位很明確,就是要做一個強大的編輯器。因此Vim的絕大部分擴充套件,都是為了更好地完成編輯文字的任務。

海納百川,有容乃大。Emacs和Vim通過別的編輯器無法比肩的可擴充套件性,不斷吸收廣大使用者的智慧,是它們能成為“神器”的原因之一。

2. 特立獨行的魅力

2.1 可擴充套件性讓你傾注了靈魂

一旦你意識到Vim或Emacs的強大,你就踏上了不停發掘它們潛力的漫漫長路。你不停地改進自己的配置檔案,你不停地搜尋更好的外掛,甚至有一天你開始動手寫自己的外掛。就像劍客保養自己的劍一樣,你也甘心花時間提升你的Vim或Emacs。經年累月,不知不覺,你已經在那把劍上傾注了你的靈魂。

2.2 獨特的操作方式讓你中了毒

Emacs和Vim有著迥異的操作方式,卻成了Unix/Linux世界中兩種代表性的操作方式,有些軟體的操作方式類似Vi,而有些軟體的方式類似Emacs,甚至有些軟體提供了Vi的鍵繫結和Emacs的鍵繫結讓你選擇。而無論哪種操作方式,對Windows使用者來說都是古怪的。雖說古怪,多少代人也驗證了這兩種操作方式的高效。

Emacs號稱Ctrl到死的編輯器。其實它幾乎用了所有的輔助鍵,聽說過沒有,Emacs = Esc + Meta + Alt + Ctrl + Shift。所以高德納大師說操作Emacs,就像彈奏管風琴。 Emacs使用非常多的組合按鍵,這大概也是它高效於其它無模式編輯器的原因之一。你也可以定義自己的組合鍵序列,呼叫自己寫的lisp函式,完成自己想要的功能。

Vi一向是以快速的文字編輯聞名於世的。它的按鍵更簡潔,通常是單個字元按鍵,就實現某種操作。但這是以有模式為代價的。你要不停地按Esc在從它的插入模式返回Normal模式。客觀得講,在文字編輯方面, Vim比Emacs高效,因為它提供了一些Emacs沒有對應功能的操作來輔助高效的文字編輯。但它的模式切換也讓一些人受不了,於是那些人選擇了 Emacs。

不管你選擇了Vim還是Emacs,你都要為習慣它們獨特的操作方式而努力,這是一個技藝積累的過程。當你習慣了Vim或Emacs,你會有欲罷不能的感覺,你希望用它們完成儘可能多的任務,因為你再用別的編輯器也已經不習慣。

用Vim或Emacs就像吸食毒品,慢慢地就會上癮。它們會帶給你漸漸強烈的快感,但你也向它們獻出了自己的靈魂。這時,你只能稱它們為神器。

3. 黑客的編輯器

Vim的前身Vi的作者Bill Joy和Emacs的作者Richard Stallman 都是那個時代著名的黑客,所以這兩款編輯器一開始面向的主要使用者就是寫程式的人,現在仍然是。它們對程式設計加入了越來越多的支援,如語法高亮、智慧縮排、關鍵字補全甚至整合除錯。也有越來越多的程式設計師從IDE轉向了Vim和Emacs。

用Vim和Emacs程式設計到底有什麼好處?我想首先是它們高效的編輯操作會提高你的程式設計效率。其次你可以用它們完成各種語言的程式設計,所謂一劍在手,夫復何求。你不用再因為程式語言不同去學習不同的IDE的使用,那些龐大的IDE的升級換代也與你再不相關,你把精力用於學習程式語言本身就好了。聽說Google和微軟內部開發也都不用IDE的,他們也會用Emacs或Vim。

因為我寫的程式不多,還不能深入體會用Vim或Emacs開發程式的樂趣。我只是覺得這很酷,你看,Linux之父Linus多年來用的是一款 MicroEmacs,它比GNU Emacs或XEmacs少許多功能,但Linus就是用它在維護Linux。 微軟的大牛Don Box,Com之父,一直用Emacs,他說誰也不能奪走他的編輯器。他還在網上放了一段他用Emacs寫C#程式的視訊。

程式設計大師們的選擇,也是Emacs和Vim被追捧為神器的原因之一。

  4. 神器引發的聖戰

Vim使用者和Emacs使用者有著旗鼓相當的品位,應該互相欣賞才對。現實卻是,忠誠於Vim的使用者和忠誠於Emacs的使用者互不相容,常常沒完沒了地打口水仗。Emacs使用者說Vim的操作方式單一而古怪, Vim使用者說Emacs體積龐大,啟動緩慢。

很有點一山不容二虎的意思,大概因為二者都處於神器的高度,才會鬥爭不斷吧。也可能是因為二者截然不同的設計哲學吸引的使用者在價值觀上也互不認同。

正因為兩者難分高下,新人總是在Vim和Emacs之間猶豫不定,很難決定到底要皈依哪一個神。