對於很多經常使用Linux的童鞋來說,VIM並不陌生,有很多強悍的功能,但是比起Windows的下的某些代碼編輯查看工具,在方便和實用性上還是遜色不少。但是,VIM得可塑性非常強,可以擴展支持很多的插件,使用這些插件,我們能夠完全將其打造成一款Linux下的酷炫IDE。 於是通過參考相關的文章以及VIM官方插件的官方幫助,總結了這篇玩轉VIM,讓插件帶你飛的文章!
目的:在VIM下能夠高效的編寫閱讀源代碼!
接下來,我們先從source insight的基本功能說起,如下圖,可以看到基本的功能區域
1.源代碼編輯顯示區域
2.文件目錄樹顯示區域
3.函數符號顯示區域
4.文件符號顯示區域
5.當前選中的函數區域
6.隱藏的強大搜索功能
我們目的就是將VIM 打造成類似與source insight的強悍工具,下面我會為大家一步一步的介紹HowTo,在介紹之前,先上王道!
圖中實現的功能:
1. 文件浏覽器
2. Tag浏覽器
3.字符高亮
4.自動補全
5.快速搜索
6.智能標簽
在進入正題之前,先把本教程需要的插件和工具的功能和下載地址列在此處,需要時可隨時下載。
相關的插件和工具:
插件 作用 下載 Vimdoc 中文幫助支持 https://sourceforge.net/projects/vimcdoc/files/vimcdoc/ Ctags 為整個源文件目錄創建tag https://sourceforge.net/projects/ctags/ Taglist 管理ctags生成的tag http://www.vim.org/scripts/script.php?script_id=273 WinManager 管理taglist和netrw http://www.vim.org/scripts/script.php?script_id=95 智能補全 自帶的智能補全插件 自帶 OmniCppComplete C++檔案智能補全插件 http://www.vim.org/scripts/script.php?script_id=1520 Echofunc 可以提示函數原型 http://www.vim.org/scripts/script.php?script_id=1735 Visual mark 高亮書簽 http://www.vim.org/scripts/script.php?script_id=1026 Quickfix 智能編譯 自帶 Easygrep 快速搜索功能 http://www.vim.org/scripts/script.php?script_id=2438 MiniBufExplorer 快速浏覽操作多個文件 http://www.vim.org/scripts/script.php?script_id=159 Cscope 集ctags和搜索功能與一身 http://cscope.sourceforge.net
這步主要熟悉一下VIM的相關的配置,不用安裝任何插件,對於已經比較熟悉VIM基本操作的童鞋可以忽略了!
這部分主要是通過配置~/.vimrc來實現的,默認情況下VIM好多的功能是享受不到的,需要配置研究挖掘才能像sourceinsight那樣顯示的很nice,VIM的美需要我們使用探索的眼睛去挖掘! 當然VIM的強大功能就是來源於各種插件以及基礎配置的結合,一般情況下在~/下新建一個.vimrc的配置文件用作配置
這裡列出幾點:
a.在VIM中捕捉鼠標信號
:set mouse=a
b.設置語法高亮
syntax on
c.顯示行號
set nu
d.高亮顯示光標所在的行為紅色,顏色可以修正,也可以之家下劃線
set cursorline hi CursorLine cterm=NONE ctermbg=darkred ctermfg=white hi CursorColumn cterm=NONE ctermbg=darkred ctermfg=white
ctags: 主要功能建立整個源碼庫中函數 變量 宏定義等的tag,方面在閱讀源代碼中能夠快速的定位切換,這樣可以實現跳來跳去...
Tags文件中包括這些對象的列表:用#define定義的宏枚舉型變量的值函數的定義、原型和聲明名字空間(namespace)類型定義(typedefs)變量(包括定義和聲明)類(class)、結構(struct)、枚舉類型(enum)和聯合(union)類、結構和聯合中成員變量或函數VIM用這個“tags”文件來定位上面這些做了標記的對象。
如何使用tags?
cmd:book@book-virtual-machine:~/source_code/linux-3.18.36$sudo apt-get install ctags
或者是通過表格中的地址下載,make/make install這樣的方式安裝,需要root權限
set tags=tags set tags+=./tags "add current directory's generated tags file
->打開vim,嘗試使用tags,鼠標指針指向一個函數名字,然後使用CTRL+]按鍵,看是否有跳到函數實現處!
跳轉到光標下函數或者變量的標簽 : CTRL + ]
返回上一個標簽: CTRL + T
跳到指定的標簽: tag [TagName]
新創建一個窗口,顯示標簽的內容 CTRL + W + ]
新建一個預覽窗口,顯示指定標簽內容:ptag TagName
關閉預覽窗口: pclose
在預覽窗口編輯,頭文件 pedit file.h
說了這麼多,來幾張圖欣賞下:
這張圖是光標定位到unix_mkname上,然後按CTRL+W+],就會新建一個窗口,並顯示unix_mkname的內容,這個cmd是使用最頻繁的,切記,當然後期可以用鼠標代替,但是快捷鍵比鼠標可快多了,CTRL+T是返回到前一個tag
這張圖是如何搜索一個tag,:tag xxx, 直接跳轉到tag處
這張圖是如何搜所tag 並在一個新窗口顯示
taglist插件是以vim腳本的形式存在,因此只需要將其下載下來放到相應的目錄即可。taglist基於ctags才能發揮作用,因此在使用taglist之前,確保已經安裝了ctags。
下載後放到~/.vim 目錄下,直接解壓 unzip taglist_46.zip
進入doc 目錄,開啟vim 並且執行:helptags. cmd 來 處理taglist help 文件,如果不執行此步驟,你不會跳到taglist的help topic
要方便的使用taglist,需要進行一些配置放到~/.vimrc中
let Tlist_Show_One_File=1 "taglist同時只展示1個文件的sysmbol列表,0 支持展示多個" let Tlist_Use_Right_Window=0 "0的話就是顯示在左邊, 1 是右邊" let Tlist_Exit_OnlyWindow=1 "當taglist是最後一個窗口時,自動退出Vim" let Tlist_Process_File_Always=1 "實時更新tags"
Winmanager是在Vim6.0中實現經典windows類型的IDE的插件,安裝了此插件,你將會有一個目錄樹並,可以單獨的操作每一個目錄,每一只file,buffer list 隨著你動態的編輯改變, 它盡可能的占用最小的空間來展示所有當前被列出的windows,這裡所說的管理器主要用來管理我們的文件浏覽器netrw和標簽浏覽器taglist,netrw是vim自帶的插件!
- plugin/
winmanager.vim
winfileexplorer.vim
wintagexplorer.vim
- doc/
winmanager.txt
let g:winManagerWindowLayout=' FileExplorer | TagList' “設置要管理的組件” nmap wm:WMToggle"映射快捷鍵wm"
使用wm 打開關閉 FileExplorer 和 Taglist 如下圖,也可以像Windows 一樣 雙擊進入某個文件了...
更多方便的操作與配置 可以參考 :help winmanager,不斷學習才能打造經典!
使用圖示:
經過上面的配置,一個IDE基本成型,能夠不斷在symbol中跳來跳去,也能夠實施的去找到自己需要的File 並且快速顯示,其實這些並不能完全滿足我們,仍然需要進一步精雕細琢的打磨 才能出好的東西!接下來會介紹幾款小的插件,讓我們的操作更加流暢,如果你知道好的插件,也可以留言告知,後面會增加!
全能補全的功能source insight 都沒有,使用Microsoft Visual Studio的visial studio的人應該使用過特別酷,這個是vim自帶的,不用下載,直接使用
使用前配置~/.vimrc
filetype plugin indent on "文件類型自動檢測"
CTRL-X CTRL-O 開始全能補全 直接上圖:看著是不是有點眼花缭亂,比較復雜的函數使用還可以,簡單的就別用了.. 選擇恐懼症者慎用! 唯唯一的不足之處需要選定挨個挑...多了還是很麻煩ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . --c++-kinds=+p : 為C++文件增加函數原型的標簽 --fields=+iaS : 在標簽文件中加入繼承信息(i)、類成員的訪問控制信息(a)、以及函數的指紋(S) --extra=+q : 為標簽增加類修飾符。注意,如果沒有此選項,將不能對類成員補全同時需要配置下.vimrc [這是參考大神的配置,可以選擇性配置]
"-- omnicppcomplete setting -- " 按下F3自動補全代碼,注意該映射語句後不能有其他字符,包括tab;否則按下F3會自動補全一些亂碼 imap相關的幫助文檔可以使用 :help omnicppcomplete 看效果圖"按下F2根據頭文件內關鍵字補全” imap set completeopt=menu,menuone " 關掉智能補全時的預覽窗口 let OmniCpp_MayCompleteDot = 1 " autocomplete with . let OmniCpp_MayCompleteArrow = 1 " autocomplete with -> let OmniCpp_MayCompleteScope = 1 " autocomplete with :: let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert) let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window let OmniCpp_GlobalScopeSearch=1 " enable the global scope search let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members "let OmniCpp_DefaultNamespaces=["std"] let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column let OmniCpp_ShowAccess=1
這個插件用處不是特別大,但是在coding的時候有也是很nice的
下載地址在這裡:http://www.vim.org/scripts/script.php?script_id=1735
主要功能就是在命令欄顯示C/C++的函數聲明
安裝: 把echofunc.vim 放到~/.vim/plugin目錄下即可
使用如下cmd去create tags 包含語言和signature fields
ctags -R --fields=+IS
介紹:
在插入模式下,你寫完一個函數名字去寫‘(’的時候這個函數的聲明就會自動顯示在命令行裡,你可以使用ALT+- 和ALT+=來循環切換同樣函數名的聲明(Configurable via EchoFuncKeyPrev and EchoFuncKeyNext) .
另外一個feature就是 如果在編譯vim的時候+balloon_eval, 那麼當鼠標放在一個函數名字上之後會彈出tip顯示
因為信息欄經常被其他的插件給清除,一個不錯的選擇就是讓函數聲明信息在狀態欄顯示, 首先增加%{EchoFunGetStatusLine()}到你的狀態欄的option,然後增加一個配置在.vimrclet g:EchoFuncShowOnStatus = 1
在statusline 選項
可選配置項:
let g:EchoFuncShowOnStatus = 1 "顯示在狀態欄
效果如圖
像UltraEdit的Bookmark一樣,主要是在看code的時候 對經常看的地方可以加標簽,來回切換。Visual Mark就實現了這樣一個功能
下載地址http://www.vim.org/scripts/script.php?script_id=1026
a. 對於gvim來說 直接使用CTRL + F2來 添加一個visual mark
對於vim/gvim 使用mm來添加一個visual mark, 添加上mark之後 ,本行會變成高亮
b. 使用F2來在各個mark中來回切換,使用shift F2 反向切換
If you do not like the highlighting scheme, you could change "SignColor" in the script
這句話的意思是在visual mark.vim中修改顏色
if &bg == "dark" // 根據你的背景色風格來設置不同的書簽顏色 highlight SignColor ctermfg=white ctermbg=blue guifg=wheat guibg=peru else // 主要就是修改guibg的值來設置書簽的顏色 highlight SignColor ctermbg=white ctermfg=blue guibg=grey guifg=RoyalBlue3 endif
使用可以看圖:在這個地方會出現一個錯誤提示:Can not set language to en_Us 這個地方看起來不兼容linux,可以修改下visualmark.vim
將 exec ":lan mes en_US" 改為 exec ":lan POSIX"
如果你的project使用了makefile,那麼其實vim的make cmd就夠用了,如果使用時cmd 編譯,那麼血藥配置makeprg的值。用一個很簡單的例子來看下如何使用:
配置編譯:
:set makeprg=gcc\ test.c\ -o\ hello
make
這樣就可以看到結果了,可以使用copen打開QickFix close 關閉QickFix, 看圖說話
其實在寫EasyGrep之前,准備是使用csope OR grep插件來講述搜索的功能,但是偶然間發現了EasyGrep這個插件,使用了下,覺得EasyGrep更好用一些,它是一個在多個文件中高效的查找與替換的工具,要VIM 7.0以上才會支持, Vim其實已經集成了文件間的搜索功能,使用vimgrep 和grep 命令,但是EasyGrep使得使用這些功能更加的簡單,並且還提供了更加強勁的Replace操作,默認vim中替換操作可不是那麼容易操作哈,使用Easygrep,你看搜索你想要的關鍵詞在所有的文件中或者僅僅是打開的文件中以及或者是當前的文件。另外,你也可以非常使用的搜索隱藏的文件,在linux中就是.開頭的文件而且也有效的利用了Quickfix的窗口,將結果顯示在裡面!
配置.vimrc
let g:EasyGrepFileAssociations=~/.vim/plugin/EasyGrepFileAssociations "指定同步文件類型" let g:EasyGrepMode = 2 "跟蹤當前擴展" let g:EasyGrepCommand = 0 “選擇cmd為vimgrep,但是測試使用Grep也可以” let g:EasyGrepRecursive = 1 “啟動遞歸搜索” let g:EasyGrepHidden = 1 “搜索隱藏文件” let g:EasyGrepFilesToExclude = “*.bak, *~, cscope.*, *.a, *.o, *.pyc, *.bak” “排除不想搜索的file類型” let g:EasyGrepAllOptionsInExplorer = 1 “在使用GrepOption是是否顯示所有配置項, 1 是顯示” let g:EasyGrepWindow = 0 “默認情況下也為0 就是Quickfix窗口” let g:EasyGrepJumpToMatch = 1 “跳轉第一個..” let g:EasyGrepInvertWholeWord = 1 “搜索整個單詞” let g:EasyGrepFileAssociationsInExplorer = 1; "文件中顯示關系表" let g:EasyGrepReplaceWindowMode = 1 “全局代替時,執行當前窗口與下一個窗口拆分”
使用快捷鍵:
使用cmd:
:Grep [arg] 搜索指定的參數
:Replace [target] [replacement] 替代
:ReplaceUndo 撤銷
:GrepOptions 打開配置界面可以配置一些參數
GitHub上有一個比較好的使用例子,在這裡展示給大家
這個工具主要使用在編輯多個文件的時候,其實還是很常用了,比較簡單
下載之後,復制minibufexpl.vim到.vim/plugin目錄下即可。
./.vimrc中不用配置什麼就可以使用了! 如果做一些配置 詳細的解釋可以參照https://github.com/fholgado/minibufexpl.vim的說明
主要操作是使用鼠標切換文件,雙擊即可,也可以配置成tab!
直接上圖: