Cscope的使用(領略Vim + Cscope的強大魅力)

1、Cscope介紹

       Cscope是類似於ctags一樣的工具,但可以認爲她是ctags的增強版,因爲她比ctags能夠做更多的事。在Vim中,通過cscope的查詢,跳轉到指定的地方就像跳轉到任何標籤;她能夠保存標籤棧,所以通過合適的鍵盤映射綁定,你能夠在函數向後或向前跳轉,就像通常使用的tags一樣。

       首次使用Cscope時,他會根據源文件生成符號數據庫。然後在以後的使用中,cscope只是在源文件有改動或源文件列表不同時纔會重建數據庫。當在重建數據庫時,未改動過的文件對應的數據庫信息會從舊的數據庫中拷貝過來,所以會使重建數據庫快於一開始的新建數據庫。

       當你在命令行下調用cscope時,你會獲得一個全屏選擇窗口,能夠使你查詢特定的內容。然而,一旦你查詢的有匹配,那麼就會用你默認的編輯器來編輯該源文件,但是你不能夠簡單的使用Ctrl+]或者:tag命令來從一個標籤跳轉到另一個標籤。

       Vim中的cscope接口是通過以命令行形式調用完成的,然後解析查詢返回的結果。最終的結果就是cscope查詢結果就像通常的tags一樣,這樣你就可以自由跳轉,就像在使用通常的tags(用ctrl+]或者:tag跳轉)。

2、Cscope相關命令

        所有的cscope命令都是通過向主cscope命令”:cscope”傳遞參數選項。她最短的縮寫是”:cs”。”:scscope”命令也做同樣的事情並且同時會橫向分隔窗口(簡稱:”scs”)。

可用的縮寫有:

 

add :增加一個新的cscope數據庫/鏈接庫

使用方法:
:cs add {file|dir} [pre-path] [flags]

其中:
[pre-path] 就是以-p選項傳遞給cscope的文件路徑,是以相對路徑表示的文件前加上的path,這樣你不要切換到你數據庫文件所在的目錄也可以使用它了。
[flags] 你想傳遞給cscope的額外旗標
 
實例:
:cscope add /root/code/vimtest/ftpd
:cscope add /project/vim/cscope.out /usr/local/vim
:cscope add cscope.out /usr/local/vim –C

 

find :查詢cscope。所有的cscope查詢選項都可用除了數字5(“修改這個匹配模式”)。

使用方法:
:cs find {querytype} {name}
其中:
{querytype} 即相對應於實際的cscope行接口數字,同時也相對應於nvi命令:
0或者s   —— 查找這個C符號
1或者g  —— 查找這個定義
2或者d  —— 查找被這個函數調用的函數(們)
3或者c  —— 查找調用這個函數的函數(們)
4或者t   —— 查找這個字符串
6或者e  —— 查找這個egrep匹配模式
7或者f   —— 查找這個文件
8或者i   —— 查找#include這個文件的文件(們)

