Emacs TAGS表与lex/yacc文件中的#line指令混淆



我正在尝试为一个大型软件项目使用etags生成TAGS表。由于lex/yacc生成的.c文件中的#line指令引用了一个未限定的文件名,而不是包含包含该文件的子目录的#line指令,因此TAGS文件最终在顶层拥有不存在的文件条目,而不是子目录中存在的条目。

我怎么能得到标签表生成这些#行指令正确解决现有的文件在子目录,而不是被解释为顶级文件?

我在顶层目录下运行这样的标签:

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

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

#define T_NUM 274
#define T_STRING 275
#line 5 "Par.y"
#undef actCPMeshConfigIn_yywrap
#define actCPMeshConfigIn_YYMAXDEPTH 20000

生成如下的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,

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

在不改变我如何构建项目的情况下,我如何生成TAGS文件,以便这些#line指令被正确地解释为相对于它们所发生的文件?或者,我怎样才能轻松地跳过这些麻烦的文件?

解决方案是在etgas模式下递归地运行Exuberant标签。通过创建一个名为etags的链接到exuberant标签,您可以使exuberant标签在etags模式下运行,并且它检测到它作为etags启动并且行为适当:

etags -R .

或者-e表示标签模式:

标签-e -R .

最新更新