1. 程式人生 > >跟我一起學習VIM - vim插件合集

跟我一起學習VIM - vim插件合集

意思 同事 ipp 什麽是 如虎添翼 apple oca 終究 情況


2016-06-14 15:04 13333人閱讀 評論(0) 收藏 舉報
分類: Linux(104)
目錄(?)[+]


前兩天同事讓我在小組內部分享一下VIM,於是我花了一點時間寫了個簡短的教程。雖然準備有限,但分享過程中大家大多帶著一種驚嘆的表情,原來編輯器可以這樣強大,這算是對我多年來使用VIM的最大鼓舞吧。所以分享結束之後,將這篇簡短教程整理一下作為我2014年的第一篇Blog。

目錄
寫在前面:Life Changing Editor
什麽是VIM
為什麽選VIM
為什麽選其它
為什麽猶豫選擇它們
VIM >= SUM(現代編輯器)
如何學習VIM
一秒鐘變記事本
VIM的基本用法
VIM進階:插件
插件管理神器:Vundle
配色方案
導航與搜索
自動補全
語法
其它
終極配置: spf13
與其它軟件集成
一些資源
寫在最後
搭完網站之後的第一篇文章有些興奮,先變身話癆簡單回顧一下我是如何接觸到VIM的,不感興趣的同學可以直接跳過這一部分:-)

寫在前面:Life Changing Editor
我是一個非常 懶 的人,對於效率有著近乎執拗的追求。比如我會花2個小時來寫一個腳本,然後使用這個腳本瞬間完成一個任務,而不願意花一個小時來手工完成這項任務,從絕對時間上來說,寫腳本花的時間更長,但我依然樂此不疲。

工欲善其事,必先利其器 ,折騰各種各樣的軟件就成為了我的一大愛好,尤其是各種人稱 神器 的工具類軟件,而 善用佳軟 是這類工具的聚集地,現在我使用的很多優秀的軟件都得知於此,包括VIM,所以,如果你和我一樣,希望擁有眾多“神器”,讓工作事半功倍,可以關註此站。

第一次聽說VIM已經是離開校園參加工作之後的事,那時部門內部大多使用Source Insight代替Visual Studio編寫代碼,大家都被它的代碼管理,自動完成,代碼跳轉等功能所吸引,但一個領導說了句很多Vimer經常會說,至今仍讓我記憶尤新的一句話:

世界上只有三種編輯器,EMACS、VIM和其它

我很反對這種極端的言論,使用何種工具是一個人自由,只要能發揮一個工具最大的效率就行,不應該加以約束,更不應該鄙視。話雖如此,我卻阻擋不住好奇心的驅使,琢磨著到底是什麽樣的編輯器會擁有這樣高的評價。抱著這份好奇,我搜索到了 善用佳軟 ,看到《 普通人的編輯利器——Vim 》,Dieken的《 程序員的編輯器——VIM 》,以及王垠的《 Emacs是一種信仰!世界最強編輯器介紹 》BANG……想到不久前看到的 一段話 :

南中國的雷雨天有怒卷的壓城雲、低飛的鳥和小蟲,有隱隱的轟隆聲嗚嗚咽咽……還有一片肅穆裏的電光一閃。那閃電幾乎是一棵倒著生長的樹,發光發亮的枝丫剛剛舒展,立馬結出一枚爆炸的果實,那一聲炸響從半空中跌落到窗前,炸得人一個激靈,杯中一圈漣漪。

這種一個激靈的感覺不僅僅局限於雷雨天。在我讀完上面幾篇文章之後,簡單的文字亦立刻擊中儃中,炸的一個激靈。從此,我對編輯器的認識被完全顛覆。

很多孩子都有一個夢想:希望能夠長大之後可以身著軍裝,腰插手槍,頭戴警帽,遇到壞人之後瀟灑拔出槍,瞬間解決戰鬥,除暴安良,匡扶正義。我這樣的程序員們也有一個夢想:希望學成之後可以像電影裏黑客們一樣,對著滿屏幕閃爍的各種符號,雙手不離鍵盤劈裏啪啦一陣亂敲,屏幕上的符號不斷滾動,就攻破了幾百公裏之外的某某銀行的服務器,向帳戶裏面增加一筆天文數字,然後瀟灑的離去,神不知鬼不覺,留下不知所措的孩子們的夢想——警察叔叔們。這簡直構成了程序員們的終極幻想:-P。VIM的出現讓我感覺離幻想更近了一步,呃,別想錯了,我是指——雙手不離鍵盤,劈裏啪啦,黑客的範兒。不可否認,扮酷也是促使我學習VIM的一個重要原因:-P。

