18

我的 vim 启动时间大约是半秒(用“--startuptime”测试),但是在我通过 重新加载 vimrc 几次之后source,它随后变得更慢。我还没有系统地调试过 .vimrc,所以我不确定如何进行。设置verbose有助于了解发生了什么,我几乎可以肯定 .vimrc 被多次加载。(尤其是filetype.vimand ftplugin.vim)每当我按下Ctrl-C停止挂起时,我都会收到一个错误filetype.vim,我认为这是因为 vim 花费了大部分时间来尝试加载filetype.vim. 我看到的最可能的罪魁祸首是 .vimrc 的自动重新加载:

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

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

4

2 回答 2

28

这里的罪魁祸首是您使用autocmd. 当您定义自动命令时

autocmd <Event> <Action>

vim 定义了一个新的自动命令,而不管现有的命令。因此,当您有几个这样的自动命令.vimrc并重复获取它时(在这种情况下,对于每次写入),您最终会定义成百上千的自动命令,它们都重复执行相同的操作。很快,这将炸毁并减慢您的 vim 会话,这是您已经注意到的。

相反,您需要做的是对您的自动命令进行分组,然后使用autocmd!. 举个简单的例子:

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

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

于 2013-03-12T06:16:42.337 回答
2

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

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
于 2017-11-15T13:36:43.993 回答