vim-users.jp

Hack #154: タグジャンプをさらに活用する

Posted at 2010/06/13
このエントリーをはてなブックマークに追加

タグジャンプをさらに活用する

Hack #43ではタグについての基本的な使用方法をまとめました。 本稿ではさらに踏み込んだタグジャンプの活用法をまとめます。

親ディレクトリにあるタグファイルを指定

もし自分が/project/a/src/というディレクトリにいた場合に、できれば/project/a/tagsや、 または全てのプロジェクト用のタグファイル(ライブラリの関数など)もタグジャンプに使いたいとします。

/project/a/src/ (現在のディレクトリ)
/project/a/tags (指定したいタグファイル)
/project/tags   (指定したいライブラリ関数のタグファイル)

その場合、.vimrcには以下のように書くことで可能になります。

if has('path_extra')
    set tags+=tags;
endif

こうすることで、もしタグファイルが存在するなら /project/a/tags/project/tagsにある関数も<C-]>で飛ぶことが可能になります。 また;+path_extra機能がサポートされていない場合では使えないため、 has('path_extra')で機能の有無をチェックしています。

階層数を指定

ただ;をつけただけではルートディレクトリまでさかのぼってしまいます。 そこで;の後に上限となる親ディレクトリを指定することができます。

if has('path_extra')
    set tags+=tags;/project/a
endif

こうすることで/project/aまでで検索を終了し、/project/tagsは見つかりません。

子ディレクトリにあるタグファイルを指定

前項では親ディレクトリのtagsを指定しましたが、 今度はある特定のディレクトリにあるタグファイルを 現在のディレクトリから指定したい場合はどうすればいいでしょう。

/project/a/src/          (現在のディレクトリ)
/project/a/src/libA/tags (指定したいタグファイル)
/project/a/src/libB/tags (指定したいタグファイル2)

その場合、以下を.vimrcに書けばいいでしょう。

if has('path_extra')
    set tags+=./*/tags;
endif

また、/project/a/src/libA/tagsなどの1階層下のディレクトリにあるタグファイルだけではなく /project/a/src/libA/src/tagsなどの何階層か下のタグファイルを指定するには以下のようにできます。

if has('path_extra')
    set tags+=./**/tags;
endif

階層数を指定

ただ**は30階層までの深さのディレクトリにマッチするということになっています。 なので場合によっては非常に重くなるかもしれません。 その場合は階層の深さの最大値を次のように指定することができます。 (この例では3階層下のディレクトリまでマッチするように設定しています)

if has('path_extra')
    set tags+=./**3/tags;
endif

親ディレクトリから**を使う

これは前項と前々項の合わせ技です。 現在のディレクトリが/project/a/srcの時に

set tags=**;

とすると、

/project/tags
/project/a/tags
/project/a/libA/src/tags
/project/a/libB/src/tags
/project/b/tags
/project/c/tags

これら全てが指定されることになります。 つまり**;とは、現在のディレクトリが/project/a/srcの時には

/project/a/src/**
/project/a/**
/project/**
/**

という場合に展開され、それぞれの場所から検索されます。 またこの指定は上記全ての場所から検索されるので重い処理となります。

その他色々

  1. この設定はHack #112: 場所ごとに設定を用意すると組み合わせると非常に相性がいいです。ぜひ合わせて使いましょう。また必ず:setでなく:setlocalを使いましょう。
  2. これらの指定方法は’path’, ‘cdpath’などでも使うことができます。
  3. 詳しくは:help file-searchingを当たってください。
tyru

もどる
blog comments powered by Disqus