vim-jp / vimdoc-ja / tagsrch

tagsrch - Vim日本語ドキュメント

メインヘルプファイルに戻る English | 日本語
tagsrch.txt   For Vim バージョン 8.0.  Last change: 2016 Sep 20


                  VIMリファレンスマニュアル    by Bram Moolenaar


タグと特別な検索                                        tags-and-searches

初めにユーザーマニュアルのセクション29.1を参照すること。

1. タグへのジャンプ             tag-commands
2. タグスタック                 tag-stack
3. タグマッチリスト             tag-matchlist
4. タグの詳細                   tag-details
5. タグファイルの書式           tags-file-format
6. インクルードファイルの検索   include-search

==============================================================================
1. タグへのジャンプ                                     tag-commands

                                                        tag tags
タグとは "tags" ファイルに現われる識別子である。タグはラベルのようなものであ
り、そこにジャンプすることができる。例えば: Cのプログラムではそれぞれの関数名
をタグとして使うことができる。タグ機能を使う前には、ctagsのようなプログラムに
よって "tags" ファイルを生成しなければならない。

":tag" コマンドはカーソルをタグ上に移動する。CTRL-]コマンドはカーソルの下にあ
るキーワードをタグとして使用する。もしカーソルがキーワード上になければ、カーソ
ル位置から右側で最初に現れるキーワードを使用する。

":tag" コマンドはCプログラムでよく機能する。もし関数呼び出しを見つけた時にその
関数が何をするのか疑問に思ったら、カーソルを関数名の上に置いてCTRL-]を叩けばよ
い。これで関数定義に導いてもらえるだろう。簡単に戻る方法はCTRL-Tコマンドを使う
ことである。後述するタグスタックについても読むとよい。

                                                :ta :tag E426 E429
:[count]ta[g][!] {ident}
                        tagsファイル内の情報を用いて、{ident}の定義へジャンプ
                        する。{ident}はタグスタックに積まれる。[!]については
                        tag-!を参照。
                        {ident}は正規表現を使用できる。tag-regexpを参照。
                        {ident}に対してマッチするタグが複数ある場合、[count]
                        目のタグへジャンプする。[count]が指定されないときは最
                        初のタグへジャンプする。他のマッチするタグへジャンプす
                        るにはtag-matchlistを参照。

g<LeftMouse>                                            g<LeftMouse>
<C-LeftMouse>                                   <C-LeftMouse> CTRL-]
CTRL-]                  カーソルの下のキーワードを定義している場所にジャンプす
                        る。":tag {ident}" と同様であるが、{ident}はカーソルの
                        下、もしくは次に現われるキーワードである。
                        {ident}に対してマッチするタグが複数ある場合、[count]
                        目のタグへジャンプする。[count]が指定されないときは最
                        初のタグへジャンプする。他のマッチするタグへジャンプす
                        るにはtag-matchlistを参照。
                        {Vi: identifier after the cursor}

                                                        v_CTRL-]
{Visual}CTRL-]          ":tag {ident}" と同様であるが、{ident}はハイライトされ
                        ているテキストである。{Vi にはない}

                                                        telnet-CTRL-]
CTRL-]はtelnetの標準エスケープキーである。タグにジャンプしようとCTRL-]を打つと、
代わりにtelnetのプロンプトが立ち上がるだろう。telnetのたいていのバージョンは、
標準エスケープキーを変更、もしくは使用不可能にできる。telnetのマニュアルを参照
すること。エスケープキーを使用不可能にするには 'telnet -E {ホスト名}'、エスケー
プ文字を他の文字にするには 'telnet -e {エスケープ文字} {ホスト名}' を使用する。
もし可能ならtelnetの代わりにsshを使うことで、この問題を回避できる。

                                                        tag-priority
タグのマッチが複数ある場合、以下の優先度が使われる:
1. "FSC"  カレントファイル内の全一致するstaticタグ。
2. "F C"  カレントファイル内の全一致するglobalタグ。
3. "F  "  別のファイル内の全一致するglobalタグ。
4. "FS "  別のファイル内の全一致するstaticタグ。
5. " SC"  カレントファイル内の大文字、小文字を無視した一致をするstaticタグ。
6. "  C"  カレントファイル内の大文字、小文字を無視した一致をするglobalタグ。
7. "   "  別のファイル内の大文字、小文字を無視した一致をするglobalタグ。
8. " S "  別のファイル内の大文字、小文字を無視した一致をするstaticタグ。

カレントファイルが変わっても、優先度のリストはほとんどの場合変化しないので注意
すること。これは ":tnext" を使うときの混乱を避けるためである。優先度のリストは
":tag {ident}" を使ったときに変化する。

以下の場合は ":tag " で大文字小文字を無視した検索は行われません:
'ignorecase' オプションがオフで 'tagcase' が "followic" の時
'tagcase' が "match" である
'tagcase' が "smart" でパターンに大文字が含まれる時
'tagcase' が "followscs" で 'smartcase' オプションがオンで、パターンに大文字
  が含まれる時

以下の場合は大文字小文字を無視した検索が行われます:
- パターンが使用される時 ("/" で始まる)
- ":tselect" の時
'tagcase' が "followic" で 'ignorecase' がオフの時
'tagcase' が "match" の時
'tagcase' が "followscs" で 'smartcase' オプションがオフの時

