本人在最近的学习过程中接触到了 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
259

被折叠的 条评论
为什么被折叠?