在一個激靈之後,接下來便是不可自拔的陷入VIM世界,於是網上搜索各種入門教程,_vimrc的配置,折騰插件,研究奇巧淫技,將VIM打造成IDE。那感覺就像世界從此就只有VIM,寫代碼用VIM,Visual Studio用VIM,Source Insight用VIM,甚至寫PDF,瀏覽網頁都要用VIM,夠折騰吧。可是像Vimer們一樣,我依然折騰著,並快樂著。如今,折騰一圈之後,隨著對Unix的KISS設計哲學逐漸理解與認可: 把所有簡單的事情做到極致 。所以在對待VIM的態度上也有了一定的轉變,不再執著的將它打造成萬能的IDE,而僅僅讓它將編輯功能發揮到極致,其它的事情交給其它更擅長的工具去做。 K eep I t S imple, S tupid.

在VIM的 官方網站 上,對每個插件的評價是這樣 分類 的:

Life Changing
Helpful
Unfulfilling
而我想將這個分類應用到使用的軟件上,對於VIM,它是毫無疑問的 Life Changing 。

什麽是VIM
以下兩句對編輯器的最高評價足矣:

VIM is the God of editors, EMACS is God’s editor
EMACS is actually an OS which pretends to be an editor
為什麽選VIM
我們所處的時代是非常幸運的,有越來越多的 編輯器 ,相對於 古老的VIM 和EMACS,它們被稱為 現代 編輯器。我們來看看這兩個古董有多大年紀了:

**EMACS** : 1975 ~ 2013 = 38歲
**VI** : 1976 ~ 2013 = 37歲
**VIM** : 1991 ~ 2013 = 22歲
看到這篇文章的人有幾個是比它們大的:-)

VIM的學習曲線非常陡, 這裏 有一個主流編輯器的學習曲線對比。既然學習VIM如此之難,而 現代 編輯器又已經擁有了如此多的特性,我們為什麽要花大量的時間來學習這個老古董呢?

為什麽選其它
先來看看為什麽我們會選現在所使用的編輯器?(也許很多人直接用IDE自帶的編輯器,我們暫且也把它們劃到編輯器的範疇內。)這裏我簡單列舉一些程序員期望使用的編輯擁有的功能:

輕量級,迅速啟動(相對於IDE)
特性
語法高亮
自動對齊
代碼折疊
自動補全
顯示行號
重定義Tab
十六進制編輯
列編輯模式
快速註釋
高級搜索,替代
錯誤恢復
迅速跳轉
Mark
也許,美觀也是一個訴求
但是…

為什麽猶豫選擇它們
總有一些理由讓我們一再猶豫的選擇它們,或者勉強使用它們:

太貴:雖然知道VS很貴,但看到價格時,還是被嚇了一跳
Visual Studio Profession 2012 : 11645元
UtralEdit : 420元
Source Insight : 2500元
$$
$$
$$
不能跨平臺
VS, SI, UE,Notepad++這些只能在Windows上使用
Mac上的TextMate只能運行於Mac上
不容易擴展
那麽,還有別的選擇麽?

VIM >= SUM(現代編輯器)
首先,VIM包含了上面列的所有現代編輯器的優點,並且遠遠多於此。

並且,VIM擁有讓你不再 猶豫 的其它特性:

無止盡的擴展:現在VIM的官方網站上已經有了 4704 個擴展,並且在不斷增加…
完美的跨平臺:
Windows : gVim
Linux : 內置默認 (e.g., man page)
Mac : MacVim
開源
用起來很酷
最關鍵的,$
廢話結束,開始進入正題。

如何學習VIM
一秒鐘變記事本
很多時候大家希望能夠以最快的速度編輯文檔,而不願意花大量的時間在學習這一工具上,比如偶爾要去Linux改變一下配置。這時VIM有一種方法可以 一秒鐘變記事本 ,打開VIM之後,只需要一個鍵 i ,接下來所有的操作就和Windows上的記事本無異,你所喜愛與習慣的方向鍵也回來了。

這也並沒有多神奇,它只是VIM提供的一種特殊的模式: Insert mode ,在按過 i 之後,你可以在編輯器的左下角看到 INSERT 字樣。但是因為VIM無法使用 CTRL-S 來保存,那麽,在編輯完之後,如何保存退出呢?也很簡單,先按ESC ,再輸入 :wq ,前面一步是告訴VIM退出 INSERT 模式,後面一個命令是保存退出。

我見過很多人這樣用,雖然說這很容易,但是有種暴殄天物的感覺,和給了你一把AK47,你卻把它當成棍子使一樣。要發揮AK47的作用,還請向下看。

