1. 创建TAGS
etags file-list
find . -name "*.[chCH]" -print | etags -
find . -print -name "*.[chCH]" -o -name "*.cpp" | etags - #-print需要提前,否则没有输出
# find参数-maxdepth n 可以指定搜索层数
2. 相对路径、绝对路径
如果传给 etags 的参数是绝对路径,那么 TAGS 中包含的也是绝对路径,如果传递给 etags 的是相对路径,那么 TAGS 中包含的也是文件的相对路径,需要把TAGS放在同一目录下;上面的 find 命令产生的都是相对路径,如果需要传给 find 绝对路径,find 的这个规则和 etags 是一样的;
例子:
find `pwd` | etags - -o ~/tmp/TAGS # etags -o 选项可以指定输出文件名,红色的 '-' 表示标准输入
3. 更新
重新执行生成原来的TAGS的命令,etags不会重新新建TAGS,而回自动更新TAGS文件;
4. --include 选项
man etags:
-i file, --include=file
Include a note in the tag file indicating that, when searching for a tag, one should also consult
the tags file file after checking the current file. Only etags accepts this option.
生成 TAGS 的时候,同时包含另外的TAGS,其实只是在文件末尾添加了一个指向include的文件,如:
find `pwd` | etags - --include=~/tmp/TAGS -o ~/tmp/TAGS3
生成的TAGS3末尾会增加一行:~/tmp/TAGS,include
etags搜索的时候,同时也会搜索包含的文件;
5. tags-table-list
保存加载的tags table文件(etags 生成的称为tags table文件),通过 visit-tags-table可以读取一个 tags table,如果tags-table-list 不为空,在加载的时候询问: keep current list of tags tables also? (y or n),回答 y,则把加载的文件名也加入到tags-table-list中,如:("/home/xxx/tmp/TAGS3" "/home/xxx/tmp/TAGS") 包含两个 tags table 文件;
另外有一个变量是:tags-file-name,这个只显示一个tags table文件,不要设置这个变量名,它和tags-table-list只能设置一个;
tags-reset-tags-table 函数重置以上两个变量;
6. 使用emacs中的tags相关命令
find-tag:查找符号定义;(M-.被Global占用)查找下一个
find-tag-regexp,C-M-. :
按照正则表达式查找TAGS文件,找到第一个匹配的就返回,并倒转到匹配的位置,继续查找下一个用 C-u C-M-. ;
参考:http://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Tag.html
tags-search:通过正则表达式查找,TAGS对应的源文件,而不是TAGS本身;
处理模式是单行处理,如:可以使用^表示一行的开头;
tags-search找到第一个匹配的就返回,并跳转到哪个文件,M-,(tags-loop-continue)继续查找下个匹配;
注意:etags有些不容易觉察的问题,有些函数标识,比如:sys/socket.h中的函数都没有,所以搜索TAGS文件的命令都找不到这些函数,只有通过tags-search来直接搜索;
tags-apropos:用正则表达式查找一个符号(搜索TAGS本身),并给出所有匹配的列表;
tags-apropos RET iovec RET 结果如下:
参考:http://www.gnu.org/software/emacs/manual/html_node/emacs/List-Tags.html#List-Tags
具体细节参考:GNU Emacs Manual , 32.3 Tag Tables