Vimer初成長,Vim + ctags + cscope 這個組合基本是每個Vimer的必備吧。雖然ctags已經足夠強大,但是cscope可以做的更多。下面來分享下自己的vimrc指令碼關於cscope 的一部分,該指令碼可以實現在項目的任一子目錄下,自動的向上尋找cscope.out,並把他add進來。
首先來分享一個小指令碼,可以協助我們在項目中產生cscope.out 和ctags。
我把這個檔案命名為cs.sh
[java] view plaincopy
- #!/bin/sh
- find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.java"\
- >cscope.files
- cscope -bkq -i cscope.files
- ctags -R
上邊用find . 的方式,可能會造成cs找不到檔案,可以find $PWD xxxx即可.
需要的注意的是,上面的指令碼中,產生的cscope.files中儲存的是相對路徑,而不是絕對路徑。這樣的話,在cscope 中尋找tags的時候,是沒法開啟相應的包含尋找結果的檔案的。怎麼避免這個問題呢?有如下兩個方法:
1, 在cs.sh的指令碼中,find命令後接一個變數PRO_PATH,這個PRO_PATH是當前項目的跟目錄,這個時候cscope.files中儲存的就是所有專案檔的絕對路徑了。
2,在:cs add的時候,接一個prepend path
[java] view plaincopy
- :cs add [cscope.out] [pre-path]
我用了第二個方法,所以就有了下面的vimrc片段,
[java] view plaincopy
- if has("cscope")
- set csprg=/usr/bin/cscope
- set csto=0
- set cst
- set csverb
- set cspc=3
- "add any database in current dir
- if filereadable("cscope.out")
- cs add cscope.out
- "else search cscope.out elsewhere
- else
- let cscope_file=findfile("cscope.out", ".;")
- let cscope_pre=matchstr(cscope_file, ".*/")
- if !empty(cscope_file) && filereadable(cscope_file)
- exe "cs add" cscope_file cscope_pre
- endif
- endif
- endif