實例:(#號後爲註釋)
cscope find c ftpd_send_resp                     # 查找所有調用這個函數的函數(們)
:cscope find 3 ftpd_send_resp                     # 和上面結果一樣
:cscope find 0 FTPD_CHECK_LOGIN       # 查找FTPD_CHECK_LOGIN這個符號

執行結果如下:
Cscope tag: FTPD_CHECK_LOGIN                   
#   line  filename / context / line
   1     19  ftpd.h <<GLOBAL>>
             #define FTPD_CHECK_LOGIN() /
   2    648  ftpd.c <<ftpd_do_pwd>>
             FTPD_CHECK_LOGIN();
   3    661  ftpd.c <<ftpd_do_cwd>>
             FTPD_CHECK_LOGIN();
   4    799  ftpd.c <<ftpd_do_list>>
             FTPD_CHECK_LOGIN();
   5    856  ftpd.c <<ftpd_do_nlst>>
             FTPD_CHECK_LOGIN();
   6    931  ftpd.c <<ftpd_do_syst>>
             FTPD_CHECK_LOGIN();
   7    943  ftpd.c <<ftpd_do_size>>
             FTPD_CHECK_LOGIN();
   8    960  ftpd.c <<ftpd_do_dele>>
             FTPD_CHECK_LOGIN();
   9    981  ftpd.c <<ftpd_do_pasv>>
             FTPD_CHECK_LOGIN();
Enter nr of choice (<CR> to abort):
然後輸入最前面的序列號即可。

 

 help :顯示一個簡短的摘要。

 使用方法:
:cs help

 

  kill  :殺掉一個cscope鏈接(或者殺掉所有的cscope鏈接)

使用方法:
:cs kill {num|partial_name}
爲了殺掉一個cscope鏈接,那麼鏈接數字或者一個部分名稱必須被指定。部分名稱可以簡單的是cscope數據庫文件路徑的一部分。要特別小心使用部分路徑殺死一個cscope鏈接。
假如指定的鏈接數字爲-1,那麼所有的cscope鏈接都會被殺掉。

 

reset:重新初始化所有的cscope鏈接。

使用方法:
:cs reset

 

 show:顯示cscope的鏈接

 使用方法:
 :cs show

 

 

假如你在使用cscope的同時也使用ctags,|:cstag|可以允許你在跳轉之前指定從一個或另一箇中查找。例如,你可以選擇首先從cscope數據庫中查找,然後再查找你的tags文件(由ctags生成)。上述執行的順序取決於|csto|的值。

       |:cstag|當從cscope數據庫中查找標識符時等同於“:cs find g”。

       |:cstag|當從你的tags文件中查找標識符時等同於“|:tjump|”。

 

3、Cscope選項

       使用|:set|命令來設置cscope的所有選項。理想情況是,你可以在你的啓動文件中做這件事情(例如:.vimrc)。有些cscope相關變量只有在|.vimrc|中才是合法的。在vim已經啓動之後再來設置它們沒有任何作用!

‘cscopeprg’指定了執行cscpoe的命令。

默認是”cscope”。

例如:

  :set csprg=/usr/local/bin/cscope

 

‘cscopequickfix’指定了是否使用quickfix窗口來顯示cscope的結果。這是一組用逗號分隔的值。每項都包含於|csope-find|命令(s, g, d, c, t, e, f, 或者i)和旗標(+, -或者0)。

‘+’預示着顯示結果必須追加到quickfix窗口。

‘-’隱含着清空先前的的顯示結果,’0’或者不設置表示不使用quickfix窗口。查找會從開始直到第一條命令出現。默認的值是””(不使用quickfix窗口)。下面的值似乎會很有用:”s-,c-,d-,i-,t-,e-”。

       假如’cscopetag’被設置,然後諸如”:tag”和ctrl+]和”vim -t”等命令會始終使用|:cstag|而不是默認的:tag行爲。通過設置’cst’,你將始終同時查找cscope數據庫和tags文件。默認情況是關閉的,例如:

 :set cst
 :set nocst

 

 

       ‘csto’

       ‘csto’的值決定了|:cstag|執行查找的順序。假如’csto’被設置爲0,那麼cscope數據將會被優先查找,假如cscope沒有返回匹配項,然後纔會查找tag文件。反之,則查找順序相反。默認值是0,例如:

:set csto=0
:set csto=1

 

 

       假如’cscopeverbose’沒有被設置(默認情況是如此),那麼當在增加一個cscope數據庫時不會顯示錶示表示執行成功或失敗的信息。理想情況是,在增加cscope數據庫之前,你應該在你的|.vimrc|中重置此選項,在增加完之後,設置它。此後,當你在vim中增加更多的數據庫時,你會得到(希望是有用的)信息展示數據庫增加失敗。例如:

:set csverb
:set nocsverb

 

 

       ‘cspc’的值決定了一個文件的路徑的多少部分被顯示。默認值是0,所以整個路徑都會被顯示。值爲1的話,那麼就只會顯示文件名,不帶路徑。其他值就會顯示不同的部分。例如:

:set cspc=3

 

 

       將會顯示文件路徑的最後3個部分,包含這個文件名本身。

 

4、在Vim中怎麼使用cscope

       你需要做的第一步就是爲你的源文件建立一個cscope數據庫。大多數情況下,可以簡單的使用”cscope –b”。

       假設你已經有了一個cscope數據庫,你需要將這個數據庫“增加”進Vim。那將會建立一個cscope“鏈接”並且使它能夠被Vim所使用。你可以在你的.vimrc文件中做這件事,或者在Vim啓動之後手動地做。例如,爲了增加數據庫”cscope.out”,你可以這樣做:

  :cs add cscope.out

 

 

 你可以通過執行”:cs show”來再次檢查以上執行的結果。這將會產生如下的輸出:

 # pid      database name                       prepend path
 0 11453  cscope.out                             <none>

 

 

提示:

由於微軟的RTL限制,Win32版本會顯示0而不是真正的pid。

一旦一個cscope鏈接建立之後,你可以查詢cscope並且結果會反饋給你。通過命令”:cs find”來進行查找。例如:

 :cs find g FTPD_CHECK_LOGIN

 

 

執行以上命令可能會變得有點笨重的,因爲它要做相當的輸入次數。假如有不止一個匹配項,你將會被提供一個選擇屏幕來選擇你想匹配的項。在你跳轉到新位置之後,可以簡單的按下ctrl+t就會返回到以前的一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章