Emacs etags为什么生成损坏的标记文件?

Emacs etags为什么生成损坏的标记文件?,emacs,tags,etag,Emacs,Tags,Etag,我有以下最小的源文件: $ cat path/xx/yy/fooBar.c void this_is_a_test(void) { } 如果我像这样运行ETag,它工作正常: $ etags path/xx/yy/fooBar.c $ cat TAGS path/xx/yy/fooBar.c,25 void this_is_a_test(1,0 但是如果我通过find/xargs运行etags,则标记文件已损坏: $ find . -name fooBar.c ./path/xx/

我有以下最小的源文件:

$ cat path/xx/yy/fooBar.c 
void this_is_a_test(void)
{
}
如果我像这样运行ETag,它工作正常:

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


path/xx/yy/fooBar.c,25
void this_is_a_test(1,0
但是如果我通过find/xargs运行etags,则标记文件已损坏:

$ 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之类的操作来生成标记-名称'*.[ch]'| xargs etags
。但当我这样做的时候,它会破坏大多数文件名

你知道为什么它会这样失败吗?或者我能做些什么让它工作

乌班图清晰。ETAG来自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
新信息


我刚刚注意到,在我上面的原始问题中,这两种用法的区别在于路径上的前导
。如果我调用etag,比如
etag./path/xx/yy/fooBar.c
,它会破坏文件。因此,一个解决方法是确保从arg到etag没有前导标记。(这可能是etags中的一个bug,因为文档几乎准确地描述了我的使用模式。)

在etags之后需要一个
-
,以便从stdin读取:

find . -name fooBar.c | xargs etags -
编辑:


哎呀,我真的应该把整个问题都读一遍。我不知道为什么它会破坏文件名。但是你仍然应该使用
-
:)

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

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

相反?

我刚刚注意到,在我上面的原始问题中,这两种用法之间的区别是前导。在路上。如果我像etag./path/xx/yy/fooBar.c那样调用etag,它会破坏文件。因此,一个解决方法是确保从arg到etag没有前导标记。(这可能是etags中的一个错误,因为文档几乎准确地描述了我的使用模式。)

我就是这么做的:

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

嗯。

我在这里面临同样的问题。然而,考虑到您没有提供etags/emacs版本,您使用的I不是100%,我们讨论的是相同的问题

我的etags/emacs版本23.1,我认为etags中有一个bug,当文件名前缀为“/”时,它会破坏文件名。例如,我提取了一个特定文件,该文件的名称已损坏,并为其生成了带有或不带“/”前缀的标记文件。仅在前缀为“/”时发生损坏

我的-绕过这个问题-解决方案是在将文件名输入到“etags”之前先剪切“/”前缀。我是这样做的:

find . -name '*.[hc]' -print  | cut -c3- | xargs etags -

这对我有用,希望对你有用

xargs
读取stdin并将文件作为参数提供给etag。如果我没有使用xargs,我将需要
-
——我已经尝试过了,但它仍然会损坏文件。问题在于版本:
etag来自emacs23 bin common 23.1+1-4ubuntu7
。我认为这与中描述的错误相同。修复-到目前为止-还没有被移植到Ubuntu。感谢你提供了一个替代配方,但你的解决方法基本上与我上面的回答相同——feed etags文件名不带“.”。感谢你的回答。它帮助了我。我想知道为什么这个错误仍然存在,或者它是否不是一个错误。为了防止一个文件恰好缺少“/”,最好使用sed来去掉前面的“/”:
sed“s/^\.\//”| xargs etags-
如果你不挑剔,你可以使用--recurse选项拾取所有文件(不仅仅是.c和.h):
etags--recurse.
,至少在ctags-5.8中。@fearless\u傻瓜:谢谢!这个选项在emacs附带的
etag
中不可用,但是知道它的存在让我想切换到丰富的CTag。我不知道它是否有任何缺点,但是
find$PWD-name'*.c'-o-name'*.h'| xargs etag
呢?这样,绝对路径将移交给ETAG。