VIM的基本用法
最好的入門教程非VIM自帶的 vimtutor 莫屬,它是VIM安裝之後自帶的簡短教程,可以在安裝目錄下找到,只需半個小時左右的時間,就可以掌握VIM的絕大部分用法。這是迄今為止我見過的軟件自帶教程中最好的一個。

當然,網上的VIM教程也非常多,我之前看的是李果正的 大家來學VIM ,很適合入門。

另外推薦陳皓的 簡明VIM練級攻略 ,或者創意十足的遊戲 VIM大冒險 。

VIM大冒險

這遊戲的創意實在是太贊了,打完遊戲,你便掌握了VIM,這才是真正的 寓教於樂 ,下面是摘自這個遊戲的描述:

VIM Adventures is an online game based on VIM’s keyboard shortcuts (commands, motions and operators). It’s the “Zelda meets text editing” game. It’s a puzzle game for practicing and memorizing VIM commands (good old VI is also covered, of course). It’s an easy way to learn VIM without a steep learning curve.

最後在這裏給大家分享一個vgod設計的 VIM命令圖解 。這也是我看過的最好的命令圖示,看完了前面的基本教程後,可以將它作為一個cheat sheet隨時查看,相信用不了多久你也可以完全丟掉它。關於此圖的詳細解釋可以參考 這裏 。

VIM命令圖解

VIM進階:插件
在學完了上面任何一個教程之後,通過一段時間的練習,你已經可以非常熟練的使用VIM。即使是“裸奔”,VIM已經足夠強大,能夠完成日常的絕大部分工作。但VIM更加強大的是它的擴展機制,就像Firefox和Chrome的各種插件,它們將令我們的工具更加完美。網上有很多教程裏寫的插件已經過時,接下來我將介紹一些比較新的,非常有用的插件,看完之後,相信你一定會覺得蠢蠢欲動。

插件管理神器:Vundle
在這開始之前,先簡單介紹VIM插件的管理方式。在我剛接觸插件之時,安裝一個插件需要:

去官網下載
解壓
拷貝到VIM的安裝目錄
運行:help tags
這些步驟已經足夠復雜,更加無法想象的是要 更新 或者 刪除 一個插件時,因為它的文件分布在各個目錄下,就比如Windows上的 安裝路徑 , Application data , 用戶數據 , 註冊表 等等,除非你對VIM的插件機制和要刪的插件了如直掌,否則你能難將它刪除幹凈。所以一段時間之後,VIM的安裝目錄下簡直就是一團亂麻,管理插件幾乎成為了一項不可能完成的任務。想象一下,如果Windows上面沒有軟件管理工具,你如何安裝,卸載一個軟件吧。

但是這沒有難倒聰明的Vimer們,他們利用VIM本身的特性,開發出了神器—— Vundle ,配合上 GitHub ,VIM插件的管理變得前所未有的簡單。來對比一下使用Vundle如何管理插件:

在按照官方的 教程 安裝好Vundle之後,要安裝一個插件時,你只需要:

選好插件
在VIM的配置文件中加一句 Bundle ‘your/script/path‘
在VIM中運行 :BundleInstall
卸載時只需:

去除配置文件中的 Bundle ‘your/script/name‘
在VIM中運行 :BundleClean
更新插件就更加簡單,只需一句 :BundleUpdate 。現在你已經完全從粗活累活中解放了出來,從此註意力只需放在挑選自己喜歡的插件上,還有比這更美好的麽?下面介紹的所有的插件都以它來管理。

配色方案
你是否覺得用了許多年的白底黑字有些刺眼,又或者你是否厭倦了那單調枯燥?如果是,那好,VIM提供了成百上千的配色方案 ,終有一款適合你。

在所有的配色當中,最受歡迎的是這款 Solarized :

陰陽八卦

在Github上它有 4,930 個Star,僅靠一個 配色方案 就得到如此多的Star,可見它有多麽的受歡迎。它有兩種完全相反的顏色,一暗一亮,作者非常具有創意將它們設計成一個 陰陽八卦 ,賞心悅目。下面是采用這種配色的VIM截圖:

Solarized截圖

Solarized配色還有一個使它能夠成為最受歡迎的配色方案的理由,除了VIM之外,它還提供了很多 其它軟件 的配色方案,包括: Emacs , Visual Studio , Xcode , NetBeans , Putty ,各種終端等等,應該是除了默認的黑白配色之外用途最為廣泛的一種了。目前我采用的就是這種配色方案的dark background,它的對比度非常適合長期對著編輯器的程序員們。

