タグ

タグジャンプの話です。vimのヘルプは:h tagsrchです。

タグを用いると、あらかじめ設定された位置にジャンプすることができます。 例えば、Cの関数とかマクロとかの定義の位置に飛びます。 同じ名前の関数やマクロが定義してあるときは少々使い勝手が悪いです。 そのため、Vimのタグジャンプの機能はCのソースに最適です。 CでもVimのソースみたいに同名の関数が複数定義してあることはありますが。

タグファイル

タグファイルを作成するプログラムはいろいろありますが、 exuberant ctagsをお勧めします。 これはさまざまな言語に対応していて、Vim Scriptにも対応しています。 コマンド名はctagsです。 ctagsに-Rオプションを付けて起動すると、再帰的に全てのファイルのタグを作ってくれます。 普通にタグを作成するのであれば、これでOKです。 ただ、Vimのソースのように同じ名前の関数が複数のファイルで定義されていることがあります。 そのような場合はタグを作りたくないファイルを削除するか、 タグを作りたいファイルのみを引数に渡すことで快適にジャンプできます。 どのタグファイルを読み込むかはtagsオプションで決定します。 tagsオプションはコンマで区切って複数のファイルを指定できます。 指定されたファイル名が "./" で始まっていたときは、"."が現在のファイルのあるパスに置き換えられます。

タグスタック

タグジャンプをすると、Vimはどこからどこへジャンプしたのかを 覚えておいてくれます。 これがタグスタックです。Ctrl-Tを押すと、前にタグジャンプした場所へ戻ります。 回数指定もできます。 :helpコマンドもタグジャンプなので、Ctrl-Tで前の位置に戻ることができます。 また、ヘルプファイル中でタグジャンプをすると、そのヘルプに飛ぶことができます。 このとき、タグファイルは$VIMRUNTIME/doc/tagsが用いられます。

タグジャンプ

ノーマルモードでCtrl-]を押すとカーソル下の識別子のタグにジャンプします。 もっともよく使用すると思います。あまり使うことはないかもしれませんが、 VisualモードでCtrl-]を押すと現在選択している文字列のタグにジャンプします。 コロンコマンドを用いてタグジャンプすることもできます。

:ta[g][!] {ident}

identはジャンプする識別子です。これは/で始めると正規表現として扱われます。 この正規表現が複数マッチした場合は最初のタグに飛びます。 識別子の入力の途中でTABを使って補完することもできます。 !があるのと無いのとでは、タグが現在のファイルに無い場合に動作が変わります。 !を付けると変更内容が失われることがあるので、基本的にはつけないほうがいいでしょう。 詳しくは!を指定したタグジャンプコマンド

複数のタグの候補

タグジャンプするときに複数の候補があったら、優先順位によってどこに飛ぶか決定します。 優先順位は次の通りです。

  1. 現在のファイルのstatic変数や関数のタグ
  2. 現在のファイルのglobal変数や関数のタグ
  3. 他のファイルのglobal変数や関数のタグ
  4. 他のファイルのstatic変数や関数のタグ

普通は大文字小文字を区別しますが、それでみつからなければ大文字小文字を無視して検索します。 その場合、「タグを異なるcaseで使用します!」といったメッセージが表示されます。

複数候補のタグにジャンプ

複数のタグの候補があった場合は最初のタグにジャンプしますが、他のタグにジャンプすることもできます。

:ts[elect][!] [ident]

タグジャンプする候補をずらずら表示させて、どの番号に飛ぶかを数字で入力します。 識別子を指定した場合は、その識別子のタグを表示します。 省略した場合は最後にタグジャンプした識別子を表示します。 !については:tagと同じです。 他にも複数候補のタグにジャンプするコマンドがあります。

g]

CTRL-]とほぼ同じですが、 :tagではなく:tselectを使います。 このコマンドはビジュアルモードでも、 CTRL-]と同じように使用できます。

:sts[elect][!] [ident]

:tselectと同じですが、ウィンドウを分割してタグジャンプします。

:tj[ump][!] [ident] :stj[ump][!] [ident]

:tselectは候補のタグが1つでもどれに飛ぶか尋ねて来ますが、 :tjumpを使うと1つのときは直接ジャンプします。 :tsjumpはウィンドウを分割します。

:[count]tn[ext][!]

次の候補にジャンプします。

:[count]tp[revious][!] :[count]tN[ext][!]

前の候補にジャンプします。

:[count]tr[ewind][!] :[count]ft[irst][!]

最初の候補にジャンプします。 回数を指定した場合は、最初からcount番目に飛びます。

:ts[ast][!]

最後のタグにジャンプします。 回数は指定できないみたいです。

プレビューウィンドウを用いる

複数候補のタグにジャンプするとき、プレビューウィンドウを使うこともできます。 これは複数候補のタグにジャンプするコマンドの頭にpをつけるといいので、 ひとつひとつのコマンドの説明は省略します。

!を指定したタグジャンプコマンド

タグジャンプは関数等が定義してあるところへ飛ぶので、 他のファイルへ飛ぶこともあります。 そのとき、現在のファイルが今まで編集していたぶんを保存していないことがありますが、 !の有無で動作が変わります。

!の有無autowrite動作
有り-変更を破棄してジャンプ
無しオン変更を保存してジャンプ
無しオフ失敗

タグが現在のファイルにあるときは、ファイルが変更されていてもいなくても普通にジャンプできます。 ファイルが変更されていないときは、タグの位置に関係なくジャンプできます。 autowriteオプションがオンになっていたら、変更を自動的に保存します。 !を付けてコマンドを起動した場合、変更が破棄されてしまいます。何気に!付けると危険です。 hiddenオプションをオンにしておくと、 そんなことを気にせずにタグジャンプできるので便利です。