Source Insight的強(qiáng)大的代碼分析功能讓所有windows下的眾生受益菲淺。

而Source insight的價(jià)格即使是面對(duì)Windows Vista也不逞多。嘿嘿。東西是好東西。

個(gè)人認(rèn)為它也對(duì)得起這個(gè)價(jià)格。可惜沒米。用不起呀。

咋辦呢。用vim,cscope打造一個(gè)免費(fèi)的吧。


1安裝cscope

cscope的編譯和安裝沒有特別之處,./configure - make - make install即可。
安轉(zhuǎn)完畢后先閱讀說明: vi /usr/share/vim/vim63/doc/if_cscop.txt.gz
網(wǎng)上也有中文版本:http://vcd.gro.clinux.org/doc/if_cscop.html
在vim中使用并不需要進(jìn)行太多的設(shè)置,不過首先vim編譯時(shí)必須加入了cscope的支持

$ vim --version | grep cscope
+cryptv +cscope +dialog_con +diff +digraphs -dnd -ebcdic +emacs_tags +eval


嗯,我用的這個(gè)版本的vim是支持cscope的。

按 照vim里cscope的參考手冊(cè)(在vim中執(zhí)行":help cscope"命令),把cscope功能加到.vimrc里后(需要你的vim在編譯時(shí)選擇了"--enable-cscope"選項(xiàng),否則你需要重新 編譯vim),配置就算完成了。然后用下面的命令生成代碼的符號(hào)索引文件:

    cscope -Rbkq

這個(gè)命令會(huì)生成三個(gè)文件:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符號(hào)索引,后兩個(gè)文件是使用"-q"選項(xiàng)生成的,可以加快cscope的索引速度。
上面所用到的命令參數(shù),含義如下:

-R: 在生成索引文件時(shí),搜索子目錄樹中的代碼
-b: 只生成索引文件,不進(jìn)入cscope的界面
-k: 在生成索引文件時(shí),不搜索
/usr/include目錄
-q: 生成cscope
.in.out和cscope.po.out文件,加快cscope的索引速度


接下來,就可以在vim里讀代碼了。
不 過在使用過程中,發(fā)現(xiàn)無法找到C++的類、函數(shù)定義、調(diào)用關(guān)系。仔細(xì)閱讀了cscope的手冊(cè)后發(fā)現(xiàn),原來cscope在產(chǎn)生索引文件時(shí),只搜索類型為 C, lex和yacc的文件(后綴名為.c, .h, .l, .y),C++的文件根本沒有生成索引。不過按照手冊(cè)上的說明,cscope支持c++和Java語言的文件。
于是按照cscope手冊(cè)上提供的方法,先產(chǎn)生一個(gè)文件列表,然后讓cscope為這個(gè)列表中的每個(gè)文件都生成索引。
為了方便使用,編寫了下面的腳本來更新cscope和ctags的索引文件:

#!/bin/sh

find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R


這個(gè)腳本,首先使用find命令,查找當(dāng)前目錄及子目錄中所有后綴名為".h", ".c"和".cc"的文件,并把查找結(jié)果重定向到文件cscope.files中。
然后cscope根據(jù)cscope.files中的所有文件,生成符號(hào)索引文件。
最后一條命令使用ctags命令,生成一個(gè)tags文件,在vim中執(zhí)行":help tags"命令查詢它的用法。它可以和cscope一起使用。

目前只能在unix系列操作系統(tǒng)下使用cscope,雖然也有windows版本的cscope,不過還有很多bug。在Linux技術(shù)中堅(jiān)站上看到有作者在win2000上成功運(yùn)行了gvim + cscope,詳情可以參閱:
http://www.chinalinuxpub.com/bbs/showthread.php?t=30185



cscope的主頁在:http://cscope.sourceforge.net/

在vim的網(wǎng)站上,有很多和cscope相關(guān)的插件,可以去找一下你有沒有所感興趣的。搜索結(jié)果在這里:
點(diǎn)這里


為了方便地使用cscope,我們還需要下載cscope的鍵盤映射設(shè)置,
這樣就可以在gvim中簡(jiǎn)單地通過快捷鍵來使用 cscope,而不必敲復(fù)雜的命令了。鍵盤映射可以從
這里下載:http://cscope.sourceforge.net/cscope_maps.vim
將下載到的 cscope_maps.vim  
文件: cscope_maps.vim.tar.gz
大小: 2KB
下載: 下載

放在gvim的插件目錄里,如 C:\Program Files\Vim\vimfiles\plugin 中。Linux用戶可以放在
$HOME/.vim/plugin 中。

