更新2015-06-28:小さなバグを修正し、これをプラグインとしてリリースしました。プラグインのコードは、カーソルを移動した後に再び警告するという点でわずかに優れています。プラグインを使用することをお勧めします。
superjerからの回答は非常に効果的ですが、残念なことに副作用があり、元のVimセッションすべてではなく、最後のVimセッションからの変更のみを取り消すことができます。
これはwundo
、取り消しファイルが上書きされるためです。マージされません。私の知る限り、これを修正する方法はありません。
だからここに私の代替ソリューションは、元に戻すファイルから変更を元に戻すときに大きな赤い警告メッセージが表示されます。
これはIngo Karkatの回答に似ていますが、外部プラグインを必要とせず、微妙な違いがあります(ビープ音の代わりに警告を表示し、u
2回押す必要はありません)。
この注意のみ修正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