मैं अपने पूर्ववत इतिहास को कैसे छोड़ सकता हूँ?


23

पूर्ववत अच्छा है विम में है। लेकिन कभी-कभी, एक ज्ञात अच्छे बिंदु पर, मैं अपने पूर्ववत इतिहास को मिटा देना चाहता हूं - uव्यक्तिगत परिवर्तनों को पूर्ववत करने में सक्षम होने के लिए , लेकिन केवल एक निश्चित बिंदु पर वापस जाने के लिए। (उदाहरण के लिए, यह तब हो सकता है जब मैंने आखिरी बार प्रतिबद्ध किया हो।)

इसे पूरा करने का एक तरीका फ़ाइल को बंद करना और फिर से खोलना होगा - पूर्ववत इतिहास उस बिंदु पर साफ शुरू होता है। लेकिन यह एक परेशानी है।

अतीत में, मैंने इसे पूरा किया :edit!। लेकिन Vim 7.3 में, यह पूर्ववत इतिहास को नहीं छोड़ता है।

फ़ाइल बंद करने के अलावा, क्या ऐसा करने का कोई और तरीका है?


इसलिए आप वास्तव में फ़ाइल की स्थिति को फिर से स्थापित करना चाहते हैं क्योंकि यह आपकी अंतिम प्रतिबद्धता पर था? आप अनिवार्य रूप से बस 'यू' कुंजी को रीमैप करना चाहते हैं जैसे कुछ git checkout -f fileया hg rollback file?
अकीरा

@akira - नहीं, मैं uव्यक्तिगत परिवर्तनों को पूर्ववत् करने के लिए उपयोग करने में सक्षम होना चाहता हूं , लेकिन उस बिंदु से आगे नहीं बढ़ सकता जहां मैंने आखिरी बार प्रतिबद्ध किया था। वास्तव में, जैसे ही, हर बार जब मैंने प्रतिबद्ध किया, मैंने फ़ाइल को बंद कर दिया और इसे फिर से खोला। जो कि :edit!करने के लिए प्रयोग किया जाता है - यह फ़ाइल को बंद करने और इसे फिर से खोलने जैसा था। यह एक प्रतिबद्ध बिंदु से बंधा हुआ नहीं है, बस यही समय है जब मैं सबसे अधिक बार यह चाहता हूं।
नाथन लॉन्ग

आह, यह समस्या को बहुत स्पष्ट करता है। आपको अपना प्रश्न थोड़ा बदलना चाहिए।
अकीरा

जवाबों:


11
:set undoreload=0 | edit

आपको वही करना चाहिए जो आप पूछ रहे हैं।


1
हा! बस उस सुविधा को बंद कर दें, एह? :) यकीन नहीं कि मुझे यह नोटिस करने में इतना समय क्यों लगा।
नाथन लॉन्ग

7

पुराना: संपादित करें! एक लाइनर में व्यवहार:

:exe "set ul=-1 | e! | set ul=" . &ul

वह काम करता है। क्या आप इसे समझाएंगे?
नाथन लॉन्ग

आदेशों की स्ट्रिंग के अंत में अनओलेवेल्स सेटिंग के मूल्य को मिलाएं (ताकि इसे पुनर्स्थापित किया जा सके) और उन्हें निष्पादित करता है। अधिक जानकारी के लिए दस्तावेज़ देखें: :h :exe, :h :bar, :h :set-args, :h 'ul'और :h :edit!
एल्डरिक

6

बेनोइट का कार्य मेरे लिए काम नहीं आया, लेकिन मुझे विम मैनुअल में कुछ समान मिला, यहां:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

मैंने इसे एक समारोह में थप्पड़ मारा, मेरे vimrc में जोड़ा और यह vim 7.3 पर ठीक काम कर रहा है:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

इसके साथ इस्तेमाल किया जा सकता है :ClearUndo


