開発中のプラグインを簡単に有効化する
プラグインを作っていると実際に動作させて検証したいことがよくある
しかし、Vimでプラグインを動作させるには、プラグインを'runtimepath'のいずれかに置く必要がある、普通にやると次のやり方を取ることになる 設定を書き換えて開発中のプラグインを'runtimepath'に追加する
開発中のプラグインを既存の'runtimepath'に置く
しかしこれではプラグインが異常動作した時に非常に困る、最悪設定を書き換えるためのVimすら立ち上がらなくなる
そこでkuuote.iconが使っている方法を紹介する
code:vimrc.vim
if !empty($plug)
let &runtimepath = getcwd() .. ',' .. &runtimepath
endif
これをプラグインマネージャーの読み込み直後に置く
これは$plugという環境変数が定義されていたら、'runtimepath'の先頭にカレントディレクトリ(展開する必要がある)を配置するスクリプトになる
環境変数は$plugじゃなくても何でもいいが、他のプログラムとの干渉には気を付ける必要がある
'runtimepath'は先頭から順番に参照されるため、一番最初に置いておけば必ず参照される
環境変数はVimの外から簡単に設定できるため、楽にプラグインの抜き差しができる
kuuote.iconの場合dein.vimを使っているので、正確にはこうしている code:dein.vim
if dein#load_state(s:dein_dir)
" 省略
endif
if !empty($plug)
let &runtimepath = getcwd() .. ',' .. &runtimepath
endif
call dein#call_hook('source')
まず、読み込み直後に置いている理由は、プラグインマネージャーが'runtimepath'を操作するからである
(経験はないが)物によっては読み込み前に置くと定義が破壊される可能性がある、dein.vimの場合は元の定義をrecacheのトリガーにしているためcacheの再構築が走ってよくない
次のcall_hookより前に置いている理由は、hook_sourceにプラグインのautoloadにアクセスする設定を書いているため、dein.vimで管理しているプラグインを上書きする場合に先に参照されると困るためだ autoloadは対象の関数が定義されていない場合にruntimepathを検索するという動作をするため、元の関数を先に呼んでしまうと、上書きした関数が呼ばれなくなってしまう