Vim編程之:tags,cscope,taglist

最近VIM用得比較多,因此在學了很多。在這裏對收穫到的東西作一個總結。 php

1.編程四要素vim,ctags,cscope,taglist

vim配合這3件東西以後,極爲強大。與SourceInsight有一拼。 shell

1.1 ctags

ctags叫做「標籤」,它記錄源碼中全部標識符定義所在的文件與行號。 編程

(1)安裝

先在命令終端運行一下: vim

$ ctags --version

看一下當前系統有有沒有安裝ctags,若是有就跳過本節。 ide

我是在http://ctags.sourceforge.net/上下載的最近的源碼,解壓,配置,編譯,安裝。 函數

$ tar zxvf ctags-5.8.tar.gz
$ cd ctags-5.8
$ ./configure && make
...
$ sudo make install

而後再檢查一下是否成功安裝 學習

$ ctags --version

一般是沒問題的。 this

(2)使用

在我們的源碼目錄下執行簡單的 spa

$ ctags -R .

ctags就會遍歷當前目錄下的全部.c,.h,.cpp文件,提取全部的標識符並記錄到tags文件中。 .net

進入vim可又使用標籤參數,使vim打開時跳到標籤所在位置。若是咱們要找WinMain,以下:

$ vi -t WinMain

進行vim以後,經常使用的幾個命令:

  • :tag {ident}    "跳轉到ident標籤位置上
  • :tags    "顯示標籤棧
  • :ts    "顯示找到的全部標籤
  • :tp    "顯示上一個標籤
  • :tn    "顯示下一個標籤

快捷鍵:

  • Ctrl+t    "返回原來的文件
  • Ctrl+]    "跳至下一個標籤

 

1.2 cscope

cscope比ctags更強大,它不只記錄標識符定義所在的位置,還記錄了標識符(函數)之間的調用關係與文件的包含關係,功能更多。只不過沒ctags使用簡單。

(1)安裝

一樣先檢查一下cscope有沒有安裝。

若是沒有安裝就從網上下載源碼進行安裝。下載地址:http://cscope.sourceforge.net/

一樣步驟:解壓,配置,編譯,安裝。與ctags同樣。

(2)使用

與ctags相似,首先得生成一個cscope.out文件。這個文件與tags文件功能相似,但比較複雜。

$ find . -name "*.h" -o -name "*.c" -o -name "*.cpp" > cscope.files
$ cscope -bkq -i cscope.files
$ rm cscope.files

cscope就會生成一個cscope.out文件。

而後在當前的目錄下打開vim。在vim在執行命令將cscope.out加進來:

: cs add cscope.out

好了,如今cscope就可又用了。

經常使用的搜索命令格式:

: cs find {querytype} {ident}
或
: cs f {querytype} {ident}

其中{querytype}表示:

num querytype  function descript
 0  s  C符號出現過的地方
 1  g  定義的地方
 2  d  被這個函數調用的函數列表
 3  c  調用這個函數的函數列表
 4  t  搜字串
 6  e  egrep匹配
 7  f  搜索文件
 8  i  包含這個文件的文件列表


一般咱們會在~/.vimrc文件中進行一下按鍵映射,使操做便簡便:

nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>
或
nmap <C-@>s :cs find s <C-R><C-W><CR>

其實的依此類推:

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
  set csprg=/usr/bin/cscope
  set csto=1
  set cst
  set nocsverb
  " add any database in current directory
  if filereadable("cscope.out")
      cs add cscope.out
  endif
  set csverb
endif

nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

 其中 <C-@>s 表示 [Ctrl+空格] 後再按 s 鍵。

(3)遇到的問題

個人安裝使用沒有上面說的那麼順。使用的時候,我執行
:cs add cscope.out
顯示:
E319: Sorry, the command is not available in this version.
最後出的緣由是編譯的時候沒有加入cscope模塊。

執行vim命令查看:

$ vim --version | grep cscope
 ... -cscope ...

cscope前是減號,說明當前vim裏沒有加入這個模塊。

找到vim的源碼包,進入源碼路譯。

$ ./configure --help | grep cscope
  --enable-cscope    Include cscope interface

說明若是要在vim中使用cscope,就得在配置的時候加入--enable-cscope參數。以下:

$ ./configure --enable-cscope && make

編譯完了以後,先別急着安裝,檢查一下新編譯的vim可執行文件是否具備cscope功能。

$ .src/vim --version | grep cscope
... +cscope ...

若是看到cscope前面是個加號,就表示有cscope功能。

而後纔是安裝:

$ sudo make install

安裝完了以後,還要檢查一下vi有沒有更新。常常有網友問爲何加了--enable-cscope編譯安裝仍是不行呢?緣由是,你安裝的是vim,而vi在某些系統裏是另外一個獨立的程序,vi不會自動更新。

將原來的vi連接爲新安裝的vim

$ vi_path=`which vi`
$ sudo rm $vi_path
$ sudo ln -s `which vim` $vi_path

OK,咱們再來檢驗一下vi是否還有cscope功能。

$ vi --version | grep cscope
 ... +cscope ...

如上就對了!

1.3 taglist

上面講了ctags與cscope,若是你把上面兩樣用熟了,vim是很強大的。

taglist是一個插件,它可又顯示光標所在文件的文件結構,包括函數、類、宏定義等等。很少說,這個插件在網上有下載:http://www.vim.org/scripts/script.php?script_id=273

下載後,解壓到~/.vim目錄下。其實裏面就只有兩個件:

  • plugin/taglist.vim - main taglist plugin file 
  • doc/taglist.txt    - documentation (help) file

具體怎麼作,上面那個網頁寫的很清楚了。

 

2.關於~/.vimrc文件

2.1簡介

其實我在系統上一安裝好vim後,就會當即到網上去下載一個.vimrc啓動配置文件。如下是我以前收藏共享的經過模板(不是我寫的,我只根據個人習慣改):http://www.oschina.net/code/snippet_243525_20881

2.2使用

你們可又去下載,覆蓋~/.vimrc便可。

在我共享的這個~/.vimrc中,已經包括了基本的縮進、顏色、Tab寬以及對ctags, cscope, taglist 等組件的配置。這裏我例舉幾個裏面已提供的功能。

(1)緩衝切換

  • Ctrl+J    下一個文件
  • Ctrl+K    上一個文件
  • Ctrl+H    第一個文件

 

(2)Ctags與Cscope更新

  • F12        更新當前目錄下的ctags與cscope

 

(3)Cscope查詢

  • Ctrl+<空格>+g    查找標識符的定義
  • Ctrl+<空格>+s    查找標識符出現的地方
  • Ctrl+<空格>+d    查找標識符調用的函數
  • ...

 

(4)taglist

  • \t    顯示taglist

 

建議你們本身去學習這個文件的內容。

相關文章
相關標籤/搜索