對於windows上做C++開發的用戶來說,vs為他們做了大量的工作,語法高亮、自動縮進、智能提示等等,當你happy的使用vs時,請記住一點, 這是一個收費軟件,雖然在我大中華普遍都在使用微軟的盜版軟件,但作為程序員我們心里應該知道這是不對的行為,然后再去——等等,我們今天討論的不是這個 話題,我們要說的是Linux下的免費軟件vim!
vim插件安裝的教程在互聯網上已經數不勝數,但是質量也參差不齊,很多都是在其它地方轉載copy,而且沒有注明使用環境,很多人安裝時發現無法work,最后搞得一團糟,今天這篇文章的宗旨只有兩個:1、使得安裝簡單;2、保證可以用。
閱讀這篇文章的前提是你至少使用過vim,知道基本的操作。下面就開始進入主題。
准備工作
由於大多數vim插件都可以在github上找到,而且通過git安裝、刪除、升級插件都異常簡單,因此我們需要首先安裝git工具,如果不知道git和github,可以先自行Google
centos安裝
sudo yum install git
ubuntu安裝
sudo apt-get install git
Mac安裝
由於Mac沒有像yum和apt-get一樣的包管理工具,需要先安裝一個類似的包管理工具,這對於安裝一些Linux命令是非常有幫助的
- 安裝包管理工具homebrew
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
- 通過brew安裝git
brew install git
我將本文需要安裝的插件和配置文件都放在了github上,如果你不想大費周折的了解每個插件的安裝方式,可以直接下載所有插件即可使用,項目地址https://github.com/handy1989/vim,可以按照如下命令備份並一次安裝所有插件(注意,從git上下載的vim目錄下都是隱藏文件,mv ~/.vimrc ~/.vimrcbak mv ~/.vim ~/.vimbak git clone https://github.com/handy1989/vim.git mv vim/.vimrc ~/.vim ~/
第一個插件pathogen
為了不讓插件安裝后目錄顯得凌亂,我們很有必要安裝一個管理插件的插件,這樣功能的插件有好幾個,這里只推薦一個pathogen
項目地址
https://github.com/tpope/vim-pathogen
安裝
可以通過git安裝,也可以直接下載插件文件,由於這個插件只有一個文件,我們選擇后者,而該插件的說明文檔上也是用的這種方法。
mkdir -p ~/.vim/autoload ~/.vim/bundle &&
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
然后,就沒有然后,這個插件就安裝完了。是不是覺得so easy! 不過先別急,我們還要對插件進行一些配置,用vim打開~/.vimrc,輸入如下三行類容
execute pathogen#infect() syntax on filetype plugin indent on
保存退出,這個插件的安裝配置就完成了,怎么驗證插件有沒有生效呢,別急,后面有的是機會驗證。我們先來講講vim插件是個什么東西。
此時你的~/.vim目錄結構應該是這樣的
├── autoload │ └── pathogen.vim └── bundle
可見~/.vim目錄下是有兩個目錄,其中autoload放的是pathogen插件,所謂的插件其實就是一個腳本,當vim啟動時,它會自動加載~/.vim/autoload目錄下的腳本,由於你~/.vimrc里配置了 auto-pairs
項目地址
https://github.com/jiangmiao/auto-pairs(感興趣的可以看)
功能
自動匹配括號、引號等
安裝
git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs
這樣就將auto-pairs在github上的項目文件下載到了~/.vim/bundle/auto-pairs目錄下
測試
隨便打開一個文件,輸入左括號'(',看右括號是不是自動出現了,然后刪除左括號,看右括號是不是也被刪除了。當然功能遠不止這些,但常用的就這幾點。
NERDTree
項目地址
https://github.com/scrooloose/nerdtree
功能
顯示目錄樹
安裝
git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle
此時~/.vim/bundle/nerdtree下應該有如下幾個目錄和文件
autoload doc lib nerdtree_plugin plugin README.markdown syntax
這幾個目錄是vim默認的插件目錄,如果我們不是通過pathogen加載插件,就需要在~/.vim目錄下創建對應的這幾個目錄,並將NERDTree 對應的文件拷到相應的目錄,這樣每個目錄下會放置多個插件的內容,比如~/.vim/doc下就會放置所有插件的幫組文檔,而我們通過pathogen來 管理,每個插件的所有內容都放在同一個目錄中,比如這里的NERDTree插件的內容我們下載到了~/.vim/bundle/nerdtree下,直接 刪除這個目錄即可刪除插件,如果后續插件有更新,在該目錄下通過git命令也可以很容易更新到最新版本。
打開vim,在命令行模式下輸入:Helptags載入插件的幫組文檔,或者用:helptags help_dir載入指定目錄的幫組文檔,其中help_dir是你需要加載的插件幫組文檔所在的目錄,比如這里是~/.vim/bundle/nerdtree/doc
測試
用vim打開一個文件,在命令行模式下輸入:NERDTree,然后回車,窗口左側就出現了vim工作目錄的目錄樹,如下圖所示
將光標置於NERDTree窗口,按'?'可查看幫助,NERDTree的操作很簡單,通常是將光標置於一個目錄/文件上,通過一個按鍵來操作,下面列出幾個常用按鍵及其對應的操作
文件相關操作 o : 在光標所在的上一個窗口打開文件,並將光標置於新打開的窗口 go : 預覽文件,光標停留在NERDTree窗口中 t : 在新標簽中打開文件並激活 gt : 在新標簽打開文件,光標留在NERDTree窗口中 i : 水平分割打開文件 gi : 水平分割預覽 s : 垂直分割打開文件 gs : 垂直分割預覽 目錄樹相關操作 o : 展開/關閉目錄 O : 遞歸展開目錄。慎用,如果目錄層級多,打開會很慢 x : 關閉父目錄 C : 切換光標所在目錄為根目錄 u : 切換目錄樹的根目錄為上層目錄 U : 切換目錄樹的根目錄為上層目錄,並保持舊的目錄樹的狀態 r : 刷新當前目錄 R : 刷新當前根目錄(這個在新加入文件后會用到) cd : 切換vim工作目錄為光標所在目錄(命令模式下:pwd可查看當前工作目錄)
為了方便打開NERDTree,我們可以設置快捷鍵,打開~/.vimrc,插入如下一行
map <C-n> :NERDTree<CR>
這樣,當打開vim時,只要輸入ctrl+n即可打開NERDTree
MiniBufExplorer
項目地址
http://www.vim.org/scripts/script.php?script_id=159
功能
顯示已打開的buffer
安裝
以6.3.2版本為例,根據項目地址可以找到對應版本的下載鏈接
mkdir -p ~/.vim/bundle/minibufexplorer/plugin && wget "http://www.vim.org/scripts/download_script.php?src_id=3640" -O ~/.vim/bundle/minibufexplorer/plugin/minibufexpl.vim
測試
用vim打開一個文件,此時看不到minibufexplorer窗口,因為默認是只有一個buffer時不顯示窗口的,在命令行模式下通過
我們先來解釋一下什么叫buffer,vim為每個打開的文件都創建了一個buffer,這個buffer存儲在內存中,為了下次打開文件時快速加載,比 如我們通過NERDTree瀏覽並打開了多個文件,即便某些文件你退出了編輯,它的buffer仍舊是存在的,在命令模式下,我們輸入:b N
,其中N代表buffer編號,可以打開對應的buffer。對應上面的截圖,我們打開了兩個文件,此時 minibufexplorer窗口顯示有兩個buffer,即便我們關閉一個文件,這兩個buffer仍然存在,將光標移到某個buffer的名稱上, 回車可打開對應的buffer,按 配置
在~/.vimrc文件中加入如下命令
let g:miniBufExplMaxSize = 2
該配置含義為minibufexplorer窗口最大高度為2行,默認是沒有上限的,你打開的buffer足夠多,一會一直增長下去,為了方便閱讀我一般將它設為2,其它配置不怎么用到,需要用的時候可以參考插件文件,並在~/.vimrc中添加配置
ctags+taglist+omnicppcomplete
接下來就到了重磅戲了,前面還只是一些窗口相關的基本操作,是為了方便瀏覽文件,我們閱讀C++代碼時希望能快速定位函數、變量,類似於VS等其它IDE提供的功能
ctags
這個並不是插件,而是可執行程序,是用來對代碼建索引,方便查找的,有些Linux版本是自帶ctags的,如果沒有,按如下方式安裝
sudo yum install ctags
ubuntu安裝方式
sudo apt-get install ctags
mac也是自帶ctags的,但是那個不好用,可以重新安裝
brew install ctags
如果安裝失敗,看是不是因為/usr/bin/ctags文件已經存在,可以先mv走,然后再執行
創建索引:在你代碼的根目錄執行如下命令,會生成一個tags文件,此時在代碼根目錄下打開一個文件(vim默認只加載工作目錄下的tags文件),將光標置於一個函數或結構體名字上,按ctr+o
可回到光標之前的位置
ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
taglist
taglist是vim的一個插件,可以將代碼內的函數、變量等按規律列出來,方便查找
下載地址
http://www.vim.org/scripts/script.php?script_id=273,或者直接按如下方式下載並安裝
cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=19574" -O taglist.zip && unzip taglist.zip -d taglist
這樣就生成了~/.vim/bundle/taglist目錄,該目錄的結構為
taglist ├── doc │ └── taglist.txt └── plugin └── taglist.vim
其中plugin目錄下為插件文件,doc目錄下為說明文檔。打開vim,在命令行模式下輸入help taglist.txt
則可以顯示說明文檔
配置
打開~/.vimrc,輸入如下內容
let Tlist_Show_One_File=1 " 只展示一個文件的taglist let Tlist_Exit_OnlyWindow=1 " 當taglist是最后以個窗口時自動退出 let Tlist_Use_Right_Window=1 " 在右邊顯示taglist窗口 let Tlist_Sort_Type="name" " tag按名字排序
這幾行配置看名字就能知道什么意思,引號后邊是說明,在vim配置文件里,雙引號代表注釋,類似於C語言里的/
如果打開過程中出現問題,例如
Taglist: Failed to generate tags for /Users/Zorba/Dropbox/RubymineProjects/rcafe/app/controllers/posts_controller.rb /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ctags: illegal option -- -^@usage:
ctags [-BFadtuwvx] [-f tagsfile] file ...^@
就要重新安裝一遍ctags
```
brew install ctags-exuberant
```
測試
打開一個文件,在命令行模式下輸入
OmniCppComplete
這是一個對C++進行語法補全的插件,可以對函數、命名空間、類成員等進行補全,使用起來和絕大多數IDE差不多,不一樣的是IDE為你做了很多你不知道的事情,而omni補全需要依賴tags文件,需要你用ctags命令自己生成
下載地址
http://www.vim.org/scripts/script.php?script_id=1520
也可用如下命令直接下載並安裝
cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=7722" -O omnicppcomplete.zip && unzip omnicppcomplete.zip -d omnicppcomplete
該命令會生成~/.vim/bundle/omnicppcomplete目錄,目錄結構為
├── after │ └── ftplugin │ ├── cpp.vim │ └── c.vim ├── autoload │ └── omni │ ├── common │ │ ├── debug.vim │ │ └── utils.vim │ └── cpp │ ├── complete.vim │ ├── includes.vim │ ├── items.vim │ ├── maycomplete.vim │ ├── namespaces.vim │ ├── settings.vim │ ├── tokenizer.vim │ └── utils.vim └── doc └── omnicppcomplete.txt
打開vim,在命令行模式下輸入:help omnicppcomplete
查看說明文檔
配置
打開~/.vimrc文件,輸入
filetype plugin indent on set completeopt=longest,menu let OmniCpp_NamespaceSearch = 2 " search namespaces in the current buffer and in included files let OmniCpp_ShowPrototypeInAbbr = 1 " 顯示函數參數列表 let OmniCpp_MayCompleteScope = 1 " 輸入 :: 后自動補全 let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
測試
前面說過,omni插件的補全是依賴於tags文件的,因此需要我們手動建立tags文件,假設現在有兩個文件hello.h和hello.cpp如下
我們在和這兩個文件所在的目錄輸入
ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
這樣就生成了tags文件,然后我們打開main.cpp來測試,當輸入hello.h和hello.cpp中的函數或結構體時,通過按
通過按ctr+n和ctr+p可以對候選項進行上下選擇。通過這種方式可以實現對函數、結構體的補全
對STL補全
上面的方式只能對自己的代碼進行補全,是當我們要使用其它庫比如STL甚至是第三方庫時就無法補全,原因很簡單,我們只對自己的代碼建立了tags文件, 想要對其它庫進行補全,就必須對它們的源代碼建立tags文件,所幸的是vim的插件編寫者們早已解決了這個需求,並且他們專門針對STL頭文件進行了修 改,以便能更好的適應omni的補全,首先下載STL源代碼,地址為http://www.vim.org/scripts/script.php?script_id=2358,可通過如下命令下載並解壓
mkdir -p ~/.vim/tags && cd ~/.vim/tags && wget "http://www.vim.org/scripts/download_script.php?src_id=9178" -O - | tar jxvf -
這樣就將STL的源碼下載到了~/.vim/tags/cpp_src目錄下,我們在該目錄下執行ctags命令
ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
這樣就生成了~/.vim/tags/cpp_src/tags這個文件,然后打開~/.vimrc進行如下設置
set tags+=~/.vim/tags/cpp_src/tags
該命令是設置tags文件的搜索路徑,默認只有vim工作目錄的tags文件,這樣設置之后就會同時加載指定目錄的tags文件,你可以在后面添加更多其它第三方庫的tags文件,現在對STL的補全效果如下

