CTAGS工作的原理其实就是抓取源文件中所有的标签名字——包括关键字、变量名、方法名等,将它们排序后存储在标签列表文件中。VIM可以读取这个标签列表,根据用户的需要执行跳转。
CTAGS生成标签列表的方法很简单,以下命令展示了如何使用CTAGS抓取src目录中的所有文件生成标签列表:
这里用到了ctags的2个option(命令选项):
仔细打开ctags生成的tags文件看看,会发现头部其实定义了一些表明当前文件的状态的变量:
通常直接生成的tags文件都是排过序的(sorted),显而易见排序的目的是方便vim通过查询算法快速定位标签。就像二分查找需要应用在一个已排序的序列一样。
此外,还有几个常用的ctags选项:
CTAGS生成标签列表的方法很简单,以下命令展示了如何使用CTAGS抓取src目录中的所有文件生成标签列表:
# ctags -f .\.tags -h .java -R .\src %JAVA_HOME%\src
这里用到了ctags的2个option(命令选项):
- -f [name]:
指定生成的标签列表的存储路径。
按照一定的规则存放所有的项目文件是一个好习惯。这里如果[name]指定为 - ,将会在stdout输出生成的标签列表。 - -R:
等效于--recursive,要求递归对子目录进行抓取,一并生成标签。
对于Java、C#这些通过package支持命名空间的语言来说,这无疑是个非常高效的选项。想想com.jlazy.ctags.vim.Sample 这样的名字吧,对应到文件系统该需要多少个子目录,如果手动来抓取,那岂不是要抓到手抽筋…… - -h [list]:
指定待处理的文件扩展名列表。
例如,".h.c.cpp.cxx.hpp"是为典型的C++程序指定的文件扩展名列表。
仔细打开ctags生成的tags文件看看,会发现头部其实定义了一些表明当前文件的状态的变量:
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.5.4 //
通常直接生成的tags文件都是排过序的(sorted),显而易见排序的目的是方便vim通过查询算法快速定位标签。就像二分查找需要应用在一个已排序的序列一样。
此外,还有几个常用的ctags选项:
- -a:
将标签加入到已有的标签列表文件中 - -B/-F:
指定在标签列表中使用向前搜索还是向后搜索。
对于使用VIM的程序员而言这两个搜索动作对应的记号并不陌生——向前搜索使用"?"而向后搜索使用"/"。ctags程序生成的标签中实际上是以搜索字符串来帮助vim定位标签位置的,给定文件名和待匹配字符串,例如"/^ public toString() {$/",这个字符串帮助定位toString方法的定义点。 - -L [file]:
一个文件,以列表的方式存放所有待处理的源文件路径。给定这个文件,ctags将会自动只处理这些包括在列表内的源文件。
评论