【问题标题】:Progressively slower reloading time of .vimrc.vimrc 的重新加载时间逐渐变慢
【发布时间】:2013-02-27 12:55:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: vim reload


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      罪魁祸首是您使用了autocmd。当您使用

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        • 2015-04-23
        • 2013-08-04
        • 2015-05-30
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多