【转】使用 vim + ctags + cscope + taglist 阅读源码
原文網(wǎng)址:http://my.oschina.net/u/554995/blog/59927
最近,準(zhǔn)備跟學(xué)長(zhǎng)一起往 linux kernel 的門(mén)里瞧瞧里面的世界,雖然我們知道門(mén)就在那,但我們還得找到合適的角度才會(huì)看得更舒服,對(duì)吧^_^ 。
? ? ? ?閱讀源碼的工具有很多,而且如今的集成開(kāi)發(fā)環(huán)境(IDE)也很強(qiáng)大,但對(duì)于經(jīng)常使用vim編輯器的程序員來(lái)說(shuō),對(duì)vim的強(qiáng)大絕對(duì)是“不拋棄,不放棄”的,況且我們只要安裝一些插件配合vim的工作一樣能達(dá)到IDE的效果,好了,廢話少說(shuō)。瀏覽了很多有關(guān)的網(wǎng)頁(yè)資源后,發(fā)現(xiàn)有很多插件可以用,但在此推薦3款比較常用的“小”插件供大家參考,它們其實(shí)并不“小”,非常強(qiáng)大!一般地,只是單個(gè)小程序源碼的閱讀就不必勞駕插件了(我是這樣認(rèn)為的),對(duì)于工程代碼不用它們就有點(diǎn)困難了。
這三個(gè)插件分別是:ctags , cscope , taglist ? ? ??
先看看效果如何吧 ??
?
?
在ubuntu下的安裝與配置如下—— (1)?ctags?插件 a)???功能:對(duì)瀏覽代碼非常的方便, 可以在函數(shù), 變量之間跳來(lái)跳去等等等等?(更多說(shuō)明請(qǐng)百度或谷歌一下) b)??????安裝配置: 終端下輸入 ?sudo apt-get install ctags ? ? ? 如果沒(méi)發(fā)現(xiàn)該軟件包就用? ???sudo apt-get install exuberant-ctags ?就行了…… 如果還不行可以到官網(wǎng)下載源碼手動(dòng)編譯安裝,有點(diǎn)麻煩是不是?不要嫌麻煩,這也是一個(gè)學(xué)習(xí)的機(jī)會(huì),如果遇到其他類(lèi)似的你也可以仿照這里的例子,再配合壓縮包里的README文件就能手動(dòng)安裝了,你說(shuō)是不是,呵呵。 下載地址 ???http://nchc.dl.sourceforge.net/project/ctags/ctags/5.8/ctags-5.8.tar.gz? 下載解壓后 $ cd ctags-5.8 $ ./configure $ make # make install ? // 需要root權(quán)限 使用 ctags --hlep ? 命令簡(jiǎn)單測(cè)試一下安裝成功了沒(méi) ?>^_^< c)??使用方法: 然后去你的源碼目錄, 如果你的源碼是多層的目錄, 就去最上層的目錄, 在該目錄下 運(yùn)行命令: ctags -R ? ? ? ? 其中-R表示遞歸遍歷 我現(xiàn)在以??linux-kernel?的源碼目錄做演示 $ cd ?~/?linux-kernel $ ctags -R ? ? ?(如果是kernel源碼的話還可以用??make tags) 此時(shí)在/home/?linux-kernel/目錄下會(huì)生成一個(gè) tags 文件, 現(xiàn)在用vim打開(kāi) 即輸入vim 然后Shift + :? 然后再在vim末行運(yùn)行命令, :?set tags=/home/bob/linux-kernel/tags? ? ?(最前面的:是提示符,不必輸入) 每次都要輸入這個(gè)才能使tags生效,我很懶,所以把該命令加入到~/.vimrc中, 你也可以將這句話放到~/.vimrc中去,? 如果你經(jīng)常在這個(gè) ? ? ?工程目錄編程的話. 再如果你經(jīng)常在不同工程間編程, 可以在.vimrc中加上: set tags=tags; ? ?" ? 其中 ; 不能沒(méi)有 set autochdir d)???使用舉例: 把光標(biāo)定位到某一函數(shù)名上或者宏上, 按下 Ctrl + ], vim就可以自動(dòng)切換到該函數(shù)定義處! 要返回只需要按下Ctrl + o ?或者 Ctrl + t. ? ? ? 是不是很方便吖。 (2)????cscope??插件 a) 功能:可以對(duì)函數(shù)以及部分類(lèi)型定義進(jìn)行跳轉(zhuǎn)(更多說(shuō)明請(qǐng)百度或谷歌一下) b) 安裝配置: sudo apt-get install cscope 這個(gè)源里應(yīng)該有了,如果沒(méi)有請(qǐng)到其官網(wǎng)??http://sourceforge.net/projects/cscope/files/???下載源碼安裝,具體安裝方法和??ctags??一樣的,我就不羅嗦啦! d)使用舉例: 在終端下,轉(zhuǎn)到你源碼的所在目錄然后 $cscope -Rbkq ?<回車(chē)> 說(shuō)明一下參數(shù): R 表示把所有子目錄里的文件也建立索引 b 表示cscope不啟動(dòng)自帶的用戶(hù)界面,而僅僅建立符號(hào)數(shù)據(jù)庫(kù) q 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度 k 在生成索引文件時(shí),不搜索/usr/include目錄 之后會(huì)在當(dāng)前目錄生成幾個(gè)文件,??cscope.in.out和cscope.po.out文件,cscope.out vim的normal模式下輸入 :cs add cscope.out 不會(huì)吧,每次都要輸入這些命令,煩死人了,有沒(méi)有捷徑呢?想偷懶總有人找到方法的, sudo gedit ?~/.vimrc ? ? ;然后在該文件下添加如下代碼:?if filereadable("cscope.out")?
??? cs add cscope.out?
endif?
這樣每次打開(kāi)vim就可以直接使用cscope了。? 再試試把下面的內(nèi)容復(fù)制到~/.vimrc里,這樣就可以利用相應(yīng)的快捷鍵進(jìn)行不同的查找了. if has("cscope") set cscopetag ? " 使支持用 Ctrl+] ?和 Ctrl+t 快捷鍵在代碼間跳來(lái)跳去 " check cscope for definition of a symbol before checking ctags: " set to 1 if you want the reverse search order. set csto=1 " add any cscope database in current directory if filereadable("cscope.out") cs add cscope.out " else add the database pointed to by environment variable elseif $CSCOPE_DB !="" cs add $CSCOPE_DB endif " show msg when any other cscope db added set cscopeverbose nmap <C-/>s :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-/>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-/>c :cs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-/>t :cs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-/>e :cs find e <C-R>=expand("<cword>")<CR><CR> nmap <C-/>f :cs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-/>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-/>d :cs find d <C-R>=expand("<cword>")<CR><CR> endif 附常用的命令: :cs find s ---- 查找C語(yǔ)言符號(hào),即查找函數(shù)名、宏、枚舉值等出現(xiàn)的地方 :cs find g ---- 查找函數(shù)、宏、枚舉等定義的位置,類(lèi)似ctags所提供的功能 :cs find d ---- 查找本函數(shù)調(diào)用的函數(shù):cs find c ---- 查找調(diào)用本函數(shù)的函數(shù) :cs find t: ---- 查找指定的字符串 :cs find e ---- 查找egrep模式,相當(dāng)于egrep功能,但查找速度快多了 :cs find f ---- 查找并打開(kāi)文件,類(lèi)似vim的find功能 :cs find i ---- 查找包含本文件的文 Ctrl+]將跳到光標(biāo)所在變量或函數(shù)的定義處 Ctrl+T返回 更多幫助在vim末行命令模式下輸入cs 或 cscope獲得幫助信息。 更多的例子如下 首先進(jìn)入源碼目錄, 在linux終端中輸入以下命令以創(chuàng)建cscope數(shù)據(jù)庫(kù): $ find ~/work/..Project/ -name "*.h" -o -name "*.cpp" > cscope.files $ cscope -bkq -i cscope.files 如果是在windows環(huán)境中, 則換成如下命令: dir /s /b *.cpp *.h > cscope.files cscope -b -q -k -i cscope.files 然后, 用vim打開(kāi)一個(gè)源文件(如: vim main.cpp), 打開(kāi)后, 第一件事就是導(dǎo)入cscope數(shù)據(jù)庫(kù)了: :cs add /home/yourname/workpace/cscope.out /home/yourname/workpace cscope數(shù)據(jù)庫(kù)導(dǎo)入成功后, 就可以利用上面定義的快捷鍵進(jìn)行相關(guān)的查找, (3)????taglist??插件 a) 功能:??高效地瀏覽源碼, 其功能就像vc中的workpace, 那里面列出了當(dāng)前文件中的所有宏等等。 b)?安裝就不需要了,簡(jiǎn)單配置一下就行了,但需要ctags的支持, 下載地址 ??http://www.vim.org/scripts/download_script.php?src_id=7701? 下載后,解壓縮后里面有兩個(gè)目錄?plugin和doc?,然后分別把plugin/taglist.vim復(fù)制到~/.vim/plugin目錄下,? 把doc/taglist.txt復(fù)制到~/.vim/doc目錄下,ok! 記得把下面的加入到~/.vimrc 中哦 " 按F8按鈕,在窗口的左側(cè)出現(xiàn)taglist的窗口,像vc的左側(cè)的workpace nnoremap <silent> <F8> :TlistToggle<CR><CR> " :Tlist ? ? ? ? ? ? ?調(diào)用TagList let Tlist_Show_One_File=0 ? ? ? ? ? ? ? ? ? ?" 只顯示當(dāng)前文件的tags let Tlist_Exit_OnlyWindow=1 ? ? ? ? ? ? ? ? ?" 如果Taglist窗口是最后一個(gè)窗口則退出Vim let Tlist_Use_Right_Window=1 ? ? ? ? ? ? ? ? " 在右側(cè)窗口中顯示 let Tlist_File_Fold_Auto_Close=1 ? ? ? ? ? ? " 自動(dòng)折疊 d) 使用舉例:這個(gè)就不用多說(shuō)了,自己按F8試試就知道了,直接用鼠標(biāo)就能操作。
? ?在taglist窗口中,還可以使用下面的快捷鍵:
<CR>????????? 跳到光標(biāo)下tag所定義的位置,用鼠標(biāo)雙擊此tag功能也一樣
o???????????? 在一個(gè)新打開(kāi)的窗口中顯示光標(biāo)下tag
<Space>?????? 顯示光標(biāo)下tag的原型定義
u???????????? 更新taglist窗口中的tag
s???????????? 更改排序方式,在按名字排序和按出現(xiàn)順序排序間切換
x???????????? taglist窗口放大和縮小,方便查看較長(zhǎng)的tag
+???????????? 打開(kāi)一個(gè)折疊,同zo
-???????????? 將tag折疊起來(lái),同zc
*???????????? 打開(kāi)所有的折疊,同zR
=???????????? 將所有tag折疊起來(lái),同zM
[[??????????? 跳到前一個(gè)文件
]]??????????? 跳到后一個(gè)文件
q???????????? 關(guān)閉taglist窗口
<F1>????????? 顯示幫助
可以用“:TlistOpen”打開(kāi)taglist窗口,用“:TlistClose”關(guān)閉taglist窗口。或者使用“:TlistToggle”在打開(kāi)和關(guān)閉間切換。在我的vimrc中定義了下面的映射,使用“,tl”鍵就可以打開(kāi)/關(guān)閉taglist窗口:
?
總結(jié)
以上是生活随笔為你收集整理的【转】使用 vim + ctags + cscope + taglist 阅读源码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 心有所向可期未来意思
- 下一篇: 有线路由器接无线路由器的设置方法以JHR