.vimrc的重新加载时间逐渐减慢

时间:2013-03-12 05:31:16

标签: vim reload

我对vim的启动时间大约是半秒(用“--startuptime”测试),但是在我通过source重新加载vimrc几次后,它随后变慢了。我没有系统地调试.vimrc,所以我不知道如何继续。设置verbose有助于看到发生了什么,我几乎可以肯定.vimrc被多次加载。 (特别是filetype.vimftplugin.vim)每当我按 Ctrl-C 来停止挂起时,我在filetype.vim中收到错误,我认为这是因为vim支出大部分时间都在尝试加载filetype.vim。我看到的最可能的罪魁祸首是.vimrc的自动重载:

if has("autocmd")
    autocmd bufwritepost .vimrc source $MYVIMRC "auto source vimrc
endif

我怎么能阻止这种情况发生?

2 个答案:

答案 0 :(得分:26)

这里的罪魁祸首是你使用autocmd。使用

定义自动命令时
autocmd <Event> <Action>

vim定义了一个新的自动命令,无论现有命令。因此,当你在.vimrc中有多个这样的自动命令并重复获取它时(在这种情况下,对于每次写入),你最终会定义数百和数千个自动命令,这些命令都会重复执行相同的操作。很快就会爆炸并减慢你的vim会话,这是你一直注意到的。

您需要做的是对自动命令进行分组,然后使用autocmd!清除该组的定义。举个简单的例子:

augroup Group1  
    autocmd!
    autocmd <Event1> <Action1>
    autocmd <Event2> <Action2>
    ...    
augroup END

您可以拥有任意数量的组,这样您就可以通过类似的操作/事件来组织它们。

答案 1 :(得分:1)

这是我的解决方案,也清除以前的映射:

augroup VimrcGroup
  autocmd!
  " Make changes effective after saving .vimrc. Beware that autocommands are
  " duplicated if .vimrc gets sourced again, unless they are wrapped in an
  " augroup and the autocommands are cleared first using 'autocmd!'
  autocmd bufwritepost $MYVIMRC call OnSavingVimrc()
augroup END

" Avoid infinite loops
if !exists("*OnSavingVimrc")
  function! OnSavingVimrc()
    " Clear previous mappings, they don't go away automatically when sourcing vimrc
    mapclear
    echo "Sourcing Vimrc after saving it"
    source $MYVIMRC
  endfunction
endif