source insight是windows下的優(yōu)秀編輯器,適合閱讀管理代碼,主要有以下功能:
由于unix哲學主張一個工具只做好一件事情,所以linux下并沒有這種集多樣功能于一體的軟件。vim是非常優(yōu)秀的編輯器,本文介紹如何通過安裝插件將vim武裝成和source insight一樣甚至更強大的工具。 我的環(huán)境是ubuntu12.04 LTS+vim version 7.3 1. ctags ctags插件用來查找函數(shù),變量或者宏的定義,ubuntu下可以非常方便的安裝, sudo apt-get install exuberant-ctag 在源文件目錄下執(zhí)行命令 ctags -R 會生成一個tags文件,里面包含了所有源文件的符號信息。在vim中,快捷鍵ctrl+]會跳到當前函數(shù)的定義處。為了方便生產(chǎn)tags,設置快捷鍵F5生成tag,將下面命令加入到~/.vimrc nnoremap <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR> nnoremap 表示vim普通模式的鍵映射, --c++-kinds=+p : 為標簽添加函數(shù)原型(prototype)信息 --fields=+iaS : 為標簽添加繼承信息(inheritance),訪問控制(access)信息,函數(shù)特征(function Signature,如參數(shù)表或原型等) --extra=+q : 為類成員標簽添加類標識 如果項目有多層文件結(jié)構(gòu),一般只在根目錄生成一個tag文件,那么子目錄訪問不到tag文件,在子目錄中直接打開源文件將找不到函數(shù)的tag,一個方便的做法是在.vimrc中將tag加到tags的查找路徑中,每個項目一項。 “project1” set tags+=/project1/tags ctags的快捷鍵: ctrl+] 切換到定義處 g+ctrl+] 如果多處匹配,列出匹配tag列表供選擇 count+ctrl+t 后退count個tag :count+tag 前進count個tag :ts 列出匹配tag列表,存在多個匹配時 :tn 跳到下一處匹配tag :tp 跳到上一處匹配tag :tf 跳到地一個匹配tag :tl 跳到最后一個匹配tag :set tags? 查看tags文件路徑 2. cscope Ctags只能找到符號定義的地方,如果要像source insight一樣,具備查找類似函數(shù)調(diào)用查找,符號引用查找等高級功能,就要借助于cscope了。Cscope是類似于ctags的工具,不過它的功能比ctags強大多了。 在當前源文件目錄下執(zhí)行 cscope –Rbq 其中 -R :遞歸處理子層目錄 -b :生成數(shù)據(jù)庫后自動退出 -q :生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度 vim打開源文件后,增加cscope數(shù)據(jù)庫到當前環(huán)境中 :cs add cscope.out 可以發(fā)現(xiàn)執(zhí)行后沒有反應,那是因為沒有打開cscopeverbose選項,打開后增加數(shù)據(jù)庫后會顯示成功還是失敗信息,默認是關閉的,我們把它打開。 :set csverb 想要查看當前已經(jīng)加載了哪些cscope數(shù)據(jù)庫 :cs show 想要刪除某個數(shù)據(jù)庫 :cs kill # 安裝ctags和cscope后,就有兩種數(shù)據(jù)庫了,默認會同時查看cscope和ctag數(shù)據(jù)庫,這個行為由cst控制,默認是打開的。 :set cst Csto控制查看數(shù)據(jù)庫的順序,等于0時優(yōu)先查看cscope數(shù)據(jù)庫,再查看ctags數(shù)據(jù)庫 :set csto=0 為了方便,我們可以在.vimrc中自動增加當前路徑下的cscope數(shù)據(jù)庫 if has("cscope") set csprg=/usr/local/bin/cscope set csto=0 set cst set csverb if filereadable("cscope.out") cs add cscope.out elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverb endif 配置好以后就可以使用cscope的強大的查找功能了,cscope查找命令 :cs find type name Type包括 0或者s —— 查找name在這個工程中出現(xiàn)的位置 1或者g —— 查找name的定義 2或者d —— 查找name調(diào)用的函數(shù) 3或者c —— 查找調(diào)用name的函數(shù) 4或者t —— 查找name字符串 6或者e —— 查找egrep匹配模式 7或者f —— 查找文件 8或者i —— 查找#include 文件名為name的文件 我在平常使用的最多是查找定義和調(diào)用當前函數(shù)的函數(shù),所以在.vimrc中配置成F3和F4快捷鍵,自動查找光標下符號。 nmap <F3> :cs find 3 <C-R>=expand("<cword>")<CR><CR> nmap <F4> :cs find 0 <C-R>=expand("<cword>")<CR><CR> 3.taglist source insight左邊是當前文件的所有符號窗口,包括include的頭文件,函數(shù)和變量。這個功能可以由taglist實現(xiàn)。Ubuntu下安裝非常方便, vim-addons install taglist vim-addons是vim的插件管理程序,如果沒有安裝的話可以執(zhí)行以下命令安裝 sudo apt-get install vim-addon-manager sudo apt-get install vim-scripts vim-addons status可以看到當前插件的安裝狀態(tài) vim-addons install 安裝插件 vim-addons remove 刪除插件 安裝好taglist后,可以自己打開和關閉taglist窗口, :TlistToggle 可以設置成F8快捷鍵,不過等后面安裝了winmanager后也不需要手動控制了。 nnoremap <silent> <F8> :TlistToggle<CR> F8 幾個比較實用的選項需要打開: let Tlist_Auto_Open=1 “打開文件時自動打開taglist let Tlist_Exit_OnlyWindow=1 “關閉文件時自動關閉taglist let Tlist_File_Fold_Auto_Close=1 “taglist window中折疊非當前文件 let Tlist_Process_File_Always=1 “taglist始終解析文件 需要查看更多選項請help :help taglist.txt Ctrl-w-w 跳到taglist窗口,Taglist窗口中也有快捷鍵, <enter> 跳到光標下的tag定義的位置 u 更新taglist zo 打開折疊 zc 關閉折疊 <tab>或]] 跳到下一個文件 <BS>或[[ 跳到上一個文件 4.NERDTree Source insight右邊是文件列表窗口,顯示了工程的所有文件名。文件管理插件NERDTree具有類似的功能,該插件可以顯示當前目錄下所有文件和目錄,并方便地瀏覽和操作文件。 Vim addon manager沒有NERDTree插件,需要自己下載NERDTree,下載后將plugin/NERD_tree.vim 和doc/NERD_tree.txt分別復制到.vim的相應目錄下 為了讓winmanager順利打開NERDTree窗口,在.vimrc中增加下面代碼, let g:NERDTree_title='[NERD Tree]' function! NERDTree_Start() exec 'NERDTree' endfunction function! NERDTree_IsValid() return 1 endfunction 5.winmanager 為了像source insight一樣同時顯示多個窗口,需要winmanager插件。 vim-addons install winmanager 同時在winmanager中顯示NERDTree和taglist窗口,默認在左邊, let g:winManagerWindowLayout='NERDTree|TagList' 設置快捷鍵wm打開winmanager, nmap wm :WMToggle<cr> wm命令打開 設置窗口轉(zhuǎn)換快捷鍵,不過在用了MiniBufExplorer后有更方便的選擇, map <c-w><c-b> :BottomExplorerWindow<cr> 跳到下面窗口 map <c-w><c-f> :FirstExplorerWindow<cr> 跳到上面窗口 最好打開vim時會自動打開winmanager窗口, let g:AutoOpenWinManager = 1 同時修改winmanager.vim "set auto open Winmanager if g:AutoOpenWinManager autocmd VimEnter * nested call s:StartWindowsManager()|3wincmd w|q endif 其中3表示打開后光標在第3個窗口,即源文件窗口。1,2分別表示NERDTree和taglist窗口。 因為winmanager總會打開一個沒有用的空窗口,不知道為什么,需要最后加q關閉它。如果是用WMToggle打開winmanager的話,要關閉這個空窗口就需要在winmanager.vim的ToggleWindowsManager函數(shù)中增加q。 function! <SID>ToggleWindowsManager() if IsWinManagerVisible() call s:CloseWindowsManager() else call s:StartWindowsManager() "close empty window 更多請查看 :help winmanager 6.MiniBufExplorer 寫程序的時候肯定會多個源文件同時編輯,像source insight就有個window list,保存了最近打開過的所有源文件。Vim通過buffer來達到類似的作用,buffer的命令操作包括 :ls 顯示當前打開的所有文件 :bn 跳到下一個文件 :bp 跳到上一個文件 :bd 刪除一個buffer MiniBufExplorer插件提供了更直觀的方式,將buffer顯示在最上端的窗口內(nèi),窗口操作包括 <Tab> 向前循環(huán)切換到每個buffer名上 <S-Tab> 向后循環(huán)切換到每個buffer名上 <Enter> 在打開光標所在的buffer d 刪除光標所在的buffer 為了只在在源碼窗口打開選中的buffer,需要設置miniBufExplModSelTarget,默認是關閉的, let g:miniBufExplModSelTarget = 1 不過MiniBufExplorer還有個更重要的功能是可以實現(xiàn)用CTRL鍵加h|j|k|l方便地切換窗口, let g:miniBufExplMapWindowNavVim = 1 用<CTRL-h|j|k|l>切換到上下左右窗口 7.OmniCppComplete 大部分IDE都支持自動補全功能,vim作為linux下優(yōu)秀的編輯器當然不缺少,不過vim自帶的補全功能,ctrl+n,ctrl+p可以再當前源文件中實現(xiàn)簡單的補全功能,但這是遠遠不夠的。OmniCppComplete利用了Ctags生成的tag數(shù)據(jù)庫,實現(xiàn)了文件間名字補全,包括
安裝好后輸入時鍵入ctrl+x ctrl+o就會補全當前名字,使用過IDE的同學都知道補全只要一個tab鍵就行了,按這么多鍵太麻煩了。這就需要supertab插件的幫助了, Vim-addons install supertab 安裝好后,設置以下選項, let g:SuperTabRetainCompletionType=2 SuperTabDefaultCompletionType設置tab鍵對應的命令, SuperTabRetainCompletionType表示 0 - 不記錄上次的補全方式 1 - 記住上次的補全方式,直到用其他的補全命令改變它 2 - 記住上次的補全方式,直到按ESC退出插入模式為止 8.surround 在在編程時會遇到大量的匹對符號,如“,(,{ 等等,高效地處理這些符號可以大大地提高編程效率,Surround正是處理這些符號的非常優(yōu)秀等等插件。 Surround的使用非常簡單明了(*代表當前光標位置): 插入符號 Hello w*orld! ysiw) Hello (world)! 或者 Hello w*orld! veS) Hello (world)! 替換 "Hello *world!" cs"' 'Hello world!' 刪除 "Hello
*world!" ds" Hello world! 總結(jié) 至此,在安裝了以上插件后,vim已經(jīng)具備了強大的編輯功能。當然,這里只是列出一些基本插件,還有很多其他有趣又好用的插件,比如注釋用的NERD_commenter.vim,高亮書簽的VisualMark,頭文件切換的a.vim等等,以后有機會再研究。 |
|