這下更厲害了, 用Cscope自己的話說 - "你可以把它當做是超過頻的ctags", 其功能和強大程度可見一斑吧, 關於它的介紹我就不詳細說了, 如果你安裝好了前文介紹的中文協助手冊, 用下面的命令看看介紹吧:
我在這裡簡單摘抄一點, 供還在猶豫的朋友看看:
Cscope 是一個互動螢幕下使用的工具,用來協助你:
* 無須在厚厚的程式清單中翻來翻去就可以認識一個 C 程式的工作原理。
* 無須熟悉整個程式就可以知道清楚程式 bug 所要修改的代碼位置。
* 檢查提議的改動 (如添加一個枚舉值) 可能會產生的效果。
* 驗證所有的源檔案都已經作了需要的修改;例如給某一個現存的函數添加一個參數。
* 在所有相關的源檔案中對一個全域變數改名。
* 在所有相關的位置將一個常數改為一個預先處理符號。
它被設計用來回答以下的問題:
* 什麼地方用到了這個符號?
* 這是在什麼地方定義的?
* 這個變數在哪裡被賦值?
* 這個全域符號的定義在哪裡?
* 這個函數在源檔案中的哪個地方?
* 哪些函數調用了這個函數?
* 這個函數調用了哪些函數?
* 資訊 "out of space" 從哪來?
* 這個源檔案在整個目錄結構中處於什麼位置?
* 哪些檔案包含這個標頭檔?
安裝Cscope:
如果你的系統中有cscope命令, 則可以跳過這一小段, 如果沒有, 就先跟著我一起安裝一個吧.
在Cscope的首頁: http://cscope.sourceforge.net 下載一個源碼包, 解壓後編譯安裝:
# ./configure # make # make install // 需要root許可權 |
先在~/vimrc中增加一句:
:set cscopequickfix=s-,c-,d-,i-,t-,e- |
這個是設定是否使用 quickfix 視窗來顯示 cscope 結果, 用法在後面會說到。
跟Ctags一樣, 要使用其功能必須先為你的代碼產生一個cscope的資料庫, 在項目的根目錄運行下面的命令:
$ cd /home/wooin/vim71/ $ cscope -Rbq # 此後會產生三個檔案 $ ll cscope.* -rw-rw-r-- 1 wooin wooin 1.1M 2007-09-30 10:56 cscope.in.out -rw-rw-r-- 1 wooin wooin 6.7M 2007-09-30 10:56 cscope.out -rw-rw-r-- 1 wooin wooin 5.1M 2007-09-30 10:56 cscope.po.out # 開啟檔案, 開始Coding $ cd src $ vi main.c |
進入vim後第一件事是要把剛才產生的cscope檔案匯入到vim中來, 用下面的命令:
:cs add /home/wooin/vim71/cscope.out /home/wooin/vim71 |
上面這條命令很重要, 必須寫全, 不能唯寫前半句:
:cs add /home/wooin/vim71/cscope.out
因為源碼是多級目錄的, 如果這樣寫, cscope是無法在子目錄中的源碼中工作的, 當然, 如果你的源碼都在同一級目錄中就無所謂了. 如果你要經常用cscope的話, 可以把上面那句加到~/.vimrc中去.
下面我們來操練一下, 尋找函數vim_strsave()的定義, 用命令:
如:
(--- 圖8 ---)
按下斷行符號後會自動跳轉到vim_strsave()的定義處. 此時你肯定會說Ctags也可以做到這個呀, 那麼下面說的這個Ctags就無法做到了, 我想尋找vim_strsave()到底在那些地方被調用過了, 用命令:
按下斷行符號後vim會自動跳轉到第一個符合要求的地方, 並且在命令欄顯示有多少符合要求的結果, :
(--- 圖9 ---)
如果自動跳轉的位置你不滿意, 想看其他的結果, 可以用下面的命令開啟QuickFix視窗:
:
(--- 圖10 ---)
這時你就可以慢慢挑選了^_^
cscope的主要功能是通過同的子命令"find"來實現的
"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s |
尋找本 C 符號(可以跳過注釋) |
1 或 g |
尋找本定義 |
2 或 d |
尋找本函數調用的函數 |
3 或 c |
尋找調用本函數的函數 |
4 或 t |
尋找本字串 |
6 或 e |
尋找本 egrep 模式 |
7 或 f |
尋找本檔案 |
8 或 i |
尋找包含本檔案的檔案 |
如果每次尋找都要輸入一長串命令的話還真是件討人厭的事情, Cscope的協助手冊中推薦了一些快速鍵的用法, 下面是其中一組, 也是我用的, 將下面的內容添加到~/.vimrc中, 並重啟vim:
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-_>e :cs find e <C-R>=expand("<cword>")<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> nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> |
當游標停在某個你要尋找的詞上時, 按下<C-_>g, 就是尋找該對象的定義, 其他的同理.
按這種按鍵組合有一點技巧,按了<C-_>後要馬上按下一個鍵,否則螢幕一閃就回到nomal狀態了
<C-_>g的按法是先按"Ctrl+Shift+-", 然後很快再按"g"
很奇怪, 其中的這句:
nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
在我的vim中無法工作, 但是我改成:
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR>
就可以正常工作了, 不知道是什麼原因? 有哪位朋友知道請告訴我.
cscope的其他功能你可以通過協助手冊自己慢慢學習
原文地址:http://hi.baidu.com/bali5/blog/item/49ff3517c0997a01c83d6d4e.html