Emacs के साथ 'पूर्ववत करें' के बाद आप 'पुनः' कैसे बदलते हैं?


268

इस लेख में कहा गया है कि "Emacs में रिडो है क्योंकि आप पूर्ववत करते समय दिशा को उलट सकते हैं, जिससे पूर्ववत करें"।

इसका क्या मतलब है? एक उपयोगकर्ता Emacs के साथ 'फिर से' कैसे कर सकता है?


3
स्वीकृत उत्तर के नीचे का उत्तर आपको बताता है कि , यदि आप इस उत्तर को देख रहे हैं, तो, यह देखते हुए कि यह कैसे लिखा गया है, मैं उम्मीद करूंगा कि अधिकांश लोग वास्तव में उसी की तलाश करेंगे।
हारून हॉल

मैं सिर्फ स्पेस बार से टकराता हूं, और फिर उसके बाद उस स्थान पर पूर्ववत करें और अपने द्वारा किए गए पूर्ववत को फिर से समाप्त करें और जब तक यह समाप्त नहीं हो जाता है और फिर से वापस जाने लगता है ... मुझे पता है कि बहुत अधिक जटिल तरीके हैं, लेकिन यह तेज है और आसान है, और यह है कि मैं कैसे रोल करता हूं।
nroose

जवाबों:


294

लघु संस्करण: पूर्ववत पूर्ववत करने से। यदि आप पूर्ववत करते हैं, और फिर एक गैर-संपादन आदेश जैसे कि C-f, तब अगला पूर्ववत पूर्ववत करें, जिसके परिणामस्वरूप फिर से होगा।

लंबा संस्करण:

आप संचालन के ढेर पर संचालन के रूप में पूर्ववत करने के बारे में सोच सकते हैं। यदि आप C-fपूर्ववत संचालन के अनुक्रम के बाद कुछ कमांड (यहां तक ​​कि नेविगेशन कमांड जैसे ) करते हैं, तो सभी पूर्ववत ऑपरेशन स्टैक पर धकेल दिए जाते हैं। तो अगला पूर्ववत अंतिम आदेश को पूर्ववत करता है। मान लें कि आपके पास एक ऑपरेशन अनुक्रम है जो इस तरह दिखता है:

  1. "फू" डालें
  2. "बार" डालें
  3. "मुझे स्पैम से प्यार है" डालें

अब, आप पूर्ववत करें। यह अंतिम क्रिया को पूर्ववत करता है, जिसके परिणामस्वरूप निम्न सूची है:

  1. "फू" डालें
  2. "बार" डालें

यदि आप इस बिंदु पर पूर्ववत के अलावा कुछ करते हैं - कहते हैं, C-fऑपरेशन स्टैक इस तरह दिखता है:

  1. "फू" डालें
  2. "बार" डालें
  3. "मुझे स्पैम से प्यार है" डालें
  4. पूर्ववत करें "मुझे स्पैम से प्यार है"

अब, जब आप पूर्ववत करते हैं, तो पहली चीज जो पूर्ववत है वह पूर्ववत है। अपने मूल स्टैक (और दस्तावेज़ स्थिति) में परिणाम:

  1. "फू" डालें
  2. "बार" डालें
  3. "मुझे स्पैम से प्यार है" डालें

यदि आप पूर्ववत अनुक्रम को तोड़ने के लिए एक संशोधित कमांड करते हैं, तो उस कमांड को पूर्ववत के बाद जोड़ा जाता है और इस प्रकार बाद में पूर्ववत किया जाना पहली बात है। मान लीजिए कि आपने मारने के बजाय "बार" पर बैकस्पेस दिया है C-f। तब आप होते

  1. "फू" डालें
  2. "बार" डालें
  3. "मुझे स्पैम से प्यार है" डालें
  4. पूर्ववत करें "मुझे स्पैम से प्यार है"
  5. "बार" हटाएं

यह जोड़ने / फिर से जोड़ने से ऐड इनफ़िनिटम होता है। इसका उपयोग करने में थोड़ा सा समय लगता है, लेकिन यह वास्तव में Emacs को एक अत्यधिक लचीला और शक्तिशाली पूर्ववत / पुनर्परिभाषित करता है।


117
बस अगर यह कष्टप्रद लगता है, तो प्रमुख लाभ यह है कि आप हमेशा पिछली स्थिति में वापस आ सकते हैं। अधिकांश संपादकों में, कई बदलावों को पूर्ववत करते हुए और फिर गलती से एक चरित्र टाइप करने से आप 'फंसे' छोड़ देंगे, जिसे आपने पूर्ववत नहीं किया था। Emacs यह तुच्छ बनाता है।
फिल्स

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

25
यह कष्टप्रद लगता है।
फेलिप

13
मुझे नहीं पता कि यह जवाब क्यों स्वीकार किया गया जब यह आपको HOW भी नहीं बताता ।
हारून हॉल

