Постепенно медленнее время перезагрузки .vimrc

Мое время загрузки для vim составляет примерно половину секунды (проверено с "--startuptime" ), но после того, как я перезагрузил vimrc пару раз через source, он становится медленнее впоследствии. Я не отлаживал .vimrc систематически, поэтому я не уверен, как действовать дальше. Настройка verbose помогает увидеть, что происходит, и я почти уверен, что .vimrc загружается более одного раза. (особенно filetype.vim и ftplugin.vim). Когда я нажимаю Ctrl-C, чтобы остановить зависание, я получаю сообщение об ошибке в filetype.vim, что, я думаю, связано с тем, что vim тратит больше времени на загрузку filetype.vim. Наиболее вероятным виновником, который я вижу, является автоматическая перезагрузка .vimrc:

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

Как я могу остановить это?

Ответ 1

Виной здесь является использование autocmd. Когда вы определяете автоматическую команду с помощью

autocmd <Event> <Action>

vim определяет новую автоматическую команду независимо от существующих. Поэтому, когда у вас есть несколько таких автоматических команд в .vimrc и многократно их источник (в этом случае для каждой записи), вы определяете сотни и тысячи автоматических команд, которые все повторяют одно и то же. Очень скоро это взорвется и замедлит сеанс vim, что вы заметили.

Вместо этого вам нужно сгруппировать свои автоматические команды, а затем очистить определения для этой группы с помощью autocmd!. В качестве простого примера:

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

У вас может быть столько групп, сколько вам нравится, что позволяет организовать их с помощью похожих действий/событий.

Ответ 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