たった一行で人生が変わった.vimrcでの設定とその意味

僕はVimを使うまでは秀丸エディタを長いこと使用していました。両者の間に設定の項目数やキーバインドに割り当てられる機能に大きな差があるとも思わなかったので、使い始めた当初は「そんな言うほど高機能でもないよなー」とか思っていました。しかし色々なプラグインを試したり、様々な設定を.vimrcに書いているうちに、Vim(やEmacs)がその他エディタと決定的に違うのは設定の豊富さではなく、設定の自由さがもたらすアプローチの多様性なのではないかと考えるようになりました。というわけでそういう設定の自由さを最初に実感した話をVim Advent Calendar 2011の6日目のエントリーとして書かせてもらいます。


昨今のWebサイトではCMSなどを利用することが多く、共通のHTMLコードはテンプレートとして作成されます。その場合そのテンプレートの利用されるパスが様々な場所や階層になりうるので、例えばJavaScriptファイルのインクルードを行う場合、以下のようにスラッシュで始まる相対URLを利用することが多いでしょう。

<script src="/js/foo.js"></script>

しかしこのようなURLを利用していると何かと便利なgfでカーソル下のファイル(この場合はfoo.js)を(多くの場合)開くことが出来ません。ローカル(やリモート)のファイルシステム上のパス構成をURL構成とマッチするように整えてやれば開くことができるようになりますが、それは面倒でしょう。それを解決するのが以下の一行です。

autocmd FileType html setlocal includeexpr=substitute(v:fname,'^\\/','','') | setlocal path+=;/

こう~/.vimrcに書いておくだけでgfで開くことができるようになります。includeexprでファイル名の先頭のスラッシュを削り、path;/を追加して上流を探すようにすることにより、大体うまく開くことが可能になるわけです。pathによってgf:findなどでファイルを探すパスを細かく設定できます。値の;/については、

:h file-searching

を参照するのが良いでしょう。


この一行の設定がもたらすものにはさほど意味はありません(僕にとっては大きなものでしたが)。単にgfでファイルを開くことができるようにするだけでなく、仮想的なパス構成を扱えるようにするプラグインもありますし、OS側でWebプロジェクトのディレクトリを仮想ドライブとしてマウントしてやったりするなどでもこの小さな問題は解決することができるでしょう。しかしこの程度の設定でも大体うまくいきます。つまりVimではやりたいことをやりたいようにできるということです。

設定の書き方もこのようにパイプでコマンドを繋げて無理やり一行にまとめたりすることもできますし、関数として定義してそれを呼び出してやってもいいでしょう。もちろんVimの作法に従ってafterディレクトリで設定を記述するのが良いですが、設定を集中させることによって環境の移動に強くなったりというメリットも出てきます。こういったアプローチの多様性がVimが愛されている理由のひとつであることは間違いないでしょう。

Once a vimmer, always a vimmer.

Comment on Day 1: Vim To Emacs, Isaac Su

僕もきっとそうだと思います。