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

vim-easymotion,超級強大的光標定位插件,甚至可以在多窗口中定位,evil系列中也實現了一個可惜功能上和用戶體驗差太多了,比如它沒有行模式,不可以多窗口。

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