Ich habe die folgende minimale Quelldatei:Warum generiert Etags eine beschädigte TAGS-Datei?
$ cat path/xx/yy/fooBar.c
void this_is_a_test(void)
{
}
Wenn ich etags wie folgt ausführen es funktioniert ok:
$ etags path/xx/yy/fooBar.c
$ cat TAGS
path/xx/yy/fooBar.c,25
void this_is_a_test(1,0
Aber wenn ich etags über find/xargs die TAGS-Datei ausgeführt wird beschädigt:
$ 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
Beachten Sie den Dateinamen oben als fBoBar.c - gefälscht!
Ich mag in der Lage sein, TAGS zu generieren, indem Sie etwas wie find . -name '*.[ch]' | xargs etags
tun. Aber es beschädigt die meisten Dateinamen, wenn ich das tue.
Eine Idee, warum es so versagt und/oder was ich tun kann, damit es funktioniert?
Ubuntu Lucid. Etags kommt von emacs23-bin-common 23.1 + 1-4ubuntu7.
bearbeitet:
Als Reaktion auf fschmitt Frage:
$ etags $(find . -name fooBar.c)
$ cat TAGS
path/xx/yy/fBoBar.c,25
void this_is_a_test(1,0
Neue Informationen:
Ich habe gerade bemerkt, dass der Unterschied zwischen den beiden Anwendungen in meiner ursprünglichen Frage oben ist der führende .
auf dem Weg. Und wenn ich Etags wie etags ./path/xx/yy/fooBar.c
aufrufen, korrumpiert es die Datei. Ein Workaround besteht also darin, sicherzustellen, dass die Argumente für Etags keine führenden Tags haben. (Vielleicht ist dies ein Bug in etags, weil die Dokumentation Muster meiner Nutzung beschreibt ziemlich genau.)
Wenn Sie nicht wählerisch sind, können Sie alle Dateien (nicht nur .c und .h) mit der Option --recurse: 'etags --recurse .' aufheben, zumindest in http: //ctags.sourceforge. net/ctags-5.8. –
@fearless_fool: Danke! Diese Option ist nicht in den'Etags' verfügbar, die mit Emacs geliefert werden, aber wenn ich weiß, dass es existiert, möchte ich zu überschwänglichen Ctags wechseln. – bstpierre
Ich weiß nicht, ob es irgendwelche Nachteile hat, aber was ist mit 'find $ PWD -name '* .c' -o-name '* .h' | Xargs Etags? Auf diese Weise werden die absoluten Pfade an Etags übergeben. –