vimrc, runtime の優先順位を理解して Windows と Linux で Vim の設定を共有する

Vim の設定ファイルと言えば .vimrc ですが、これが Windows だとファイル名が異なって _vimrc とされています。
また、プラグインファイルを設置する runtime ディレクトリの名前も OS によって異なっています。
別々に管理するのは面倒なので、設定ファイルの優先度を調べながら、同じリポジトリを使用して一元管理する方法を探ります。

vimrc の共有

まず、vimrc にはシステム vimrc とユーザー vimrc の2種類があります。
システム vimrc → ユーザー vimrc の順で読み込まれ、重複する設定はユーザー vimrc で上書きされます。


システム vimrc に使用されるファイルは、基本的には $VIM/vimrc ですが、システムにより異なります。
正確にはコマンドラインで :version を実行すると使用しているシステムでの vimrc の読込先を確認できます。
とはいえ、システム vimrc はその名のとおりシステム固有の設定を記述するところなので、共有しないということで進めます。


次にユーザー vimrc です。
ユーザー vimrc は以下の順で検索されます。

  • Windows
    1. $HOME/_vimrc
    2. $HOME/.vimrc
    3. $VIM/_vimrc
    4. $VIM/.vimrc
  • Linux
    1. $HOME/.vimrc
    2. $HOME/_vimrc

$VIM の場所は :echo $VIM で確認できます(通常は Vim のインストール先)。
Windows でも、_vimrc がなければ .vimrc を探してくれます。


注意点は、ファイルが見つかった時点でそれ以降のファイルは読み込まれなくなるということです。
例えば Windows で上記の4つのファイルがすべて存在していたとき、初めの $HOME/_vimrc だけが読み込まれます。
他のファイルで上書きできるわけではありません。


どちらの OS でも .vimrc、 _vimrc の両方を読んでくれますが、Windows で _vimrc というファイル名だと関連付けができなくて面倒なので、.vimrc に統一するのが良いと思います。


gvimrc(gvim の設定ファイル)、exrc (vi の設定ファイル)についても、まったく同様の扱いです。

設定ファイル runtime ディレクトリの共有

次に、プラグインやシンタックスなどの設定ファイルを格納する runtime ディレクトリです。
Vim では runtimepath オプションがディレクトリの読み込み順を決定しています。
コマンドラインから :set runtimepath で確認できます。
デフォルトでは以下のようになっています。

  • Windows
    1. $HOME/vimfiles
    2. $VIM/vimfiles
    3. $VIMRUNTIME (普通は $VIM/runtime など)
    4. $VIM/vimfiles/after
    5. $HOME/vimfiles/after
  • Linux
    1. $HOME/.vim
    2. $VIM/vimfiles
    3. $VIMRUNTIME (普通は $VIM/vim71 など)
    4. $VIM/vimfiles/after
    5. $HOME/.vim/after

.vimrc と違い、全てのパス上のファイルを読んで上書きしていきます(だからこそ after がある)。
Windows と Linux でディレクトリ名が違います。
これを共有するために2つの方法が考えられます。

シンボリックリンク

リポジトリ上では vimfiles で管理し、Linux ローカルでは .vim → vimfiles にシンボリックリンクを張ります。
これがシンプルで一番使いやすい方法だと思います。

ln -s .vim vimfiles

Linux に合わせて .vim というディレクトリ名で管理したいという場合には、Windows 側でシンボリックリンクを使う方法もあります。
あまり知られていませんが、Vista にはシンボリックリンクを張るコマンド mklink が標準で存在します。
また、Windows 2000, XP では「ジャンクション」というシンボリックリンク的なコマンド linkd が使えます。
ただし、linkd を使うためにはリソースキットをインストールする必要がありますので、興味のある方は以下の記事を参考にしてください。

runtimepath オプションを書き換える

ディレクトリ名はそのままにして、Vim 側の設定で違いを吸収します。
Windows で .vim ディレクトリから設定ファイルを読みたい場合、.vimrc で以下のように指定します。

:set runtimepath^=$HOME/.vim
:set runtimepath+=$HOME/.vim/after

^= で既存の設定の先頭に、+= で最後に設定を追加することができます。
これで、順番で言うと 0 番に $HOME/.vim を、6 番に $HOME/.vim/after を読み込んでくれます。


プラグインの挙動への影響などを考えると、個人的にはあまり runtimepath オプションをいじりたくありませんが。

まとめ

vim の設定ファイルのリポジトリは以下のような名前で管理します。

├ .vimrc
├ .gvimrc
└ vimfiles
    ├ plugin
    ├ syntax
    :

各 OS で以下のように設定します。

  • Windows
    • 環境変数 $HOME で指定したディレクトリにチェックアウトして配置するだけ。
  • Linux
    • $HOME にチェックアウトした上で、$HOME/.vim から $HOME/vimfiles にシンボリックリンクを張る。
    • あるいは、$HOME 直下に .svn などができるのが微妙なので別のディレクトリにチェックアウトし、それぞれのファイルに対して個別にシンボリックリンクを張る。

終わってみれば至極真っ当で単純な結論に至りましたが、うやむやにしていた部分だったのですっきりしました。
基本的には :h startup などのマニュアルをちゃんと読んだだけで解決できました。
やっぱりマニュアルは大事ですね。