ปรับปรุง 2015/06/28 : ผมแก้ไขข้อผิดพลาดเล็ก ๆ และปล่อยออกมานี้เป็นปลั๊กอิน รหัสปลั๊กอินจะดีกว่าเล็กน้อยซึ่งจะเตือนอีกครั้งหลังจากเลื่อนเคอร์เซอร์ ฉันขอแนะนำให้คุณใช้ปลั๊กอิน
คำตอบจากsuperjer ใช้งานได้ดี แต่มีผลข้างเคียงที่โชคร้ายที่คุณสามารถยกเลิกการเปลี่ยนแปลงจากเซสชัน Vim ล่าสุดเท่านั้นและไม่ใช่เซสชัน Vim ก่อนหน้าทั้งหมด
นี่เป็นเพราะwundo
เขียนทับไฟล์เลิกทำ มันไม่ได้ผสาน เท่าที่ฉันรู้ไม่มีวิธีแก้ไขปัญหานี้
ดังนั้นนี่คือโซลูชันทางเลือกของฉันมันจะแสดงข้อความเตือนสีแดงขนาดใหญ่เมื่อคุณเลิกทำการเปลี่ยนแปลงจากไฟล์เลิกทำ
สิ่งนี้คล้ายกับคำตอบของ Ingo Karkatแต่ไม่ต้องการปลั๊กอินภายนอกและมีความแตกต่างเล็กน้อย (แสดงคำเตือนแทนการส่งเสียงบี๊บคุณไม่ต้องกด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