Оновлення 2015-06-28 : я виправив невелику помилку та випустив це як плагін . Код плагіна трохи кращий, оскільки він знову попереджає після переміщення курсору; Я рекомендую вам використовувати плагін.
Відповідь супержера чудово працює, але має сумний побічний ефект, що ви можете скасувати зміни лише з останнього сеансу Vim, а не з усіх попередніх сеансів Vim.
Це тому, що wundo
перезаписує файл скасування; це не злито. Наскільки мені відомо, немає способу це виправити.
Тож ось моє альтернативне рішення, воно покаже велике червоне попереджувальне повідомлення, коли ви скасовуєте зміни з файлу скасування.
Це схоже на відповідь Інго Каркат , але він не потребує зовнішнього плагіна і має деякі тонкі відмінності (відображається попередження замість звукового сигналу, не потрібно u
двічі натискати ).
Зверніть увагу , це тільки модифікуємо u
і <C-r>
прив'язується до нього і НЕU
, :undo
і :redo
команді.
" 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