vimのjob機能を使ってプラグインを更新する

2ヶ月以上経ってるけど一応前回の続き。

~/.vim/pack/bundle/opt/配下にインストールされているプラグインを更新するには、

ls -d ~/.vim/pack/bundle/opt/* | xargs -I{} git -C {} pull --ff --ff-only

でやってしまうのが手っ取り早いんだけど、あえてvimでやってみた。

以下のようにjob機能を使うことでvimをブロックせず、結果をバッファに出力するといった処理が簡単に実現できた。

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

"プラグインを更新したくなったら :call UpdatePackPlugins() を実行する
function! UpdatePackPlugins()
    " 結果を表示するためのバッファを作成
    topleft split
    edit `='[update plugins]'`

    let s:idx = 0
    call timer_start(100, 'PluginUpdateHandler', {'repeat': len(s:plugins)})
endfunction

function! PluginUpdateHandler(timer)
    let path = expand('~/.vim/pack/bundle/opt/' . s:plugins[s:idx])
    let cmd = printf('git -C %s pull --ff --ff-only', path)
    " コマンドを実行し、結果をout_nameで指定したバッファに出力する
    call job_start(cmd, {'out_io': 'buffer', 'out_name': '[update plugins]'})

    let s:idx += 1
endfunction

UpdatePackPlugins()内でforを使うと全部更新できなかったのでtimer機能でPluginUpdateHandler()を呼び出すようにしている。