VIM +Ctags+cscope

來源:互聯網
上載者:User

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

點擊(此處)摺疊或開啟

  1. sudo apt-get install cscope, ctags

 

也可以安裝ctags軟體包:
http://ctags.sourceforge.net/可以使用:ctags –version來查看當前ctags的版本是否是emacs的。要是安裝了emacs的話就必須使用上面這個地址的ctags,vim不支援emacs的ctags,所以要下載安裝這個ctags。(這是以前的版本,現在基本上使用apt-get install就可以直接安裝)下載之後在源檔案所在目錄運行:

點擊(此處)摺疊或開啟

  1. helight@helight-desktop:~/Desktop/ctags-5.7$ ./configure 
  2. helight@helight-desktop:~/Desktop/ctags-5.7$ make
即可產生ctags檔案,將這個檔案儲存到“/usr/bin/”目錄下即可。  二,產生索引檔案在原始碼目錄下使用一下兩條命令即可產生cscope索引檔案和tags檔案。

點擊(此處)摺疊或開啟

  1. helight@helight-desktop:~/Downloads/linux-2.6.26$ make cscope 
  2. FILELST cscope.files 
  3. MAKE cscope.out
  4. helight@helight-desktop:~/Downloads/linux-2.6.26$ make tags 
  5. MAKE tags
  6. helight@helight-desktop:~/Downloads/linux-2.6.26$ ls tags -l 
  7. -rw-r–r– 1 helight ftp 69274841 2008-09-27 11:04 tags
  8. helight@helight-desktop:~/Downloads/linux-2.6.26$ ls cscope.* -l 
  9. -rw-r–r– 1 helight ftp 23814144 2008-09-25 20:08 cscope.in.out 
  10. -rw-r–r– 1 helight ftp 609665 2008-09-25 20:06 cscope.list 
  11. -rw-r–r– 1 helight ftp 174470617 2008-09-25 20:08 cscope.out 
  12. -rw-r–r— 1 helight ftp 124973256 2008-09-25 20:08 cscope.po.out
  三,一般源檔案中產生索引檔案為了方便使用,編寫了下面的指令碼來更新cscope和ctags的索引檔案:

點擊(此處)摺疊或開啟

  1. #!/bin/sh
  2. find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
  3. cscope -bkq -i cscope.files
  4. 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命令列下執行:
點擊(此處)摺疊或開啟
  1. :cs add cscope.out
在vim命令列下執行:

點擊(此處)摺疊或開啟

  1. :cs help
  2. cscope commands:
  3. add : Add a new database (Usage: add file|dir [pre-path] [flags])
  4. find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name)
  5. c: Find functions calling this function d: Find functions called by this function
  6. e: Find this egrep pattern
  7. f: Find this file g: Find this definition
  8. i: Find files #including this file s: Find this C symbol
  9. t: Find assignments to help : Show this message (Usage: help)
  10. kill : Kill a connection (Usage: kill #)
  11. reset: Reinit all connections (Usage: reset)
  12. 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命令列下執行:

點擊(此處)摺疊或開啟

  1. :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 到最後一個匹配

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.