原文地址:使用vim看代碼:cscope 作者:Bean_lee
vim+cscope+ctags是Linux看代碼利器,在網上搜vim教程一搜一大堆,很多講的都不錯,可惜自己都沒學會。好早之前,我的老科長波哥曾經教過我一次,ctags我算是學會大概,cscope只能算是入門級水平,比如查看某個函數調用,還得用:cs find c function這種比較慢的方法。我自己比較懶,花在熟練掌握工具的時間太少了,這麼看來,自己還不是個好程式員。 cscope的存在讓vim有了媲美Source Insight的能力,那麼對大工程檔案如何使用cscope呢。
最近在看PostgreSQL的源碼,我們知道,PostgreSQL源碼屬於一個大型工程,src下面好多目錄,不同目錄下好多檔案。好多教程講述建立csope資料庫的方法,都是下面的方法,以我的PostgreSQL為例) root@manu:/usr/local/src/pgsrc/postgresql-9.2.3/src# cscope -Rbq
root@manu:/usr/local/src/pgsrc/postgresql-9.2.3/src# ll ..... -rw-r--r-- 1 root root 2138112 3月 30 23:35 cscope.in.out -rw-r--r-- 1 root root 19451512 3月 30 23:35 cscope.out -rw-r--r-- 1 root root 14147844 3月 30 23:35 cscope.po.out ..... 這種方法為帶來問題(也可能是我功底比較淺),會帶來什麼問題呢。
講這個之前,我們先學習下cscope的應用指令:在vim命令列下執行:cs help
cs show是顯示當前可用的資料庫,cs add是添加一個資料庫。 我們看下 root@manu:/usr/local/src/pgsrc/postgresql-9.2.3/src# cd backend/storage/file/
root@manu:/usr/local/src/pgsrc/postgresql-9.2.3/src/backend/storage/file# vi fd.c
我們執行添加cscope 測試資料庫的操作,在vim的命令列模式執行 :cs add /usr/local/src/pgsrc/postgresql-9.2.3/src/cscope.out :cs show 可以看到如下db串連: 目前還正常,當我們使用:cs find 去尋找函數調用的關係的時候:比如我讀到closeAllVfds 函數實現的時候,我關心誰調用了fd.c中的closeAllVfds這個function。:cs find c 是幹這個活的,請看上面的help。 結果是沒找到。
我們不是已經添加了資料庫了嗎,為啥沒找到了呢。原因就是我們產生cscope.out的時候,路徑都是相對的路徑。對於大工程我們怎麼用cscope做到檔案間的函數跳轉呢。 下面介紹官方文檔推薦的方法: Using Cscope on large projects (example: the Linux kernel),英文好的筒子可以直接去看原文,不用聽我羅嗦。
1 建立cscope目錄,我在自己的家目錄下專門存放cscope資料庫的目錄: root@manu:~/cscope# ll 總用量 16 drwxr-xr-x 2 root root 4096 3月 31 00:49 ./ drwxr-xr-x 72 manu manu 12288 3月 31 00:48 ../ 2 建立一個指令碼來做建立cscope資料庫的事情 root@manu:~/cscope# cat /usr/bin/makecscope.sh
#!/bin/sh
usage()
{
echo "usage : makecscope src_path project_name"
echo "I will create cscope db in ~/cscope/project_name"
}
if [ $# -ne 2 ]
then
usage
exit
fi
SRC_PATH=$1
CSCOPE_PATH=/home/manu/cscope/$2
mkdir -p $CSCOPE_PATH
cd $CSCOPE_PATH
find $SRC_PATH -name "*.h" -o -name "*.c" -o -name "Makefile" -o -name "makefile" > cscope.files
cscope -bkq -i ./cscope.files
我們建立了一個sh指令碼來幹這個事情,sh指令碼會接受兩個參數 源碼路徑:指令碼會搜尋原始碼路徑下的所有.c .h Makefile makefile檔案 項目的名稱:指令碼會在~/cscope目錄下建立以第二個參數為名的目錄,同時將產生的cscope資料庫放入 該目錄下 我們將這個makecscope.sh指令碼放入/usr/bin/目錄下,就可以在任意路徑下執行這個指令碼了
3 為任意項目建立cscope資料庫,我們還是以PostgreSQL為例: root@manu:~/cscope# makecscope.sh /usr/local/src/pgsrc/postgresql-9.2.3/src/ postgres
我為路徑為 /usr/local/src/pgsrc/postgresql-9.2.3/src/下的所有C檔案 標頭檔和Makefile檔案建立了cscope資料庫,並將資料庫放在了~/cscope/postgres路徑下。 root@manu:~