hotoolong's blog

プログラムのことやエンジニアリングに関することを記事にしています。

vim-plug で プラグインの遅延ロードを行う

イントロ

最近neovimの起動が もっさり してきました。
プラグインマネージャーにはvim-plugを使っていまます。
こちらの環境で起動時間を改善してみました。

計測

nvim --startuptime ./startup.log

こちらのコマンドで起動時の処理時間が計測できます。

times in msec
 clock   self+sourced   self:  sourced script
 clock   elapsed:              other lines

000.093  000.093: --- NVIM STARTING ---
002.755  002.662: locale set
:
: (途中省略)
:
952.261  000.003: --- NVIM STARTED ---

左端が累計の時間、2番目が実行されている処理の時間です。

:%!sort -r -n -k 2

処理時間別に並び替えて重い処理を抽出できます。

プラグインの遅延ロード

vim-plugでは遅延ロードの種類が限定されています。
onとforをつかって遅延ロードさせるのが常套なのですが、
数秒後に読み込みのような設定はまだないようです。

タイマーで呼び出す

qiita.com

こちらの記事で取り上げられていて試してみたらとても良かったです。

以下のサンプルとしてlspの読み込みを遅延させています。

call plug#begin('~/.vim/plugged')

" .. 省略

Plug 'prabirshrestha/vim-lsp', { 'on': [] }
Plug 'mattn/vim-lsp-settings', { 'on': [] }

" .. 省略

call plug#end()

function! s:load_plug(timer)
    call plug#load(
                \ 'vim-lsp',
                \ 'vim-lsp-settings',
                \ )
endfunction
call timer_start(500, function("s:load_plug"))

Plugにonでから配列を設定することで読み込まなくなります。
timer_startで500ms後にs:load_plug関数を呼び出すようにしています。

plug#loadで遅延させる対象のprefix部分の文字列を省いて登録しておくと呼び出せます。
はじめ間違ってPlugに設定している文字列をそのまま渡してしまいエラーになってしまいました。
気をつけて!

計測時に遅くなっているものとあとからロードしても問題なさそうなプラグインを設定して再度計測してみると

952.261ms → 455.829ms になりました。

これでしばらくは快適に過ごせそうです。

参考URL

vim-plug/plug.txt at master · junegunn/vim-plug · GitHub

【vim-plug】InsertEnterイベントで遅延読み込み - Qiita

vim/neovimの起動時間・プラグイン読込時間を調べる - Qiita