Vim編輯器使用了大概有三年的時(shí)間,emacs呢則是最近幾天才嘗試的,之所以會嘗試emacs,第一點(diǎn)是因?yàn)榭戳瞬簧贂筒┛投荚谡flisp如何如何好;第二點(diǎn)則是因?yàn)榻诔霈F(xiàn)了廣受好評的spacemacs項(xiàng)目,這個(gè)項(xiàng)目可以說開箱即用,而且使用了最接近vim的evil包,據(jù)說這個(gè)包還原了百分之80以上的vim功能,是所有的試圖模擬vim模式的嘗試中做得最好。
這就很明顯,spacemacs這個(gè)項(xiàng)目會拉攏一部分Vim用戶,的確,它成功地吸引了我的注意力,我早就想試下這個(gè)“操作系統(tǒng)"是如何牛逼。
下面我單純的從用戶的角度來比較兩者,對比非常淺。
包管理
對于一直用慣了vim簡陋的包管理的我,一看到emacs的包管理,的確有點(diǎn)驚艷到我。
在emacs中,只需要點(diǎn)擊菜單的Options->Manage Emacs Packages,既能打開emacs的包管理器,打開包管理器之后,可以搜索,可以安裝,可以訪問主頁,多么友好的用戶體驗(yàn),跟Vim真是天差地別。


由于各種原因,在天朝下載可能很慢,但用戶可以更換鏡像源,就像linux上apt,yum和macOS上的HomeBrew一樣,有個(gè)官方的服務(wù)器專門存放這些包,而且世界各地也有志愿同步官方的鏡像源。
以上只是新用戶的我的體驗(yàn)而已,然而通過閱讀一些資料之后,我們發(fā)現(xiàn)其實(shí)emacs也是長期沒有自帶的包管理器的,在emacs 23的時(shí)代出現(xiàn)了一個(gè)非官方的包管理:packages.el。后來到了emacs 24才被集成到里面去。
另外還要說下這貨的更新其實(shí)非常麻煩,首先要進(jìn)入package-list-packages然后在需要更新的包標(biāo)記為需要更新,問題在于Package-list-packages是列出所有的包,包括了沒有安裝的,意味著你要標(biāo)記其實(shí)非常麻煩...
現(xiàn)在來看vim的包管理,實(shí)際上vim根本沒有包管理,我們來談下vim的包管理發(fā)展史。
最開始的時(shí)候,用戶必須把每個(gè)插件不同文件手動放在指定的目錄上
后來出現(xiàn)一種壓縮格式,用戶只需要在vim中執(zhí)行
:so xxx.sz就可以自動將包釋放到對應(yīng)的目錄,tpope大神橫空創(chuàng)造出了vim-pathogen,這個(gè)時(shí)候用戶再也不需要將一個(gè)包里面不同文件放在不同文件夾里面了,一個(gè)包就是一個(gè)文件夾,結(jié)合github和git-submodule,我們就可以在線下載更新了,但是一開始github還沒火,絕大部分開發(fā)者將包提交到Vim官網(wǎng)上而非github上,后來出現(xiàn)了一個(gè)用戶
vim-scripts將官網(wǎng)大部分插件上傳到github上,從此開始,pathogen才真正活起來,同時(shí)隨著github的流行,越來越多作者將插件放到github上來管理,到現(xiàn)在vim-scripts已經(jīng)功成身退了。Vundle,用戶不在需要通過git-submodule來在線更新了,只需要在配置文件加入簡單命令即可窗口化管理插件。很多小白用戶都是從這個(gè)插件開始的。
vim-plug,可以說目前最受歡迎的包管理器除了實(shí)現(xiàn)Vundle的功能之外,還有兩個(gè)個(gè)殺手級別的功能就是
lazzy load和多線程異步更新,特別是前者的出現(xiàn)讓vim的包管理一段時(shí)間內(nèi)超過emacs的,用戶可以根據(jù)文件類型,動作命令來選擇什么時(shí)候加載,用戶可以決定下載包之后的動作是什么,還可以指定git倉庫的tab和分支。其它。dein.vim和vim-plug不相上下,甚至更好。neobundle.vim同樣是由Shougo大神寫的,同樣優(yōu)秀不過是他寫的上一代產(chǎn)品,還是推薦dein.vim。
emacs默認(rèn)的包管理的話,還有一個(gè)有點(diǎn),就是自動解決依賴,這對vim來說是不太可能的,因?yàn)関im的插件是散戶自己弄的,沒有官方的組織,只能靠用戶自己注意依賴問題,好在vim的依賴很少,emacs的自帶的包管理有個(gè)缺點(diǎn)就是無法lazzy load而且需要用戶自己寫腳本維護(hù)自己的插件列表已經(jīng)安裝和更新,只要你把包安裝了除非你包刪除掉否則無法不加載,后來出現(xiàn)use-Packages才解決了這個(gè)問題。
總結(jié):vim由于先天原因找包比較困難,但是找到之后維護(hù)起來比emacs簡單得多。
補(bǔ)全
編輯器中所有功能中大概大家最關(guān)心的就是這個(gè)功能吧,emacs有一個(gè)company包以及相關(guān)的補(bǔ)全包,但就company包來說就挺不錯的,能補(bǔ)全路徑打開buffer中的單詞以及elip的函數(shù)變量等等,要是開發(fā)elip就這個(gè)包就夠了,可惜,號稱操作系統(tǒng)的emacs仍然無法很好解決高級編程語言的補(bǔ)全問題,以前的emacs也和vim一樣使用ctags和cscope來進(jìn)行補(bǔ)全跳轉(zhuǎn),后來谷歌大神Valloric為vim創(chuàng)造出驚天插件youcompleteme,真正意義做到語義級別的補(bǔ)全,后來大神將這個(gè)插件的服務(wù)端ycmd統(tǒng)一接口,讓更多的編輯器可以使用ycm,所以你現(xiàn)在去搜如果要做到語義級別的補(bǔ)全,會得到和vim一樣的結(jié)果,那就是使用ycm。
vim的話,如果使用了ycm的話,vim script本身的補(bǔ)全反而找不到較好的方案呢,各位知道怎么弄?
shell或者終端模擬器
我現(xiàn)在的vim的配置是:vim+vimshell,而neovim則是用自帶的終端模擬器,neovim的終端模擬器絲滑般好用。
emacs的有自帶的用elisp寫的eshell,類似vimshell的地位,說實(shí)話,這個(gè)eshell難配置,難用,而且慢,經(jīng)???,使用體驗(yàn)輸給vimshell。
emacs當(dāng)然也有終端模擬器,可惜打開之后盡是亂碼,當(dāng)然這可能和我使用zsh+oh-my-zsh有關(guān)。
在這一點(diǎn)上vim獲勝了。
搜索定位
補(bǔ)全那一小節(jié)有一些沒說,似乎用emacs的人不喜歡fuzzy complete或者fuzzy search,我用company的補(bǔ)全真的很難習(xí)慣。什么是fuzzy請看下面的動圖:
在搜索方面,vim最著名的插件就是ctrlp.vim,也就是Fuzzy file, buffer, mru, tag, etc finder,配合the_siliver_searcher搜索速度真是無人能敵,在搜索linux源碼的時(shí)候也是秒開,最重要的是fuzzy這個(gè)特性在茫茫的文件中,這是找到文件最佳途徑,而那些emacser貌似很少用這些特性。
另外的ctrlp的一個(gè)擴(kuò)展也非常牛逼,那就是ctrlp-funky,就是用ctrlp的接口列出當(dāng)前文件的函數(shù),然后用戶可以fuzzy定位到該位置,有了這個(gè)插件之后,我基本就不用tagbar之類的插件了。
emacs也有一個(gè)imenu,但是支持的語言類型太少和ctrlp-funky沒得比,后者支持三十多種語言。
當(dāng)然,emacs在文本搜索中有一個(gè)優(yōu)勢就是實(shí)時(shí)顯示,這一點(diǎn)貌似還么有vim插件實(shí)現(xiàn)過。
其它優(yōu)秀插件
vim-multiple-curosr這個(gè)功能是在st編輯器首先出現(xiàn),出現(xiàn)不久之后就有vim插件了,而且做得非常不錯而且可以結(jié)合全局搜索插件進(jìn)行替換,非常方便,可以看我的這篇文章vim重構(gòu)插件PK。
emacs也有當(dāng)卻和evil不能和諧共處,至今沒有找到體驗(yàn)和上面的vim-multiple-curosr一致的包。

