在Vim里使用gtags-cscope


用Vundle安裝好gtags-cscope后,要在vimrc里添加如下設置:

" cscope
set cscopetag                  " 使用 cscope 作為 tags 命令
set cscopeprg='gtags-cscope'   " 使用 gtags-cscope 代替 cscope

下邊的配置讓GtagCscope生效,實際上不需要,gtags-cscope可以自己去找

" gtags let GtagsCscope_Auto_Load = 1 let CtagsCscope_Auto_Map = 1 let GtagsCscope_Quiet = 1

 

有時候要是找不到的化試下以下的命令,但實際上不需要,gtags-cscope可以自己去找。

cs add GTAGS <project-directory> -a where <project-directory> is the name of the directory in which gtags was run and in which GTAGS resides. The -a flag tells gtags-cscope to output absolute file names. Also let $GTAGSDBPATH = <project-directory> and let $GTAGSROOT = <project-directory>

 

再介紹一下cscope(這個程序已經被放棄維護了)

Vim里可以被編譯成調用cscope的接口並分析其輸出結果來做一些查詢動作

Cscope 是一個交互式的屏幕下使用的工具,用來幫助你:

       無須在厚厚的程序清單中翻來翻去就可以認識一個 C 程序的工作原理。

       無須熟悉整個程序就可以知道清楚程序 bug 所要修改的代碼位置。

       檢查提議的改動 (如添加一個枚舉值) 可能會產生的效果。

       驗證所有的源文件都已經作了需要的修改;例如給某一個現存的函數添加一個參
       數。

       在所有相關的源文件中對一個全局變量改名。

       在所有相關的位置將一個常數改為一個預處理符號。

  它被設計用來回答以下的問題:
       什么地方用到了這個符號?
       這是在什么地方定義的?
       這個變量在哪里被賦值?
       這個全局符號的定義在哪里?
       這個函數在源文件中的哪個地方?
       哪些函數調用了這個函數?
       這個函數調用了哪些函數?
       信息 "out of space" 從哪來?
       這個源文件在整個目錄結構中處於什么位置?
       哪些文件包含這個頭文件?

cscope選項如下

-R: 在生成索引文件時,搜索子目錄樹中的代碼,因為我們已經在cscope.files中把所有的文件都打印入了列表中,所以
-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,這樣,你不用切換到你數據庫文件所在的目錄也可以使用它了。

 

 

cscope的基本用法:

1. :cs add命令:添加一個數據庫,這里可以是GTAGS

2.:cs find 查詢相依功能的符號

                0 或 s: 查找本 C 符號
                1 或 g: 查找本定義
                2 或 d: 查找本函數調用的函數
                3 或 c: 查找調用本函數的函數
                4 或 t: 查找本字符串
                6 或 e: 查找本 egrep 模式
                7 或 f: 查找本文件
                8 或 i: 查找包含本文件的文件

3.:cs kill {連接號}:刪除與數據庫的連接

4.:cs reset:重置連接

5.:cs show顯示當前連接

 

相關選項,可以用set來設置

cscopequickfix:設置quickfix窗口里顯示的選項,+代表添加到quickfix窗口,-代表清楚上次選項,0代表不添加

比如

:set cscopequickfix=s-,c-,d-,i-,t-,e-

cscropeprg:指定執行cscope命令的程序

 

cscopetag(cst):是否用cscope代替ctags,在需要使用tag文件的時候,比如:tag命令和<C-]>命令

 

csto:命令的查找次序,默認為0,0為從cscope開始,1為從ctags開始

 

cscoperelative:沒有給cscope -P選項指定路徑前綴時,設置該選項導致使用cscopt.out文件所在的目錄為前綴

 

cspc:決定顯示文件路徑多少部分,缺省0全顯示

 

cscopeverbose:是否告之數據庫加載結果

 

用如下代碼生成cscope.out數據庫文件

 1 function Do_CsTag()
 2     if(executable("cscope") && has("cscope") )
 3         if(has('win32'))
 4             silent! execute "!dir /b *.c,*.cpp,*.h,*.java,*.cs >> cscope.files"
 5         else
 6             silent! execute "!find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.m" -o -name "*.mm" -o -name "*.java" -o -name "*.py" > cscope.files"
 7         endif
 8         silent! execute "!cscope -b"
 9         if filereadable("cscope.out")
10             execute "cs add cscope.out"
11         endif
12     endif
13 endf

 

vimrc里使用以下配置

1 if has("cscope")
2     set cscopequickfix=s-,c-,d-,i-,t-,e-
3     set csto=0
4     set cst
5     set csverb
6 endif

 

按鍵映射可以如下

1 nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>:copen<CR>
2 nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
3 nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>:copen<CR>
4 nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>:copen<CR>
5 nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>:copen<CR>
6 nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>:copen<CR>
7 nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>:copen<CR>
8 nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>:copen<CR>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM