*tagsrch.txt* For
Vim バージョン 7.3. Last change: 2011 Oct 28
VIM REFERENCE MANUAL by Bram Moolenaar
Tags and special searches
*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}"を使ったときに変化する。
'ignorecase'オプションがオフになっているときの":tag"コマンドでは、大文字、小文
字を区別しないマッチは見つからない。
'ignorecase'がオフになっていても、("/"で
始まる)パターンを使用し、かつ":tselect"を使ったときには見つけることができる。
大文字、小文字を区別しないタグ検索を使うと、tagsファイル内で2分探索ができなく
なるため処理が遅くなる、ということに注意すること。これはタグファイルを大文字と
小文字を区別せずにソートすることで回避できます。
'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 にはない}
出力例:
"pri"については
|tag-priority|を参照。この例は現在のファ
イルに依存しているため、":tselect xxx"を使ったときには
違う結果が得られることに注意すること。
"kind"はタグファイルからタグの種類が得られる場合のみ、
その情報を示す。
"info"はタグファイルから得られる情報が表示される。この
情報はタグファイルを生成したプログラムに依存する。
リストが長い場合には
|more-prompt|が表示される。もしす
でに使いたいタグを見つけているのなら、'q'のあとに"nr"
の番号を入力すればよい。
*:sts* *:stselect*
:sts[elect][!]
[ident] ":stselect[!]
[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-]*
g
CTRL-] CTRL-]と動作は似ているが、":tag"の変わりに":tjump"を用
いる。(Viでは使えない。)
*v_g_CTRL-]*
{Visual}g
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の数を表示する:
" or more"は、Vimがまだすべてのtagファイルを検索していないことを示すために用い
られる。":tnext"を数回用いるか、":tlast"を使用したとき、さらにtagが見つけられ
るだろう。
他のメッセージがあったときや、現在の場所を知りたいときには次のコマンドで再び
表示することができる。(最後に行なった移動と同じtagに移動する。):
*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|を参照すること。引数が'/'で始まる場合はパターンとして使われる。
もし引数が'/'で始まらなければ、完全なタグ名の文字列として扱われる。
例:
最も優先度の高い"main"というタグにジャンプする。
最も優先度の高い"get"で始まるタグにジャンプする。
"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-horse|と
|sandbox|を参照すること。
{tagaddress}がバッファを変更したとき、次のようなエラーメッセージが表示される:
"WARNING: tag command changed a buffer!!!"
将来のバージョンではバッファを変更することは不可能になるだろう。これらはすべて
セキュリティの理由である: 誰かが気付かれないように実行される厄介なコマンドをタ
グファイルに隠しているかもしれない。例えば:
{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タグが見つかった場合。
これらは
'ignorecase'オプションに依存する。もしオフにしてあり、tagsファイルに大
文字小文字が一致するタグがない場合、一致するタグを次のtagsファイルで検索する。
もし一致するタグが見つからなければ、大文字小文字を無視して最初にマッチしたもの
が使われる。もし
'ignorecase'がオンの場合、大文字小文字の区別なく、globalタグが
見つかった時点でそのタグが使用され、それ以降のtagsファイルは検索されない。
タグファイル名が"./"で始まるとき、'.'は現在のファイルのパスで置き換えられる。
これにより、現在のファイルがあるディレクトリのtagsファイルを使用することができ
る(たとえ現在のディレクトリがどこであろうと)。"./"を使用する概念は、どのタグ
ファイルを最初に検索するかを決定することである: 現在のディレクトリにするか
("tags,./tags")、現在のファイルがあるディレクトリにするか("./tags,tags")であ
る。
例:
この例では、現在のファイルがあるディレクトリの"tags"ファイルがまず検索される。
次に現在のディレクトリにある"tags"ファイルが検索される。もしまだ見つからなけれ
ば、"/home/user/commontags"が検索される。
これは
'cpoptions'に'd'フラグを含めることでVi互換のようにすることができる。
"./tags"は現在のファイルがあるディレクトリのtagsファイルではなく、現在のディレ
クトリのtagsファイルを意味するようになる。
カンマの変わりにスペースを使用してもよい。文字列オプションに含めるためにはスペー
スの前にバックスラッシュが必要となる:
ファイル名にスペースを含めるにはバックスラッシュを3つ並べる。カンマをファイル
名に使用する場合にはバックスラッシュを2つ並べる。例えば:
"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 For Java, in Java.
http://www.fleiner.com/jtags/で入手できる。
ptags.py For Python, in 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>。 注: 以前のバージョンではここでどんな空白文字も
許可していた。これは
{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'がonのときに線形検索を避けるために、大文字と小文字を区別せずにタグ
ファイルがソートされたかもしれません。。詳細は
'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'オプションが正しく設定されていないのだろう。注: インクルードファイ
ルはファイルが検索され、そのファイルを編集中のバッファが存在しても対象にならな
い。バッファにある行は、現在のファイルにのみ適用される。
検索文字列は任意のキーワードや定義されたマクロが指定できる。キーワードの場合は
マッチするものを見つける。定義されたマクロの場合は
'define'オプションにマッチす
る行だけが見つけられる。デフォルトはCプログラム用の"^#\s*define"である。他の言
語の場合はおそらく変更したいだろう。C++用の例は
'define'を参照。その文字列に改
行を含めることはできません。一行内にマッチするものだけが見つかります。
定義されたマクロが見つかった場合、行末がバックスラッシュのときは次の行も表示す
る。
"["で始まるコマンドは現在のファイルの先頭から検索を開始する。"]"で始まるコマン
ドは現在のカーソル位置から検索を開始する。
'include'オプションは他のファイルをインクルードする行を定義する。デフォルトはC
プログラム用の"\^#\s*include"である。注: VimはCの構文を認識しない。もし
'include'オプションにマッチする行が"#ifdef/#endif"の間やコメント行であっても、
とにかく検索される。
'isfname'オプションはマッチパターンに続くファイル名を認識
するために使用される。
'path'オプションは絶対パスを持たないインクルードファイルを探すためのディレクト
リを指定する。
'comments'オプションは単一行を表示するコマンド、もしくは行にジャンプするコマン
ドで使用される。これはコメントの開始パターンを定義する。それらの行は[!]を使用
しない限り検索において無視される。ひとつの例外: 行が"^# *define"というパターン
にマッチしたとき、コメントであるとはみなされない。
もしマッチしたリストを表示して、その中からジャンプ先を選択したいならば、マッピ
ングが利用できる。例:
*[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" は ":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'によって)認識されないでとにかくマッチするかもしれ
ない。例:
"foobar"に対する検索はマッチする。これは行がコメントとして認識されないた
めである(たとえ構文強調表示が認識したとしても)。
注: マクロ定義はたいていコメントと誤認されることはないので、":dlist"や
":dsearch"、":djump"に[!]を使用することは大差がない。
[/] パターンは'/'で囲むことができる。'/'なしの場合、"\<pattern\>"というパ
ターンを使うことによって、完全な語だけがマッチする。2つ目の'/'の後にだ
け、'|'を使うことによって次のコマンドを追加できる。例:
":djump", ":dsplit", ":dlist", ":dsearch"コマンドではパターンは検索パ
ターンとしてではなく文字通りに使われる。
vim:tw=78:ts=8:ft=help:norl: