ctags는 stdio.h를 제대로 구문 분석하지 않습니다
문제
나는 CTAG를 VIM과 함께 사용하려고 노력하고 있으며 둘 다 초보자입니다. CTAG가 유용 할 수있는 정도를 테스트하기 위해 나는 매우 간단한 테스트, 즉 매우 기본적인 기능을 자동으로 완성 할 수 있도록 매우 간단한 테스트, 즉 헤더를 /USR /include를 구문 분석하기로 결정했습니다.
내가 명령을 실행할 때
ctags --c++-kinds=+p --fields=+iaS -f ~/.tags/tags /usr/include/*.h
그런 다음 출력이 인쇄됩니다
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
따라서 분명히 CTAG는 Fopen과 같은 매우 명백한 기능을 놓쳤지만 fclose와 같은 기능이 포함되었습니다. CTAGS와 구문 분석 할 때 누락 된 옵션이 있습니까?
해결책
을 추가하다 -I__wur
CTAGS 명령에 따라 결과를 얻을 수 있습니다.__wur
매크로입니다 __attribute__ ((__warn_unused_result__))
더 자세한 설명은 다음을 참조하십시오.
http://sourceforge.net/mailarchive/message.php?msg_name=48a7ff60.9080609%40sina.com
다른 팁
보다 구체적인 태그 파일을 얻을 수 있도록 몇 가지 팁 만 있습니다.
# 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
libc6-indore 파일의 내용은 다음과 같습니다.
__attribute__
__attribute_deprecated__
__attribute_format_arg__
__attribute_format_strfmon__
__attribute_malloc__
__attribute_noinline__
__attribute_pure__
__attribute_used__
__attribute_warn_unused_result__
__wur
__THROW
__nonnull+
VIM과 OMNICPPComplete 플러그인과 함께 이것을 사용하고 있다고 가정합니다.
더 많은 팁, hth.
1. 우분투 머신에서는 실행할 수 있습니다 dpkg -L libc6-dev |grep -o '/usr/include/.*h' > ~/.vim/tags/libc6-dev_files
GNU C 라이브러리에서 헤더를 얻으려면.
2. 아래 명령을 사용하여보다 구체적인 CTAGS 파일을 생성하십시오.
# mkdir
필요한 경우.
cd ~/.vim/tags
# 더 많은 토큰을 사용하여 무시하십시오 grep
.
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 파일을 생성합니다. 자세한 내용은 CTAGS 설명서 페이지를 참조하십시오.
ctags --c++-kinds=+px --fields=+iaS --extra=+q -I @./libc6-dev_ignore-tokens -L libc6-dev_files -f libc6-dev_tags
3. 이 태그 파일을 초기 태그 경로에 추가 set tags+=~/.vim/tags/libc6-dev_tags
.vimrc 파일 어딘가에.
같은 문제. -i 옵션으로 해결되었습니다. 이 사이트를 확인했는지 확인했습니다.http://ctags.sourceforge.net/ctags.html#options
"Gotcha 's"몇 개를 주목하십시오. 먼저, 무시 목록이 포함 된 파일로 -i를 지정할 때 즉시 @ 또는 a를 따라야합니다. 또는 / 또는 드라이브 문자 (Windows에있는 경우). 나는 성공하지 못한 -i ~/를 사용하여 몇 시간을 보냈습니다. -i/home/username/charm처럼 작업 한 것과 동일합니다.
둘째, 멀티 라인 구문 분석 (-fields =+s)을 사용하십시오. 이것은 이미이 스레드에서 OP가 사용하는 옵션으로 표시되었지만 다시 지적하고 싶었습니다.
멋진 팁에 대해 다른 모든 분들께 감사드립니다!