vim pluginのbackground loading

最近vimに追加されたpackagestimerを使ってvimが起動した後にプラグインの読み込みができたらどうだろう? と思ったのでやってみました。

以下のような設定をvimrcに追加してvimを起動するとvimが立ち上がってからプラグインが読み込まれます。

" vim起動後に~/.vim/pack/bundle/opt/vim-quickrunを読み込む例

let s:plugins = [
            \     'vim-quickrun',
            \ ]

let s:idx = 0
function! PackAddHandler(timer)
    execute 'packadd ' . s:plugins[s:idx]
    let s:idx += 1
endfunction

autocmd VimEnter * call timer_start(1, 'PackAddHandler', {'repeat': len(s:plugins)})

約150個のプラグインある状態のMacVim-KaoriYaで、起動時間が

  • NeoBundle: 約530ms
  • background loading: 約130ms

と、だいぶ高速化されました。

ただし、

  • packagesの仕様*1で読み込まれないプラグインがあったり、
    • 追記(2016-03-21)
      • textobj-userruntime! plugin/textobj/*.vim
      • operator-userruntime! plugin/operator/*.vim
      • PackAddHandlerで実行すると読み込める
    • 追記(2016-04-03)
      • 7.4.1699からはサブディレクトリの.vimも読み込まれるようになったのでruntime!は不要
  • 起動時に指定したファイルのfiletypeが(ファイルを開いた後に読み込まれるので)反映されなかったり、
    • 追記(2016-03-21)
      • PackAddHandlerdoautocmd BufReadPostを実行すると反映される
  • 引数の-cで指定したコマンドが(実行後に読み込まれるので)失敗したり、

するので有効に使うには色々と考えないといけなさそうです。


ところで、e-honAmazonオムニ7にある

「仕事ですぐ役立つ VimEmacsエキスパート活用術」

4月9日(土) に発売されます。

f:id:daisuzu:20160318234059p:plain

技術評論社さんのサイトにも来週にはページができるそうなのでできました。 gihyo.jp
興味のある人はチェックしてみてください。