12. Vim tags 的使用

tag 指的是文件中的一種特殊的標誌,在使用 Vim 時,可以由很簡單的按鍵就馬上跳到那個文章及那個 tag 的位置,也可以跳回原處。這個功能就好像目前的網頁上的 hyperlink 一樣。但不一樣的是,這個 tag 並不是寫在文件裡頭的,而是由 ctags 這支程式(或其他類此的工具程式)來產生相關檔的 tags,然後存檔於一個外部檔案裡頭,要用到時再由 Vim 叫出來。


12.1 各種程式碼專用 tag 工具

ctags 這是最常用到的,可能會有兩種版本,舊的 ctags 只能用於 C 程式碼。exuberant ctags 則可用於 C/C++、Java、Fortran……等等。可由 ctags -version 得知版本。
etags 這是 emacs/xemacs 所附的,功能也是非常強大。
JTags 這只能處理 Java 程式碼。
ptags.py 處理 Python 程式碼。
ptags 處理 Perl 程式碼。

這裡主要講述 exuberant ctags。可 man ctagsctags -help 得知所支援的程式語言。在 $VIMRUNTIME/tools 目錄下會有一些工具可以使用,例如專用在 sh script,Tcl/Tk script 的 tag 工具。其他的 tags 工具,系統上不一會安裝,有需要的話得自行安裝,一般使用,應該 ctags 就夠用了,ctags 也可以模擬 etags

以往,Vim 會附上 exuberant ctags,但新近的版本已沒有附上,得由使用者自行安裝,或使用系統上就有的 ctags。如果系統上的並不是 exuberant ctags,可自行由 http://ctags.sourceforge.net 下載、安裝。


12.2 tags 檔案的格式

以下是一般 tag 檔的結構(以一行為例):

tagname TAB tagfile TAB tagaddress term field

tagname 這是識別字的名稱,通常就是一些函數名,或其他任何識別字。
TAB 這是老老實實的一個 Tab 鍵。
tagfile 這是 tag 檔的檔名。
tagaddress 這是 Ex 指令,通常就是搜尋指令,但行數也是可以。
term ;" 這個記號(兩個字元)以後的內容視為註解。
field 待瞭解。


12.3 tag 檔案的製作

不講究的話,可以在所解開的 source code 目錄下,下以下指令:

ctags -R *

這樣會有 source code 目錄下產生一個 tags 這個檔(可以使用 -f 選項來指定檔案名),裡頭就包含了整個 source code 的所有檔案的 tags 資訊,包括其下所有的子目錄下的檔案。ctags 已盡可能的做到聰明掃描檔案的能力,會忽略和程式碼無關的檔案。當然 ctags 還有許多精細的參數可以使用,請 man ctags

請注意,ctags 預設會將輸出檔排序,因此不必自行另外去排序。有排序有一個好處,那就是 Vim 會去使用 binary search 的方式去搜尋,這樣會比較快。


12.4 一般的 tag 使用

如果就照上一節的方式產生 tag files,那麼只要在 source code 目錄下由 vim 去開啟檔案的話,會自動載入 tags 這個檔案,無需另行載入,否則要由 :set tags=your.tags 來指定 tags 檔。然後就是照一般使用 Vim 線上說明一樣,游標移到識別字或函數名上,按 Ctrl+],要回到原處就按 Ctrl+T

請注意,Vim 啟動時,工作目錄(vim 啟動時的所在目錄)名為 tags 的檔案會自動載入,$VIMRUNTIME/doc$HOME/.vim/doc 目錄下的 tags 檔也會自動載入。而且,凡是載入的 tags 檔裡頭所有標誌文字都可以使用補全鍵來補全,別忘了這個好用的功能。


12.5 Vim 線上說明文件的製作

Vim 的線上說明文件就是使用 tags 的方式來管理的,因此使用方法也是和一般 tags 檔一樣,由 Ctrl+]Ctrl+T 來控制。

12.5.1 doctags

這個工具一般不會在系統的 $PATH 裡頭,而是在 Vim 原始碼的 runtime/doc 目錄下。由於一般 tags 程式只對程式碼作用,因此對一般的文字檔沒有作用。而這個 doctags 則會依文字檔中有 *這是標題* 標誌的內容做出 tag 檔出來。

在 source code,進入 runtime/doc 目錄後:

make doctags => 編譯出 doctags 這個可執行檔
make tags => 製作此目錄下所有 *.txt 的 tags 檔

這個 doctags 也可以保留下來,把自己新製作的 *.txt 置於 $VIMRUNTIME/doc 目錄下,執行:

doctags *.txt | sort > tags

這樣就行了,重新進入 vim 後就可以使用了。

當然,這個工具需自行編譯,因此對一般使用者而言,使用上並不方便。其實 Vim 已有內建這個工具了。

12.5.2Vim 裡頭作線上說明

進入 vim 後,:helpt[ags] 目錄名 這樣就會把所指定目錄下的所有 *.txt 產生 tags 檔案。這個動作也可以由命令列來執行:

vim -c "helptags ." -c quit
這和
doctags *.txt | sort > tags
是一樣的。

由於 Vim 自動會搜尋的文件目錄是,目前工作目錄、$VIMRUNTIME/doc$HOME/.vim/doc 因此建議把自己的新文件置於 $HOME/.vim/doc 較好。以下為一個簡單的例子:

This is a test.         *test1*
This is another test.   *test2*

存檔成 test.txt 置於 $HOME/.vim/doc 目錄下:

cd .vim/doc
vim -c "helptags ." -c quit

重新開啟 vim,然後 :h test1 試看看就知道怎麼一回事了。而按 F1 求助鍵的話,會發現在後面的砲份多了一個章節,那就是 LOCAL ADDITIONS:,家目錄下的文件目錄就是置放於此。

Compiled by Edward G.J. Lee (2003-03-03)