Ctags

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

Ctags: Ctags)はソース及びヘッダ内にある名前のインデックス(又はタグ)ファイルを生成するプログラム。様々なプログラミング言語に対応している。言語に依存するが、サブルーチン(関数)、変数クラスのメンバ、マクロ等がインデックス化される。これらのタグによりテキストエディタなどのツールで高速かつ容易に定義を参照できる。相互参照ファイルを出力でき、また名前についての情報を人が読みやすい形で列挙した言語ファイルを生成することもできる。

CtagsKen ArnoldBSD Unix用に開発した。後にJim KlecknerによりFortranがサポートされ、ビル・ジョイによりPascalがサポートされた。

ctagsをサポートするエディタ[編集]

タグインデックスファイルは下記を含む数多くのソースコードエディタでサポートされている。

ctagsの派生版[編集]

ctagsにはいくつかの派生版が存在する。

Etags[編集]

EtagsはEmacs上で動作するctagsである。ctagsが生成するViフォーマットのタグファイル用にのみ意味のあるオプションはetagsでは解釈されず無視される。

Exuberant Ctags[編集]

Darren Hiebertが開発したExuberant Ctagsは元々Vimと共に配布されていたが、Vim 6のリリースに合わせて独立したプロジェクトになった。[1] Emacs互換機能をサポートしている。

Exuberant Ctagsは正規表現を用いることにより数多くのプログラミング言語に対応でき、30以上の言語に対応している。

タグファイルのフォーマット[編集]

複数のタグファイルフォーマットがある。その一部を以下で説明する。説明中の<\x##>は16進数でバイトを表している。

Ctagsフォーマット及びExuberant Ctagsフォーマット[編集]

オリジナルのctagsフォーマットとExuberant Ctagsフォーマットはファイルフォーマットが似ている。[2]

Ctagsフォーマット[編集]

エディター「vi」系用のフォーマット。タグファイルは通常は tags という名前である。

タグファイルは行単位でフォーマットされている。

{タグ名}<Tab>{タグファイル}<Tab>{タグアドレス}

各フィールドは以下のように定義される。

記述 定義
{タグ名} 識別子。空白は含まれない。
<Tab> タブ文字。vi系では複数の空白を取り扱えるが、一文字のみしか許されない。
{タグファイル} {タグ名} が定義されているファイルの名前であり、カレントディレクトリからの相対パス。
{タグアドレス} エディタをタグ位置に移動するラインエディタ用の ex コマンド。viのPOSIX実装では検索又は行番号となる。

タグファイルの検索を高速にするためタグファイルは {タグ名} のフィールドでソートされる。

Exuberant Ctagsフォーマット[編集]

Vim用のフォーマット。後方互換性のため出力フォーマットとしてオリジナルのctagsフォーマットと拡張フォーマットを選択できる。

各フィールドは以下のように定義される。

{タグ名}<Tab>{タグファイル}<Tab>{タグアドレス}[;"<Tab>{タグフィールド}...]

{タグアドレス}までのフィールドは上記のctagsと同じである。

拡張フィールド

  • ;" – セミコロンとダブルコーテーション。vi のコメントと同じ表記により{タグアドレス}を終了させる。
  • {タグフィールド}

拡張フォーマットでは ex コマンドの後ろに ex コメントを続ける形でオリジナルの vi の実装との下位互換性を維持したままで{タグアドレス}フィールドを拡張できる。これらの拡張フィールドはタブで区切られたキー・バリューのペアである。詳細はctagsのマニュアルを参照のこと。

Etagsフォーマット[編集]

Emacs用の etags のフォーマット。タグファイルは通常は TAGS という名前である。

etags のファイルは複数のセクションで構成されている。入力ソースファイル毎に1つのセクションを持つ。各セクションはプレーンなテキストファイルであるが、特別な制御用にアスキー外の文字を使用する。以下の説明においてこれらの文字は<>で囲まれた16進数のコードで表す。

セクションは2行のヘッダで始まる。1行目は<\x0c>一文字のみを含む。2行目は次のようになる。

{ソースファイル<},{タグ定義データのバイト数}

ヘッダの後にはタグの定義が続く。各定義毎に1行。フォーマットは以下の通り。

{タグ定義テキスト}<\x7f>{タグ名}<\x01>{行番号},{バイトオフセット}

タグ定義よりタグの名称が導き出せる場合は{タグ名} とその後ろの \x01 が無視される。

[編集]

ソースコードとして次のような1行だけのtest.cを読み込ませた場合、

#define CCC(x)

TAGS ファイルは次のようになる。

<\x0c>
test.c,21
#define CCC(<\x7f>CCC<\x01>1,0

参考文献[編集]

  1. ^ en:Template:Cite web
  2. ^ en:Template:Cite web

外部リンク[編集]