ハイパーマッスルエンジニア

Vim、ShellScriptについてよく書く

Vimでステータスラインを自作にしたら起動速度倍になった

 
vim(nvim)の起動が遅い。由々しき事態なので対処した。
ステータスラインのプラグインをやめて自作にしたら400ms -> 200msに高速化できた。

起動速度の計測

まずは計測せねばならない。こちらの記事を参考にさせていただいた。

https://zenn.dev/uu64/articles/6518c75cdf5e02

計測方法は2種類あり、まずは素のコマンドで計測する方法。

vim --startuptime startup.log -c ":q"

startup.logが生成されるので中身を見てみるとこんな感じで読み込み順にかかった時間と経過時間を出力してくれる。

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

000.019  000.019: --- NVIM STARTING ---
000.154  000.135: event init
000.323  000.169: early init
000.914  000.591: locale set
000.967  000.053: init first window
...

もう1つの方法はvim-startuptimeを使う方法。

go install github.com/rhysd/vim-startuptime@latest

でインストール。

計測

vim-startuptime -vimpath nvim

すると下記のような出力が得られる。

$ vim-startuptime -vimpath nvim
Extra options: []
Measured: 10 times

Total Average: 153.954600 msec
Total Max:     170.386000 msec
Total Min:     149.676000 msec

   AVERAGE        MAX        MIN
---------------------------------
128.453200 142.183000 124.901000: /Users/me/.config/nvim/init.vim
  6.862900   9.434000   6.499000: loading plugins
  6.431600   6.964000   6.182000: BufEnter autocommands
  5.676600   5.839000   5.636000: /Users/me/.config/nvim/colors/jellybeans.vim
  2.443500   2.463000   2.421000: /usr/local/share/nvim/runtime/filetype.vim
  2.185100   2.537000   2.106000: /Users/me/.config/nvim/dein/repos/github.com/neoclide/coc.nvim_release/plugin/coc.vim
...

10回の平均を出してくれるのでありがたい。

原因を調査したらプラグインの読み込みに時間がかかっていて、vim-airline/vim-airlineが結構重かった

他にも時間がかかっているプラグインはいくつかあったのだけれど、一番不要で効果が高かったのがvim-airline/vim-airlineだった。vim-airlineはvimのステータスラインをカスタマイズするプラグインで、モードやブランチ名の表示など、ステータスラインをリッチな見た目にしてくれる。

ステータスラインをリッチにしてくれるvim-airline

vim-airlineの設定は下記だけで特に凝ったことはしていなかった。

let g:airline#extensions#default#layout = [
    \ [ 'a', 'b', 'c'],
    \ [ 'x', 'y']
    \ ]

便利でもなく不便でもなくもはやそこに当たり前のようにあったステータスラインだったが、よくよく考えてみるともはやステータスラインにそこまで情報いらんなと思ったのでやめてみた。

自作のステータスラインにする

下記で落ち着いた。

" ==============================
"    statusline
" ==============================
hi User1 guifg=#FFFFFF guibg=#000000
hi User2 guifg=#ffffff guibg=#333333

" ブランチ名
set statusline=%9*\ \ %2*%{matchstr(fugitive#statusline(),'(\zs.*\ze)')}
" ファイル名
set statusline+=%1*\ %{expand('%')}
" ここから右寄せ
set statusline+=%=
" 現在行 / 全体行 ファイル種別
set statusline+=%l/%L\ \%y

ブランチ名、ファイル名、現在行と全体行、ファイル種別を表示。

シュッとしたステータスラインになった

ステータスラインの色については、User1〜9の値が使用できるっぽく、User1~4はpositive色、User5~9はnegative色と決まっているみたい。ただ厳密な決まりではなく自由に設定できるっぽい。
ブランチ名の表示にはfugitive#statusline()を使っていて、これはプラグインのtpope/vim-fugitiveのメソッド。ここに自作の関数を当てることもできるのだが、カーソルを移動するたびに実行されることになるのでキャッシュ戦略というか少し工夫が必要になるので、そのへんはプラグインに委ねた。

初見ではステータスラインの記法になれなくて意味がわからなかったが、いくつか他人の設定を見ていると慣れてくる。そこまで記法の種類も多くないのでたぶんすぐに慣れる。記法については下記を参考にさせていただいた。

https://qiita.com/Cj-bc/items/dbe62075474c0e29a777

終わり

vim楽しいィィ!