Actualización 2015-06-28 : arreglé un pequeño error y lo lancé como un complemento . El código del complemento es ligeramente mejor, ya que advierte nuevamente después de mover el cursor; Te recomiendo que uses el complemento.
La respuesta de superjer funciona muy bien, pero tiene el desafortunado efecto secundario de que solo puede deshacer los cambios de la última sesión de Vim, y no todas las sesiones anteriores de Vim.
Esto se debe a que wundo
sobrescribe el archivo de deshacer; No está fusionado. Que yo sepa, no hay forma de arreglar esto.
Así que aquí está mi solución alternativa, mostrará un gran mensaje de advertencia rojo cuando deshaga los cambios del archivo de deshacer.
Esto es similar a la respuesta de Ingo Karkat , pero no requiere un complemento externo y tiene algunas diferencias sutiles (muestra advertencia en lugar de pitido, no requiere que presione u
dos veces).
Nota Este sólo modifica el u
y <C-r>
se une, y no el U
, :undo
y :redo
los comandos.
" 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