2011-07-25 8 views
9

¿Hay alguna manera para que los ctags manejen prototipos de función multilínea en C?ctags prototipos de función C multilínea

He buscado alrededor y la --fields=+S tiene que hacer prototipos de varias líneas, pero no puedo conseguir que funcione:

ctags -x --c-kinds=pf --fields=+S file 

archivo:

int 
foo(int 
    x, int y 
    ); 

ctags sólo se devuelve:

foo(int 

(Tenga en cuenta que el tipo de devolución tampoco se encuentra)

En última instancia me gustaría obtener una salida similar a

int foo(int x, int y); 

o

int foo(int x, int y 

es --fields=+S no es la forma correcta? ¿Hay alguna parte de los campos de ctags que me falta? ¿Alguna sugerencia en general?

Si no hay forma de hacerlo en ctags, ¿algún programa recomendado? (Actualmente estoy viendo uncrustify)

Respuesta

0

he podido encontrar nada con ctags así que escribí un script Python para volver a organizar mi archivo para que ctags podrían capturar los prototipos.

Nota: mi código tenía comentarios y tanto de esto se encarga de eliminarlos (de lo contrario, se interpondrían en el camino de ctags).

manipulaciones se hace en este orden:

# concat to one line 
file_str = '' 
for line in read_from.readlines(): 
    file_str += line 

# remove all /* */ comments 
file_str = re.sub('/\*(.|[\r\n])*?\*/', '', file_str) 

# remove '//' comments 
file_str = re.sub('//.*', '', file_str) 

# split on '\n' 
file_as_list = file_str.splitlines(True) 

# strip everything 
for index in range(len(file_as_list)): 
    file_as_list[index] = file_as_list[index].strip() 

# add in newlines where appropriate 
for line in file_as_list: 
    # if the line ends in ';' or '}' 
    if line.endswith(';') or line.endswith('}'): 
     # append a newline to the stripped line 
     write_to.write(line.strip() + '\n') 
    else: 
     # append a space to the stripped line 
     write_to.write(line.strip() + ' ') 
-1

Puede eliminar los saltos de línea innecesarios con un filtro simple, p.

tr '\n' ' ' | sed 's/\([{};]\)/\1\n/g' 
1

tuve el mismo problema con mi código pero no podía modificarlo. Cuando uso el parámetro --fields = + S, parece que funciona porque obtengo una línea adicional en el archivo de etiqueta. La firma: parte contiene todos los parámetros de la función.

CopyToTX26 D: \ Bisel \ My Dropbox \ Trabajo \ 0_BSW \ PKG_CMD \ Memory.c/^ vacío CopyToTX26 (uint16 memory_ID, uint32 ** pt_data_address, uint32 nb_recover, $/"; f firma :(uint16 memory_ID, uint32 ** pt_data_address, uint32 nb_recover, uint32 * nb_copied, max_length uint32)

0
opción

--_ xformat puede ayudarle.

[[email protected] ~]$ cat /tmp/foo.h 
int 
foo(int 
    x, int y 
    ); 
[[email protected] ~]$ ~/var/ctags/ctags -x --c-kinds=pf --_xformat="%-16N %4n %-16F %C %S" /tmp/foo.h 
foo     2 /tmp/foo.h  foo(int (int x,int y)