Note 大文字小文字を無視したタグ検索はタグファイル内での二分探索を無効にし速度
の低下を引き起こします。これは大文字小文字を保持したままタグファイルを並び替え
る事で回避できます。'tagbsearch' オプションの説明を参照

==============================================================================
2. タグスタック                         tag-stack tagstack E425

タグスタック上にはジャンプ先のタグと、どこから来たのかという情報が記憶される。
タグは 'tagstack' オプションが設定されているときにだけ積まれる。

g<RightMouse>                                           g<RightMouse>
<C-RightMouse>                                  <C-RightMouse> CTRL-T
CTRL-T                  タグスタック中の[count]分だけ古いエントリにジャンプす
                        る(デフォルトは1)。 {Vi にはない}

                                                :po :pop E555 E556
:[count]po[p][!]        タグスタック中の[count]分だけ古いエントリにジャンプす
                        る(デフォルトは1)。
                        [!]についてはtag-!を参照。 {Vi にはない}

:[count]ta[g][!]        タグスタック中の[count]分だけ新しいエントリにジャンプ
                        する(デフォルトは1)。
                        [!]についてはtag-!を参照。 {Vi にはない}

                                                        :tags
:tags                   タグスタックの内容を表示する。現在のエントリは '>' で
                        マークされる。 {Vi にはない}

":tags" の出力は以下のようになる:

   # TO tag      FROM line  in file/text
   1  1 main             1  harddisk2:text/vim/test
 > 2  2 FuncA           58  i = FuncA(10);
   3  1 FuncC          357  harddisk2:text/vim/src/amiga.c

このリストはジャンプ先のタグとジャンプ前のカーソル位置を表示する。上から順に古
いタグが並び、一番下が最も新しいタグである。

'>' は現在のエントリを指している。これは次の ":tag" コマンドで使われるタグであ
る。CTRL-Tと ":pop" コマンドは1つ上のタグを使う。

"TO" の列にはマッチリスト中の現在のマッチ数を表示する。これは ":pop" や ":tag"
を使っても変化しないので注意すること。

行番号とファイル名は、タグコマンドを実行する前にいた位置に戻ることができるよう
に記憶される。行番号は行の削除や挿入が行われた時にも正しく維持される。ただし、
別のプログラム(例えば、Vimの別インスタンス)で編集した場合を除く。

ジャンプ前の位置がカレントファイル内であれば、"file/text" の列にその行が表示さ
れる。インデントは取り除かれ、長い行はウィンドウに収まるように切り詰められる。

前に使ったタグにジャンプするコマンドはいくつかある。例えば:

        ":pop" or CTRL-T        ひとつ前に使われたタグにジャンプする。
        {count}CTRL-T           {count}分だけ前のタグにジャンプする。
        ":tag"                  現在のエントリより新しいタグにジャンプする。
        ":0tag"                 最後に使われたタグにジャンプする。

これらの最も明白な利用方法は、プログラムの関数呼び出しをあちこち拾い読みすると
きである。次のような呼び出し図を考える:

        main  --->  FuncA  --->  FuncC
              --->  FuncB

(解説: mainはFuncAとFuncBを呼び出し、FuncAはFuncCを呼び出す)。
FuncAの呼び出し部分の上でCTRL-]を使うことによって、mainからFuncAに行くことがで
きる。同様にCTRL-]を使ってFuncCへ行くことができる。mainに戻るにはCTRL-Tを2回
使う。そこでCTRL-]を使ってFuncBに行くことができる。

":ta {ident}" やCTRL-]コマンドは、タグスタック上の現在の位置にタグを追加する。
もしスタックが満たされていた場合(スタックは20エントリまで保持できる)、最も古い
エントリが削除され、古いものから順にひとつずつ上に移動する(インデックス番号は1
ずつ減る)。もし最後に使われたエントリが一番下になかった場合、最後に使われたエ
ントリより下にあるものは削除される。つまり古いタグ経路は失われる。上のパラグラ
フの説明を実行したあとのタグスタックは次のような状態になる:

   # TO tag     FROM line  in file/text
   1  1 main            1  harddisk2:text/vim/test
   2  1 FuncB          59  harddisk2:text/vim/src/main.c

                                                        E73
タグスタックを使おうとしたとき、タグスタックに何も入っていないとエラーが表示さ
れる。

==============================================================================
3. タグマッチリスト                             tag-matchlist E427 E428

以下のコマンドは複数のタグがマッチしたときに、タグの間を移動するために使うこと
ができる。これらのコマンドはタグスタックを変更せず、同じエントリを保つことに注
意すること。

                                                        :ts :tselect
:ts[elect][!] [ident]   タグファイルの情報を用いて、[ident]にマッチするタグをリ
                        スト表示する。
                        [ident]を省略した場合、タグスタック上の最後のタグが使
                        われる。
                        最初の列に '>' があるものはリスト中の現在の位置を指し
                        示している(それがあるならば)。
                        [ident]は正規表現を取り得る。tag-regexpを参照。
                        リストに使われているプロパティはtag-priorityを参照。
                        {Vi にはない}
                        出力例:


         nr pri kind tag                file
          1 F   f    mch_delay          os_amiga.c
                        mch_delay(msec, ignoreinput)
        > 2 F   f    mch_delay          os_msdos.c
                        mch_delay(msec, ignoreinput)
          3 F   f    mch_delay          os_unix.c
                        mch_delay(msec, ignoreinput)
        Enter nr of choice (<CR> to abort):

                        "pri" についてはtag-priorityを参照。この例は現在の
                        ファイルに依存しているため、":tselect xxx" を使ったと
                        きには違う結果が得られることに注意すること。
                        "kind" はタグファイルからタグの種類が得られる場合のみ、
                        その情報を示す。
                        "info" はタグファイルから得られる情報が表示される。こ
                        の情報はタグファイルを生成したプログラムに依存する。
                        リストが長い場合にはmore-promptが表示される。もしす
                        でに使いたいタグを見つけているのなら、'q' のあとに
                        "nr" の番号を入力すればよい。

                                                        :sts :stselect
:sts[elect][!] [ident]  ":tselect[!] [ident]" を実行し、ウィンドウを分割して
                        選択されたtagを表示する。{Vi にはない}

                                                        g]
g]                      CTRL-]と動作は似ているが、":tag" の代わりに ":tselect"
                        を用いる。{Vi にはない}

                                                        v_g]
{Visual}g]              "g]" と同じ。ただし、選択されたテキストが検索に使われ
                        る。{Vi にはない}
                                                        :tj :tjump
:tj[ump][!] [ident]     ":tselect" と動作は似ているが、適合するtagが1つだけの
                        ときには直接移動する。{Vi にはない}

                                                        :stj :stjump
:stj[ump][!] [ident]    ":tjump[!] [ident]" を実行し、ウィンドウを分割して選択
                        されたtagを表示する。{Vi にはない}

                                                        g_CTRL-]
CTRL-]                CTRL-]と動作は似ているが、":tag" の代わりに ":tjump"
                        を用いる。{Vi にはない}

                                                        v_g_CTRL-]
{Visual}CTRL-]        "g CTRL-]" と同じ。ただし、選択されたテキストが検索に
                        使われる。
                                                        :tn :tnext
:[count]tn[ext][!]      適合するtagのうち、[count]番目のtagに移動する。(省略時
                        は1。)[!]に関してはtag-!を参照。{Vi にはない}

                                                        :tp :tprevious
:[count]tp[revious][!]  適合するtagのうち、[count]分だけ前のtagに移動する。(
                        省略時は1。)[!]に関してはtag-!を参照。{Vi にはない}

                                                        :tN :tNext
:[count]tN[ext][!]      ":tprevious" と同様。{Vi にはない}

                                                        :tr :trewind
:[count]tr[ewind][!]    適合したtagのうち最初のtagに移動する。もし[count]が与
                        えられていたら、[count]番目のtagに移動する。[!]につい
                        てはtag-!を参照。{Vi にはない}

                                                        :tf :tfirst
:[count]tf[irst][!]     ":trewind" と同じ。{Vi にはない}
                                                        :tl :tlast
:tl[ast][!]             適合したtagのうち最後のtagに移動する。[!]に関しては
                        tag-!を参照。{Vi にはない}

                                                        :lt :ltag
:lt[ag][!] [ident]      タグ[ident]にジャンプし、マッチするタグ全てをカレント
                        ウィンドウの新しいロケーションリストに追加する。
                        [ident]は正規表現でもよい(tag-regexpを参照)。[ident]
                        が指定されないときはタグスタックにある最後のタグ名が使
                        われる。タグにマッチする行を特定するための検索パターン
                        には、特別な文字を全てエスケープするために "\V" がつけ
                        られる(very nomagic)。マッチするタグを保持するロケー
                        ションリストはタグスタックとは独立している。[!]につい
                        てはtag-!を参照。{Vi にはない}

他にメッセージがないとき、Vimは今までに移動したtagとtagの数を表示する:
        tag 1 of 3 or more
" or more" は、Vimがまだすべてのtagファイルを検索していないことを示すために用
いられる。":tnext" を数回用いるか、":tlast" を使用したとき、さらにtagが見つけ
られるだろう。

他のメッセージがあったときや、現在の場所を知りたいときには次のコマンドで再び
表示することができる。(最後に行った移動と同じtagに移動する。):
        :0tn

                                                        tag-skip-file
マッチしたタグに対するファイルが見つからなかった場合、スキップされて次にマッチ
するタグが使われる。Vimはファイルがないことを通知する。もしリストの終端に達し
ていたならば、エラーメッセージが与えられる。

                                                        tag-preview
タグマッチリストはプレビューウィンドウ内でも使用できる。そのコマンドは上記のも
のに似ているが、先頭に "p" がつく。
{+quickfixが無効なときは利用できない}

                                                        :pts :ptselect
:pts[elect][!] [ident]  ":tselect[!] [ident]" を実行し、"Preview" ウィンドウに
                        新しいタグを表示する。詳細は:ptagを参照すること。
                        {Vi にはない}

                                                        :ptj :ptjump
:ptj[ump][!] [ident]    ":tjump[!] [ident]" を実行し、"Preview" ウィンドウに新
                        しいタグを表示する。詳細は:ptagを参照すること。
                        {Vi にはない}

                                                        :ptn :ptnext
:[count]ptn[ext][!]     プレビューウィンドウで ":tnext" を実行する。:ptag
                        参照すること。{Vi にはない}

                                                        :ptp :ptprevious
:[count]ptp[revious][!] プレビューウィンドウで ":tprevious" を実行する。
                        :ptagを参照すること。{Vi にはない}

                                                        :ptN :ptNext
:[count]ptN[ext][!]     ":ptprevious" と同じ。{Vi にはない}

                                                        :ptr :ptrewind
:[count]ptr[ewind][!]   プレビューウィンドウで ":trewind" を実行する。:ptag
                        を参照すること。{Vi にはない}

                                                        :ptf :ptfirst
:[count]ptf[irst][!]    ":ptrewind" と同じ。{Vi にはない}

                                                        :ptl :ptlast
:ptl[ast][!]            プレビューウィンドウで ":tlast" を実行する。:ptag
                        参照すること。{Vi にはない}

==============================================================================
4. タグの詳細                                           tag-details

                                                        static-tag
staticタグは特別なファイルのために定義されたタグである。Cプログラムではstatic
関数が当てはまる。

Viはタグにジャンプするときに現在の検索パターンを設定する。これはタグにジャンプ
したあとの "n" コマンドは、その前の検索パターンと同じ検索を行わないということ
である。Vimではこのようなバグとも考えられることはしない。検索履歴にある検索パ
ターンで検索できる。もし古いViの振る舞いを望むならば、'cpoptions' に 't' を設
定する。

                                                        tag-binary-search
Vimは希望のタグをすばやく見つけるために、タグファイル内で二分探索を行う
(+tag_binaryがコンパイル時に有効になっていれば)。しかしこれはタグファイルが
ASCIIコードでソートされている場合にのみ機能する。したがって、もし適合しないも
のが見つかった場合は、その他の方法として線形探索が行われる。もし線形探索のみを
利用したいならば、'tagbsearch' オプションをリセットすればよい。そうでなければ:
タグファイルをソートすること!

検索が明確な名前をもったタグでない場合は二分探索は利用できないことに注意するこ
と。これは大文字小文字を無視した検索や固定文字列で始まらない正規表現による検索
で発生する。そのときはタグ検索はかなり遅くなるだろう。先人はタグファイルを大文
字と小文字を区別せずにソートすることで回避できた。詳細は 'tagbsearch' を参照の
こと。

                                                        tag-regexp
":tag" と ":tselect" コマンドは引数に正規表現を受け付ける。使用できる特殊文字
についてはpatternを参照すること。引数が '/' で始まる場合はパターンとして使わ
れる。もし引数が '/' で始まらなければ、完全なタグ名の文字列として扱われる。
例:
    :tag main
        最も優先度の高い "main" というタグにジャンプする。
    :tag /^get
        最も優先度の高い "get" で始まるタグにジャンプする。
    :tag /norm
        "norm" を含むすべてのタグを列挙する。これは "id_norm" というタグも含ま
        れる。
もし引数と全く同じタグと、正規表現によってマッチしたタグがあった場合、引数と同
じタグが優先される。例えば、":tag /open" は "open_file" や "file_open" よりも
前に "open" にマッチする。
正規表現を使うときは大文字・小文字は区別されない。大文字・小文字を区別したいな
ら正規表現の中で "\C" を使うこと。

                                                        tag-!
もしタグが現在のファイル上にあるならば、いつも機能するだろう。そうでなければ、
実行結果は現在のファイルが変更されているか、コマンドに!がつけられているか、
'autowrite' オプションが設定されているかに依存する:

タグが現在の               autowrite            
 ファイル内   変更あり  !  オプション     動作  
-----------------------------------------------------------------------------
    yes          x      x     x   タグに行く
    no           no     x     x   対象ファイルを読み込み、タグに行く
    no          yes    yes    x   現在のファイルを捨て、対象ファイルを読み込ん
                                  でタグに行く
    no          yes     no    on  現在のファイルを保存し、対象ファイルを読み込
                                  んでタグに行く
    no          yes     no   off  失敗する
-----------------------------------------------------------------------------

- タグが現在のファイル上にある場合は、コマンドはいつも機能する。
- タグが他のファイル上にあり、現在のファイルが変更されていないならば、対象とな
  るファイルがバッファに読み込まれる。
- タグが他のファイル上にあり、現在のファイルが変更されていて、かつ!がコマンド
  につけられている場合には、現在のファイルに対する変更は失われ、対象となるファ
  イルがバッファに読み込まれる。
- タグが他のファイル上にあり、現在のファイルが変更されていて、かつ 'autowrite'
  オプションが設定されている場合には、現在のファイルは保存され、対象となるファ
  イルがバッファに読み込まれる。
- タグが他のファイル上にあり、現在のファイルが変更されていて、かつ 'autowrite'
  オプションが設定されていない場合には、コマンドは失敗する。変更を保存したいな
  らば ":w" コマンドを使用し、そのあとで ":tag" を引数なしで実行する。これはタ
  グがスタック上に残っているためにうまく機能する。変更を失ってもよいのならば、
  ":tag!" コマンドを使用できる。

                                                        tag-security
Vimはセキュリティの都合上、いくつかのコマンドを禁止していることに注意すること。
これはちょうど現在のディレクトリにあるexrc/vimrcファイルに 'secure' オプション
が使われているのと同じように機能する。trojan-horsesandboxを参照すること。
{tagaddress}がバッファを変更したとき、次のようなエラーメッセージが表示される:
        "WARNING: tag command changed a buffer!!!"
将来のバージョンではバッファを変更することは不可能になるだろう。これらはすべて
セキュリティの理由である: 誰かが気づかれないように実行される厄介なコマンドをタ
グファイルに隠しているかもしれない。例えば:
        :$d|/tag-function-name/
{Vi ではこのセキュリティ予防は提供されない}.

Viでは ":tag" コマンドによってタグを検索すると、最新の検索パターンを上書きする。
Vimでは 'cpoptions' に 't' フラグが設定されていなければ、前の検索パターンは引
き続き記憶される。検索パターンはいつも検索履歴にあるので、もし検索に失敗したら
そこを修正するとよい。

                                        emacs-tags emacs_tags E430
Emacsスタイルのタグファイルは、Vimのコンパイル時に+emacs_tags機能を有効にし
た場合にのみ使用できる。すまないが、Emacsタグファイルについての説明はここでは
しない。それは下位互換のためにのみ提供している :-)。

Emacs タグファイルの行は非常に長くなることがある。Vim は行の約510バイトまでし
か扱わない。行が無視されたかどうかは 'verbose' を5以上にしていればわかる。

                                                        tags-option
'tags' オプションはファイル名のリストで構成される。これらのファイルからタグが
検索される。デフォルトの "tags" ファイルよりも、異なるtagsファイルがよく使われ
るだろう。共通のtagsファイルにもよくアクセスするだろう。

以下のようなときは、リストの次のファイルを使わない:
- 現在のバッファに対するstaticタグが見つかった場合。
- globalタグが見つかった場合。
これは大文字小文字が無視されるかどうかにも依存します。大文字小文字は以下の場合
に無視されます:
'tagcase' が "followic" で 'ignorecase' が設定されている
'tagcase' が "ignore" である
'tagcase' が "smart" でパターンに小文字だけが含まれている
'tagcase' が "followscs" で 'smartcase' が設定されておりパターンに小文字のみ
  が含まれている
大文字小文字が無視されず、タグファイルが大文字小文字を除外したマッチのみとなる
場合、続くタグファイルは大文字小文字をマッチして検索されます。大文字小文字を
マッチしてタグファイルが見つからない場合、大文字小文字を除外してマッチした最初
の結果が使用されます。もし大文字小文字が無視されグローバルのタグでマッチした、
もしくは大文字小文字を除外してマッチした場合、タグファイルの検索は行われず見
付かったそのファイルが使用されます。

タグファイル名が "./" で始まるとき、'.' は現在のファイルのパスで置き換えられ
る。これにより、現在のファイルがあるディレクトリのtagsファイルを使用することが
できる(たとえ現在のディレクトリがどこであろうと)。"./" を使用する概念は、どの
タグファイルを最初に検索するかを決定することである: 現在のディレクトリにするか
("tags,./tags")、現在のファイルがあるディレクトリにするか("./tags,tags")であ
る。

例:
        :set tags=./tags,tags,/home/user/commontags

この例では、現在のファイルがあるディレクトリの "tags" ファイルがまず検索され
る。次に現在のディレクトリにある "tags" ファイルが検索される。もしまだ見つから
なければ、"/home/user/commontags" が検索される。

これは 'cpoptions' に 'd' フラグを含めることでVi互換のようにすることができる。
"./tags" は現在のファイルがあるディレクトリのtagsファイルではなく、現在のディ
レクトリのtagsファイルを意味するようになる。

コンマの代わりにスペースを使用してもよい。文字列オプションに含めるためにはスペー
スの前にバックスラッシュが必要となる:
        :set tags=tags\ /home/user/commontags

ファイル名にスペースを含めるにはバックスラッシュを3つ並べる。コンマをファイル
名に使用する場合にはバックスラッシュを2つ並べる。例えば:
        :set tags=tag\\\ file,/home/user/common\\,tags

"tag file" と "/home/user/common,tags" というファイルが指定できる。'tags' オプ
ションは "tag\ file,/home/user/common\,tags" という値を持つだろう。

'tagrelative' オプションをオンにし(デフォルト)、他のディレクトリでタグファイル
を使用すると、タグファイル内に記述されたファイル名はタグファイルがあるディレク
トリを基準として相対パスになる。

==============================================================================
5. タグファイルの書式                           tags-file-format E431

                                                ctags jtags
tagsファイルは "ctags" のような外部コマンドによって生成される。それはそれぞれ
の関数へのタグを含んでいる。"ctags" のあるバージョンでは "#defined" マクロや
typedef、enumなどに対してもタグを作ることができる。

tagsファイルを生成するプログラム:
ctags                   ほとんどのUnixシステムにある。C言語のみ対応し、基本的な
                        機能を提供する。
                                                        Exuberant_ctags
exuberant ctags         これはとてもよいものだ。C言語、C++、Java、Fortran、
                        Eiffel、そしてその他に対応している。多くの項目にタグを
                        生成することができる。
                        http://ctags.sourceforge.net を参照。
etags                   Emacsに連携する。多言語に対応している。
JTags                   Java 用、Java で書かれている。
                        http://www.fleiner.com/jtags/で入手できる。
ptags.py                Python 用、Python で書かれている。
                        PythonのソースディレクトリTools/scripts/ptags.pyにある。
ptags                   Perl 用、Perl で書かれている。これはここで見つかる。
                        http://www.eleves.ens.fr:8080/home/nthiery/Tags/
gnatxref                Ada用。http://www.gnuada.org/ を参照。
                        gnatxrefはgnatパッケージの一部である。

tagsファイルは次の3つの形式のどれかで構成されなければならない:

