vim 啟動速度優化的一些經驗
如果你打開 vim 頻率不高,其實並沒有太大必要優化,但如果你像我一樣每天要在命令行下打開上百次 vim 的話,優化一下能讓你感覺好一些。
如何查看 vim 的啟動時間?
使用 --startuptime 啟動 vim 即可,例如:
vim --startuptime tmp.txtnvim --startuptime tmp.txt ~/.vimrcn
打開臨時文件使用命令 !sort -nrk 2 排序就能基本看出啟動的瓶頸在哪兒了。
如何評價 vim 啟動快慢?
很難有一個明確的標準判定快或者慢,我個人的感受是 200ms 以下感覺是很好的,超過 500ms 會覺的有點卡,如果超過 1s 就會覺得非常難受了,當然這是個因人而異的事情。
以下是我的 vim 啟動時間:
為什麼 vim 啟動會慢?
原因會有很多種,這裡分析一下常見的幾個原因:
語法高亮導致
可以通過設置 『regexengine』 選項以及 syntax sync minlines=300 等方式改進,但是個人感覺效果不明顯。我當時定位到慢的原因是 othree/yajs.vim 和 ap/vim-css-color 這兩個插件導致高亮太慢,換到 pangloss/vim-javascript 以及禁用掉 vim-css-color 針對 JavaScript 高亮支持後,啟動效率得到了明顯的提升,估計將來某天 vim 支持分線程代碼高亮這個問題才能真正解決。
系統調用導致
vim 有幾個涉及系統調用的介面是非常慢的,一次調用往往需要 50ms 以上時間,例如 system() has(), 如果 vim 啟動中有調用系統相關的方法,效率必然大幅下降,一個例子是 syntax/vim.vim 中的系統調用:https://github.com/neovim/neovim/pull/5785
另外一個常見問題是狀態欄的系統調用, 例如我們希望狀態欄顯示當前項目的 git 信息,這裡就需要進行系統調用, 解決辦法是使用非同步調用,例如我有一個命令 git-status 是模仿magicmonty/bash-git-prompt 的獲取 git 狀態的命令,我可以:
let job_id = jobstart([git-status], {n cwd: root,n on_stdout: function(s:JobHandler, [root]),n on_stderr: function(s:JobHandler, [root]),n on_exit: function(s:JobHandler, [root])n }n
詳細代碼在 chemzqm/vimrc, vim 8 使用的 job 介面跟我使用的 neovim 略有區別。
vim/neovim 本身的問題
neovim 有個功能叫 remote-plugin, 它允許其它語言編寫的插件通過 rpc 的方式與 vim 進行交互。neovim 默認會從一些環境變數裡面去找然後驗證所需 provider 的可以執行程序,例如 python 和 python3,然而這個過程可能會耗費數百毫秒,解決辦法是跳過這個過程,你可以在 vimrc 中添加:
let g:python_host_skip_check=1nlet g:python_host_prog = /usr/local/bin/pythonnlet g:python3_host_skip_check=1nlet g:python3_host_prog = /usr/local/bin/python3n
為了保證後台進程的正常執行,neovim 還會在插件進程啟動後發送 rpcrequest ,因為這個調用是阻塞的,所以這會導致 150ms 以上的延遲,解決辦法是盡量不要使用需要啟動時就啟用的遠程插件(包括遺留的 vim python 插件,因為它們用的也是 rpc 與 neovim 通訊),neovim 只會在需要時啟動遠程插件的進程,另一種辦法是修改 runtime/remote/pythonx.vim 去掉那個調用 (不推薦),最理想的方法是 neovim 支持非同步的 rpcrequest,相關 issue:Autocmd for remote plugin on VimEnter is slow · Issue #5728 · neovim/neovim
希望對你有所幫助。
Happy vimming!
推薦閱讀:
※Vim - 配置IDE一般的python環境
※Vim 折騰記
※打造Python開發工具——vim+zsh+tmux
※SpaceVim 模塊化狀態欄
※從零開始配置跨平台多人合作LaTeX論文寫作環境