2013-12-19

Vim中級者を脱する path編

はい、pathとは:set pathで出てくるやつのことです。 実際にはみなさんgfやファイル補完などでお世話になっていると思います。

今回はpathとは何かを説明して、.rbファイルのクラスからGemの定義元へ飛ぶ方法をやってみましょう。

方法だけ知りたい人は、一番下までスクロールしてください

pathとは?

Vimにおけるpathとは、set path?で出てくるpathです。

適当にファイルを開いてコマンドを打ってみましょう。

:set path?
path=.,/usr/include

これを設定しておくことで何が嬉しいかというと、編集中の変数の定義元へ飛べたり、ファイルを検索出来たりします。つまるところ、Vimが何かを探すときの基準になるディレクトリ達を指定することができます。

補完プラグインや、Vimの基本機能などもpathに依存していることが多いため、裏側では結構活躍している設定でもあります。

gfでGemの定義元に飛ぶ

gfは通常、カーソル

Rubyを編集する際、Vimのビルトインのftplugin/ruby.vimが読み込まれ、gfが自動的に関数にマッピングされます。

:set filetype=ruby
:nmap gf
n  gf          *@:<C-U>exe <SNR>121_gf(v:count1,"gf",'edit')<CR>

このおかげで、通常のgfが拡張されて幾つかのケースでgfが使えるようになります。(Rails.vimも同じ手法を使っていますね。)

具体的にはrequire 'path/to/file'やload, autoloadで書いたファイルパスへ飛ぶことができます。

内部では拡張子を取り除いたり、ファイル名に不要な文字を変換したりしていますが、そのオプションについては、今回は割愛します。

pathにRubyのload_pathを追加する

Rubyを編集中に、Gemの定義元へ移動する話をしましょう。

まずRubyについて理解しておく必要があるのは、load_pathの仕組みです。Rubyはrequireなどを使用したときに、指定されたファイルを$LOAD_PATHのディレクトリ一覧の中から探します。

下記のようなコマンドを打つことで、デフォルトの$LOAD_PATHを探すことができます。

ruby -e 'puts $LOAD_PATH'

Gemfileを定義した場合、この$LOAD_PATHにそれらのGemの場所が追加されるのでrequireで使うことがきるようになるんですね。

それでは、VimにもGemfileから取ってきたディレクトリ一覧を与えてやることで、定義元を探し出せるようにしましょう。

Gemfileからディレクトリ一覧を取り出す

bundle show --pathsを使うことで、一覧情報を取り出せます。

$ bundle show --paths
/Users/alpaca-tc/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/RedCloth-4.2.9
/Users/alpaca-tc/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/bundler-1.3.5
/Users/alpaca-tc/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/chunky_png-1.2.5
...

この情報をsetl path=...と与えてやれば、gfを使って定義元に飛べるようになります。

set path=を使って定義する

こちらのスクリプトをvimrcに貼付けましょう。vital.vim依存です(unite.vim, neocompleteがあれば動作します)

これで、GemPathを読み込む:LoadGemというコマンドが作られます。

下記のような動作で定義元に飛べるのが確認できると思います。

gemジャンプデモ

無事動いていますね。

まとめ

今回はpathについて、簡単に説明しました。

次回は、pathを活用してさらにinclude, includeexprあたりをやります。

この辺を勉強すると、自分の環境用にファイル補完を作り上げられます。 neocompleteのfile/includeあたりが書けるようになりますよ〜