cscope

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/haifeng_gu/article/details/73289304

待整理。。。有時間了繼續

在vim的世界中,當查看源代碼的時候,使用ctags工具可以實現函數方法的跳轉,若要在源碼中找到對應函數方法在哪些地方進行了調用或在哪兒定義的,只有使用grep命令進行查找得到,這樣需要另起一個終端或在同一個終端中使用:!grep fucname ./* -rn | grep tags, 這樣的切換對於ssh到遠程操作的並不那麼方便。

那麼,有沒有更好的插件能夠直接完成以上這個功能需求呢? 答案是肯定的,使用cscope工具。它能夠完成以上描述的ctags+grep所能夠完成的功能。

cscope的安裝和配置

cscope的安裝教程鏈接

我ubuntu下cscope的配置如下:

"-- CScope setting --
if has("cscope")
set csprg=/usr/bin/cscope
set csto=0
set cst
set cscopequickfix=s-,c-,d-,i-,t-,e-
set nocsverb
if filereadable("cscope.out")
cs add cscope.out
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>

在需要建立cscope索引的源碼目錄下,運行“cscope -Rbq . ”命令即可生成cscope索引。
然後,用Vim打開一個c源程序文件,在vim中執行命令“:cs add cscope.out”來加載索引文件(如果運行Vim時所在目錄中就有cscope.out,則Vim會自動加載cscope索引)。

:copen 打開 quickfix窗口,可以在後面添加窗口高度參數,如10行,:copen 10
:cclose 關閉 quickfix窗口

Cscope相關命令

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

可用的縮寫有:

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

使用方法:
:cs add {file|dir} [pre-path] [flags]
其中:
[pre-path] 就是以-p選項傳遞給cscope的文件路徑,是爲了給以相對路徑表示的文件前面加上的前綴path (絕對路徑),這樣在cscope.out所在目錄的子目錄下同樣可以使用它了,就不需要切換到cscope.out文件所在的目錄。
[flags] 你想傳遞給cscope的額外旗標

生成的cscope.out中保存的是相對路徑,而不是絕對路徑。這樣的話,在cscope 中查找tags的時候,是沒法打開相應的包含查找結果的文件的。怎麼避免這個問題呢?有如下方法:
【推薦】在:cs add的時候,接一個絕對路徑prepend path
:cs add [cscope.out] [pre-path]

實例:

:cscope add /home/user/workspace/project
:cscope add ~/workspace/project/cscope.out  /home/user/workspace/project【推薦格式】
: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這個符號

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|”。


摘抄 vim技巧

vim+ctags+cscope安裝與使用總結

9、[[ 跳到函數頭部,]] 跳到函數尾部
10、quickfix是vim的標準插件,vim自帶。
quickfix功能將編譯過程中產生的錯誤信息保存到文件中,然後vim利用這些信息跳轉到源文件的對應位置,我們就可以進行錯誤的修正,之後跳到下一個錯誤重複上述操作,從而極大地提高編譯錯誤的修改效率。

quick常用命令 (也可以配合cscope一起使用):
:cc 顯示詳細錯誤信息
:cp 跳到上一個錯誤
:cn 跳到下一個錯誤
:cl 列出所有的錯誤
:copen 打開 quickfix窗口,可以在後面添加窗口高度參數,如10行,:copen 10
:cclose 關閉 quickfix窗口

11、按v進入可視化界面,然後通過左右鍵選擇文本,再按y進行復制,p就可以進行粘帖了

12、不退出vim,直接在vim中執行 “:!gcc file.c -o file” 就可以編譯程序了

13、vim中查找特地字符串
/pattern enter
n 朝同一個方向搜索
N 朝反方向搜索

/ pattern enter
要查找單個單詞,鍵入該單詞,並在這個單詞的兩邊都加上空格

/^pattern enter
要查找僅出現在行首的單詞,請在該單詞前面加上^

/pattern$ enter
要查找僅出現在行末的單詞,請在該單詞的後面加上$

如果要把^和$當作普通的符號,就需要在前面加上\



Reference

vim+ctags+cscope安裝與使用總結
Cscope的使用(領略Vim + Cscope的強大魅力)
Vim/Cscope 入門指導
Vim中自動加載cscope.out

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