Emacs TAGS表在lex/yacc文件中被#line指令混淆

Wil*_*mKF 5 tags emacs etag yacc lex

我正在尝试使用etags为大型软件项目生成TAGS表.由于lex/yacc生成的.c文件中的#line指令引用了非限定文件名而不是#,TAGS文件最终会在顶层显示不存在的文件而不是子目录中存在的文件.包含包含该文件的子目录的行.

如何通过将这些#line指令正确解析为子目录中的现有文件而不是被解释为顶级文件来生成TAGS表?

我从顶级目录运行这样的etags:

rm -f TAGS; find . \( -not -regex '.*include/.*' \)
                -a \( -name '*.h' -o -name '*.hh' -o -name '*.y' -o -name '*.l'
                   -o -name '*.cc' -o -name '*.cpp' -o -name '*.hpp' -o -name '*.c'
                   -o -name '*.inl' \)
             | xargs etags -o TAGS --append
Run Code Online (Sandbox Code Playgroud)

但我有一个文件,act/Par.c,在生成的文件中间包含以下行:

#define T_NUM 274
#define T_STRING 275

#line 5 "Par.y"

#undef actCPMeshConfigIn_yywrap
#define actCPMeshConfigIn_YYMAXDEPTH 20000
Run Code Online (Sandbox Code Playgroud)

这导致以下TAGS表条目:

act/Par.c,1160
[...]
#define T_NUM 92,2870
#define T_STRING 93,2888

Par.y,1320
#undef actCPMeshConfigIn_yywrap20,
#define actCPMeshConfigIn_YYMAXDEPTH 22,
Run Code Online (Sandbox Code Playgroud)

但是文件Par.y实际上位于act/Par.y,但#line指令相对于当前文件,但TAGS使其相对于生成的TAGS文件.

在不改变我构建项目的方式的情况下,如何生成TAGS文件,以便将这些#line指令正确解释为相对于它们出现的文件?或者,如何轻松跳过这些麻烦的文件?

Wil*_*mKF 0

解决方案是在 etgas 模式下递归运行Exuberant Ctags 。您可以通过创建一个指向 exuberant ctags 的名为 etags 的链接来使 exuberant ctags 在 etags 模式下运行,并且它会检测到它是作为 etags 启动的并表现得适当:

etags-R。

或者 -e 表示 etags 模式:

ctags -e -R 。