使用 VIM+Ctags+Cscope
來源:互聯網
上載者:User
1. ctags+cscope配合使用的原因:
為什麼要配合,因為,比如cscope能提供更多的尋找功能等功能。但是ctags遠比cscope支援更多的檔案。比如要訪問一個java工程檔案,那麼cscope是能力低下的,比如對類識別不行,但是我們仍然可以利用其一些功能,比如找到什麼函數調用了這個函數。
另外,還有點注意,ctags不能利用QuickFix視窗,而cscope可以利用,這也是cscope的好處。一般,如果僅僅有C/C++檔案,用cscope更多,如果是其他檔案,則用ctags更多。
不管是用ctags還是cscope,都可以用WinManager和Taglist,來實現左邊上面是檔案清單,下面是Taglist,右邊是檔案瀏覽視窗的效果。但是Taglist依賴ctags,如果用cscope,ctags還是要用的。具體的讓WinManager和Taglist配合的方法,見vim設定檔。
2. 產生資料庫並讓vim使用:
一般的做法是:在最上層目錄,產生這些檔案。然後vim在最上層開啟,並利用下面提到的WinManager來導航到裡面目錄。
(1) ctags產生tags檔案:
ctags -R . 可以搜尋目錄下所有的檔案,並產生 tags 檔案。
為了產生最多的tags:
C/C++這樣:ctags --extra=+q --fields=+Saim --c++-kinds=+lpx --c-kinds=+lpx -R .
Java這樣:ctags --java-kinds=+l -R .
(主要是--xx-kinds控制著要分析出哪些東西,如--java-kinds=+l表示要加上(+)local variable,預設的有哪些,沒有哪些,用ctags --list-kinds 可以知道,off的都是預設不分析的,否則是分析的)
cscope只能分析C/C++/lex/yacc檔案。
然後在vim裡 :set tags=path/to/tags(用,分隔,可以多個)
(2) cscope產生cscope.in.out cscope.out cscope.po.out檔案:
由於cscope預設不看非.c .yacc .lex外的檔案,所以,假設你要找C和C++其他檔案,要這樣:
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
(找java檔案同理)
而,對於純C檔案,你可以:
cscope -Rbkq ./ 即可。
然後在vim裡 :cs add path/to/cscope.out
如果要重建,用:!cscope -Rbkq,再用 :cs reset重新讀入.
3. ctags 管理跳轉棧:
ctags設計來找到各種希望找的東西,如類定義處,函數定義處。對各種語言都有支援,但原設計就是針對function定義的,所以,ctags對尋找functions定義特別有效,像函數原型是預設不做tag的。
(1) vim的支援tags的命令:(這些命令在編譯時間要加進ctags支援才能用)
vim靠內建的命令,來支援使用ctags得到的tags檔案。
:tags 列出目前你跳轉的棧,可以得知當前位置 (可惜不能用QuickFix視窗)
:tag 跳到:tags列表的頂部(棧底)
:tag tagname 跳到tagname的定義處
Ctrl+] 壓棧(跳到標記定義處) Ctrl+W ] 在橫著的新視窗開啟(:stag tagname)
n Ctrl+t 出棧(後跳n次,會使你的:tags列出的表縮短) ── 跨檔案時,用 Ctrl + o才能跳回去。
:tselect tagname 可以列出所有的相同的tagname,你按數字可以跳到對應條目。
:tnext 跳到下一個相同tagname處
:tprevious 同理
:tfirst 同理
:tlast 同理
匹配用/ /來括起來,讓vim知道裡面的是正則式
如 :tselect /^write_ 可以匹配以 write 開頭的
:set ignorecase 可以在任何時候忽略大小寫,比如在:tag tagname時。如果設定了這個,又想case有效,則在運算式後加\C
但如果想某次有效,則在運算式後面加\c
上面的運算式都用//包起來。
4. cscope看vim設定檔和以前的文檔即可。
5. 使用Path:
有時,我們要定義額外的Path,以訪問某些檔案。且方便gf(goto file,在normal模式下,按gf,會開啟游標下的檔案,它會在Path下去搜),find(不支援正則式的搜尋,用法 :find netrw.vim)等命令。
path選項定義了一個目錄列表,在使用gf,find,以及CTRL-W f等命令時,如果使用的是相對路徑,那麼就會在path選項定義的目錄列表中尋找相應的檔案。path選項以逗號分隔各目錄名。我們依舊以VIM 7.0的原始碼為例(原始碼放在~/src/vim70/目錄中)。
對於這個項目,我們的path選項設定如下:
set path=.,/usr/include,,~/src/vim70/**
稍微解釋一下各項的含義,更詳細的資訊,請查看path選項的協助頁:
. 在當前檔案所在目錄中搜尋
/usr/include 在/usr/include目錄中搜尋
,, 在當前工作路徑中搜尋
~/src/vim70/** 在~/src/vim70的所有子目錄樹中進行搜尋!!
6. 多檔案瀏覽採用 MiniBufExplorer:
因為使用了WinManager和Taglist,所以tabe顯得不好用了,用buffer會更方便。
但是vim內建的buffer管理工具只有:ls, :bnext, :bdelete 等的命令,這裡用MiniBufExplorer.好處是在頂上可視化列出了各個buffer。仍然用:bnext等命令。
然後,在vim中設定了,用shift+Tab來切換buffer,挺方便。
關閉一個buffer,而不退出視窗,在標籤上按d,這是MiniBufExplorer的命令。個
7. Taglist
提醒用 s 來切換按名字排序(大寫,再小寫,每個裡面按首字母)還是出現次序排序
用 u 來更新list(預設可以再次調用ctags)
另外,在vimrc中設定了單擊來開啟對應位置
8. WinManager
s來切換按xx排序,r做反排序
另外,在各個視窗間切換,用 Ctrl+方向鍵 更快~~~
9. vimgrep尋找文本 或 Grep外掛程式尋找文本:
ctags找到了--list-kinds中指示的東西,你可以用:tag tagname找出這些tags,cscope也找了它可以找的東西,可以用:cs find g/d/c/t/e tagname找到相應的東西,其中t表示找那個文本,尤其是e表示用egrep尋找。單都是在cscope的資料庫中尋找。
但是,很多時候,仍需要對檔案本身搜尋,或者想到某個特定子目錄搜尋,並支援正則式。
(1) 可以用 :vimgrep命令:
:vimgrep是vim內建的grep,如果你用:grep等,則是讓vim調用外部的系統的grep。用:vimgrep的好處是,不依賴於系統的,使得各個系統上都可以用。但是會慢點,因為它會把每個檔案,放入buffer,再分析。
用法簡單:
:vimgrep /pattern/ path
其中 pattern為正則式,如 \<main\>表示main單詞
path 為shell元字元式,如 ./SSF/**/*.java 表示搜尋SSF目錄下,所有子目錄,及所有嵌套子目錄的 java檔案。
(2) 也可以用Grep外掛程式,下面命令都支援正則式:
:Grep 在指定的檔案尋找
:Rgrep 遞迴尋找
:Bgrep 在開啟的緩衝區中尋找
他會問你更多資訊,比如哪些檔案中尋找,在哪個目錄中尋找,很方便。
如:
Search for pattern: 時可以填 \<get_real_path\> (匹配單詞,而不是字串)
Search in files: 時可以填 *.java
10. 高亮文本:
:colorscheme 可以選擇某個主題。
在.vim裡,自己建立colors doc plugin syntax 四個目錄,doc和plugin使用者放plugin的檔案和doc檔案,syntax用於放置指導文法加亮的檔案,而colors就用於放置高亮主題。目前我用的是desert主題。
11. 目前用到的外掛程式:
a.vim
color_sample_pack.vim
minibufexpl.vim
taglist.vim
winmanager.vim (winfileexplorer.vim wintagexplorer.vim)
code_complete.vim #這個好好看看它的代碼體吧,很簡單,卻很高效的用tab補全很多東西,如調用函數時,在(後按tab,就可補出各個參數的類型。比如很方便自動產生main,for,while,#define等。
grep.vim
NERD_commenter.vim
12. 顏色相關:
首先,在vim中輸入 :runtime syntax/colortest.vim 可列印出目前你可以使用的顏色。只有那麼幾種。包括粗體。所以,這就是終端裡使用vim沒有gvim顏色多,或者沒有gvim顏色正常的原因。但是,你好好調整一下,還是能夠滿足自己要求的。
另外,各種顏色主題,是不能讓,如函數,單獨高亮的,因為這需要文法協助。這需要你單獨找文法檔案,就是什麼東西是函數,並應該高亮為什麼顏色。把文法檔案放到 ~/.vim/syntax中。
我是從官網下了cpp.vim放到~/.vim/syntax目錄中,於是.cpp檔案可以有更多的高亮了。
但是,c.vim是我從別的地方找的,官網上找的c.vim不起作用,我又不好改。目前用的c.vim如下,主要加亮了函數名和C關鍵字。而cpp.vim是使用c.vim的,所以預設也就讓cpp.vim支援同樣的效果了。
要讀懂和改這個簡單檔案,需要知識如下:
:hi 命令時一直都是以圖形介面(gui)為例設定前景和背景色。由於命令終端對顏色顯示的限制,Vim在命令列下可以使用的顏色相對gui 要少得多,所以使用:hi命令時圖形介面和命令列介面的顏色是分開設定的。對於黑白終端來說就無所謂顏色了,而彩色終端用cterm來表示,前景色彩就是 “ctermfg”,而背景色是“ctermbg”。下面是一個表格:
終端類型 前景色彩 背景色 注釋
term - - 黑白終端
cterm ctermfg ctermgb 彩色終端
gui guifg guibg 圖形介面