omnicppcomplete的補全設置雖然麻煩,但也讓我們更加清楚了插件是怎樣工作的,作為程序員,至少應該對某些東西的工作原理搞清楚,而不是像使用IDE一樣不管任何東西,你想自定義一下東西也無從下手。
omnicppcomplete觸發補全需要用到 SuperTab
項目地址
https://github.com/ervandew/supertab
安裝
使用git進行安裝是最方便的
cd ~/.vim/bundle && git clone https://github.com/ervandew/supertab.git
測試
無需任何配置即可使用,這時你想要補全變量名或函數名只需按一下TAB鍵即可,出現候選窗口之后也可以用TAB鍵進行選擇,這樣是不是方便了很多!
由於TAB鍵被映射成了補全快捷鍵,也就無法通過TAB鍵直接輸入制表符,這時如果想要輸入制表符可以通過ctr+v ctr+w
最終的配置文件
裝了這么多插件,在配置文件~/.vimrc里也增添了不少內容,最后你的配置文件至少應該包含以下內容
set tags+=~/.vim/tags/cpp_src/tags " 設置tags搜索路徑 syntax on filetype plugin indent on map <C-n> :NERDTree<CR> " pathongen execute pathogen#infect() " taglist let Tlist_Show_One_File=1 let Tlist_Exit_OnlyWindow=1 let Tlist_Use_Right_Window=1 let Tlist_Sort_Type="name" " omnicppcomplete set completeopt=longest,menu let OmniCpp_NamespaceSearch = 2 " search namespaces in the current buffer and in included files let OmniCpp_ShowPrototypeInAbbr = 1 " 顯示函數參數列表 let OmniCpp_MayCompleteScope = 1 " 輸入 :: 后自動補全 let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
這個配置文件全都是和插件相關的配置,你還可以在里面添加其它配置來靈活定制你的vim,由於本文主要介紹插件相關內容,就不展開介紹了
總結
vim的C++開發環境到此就配好了,總的來說我們安裝了這么幾類插件
- 管理插件的插件
- 管理窗口和buffer
- 語法增強
- 代碼補全
通過這些插件我們可以將vim打造成一個好用的IDE,雖然經過了很多周折,但這些功夫都不會白費,一來我們可以通過這些插件了解IDE的一些工作原理, 二來通過這些插件的安裝我們也更加了解了vim插件的使用方法,有了這些基礎,后續如果想滿足一些個性化的需求,豈不易哉!
reference:
http://littlewhite.us/archives/212
http://helloruby.5oclock.io/2015/01/25/taglist/
http://www.runtime-era.com/2012/05/exuberant-ctags-in-osx-107.html