読者です 読者をやめる 読者になる 読者になる

Neobundle.vimのload_cacheを複数ファイル対応にするPRを投げたらマージされた

2015年も年の瀬が押し迫ったところで本年ブログ初めです、ご無沙汰しております。

特に大きなPullReqでもないし記事にするほどでも無い気はするけど、多分同じ問題に当たったことのある人は多いだろう(ほぼ同じ内容のissueが過去にもあった)し、何よりShougowareに初コントリビュートできたので記念記事。

github.com

問題

Neobundle.vimに今年前半に実装された、TOMLファイルでプラグインを管理する機能とbundle設定をcacheする機能を同時に試していて、以下のようなvimrcを書きました。

set runtimepath+=~/.config/nvim/bundle/neobundle.vim

call neobundle#begin('~/.config/nvim/bundle/')

if neobundle#load_cache()
  call neobundle#load_toml('plugin.define.toml')
endif

call neobundle#end()

しかしこの状態でplugin.define.tomlを更新してもNeobundle.vimのcacheが更新されず、:NeoBundleInstallしても新しく登録したプラグインがインストールされません。TOMLファイルの扱いにバグがあるのかと思い、call neobundle#load_toml('plugin.define.toml')source 'plugin.define.vim'として素直にvimscriptで書いても状況は変わらず。

原因

Neobundle.vimのコードを読んでいると、neobundle#load_cache()$MYVIMRCの更新日時がcacheの更新日時よりも新しい場合に限りcacheを再構築することが判明。neobundle#begin()neobundle#end()に挟まれた部分で使っているファイルは適当に読み込みなおしてくれるだろうとかタカをくくっていたのが大間違いでした。

結論

ということで、load_cache()複数ファイル指定ができるような修正を加えてPullReqしました。幸い大きな問題もなくマージしていただけたのでNeobundle.vimを更新すれば使えます。

if neobundle#load_cache(
     \ $MYVIMRC,
     \ 'plugin.define.toml'
     \ )
  call neobundle#load_toml('plugin.define.toml')
endif

引数を省略した場合は従来通り$MYVIMRCのみチェックします。指定できるファイル数に制限はありません。

偉大なプラグインを生み出し続けている暗黒美夢王先生に感謝しつつ、何か引っかかった時は積極的にコントリビュートできるように頑張りたいと思いました。