這里馬上想說的是,我不是Emacs和Vi的粉絲,但是很喜歡兩者的某些設(shè)計(jì)和功能。努力學(xué)習(xí)過他們,在生產(chǎn)環(huán)境中也經(jīng)常用到,但并不精通。如果有我不知道或者說錯(cuò)的地方,敬請(qǐng)批評(píng)指正。另外,這貼無意于討論IDE還是Notepad寫程序誰更高明的問題。
1、項(xiàng)目的組織方式
Emacs首先是作為編輯器而存在而出名(我想Vi也一樣),在不用插件時(shí),它面向的是單個(gè)文件,若考慮split和tab方式,則是面向多個(gè)單獨(dú)的文件。當(dāng)使用了某些插件以后,它可以“看到”并“管理”目錄樹,部分變成了面向目錄的管理方式。無論是面向文件的還是面向目錄樹的,Emacs都首先致力于對(duì)于單個(gè)文件內(nèi)部編輯功能的強(qiáng)大。項(xiàng)目所用到文件之間的關(guān)聯(lián),在編譯之前關(guān)聯(lián)是松散的——Emacs把它們當(dāng)做單獨(dú)的一個(gè)一個(gè)文件,至多是以文件系統(tǒng)的目錄樹結(jié)構(gòu)組織。這有的時(shí)候很好,確實(shí)符合KISS和工具高內(nèi)聚低耦合的思路:通過文件系統(tǒng)組織項(xiàng)目,通過shell直接實(shí)現(xiàn)文件的操作以實(shí)現(xiàn)項(xiàng)目的管理。而現(xiàn)代的IDE基本都是面對(duì)“項(xiàng)目”這個(gè)概念。Emacs這種面向文件的方式,相對(duì)就有些不足::
調(diào)整項(xiàng)目的目錄結(jié)構(gòu),Emacs靠的是命令,文件一多效率就可想而知;(不過這一點(diǎn)是典型的鼠標(biāo)操作優(yōu)勢(shì)項(xiàng)目,有點(diǎn)作弊的嫌疑)
依據(jù)當(dāng)前符號(hào)在項(xiàng)目內(nèi)跳轉(zhuǎn),比如點(diǎn)擊函數(shù)定義,直接跳轉(zhuǎn)到函數(shù)體,Emacs對(duì)C還支持,對(duì)其他語言就。。。;
查找類的繼承結(jié)構(gòu)時(shí),IDE會(huì)在項(xiàng)目中找到相應(yīng)的符號(hào)并跳轉(zhuǎn)。Emacs并沒有“項(xiàng)目”這個(gè)視野,跳轉(zhuǎn)或者類的繼承結(jié)構(gòu)有可能不完整;
項(xiàng)目文件數(shù)目和種類都較多,并且分布在不同目錄中時(shí)。這種情況下IDE一般會(huì)把文件按類型分門別類列好,也就是說,導(dǎo)航欄強(qiáng)大的多;
IDE會(huì)根據(jù)對(duì)項(xiàng)目的操作(添加文件、刪除文件、改名、改目錄)自動(dòng)變更項(xiàng)目文件或者Build腳本,而Emacs需要在做了這些變更以后,再慢慢到腳本里找到相應(yīng)位置進(jìn)行更行;
想象一個(gè)極端場(chǎng)景吧,一個(gè)項(xiàng)目擁有100個(gè)文件,其中80個(gè)代碼文件,放在一個(gè)目錄中(敘述簡(jiǎn)單起見)。由于重構(gòu)的需要,我們需要調(diào)整目錄結(jié)構(gòu),根據(jù)命名空間將他們分門別類放進(jìn)相應(yīng)的目錄,這些文件有若干個(gè)類,有幾個(gè)類方法很多,參數(shù)復(fù)雜,類繼承系統(tǒng)也超過3層。這種場(chǎng)景現(xiàn)代IDE相對(duì)能較快速的解決問題,這個(gè)時(shí)候Emacs搞不好還在來回翻查目錄移動(dòng)源代碼或者是同步Build腳本。
尤其是現(xiàn)在大家都在寫著“膠水”代碼,更注重“結(jié)構(gòu)”而不會(huì)在一個(gè)文件中死磕很久(我相信做算法的牛人或許不是這樣),Emacs的優(yōu)勢(shì)在弱化,而對(duì)于項(xiàng)目管理的劣勢(shì)就更明顯。前兩天還看了篇文章說程序員真正在“寫”程序的時(shí)間不會(huì)超過50%呢。
2、缺失的功能和黑客的插件
Emacs和Vi本身在文字處理方面的功能非常強(qiáng)大(低耦合高內(nèi)聚嘛),由于某些非文字編輯功能的缺失而且系統(tǒng)又比較開放,各種插件層出不窮。可以說,沒這些插件真就沒有Emacs作作為編程環(huán)境的今天(其實(shí)裸奔Emacs對(duì)編程支持得還算友好啦,Vi裸奔基本什么都沒有么),什么Colortheme,numberline,etags,CEDET,cscope等等等等的插件大大增強(qiáng)了Emacs在程序開發(fā)方面的能力(甚至有部分彌補(bǔ)了上面第一部分我說的不足)。相應(yīng)的,Vi也有許許多多各種各樣的插件(比如上推特啦,收郵件啦,聊Gtalk啦-_-)。但是,但是!這些插件有著相當(dāng)濃厚的黑客味道:
配置插件配置到你崩潰,不斷改配置,重試,改配置,重試,直到你的Emacs再也起不來鳥~~~>_<~~~
除了幾個(gè)著名插件,其他插件的完成度真的比較讓人懷疑,興趣愛好么,寫到一半沒興趣了怎么辦?講與時(shí)俱進(jìn)講了這么久了,插件還真是做不到與時(shí)俱進(jìn)那。
C和C++加上插件基本成套能用,其他語言那?記得有一次,一個(gè)html/css/js的項(xiàng)目寫到一半,突發(fā)奇想用了一會(huì)兒vim+網(wǎng)上大牛推薦的幾個(gè)著名插件,哎呦我的媽,這是回到了侏羅紀(jì)嗎?基本的代碼著色,代碼縮進(jìn)還能做的更差一點(diǎn)嗎?
當(dāng)然,隨著插件的完善,Emacs和Vim還是有更完美的希望的。也許什么時(shí)候Netbeans Eclipse這些都被干翻了,IBM和Oracle回到Emacs或者Vi懷抱,又或者Google被弄得沒ide用了,這時(shí)候Emacs和Vim插件就有希望了。也就是說,Emacs作為開發(fā)環(huán)境缺乏大廠的支持,這是它的一個(gè)硬傷。
3、高級(jí)特性
下面這些高級(jí)特性上,Emacs和Vim的差距也比較大:
首先要說的高級(jí)特性就是智能感知和補(bǔ)全,在微軟叫Intellisense,在其他的廠,好吧,就叫Auto-Complete… 這個(gè)差距就大了去了;旧螮macs在C和C++領(lǐng)域還能撐一下,只能說略輸現(xiàn)代IDE一點(diǎn),基于項(xiàng)目和語法分析的插件勉強(qiáng)趕上時(shí)代(勉強(qiáng)比Eclipse,Netbeans這種差一點(diǎn),和VC和SlickEdit比那就是廁所里點(diǎn)燈)。其他語言的智能感知和補(bǔ)全基本上就是農(nóng)業(yè)社會(huì)了——基本上就是基于單詞表的,囧。其實(shí)Emacs也做得出來,不過這種東西沒大廠雇一幫人,做個(gè)能用的蠻難。
其次是重構(gòu)啊,單元測(cè)試啊,源代碼管理啊這些熱點(diǎn)特性基本也沒戲了,Emacs里只能Shell開起來,小碎步抖起來了。
再然后是調(diào)試的支持。Emacs也好Vi也好,插件一個(gè)不落全裝上,對(duì)GDB支持還是蠻好的。即使這樣,GDB目前看起來調(diào)試功能和Visual Studio還是有一定差距(舉個(gè)例子,VS好幾年前開始支持泛型容器直接看內(nèi)容了,可能我土鱉,不知道GDB也支持了)。然后,其他語言的調(diào)試,又是一片悲劇,插件又沒跟上!
最后再提一小點(diǎn):對(duì)于類庫、框架、插件的管理和支持。Eclipse,Netbeans,VisualStudio都有比較完善的插件管理機(jī)制,你要哪些插件,隨你選,然后自動(dòng)下載安裝搞定。Emacs和Vi滿世界找插件,下載以后改配置文件,沒配置對(duì)還要悲劇,F(xiàn)代IDE對(duì)于某些程序需要的類庫框架也是這種管理方式,搜索,下載,直接加入項(xiàng)目文件或者build文件,然后對(duì)于框架有較多的自動(dòng)生成功能(比TextMate的Bundles高檔多了,基于語法分析的一般)。不過說實(shí)話,這點(diǎn)寫成Emacs的缺點(diǎn)還真有點(diǎn)心虛,因?yàn)檫@本來就是集市和大教堂的區(qū)別。
總的來說,比較根本的缺點(diǎn)其實(shí)只有兩個(gè):面向文件而不是面向工程的管理方式;沒有大廠支持。前者是由于Emacs(Vi)編輯器的本質(zhì)造成的,后者,額,我也不知道是什么造成的。
洋洋灑灑寫了這么多,其實(shí)我還是挺喜歡Emacs也挺喜歡Vi的,他倆最吸引我的其實(shí)還是全鍵盤的操作方式——相當(dāng)?shù)难bB啊,給別人演示的時(shí)候倍兒有面子——還有就是奇快的速度,拿來做一些小項(xiàng)目速度很快也很順手。但是挨踢界確實(shí)也是一日千里,Emacs和Vi能迎頭趕上就好。
Emacs本身定位上可能就不是代碼編輯器,至少流行的沒見過哪個(gè)在文字窗口顯示圖片的,不過這也有個(gè)好處就是會(huì)有一些支持latex預(yù)覽的插件
VI/Emacs是頂級(jí)高手用來開發(fā)操作系統(tǒng),數(shù)據(jù)庫,編譯器,新的編程語言等等,你說NB嗎?
當(dāng)然這種東西最好是有高手帶,因?yàn)閷W(xué)習(xí)曲線非常的陡。
VS2010確實(shí)很好,要是再穩(wěn)定點(diǎn)就更好了。
Emacs和VI也有他們的好處,也有些文章介紹的。我覺得最牛逼的地方是這兩個(gè)東西可以完全脫離鼠標(biāo)。