1.  {tagname}           {TAB} {tagfile} {TAB} {tagaddress}
2.  {tagfile}:{tagname} {TAB} {tagfile} {TAB} {tagaddress}
3.  {tagname}           {TAB} {tagfile} {TAB} {tagaddress} {term} {field} ..

最初の形式は通常のタグで、Viで完全に互換性がある。伝統的なctagsによってのみ作
られる形式である。これはしばしばグローバルな関数や他のファイルを参照する場合に
使用される。

タグファイルの行は<LF>または<CR><LF>で終わる。Macintoshでは<CR>も機能する。
<CR><NL>は行内に決して現れない。

                                                        tag-old-static
2番目の形式はstaticタグにのみ使用できる。現在では廃れており、3番目の形式に置
き換えられている。これはElvis 1.xとVim、それといくつかのバージョンのctagsによっ
てのみサポートされている。staticタグはローカル関数によく用いられ、{tagfile}
のみ参照する。staticタグでは2つの{tagfile}は正確に一致していなければならない
ことに注意すること。staticタグがどのように使われるかについてはtags-option
参照すること。

3番目の形式は新しい。各行の末尾にある任意的なフィールドに追加の情報を含む。こ
れは以前のViとも互換性がある。新しいバージョンのctagsにのみサポートされている
(Exuberant ctagsとか)。

{tagname}       識別子。普通は関数名であるが、どんな識別子でも構わない。<Tab>
                を含めることはできない。
{TAB}           1文字の<Tab>。 Note: 以前のバージョンではここでどんな空白文字
                も許可していた。これは{tagfile}内にスペースを使うことを断念し
                たためである。コンパイル時に+tag_any_white機能を付加すれば再
                び使えるようになる。 tag-any-white
{tagfile}       {tagname}の定義を含むファイル名。絶対パスでも相対パスでも構わ
                ない。環境変数やワイルドカードを含んでもよい(ワイルドカードの
                使用方法はあいまいだが)。<Tab>を含むことはできない。
{tagaddress}    カーソルをタグ上に移動するExコマンド。制限(tag-securityを参
                照)はあるが、どんなExコマンドでも使用可能である。
                Posixでは主に使われる行番号と検索コマンドのみ許可する。
{term}          ;" セミコロンとダブルクォートの2文字。これはViによってコメント
                とみなされ、続く文字列は無視される。以前のViとの互換性を保つた
                めにある。これは続くフィールドを無視する。
{field} ..      任意のフィールドのリスト。各フィールドは次の書式を持つ:

                        <Tab>{fieldname}:{value}

                {fieldname}はフィールドの識別子であり、アルファベットのみ使用
                可能である[a-zA-Z]。
                {value}は任意の文字列であるが、<Tab>は使用できない。
                以下の特殊文字が使用できる:
                        "\t" は<Tab>を表す
                        "\r" は<CR>を表す
                        "\n" は<NL>を表す
                        "\\" は\を表す

                ':' を持たないフィールドがある。これはタグの一種である。
                "kind:" を先頭につけたものとして扱われる。
                kindsについては、それを提供するctagsのドキュメントを参照。

                現在Vimが認識できるその他のフィールドは "file:" (値はなし)だけ
                である。これはstaticタグに使われる。

tagsファイルの先頭行には、
        !_TAG_
で始まる行を含めることができる。
これらは極稀な "!" で始まるタグを除けば先頭行にソートされる。Vimは2つのタグを
認識する。1つはファイルがソートされているかどうかを示す行で、この行が見つかっ
た場合には、Vimはtagsファイルに対して二分探索を使用する:
        !_TAG_FILE_SORTED<TAB>1<TAB>{anything}

大文字小文字を無視する設定の時、線形探索を避けるためにタグファイルは大文字小文
字を区別せずにソートされることがある。 ('ignorecase' がセットされかつ
'tagcase' が "followic" の時、または 'tagcase' が "ignore" の時に大文字小文字は
無視される。) 詳細は 'tagbsearch' を参照のこと。
その時、値として '2' が使われる:
        !_TAG_FILE_SORTED<TAB>2<TAB>{anything}

Vimが認識するもう1つのタグはタグファイルのエンコーディングを指定するものであ
る。これは+multi_byteが有効なときだけ利用できる:
        !_TAG_FILE_ENCODING<Tab>utf-8<Tab>{anything}
ここで "utf-8" はタグのエンコーディングである。Vimはタグを検索するときに検索す
るタグを 'encoding' からタグファイルのエンコーディングに変換する。そして、タグ
をリストするときに元に戻す。変換が失敗したときは元のままのタグが使われる。

                                                        tag-search
コマンドはどんなExコマンドでも使用可能であるが、検索コマンドがよく使われるであ
ろう。
例:
        tag1    file1   /^main(argc, argv)/
        tag2    file2   108

コマンドは常に 'magic' がセットされない状態で実行される。検索パターンで使用で
きる特殊文字は "^" (行頭) と "$" (<EOL>) だけである。patternを参照すること。
検索文字列中のバックスラッシュの前にはバックスラッシュをつけなければならないこ
とに注意すること。これは以前のViと互換性がある。

                                                        E434 E435
