2013-03-12 11 views
17

Meine Boot-Zeit für vim ist etwa eine halbe Sekunde (getestet mit "--Startuptime"), aber nachdem ich vimrc ein paar Mal über source nachladen, wird es später langsamer. Ich habe die .vimrc nicht systematisch debuggt, also bin ich mir nicht sicher, wie es weitergehen soll. Einstellung verbose hilft, um zu sehen, was vor sich geht und ich bin fast sicher, dass die .vimrc mehr als einmal geladen wird. (vor allem filetype.vim und ftplugin.vim) Immer wenn ich Ctrl-C, um den Hang zu stoppen, bekomme ich einen Fehler in filetype.vim, die ich denke, weil Vim verbringt die meiste Zeit versucht, filetype.vim laden. Die wahrscheinlichste Täter ich sehe, sind die Auto-Reload von .vimrc:Progressiv langsamer Nachladezeit von .vimrc

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

Wie kann ich das verhindern?

Antwort

26

Der Schuldige hier ist Ihre Verwendung von autocmd. Wenn Sie ein Auto-Befehl mit

autocmd <Event> <Action> 

vim definieren definiert einen neuen Auto-Befehl ungeachtet bestehender. Also, wenn Sie mehrere solche Auto-Befehle in Ihrem .vimrc haben und es wiederholt (in diesem Fall für jeden Schreibvorgang), Sie am Ende definieren Hunderte und Tausende von Auto-Befehle, die alle das gleiche wiederholt tun. Sehr bald wird dies Ihre vim-Sitzung sprengen und verlangsamen, was Sie bemerkt haben.

Sie müssen stattdessen Ihre automatischen Befehle gruppieren und dann die Definitionen für diese Gruppe mit löschen. Als ein einfaches Beispiel:

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

können Sie haben so viele Gruppen, wie Sie möchten, was Sie sie durch ähnliche Aktionen/Veranstaltungen organisieren können.

1

Dies ist meine Lösung, die löscht auch frühere Zuordnungen:

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