2011-08-24 6 views
5

Estoy intentando generar tablas TAGS utilizando etags para un proyecto de software grande. El archivo TAGS termina teniendo entradas para archivos inexistentes en el nivel superior en lugar de los existentes en un subdirectorio debido a las directivas #line en los archivos .c lex/yacc generados que hacen referencia a un nombre de archivo no calificado en lugar de un # línea que incluye el subdirectorio que contiene el archivo.La directiva #line confunde la tabla Emacs TAGS en archivos lex/yacc

¿Cómo puedo obtener las tablas TAGS para generar con estas directivas #line resueltas correctamente a un archivo existente en el subdirectorio en lugar de interpretarlas como archivos de nivel superior?

Puedo ejecutar etags de este tipo de directorio de nivel superior:

rm -f TAGS; find . \(-not -regex '.*include/.*' \) 
       -a \(-name '*.h' -o -name '*.hh' -o -name '*.y' -o -name '*.l' 
        -o -name '*.cc' -o -name '*.cpp' -o -name '*.hpp' -o -name '*.c' 
        -o -name '*.inl' \) 
      | xargs etags -o TAGS --append 

Pero tengo un archivo, acto/Par.c, que contiene las siguientes líneas en el medio del archivo generado:

#define T_NUM 274 
#define T_STRING 275 

#line 5 "Par.y" 

#undef actCPMeshConfigIn_yywrap 
#define actCPMeshConfigIn_YYMAXDEPTH 20000 

lo que se traduce en las etiquetas de entradas de la tabla de los siguientes:

act/Par.c,1160 
[...] 
#define T_NUM 92,2870 
#define T_STRING 93,2888 

Par.y,1320 
#undef actCPMeshConfigIn_yywrap20, 
#define actCPMeshConfigIn_YYMAXDEPTH 22, 

Pero el archivo es Par.y acto ual ubicado en act/Par.y, pero la directiva #line es relativa al archivo actual, pero TAGS lo hace relativo al archivo TAGS generado.

Sin cambiar la forma en que construyo el proyecto, ¿cómo puedo generar los archivos TAGS para que estas directivas #line se interpreten correctamente como relativas al archivo en el que ocurren? Alternativamente, ¿cómo puedo omitir estos archivos problemáticos fácilmente?

Respuesta

0

La solución es ejecutar en su lugar Exuberant Ctags en modo etgas y recursivamente. Usted causa exuberantes ctags se ejecuten en el modo etags mediante la creación de un enlace etags con nombre para los ctags exuberantes y detecta que se lanzó como etags y se comporta de manera apropiada:

etags -R.

Alternativamente -e significa modo etags:

ctags -R -e.

Cuestiones relacionadas