अपडेट 2015-06-28 : मैंने एक छोटा बग तय किया , और इसे एक प्लगइन के रूप में जारी किया । प्लगइन कोड थोड़ा बेहतर है, इसमें वह कर्सर को स्थानांतरित करने के बाद फिर से चेतावनी देता है; मैं आपको प्लगइन का उपयोग करने की सलाह देता हूं।
सुपरजेर का जवाब बहुत अच्छा काम करता है, लेकिन दुर्भाग्यपूर्ण साइड-इफेक्ट है कि आप केवल पिछले विम सत्र से परिवर्तन कर सकते हैं, और पिछले सभी विम सत्र नहीं।
ऐसा इसलिए है क्योंकि 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