還有一種很受歡迎的配色方案: Molokai ,它是Mac上TextMate編輯器的一種經典配色,也非常適合程序員:

Molokai截圖

導航與搜索
NERDTree - file navigationNERDTree

代碼資源管理器現在已經成為了各種各樣IDE的標配,這可以大大提高管理源代碼的效率。這樣的功能VIM自然不能少,NERD Tree提供了非常豐富的功能,不僅可以以VIM的方式用鍵盤來操作目錄樹,同時也可以像Windows資源管理器一樣用鼠標來操作。

--help: 可以將打開目錄樹的功能綁定到你所喜歡的快捷鍵上,比如: map <leader>e :NERDTreeToggle<CR>

CtrlP - fast file finderCtrlP

如果說上面介紹的NERD Tree極大的方便了源代碼的管理方式,那CtrlP可以稱的上是革命性的,殺手級的VIM查找文件插件。它以簡單符合直覺的輸入方式,極快的響應速度,精確的準備度,帶你在項目中自由穿越。它可以模糊查詢定位,包括工程下的所有文件,已經打開的buffer,buffer中的tag以及最近訪問的文件。在這之前,我用的是lookupfiles ,因為依賴了其它的插件和應用程序,這個上古時代的插件逐漸被拋棄了。自從有了它,NERD Tree也常常被我束之高閣。

據說它模仿了Sublime的名字和功能,我沒用過Sublime,但是聽說CtrlP這個功能是Sublime最性感的功能之一。可以去它的 官網 看看。

--help: 這個插件另一個令人稱贊的一點在於無比簡單直觀的使用方式,正如其名: Ctrl+P ,然後享受它帶來的快感吧。

Taglist - source code browserTaglist

想必使用過Visual Studio和Source Insight的人都非常喜愛這樣一個功能:左邊有一個Symbol窗口,它列出了當前文件中的宏、全局變量、函數、類等信息,鼠標點擊時就會跳到相應的源代碼所在的位置,非常便捷。Taglist就是實現這個功能的插件。可以說symbol窗口是程序員不可缺少的功能,當年有很多人熱衷於借助taglist、ctags和cscope,將VIM打造成一個非常強大的Linux下的IDE,所以一直以來,taglist在VIM官方網站的scripts排列榜中一直高居 榜首 ,成為VIM使用者的必備插件。

--help: 最常見的做法也是將它綁定到一個快捷鍵上,比如: map <silent> <F9> :TlistToggle<CR>

Tagbar - tag generation and navigationTagbar

看起來Tagbar和上面介紹的Taglist很相似,它們都是展示當前文件Symbol的插件,但是兩者有一定的區別,大家可以從上圖的對比中得知,兩者的關註點不同。總的來說Tagbar對面向對象的支持更好,它會自動根據文件修改的時間來重新排列Symbol的列表。它們以不同的緯度展示了當前文件的Symbol。

--help: 同Taglist一樣,可以這樣綁定它的快捷鍵, nmap <silent> <F4> :TagbarToggle<CR>

Tasklist - eclipse task listTasklist

這是一個非常有用的插件,它能夠標記文件中的 FIXME 、 TODO 等信息,並將它們存放到一個任務列表當中,後面隨時可以通過Tasklist跳轉到這些標記的地方再來修改這些代碼,是一個十分方便實用的Todo list工具。

--help: 通常只需添加一個映射: map <leader>td <Plug>TaskList

自動補全
YouCompleteMe - visual assist for vimYouCompleteMe

這是迄今為止,我認為VIM歷史上最好的插件,沒有之一。為什麽這麽說?因為作為一個程序員,這個功能必不可少,而它是迄今為止完成的最好的。從名字可以推斷出,它的作用是代碼補全。不管是在Source Insight,還是安裝了Visual Assist的Visual Studio中,代碼補全功能可以極大的提高生產力,增加編碼的樂趣。大學第一次遇到Visual Assist時帶給我的震撼至今記憶猶新,那感覺就似百獸之王有了翅膀,如虎添翼,從此只要安裝有Visual Studio的地方我第一時間就會安裝Visual Assist。

而作為編輯器的VIM,一直以來都沒有一個能夠達到Visual Assist哪怕一成功力的插件,不管是自帶的補全,omnicppcomplete , neocompletecache ,完全和Visual Assist不在一個數量級上。Visual Assist借助於Visual Studio,它的補全是語義層面的,它完全能夠理解程序語言,而VIM的這些插件僅僅是基於文本匹配,雖然最近的neocompletecache 已經好了很多,但準確率非常低。所以在寫代碼時,即使VIM用得再順手,絕大部分情況下我還是傾向於 Visual Studio + Visual Assist 。

