2009-10-27 5 views
6

Ich versuche, Ctags mit VIM zu verwenden, und ich bin ein Neuling zu beiden. Um zu testen, in welchem ​​Umfang ctags nützlich sein könnten, habe ich mich entschieden, einen sehr einfachen Test durchzuführen, nämlich die Header in/usr/include zu analysieren, damit ich einige grundlegende Funktionen automatisch vervollständigen kann.Ctags analysiert stdio.h nicht richtig

Wenn ich den Befehl ausführen

ctags --c++-kinds=+p --fields=+iaS -f ~/.tags/tags /usr/include/*.h 

dann die Ausgabe druckt

 
BUFSIZ /usr/include/stdio.h 108;" d 
EOF /usr/include/stdio.h 115;" d 
FILE /usr/include/stdio.h /^typedef struct _IO_FILE FILE;$/;" t typeref:struct:_IO_FILE 
FSETLOCKING_BYCALLER /usr/include/stdio_ext.h /^ FSETLOCKING_BYCALLER$/;" e enum:__anon122 
FSETLOCKING_BYCALLER /usr/include/stdio_ext.h 39;" d 
FSETLOCKING_INTERNAL /usr/include/stdio_ext.h /^ FSETLOCKING_INTERNAL,$/;" e enum:__anon122 
FSETLOCKING_INTERNAL /usr/include/stdio_ext.h 36;" d 
FSETLOCKING_QUERY /usr/include/stdio_ext.h /^ FSETLOCKING_QUERY = 0,$/;" e enum:__anon122 
FSETLOCKING_QUERY /usr/include/stdio_ext.h 32;" d 
P_tmpdir /usr/include/stdio.h 128;" d 
SEEK_CUR /usr/include/stdio.h 122;" d 
SEEK_END /usr/include/stdio.h 123;" d 
SEEK_SET /usr/include/stdio.h 121;" d 
_IOFBF /usr/include/stdio.h 101;" d 
_IOLBF /usr/include/stdio.h 102;" d 
_IONBF /usr/include/stdio.h 103;" d 
_IO_STDIO /usr/include/libio.h 165;" d 
_IO_STDIO_H /usr/include/libio.h 30;" d 
_OLD_STDIO_MAGIC /usr/include/libio.h 121;" d 
_STDIO_EXT_H /usr/include/stdio_ext.h 24;" d 
_STDIO_H /usr/include/stdio.h 27;" d 
_STDIO_USES_IOSTREAM /usr/include/stdio.h 73;" d 
_VA_LIST_DEFINED /usr/include/stdio.h 81;" d 
__FILE /usr/include/stdio.h /^typedef struct _IO_FILE __FILE;$/;" t typeref:struct:_IO_FILE 
__FILE_defined /usr/include/stdio.h 57;" d 
____FILE_defined /usr/include/stdio.h 67;" d 
__need_FILE /usr/include/stdio.h 37;" d 
__need_FILE /usr/include/stdio.h 59;" d 
__need_NULL /usr/include/stdio.h 33;" d 
__need___FILE /usr/include/stdio.h 38;" d 
__need___FILE /usr/include/stdio.h 69;" d 
__need_getopt /usr/include/stdio.h 902;" d 
__need_size_t /usr/include/stdio.h 32;" d 
__wur /usr/include/stdio.h /^   _IO_cookie_io_functions_t __io_funcs) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^  __THROW __attribute__ ((__format__ (__printf__, 2, 0))) __wur;$/;" v 
__wur /usr/include/stdio.h /^  __THROW __attribute__ ((__format__ (__printf__, 2, 3))) __wur;$/;" v 
__wur /usr/include/stdio.h /^  __THROW __attribute_malloc__ __wur;$/;" v 
__wur /usr/include/stdio.h /^ __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern FILE *fdopen (int __fd, __const char *__modes) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern char *tmpnam (char *__s) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern char *tmpnam_r (char *__s) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern int feof (FILE *__stream) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern int feof_unlocked (FILE *__stream) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern int ferror (FILE *__stream) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern int ferror_unlocked (FILE *__stream) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern int fileno (FILE *__stream) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern int fileno_unlocked (FILE *__stream) __THROW __wur;$/;" v 
__wur /usr/include/stdio.h /^extern int ftrylockfile (FILE *__stream) __THROW __wur;$/;" v 
_flushlbf /usr/include/stdio_ext.h /^extern void _flushlbf (void);$/;" p signature:(void) 
cuserid /usr/include/stdio.h /^extern char *cuserid (char *__s);$/;" p signature:(char *__s) 
dprintf /usr/include/stdio.h /^extern int dprintf (int __fd, __const char *__restrict __fmt, ...)$/;" p signature:(int __fd, __const char *__restrict __fmt, ...) 
fclose /usr/include/stdio.h /^extern int fclose (FILE *__stream);$/;" p signature:(FILE *__stream) 
fcloseall /usr/include/stdio.h /^extern int fcloseall (void);$/;" p signature:(void) 
fflush /usr/include/stdio.h /^extern int fflush (FILE *__stream);$/;" p signature:(FILE *__stream) 
fflush_unlocked /usr/include/stdio.h /^extern int fflush_unlocked (FILE *__stream);$/;" p signature:(FILE *__stream) 
fgetc /usr/include/stdio.h /^extern int fgetc (FILE *__stream);$/;" p signature:(FILE *__stream) 
fgetc_unlocked /usr/include/stdio.h /^extern int fgetc_unlocked (FILE *__stream);$/;" p signature:(FILE *__stream) 
fgetpos /usr/include/stdio.h /^extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);$/;" p signature:(FILE *__restrict __stream, fpos_t *__restrict __pos) 
fgetpos64 /usr/include/stdio.h /^extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos);$/;" p signature:(FILE *__restrict __stream, fpos64_t *__restrict __pos) 
fpos64_t /usr/include/stdio.h /^typedef _G_fpos64_t fpos64_t;$/;" t 
fpos_t /usr/include/stdio.h /^typedef _G_fpos_t fpos_t;$/;" t 
fprintf /usr/include/stdio.h /^extern int fprintf (FILE *__restrict __stream,$/;" p signature:(FILE *__restrict __stream, __const char *__restrict __format, ...) 
fputc /usr/include/stdio.h /^extern int fputc (int __c, FILE *__stream);$/;" p signature:(int __c, FILE *__stream) 
fputc_unlocked /usr/include/stdio.h /^extern int fputc_unlocked (int __c, FILE *__stream);$/;" p signature:(int __c, FILE *__stream) 
fputs /usr/include/stdio.h /^extern int fputs (__const char *__restrict __s, FILE *__restrict __stream);$/;" p signature:(__const char *__restrict __s, FILE *__restrict __stream) 
fputs_unlocked /usr/include/stdio.h /^extern int fputs_unlocked (__const char *__restrict __s,$/;" p signature:(__const char *__restrict __s, FILE *__restrict __stream) 
fscanf /usr/include/stdio.h 441;" d 
fseek /usr/include/stdio.h /^extern int fseek (FILE *__stream, long int __off, int __whence);$/;" p signature:(FILE *__stream, long int __off, int __whence) 
fseeko /usr/include/stdio.h /^extern int fseeko (FILE *__stream, __off_t __off, int __whence);$/;" p signature:(FILE *__stream, __off_t __off, int __whence) 
fseeko64 /usr/include/stdio.h /^extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence);$/;" p signature:(FILE *__stream, __off64_t __off, int __whence) 
fsetpos /usr/include/stdio.h /^extern int fsetpos (FILE *__stream, __const fpos_t *__pos);$/;" p signature:(FILE *__stream, __const fpos_t *__pos) 
fsetpos64 /usr/include/stdio.h /^extern int fsetpos64 (FILE *__stream, __const fpos64_t *__pos);$/;" p signature:(FILE *__stream, __const fpos64_t *__pos) 
getc /usr/include/stdio.h /^extern int getc (FILE *__stream);$/;" p signature:(FILE *__stream) 
getc /usr/include/stdio.h 527;" d 
getc_unlocked /usr/include/stdio.h /^extern int getc_unlocked (FILE *__stream);$/;" p signature:(FILE *__stream) 
getchar /usr/include/stdio.h /^extern int getchar (void);$/;" p signature:(void) 
getchar_unlocked /usr/include/stdio.h /^extern int getchar_unlocked (void);$/;" p signature:(void) 
getw /usr/include/stdio.h /^extern int getw (FILE *__stream);$/;" p signature:(FILE *__stream) 
jpeg_stdio_dest /usr/include/jpeglib.h /^EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));$/;" p signature:(j_compress_ptr cinfo, FILE * outfile) 
jpeg_stdio_dest /usr/include/jpeglib.h 841;" d 
jpeg_stdio_src /usr/include/jpeglib.h /^EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));$/;" p signature:(j_decompress_ptr cinfo, FILE * infile) 
jpeg_stdio_src /usr/include/jpeglib.h 842;" d 
pclose /usr/include/stdio.h /^extern int pclose (FILE *__stream);$/;" p signature:(FILE *__stream) 
perror /usr/include/stdio.h /^extern void perror (__const char *__s);$/;" p signature:(__const char *__s) 
printf /usr/include/stdio.h /^extern int printf (__const char *__restrict __format, ...);$/;" p signature:(__const char *__restrict __format, ...) 
putc /usr/include/stdio.h /^extern int putc (int __c, FILE *__stream);$/;" p signature:(int __c, FILE *__stream) 
putc /usr/include/stdio.h 569;" d 
putc_unlocked /usr/include/stdio.h /^extern int putc_unlocked (int __c, FILE *__stream);$/;" p signature:(int __c, FILE *__stream) 
putchar /usr/include/stdio.h /^extern int putchar (int __c);$/;" p signature:(int __c) 
putchar_unlocked /usr/include/stdio.h /^extern int putchar_unlocked (int __c);$/;" p signature:(int __c) 
puts /usr/include/stdio.h /^extern int puts (__const char *__s);$/;" p signature:(__const char *__s) 
putw /usr/include/stdio.h /^extern int putw (int __w, FILE *__stream);$/;" p signature:(int __w, FILE *__stream) 
rewind /usr/include/stdio.h /^extern void rewind (FILE *__stream);$/;" p signature:(FILE *__stream) 
scanf /usr/include/stdio.h 442;" d 
sscanf /usr/include/stdio.h 443;" d 
stderr /usr/include/stdio.h 152;" d 
stdin /usr/include/stdio.h 150;" d 
stdout /usr/include/stdio.h 151;" d 
ungetc /usr/include/stdio.h /^extern int ungetc (int __c, FILE *__stream);$/;" p signature:(int __c, FILE *__stream) 
va_list /usr/include/stdio.h /^typedef _G_va_list va_list;$/;" t 
vdprintf /usr/include/stdio.h /^extern int vdprintf (int __fd, __const char *__restrict __fmt,$/;" p signature:(int __fd, __const char *__restrict __fmt, _G_va_list __arg) 
vfprintf /usr/include/stdio.h /^extern int vfprintf (FILE *__restrict __s, __const char *__restrict __format,$/;" p signature:(FILE *__restrict __s, __const char *__restrict __format, _G_va_list __arg) 
vfscanf /usr/include/stdio.h 500;" d 
vprintf /usr/include/stdio.h /^extern int vprintf (__const char *__restrict __format, _G_va_list __arg);$/;" p signature:(__const char *__restrict __format, _G_va_list __arg) 
vscanf /usr/include/stdio.h 501;" d 
vsscanf /usr/include/stdio.h 502;" d 

so ctags klar einige sehr offensichtliche Funktionen wie fopen verpasst, dennoch enthalten Funktionen wie fclose. Gibt es eine Option, die ich vermisse, wenn ich mit Ctags analysiere?

Antwort

4

Fügen Sie einen -I__wur zu Ihrem Befehl ctags hinzu und Sie erhalten das Ergebnis, nach dem Sie suchen. __wur ist ein Makro für __attribute__ ((__warn_unused_result__))

Für eine thurough Erklärung finden Sie unter:

http://sourceforge.net/mailarchive/message.php?msg_name=48A7FF60.9080609%40sina.com

+0

Oh ich sehe, gibt es eine allgemeine Möglichkeit, Ctags zu sagen, dass ich Funktionsdeklarationen über die entsprechenden Makros bevorzuge? – ldog

5

einfach ein paar Tipps, damit Sie präziser Tags Datei erhalten können:

# First make sure apt-file is install and then do: 
$ sudo apt-file update 
# set up tags for libc, the standard C library 
$ apt-file list libc6-dev | grep -o '/usr/include/.*\.h'> ~/.vim/tags/libc6-filelist 
$ ctags --sort=foldcase --c++-kinds=+p --fields=+iaS --extra=+q -I./libc6-ignore -f ~/.vim/tags/libc6 -L ~/.vim/tags/libc6-filelist 

Die Inhalt der Datei libc6-ignore sind:

__attribute__ 
__attribute_deprecated__ 
__attribute_format_arg__ 
__attribute_format_strfmon__ 
__attribute_malloc__ 
__attribute_noinline__ 
__attribute_pure__ 
__attribute_used__ 
__attribute_warn_unused_result__ 
__wur 
__THROW 
__nonnull+ 

Ich nehme an, Sie verwenden dies mit Vim und dem OmniCppComplete-Plug-in?

2

Nur noch mehr Tipps, HTH.

. Unter Ubuntu kann man dpkg -L libc6-dev |grep -o '/usr/include/.*h' > ~/.vim/tags/libc6-dev_files laufen lassen, um Header in GNU C Library zu bekommen.

. Verwenden Sie die folgenden Befehle, um spezifischere Ctags-Dateien zu generieren.

# mkdir bei Bedarf.

cd ~/.vim/tags 

# Mit grep weitere Token ignorieren.

grep -oe '__attribute\w*__' libc6-dev_tags |sort -u > libc6-dev_ignore-tokens 
echo __THROW >> libc6-dev_ignore-tokens 
echo __wur >> libc6-dev_ignore-tokens 

# Ctags-Datei generieren. Weitere Informationen finden Sie auf der Ctags-Handbuchseite.

ctags --c++-kinds=+px --fields=+iaS --extra=+q -I @./libc6-dev_ignore-tokens -L libc6-dev_files -f libc6-dev_tags 

. Fügen Sie diese Tag-Datei zu Ihrem ursprünglichen Tag-Pfad hinzu, d. H. Setzen Sie set tags+=~/.vim/tags/libc6-dev_tags irgendwo in Ihre .vimrc-Datei.

0

Gleiches Problem. Gelöst mit der Option -I. Überprüft diese Seite für Info: http://ctags.sourceforge.net/ctags.html#OPTIONS

Beachten Sie ein paar "Gotcha's". Zunächst muss bei der Angabe von -I mit einer Datei, die die Ignorierliste enthält, sofort ein @ oder a folgen. oder ein Laufwerksbuchstabe (wenn in Windows). Ich habe Stunden damit verbracht, -I ~/ohne Erfolg zu benutzen. Das Gleiche gilt für -I/home/Benutzername/arbeitete wie ein Charme.

Zweitens sicherstellen, Multi-Line-Parsing zu verwenden (--fields = + S). Dies wird bereits als eine Option angezeigt, die vom OP in diesem Thread verwendet wird, aber wollte es wieder hervorheben.

Danke allen anderen für die tollen Tipps!

Verwandte Themen