Vim編輯器使用了大概有三年的時(shí)間,emacs呢則是最近幾天才嘗試的竟秫,之所以會(huì)嘗試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)目會(huì)拉攏一部分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è)插件不同文件手動(dòng)放在指定的目錄上
后來出現(xiàn)一種壓縮格式,用戶只需要在vim中執(zhí)行
:so xxx.sz
就可以自動(dòng)將包釋放到對應(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ù)文件類型拄显,動(dòng)作命令來選擇什么時(shí)候加載,用戶可以決定下載包之后的動(dòng)作是什么案站,還可以指定git倉庫的tab和分支躬审。其它。dein.vim和vim-plug不相上下蟆盐,甚至更好承边。neobundle.vim同樣是由Shougo大神寫的,同樣優(yōu)秀不過是他寫的上一代產(chǎn)品石挂,還是推薦dein.vim博助。
emacs默認(rèn)的包管理的話,還有一個(gè)有點(diǎn)痹愚,就是自動(dòng)解決依賴富岳,這對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包來說就挺不錯(cuò)的,能補(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ǔ)全羹饰,會(huì)得到和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
請看下面的動(dòng)圖:
在搜索方面灼卢,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插件了打洼,而且做得非常不錯(cuò)而且可以結(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)真的很不錯(cuò)退敦,涵蓋了大部分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)致的錯(cuò)誤,看了視頻介紹覺得很好用膛堤,特別適合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