8
अफसोस की बात है कि यह उत्तर उस कमांड के बारे में कुछ नहीं कहता है जो Cg C- / है।
विष्णुप्रशांत

211

पूर्ववत करने के लिए: C-_

पूर्ववत करने के बाद फिर से करना: C-g C-_

C-_ जो पूर्ववत किया गया है उसे फिर से करने के लिए कई बार टाइप करें C-_ एक इमैक कमांड को कई बार रिड्यूस करने के लिए, अपने कमांड को निष्पादित करें C-xzऔर फिर zकमांड को दोहराने के लिए कुंजी पर कई बार टाइप करें (दिलचस्प है जब आप कई बार मैक्रो को निष्पादित करना चाहते हैं)


4
सामान को दोहराने के लिए आप भी उपयोग कर सकते हैं C-u, उदाहरण के लिए C-u 8 *(आठ को सम्मिलित करता है जहां कैरेट है)। तो आप x चरणों C-u x C-_को पूर्ववत करने के लिए उपयोग कर सकते हैं ।
पैट्रिक

10
इसका मूल प्रश्न से कोई लेना-देना नहीं है, लेकिन एक कीबोर्ड मैक्रो (के साथ C-x e) निष्पादित करने के ठीक बाद , आप बस इसे eजितनी बार आपको फिर से निष्पादित करने की आवश्यकता होती है उतनी बार दबा सकते हैं ।
क्रिश्चियन बर्ग

7
इसके अलावा, C-/और इसके अलावा C-x uवैकल्पिक पूर्व कुंजी बाइंडिंग हैं C-_। मैं पसंद करता हूं C-/क्योंकि हिट करना आसान है।
रोरी ओ'केन

8
चेतावनी: जब यह उत्तर कहता है कि C-g C-_"पूर्ववत करने के बाद फिर से करें", यह केवल पहली बार जब आप संयोजन को हिट करते हैं तब लागू होता है। उसके बाद, बिना अपने पूर्ववत कुंजी को दोहराएं C-g। तो पूर्ववत करने के बाद तीन बार दाईं ओर फिर से टाइप करने के लिए C-g C-_ C-_ C-_। यदि आप टाइप करते हैं C-g C-_ C-g C-_ C-g C-_, तो आप बस हलकों में घूमेंगे, अपने पूर्ववत के अपने फिर से करना ...
रोरी ओ'केन

@ RoryO'Kane मुझे emacs के बारे में ज्यादा जानकारी नहीं है, इसलिए कृपया मुझे सही करें जहां मैं गलत हूं, लेकिन यह देखते हुए कि Cg C-_ का फिर से होने के बाद कोई प्रभाव नहीं पड़ता है, क्या ऐसा हो सकता है क्योंकि यह केवल बाद में संचालित होता है एक पूर्ववत (अपने पूर्ववत की तरह "पूर्ववत करने के बाद फिर से करें" ऐसा लगता है। इसलिए यह इतना नहीं है कि यह एक पूर्ववत या फिर से शुरू करने वाले हलकों में जा रहा है आदि यह कुछ भी नहीं कर रहा है क्योंकि एक पूर्ववत बस से पहले नहीं किया गया था। _ छग सी-_ एक सर्कल में पहले एक के बाद नहीं जा रहा है, यह सचमुच कुछ भी नहीं कर रहा है।
barlop

56
  • एक बार पूर्ववत करने के लिए :C-/
  • दो बार पूर्ववत करने के लिए: C-/ C-/
  • पूर्ववत करने के तुरंत बाद, एक बार फिर से करने के लिए :C-g C-/
  • पूर्ववत करने के तुरंत बाद दो बार फिर से करना C-g C-/ C-/:। ध्यान दें कि C-gदोहराया नहीं गया है।
  • करने के लिए पूर्ववत तुरंत फिर से , एक बार:C-g C-/
  • दो बार तुरंत फिर से पूर्ववत करने के लिए: C-g C-/ C-/
  • फिर से करने के लिए , वही ...

यदि आपने अपने पिछले पूर्व कमांड के बाद से कोई कुंजी (चाहे टाइपिंग कैरेक्टर या सिर्फ कर्सर हिलाना) दबाया है, तो C-gआपके अगले पूर्ववत / फिर से टाइप करने की कोई आवश्यकता नहीं है ।C-gकेवल हिट करने के लिए एक सुरक्षित कुंजी है जो अपने आप पर कुछ भी नहीं करता है, लेकिन आपके पूर्ववत अनुक्रम के अंत को इंगित करने के लिए एक गैर-पूर्व कुंजी के रूप में गिना जाता है। एक अन्य कमांड जैसे कि C-fबहुत काम करेगा; यह सिर्फ इतना है कि यह कर्सर को वहां से ले जाएगा जहां आपके पास था।