vim-easymotion,超級強(qiáng)大的光標(biāo)定位插件,甚至可以在多窗口中定位,evil系列中也實(shí)現(xiàn)了一個(gè)可惜功能上和用戶體驗(yàn)差太多了,比如它沒有行模式,不可以多窗口。

magit & vim-fugitive
emacs上的magit包體驗(yàn)真的很不錯,涵蓋了大部分git命令,git有很多命令很難記住,但magit的幫助非常給力,通常是兩個(gè)字母的組合按鍵,按下前一個(gè)字母之后出現(xiàn)窗口提示下一步能做什么。
相比之下,vim-fugitive就相對簡陋些不過夠用,一個(gè)git status窗口下也能完成很多操作。
lisp
第一次認(rèn)識lisp,是從它的數(shù)學(xué)表達(dá)式開始,然后它竟然是逆波蘭式的,果然名副其實(shí)的古老編程語言,瞬間好感提升。
然后寫lisp需要寫大量的括號,所以好像因此出現(xiàn)一種paredit的編輯模式,減少因?yàn)槔ㄌ柼鄬?dǎo)致的錯誤,看了視頻介紹覺得很好用,特別適合lisp和html這樣的語言。
當(dāng)然我對lisp的認(rèn)識只建立在一兩個(gè)視頻上,所以不敢多少。
org-mode
好吧,我還沒有嘗試過這貨,因?yàn)槲铱吹哪且曨l那位大神說他弄了幾個(gè)月才熟悉。但我大概知道他的作用:todo list & gtd & note ;
這樣的工具非常多了,我不覺得在編輯上面弄這些是個(gè)好的選擇。
所謂的操作系統(tǒng)
- 聽歌什么的
- 收發(fā)郵件
- twitter & 微博
- ...
只要命令行可以做到的,都可以集成到vim & neovim上,實(shí)際的確有。
浮云。
總結(jié)
程序員的編輯器的要求就是:
- 快速編輯
- 文件定位
- 補(bǔ)全跳轉(zhuǎn)
- 搜索替換
除此之外都是浮云,在編輯器方面emacs永遠(yuǎn)輸給vim。
最后貼上我的vim配置是:t-vim