Extags(Exuberant Ctags)を使用してvimのtags
ファイルを正常に作成できます。
ただし、関数のプロトタイプへのジャンプを許可するタグの作成は機能しません。これは、システムヘッダーが次の形式の構文マングリングマクロを使用しているためです。
#define _EXFUN(name, proto) name proto
とで、例えばstring.h
使用
char *_EXFUN(strchr,(const char *, int));
これは、strchr
の代わりに_EXFUN
のタグを作成します。
_EXFUN /somedir/include/string.h /^char *_EXFUN(strchr,(const char *, int));$/;" p
このコマンドでタグを作成します:
exctags -f tags.p --language-force=c --c-kinds=p file1 file2 ...
私はexctagsのマニュアルページを上下に読み、マクロ展開に影響を与えるためにさまざまな-I
オプションを試しましたが、役に立ちませんでした。誰かがこれを解決しましたか?
その特定のマクロを処理するには、--regex-<LANG>
オプションを使用できます。
ctags --regex-c='/^[^#]*_EXFUN *\( *([^ ,]+),.*/\1/p/' ...
tags
ファイルを生成します。
_EXFUN test.c 1;" d file:
strchr test.c /^char *_EXFUN(strchr,(const char *, int));$/;" p
前処理されたファイルでectags
を実行し、プリプロセッサのコメント(--line-directives=yes
)を確認し、行番号をtags
ファイル(-n
または--excmd=numbers
)に書き込むように依頼します。
cc -E prog.c >prog.p
ectags --line-directives=yes --language-force=c --c-kinds=p -n prog.p
サンプルCファイル:
#define _EXFUN(name, proto) name proto
char *_EXFUN(strchr,(const char *, int));
結果のtags
ファイル:
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /[email protected]/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.8 //
strchr prog.c 3;" p file:
ご覧のとおり、strchr
のプロトタイプは、prog.c
の3行目にあるものとしてリストされています。
欠点これは、マクロの前処理用のタグエントリを取得しないことです。
ただし、前処理されたファイルと元のファイルの両方でectags
を実行することで、これを解決できます。
ectags --line-directives=yes --language-force=c --c-kinds=pd -n -I _EXFUN prog.p prog.c
を生成します
[...]
_EXFUN prog.c 1;" d file:
strchr prog.c 3;" p file: