本人在最近的学习过程中接触到了 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
在 ~/.vimrc
中加入 set tags+=./tags
这样 vim
就可以用当前路径下的 tag
文件来定位和跳转了 具体跳转方式,在vim
中查看文档 :h tags
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