C-gजब आप हिट करते हैं या जब आप का मतलब नहीं था, और आप अब गलत दिशा में पूर्ववत कर रहे हैं, तो बस C-gफिर से अपनी दिशा को उलटने के लिए मारा । आप अपने आकस्मिक रेडोस के माध्यम से सभी तरह से पूर्ववत करना होगा और आप चाहते हैं पूर्ववत करने के लिए पूर्ववत करें, लेकिन यदि आप बस मारते रहेंगे C-/, तो आप अंततः उस राज्य तक पहुंच जाएंगे जो आप चाहते हैं। वास्तव में, हर राज्य में बफर कभी भी पहुंच में रहा है, अगर आप हिट करते हैंC-g एक बार और फिर C-/पर्याप्त समय दबाते हैं।

के लिए वैकल्पिक शॉर्टकट undo, अन्य की तुलना में C-/, कर रहे हैं C-_, C-x uऔरM-x undo

Emacs के पूर्ववत सिस्टम पर अधिक विवरण के लिए Emacs मैन्युअल में पूर्ववत देखें ।


38

अधिक सामान्य पूर्ववत / पुनः कार्यक्षमता के इच्छुक लोगों के लिए, किसी ने लिखा है undo-tree.el। यह गैर-एमाक्स का रूप और अनुभव प्रदान करता है, लेकिन यह पूर्ववत इतिहास के संपूर्ण 'वृक्ष' तक पहुंच प्रदान करता है।

मुझे Emacs की अंतर्निहित पूर्ववत प्रणाली पसंद है, लेकिन इस पैकेज को बहुत सहज होना चाहिए।

यहाँ फाइल से ही टिप्पणी है:

Emacs में एक शक्तिशाली पूर्ववत प्रणाली है। अधिकांश सॉफ़्टवेयर में मानक पूर्ववत / फिर से करें प्रणाली के विपरीत, यह आपको किसी भी पुनर्प्राप्त करने की अनुमति देता है बफर के पिछले राज्य (जबकि मानक पूर्ववत करें / फिर से करें प्रणाली आपको पुनः प्राप्त करते ही पिछले राज्यों को खो सकती है)। हालांकि, यह शक्ति एक मूल्य पर आती है: कई लोग Emacs के पूर्ववत सिस्टम को भ्रामक और उपयोग करने में मुश्किल पाते हैं, कई पैकेजों को पैदा करते हैं जो इसे कम शक्तिशाली लेकिन अधिक सहज पूर्ववत / फिर से व्यवस्थित प्रणाली से बदल देते हैं।

