這像是在 windows 上的 source insight,也許用很多人認為 source insight 非常好用(也許是學習曲線較快),vi 相對來說,就需要花點時間去習慣,不過習慣後,就會討厭在寫 code 的時候要去動到滑鼠。:)
下面的安裝,我做了些改良(cscope_maps.vim),讓 vim 自動尋找正確的 cscope 產生出來的 CSCOPE_DB(通常為 cscope.out ),這邊透過絕對路徑的方式讓 vim 可以在任何子目錄中跳到另外幾個目錄下的某個檔案,原本的機制是不行的。
1. Install cscope and ctags
sudo apt-get install cscope ctags
2. download and modify cscope_maps.vim
這邊預設的目錄深度為 20 層,所以如果你的 source code 的目錄深度大於 20 請自行修正 i 的值
if has("cscope") ...... " add the database pointed to by environment variable " Search database for each project, you can switch different projects easily, :) let i = 1 while i < 20 if filereadable("cscope.out") let db = getcwd() . "/cscope.out" "echo db let $CSCOPE_DB = db cs add $CSCOPE_DB let i = 20 else cd .. let i += 1 endif endwhile " show msg when any other cscope db added .......3. put cscope_maps.vim into ~/.vim/plugin
(目錄不存在請自行建立)
4. Create goproj.sh and put it in ~/bin
這是為了方便建立 cscope.out (CSCOPE_DB)而寫的 goproj.sh,內容如下,為了方便起見可放在 ~/bin 下面。
Content of goproj.sh
#!/bin/bash CSCOPE_FILE=cscope.out if [ -n "$1" ]; then echo "Source code directory: " $1 echo "Create file map : " $CSCOPE_FILE find $1 -name "*.h" -o -name "*.c" -o -name "*.cpp" > $CSCOPE_FILE cscope -bkq -i $CSCOPE_FILE # cscope -Rbkq ctags -R else echo "Please key-in path of project" fi
5. 使用範例,以 kernel source
# tar zxvf kernel-2.6.29.tar.gz # cd kernel-2.6.29 # goproj.sh `pwd` # vim xxx.c
[ Ctrl + \ + s ] : 搜尋游標上的 function 哪邊參考到
[ Ctrl + \ + c ] : 搜尋游標上的 function 哪邊呼叫到
[ Ctrl + \ + g ] : 搜尋游標上的 function 是在哪邊定義的
[ Ctrl + \ + t ] : 跳回下一個位置
[ Ctrl + \ + o ] : 跳回上一個位置
另外由於 cscope_maps.vim 中有定義 Ctrl + ] 的作用,會取代原本 TAG 裡面的定義,所以如果不喜歡的話可以把 cscope_maps.vim 中的這行 (set cscopetag) 移除 。
6. 請用力使用。謝謝!
6 則留言:
Hi
謝謝你提供的方法 & 工具
似乎要用
if [ -n "$1" ]; then
不然會出現 syntax error 喔~~
Hi~ klhsieh,
謝謝您的指正,已經修正。 :)
No mapping found
Error detected while processing /home/jack/.vim/plugin/cscope_maps.vim:
line 42:
E568: duplicate cscope database not added
Press ENTER or type command to continue
Why I always got this error message. How can I fix it?
BTW, My VIM version is 7.2.330.
Dear Jack,
line 42:
E568: duplicate cscope database not added
請檢查一下你cscope_maps.vim裡面是否有重複做了
cs add $CSCOPE_DB
這樣的動作,他只是提醒你,已經在別地方add過了,這次的add不會產生作用(繼續用舊的 CSCOPE_DB)。
請你用在console下,用這個方式看一下你的 CSCOPE_DB 是不是已經有設定值。
$ env |grep CSCOPE_DB
試看看
$ unset CSCOPE_DB
$ vim
希望這對你有幫助。
Hi Char,
我重覆檢查了一下,發現我有改~/.vimrc(從別的網站參考到的)。將這個檔案移除後就沒問題了。Thanks a lot.
Hi Char
我用的的方法
let i = 1
while i < 20
if filereadable("cscope.out")
let db = getcwd() . "/cscope.out"
"echo db
let $CSCOPE_DB = db
cs add $CSCOPE_DB
let i = 20
else
cd ..
let i += 1
endif
endwhile
但是這樣會造成 vim 中工作目錄路徑不對
vim 中 :pwd 顯示路徑都在 / 路徑
好像是 else cd .. 造成
謝謝
張貼留言