1
सामान्य रूप से गुंडो प्लगइन और पूर्ववत फ़ाइल पुनः लोड करने के साथ काम करना, यह बात मेरे लिए वास्तव में उपयोगी है। हालाँकि, मैंने दो चीजों को बदल दिया: सामान्य एडिट कमांड के बजाय (जो कि 7.4 पर कुछ एडिट हिस्ट्री छोड़ता है), मैं बस एक एडिट का उपयोग करता हूं! (और पूर्ववत इतिहास को मिटाने से पहले हमेशा लिखें)। ऐसा लगता है कि कुछ आंतरिक सूचियों को ठीक से अपडेट नहीं किया गया है, इसलिए यदि आप गुंडो प्लगइन के साथ इसका उपयोग करना चाहते हैं, तो एक अतिरिक्त संपादन करें! फ़ंक्शंस अंत में इसे बाद में आउट होने से रोका जा सकेगा।
प्लाज़्मा एचएच

@PlasmaHH क्या आप पूर्ववत इतिहास को साफ़ करने के लिए फ़ंक्शन को पोस्ट कर सकते हैं, क्योंकि मुझे समझ में नहीं आया कि आपने क्या बदलाव किया ... (आप शायद उन लोगों के लिए एक उत्तर के रूप में पोस्ट कर सकते हैं जो गुंडू का उपयोग करते हैं)। धन्यवाद
बेन

5

शायद:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

(के 'ul'लिए उर्फ ​​है 'undolevels')।


यह काम! अब मैं एक ही कमांड बनाने की कोशिश कर रहा हूं - अधिमानतः :edit!। एक शुरुआत के रूप में, मैंने आपके द्वारा सूचीबद्ध आदेशों के साथ ClearUndos () नामक एक फ़ंक्शन बनाया है, लेकिन इसे कॉल करने से कुछ भी नहीं लगता है, जबकि कमांड व्यक्तिगत रूप से करते हैं ...
नाथन लांग

3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
बेनोइट

क्या इसका मतलब फ़ंक्शन की सामग्री है? यह मेरे लिए काम नहीं कर रहा है, लेकिन शायद मैंने गलत समझा। इसके अलावा - शायद इसे अपने स्वयं के उत्तर में स्थानांतरित करें?
नाथन लॉन्ग

हो सकता है कि आप |कमांड सामग्री में कच्चे नहीं डाल सकते । फिर एक फ़ंक्शन बनाएं जो मैंने अपने उत्तर में बताया है, और कमांड को सेट करें call thefunction()
बेनोइट

3

"पूर्ववत इतिहास को साफ़ करें (यदि प्रस्तुत की गई पूर्ववत फ़ाइल को साफ़ करने के लिए w)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • जब आप 'पूर्ववत्' को -1 पर सेट करते हैं, तो पूर्ववत जानकारी को तुरंत मंजूरी नहीं दी जाती है, यह अगले बदलाव पर होता है, अर्थात m-1, जो वास्तव में आपके पाठ को नहीं बदलता है।
  • जब पूर्ववत फ़ाइल, या श्रृंखला को साफ़ करने के लिए 'undofile'चालू है ।:wUndoClear|w

1

एक स्क्रिप्ट में:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

फिर :Resetइसे कॉल करने के लिए उपयोग करें।


आपके फ़ंक्शन की परिभाषा रेखा की जरूरत () अंत में है।
नाथन लॉन्ग

यह अजीब है - उन आदेशों को चलाना व्यक्तिगत रूप से ठीक काम करता है, और पूरे फ़ंक्शन के मानों को गूंजने से पता चलता है कि वे उचित रूप से सेट और अनसेट हैं। लेकिन फ़ंक्शन को चलाने से मेरा पूर्ववत इतिहास रीसेट नहीं होता है - बाद में, मैं अभी भी कई बार पूर्ववत कर सकता हूं। हो सकता है set ul=कि स्क्रिप्ट के बाहर निकलने तक कमांड केवल एक स्थानीय वैरिएबल को प्रभावित करती हो, और जब से हम स्क्रिप्ट के बाहर निकलने से पहले इसे बदलते हैं, यह पर्यावरण को कभी प्रभावित नहीं करता है? क्या आपने इस फ़ंक्शन का परीक्षण किया और यह काम किया है - अर्थ, क्या मेरे सेटअप के बारे में कुछ अजीब है?
नाथन लॉन्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.