本人在最近的學習過程中接觸到了 ctags 工具。使用 Vim
的同學對此一定不陌生,它可以幫助 Vim
,Emacs
等編輯器使用代碼跳轉,堪稱程序員的神器。因此,本人特此撰寫筆記分享給大家。
本篇博客參考了
簡介
Ctags
是一種編程工具,可生成在各種編程語言的源文件和頭文件中找到的名稱的索引文件 (.tag
)。 根據語言的不同,可以爲函數,變量,類成員,宏等建立索引。
文件格式
tags文件是以行爲單位的,每行的格式如下:
{tagname
}{tagfile
}{tagaddress
}{extension_fields
}
其中,即爲製表符,是 tags 文件中的分割符。
tagname
--> 類似於變量名,tagname
爲 ctags
爲函數,變量,類成員,宏等建立的索引名。值得注意的是,tagname
不包含空格;
tagfile
--> 顧名思義,是 .tags
文件的文件路徑,爲當前目錄的相對路徑;
{tagaddress
} --> 可以定位到 {tagname
}光標位置的 Ex 命令。通常只包含行號或搜索命令。出於安全的考慮,vim會限制其中某些命令的執行。
{extension_fields
} --> 擴展字段,由用戶自己定義。
此外值得注意的是,以上三項都不可包含製表符。
最後,ctags
使用 ;"
添加註釋,即 ;" comment
。
常用參數
儘管擁有大量的選項,ctags
設置了缺省值 (適合多數情況),因此通常不帶任何選項來執行 ctags
(例
如,ctags *
,或 ctags -R
,這將爲當前目錄下所有可識別的源文件生成一個標籤文件。下面提供的選項
僅僅爲了在有特殊需要時允許用戶自定義。
-a
等同於 --append ;
-e
使能 etags
模式,這將創建 Emacs 編輯器使用的標籤文件;
-f
tagfile
使用所指定的 tagfile
做爲標籤文件的名字 (缺省是 “tags”,或 “TAGS” 當以 etags
模式運行時);
-h
定義一個文件擴展名列表,以句號分隔,這些文件將做爲包含文件(或頭文件)被解析;
-I
定義一個標識符列表;
-L
在文件中讀取需要產生標籤文件的文件列表。
-o tagfile
同 -f tagfile
;
-R
同 --recurse
;
--append[=yes|no]
指明爲指定文件生成的標籤是增加到標籤文件已存在內容的後面,還是替換它們。此選項缺省關閉。
這個選項必須出現在第一個文件名之前;
--exclude=[pattern]
將 pattern
加到排除文件/目錄列表中;
--extra=[+|-]flags
指定是否爲特定類型的信息增加額外的標籤條目;
--fields=[+|-]flags
定義標籤文件表項中的有效擴展字段 (即前文的 extension_fields
,以獲得更多信息)。
--filter[=yes|no]
使 ctags
表現的像一個過濾器,由標準輸入讀取文件的名字,並一個文件接一個文件的輸出它們的
標籤;
--help
向標準輸出打印一個詳細用法描述,然後退出。
--langdef=name
定義一種新的用戶自定義語言,使用正則表達式進行解析;
--langmap=map[,map[...]]
控制文件名如何被映射到程序語言 (見 --list-maps
選項)。
--language-force=language
缺省的,ctags
自動爲一個源文件選擇語言,忽略那些不能確定程序語言的文件。
--languages=[+|-]list
定義一個語言列表,將爲這些語言產生標籤,以逗號分隔;
--list-languages
選項以獲得一個完整的內建語言名稱;
--list-kinds
選項列出支持的語言;
--list-maps[=language|all]
列出指定的語言或全部語言的文件擴展名和文件名模式,然後退出;
--recurse[=yes|no]
遞歸進入文件列表中所遇到的目錄。
Ctags
支持的語言十分豐富,多達20餘種,對應如下。高能提醒!!!
Ant
p projects
t targets
Asm
d defines
l labels
m macros
t types (structs and records)
Asp
d constants
c classes
f functions
s subroutines
Basic
c constants
f functions
l labels
t types
v variables
g enumerations
v variables
C
c classes
d macro definitions
e enumerators (values inside an enumeration)
f function definitions
g enumeration names
l local variables [off]
m class, struct, and union members
n namespaces
p function prototypes [off]
s structure names
t typedefs
u union names
v variable definitions
x external and forward variable declarations [off]
C++
c classes
d macro definitions
e enumerators (values inside an enumeration)
f function definitions
g enumeration names
l local variables [off]
m class, struct, and union members
n namespaces
p function prototypes [off]
s structure names
t typedefs
u union names
v variable definitions
x external and forward variable declarations [off]
C#
c classes
d macro definitions
e enumerators (values inside an enumeration)
E events
f fields
g enumeration names
i interfaces
l local variables [off]
m methods
n namespaces
p properties
s structure names
t typedefs
Fortran
b block data
c common blocks
e entry points
f functions
i interface contents, generic names, and operators [off]
k type and structure components
l labels
L local, common block, and namelist variables [off]
m modules
n namelists
p programs
s subroutines
t derived types and structures
v program (global) and module variables
HTML
a named anchors
f JavaScript functions
Java
c classes
e enum constants
f fields
g enum types
i interfaces
l local variables [off]
m methods
p packages
JavaScript
f functions
c classes
m methods
p properties
v global variables
Lisp
f functions
Lua
f functions
Make
m macros
MatLab
f function
Pascal
f functions
p procedures
Perl
c constants
f formats
l labels
p packages
s subroutines
d subroutine declarations [off]
PHP
c classes
i interfaces
d constant definitions
f functions
v variables
v variables
j javascript functions
Python
c classes
f functions
m class members
v variables
i imports
Ruby
c classes
f methods
m modules
F singleton methods
Sh
f functions
SQL
c cursors
d prototypes [off]
f functions
F record fields
l local variables [off]
L block label
P packages
p procedures
r records [off]
s subtypes
t tables
T triggers
v variables
i indexes
e events
U publications
R services
D domains
V views
n synonyms
x MobiLink Table Scripts
y MobiLink Conn Scripts
Tex
c chapters
s sections
u subsections
b subsubsections
p parts
P paragraphs
G subparagraphs
Verilog
c constants (define, parameter, specparam)
e events
f functions
m modules
n net data types
p ports
r register data types
t tasks
VHDL
c constant declarations
t type definitions
T subtype definitions
r record names
e entity declarations
C component declarations [off]
d prototypes [off]
f function prototypes and declarations
p procedure prototypes and declarations
P package definitions
l local definitions [off]
Vim
a autocommand groups
c user-defined commands
f function definitions
m maps
v variable definitions
配合 Vim
在 ~/.vimrc
中加入 set tags+=./tags
這樣 vim
就可以用當前路徑下的 tag
文件來定位和跳轉了 具體跳轉方式,在vim
中查看文檔 :h tags
使用 tag
- 用於跳轉到指定的tag。例如:
tag tagname
-
快捷鍵
Ctrl+]
取出當前光標下的word作爲tag的名字並進行跳轉。 -
tags
命令 列出曾經訪問過的tag
的列表 -
快捷鍵
Ctrl+T
跳轉到前一次的tag處。 -
stag
命令stag tagname
-
分割當前窗口,並且跳轉到指定的
tag
。 -
快捷鍵
Ctrl+W+]
分割當前窗口,並且跳轉到光標下的tag
。 -
同名
tag
如果存在多個同名的tag
,tag
命令會給出一個tag
的列表,可以通過鍵入tag
的序號來選擇tag
;也可以通過tselect
來過濾tag,如:tselect tagname
如果要在多個 tag
間移動,可以使用如下命令:
:tfirst go to first match
:[count]tprevious go to [count] previous match
:[count]tnext go to [count] next match
:tlast go to last match