Perché è etags generando un file TAGS corrotto?
Domanda
Ho il seguente file di origine minima:
$ cat path/xx/yy/fooBar.c
void this_is_a_test(void)
{
}
Se corro etags come questo funziona bene:
$ etags path/xx/yy/fooBar.c
$ cat TAGS
path/xx/yy/fooBar.c,25
void this_is_a_test(1,0
Ma se corro etags tramite find / xargs il file è danneggiato 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
Si noti gli spettacoli nome del file in alto come fBoBar.c -! Fasullo
Mi piace essere in grado di generare i tag facendo qualcosa di simile find . -name '*.[ch]' | xargs etags
. Ma sta corrompendo la maggior parte dei nomi dei file quando faccio questo.
Qualsiasi idea del perché si sta venendo a mancare in questo modo, e / o che cosa posso fare per farlo funzionare?
Ubuntu Lucid. Etags è da emacs23-bin-comune 23.1 + 1-4ubuntu7.
Modifica :
In risposta alla domanda di fschmitt:
$ etags $(find . -name fooBar.c)
$ cat TAGS
path/xx/yy/fBoBar.c,25
void this_is_a_test(1,0
Nuova informazioni :
Ho appena notato che la differenza tra i due usi nella mia domanda iniziale di cui sopra è la .
leader sul percorso. E se chiamo etags come etags ./path/xx/yy/fooBar.c
, corrompe il file. Quindi, una soluzione è quello di assicurarsi che i args a etags non hanno i tag principali. (Forse questo è un bug in etags, perché la documentazione descrive il mio modello di utilizzo quasi esattamente.)
Soluzione 2
Ho appena notato che la differenza tra i due usi nella mia domanda iniziale di cui sopra è il leader. sul percorso. E se chiamo etags come etags ./path/xx/yy/fooBar.c, corrompe il file. Quindi, una soluzione è quello di assicurarsi che i args a etags non hanno i tag principali. (Forse questo è un bug in etags, perché la documentazione descrive il mio modello di utilizzo quasi esattamente.)
Altri suggerimenti
Sono di fronte qui lo stesso problema. Tuttavia dato che non hai fornito ETAG / emacs versione vostro usando io non sono al 100% per cento che stiamo parlando dello stesso problema.
I miei ETAGs / emacs versione 23.1 e penso che ci sia un bug in etags che sta corrompendo i nomi dei file quando sono preceduti da un "./". Per esempio ho preso un unico file specifico che il suo nome era stato danneggiato e ha generato il file TAGS per questo con e senza il "./" prefisso. La corruzione si è verificato solo con il "./" prefisso.
Il mio - di aggirare il problema - soluzione è quella di tagliare il "./" prefisso prima di alimentare i nomi dei file per 'etags'. Ecco come lo faccio:
find . -name '*.[hc]' -print | cut -c3- | xargs etags -
Questo funziona per me la speranza che fa per voi!
Hai bisogno di un -
dopo etags per farlo leggere da stdin:
find . -name fooBar.c | xargs etags -
Modifica
Ops, ho davvero dovuto leggere tutta la questione. Non so il motivo per cui sta corrompendo i nomi dei file. Ma si dovrebbe comunque usare -
:)
Questo è strano. Che cosa succede se si fa
etags `find . -name '*.c'` `find . -name '*.h'`
, invece?
Questo è quello che faccio:
etags --members `find ./ | grep [ch]$`
HTH.