但是YouCompleteMe的出現徹底的改變了這一現狀,它對代碼的補全完全終於也達到了編譯器級別,絕不弱於Visual Assist,遇到它是我使用VIM之後最興奮的一件事。為什麽一個編輯器的插件可以做到如此的神奇,原因就在於它基於 LLVM/clang ,一個Apple公司為了代替GNU/GCC而支持的編譯器,正因為YouCompleteMe有了編譯器的支持,而不再像以往的插件一樣基於文本來進行匹配,所以準確率才如此之高。其次,由於它是C/S架構,會在本機創建一個服務器端,利用clang來解析代碼,然後將結果返回給客戶端,所以也就解決了VIM是單線程而造成的各種補全插件速度奇慢的詬病,在使用時,幾乎感覺不到任何的延時,體驗達到了Visual Assist的級別。

YouCompleteMe也是所有的插件當中安裝最為復雜的一個,這是因為需要用clang來編譯相應的庫。因為clang在Linux和Mac平臺上支持的非常好,所以在這兩個平臺上安裝相對簡單。但是clang並沒有官方支持Windows,所以YouCompleteMe插件也沒有官方支持Windows。可這麽好的東西,活躍在Windows上聰明的Vimer們怎麽可能容忍這種事情呢,有人就提供了 Windows Installation Guide ,已經編譯好了各種版本的YouCompleteMe插件,可以參考這個Guide來安裝。我並沒有采用它,而是參考了 這裏 ,自己編譯了YouCompleteMe,其實也不難,一步一步按照介紹的步驟,相信你也可以。

YouCompleteMe除了補全以外,還有一個非常重要的作用: 代碼跳轉 ,同樣可以達到編譯器級別的準確度,媲美Visual Assist與Source Insight。

有了YouCompleteMe之後,是時候拋棄昂貴的Visual Assist與Source Insight了。趕快安裝嘗試吧:-)

--help: 只要設置好項目的 .ycm_extra_conf.py ,自動補全功能就可以完美的使用了。通常一個全局的.ycm_extra_conf.py 足矣。代碼跳轉可以綁定一個快捷鍵: nnoremap <leader>jd :YcmCompleterGoToDefinitionElseDeclaration<CR> ,很好理解,先跳到定義,如果沒找到,則跳到聲明處。

UltiSnips - ultimate snippetsUltiSnips

這是什麽?相信大家經常在寫代碼時需要在文件開頭加一個版權聲明之類的註釋,又或者在頭文件中要需要:#ifndef... #def... #endif 這樣的宏,亦或者寫一個 for 、 switch 等很固定的代碼片段,這是一個非常機械的重復過程,但又十分頻繁。我十分厭倦這種重復,為什麽不能有一種快速輸入這種代碼片段的方法呢?於是,各種snippets插件出現了,而它們之中,UltiSnips是最好的一個。比如上面的一長串 #ifndef... #def... #endif ,你只需要輸入 ifn<TAB> ,怎麽樣,方便吧。更為重要的一點是它支持擴展,你可以隨心所欲的編輯你自己的snippets。

現在它可以和上面介紹的YouCompleteMe插件一塊使用,比如在敲完 ifn 時,YouCompleteMe會將這個snippet也放在下拉框中讓你選擇,這樣你就不用去記何時按 <TAB> 來展開snippets,YouCompleteMe已經幫你完成。

去它的 網站 看看,有幾個視頻,絕對亮瞎你的雙眼(需要FQ)。

--help: 它和YouCompleteMe一塊使用時會有一定的沖突,因為兩者都默認綁定了 <TAB> 鍵,可以參考各自的help 文檔,將其中一個綁定到其它的快捷鍵,或者借助 其它的插件 讓它們兼容。

Zen Coding - hi-speed coding for html/css Zen Coding

比一般的 C/C++/Java 等更多重復勞動的語言估計要算HTML/CSS這類前端語言了吧,為此前端大牛發明了Zen Coding,去 這裏 (需FQ)看看演示視頻,相當令人震撼。如果是寫前端的話,強烈推薦此插件。

--help: 可以去這裏參考前端工程師們寫的中文教程 1 , 2

語法
Syntastic - integrated syntax checkingSyntastic

這是一個非常有用的插件,它能夠實時的進行語法和編碼風格的檢查,利用它幾乎可以做到編碼完成後無編譯錯誤。並且它還集成了靜態檢查工具: lint ,可以讓你的代碼更加完美。更強大的它支持近百種編程語言,像是一個集大成的實時編譯器。出現錯誤之後,可以非常方便的跳轉到出錯處。 強烈推薦 。

