2013-03-12 37 views
17

Thời gian khởi động của tôi cho vim là khoảng một nửa giây (thử nghiệm với "--startuptime"), nhưng sau khi tôi tải lại vimrc một vài lần thông qua source, nó sẽ chậm hơn sau đó. Tôi đã không debugged .vimrc một cách có hệ thống, vì vậy tôi không chắc chắn làm thế nào để tiến hành. Thiết lập verbose giúp loại xem những gì đang xảy ra và tôi gần như chắc chắn rằng .vimrc đang được nạp nhiều lần. Bất cứ khi nào tôi bấm Ctrl-C để dừng treo, tôi gặp lỗi trong số filetype.vim, tôi nghĩ là vì vim dành phần lớn thời gian cố gắng để tải filetype.vim. Thủ phạm có thể xảy ra nhất mà tôi thấy là tự động tải lại .vimrc:Thời gian tải lại chậm hơn .vimrc

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

Làm cách nào để ngăn điều này xảy ra?

Trả lời

26

Thủ phạm ở đây là việc bạn sử dụng autocmd. Khi bạn xác định một tính năng tự động lệnh với

autocmd <Event> <Action> 

vim định nghĩa một lệnh tự động mới bất kể những cái hiện có. Vì vậy, khi bạn có một số lệnh tự động như vậy trong .vimrc của bạn và nhiều lần nguồn nó (trong trường hợp này, cho mỗi viết), bạn sẽ xác định hàng trăm và hàng ngàn lệnh tự động mà tất cả làm điều tương tự lặp đi lặp lại. Rất sớm này sẽ thổi lên và làm chậm phiên vim của bạn, đó là những gì bạn đã nhận thấy.

Những gì bạn cần làm thay vào đó, là nhóm các lệnh tự động của bạn và sau đó xóa các định nghĩa cho nhóm đó bằng autocmd!. Ví dụ đơn giản:

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

Bạn có thể có bao nhiêu nhóm tùy ý, cho phép bạn sắp xếp chúng theo các hành động/sự kiện tương tự.

1

Đây là giải pháp của tôi cũng xóa các ánh xạ trước đó:

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