もしコマンドが普通の検索コマンド ("/" か "?" で始まり、終わる) であるならば、
いくつかの特別な扱いをされる:
- 検索はファイルの1行目から開始する。
  検索方向は "/" で前方、"?" で後方となる。
  'wrapscan' は問題にならず、いつもファイル全体を検索することに注意。(Vi は
  'wrapscan' を使用するため、それが原因でタグが見つからないこともある。) {Vi は
  別のファイルの2行目から検索を開始する。'wrapscan' を設定しないときには、別
  のファイルの1行目にあるタグは見つけられない}
- 検索が失敗した場合は、大文字小文字を無視してもう一度検索する。それも失敗した
  場合には次の検索が行われる:
        "^tagname[ \t]*("
  (タグの先頭に '^'、末尾に "[ \t]*(" が追加される)。関数名の検索の場合には、
  これはカラム0の位置にある関数名を見つけるだろう。関数の引数がtagsファイルを
  作成したときから変更になったときなどに役立つだろう。この検索でも見つからない
  場合にはさらに次の検索が行われる:
        "^[#a-zA-Z_].*\<tagname[ \t]*("
  この意味は: '#' もしくは識別子で始まり、空白文字と '(' が続くタグを含む行で
  ある。これは型が先頭にあるマクロ名や関数名を見つけるだろう。{Vi には拡張検索
  はない}

==============================================================================
6. インクルードファイルの検索           include-search definition-search
                                                        E387 E388 E389

これらのコマンドは対象となる文字列を現在のファイルと、遭遇するすべてのインクルー
ドファイルを再帰的に探す。これは変数や関数、マクロの定義を探すのに利用できる。
現在のバッファに対してだけ検索をしたいのならば、pattern-searchesに列挙されて
いるコマンドを使うとよい。

これらのコマンドは、コンパイル時に+find_in_path機能を使用不可にした場合には
利用できない。

他のファイルをインクルードする行に遭遇すると、現在のバッファを続けて検索する前
にインクルードファイルを検索する。インクルードファイルによってインクルードされ
るファイルも同様に検索される。インクルードファイルが見つからなかった場合は黙っ
て無視する。見つからなかったファイルを知りたいときは:checkpathコマンドを使う。
たぶん 'path' オプションが正しく設定されていないのだろう。Note: インクルード
ファイルはファイルが検索され、そのファイルを編集中のバッファが存在しても対象に
ならない。バッファにある行は、現在のファイルにのみ適用される。

検索文字列は任意のキーワードや定義されたマクロが指定できる。キーワードの場合は
マッチするものを見つける。定義されたマクロの場合は 'define' オプションにマッチ
する行だけが見つけられる。デフォルトはCプログラム用の "^#\s*define" である。他
の言語の場合はおそらく変更したいだろう。C++用の例は 'define' を参照。その文字
列に改行を含めることはできない。一行内にマッチするものだけが見つかる。

定義されたマクロが見つかった場合、行末がバックスラッシュのときは次の行も表示す
る。

"[" で始まるコマンドは現在のファイルの先頭から検索を開始する。"]" で始まるコマ
ンドは現在のカーソル位置から検索を開始する。

'include' オプションは他のファイルをインクルードする行を定義する。デフォルトは
Cプログラム用の "\^#\s*include" である。Note: VimはCの構文を認識しない。もし
'include' オプションにマッチする行が "#ifdef/#endif" の間やコメント行であって
も、とにかく検索される。'isfname' オプションはマッチパターンに続くファイル名を
認識するために使用される。

'path' オプションは絶対パスを持たないインクルードファイルを探すためのディレク
トリを指定する。

'comments' オプションは単一行を表示するコマンド、もしくは行にジャンプするコマ
ンドで使用される。これはコメントの開始パターンを定義する。それらの行は [!] を
使用しない限り検索において無視される。ひとつの例外: 行が "^# *define" というパ
ターンにマッチしたとき、コメントであるとはみなされない。

もしマッチしたリストを表示して、その中からジャンプ先を選択したいならば、マッピ
ングが利用できる。例:

  :map <F4> [I:let nr = input("Which one: ")<Bar>exe "normal " . nr ."[\t"<CR>

                                                        [i
[i                      カーソルの下にあるキーワードを含む1行を表示する。検索
                        はファイルの先頭から開始する。コメントとみなせる行は無
                        視される('comments' オプションを参照すること)。数字が
                        与えられた場合は、先頭から指定した個数目にマッチした行
                        を表示する。この場合はコメント行は無視されない。
                        {Vi にはない}

                                                        ]i
]i                      "[i" と同様だが、検索が現在のカーソル位置から開始され
                        る。{Vi にはない}

                                                        :is :isearch
:[range]is[earch][!] [count] [/]pattern[/]
                        "[i" や "]i" と同様だが、[range]で指定された範囲から検
                        索する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}

                                                        [I
[I                      カーソルの下にあるキーワードを含む行をすべて表示する。
                        結果にはファイル名と行番号が表示される。検索はファイル
                        の先頭から開始される。{Vi にはない}

                                                        ]I
]I                      "[I" と同様だが、検索が現在のカーソル位置から開始され
                        る。{Vi にはない}

                                                        :il :ilist
:[range]il[ist][!] [/]pattern[/]
                        "[I" や "]I" と同様だが、[range]で指定された範囲から検
                        索する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}

                                                        [_CTRL-I
CTRL-I                カーソルの下にあるキーワードを含む最初の1行にジャンプ
                        する。検索はファイルの先頭から開始する。コメントとみな
                        せる行は無視される ('comments' オプションを参照するこ
                        と)。数字が与えられた場合は、先頭から指定した個数目に
                        マッチした行にジャンプする。この場合はコメント行は無視
                        されない。{Vi にはない}

                                                        ]_CTRL-I