--help: 這是一個後臺運行的插件,不需要手動的任何命令來激活它。

Python-mode - Python in VIM

如果你需要寫Python,那麽Python-mode是你一定不能錯過的插件,靠它就可以把你的VIM打造成一個強大的Python IDE,因為它可以做到一個現代IDE能做的一切:

查詢Python文檔
語法及代碼風格檢查
運行調試
代碼重構
……
所以,有了它,你就等於有了一個現代的Python IDE,各位Pythoner們,還等什麽呢?

--help: 默認情況下該插件已經綁定了幾個快捷鍵:

K -> 跳到Python doc處
<leader>r -> 運行當前代碼
<leader>b -> 增加/刪除斷點
其它
Tabularize - align everything Tabularize

這個插件的作用是用於按等號、冒號、表格等來對齊文本,參考下面這個初始化變量的例子:

int var1 = 10;
float var2 = 10.0;
char *var_ptr = "hello";
運行 Tabularize /= 可得:

int var1 = 10;
float var2 = 10.0;
char *var_ptr = "hello";
另一個常見的用法是格式化文件頭:

file: main.cpp
author: feihu
date: 2013-12-17
description: this is the introduction to vim
license:
TODO:
運行 Tabularize /:/r0 可得:

file : main.cpp
author : feihu
date : 2013-12-17
description : this is the introduction to vim
license :
TODO :
另一種對齊方式,運行 Tabularize /:/r1c1l0 :

file : main.cpp
author : feihu
date : 2013-12-17
description : this is the introduction to vim
license :
TODO :
對於寫代碼的人來說,還是非常有用的。因為沒有找到對應的圖,所以這裏就用 另外一個插件 的動畫來代替了,Tabular的功能比它更為強大。

--help: 通常會綁定這樣一些快捷鍵:

nmap <Leader>a& :Tabularize /&<CR>
vmap <Leader>a& :Tabularize /&<CR>
nmap <Leader>a= :Tabularize /=<CR>
vmap <Leader>a= :Tabularize /=<CR>
nmap <Leader>a: :Tabularize /:<CR>
vmap <Leader>a: :Tabularize /:<CR>
nmap <Leader>a:: :Tabularize /:\zs<CR>
vmap <Leader>a:: :Tabularize /:\zs<CR>
nmap <Leader>a, :Tabularize /,<CR>
vmap <Leader>a, :Tabularize /,<CR>
nmap <Leader>a,, :Tabularize /,\zs<CR>
vmap <Leader>a,, :Tabularize /,\zs<CR>
nmap <Leader>a<Bar> :Tabularize /<Bar><CR>
vmap <Leader>a<Bar> :Tabularize /<Bar><CR>
Easymotion - jump anywhereEasymotion

VIM本身的移動方式已經是極其高效快速,它在編輯器的世界中獨樹一幟,算是一個極大的創新。而如果說它的移動方式是一個創新的話,那麽Easy Motion的移動方式就是一個劃時代的革命。利用VIM的 #w 、 #b 、 :# 等操作,移動到一個位置就像是大炮瞄準一個目標,它可以精確到一個大致的範圍內。而Easy Motion可以比作是精確制導,它可以準備無誤的定位到一個字母上。

這種移動方式我曾在Firefox和Chrome的VIM插件中看到過,跳轉到一個超鏈時就采用了同樣的方式,但是由於瀏覽網頁的特殊性與隨意性,當時我沒有適應。在編輯的時候就不一樣了,編輯更加專註,更帶有目的性,所以它能夠極大的提高移動速度。享受這種光標指間跳躍,指隨意動,移動如飛的感覺:-P

--help: 插件默認的快捷鍵是: <leader><leader>w ,效果如上圖所示。

NERDCommenter - comment++NERDCommenter

又是一個寫代碼必備的插件,用於快速,批量註釋與反註釋。它適用於任何你能想到的語言,會根據不同的語言選擇不同的註釋方式,方便快捷。

--help: 十分簡單的用法,默認配置情況下選擇好要註釋的行後,運行 <leader>cc 註釋, <leader>cu 反註釋,也可以都調用 <leader>c<SPACE> ,它會根據是否有註釋而選擇來註釋還是取消註釋。

Surround - managing all the “’[{}]’” etcSurround