दोनों मानक पूर्ववत / फिर से डेटा के साथ नुकसान, और Emacs पूर्ववत की उलझन, परिवर्तन के रैखिक अनुक्रम के रूप में पूर्ववत इतिहास का इलाज करने की कोशिश से स्टेम। यह। इस पैकेज द्वारा प्रदान किया गया `पूर्ववत-वृक्ष-मोड 'Emacs के पूर्ववत प्रणाली को एक ऐसे सिस्टम से बदल देता है जो पूर्ववत इतिहास का इलाज करता है क्योंकि यह है: परिवर्तनों की एक शाखा वृक्ष। यह सरल विचार मानक पूर्ववत / पुनः प्रणाली के अधिक सहज व्यवहार को किसी भी इतिहास को कभी नहीं खोने की शक्ति के साथ जोड़ा जा सकता है। एक अतिरिक्त पक्ष बोनस यह है कि कुछ मामलों में पूर्व इतिहास को अधिक कुशलता से संग्रहित किया जा सकता है, जिससे Emacs इतिहास को त्यागना शुरू करने से पहले और अधिक बदलावों को जमा कर सकता है।


3
बहुत खुबस! किसने कहा कि पूर्ववत emacs अथाह था? :-)
पीटर।

गजब का! वैचारिक रूप से ध्वनि और उपयोगकर्ता सहज। यह डिफ़ॉल्ट पैकेजों में होना चाहिए। एक टिप्पणी: काश, कुछ चेतावनी संदेश तब भी दिखाए जाते जब शाखा बिंदु से पुन: लोड हो रहा हो, न कि केवल उस पर वापस लौटते समय। उदाहरण के लिए, जब उपयोगकर्ता किसी redo को कॉल करता है: 'एक शाखा बिंदु से रीडिंग' या 'डिफ़ॉल्ट redo शाखा का उपयोग किया जाता है' - बस उपयोगकर्ता को सचेत करने के लिए कि एक से अधिक शाखाएँ हैं।
बेसल शिशानी

1
इस समस्या के लिए एक और दृष्टिकोण जो लागू करने के लिए बहुत सरल है और एक विज़ुअलाइज़र की आवश्यकता नहीं है, केवल अंतिम शाखा बिंदु रखना है, और 3 कमांड प्रदान करना है: पूर्ववत करना, फिर से करना, स्विच-शाखा। जब शाखा हिट होती है, तो पूर्ववत करें / फिर से करें, और स्विच-शाखा तभी स्विच करेगी यदि शाखा में कोई अन्य शाखा 'संदेश नहीं' जारी करती है। यदि ब्रांचिंग किसी भी समय होती है, तो पिछला शाखा बिंदु खो जाता है। यह राज्य की हानि की समस्या को काफी अच्छी तरह से और न्यूनतम जटिलता पर हल करेगा।
बासल शिशानी

1
खबरदार इसके लिए एक लंबे समय से खड़े बग को फिर से करें जो बेतरतीब ढंग से विफल हो सकते हैं: github.com/syl20bnr/spacemacs/issues/9903 - 2014 के बाद से ज्ञात
ideasman42

@ ideasman42 जाहिर तौर पर यह "नॉन-बग" है: dr-qubit.org/Lost_undo-tree_history.html
दलेर

19

रेडो ​​के लिए एक पूर्व -पेड़ क्वर्क से सावधान रहें !

कई लोकप्रिय "स्टार्टर किट" (प्रस्तावना, पर्ससेल, स्पेसमैक्स) पूर्ववत पेड़ के साथ बंडल में आते हैं। अधिकांश (सभी?) भी इसे सक्षम करते हैं। जैसा कि उल्लेख किया गया है, पूर्ववत करें यह पूर्ववत / पुनर्वसु वृक्ष की कल्पना और आघात का एक आसान तरीका है। प्रस्तावना भी इसे एक कुंजी-राग ( uu), और भी देती हैC-x u

समस्या यह है कि पूर्ववत करें, इमको के डिफ़ॉल्ट और पुनर्विचार के लिए प्रसिद्ध बंधन को मिटा देता है :C-g C-/

इसके बजाय, आप पूर्ववत् / फिर से करने के लिए इन सममित कुंजियों का उपयोग कर सकते हैं :

C-/     undo
C-S-/   redo

ये तब से उपयोगी हैं जब तक कि आप विज़ुअलाइज़र को खोले बिना जल्दी से फिर से करना चाहते हैं।


यह। मैं Spacemacs का उपयोग कर रहा हूं और यह पता नहीं लगा सका कि यह मेरे लिए काम क्यों नहीं कर रहा था। धन्यवाद!
मझौली

11

मुझे "सामान्य" पूर्ववत / फिर से करने के लिए अत्यधिक redo.elउपयोगी लगता है , और मैं आमतौर पर सीएसज़ और पूर्ववत सीज़ेड के लिए इस तरह से बांधता हूं:

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

बस फ़ाइल डाउनलोड करें, इसे अपने लिस्प-पथ में डालें और अपने में उपरोक्त पेस्ट करें .emacs


Redo.el के हेडर में टिप्पणियों का कहना है कि यह XEmacs के लिए बनाया गया है। क्या GNU Emacs और अन्य संबंधित Emacsen में इसका उपयोग करने में कोई समस्या है?
ए। लेवी

मुझे अभी तक कोई समस्या नहीं है, और मैं इसे कम से कम 6 महीने के लिए इस्तेमाल कर रहा हूँ :)
मोनोटक्स

4
से emacswiki.org/emacs/RedoMode : हालांकि, redo.el आउट-ऑफ-तिथि है और अक्सर "बफ़र क्योंकि 'आदिम-पूर्ववत' के व्यवहार वर्ष एक से थोड़ा अलग हो चुके हैं Emacs 22. RedoPlus है की सामग्री को नष्ट कर देता है Redo.el का एक कांटा और Emacs के नए संस्करण में सही ढंग से काम करता है। आप यहां RedoPlus प्राप्त कर सकते हैं: emacswiki.org/emacs/redo+.el
rofrol

2

Emacs 28 एक redo कमांड (कहा जाता है undo-redo) जोड़ता है

यदि आप अधिक विशिष्ट पूर्ववत / फिर से करना चाहते हैं, तो निम्न आदेशों का उपयोग किया जा सकता है।

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)

1

यदि आप अंतिम ऑपरेशन को फिर से करना चाहते हैं, तो निम्न कार्य करें।

  1. ESC
  2. एक और पूर्ववत करें ( C + /)

0

डिफ़ॉल्ट रूप से, Emacs में redo को Cg को दबाने की आवश्यकता होती है, फिर पूर्ववत करें।

हालाँकि यह संभव है कि Emacs इन-बिल्ट इन-द इनटू इन द रिडो कमांड को भी लागू करने के लिए।

पैकेज पूर्ववत करें , पूर्ववत और फिर से दोनों को उजागर करने के लिए अंतर्निहित कार्यक्षमता में Emacs का उपयोग करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.