为什么ETags会生成一个损坏的TAGS文件?

6

我有以下最简源文件:

$ cat path/xx/yy/fooBar.c 
void this_is_a_test(void)
{
}

如果我这样运行etags,它可以正常工作:

$ etags path/xx/yy/fooBar.c 
$ cat TAGS 


path/xx/yy/fooBar.c,25
void this_is_a_test(1,0

但是如果我通过find/xargs运行etags,TAGS文件就会损坏:

$ find . -name fooBar.c
./path/xx/yy/fooBar.c
$ find . -name fooBar.c | xargs etags
$ cat TAGS


path/xx/yy/fBoBar.c,25
void this_is_a_test(^?1,0

请注意,文件名显示为fBoBar.c -- 无效! 我希望能够通过执行类似于“find . -name'*.[ch]'| xargs etags”的操作来生成TAGS。但是当我这样做时,大多数文件名都被破坏了。 有什么想法可以解决这个问题,或者我可以做些什么让它工作? Ubuntu Lucid。 Etags来自emacs23-bin-common 23.1+1-4ubuntu7。编辑:响应fschmitt的问题:
$ etags $(find . -name fooBar.c)
$ cat TAGS 


path/xx/yy/fBoBar.c,25
void this_is_a_test(1,0

新信息:

我刚刚注意到,我在上面的原始问题中两种用法的区别是路径前面有一个.。如果我像这样调用etags:etags ./path/xx/yy/fooBar.c,它会损坏文件。因此,解决方法是确保传递给etags的参数没有前导标签。(也许这是etags的一个bug,因为文档几乎完全描述了我的使用模式。)

5个回答

6
我正在面对同样的问题。但是,由于您没有提供您使用的etags/emacs版本,我不能百分之百确定我们在讨论同一个问题。
我的etags/emacs版本是23.1,我认为etags存在一个bug,当文件名以"./"为前缀时会破坏它们。例如,我选取了一个特定的文件,其名称被破坏,并分别使用和不使用"./"前缀为其生成TAGS文件。只有在"./"前缀下出现了破坏。
我的解决方法是,在将文件名传递给"etags"之前,剪切"./"前缀。以下是我的做法:
find . -name '*.[hc]' -print  | cut -c3- | xargs etags -

这对我有效,希望对你也有用!

版本是在问题中提到的:Etags来自于emacs23-bin-common 23.1+1-4ubuntu7. - bstpierre
1
我认为这与 https://bugs.launchpad.net/ubuntu/+source/emacs23/+bug/582347 中描述的错误相同。截至目前,修复程序尚未移植到Ubuntu。 - mshamma
谢谢提供另一种解决方案,但你的解决方法本质上与我之前回答的相同--将没有前导“.”的ETags文件名作为输入。 - bstpierre
谢谢你的回答,它对我很有帮助。我想知道为什么这个 bug 仍然存在,或者它是否不是一个 bug。 - Geoff
如果文件没有 "./" 前缀,最好使用 sed 命令来删除前导的 "./":sed "s/^\.\///" | xargs etags - - Jack Morrison

1
我刚刚注意到,我在上面的原始问题中使用的两种方式之间的区别是路径前面的 .。如果我像 etags ./path/xx/yy/fooBar.c 这样调用 etags,它会破坏文件。因此,解决方法是确保传递给 etags 的参数没有前导标记。(也许这是 etags 的一个 bug,因为文档几乎完全描述了我的使用模式。)

1
如果您不挑剔的话,可以使用--recurse选项获取所有文件(而不仅仅是.c和.h文件):etags --recurse .,至少在http://ctags.sourceforge.net/ ctags-5.8中。 - fearless_fool
@fearless_fool:谢谢!Emacs自带的etags没有这个选项,但是知道它的存在让我想切换到exuberant ctags。 - bstpierre
1
我不知道它是否有任何缺点,但是 find $PWD -name '*.c' -o -name '*.h' | xargs etags 怎么样?这样绝对路径就可以传递给 etags 了。 - Marc P.

0

这是我的工作内容:

etags --members `find ./ | grep [ch]$`

HTH.


0
你需要在 etags 后面加一个-,才能从标准输入中读取:
find . -name fooBar.c | xargs etags -

编辑:

糟糕,我本应该读完整个问题的。我不知道为什么它会破坏文件名。但你仍然应该使用- :)


xargs 从标准输入读取并将文件作为参数提供给 etags。如果我不使用 xargs,我需要使用 -,但我已经尝试过了,它仍然会损坏文件。 - bstpierre

0

这很奇怪。如果你这样做会发生什么?

etags `find . -name '*.c'` `find . -name '*.h'`

不是吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接