在寫代碼時經常會遇到配對的符號,比如 {}[]()‘‘""<> 等,尤其是標記類語言,比如html, xml,它們完全依賴這種語法。現代的各種編輯器一般都可以在輸入一半符號的時候幫你自動補全另外一半。可有的時候你想修改、刪除或者是增加一個塊的配對符號時,它們就無能為力了。

Surround就是一個專門用來處理這種配對符號的插件,它可以非常高效快速的修改、刪除及增加一個配對符號。如果你經常和這些配對符號打交道,比如你是一個前端工程師,那麽請一定不要錯過這樣一個神級插件。

--help: :部分常用快捷鍵如下:

Normal mode
ds - delete a surrounding
cs - change a surrounding
ys - add a surrounding
yS - add a surrounding and place the surrounded text on a new line + indent it
yss - add a surrounding to the whole line
ySs - add a surrounding to the whole line, place it on a new line + indent it
ySS - same as ySs

Visual mode
s - in visual mode, add a surrounding
S - in visual mode, add a surrounding but place text on new line + indent it

Insert mode
<CTRL-s> - in insert mode, add a surrounding
<CTRL-s><CTRL-s> - in insert mode, add a new line + surrounding + indent
<CTRL-g>s - same as <CTRL-s>
<CTRL-g>S - same as <CTRL-s><CTRL-s>
Gundo - time machine Gundo

現代編輯器都提供了多次的撤消和重做功能,這樣你就可以很放心的修改文檔或者恢復文檔。可是假如你操作了5次,然後撤消2次,再重新編輯後,你肯定是無法回到最開始的3次編輯了,因為在你復雜的操作後,編輯器維護的Undo Tree實際上出現了分支,而一般的 CTRL+Z 和 CTRL+R 無法實現這麽復雜的操作。

這時VIM的優勢又體現了出來,它不僅提供無限撤消,VIM 7.3之後還有永久撤消功能,即使文件關閉後再次打開,之前的修改仍然可以撤消。而Gundo提供了一個樹狀圖形的撤消列表,下方還有每次修改的差異對比,分支一目了然,相當於一個面向撤消與編輯操作的版本控制工具。有了它,你的文件編輯就像是有了一臺時光機,可以隨心所欲的回到任何時間,乘著你的時光機,放心大膽的去穿梭時空吧:-P

--help: 通常會將這句加入 _vimrc : nnoremap <Leader>u :GundoToggle<CR>

Sessionman - session manager

這是VIM的Session Manager,作用很簡單,管理VIM的會話,可以讓你在重新打開VIM之後立刻進行之前的編輯狀態,就像Windows的休眠一樣,相信它一定是你工作的好伴侶。

--help: 我的配置如下:

set sessionoptions=blank,buffers,curdir,folds,tabpages,winsize
nmap <leader>sl :SessionList<CR>
nmap <leader>ss :SessionSave<CR>
nmap <leader>sc :SessionClose<CR>
Powerline - ultimate statusline utility Powerline

增強型的狀態欄插件,可以以各種漂亮的顏色展示狀態欄,顯示文件編碼,類型,光標位置,甚至可以顯示版本控制信息。不僅功能強大,寫著代碼時看著下面賞心悅目的狀態狀,心情也因此大好。像我一樣的外觀控一定無法抗拒它:-)

--help: 簡單實用,無需多余的配置。

終極配置: spf13
至此,我經常用到的所有插件都介紹完了,如果你也都安裝嘗試一下的話,相信很容易就配置出來符合你個人習慣的強大的IDE。也許有人會想,這麽多的主題、個性化設置、插件,配置太麻煩,有沒有已經配置好的,可以直接拿來使用呢?其實我當時也有一樣的想法,在折騰了很久之後,發現 _vimrc 已經非常龐大且混亂,亟需整理。再後來就發現了它, spf13 :

spf13

它是 Steve Francia’s Vim Distribution ,但是組織的非常整潔,容易擴展,並且跨平臺,易於安裝維護。在看到的所有_vimrc 中,這是寫的最漂亮的一個。只需要一個簡單的腳本就可以 安裝 ,這裏面利用了方便的 Vundle 集成了絕大部分前面介紹的插件,並且還有大量其它的插件,具體可以看它的 .vimrc.bundles 。

因為它完美的結構組織,你完全可以在不修改它任何文件的基礎上,對應增加幾個自己的 ~/.vimrc.local ,~/.vimrc.bundles.local , ~/.vimrc.before.local 文件來增加自己的個性化配置,或者增加刪除插件,可擴展性極強。在我的 _vimrc 亂成一團的情況,果斷fork並安裝了這個Distribution,增加了自己的一些配置,最終形成了現在的VIM。如果你也不願折騰配置,那麽完全可以直接安裝它,省事方便的同時還可以學習一下它的組織結構,一舉兩得。

