Vimで"gf"をスラッシュで始まる相対URLに対応させる

Vimではファイル名らしき箇所でgfを押すと、見つけることができればそのファイルを開いてくれる。この機能はとても便利なのだが、HTMLファイルにスラッシュで始まる相対URLでCSSファイルやJavaScriptファイルのURLを書いた場合は、そこでgfを押してもうまく開くことができない。これを解決するためにvimでHTMLとかを編集するときに絶対パスのファイルを開くで公開されているプラグインをちょっと使っていたのだけど、どうやらpathオプションとincludeexprオプションを設定することでも対応できるようだ。Vimすげー。

とりあえず設定から。

autocmd FileType html :setlocal path+=W:/www/test,W:/www/hail2u.net,W:/www/blosxom.info
autocmd FileType html :setlocal includeexpr=substitute(v:fname,'^\\/','','')

W:/www/test等のパスはカンマ区切りで自分の環境に合わせて必要なだけカンマで区切って書く。追加するパスはサイトのトップページのあるディレクトリ(フォルダ)のパス。ややこしく言うならウェブサイトのドキュメント・ルートに対応するローカル(またはリモート)のファイルシステム上のパス。


デフォルトでは以下のように書くとgfで開くことができない。

<script type="text/javascript" src="/scripts/twitter/speech-bubble.js"></script>

ファイルシステム上のルートとドキュメント・ルートが一致しないため/scripts/twitter/speech-bubble.jsの上でgfを押しても「ファイルがありません」と怒られるだけ。:help gfによるとgfは以下のようにしてファイルを探しているようだ。

  1. isfnameオプションに従ってカーソルの前後からファイル名を抜き出す
  2. pathオプションに従ってファイルを探す
  3. 見つからなかったらsuffixesaddオプションに従って接尾語を付けファイルを探す
  4. 見つからなかったらincludeexprオプションに従ってファイル名を変更しファイルを探す

ポイントになるのは2と4で、この2つのオプションをうまく設定してやると開くことができるようになる。まずpathにドキュメント・ルートに対応するファイルシステム上のパスを追加してやり、ドキュメント・ルートからの相対パスをなんとなく解釈できそうな感じに準備する。このままではまだスラッシュ始まりに対応できないので、今度はincludeexprで頭のスラッシュを削除してやる。というわけで上記のような設定になる。after/html.vimとかの使い方をいまだにちゃんと覚えていないのでautocmdばっか使ってる……。

追記@2009-11-10T12:48:31+09:00

上位ディレクトリの参照はセミコロンを使えばできるということを教えてもらった。なのでpathオプションの設定は、

autocmd FileType html :setlocal path+=;/

というシンプルなものでもいける。こっちの方が誤爆も無さそうだし良さそう。