2011-07-25 17 views
9

Czy istnieje sposób na ctags obsługi prototypów funkcji wieloliniowych w C?Ctags wieloliniowy prototypy funkcji C

Rozglądałem się dookoła i --fields=+S ma robić multilinii prototypy, ale nie mogę zmusić go do pracy:

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

plików:

int 
foo(int 
    x, int y 
    ); 

ctags zwraca tylko:

foo(int 

(Zwróć uwagę, że brakuje również typu zwrotu)

Docelowo chciałbym uzyskać wynik podobny do

int foo(int x, int y); 

lub

int foo(int x, int y 

jest --fields=+S nie jest poprawny sposób? Czy jest część pól ctags, których mi brakuje? Jakieś wskazówki w ogóle?

Jeśli nie ma sposobu, aby to zrobić w ctags, jakiekolwiek zalecane programy? (Obecnie szukam nieuświadomienia)

Odpowiedz

0

byłem w stanie znaleźć niczego z ctags więc napisałem skrypt Pythona, aby ponownie zorganizować tak, że mój plik ctags mógł uchwycić prototypy.

Uwaga: mój kod zawiera komentarze, a wiele z nich zajmuje się ich usunięciem (w przeciwnym razie przeszkadzałyby one ctags).

Manipulacje zostały wykonane w następującej kolejności:

# 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

Można usunąć niepotrzebne podziały wierszy za pomocą prostego filtru, np.

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

miałem ten sam problem z mojego kodu, ale nie mogłem go zmodyfikować. Kiedy używam parametru --fields = + S, wydaje się, że działa, ponieważ dostaję dodatkową linię w pliku znacznika. Podpis: część zawiera wszystkie parametry funkcji.

CopyToTX26 D: \ Bisel \ My Dropbox \ Work \ 0_BSW \ PKG_CMD \ Memory.c/^ nieważne CopyToTX26 (uint16 memory_ID, UInt32 ** pt_data_address, UInt32 nb_recover, $ /;”f podpis :(uint16 memory_ID, UInt32 ** pt_data_address, UInt32 nb_recover, UInt32 * nb_copied, UInt32 max_length)

0
opcja

--_ xformat może pomóc.

[[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)