विम में पूर्ववत ग्रैन्युलैरिटी कैसे बदलें?


11

मेरे कहने पर किसी समय मेरा वीम एक पूरा शब्द पूर्ववत कर देगा u

[i]typing some words[C-c][u]

में परिणाम होगा

typing some

हालांकि, एक बार में एक अक्षर को हटाने के लिए पूर्ववत ग्रैन्युलैरिटी बदल गई लगती है।

[i]typing some words[C-c][u]

का परिणाम

typing some word

मुझे याद है कि प्रैक्टिकल विम में पूर्ववत ग्रैन्युलैरिटी को अनुकूलित करने के बारे में कुछ पढ़ा है, लेकिन मुझे याद नहीं है कि इसे कैसे नियंत्रित किया जाए। किसी भी मदद की सराहना की!


2
आपके vimrc में कुछ ऐसा है जो ऐसा करता है। मैं इसे दोहरा नहीं सकता, और :helpइसके बारे में फ़ाइलों में कुछ भी नहीं ढूँढ सकता ... देखें: मैं अपनी विम फ़ाइल को कैसे डीबग करूँ? ... इसके अलावा, <C-c>एक्सर्ट इन्सर्ट से बाहर निकलने के साइड-इफेक्ट्स हो सकते हैं (इसे देखें ) और समस्या का हिस्सा हो सकता है ... मैं सुझाव Esc<C-[>
दूंगा

जवाबों:


11

मैन्युअल रूप से पूर्ववत क्रम को तोड़ना

आप मैन्युअल रूप से सम्मिलित करें मोड में पूर्ववत क्रम को तोड़ सकते हैं <C-G>u। से मदद :

CTRL-G u        break undo sequence, start new change

उदाहरण

iHello<C-G>u world!<Esc>u

यह आपको पाठ के साथ छोड़ देगा

Hello

आज्ञाओं का टूटना

i                           " Enter Insert mode
 Hello                      " Type 'Hello'
      <C-G>u                " Break the undo sequence
             world!         " Type ' world!'
                   <Esc>    " Return to Normal mode
                        u   " Undo

स्वचालित समाधान

महीन-दाने वाला पूर्ववत नियंत्रण

यहाँ VimScript का एक छोटा सा स्निपेट है जो <C-G>uटेक्स्ट को डिलीट करने के दौरान पूर्ववत ब्रेक बनाने के लिए उपयोग करता है, और जब आप डिलीट करने के बाद फिर से टेक्स्ट डालना शुरू करते हैं।

function! s:start_delete(key)
    let l:result = a:key
    if !s:deleting
        let l:result = "\<C-G>u".l:result
    endif
    let s:deleting = 1
    return l:result
endfunction

function! s:check_undo_break(char)
    if s:deleting
        let s:deleting = 0
        call feedkeys("\<BS>\<C-G>u".a:char, 'n')
    endif
endfunction

augroup smartundo
    autocmd!
    autocmd InsertEnter * let s:deleting = 0
    autocmd InsertCharPre * call s:check_undo_break(v:char)
augroup END

inoremap <expr> <BS> <SID>start_delete("\<BS>")
inoremap <expr> <C-W> <SID>start_delete("\<C-W>")
inoremap <expr> <C-U> <SID>start_delete("\<C-U>")

टिप्पणियाँ

यह काम करेगा <BS>, <C-W>(एक शब्द को हटाएं), और <C-U>(पंक्ति की शुरुआत को हटाएं)। यदि इन्सर्ट मोड में डिलीट करने के और भी तरीके inoremapहैं, तो अंत में अतिरिक्त कॉल जोड़कर उनका समर्थन किया जा सकता है ।


4
केवल समस्या यह है, कि आप बाद में पूर्ववत् नहीं होंगे (अन्यथा आप इसे पहली जगह में नहीं करेंगे)। तो आप आमतौर पर एक ऐसी स्थिति के साथ समाप्त होते हैं जहां आप चाहते हैं कि आपने उपयोग किया था <C-G>u, जो पहले ही बहुत देर हो चुकी है।
शहबाज़

4
हाँ। वास्तव में कुछ मुझे याद आ रहा है यह है। कभी-कभी मैं ऐसा करता हूं iकि लंबे वाक्य के बाद जो मैंने लिखा है उसका हिस्सा निकालने के लिए बैकस्पेस द्वारा। तब मुझे एहसास हुआ कि मुझे पीछे नहीं हटना चाहिए था और जो मैंने लिखा था वह ठीक था। मैं पूर्ववत करता हूं, लेकिन फिर संपूर्ण सम्मिलित पाठ पूर्ववत हो जाता है। इसलिए या तो मैं लंबे वाक्य में से किसी के साथ छोड़ दिया गया हूं, या वह हिस्सा जो बैकस्पेस नहीं है। पीछे के हिस्से को वापस लाना असंभव है। वहाँ एक तरीका बताने के लिए उलटी करना है बैकपैक पर पूर्ववत अनुक्रम को तोड़ने के लिए? (अब जब मैं कहता हूं, mapआईएनजी बैकस्पेस एक विकल्प है)।
शहबाज़

2
भविष्य के आगंतुकों के लिए, मैंने यह भी जोड़ा inoremap <CR> <C-G>u<CR>ताकि प्रत्येक पूर्ववत एक ही पंक्ति के भीतर समाहित रहे (पूरे अनुच्छेद को पूर्ववत न करने से जो आप नॉनस्टॉप टाइप कर रहे थे)।
शहबाज

1
@ शहबाज, बिल्कुल :)
tomcdo

1
@ शहबाज "क्या मुझे कॉपी करने की अनुमति है?" पृष्ठ के नीचे लिंक देखें: "उपयोगकर्ता योगदान के साथ सीसी बाय-सा 3.0 के तहत लाइसेंस प्राप्त करना आवश्यक है"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.