與其它軟件集成
因為VIM的操作方式廣泛為人們所逐漸接受,尤其是經常工作在Linux下的人們,所以它越來越多的被集成到其它一些常用的工具上,我用過的就包括:

Visual Studio

本身Windows下的gVim安裝包在安裝時會提供一個集成到Visual Studio中的插件 VsVim ,可以選擇安裝,但它是另開一個VIM的窗口來編輯當前的文件,我並不習慣這種方式,所以又找到了 ViEmu ,它完美的將VIM的操作方式集成到了Visual Studio中,讓你根本感覺不到這是在使用Visual Studio。更加強大的是,它可以完美的和Visual Assist集成:

Build 1854 contains a workaround for case=58034. Create a binary registry value named TrackCaretVisibility under HKCU\Software\Whole Tomato\Visual Assist X\VANet10 and set its value to 00 for compatibility with ViEmu. (The value defaults to 01 and is created for you upon exiting VS the first time you run 1854 or higher.) Note you need to close all IDEs before editing this registry key, to avoid Visual Assist X overwriting your change when it exits.

在遇到YouCompleteMe之前,這就是我所采用的編程環境。但這是一個商業版的插件,只有30天的試用期,如果你真的喜歡它的,完全可以買下它,絕對物超所值。更為強大的是它還支持 Xcode 、 Word 、 Outlook 、 SQLServer ,這一定是一個極端的Vimer的項目:-),來看看它的動畫:ViEmu

Source Insight

VIM也可以集成到Source Insight中,不過我沒有去找相應的插件,只找一種和前面介紹的 VsVim 一樣的方法:

在Source Insight菜單中,Options-Custom Commands
Run: “C:\Program Files\Vim\vim74\gvim.exe” –remote-silent +%l %f
Dir: %d
Add之後再Options-Key Assignments,將它綁定到一個快捷鍵中,比如 F11
這樣編輯一個文件時,如果你想打開VIM時,直接按 F11 ,它就會跳到當前行,編輯完之後關閉VIM,又回到Source Insight中。這種方法我用過一段時間,後來由於很少用Source Insight寫代碼,也逐漸淡忘了。

Firefox/Chrome

在狂熱於VIM的年代,我曾想把一切操作都變成VIM的方式,包括上網。所以就找到了 Vimperator ,但終究由於上網是一種更加隨性、無目的的行為,拿著鼠標隨便點點完全可以了,所以也就放棄它,回歸到正常的操作方式下,有興趣的可以把玩一下,很有意思,之前談到的 Easy Motion 我就在這裏見識過。Chrome下也有相應的 插件 。

一些資源
最後附上一些有趣有用的資源:

一篇非常好的為什麽使用VIM的文章,請看 這裏
為什麽VIM使用HJKL作為方向鍵?請看 這裏
為什麽VIM和EMACS被稱為最好的編輯器?這看 這裏
VIM作者的演講:《 高效編輯的7個習慣 》,視頻請點 這裏
寫在最後
網上可能有很多人像我之前一樣,過於關註工具本身,而忽略了一個非常重要的問題:工具之所以稱為工具,僅僅在於它是被人們拿來使用,只要順手就好,用它來做的事情才是關鍵。對於我們開發人員來說,專業知識永遠比工具更為重要。自打VIM出生以來,就有幾個亙古不變的話題:

VIM vs Emasc
VIM vs 其它編輯器
VIM vs IDE
爭論從來沒有平息過,從遠古時期的大牛們,到剛剛踏入VIM陣營的我們,也從來沒有一個結論。也許很多人爭吵已經不再是單單的編輯器之爭,而是出於維護心目中最好的工作方式,甚至哲學之爭。但對於大部分人來說,只要你的工具足夠稱手,那麽多寫幾行代碼,多看些書,遠比參與這些無休止的爭吵強得多。但如果你更深一步,開發出更好的編輯器,或者插件,那又另當別論了。

這篇教程至此也將告一段落,說是教程,本文卻並沒有詳細的介紹如何入門,反而回憶了一大段個人學習VIM的經歷,然後介紹了常用的優秀插件。也許看完本文,你並不一定能夠學會VIM,但是它提供了很多比本文更有價值去學習的資源,給了你一個整體的認識,讓你看到VIM可以強大到什麽程度,避免走很多彎路。看完本文之後,你能夠知道如何入門,如何去選插件,我想,對於本文來說,這就夠了。

轉自:http://ju.outofmemory.cn/entry/79671


跟我一起學習VIM - vim插件合集