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

而Source insight的價格即使是面對Windows Vista也不逞多。嘿嘿。東西是好東西。

個人認為它也對得起這個價格。可惜沒米。用不起呀。

咋辦呢。用vim,cscope打造一個免費的吧。


1安裝cscope

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

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


嗯,我用的這個版本的vim是支持cscope的。

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

    cscope -Rbkq

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

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


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

#!/bin/sh

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


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

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



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

在vim的網站上,有很多和cscope相關的插件,可以去找一下你有沒有所感興趣的。搜索結果在這里:
點這里


為了方便地使用cscope,我們還需要下載cscope的鍵盤映射設置,
這樣就可以在gvim中簡單地通過快捷鍵來使用 cscope,而不必敲復雜的命令了。鍵盤映射可以從
這里下載: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 中。

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

瀏覽源代碼 †
使用 gvim 打開你的源代碼目錄中任意一個C程序文件。然后在gvim中執行如下命令:
:cscope add D:\src\myproject\cscope.out
由于在 gvim 中可以使用命令縮寫,因此上面的命令可以寫成:
:cs a D:\src\myproject\cscope.out
這樣就打開了剛剛建立的符號數據庫。通過下面的命令可以檢查數據庫連接的存在。
:cscope show
該命令可以縮寫為
:cs s
現在將光標移動到源代碼中的某個函數名上,依次按下一下組合鍵:
s
稍等片刻之后你會在屏幕下放看到如下的字樣*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):
這里顯示出的就是整個工程中使用到了 display 這個標識符的位置。此時輸入 4,回車,
即可跳轉到 main.c 的 385 行調用 display() 函數的地方進行瀏覽。瀏覽結束后按 或者
可以回到跳轉前的位置。
然后將光標移動到源代碼某個函數名上,迅速地依次安下面的組合鍵:
s
其中 按 Ctrl-2 即可輸入。同樣,屏幕上出現了一排結果,選擇之后你會發現,
跳轉到的文件將在水平方向的新窗口中打開。
然后將光標移動到源代碼某個函數名上,迅速地依次安下面的組合鍵:
s
選擇之后你會發現,跳轉到的文件將在垂直方向的新窗口中打開。
以上我們簡單介紹了cscope的使用方法,其中我們只用到了一個 s 命令,即跟在 和 后面的 s 鍵。
同樣,我們可以使用以下的功能鍵實現不同的跳轉功能。
c: 查找該函數被調用的位置 
d: 查找該函數調用了哪些函數
e: 查找指定的正規表達式
f: 查找指定的文件
g: 查找指定標識符的定義位置
i: 查找該文件在哪些地方被包含
s: 查找指定標識符的使用位置
t: 查找指定的文本字符串

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

版權 †
Cscope雖然不是GPL版權,但是Cscope是開放源碼的自由軟件,使用Cscope無須支付任何費用。

參考 †
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中關于 cscope 的幫助,使用 :help cscope 命令查看