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




~/ vim plugged (2)

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

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

Как я мог предотвратить это?


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

autocmd <Event> <Action>

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

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

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

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


Это мое решение, которое также очищает предыдущие сопоставления:

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




reload