ctags安裝
ctags可以建立源碼樹的索引,使程式員在編程時能迅速定位函數、變數、宏定義等位置去查看原形
以下是在ubuntu下ctags的下載安裝和配置過程:
下載並安裝ctags,終端輸入命令
sudo apt-get install ctags
建立源碼索引,比如我經常需要查閱Linux的核心代碼,而這些代碼放在/home/hjw951/arm/linux-2.6.12目錄下
那麼在終端進入到該目錄後,輸入命令ctags -R *,你會發現多了一個tags檔案,這個就是索引檔案
向vim註冊索引檔案tags的路徑,用root使用者在終端輸入gedit /etc/vim/vimrc
在開啟檔案的最後添加一行(當然,具體路徑根據你自己的情況)
set tags=/home/user/arm/linux-2.6.12/tags
然後關閉終端重新開啟,你就可以用VIM在任意地方查看有關Linux的函數原形
taglist外掛程式
想必用過Source Insight的人都記得這樣一個功能:SI能夠把當前檔案中的宏、全域變數、函數等tag顯示在Symbol視窗,用滑鼠點上述tag,就跳到該tag定義的位置;可以按字母序、該tag所屬的類或scope,以及該tag在檔案中出現的位置進行排序;如果切換到另外一個檔案,Symbol視窗更新顯示這個檔案中的tag。
在vim中的taglist外掛程式所實現的就是上述類似的功能,有些功能比SI弱,有些功能比SI更強。而且,taglist外掛程式還在不斷完善中!
要使用taglist plugin,必須滿足:
開啟vim的檔案類型自動檢測功能:filetype on
系統中裝了Exuberant ctags工具,並且taglist plugin能夠找到此工具(因為taglist需要調用它來產生tag檔案)
你的vim支援system()調用
taglist安裝
1.在使用者主目錄建立.vim
[atom@localhost ~]$ mkdir .vim
2.解壓taglist_45.zip到.vim目錄下
[atom@localhost ~]$ unzip taglist_45.zip -d .vim
解壓後的目錄結構如下
[atom@localhost ~]$ ls -R taglist
taglist:
doc plugin
taglist/doc:
taglist.txt
taglist/plugin:
taglist.vim
3.安裝taglist
[root@localhost atom]# cp /taglist/doc/taglist.txt /usr/share/vim/vim71/doc/
[root@localhost atom]# cp /taglist/plugin/taglist.vim /usr/share/vim/vim71/plugin/
4.產生協助標籤
進入vim的doc路徑。
cd /usr/share/vim/vim71/doc
啟動vim,命令模式下輸入
:helptags . (.不可少,表示目前的目錄。也可以在任意目錄中啟動vim,只要指定:helptags usr/share/vim/vim71/doc/)
產生協助標籤後,就可以使用下面的命令查看taglist協助
:help taglist.txt
現在可以vim中試著開啟taglist,輸入命令
:TlistToggle 來開啟和關閉taglist視窗。(命令可以簡寫為Tlist)
命令使用介紹
Ctrl+] :在函數調用的地方跳轉到函數定義的地方
Ctrl+t:返回到上一個尋找的地方解壓後的目錄結構如下
linux原始碼提供了製作cscope索引檔案和tags檔案的make命令。
一,軟體安裝
先安裝cscope, ctags:
點擊(此處)摺疊或開啟
- sudo apt-get install cscope, ctags
也可以安裝ctags軟體包:
http://ctags.sourceforge.net/可以使用:ctags –version來查看當前ctags的版本是否是emacs的。要是安裝了emacs的話就必須使用上面這個地址的ctags,vim不支援emacs的ctags,所以要下載安裝這個ctags。(這是以前的版本,現在基本上使用apt-get install就可以直接安裝)下載之後在源檔案所在目錄運行:
點擊(此處)摺疊或開啟
- helight@helight-desktop:~/Desktop/ctags-5.7$ ./configure
- helight@helight-desktop:~/Desktop/ctags-5.7$ make
即可產生ctags檔案,將這個檔案儲存到“/usr/bin/”目錄下即可。
二,產生索引檔案在原始碼目錄下使用一下兩條命令即可產生cscope索引檔案和tags檔案。
點擊(此處)摺疊或開啟
- helight@helight-desktop:~/Downloads/linux-2.6.26$ make cscope
- FILELST cscope.files
- MAKE cscope.out
- helight@helight-desktop:~/Downloads/linux-2.6.26$ make tags
- MAKE tags
- helight@helight-desktop:~/Downloads/linux-2.6.26$ ls tags -l
- -rw-r–r– 1 helight ftp 69274841 2008-09-27 11:04 tags
- helight@helight-desktop:~/Downloads/linux-2.6.26$ ls cscope.* -l
- -rw-r–r– 1 helight ftp 23814144 2008-09-25 20:08 cscope.in.out
- -rw-r–r– 1 helight ftp 609665 2008-09-25 20:06 cscope.list
- -rw-r–r– 1 helight ftp 174470617 2008-09-25 20:08 cscope.out
- -rw-r–r— 1 helight ftp 124973256 2008-09-25 20:08 cscope.po.out
三,一般源檔案中產生索引檔案為了方便使用,編寫了下面的指令碼來更新cscope和ctags的索引檔案:
點擊(此處)摺疊或開啟
- #!/bin/sh
- find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
- cscope -bkq -i cscope.files
- ctags -R
這個命令會產生三個檔案:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符號索引,後兩個檔案是使用"-q"選項產生的,可以加快cscope的索引速度。
這個指令碼,首先使用find命令,尋找目前的目錄及子目錄中所有尾碼名為".h", ".c"和".c"的檔案,並把尋找結果重新導向到檔案cscope.files中。 然後cscope根據cscope.files中的所有檔案,產生符號索引檔案。最後一條命令使用ctags命令,產生一個tags檔案,在vim中執行":help tags"命令查詢它的用法。它可以和cscope一起使用。上面所用到的命令參數,含義如下:
-R: 在產生索引檔案時,搜尋子目錄樹中的代碼
-b: 只產生索引檔案,不進入cscope的介面
-q: 產生cscope.in.out和cscope.po.out檔案,加快cscope的索引速度
-k: 在產生索引檔案時,不搜尋/usr/include目錄
-i: 如果儲存檔案清單的檔案名稱不是cscope.files時,需要加此選項告訴cscope到哪兒去找源檔案清單。可以使用“-”,表示由標準輸入獲得檔案清單。
-I dir: 在-I選項指出的目錄中尋找標頭檔
-u: 掃描所有檔案,重建交叉索引檔案
-C: 在搜尋時忽略大小寫
-P path: 在以相對路徑表示的檔案前加上的path,這樣,你不用切換到你資料庫檔案所在的目錄也可以使用它了。
四,在VIM使用cscope尋找,載入cscope.out檔案
在VIM中使用cscope非常簡單,首先調用“cscope add”命令添加一個cscope資料庫,然後就可以調用“cscope find”命令進行尋找了。VIM支援8種cscope的查詢功能,如下:例如,我們想在代碼中尋找調用work()函數的函數,我們可以輸入:“:cs find c work”,斷行符號後發現沒有找到匹配的功能,可能並沒有函數調用work()。我們再輸入“:cs find s work”,尋找這個符號出現的位置,現在vim列出了這個符號出現的所有位置。我們還可以進行字串尋找,它會雙引號或單引號括起來的內容中尋找。還可以輸入一個Regex,這類似於egrep程式的功能。
在原始碼目錄下開啟vim。要使用cscope尋找就必須載入cscope.out檔案.在vim命令列下執行:
點擊(此處)摺疊或開啟
- :cs add cscope.out
在vim命令列下執行:
點擊(此處)摺疊或開啟
- :cs help
- cscope commands:
- add : Add a new database (Usage: add file|dir [pre-path] [flags])
- find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name)
- c: Find functions calling this function d: Find functions called by this function
- e: Find this egrep pattern
- f: Find this file g: Find this definition
- i: Find files #including this file s: Find this C symbol
- t: Find assignments to help : Show this message (Usage: help)
- kill : Kill a connection (Usage: kill #)
- reset: Reinit all connections (Usage: reset)
- show : Show connections (Usage: show)
s: 尋找C語言符號,即尋找函數名、宏、枚舉值等出現的地方
g: 尋找函數、宏、枚舉等定義的位置,類似ctags所提供的功能
d: 尋找本函數調用的函數
c: 尋找調用本函數的函數
t: 尋找指定的字串
e: 尋找egrep模式,相當於egrep功能,但尋找速度快多了
f: 尋找並開啟檔案,類似vim的find功能
i: 尋找包含本檔案的文 2,使用cscope尋找do_fork函數的定義:
在vim命令列下執行:
點擊(此處)摺疊或開啟
:cs f g do_fork
五,在VIM中使用tags尋找符號:在vim命令列下執行:
點擊(此處)摺疊或開啟
- :tag xxx
即可找到你想找的函數或是資料結構或是函數xxx
關於tags的其它用法可以在vim中執行”:help tags”命令進行查詢。
六,其它命令介紹:ctrl+]:在函數調用的地方跳轉到函數定義的地方
ctrl+t:返回上一個尋找的地方
七,特別注意:所產生的cscope.out和tags檔案要在開啟VIM所在的檔案夾,否則VIM無法找到相關符號資訊。 在vim中用了一陣子ctags,確實美中不足。ctags只能根據調用函數的地方尋找定義該函數的地方,不能根據定義函數的地方尋找都有哪些地方調用了
該函數。於是又學習了cscope。Cscope在首頁上說它具有毋庸置疑的UNIX血統,早在PDP-11的時代就已經在貝爾實驗室開發出來了。我的
Linux是SuSE10.0,系統內建的有cscope軟體。
一、將
http://cscope.sourceforge.net/cscope_maps.vim
另存新檔檔案~/.vim/plugin/cscope_maps.vim
二、因為cscope將“ctrl+空格”作為映射鍵,但是這樣會調出IME,因此將~/.vim/plugin/cscope_maps.vim檔案中的替換為(或者是你沒有映射過的你喜歡的快速鍵)
三、進入C語言原始碼目錄,建立符號表:
mishuang@msh:~/linux/linux0.11/source-0.11> cscope -R
ctr-D退出後,目前的目錄會多一個檔案cscope.out,這個檔案比tags大多了。
四、使用指南
1)使用下面的命令直接進入main函數定義的地方,如果有多個的話,輸入索引號,斷行符號。
mishuang@msh:~/linux/linux0.11/source-0.11> vi -t main
2)將游標停留在一個函數或變數上,"ctrl+]",將直接跳轉到定義該函數的地方。
3)將游標停留在一個函數或變數上,"ctrl+\"再輸入s,這樣就會出現所有調用、定義該函數的地方,輸入索引號,斷行符號即可。
4)將游標停留在一個函數或變數上,再輸入s,這樣就會出現所有調用、定義該函數的地方,輸入索引號,斷行符號後會以水平方式在另外一個視窗顯示。
5)將游標停留在一個函數或變數上,再輸入s,這樣就會出現所有調用、定義該函數的地方,輸入索引號,斷行符號後會以垂直方式在另外一個視窗顯示。
6)ctrl+t回到原來跳轉前的地方,連續按兩下’’可以再回去。
附:
vim分割視窗的操作
:split 水平(上下)分割視窗
:vsplit或者CTRL-W v 垂直(左右)分割視窗
:new 水平分割視窗,建立空檔案
:vnew 垂直分割視窗,建立空檔案
vim多視窗操作命令
:qall 退出所有視窗
:wall 儲存所有視窗
:wqall或者:xall 儲存並退出所有視窗
:wqall!或者:xall! 儲存並退出所有視窗,如果有的檔案唯讀,不需要先設定寫入權限
:qall! 強制退出所有視窗
CTRL-W W 在視窗間移動
CTRL-W O 關閉其他所有視窗
我們在vim中載入了ctag+taglist+winmanager後
我們在關聯一個函數或者一個變數定義的時候,經常有多處地方定義了相同名字,需要定位正確的定義地方。
:ts 或 tselect 查看有相同地方的定義
:tn或tnext 尋找下一個定義地方。
:tp 尋找上一個地方。
:tfirst 到第一個匹配
:tlast 到最後一個匹配