CTAGS工作的原理其实就是抓取源文件中所有的标签名字——包括关键字、变量名、方法名等,将它们排序后存储在标签列表文件中。VIM可以读取这个标签列表,根据用户的需要执行跳转。 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通过查询算法快速定位标签。就像二分查找需要应...