Cập nhật 2015-06-28 : Tôi đã sửa một lỗi nhỏ và phát hành dưới dạng plugin . Mã plugin tốt hơn một chút, trong đó nó cảnh báo lại sau khi di chuyển con trỏ; Tôi khuyên bạn nên sử dụng plugin.
Câu trả lời từ superjer hoạt động rất tốt, nhưng có tác dụng phụ đáng tiếc là bạn chỉ có thể hoàn tác các thay đổi từ phiên Vim cuối cùng chứ không phải tất cả các phiên Vim trước đó.
Điều này là do wundo
ghi đè tập tin hoàn tác; nó không được hợp nhất. Theo tôi biết, không có cách nào để khắc phục điều này.
Vì vậy, đây là giải pháp thay thế của tôi, nó sẽ hiển thị một thông báo cảnh báo lớn màu đỏ khi bạn hoàn tác các thay đổi từ tệp hoàn tác.
Điều này tương tự như câu trả lời của Ingo Karkat , nhưng nó không yêu cầu plugin bên ngoài và có một số khác biệt tinh tế (hiển thị cảnh báo thay vì tiếng bíp, không yêu cầu bạn nhấn u
hai lần).
Lưu ý đây chỉ Sửa đổi u
và <C-r>
với phím tắt, và không những U
, :undo
và :redo
lệnh.
" 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