记一次优化Vim启动速度
最近宅家捣鼓了一段时间Vim,原打算试试Vim作为开发IDE,随着Vim Plugin增多,基本有个IDE的雏形,开发体验上有所改善,但也导致一个问题,启动Vim时变慢了,所以又花了点时间捣鼓优化。(PS:用什么Vim当IDE,Pycharm不香吗?)
startuptime
在Vim7.2版本后自带了startuptime参数,可以输出Vim启动过程中的耗时
1 | --startuptime {fname} --startuptime |
例如:
1 | vim --startuptime time.log |
这里先上一组优化前的启动耗时
- 空白文件
1 | 221.131 000.229 000.229: sourcing /Users/a1/.vim/plugged/vim-airline/autoload/airline/extensions/tabline/builder.vim |
- 某千行python文件
1 | 375.848 000.497 000.497: sourcing /Users/a1/.vim/plugged/vim-gitgutter/autoload/gitgutter/hunk.vim |
此方法能粗略看出哪些操作启动耗时长,只能说够用。以下介绍两种更直观的启动耗时插件,便于优化。
startuptime.vim
1 | Plug 'tweekmonster/startuptime.vim' |
startuptime.vim
会对当前文件多次启动,标记启动最慢的一些插件以及输出每个步骤的耗时,安装插件后,通过使用:StartupTime
,输出startup-log,如图:
vim-startuptime
1 | Plug 'dstein64/vim-startuptime' |
vim-startuptime
会返回启动时各个操作之间耗时以及百分比,同样使用:StartupTime
,输出如图:
发现问题
不难看出,拖慢startuptime的几处地方
一些插件,例如nerdtree,vim-airline
filetype不对的插件没必要加载,例如打开python文件,显然没必要加载vim-go
一些多余的autocommand
优化方案
懒加载
本人配置在vim启动后,nerdtree是处于未展开状态,显然启动时没必要加载,在需要使用加载即可,类似的,当filetype不同时,有些插件也没必要加载。
使用vim-plug的同学,一定熟悉一些plug option,像branch、do,其中有两种参数可实现lazy load。
1 | on On-demand loading: Commands or <Plug>-mappings |
另一种插件管理 dein.vim 也可以实现lazy load
下面改写vimrc,对于命令触发的插件添加on参数,而对于fileType触发的则添加for参数。
1 | Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } |
改动后,startuptime.vim显示如下:
1 | Total Time: 62.441 -- Flawless Victory |
执行vim --startuptime time.log a.py
1 | 323.386 051.707: first screen update |
nerdtree通过系统调用获取文件树,类似的还有statusline中获取分支名,这类系统调用的方式都是拖慢启动速度
替换插件
众所周知,vim-airline是statusline界的集大成者,兼容了许多常用插件,但同时也导致加载vim-airline时,加载不必要的内容,虽然vim-airline performance 讲解了如何优化,不过我选择用更轻量的lightline.vim替换vim-airline。
1 | " Plug 'vim-airline/vim-airline' |
如图为使用lightline.vim的statusline,以及配置对比
再次使用startuptime.vim
以及vim --startuptime time.log a.py
,输出如下
1 | Total Time: 55.207 -- Flawless Victory |
1 | 204.982 025.837: first screen update |
启动新文件
1 | 121.816 015.576: first screen update |
Over
至此,经过几个步骤之后,启动时间减少了越一半,200ms也还过得去,毕竟不是每次都打开千行的文件。另外对于现如今还不支持异步或者更新不积极的插件,如果有合适的替代品也可以替换,例如fzf.vim或Leaderf替换CtrlP,vista替换tagbar。定期更新vimrc,删除不需要的配置以及插件,有可能会有意外的惊喜哦。