程序員的利器 – cscope

本文非原創(chuàng),引用自:http://easwy.com/blog/archives/advanced-vim-skills-cscope/

本節(jié)所用命令的幫助入口:

:help cscope

在前面的文章中介紹了利用tag文件逻恐,跳轉(zhuǎn)到標(biāo)簽定義的地方堕汞。但如果想查找函數(shù)在哪里被調(diào)用,或者標(biāo)簽在哪些地方出現(xiàn)過讯检,ctags就無能為力了,這時需要使用更為強(qiáng)大的cscope视哑。
Cscope具有純正的Unix血統(tǒng)誊涯,它最早是由貝爾實驗室為PDP-11計算機(jī)開發(fā)的,后來成為商用的AT&T Unix發(fā)行版的組成部分暴构。直到2000年4月,這個工具才由SCO公司以BSD license開源發(fā)行取逾。
Cscope的主頁在http://cscope.sourceforge.net/耗绿,如果你的計算機(jī)上沒有cscope,你可以在此處下載它砾隅,在寫本文時误阻,它的最新版本是15.6。安裝它非常簡單,你只需要在cscope的源代碼目錄中執(zhí)行下面三條命令:

./configure
make
make install

在windows上也可以使用cscope究反,在cscope的主頁上可以下載到由DJGPP編譯器編譯的cscope for windows寻定,不過這個版本不能和vi一起工作【停或者你可以下載cygwin工具包(http://www.cygwin.com/)狼速,這個工具包中也包含了cscope。
http://iamphet.nm.ru/cscope/有Sergey Khorev預(yù)編譯的一個Win32版本的cscope卦停,這個版本的cscope可以很好的與windows版本的vim搭配使用向胡。
cscope的用法很簡單,首先需要為你的代碼生成一個cscope數(shù)據(jù)庫惊完。在你的項目根目錄運行下面的命令:

cscope -Rbq

這些選項的含義見后面僵芹。這個命令會生成三個文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本的符號索引小槐,后兩個文件是使用”-q“選項生成的淮捆,可以加快cscope的索引速度。在windows上使用cscope時本股,你可能會遇到-q選項被忽略的提示攀痊,解決辦法請看這篇文章:Windows下cscope -q選項出錯的解決
在缺省情況下拄显,cscope在生成數(shù)據(jù)庫后就會進(jìn)入它自己的查詢界面苟径,我們一般不用這個界面,所以使用了”-b“選項躬审。如果你已經(jīng)進(jìn)入了這個界面棘街,按CTRL-D退出。
Cscope在生成數(shù)據(jù)庫中承边,在你的項目目錄中未找到的頭文件遭殉,會自動到/usr/include目錄中查找。如果你想阻止它這樣做博助,使用”-k“選項。
Cscope缺省只解析C文件(.c和.h)蛔糯、lex文件(.l)和yacc文件(.y)蚁飒,雖然它也可以支持C++以及Java淮逻,但它在掃描目錄時會跳過C++及Java后綴的文件。如果你希望cscope解析C++或Java文件肩碟,需要把這些文件的名字和路徑保存在一個名為cscope.files的文件削祈。當(dāng)cscope發(fā)現(xiàn)在當(dāng)前目錄中存在cscope.files時髓抑,就會為cscope.files中列出的所有文件生成索引數(shù)據(jù)庫吨拍。通常我們使用find來生成cscope.files文件羹饰,仍以vim 7.0的源代碼為例:

cd ~/src/vim70 find . –type f > cscope.filescscope -bq

這條命令把~src/vim70目錄下的所有普通文件都加入了cscope.files队秩,這樣馍资,cscope會解析該目錄下的每一個文件鸟蟹。上面的cscope命令并沒有使用”-R“參數(shù)遞歸查找子目錄建钥,因為在cscope.files中已經(jīng)包含了子目錄中的文件熊经。
注意:find命令輸出的文件以相對路徑表示奈搜,所以cscope.out的索引也相對于當(dāng)前路徑。如果你要在其它路徑中使用當(dāng)前的cscope.out焕盟,需要使用下面介紹的-P選項。
Cscope只在第一次解析時掃描全部文件绍哎,以后再調(diào)用cscope崇堰,它只掃描那些改動過的文件海诲,這大大提高了cscope生成索引的速度特幔。
下表中列出了cscope的常用選項:
-R: 在生成索引文件時蚯斯,搜索子目錄樹中的代碼
-b: 只生成索引文件饵较,不進(jìn)入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件循诉,加快cscope的索引速度
-k: 在生成索引文件時打洼,不搜索/usr/include目錄
-i: 如果保存文件列表的文件名不是cscope.files時募疮,需要加此選項告訴cscope到哪兒去找源文件列表阿浓“疟校可以使用”“退敦,表示由標(biāo)準(zhǔn)輸入獲得文件列表侈百。
-Idir: 在-I選項指出的目錄中查找頭文件
-u: 掃描所有文件,重新生成交叉索引文件
-C: 在搜索時忽略大小寫
-Ppath: 在以相對路徑表示的文件前加上的path锭魔,這樣迷捧,你不用切換到你數(shù)據(jù)庫文件所在的目錄也可以使用它了漠秋。

要在vim中使用cscope的功能膛堤,需要在編譯vim時選擇”+cscope“肥荔。vim的cscope接口先會調(diào)用cscope的命令行接口朝群,然后分析其輸出結(jié)果找到匹配處顯示給用戶姜胖。
在vim中使用cscope非常簡單右莱,首先調(diào)用”cscope add“命令添加一個cscope數(shù)據(jù)庫慢蜓,然后就可以調(diào)用”cscope find“命令進(jìn)行查找了晨抡。vim支持8種cscope的查詢功能耘柱,如下:
s: 查找C語言符號调煎,即查找函數(shù)名汛蝙、宏朴肺、枚舉值等出現(xiàn)的地方
g: 查找函數(shù)、宏西土、枚舉等定義的位置需了,類似ctags所提供的功能
d: 查找本函數(shù)調(diào)用的函數(shù)
c: 查找調(diào)用本函數(shù)的函數(shù)
t: 查找指定的字符串
e: 查找egrep模式,相當(dāng)于egrep功能鹅颊,但查找速度快多了
f: 查找并打開文件堪伍,類似vim的find功能
i: 查找包含本文件的文件

例如帝雇,我們想在vim 7.0的源代碼中查找調(diào)用do_cscope()函數(shù)的函數(shù)尸闸,我們可以輸入:”:cs find c do_cscope“吮廉,回車后發(fā)現(xiàn)沒有找到匹配的功能畸肆,可能并沒有函數(shù)調(diào)用do_cscope()恼除。我們再輸入”:cs find s do_cscope“豁辉,查找這個C符號出現(xiàn)的位置,現(xiàn)在vim列出了這個符號出現(xiàn)的所有位置气破。
我們還可以進(jìn)行字符串查找现使,它會雙引號或單引號括起來的內(nèi)容中查找碳锈。還可以輸入一個正則表達(dá)式,這類似于egrep程序的功能强重,但它是在交叉索引數(shù)據(jù)庫中查找间景,速度要快得多倘要。
vim提供了一些選項可以調(diào)整它的cscope功能:
cscopecscopeprg選項用于設(shè)置cscope程序的位置封拧。
cscopecscopequickfix設(shè)定是否使用quickfix窗口來顯示cscope的結(jié)果哮缺,詳情請”:help cscopequickfix“尝苇;
如果你想vim同時搜索tag文件以及cscope數(shù)據(jù)庫埠胖,設(shè)置cscopecscopetag選項非竿;
cscopecscopetagorder選項決定是先查找tag文件還是先查找cscope數(shù)據(jù)庫谋竖。設(shè)置為0則先查找cscope數(shù)據(jù)庫蓖乘,設(shè)置為1先查找tag文件。我通常設(shè)置為1零聚,因為在tag文件中查找到的結(jié)果隶症,會把最佳匹配列在第一位。

vim的手冊中給出了使用cscope的建議方法淋样,使用命令”:help cscope-suggestions“查看习蓬。

下面的兩個鏈接是cscope主頁提供的cscope使用方法,也可以作為參考:
vim/cscope指導(dǎo):http://cscope.sourceforge.net/cscope_vim_tutorial.html
在大項目中使用cscope:http://cscope.sourceforge.net/large_projects.html
在vim的網(wǎng)站上有很多與cscope相關(guān)的插件企巢,有興趣可以去看一下浪规。
我以前寫的Vim + Cscope/Ctags笋婿。

看不懂原文給的按鍵映射缸濒,我自己寫了一個簡單的:

map <F4> :cs find 

使用的時候按F4庇配,然后輸入查找類型和字符串就好了:

F4 s ***something***

[參考文檔]
vim幫助文件
vim中文手冊
http://cscope.sourceforge.net/
http://iamphet.nm.ru/cscope/
cscope手冊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市啸澡,隨后出現(xiàn)的幾起案子嗅虏,更是在濱河造成了極大的恐慌旋恼,老刑警劉巖冰更,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舟铜,死亡現(xiàn)場離奇詭異谆刨,居然都是意外死亡归斤,警方通過查閱死者的電腦和手機(jī)脏里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門番舆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恨狈,“玉大人,你說我怎么就攤上這事圣蝎∨枪” “怎么了坦袍?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奠宜。 經(jīng)常有香客問我娩嚼,道長滴肿,這世上最難降的妖魔是什么贵少? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任滔灶,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唆鸡。我一直安慰自己争占,他們只是感情好序目,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布臂痕。 她就那樣靜靜地躺著,像睡著了一般猿涨。 火紅的嫁衣襯著肌膚如雪握童。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天叛赚,我揣著相機(jī)與錄音澡绩,去河邊找鬼。 笑死俺附,一個胖子當(dāng)著我的面吹牛肥卡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播步鉴,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼册舞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恋腕,失蹤者是張志新(化名)和其女友劉穎获高,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡渐行,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年颤芬,在試婚紗的時候發(fā)現(xiàn)自己被綠了菱魔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杰妓。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布土浸,位于F島的核電站还最,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦内列、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吹零。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背押搪。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留淳地,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓百侧,卻偏偏與公主長得像砂竖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子路媚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容