MacVim-KaoriYa の gVim 起動が遅かったので調べてみた

最近の MacVim-KaoriYa で gVim の起動が遅かったので調査してみた。

# 環境

* OS X El Capitan Version 10.11.6
* MacVim-KaoriYa 20161013

# 起動処理の経過時間のメッセージをファイルに書き出す方法

`--startuptime file_name.log` オプションを付けて gVim を起動し、起動処理をファイルに書き出し調査する。

ちなみに、Vim 起動時の他オプションとして、

|引数 | vimrcファイル | プラグイン |
|-----|-----|-----|
| なし | 読み込む | 読み込む |
| -u NONE | 読み込まない | 読み込まない |
| -u NORC | 読み込まない | 読み込む |
| --noplugin | 読み込む | 読み込まない |

があるので、自分の .vimrc やプラグイン環境が原因の場合とそうでない場合を切り分けて検証できる。

# 実際に書き出す

```shell-session
$ gvim test.txt --startuptime before.log
```

```:before.log


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

000.005  000.005: --- VIM STARTING ---

(略)

034.969  028.270  000.935: sourcing $VIM/vimrc
036.213  000.392  000.392: sourcing /Users/user_name/.vim/dein/repos/github.com/Shougo/dein.vim/autoload/dein.vim
038.989  001.656  001.656: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/ftoff.vim
039.236  002.555  000.899: sourcing /Users/user_name/.vim/dein/state_Vim.vim
061.339  000.473  000.473: sourcing /Users/user_name/.vim/dein/.dein/ftdetect/ftdetect.vim
061.907  000.430  000.430: sourcing /Users/user_name/.vim/dein/.dein/ftdetect/ftdetect.vim
065.970  001.423  001.423: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/lang/menu_ja_jp.utf-8.macvim.vim
066.055  000.025  000.025: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/lang/menu_ja_jp.utf-8.vim
066.868  000.054  000.054: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/autoload/paste.vim
8456.569  8394.399  8392.897: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/menu.vim
8456.608  8417.140  021.838: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/filetype.vim
8456.790  000.021  000.021: sourcing /Users/user_name/.vim/dein/.dein/ftplugin.vim
8456.858  000.008  000.008: sourcing /Users/user_name/.vim/dein/.dein/ftplugin.vim
8456.908  000.010  000.010: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/ftplugin.vim
8457.087  000.010  000.010: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/indent.vim

(略)

8840.837  000.003: --- VIM STARTED ---
```


/Applications/MacVim.app/Contents/Resources/vim/runtime/menu.vim の読み込みに非常に時間が掛かっていることが分かる。

# 調査

以前は起動に1秒も掛かっていなかったので https://github.com/macvim-dev/macvim
の直近のコミットログを辿ったところ、https://github.com/macvim-dev/macvim/pull/331/files にて読み込みに時間が掛かりそうな

```diff:menu.vim
+let s:n .= globpath(&packpath, "pack/*/{opt,start}/*/colors/*.vim")
```

の差分があった。

カラースキーム読み込みの走査が、 `:echo &packpath` によると

```
/Users/user_name/.vim,
/Applications/MacVim.app/Contents/Resources/vim/vimfiles,
/Applications/MacVim.app/Contents/Resources/vim/runtime,
/Applications/MacVim.app/Contents/Resources/vim/vimfiles/after,
/Users/user_name/.vim/after
```

で追加で行われるようになっていたので、試しに該当箇所をコメントアウトして gVim を再起動してみた。

## 修正後

```shell-session
$ gvim test.txt --startuptime after.log
```

```:after.log


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

000.007  000.007: --- VIM STARTING ---

(略)

038.875  027.662  001.341: sourcing $VIM/vimrc
039.870  000.348  000.348: sourcing /Users/user_name/.vim/dein/repos/github.com/Shougo/dein.vim/autoload/dein.vim
043.204  002.049  002.049: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/ftoff.vim
043.492  002.976  000.927: sourcing /Users/user_name/.vim/dein/state_Vim.vim
065.683  000.461  000.461: sourcing /Users/user_name/.vim/dein/.dein/ftdetect/ftdetect.vim
066.249  000.426  000.426: sourcing /Users/user_name/.vim/dein/.dein/ftdetect/ftdetect.vim
069.583  001.117  001.117: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/lang/menu_ja_jp.utf-8.macvim.vim
069.648  000.022  000.022: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/lang/menu_ja_jp.utf-8.vim
070.482  000.056  000.056: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/autoload/paste.vim
086.663  020.146  018.951: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/menu.vim
086.698  042.970  021.937: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/filetype.vim
086.949  000.020  000.020: sourcing /Users/user_name/.vim/dein/.dein/ftplugin.vim
087.032  000.009  000.009: sourcing /Users/user_name/.vim/dein/.dein/ftplugin.vim
087.089  000.012  000.012: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/ftplugin.vim
087.280  000.010  000.010: sourcing /Applications/MacVim.app/Contents/Resources/vim/runtime/indent.vim

(略)

455.765  000.002: --- VIM STARTED ---
```

起動時間が9秒未満から0.5秒未満に減った！



# 一時的な対処法まとめ

MacVim-KaoriYa 20161013 にて、/Applications/MacVim.app/Contents/Resources/vim/runtime/menu.vim の 395 行目の

```vim:menu.vim#395
let s:n .= globpath(&packpath, "pack/*/{opt,start}/*/colors/*.vim")
```

をコメントアウトすると gVim の起動時の遅さが改善される。

ただし、コメントアウトするとパッケージ[^1]ディレクトリ以下のカラースキームがメニューバーの `Edit > Color Scheme` に表示されないままになる。

~~MacVim への Issue は、 MacVim-KaoriYa ではなく MacVim にて確認次第 Issue を立てる予定。~~

~~MacVim-KaoriYa の作者さんが https://github.com/macvim-dev/macvim/issues/351#issuecomment-253965457 にコメントしていただいたのでそちらで様子見中。~~

最終的にこの機能はRevertされ、 https://github.com/macvim-dev/macvim/pull/385 の代替実装で解消されることになりました。
いずれ、この処理を行わずとも起動時間の遅さが解消されるものと思われます。

[^1]: Vim 8.0 にて追加された機能。