web-dev-qa-db-ja.com

C構文マングリングマクロを元に戻して、exctagがプロトタイプタグを作成できるようにする

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オプションを試しましたが、役に立ちませんでした。誰かがこれを解決しましたか?

4
Jens

その特定のマクロを処理するには、--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
4

前処理されたファイルで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:
5
Kusalananda