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。