Vimで「あの」ファイルを即座に開く


2011年 07月 01日

問題

Vim で多数のファイルを編集することはよくあります。
例えば「foo」という名前の Vim プラグインを開発しているとしましょう。
すると
autoload.foo.vim、doc/foo.txt、plugin/foo.vim
などの特定のファイルを頻繁に編集することになります。
このような状況では
「doc/foo.txt を編集しようと思ったけれどどのウィンドウにも doc/foo.txt は表示されていない」
ということは起こりがちです。
そこで問題のファイルを明示的に開く必要がでてきます。
しかしファイルを開く方法は沢山あります。
あなたならどうやって問題のファイルを開きますか?
:edit?
:buffer?
それともお気に入りのバッファ管理プラグイン?

どれを選ぶにせよ、問題のファイルを開くためには何がしか追加情報を指定する必要があります。
例えば :edit を使うならファイルへのパスを指定しなければなりませんし、
:buffer を使うならバッファ番号を指定しなければなりませんし、
他の方法でも同様に何かヒントを指定する必要があります。
つまり、 何も指定せずに 問題のファイルを開く方法はありません。

先程例示した状況ではユーザーが「doc/foo.txt を編集したい」と思っている以上、
その 気持ちを汲み取って問題のファイルを自動的に判断して開いてほしい ものです。
どうすればよいでしょうか。

解決

vim-altr を使います。
このプラグインをインストールし、vimrcに以下のような内容を追加したとしましょう:

nmap <F2>  <Plug>(altr-forward)

Normal mode で <F2> を押下すると Vim が現在の状況からユーザーの気持ちを汲み取って
必要なファイルを開いてくれるようになります。
ファイルへのパスやバッファ番号など、追加情報は何も指定する必要はありません。
ただ <F2> を押下するだけで OK です。

とはいえ、vim-altr は常にユーザーの気持ちを汲み取ることができるわけではありません。
例えば新進気鋭の Web アプリケーションフレームワークなどが出てきた場合、
vim-altr としてはそのフレームワークでのファイル名の慣習などは分からないため、
教え込む必要があります。
これには以下のような内容をvimrcに追加します:

call altr#define('autoload/%.vim', 'doc/%.txt', 'plugin/%.vim')

補足

実のところ類似する目的のプラグインは既に存在します。
a.vim です。
a.vim も便利ではあるのですが、以下の理由から著者はあまり気に入っていません:

  • 基本的に拡張子ベースで開くべきファイルを推論します。
    しかし同一拡張子のファイル間を行き来するケースは決して少なくありません。
  • 設定方法が冗長で読み書きするには不便です。
    特に autoload/foo.vim、doc/foo.txt、plugin/foo.vim のように
    3種類以上のファイルに跨った設定は読むのも書くのも大変です。
  • プラグイン名がとても検索し辛いです。
  • テストコードがありません。

ですので vim-altr を作成しました。