建立符號(hào)數(shù)據(jù)庫 †
我們假設(shè)我們要閱讀的代碼放在 D:\src\myproject 下。然后打開命令行,進(jìn)入源代碼所在的目錄,
為 cscope 建立搜索文件列表。在命令行中執(zhí)行以下命令:
dir /s /b *.c *.h  > cscope.files
如果你的源代碼是C++,則可以將 cpp 等擴(kuò)展名也加入到上面的命令中。
dir /s /b *.c *.h *cpp *.hpp  > cscope.files
如果是Linux用戶,則可以使用 find 命令實(shí)現(xiàn)同樣的功能:
find $(pwd) -name "*.[ch]"
然后執(zhí)行以下命令:
cscope -b
執(zhí)行結(jié)束后你可以在當(dāng)前目錄下發(fā)現(xiàn) cscope.out 文件,這就是 cscope 建立的符號(hào)數(shù)據(jù)庫。
上面這個(gè)命令中,-b參數(shù)使得cscope不啟動(dòng)自帶的用戶界面,而僅僅建立符號(hào)數(shù)據(jù)庫。

瀏覽源代碼 †
使用 gvim 打開你的源代碼目錄中任意一個(gè)C程序文件。然后在gvim中執(zhí)行如下命令:
:cscope add D:\src\myproject\cscope.out
由于在 gvim 中可以使用命令縮寫,因此上面的命令可以寫成:
:cs a D:\src\myproject\cscope.out
這樣就打開了剛剛建立的符號(hào)數(shù)據(jù)庫。通過下面的命令可以檢查數(shù)據(jù)庫連接的存在。
:cscope show
該命令可以縮寫為
:cs s
現(xiàn)在將光標(biāo)移動(dòng)到源代碼中的某個(gè)函數(shù)名上,依次按下一下組合鍵:
s
稍等片刻之后你會(huì)在屏幕下放看到如下的字樣*1:
Cscope tag: display
   #   line filename / context / line
   1    342 D:\src\myproject\src\global.h <>
             void display(void );
   2    616 D:\src\myproject\src\command.c <>
             display();
   3    138 D:\src\myproject\src\display.c <>
             display(void )
   4    385 D:\src\myproject\src\main.c <>
             display();
   5    652 D:\src\myproject\src\main.c <>
             display();
   6    663 D:\src\myproject\src\main.c <>
             display();
Enter nr or choice ( to abort):
這里顯示出的就是整個(gè)工程中使用到了 display 這個(gè)標(biāo)識(shí)符的位置。此時(shí)輸入 4,回車,
即可跳轉(zhuǎn)到 main.c 的 385 行調(diào)用 display() 函數(shù)的地方進(jìn)行瀏覽。瀏覽結(jié)束后按 或者
可以回到跳轉(zhuǎn)前的位置。
然后將光標(biāo)移動(dòng)到源代碼某個(gè)函數(shù)名上,迅速地依次安下面的組合鍵:
s
其中 按 Ctrl-2 即可輸入。同樣,屏幕上出現(xiàn)了一排結(jié)果,選擇之后你會(huì)發(fā)現(xiàn),
跳轉(zhuǎn)到的文件將在水平方向的新窗口中打開。
然后將光標(biāo)移動(dòng)到源代碼某個(gè)函數(shù)名上,迅速地依次安下面的組合鍵:
s
選擇之后你會(huì)發(fā)現(xiàn),跳轉(zhuǎn)到的文件將在垂直方向的新窗口中打開。
以上我們簡(jiǎn)單介紹了cscope的使用方法,其中我們只用到了一個(gè) s 命令,即跟在 和 后面的 s 鍵。
同樣,我們可以使用以下的功能鍵實(shí)現(xiàn)不同的跳轉(zhuǎn)功能。
c: 查找該函數(shù)被調(diào)用的位置 
d: 查找該函數(shù)調(diào)用了哪些函數(shù)
e: 查找指定的正規(guī)表達(dá)式
f: 查找指定的文件
g: 查找指定標(biāo)識(shí)符的定義位置
i: 查找該文件在哪些地方被包含
s: 查找指定標(biāo)識(shí)符的使用位置
t: 查找指定的文本字符串

命令行使用說明 †
除了上述通過快捷鍵映射的方式使用cscope之外,也可以直接在gvim命令行中使用cscope。這樣就可以
隨意定義查找字符串,而不必局限于源代碼中已有的標(biāo)識(shí)符。命令格式如下:
:cscope find  <關(guān)鍵字>
該命令可以縮寫為
:cs f  <關(guān)鍵字>
一個(gè)比較實(shí)用的技巧是使用cscope打開文件。使用以下命令即可直接打開名為display.c的文件,
而不必先切換到display.c所在的目錄。
:cs f f display.c
cscope也支持正規(guī)表達(dá)式。如果記不清某個(gè)函數(shù)的名稱,可以用下面的方式來找到該函數(shù)的定義位置。
:cs f g .*SetConfiguration.*

版權(quán) †
Cscope雖然不是GPL版權(quán),但是Cscope是開放源碼的自由軟件,使用Cscope無須支付任何費(fèi)用。

參考 †
Cscope官方主頁, http://cscope.sourceforge.net/
The Vim/Cscope tutorial, http://cscope.sourceforge.net/cscope_vim_tutorial.html
Cscope on Win32, http://iamphet.nm.ru/cscope/
Vim中關(guān)于 cscope 的幫助,使用 :help cscope 命令查看