Aktualizacja 28.06.2015 : Naprawiłem mały błąd i wydałem go jako wtyczkę . Kod wtyczki jest nieco lepszy, ponieważ ostrzega ponownie po przesunięciu kursora; Polecam użyć wtyczki.
Odpowiedź od superjera działa świetnie, ale ma niefortunny efekt uboczny, że można cofnąć zmiany tylko z ostatniej sesji Vima, a nie ze wszystkich poprzednich sesji Vima.
Jest tak, ponieważ wundo
zastępuje plik cofania; nie jest scalony. O ile mi wiadomo, nie ma sposobu, aby to naprawić.
Oto moje alternatywne rozwiązanie, wyświetli duży czerwony komunikat ostrzegawczy podczas cofania zmian z pliku cofania.
Jest to podobne do odpowiedzi Ingo Karkat , ale nie wymaga zewnętrznej wtyczki i ma pewne subtelne różnice (wyświetla ostrzeżenie zamiast sygnału dźwiękowego, nie wymaga u
dwukrotnego naciśnięcia ).
Uwaga To tylko modyfikuje u
i <C-r>
wiąże i nieU
, :undo
i :redo
poleceń.
" Use the undo file
set undofile
" When loading a file, store the curent undo sequence
augroup undo
autocmd!
autocmd BufReadPost,BufCreate,BufNewFile * let b:undo_saved = undotree()['seq_cur'] | let b:undo_warned = 0
augroup end
" Remap the keys
nnoremap u :call Undo()<Cr>u
nnoremap <C-r> <C-r>:call Redo()<Cr>
fun! Undo()
" Don't do anything if we can't modify the buffer or there's no filename
if !&l:modifiable || expand('%') == '' | return | endif
" Warn if the current undo sequence is lower (older) than whatever it was
" when opening the file
if !b:undo_warned && undotree()['seq_cur'] <= b:undo_saved
let b:undo_warned = 1
echohl ErrorMsg | echo 'WARNING! Using undofile!' | echohl None
sleep 1
endif
endfun
fun! Redo()
" Don't do anything if we can't modify the buffer or there's no filename
if !&l:modifiable || expand('%') == '' | return | endif
" Reset the warning flag
if &l:modifiable && b:undo_warned && undotree()['seq_cur'] >= b:undo_saved
let b:undo_warned = 0
endif
endfun