CTRL-I                "[ CTRL-I" と同様だが、検索が現在のカーソル位置から開
                        始される。{Vi にはない}

                                                        :ij :ijump
:[range]ij[ump][!] [count] [/]pattern[/]
                        "[ CTRL-I" や "] CTRL-I" と同様だが、[range]で指定され
                        た範囲から検索する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}

CTRL-W CTRL-I                                   CTRL-W_CTRL-I CTRL-W_i
CTRL-W i                新しいウィンドウを開き、カーソルの下にあったキーワード
                        を含む最初の1行に移動する。検索はファイルの先頭から開
                        始する。コメントとみなせる行は無視される('comments' オ
                        プションを参照すること)。数字が与えられた場合は、先頭
                        から指定した個数目にマッチした行にジャンプする。この場
                        合はコメント行は無視されない。{Vi にはない}

                                                        :isp :isplit
:[range]isp[lit][!] [count] [/]pattern[/]
                        "CTRL-W i" や "CTRL-W i" と同様だが、[range]で指定され
                        た範囲から検索する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}

                                                        [d
[d                      カーソルの下にあるマクロを含む最初のマクロ定義を表示す
                        る。検索はファイルの先頭から開始する。数字が与えられた
                        場合は、先頭から指定した個数目にマッチした行を表示する。
                        {Vi にはない}

                                                        ]d
]d                      "[d" と同様だが、検索が現在のカーソル位置から開始され
                        る。{Vi にはない}

                                                        :ds :dsearch
:[range]ds[earch][!] [count] [/]string[/]
                        "[d" や "]d" と同様だが、[range]で指定された範囲から検
                        索する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}

                                                        [D
[D                      カーソルの下にあるマクロを含むすべてのマクロ定義を表示
                        する。結果にはファイル名と行番号が表示される。検索はファ
                        イルの先頭から開始される。{Vi にはない}

                                                        ]D
]D                      "[D" と同様だが、検索が現在のカーソル位置から開始され
                        る。{Vi にはない}

                                                        :dli :dlist
:[range]dli[st][!] [/]string[/]
                        [D や ]D と同様だが、[range]で指定された範囲から検
                        索する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}
                        Note:dl は :dlist ではなく、:delete に "l" レ
                        ジスタを指定したものとして機能する。

                                                        [_CTRL-D
CTRL-D                カーソルの下にあるキーワードを含む最初のマクロ定義にジャ
                        ンプする。検索はファイルの先頭から開始する。数字が与え
                        られた場合は、先頭から指定した個数目にマッチした行にジャ
                        ンプする。 {Vi にはない}

                                                        ]_CTRL-D
CTRL-D                "[ CTRL-D" と同様だが、検索が現在のカーソル位置から開
                        始される。{Vi にはない}

                                                        :dj :djump
:[range]dj[ump][!] [count] [/]string[/]
                        "[ CTRL-D" や "] CTRL-D" と同様だが、[range]で指定され
                        た範囲から検索する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}

CTRL-W CTRL-D                                   CTRL-W_CTRL-D CTRL-W_d
CTRL-W d                新しいウィンドウを開き、カーソルの下にあったキーワード
                        を含む最初のマクロ定義に移動する。検索はファイルの先頭
                        から開始する。数字が与えられた場合は、先頭から指定した
                        個数目にマッチした行にジャンプする。 {Vi にはない}

                                                        :dsp :dsplit
:[range]dsp[lit][!] [count] [/]string[/]
                        "CTRL-W d" と同様だが、[range]で指定された範囲から検索
                        する(デフォルト: ファイル全体)。
                        [/]と[!]については:search-argsを参照。{Vi にはない}

                                                        :che :checkpath
:che[ckpath]            ファイルが見つからないすべてのインクルードファイル名を
                        リスト表示する。
                        {Vi にはない}

:che[ckpath]!           すべてのインクルードファイル名をリスト表示する。
                        {Vi にはない}

                                                                :search-args
上記コマンドに共通の引数:
[!]     使用した場合は、コメントとみなせる行に対しても検索をする。使用しな
        かった場合は 'comments' によってコメントとみなされる行やCコメント
        ("//" の後ろか /* */ の間)にあるものは無視される。コメントとみなされた
        行が、途中からコメントでなくなるようなときは見逃すかもしれないことに注
        意。
        また、コメント行であっても、('comments' によって)認識されないでとにか
        くマッチするかもしれない。例:
                /* comment
                   foobar */
        "foobar" に対する検索はマッチする。これは行がコメントとして認識されな
        いためである(たとえ構文強調表示が認識したとしても)。
        Note: マクロ定義はたいていコメントと誤認されることはないので、
        ":dlist"や ":dsearch"、":djump" に[!]を使用することは大差がない。
[/]     パターンは '/' で囲むことができる。'/' なしの場合、"\<pattern\>" とい
        うパターンを使うことによって、完全な語だけがマッチする。2つ目の '/' の
        後にだけ、'|' を使うことによって次のコマンドを追加できる。例:
        :isearch /string/ | echo "the last one"
        ":djump", ":dsplit", ":dlist", ":dsearch" コマンドではパターンは検索パ
        ターンとしてではなく文字通りに使われる。

 vim:tw=78:ts=8:ft=help:norl: