最近,準備跟學長一起往 linux kernel 的門裏瞧瞧裏面的世界,雖然我們知道門就在那,但我們還得找到合適的角度纔會看得更舒服,對吧^_^ 。
閱讀源碼的工具有很多,而且如今的集成開發環境(IDE)也很強大,但對於經常使用vim編輯器的程序員來說,對vim的強大絕對是“不拋棄,不放棄”的,況且我們只要安裝一些插件配合vim的工作一樣能達到IDE的效果,好了,廢話少說。瀏覽了很多有關的網頁資源後,發現有很多插件可以用,但在此推薦3款比較常用的“小”插件供大家參考,它們其實並不“小”,非常強大!一般地,只是單個小程序源碼的閱讀就不必勞駕插件了(我是這樣認爲的),對於工程代碼不用它們就有點困難了。
如果還不行可以到官網下載源碼手動編譯安裝,有點麻煩是不是?不要嫌麻煩,這也是一個學習的機會,如果遇到其他類似的你也可以仿照這裏的例子,再配合壓縮包裏的README文件就能手動安裝了,你說是不是,呵呵。
使用 ctags --hlep 命令簡單測試一下安裝成功了沒 <^_^< div>
c)使用方法:
然後去你的源碼目錄, 如果你的源碼是多層的目錄, 就去最上層的目錄, 在該目錄下
運行命令: ctags -R 其中-R表示遞歸遍歷
我現在以 linux-kernel 的源碼目錄做演示
$ cd ~/ linux-kernel
$ ctags -R (如果是kernel源碼的話還可以用 make tags)
此時在/home/ linux-kernel/目錄下會生成一個 tags 文件, 現在用vim打開
即輸入vim 然後Shift + :
然後再在vim末行運行命令,
: set tags=/home/bob/linux-kernel/tags (最前面的:是提示符,不必輸入)
每次都要輸入這個才能使tags生效,我很懶,所以把該命令加入到~/.vimrc中, 你也可以將這句話放到~/.vimrc中去,
如果你經常在這個 工程目錄編程的話.
再如果你經常在不同工程間編程, 可以在.vimrc中加上:
set tags=tags; " 其中 ; 不能沒有
set autochdir
d)使用舉例:
把光標定位到某一函數名上或者宏上, 按下 Ctrl + ], vim就可以自動切換到該函數定義處!
要返回只需要按下Ctrl + o 或者 Ctrl + t. 是不是很方便吖。
(2)cscope插件
a) 功能:可以對函數以及部分類型定義進行跳轉(更多說明請百度或谷歌一下)
b) 安裝配置:
sudo apt-get install cscope
d)使用舉例:
在終端下,轉到你源碼的所在目錄然後
$cscope -Rbkq < >
說明一下參數:
R 表示把所有子目錄裏的文件也建立索引
b 表示cscope不啓動自帶的用戶界面,而僅僅建立符號數據庫
q 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
k 在生成索引文件時,不搜索/usr/include目錄
之後會在當前目錄生成幾個文件, cscope.in.out和cscope.po.out文件,cscope.out
vim的normal模式下輸入
:cs add cscope.out
不會吧,每次都要輸入這些命令,煩死人了,有沒有捷徑呢?想偷懶總有人找到方法的,
sudo gedit ~/.vimrc ;然後在該文件下添加如下代碼:
if filereadable("cscope.out")
cs add cscope.out
endif
這樣每次打開vim就可以直接使用cscope了。
再試試把下面的內容複製到~/.vimrc裏,這樣就可以利用相應的快捷鍵進行不同的查找了.
if has("cscope")
set cscopetag " 使支持用 Ctrl+] 和 Ctrl+t 快捷鍵在代碼間跳來跳去
" 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 s :cs find s =expand("")
nmap g :cs find g =expand("")
nmap c :cs find c =expand("")
nmap t :cs find t =expand("")
nmap e :cs find e =expand("")
nmap f :cs find f =expand("")
nmap i :cs find i ^=expand("")$
nmap d :cs find d =expand("")
endif
附常用的命令:
:cs find s ---- 查找C語言符號,即查找函數名、宏、枚舉值等出現的地方
:cs find g ---- 查找函數、宏、枚舉等定義的位置,類似ctags所提供的功能
:cs find d ---- 查找本函數調用的函數:cs find c ---- 查找調用本函數的函數
:cs find t: ---- 查找指定的字符串
:cs find e ---- 查找egrep模式,相當於egrep功能,但查找速度快多了
:cs find f ---- 查找並打開文件,類似vim的find功能
:cs find i ---- 查找包含本文件的文
Ctrl+]將跳到光標所在變量或函數的定義處 Ctrl+T返回
更多幫助在vim末行命令模式下輸入cs 或 cscope獲得幫助信息。
更多的例子如下
首先進入源碼目錄, 在linux終端中輸入以下命令以創建cscope數據庫:
$ find ~/work/..Project/ -name "*.h" -o -name "*.cpp" < cscope.files
$ cscope -bkq -i cscope.files
如果是在windows環境中, 則換成如下命令:
dir /s /b *.cpp *.h < cscope.files
cscope -b -q -k -i cscope.files
然後, 用vim打開一個源文件(如: vim main.cpp),
打開後, 第一件事就是導入cscope數據庫了:
:cs add /home/yourname/workpace/cscope.out /home/yourname/workpace
cscope數據庫導入成功後, 就可以利用上面定義的快捷鍵進行相關的查找,
(3) taglist插件
a) 功能: 高效地瀏覽源碼, 其功能就像vc中的workpace, 那裏面列出了當前文件中的所有宏等等。
b)安裝就不需要了,簡單配置一下就行了,但需要ctags的支持,
下載後,解壓縮后里面有兩個目錄plugin和doc,然後分別把plugin/taglist.vim複製到~/.vim/plugin目錄下,
把doc/taglist.txt複製到~/.vim/doc目錄下,ok!
記得把下面的加入到~/.vimrc 中哦
" 按F8按鈕,在窗口的左側出現taglist的窗口,像vc的左側的workpace
nnoremap :TlistToggle
" :Tlist 調用TagList
let Tlist_Show_One_File=0 " 只顯示當前文件的tags
let Tlist_Exit_OnlyWindow=1 " 如果Taglist窗口是最後一個窗口則退出Vim
let Tlist_Use_Right_Window=1 " 在右側窗口中顯示
let Tlist_File_Fold_Auto_Close=1 " 自動摺疊
d) 使用舉例:這個就不用多說了,自己按F8試試就知道了,直接用鼠標就能操作。
在taglist窗口中,還可以使用下面的快捷鍵:
跳到光標下tag所定義的位置,用鼠標雙擊此tag功能也一樣
o 在一個新打開的窗口中顯示光標下tag
顯示光標下tag的原型定義
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出現順序排序間切換
x taglist窗口放大和縮小,方便查看較長的tag
+ 打開一個摺疊,同zo
- 將tag摺疊起來,同zc
* 打開所有的摺疊,同zR
= 將所有tag摺疊起來,同zM
[[ 跳到前一個文件
]] 跳到後一個文件
q 關閉taglist窗口
顯示幫助
可以用“:TlistOpen”打開taglist窗口,用“:TlistClose”關閉taglist窗口。或者使用“:TlistToggle”在打開和關閉間切換。在我的vimrc中定義了下面的映射,使用“,tl”鍵就可以打開/關閉taglist窗口:
map tl :TlistToogle
終於大功告成了,我也歇會兒啦 :-)
< ><
這是我第一次寫技術blog的第一篇博文,若有什麼不足,請不要見笑,請留下建議,3Q!
本文是之前在這的,因爲那個blog不再更新,所以現在轉到此處來了