用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>