http://blog.csdn.net/intrepyd/archive/2009/05/19/4202312.aspx
在windows下通常使用source insight閱讀源代碼,本人希望將這項工作轉移到linux下面。在配置并試用vim一段時間后,感覺不是特別滿意。幸運的是,這個挑剔的人并不懶惰,開始嘗試使用強大的emacs。在這里,并不介紹emacs的基本操作以及配置,建議學習emacs自帶的幫助或者閱讀《學習GNU Emacs》,而是與大家分享cscope在emacs中的配置與使用。
作為菜鳥在開源世界旅行的第一站,即本人的第一篇linux學習筆記,決定向大牛們學習,在正文開始之前注明文章版權和參考文獻,畢竟水文也可以有版權:) 希望本文對您有所幫助,也歡迎您給我提意見和建議。我的郵箱是:intrepyd@gmail.com。
版權說明和參考文獻
1.版權說明
轉載請注明轉自潘云登的專欄 ,請保證全文轉載,尤其不可省略這一部分。
2.參考文獻
cscope-indexer腳本和xcscope.el文件的注釋部分
Cscope
簡介對于瀏覽源代碼來說,在 Emacs 里面也有很多工具可用,比如自帶的 etags 就不錯,不過功能不如 Cscope 強大。它最初是由 Bell 實驗室開發,并且多年以來一直是 AT&T Unix 商業發行版的一部分。它已經被用于管理超過兩千萬行代碼的工程。在2000年4月,多虧了 Santa Cruz Operation, Inc. (SCO) , Cscope 的源代碼在 BSD license 下開放了源代碼Blah~Blah~
使用Cscope,主要用來回答以下問題:
Where is this variable used?
What is the value of this preprocessor symbol?
Where is this function in the source files?
What functions call this function?
What functions are called by this function?
Where does the message "out of space" come from?
Where is this source file in the directory structure?
What files include this header file?
安裝和配置
1.首先,在系統中安裝Cscope。Linux下,安裝軟件的方式通常有兩種:
方式一:下載Cscope的源代碼,按照源碼包中的INSTALL說明文件,執行下面的命令進行配置編譯安裝
|
./configure make make install |
Cscope的源碼包里面有個xcscope.el文件,為(X)Emacs提供了Cscope 接口。它處于源碼包的 contrib/xcscope 目錄下。該目錄下面還有一個名為cscope-indexer的腳本文件,用于創建文件列表和數據庫。
方式二:利用linux發行版的軟件管理工具進行安裝。我使用的是Jaunty Jackalope(Ubuntu 9.04),只要一條命令,解決所有問題。
|
sudo apt-get install cscope |
安裝后,cscope-indexer腳本位于/usr/bin目錄下,xcscope.el被置于emacs默認的load-path下,在我的系統中是/usr/share/emacs/site-lisp。
2.為了能夠執行cscope-indexer腳本,需要將它放到PATH變量指向的文件夾下,如/usr/bin,并確認該腳本具有執行權限。
3.把xcscope.el文件放到系統用戶的load-path下。為系統用戶創建文件夾并將其加入load-path的方法是:先創建文件夾,
|
mkdir -p ~/.emacs.d/site-lisp/ |
然后,在emacs的配置文件~/.emacs中添加
|
;;LOAD_PATH (add-to-list 'load-path' "~/.emacs.d/site-lisp") |
如果沒有該文件,請手動創建。
4.在.emacs文件中加入下面的語句
|
(require 'xcscope) |
或者,你希望只在打開c/c++文件的時候才加載xcscope,可以加入
|
(add-hook 'c-mode-common-hook '(lambda() (require 'xcscope))) |
5.xcscope默認的快捷鍵都是綁定到C-c s的前綴上面,如果你經常使用xcscope.el,可以自己進行按鍵綁定,減少擊鍵次數。不要擔心別人笑你懶,xcscope.el的編寫者就鼓勵我們這樣做:-)。具體方法是,在.emacs文件中加入
|
(define-key global-map [(control f3)] 'cscope-set-initial-directory) (define-key global-map [(control f4)] 'cscope-unset-initial-directory) (define-key global-map [(control f5)] 'cscope-find-this-symbol) (define-key global-map [(control f6)] 'cscope-find-global-definition) (define-key global-map [(control f7)] 'cscope-find-global-definition-no-prompting) (define-key global-map [(control f8)] 'cscope-pop-mark) (define-key global-map [(control f9)] 'cscope-next-symbol) (define-key global-map [(control f10)] 'cscope-next-file) (define-key global-map [(control f11)] 'cscope-prev-symbol) (define-key global-map [(control f12)] 'cscope-prev-file) (define-key global-map [(meta f9)] 'cscope-display-buffer) (define-key global-map [(meta f10)] 'cscope-display-buffer-toggle) |
6.重啟emacs,使配置生效。
基本使用
這里以內核源碼為例,介紹Cscope的基本用法。
1.首先,在源碼根目錄下,如~/kernerl/linux-2.6.29.3,利用cscope-indexer腳本生成文件列表和數據庫,方法是執行
|
cscope-indexer -r |
-r參數表示遞歸檢索子目錄,文件列表和數據庫的默認文件名分別為cscope.files和cscope.out,可以使用-i,-f參數進行修改,請參考man了解腳本參數用法。
2.激動人心的時刻到了。用emacs打開init/main.c,C-s搜索sched_init函數,將光標停在函數名上,按C-c s d或者先前設置的Ctrl+F6,回車進行查找。結果居然用了35.32秒,汗!原來,Cscope默認在每次進行查找時更新cscope.out。當工程十分龐大時,建議關閉該選項以提高查找速度。方法是在~/.emacs文件中加入
|
(setq cscope-do-not-update-database t) |
重復上述操作,結果仍然用了9.89秒,再汗!莫非是我的古董本太慢?
3.百度一下,你就知道:) Cscope可以通過創建反向索引加速查找,方法是調用Cscope時,使用-q參數。真的假的,一試便知。修改cscope-indexer腳本,將
|
cscope -b -i $LIST_FILE -f $DATABASE_FILE |
替換為
|
cscope -q -b -i $LIST_FILE -f $DATABASE_FILE |
進入內核根目錄,刪除先前的文件列表和數據庫,重新調用cscope-indexer。這回多生成了兩個文件,cscope.in.out和cscope.po.out。重試剛才的查找,結果只用了0.08秒,大功告成。
浙公網安備 33010602011771號