【一人 vimrc Advent Calendar 2017】vimrc から別のスクリプトファイルを読み込む【4日目】

一人 vimrc Advent Calendar 2017 4日目の記事になります。
今回は vimrc から別のスクリプトファイルを安全に読み込みます。

任意のスクリプトファイルを読み込む

さて、vimrc が少し大きくなってくると

みたいに設定をファイル単位で分割したいと思うことがあると思います。
こういう場合は :source コマンドを使って任意のスクリプトファイルを読み込むことができます。

" :soure {file}
source /path/to/vimfiles/plugin.vim
source /path/to/vimfiles/keymapping.vim
source /path/to/vimfiles/command.vim
source /path/to/vimfiles/filetype.vim

読み込むスクリプトファイルを絶対パスにする

さて、:source を使うことで任意のスクリプトファイルを読み込むことができました。
しかし、以下のように『読み込む vimrc からの相対パス』で :source を読み込む場合は上手く動作しない可能性があります。

" vimrc と同ディレクトリにあるファイルを読み込む
" しかし、これだと上手く読み込まれない可能性がある
source ./plugin.vim
source ./keymapping.vim
source ./command.vim
source ./filetype.vim

これは :source が『:source しているファイルのパスから』ではなくて『そのファイルを読み込んでいるカレントディレクトリから』のパスになるためです。
例えば、カレントディレクトリが /hoge/foo/ の場合に上記vimrc を読み込むと /hoge/foo/plugin.vim などを読み込もうとしてしまいます。
なので、vimrc:source を行う場合は『相対パス』ではなくて『絶対パス』にしておいたほうが安全です。

:source相対パスっぽくスクリプトファイルを読み込む

とはいえ、絶対パスにしてしまうとそれはそれで vimrc のパスを変更した場合や、他の環境で同じ vimrc を使う場合に不便です。
そこで <sfile> を利用します。

" <sfile>:h + ファイルパスとする
" 詳しくは
" :help E498
" を参照してください。  
source <sfile>:h/plugin.vim
source <sfile>:h/keymapping.vim
source <sfile>:h/command.vim
source <sfile>:h/filetype.vim

<sfile>:source の実行時に『読み込まれているファイルのパス』に置き換えられます。
そして :h を付けることで『読み込まれているファイルのディレクトリパス』へと置き換えられます。
つまり、

source <sfile>:h/plugin.vim

というのは

source {vimrc のディレクトリパス}/plugin.vim

というような感じに置き換えられるので安全にスクリプトファイルを読み込むことができます。

まとめ

  • 外部のスクリプトファイルを読み込むのには :source コマンドを利用する
  • vimrc:source を使用する場合は絶対パスを指定する
  • ファイルパスの先頭に <sfile>:h を追加することで『読み込んでいる vimrcディレクトリ』に置き換える事が出来る
    vimrc を分割したい場合は読み込んでくるスクリプトファイルのパスに注意してください。