बिना सूचना के एक बफर को कैसे संशोधित किया जाए?


11

प्रश्न: मैं बिना किसी सूचना के बफर में टेक्स्ट कैसे प्रविष्ट / संशोधित कर सकता हूँ undo?

यहाँ उपयोग मामला है। मेरे पास प्रत्येक फ़ाइल के प्रारंभ में एक टिप्पणी ब्लॉक है, जो अन्य चीजों के अलावा, फ़ाइल के सबसे हाल के परिवर्तन के लिए टाइमस्टैम्प को अपडेट करता है। मैं undoसुविधाओं के बिना उस टाइमस्टैम्प को संशोधित करने में सक्षम होना चाहता हूं ।

मैं undoयहां शॉर्ट-सर्किट का कारण चाहता हूं कि निम्नलिखित एज केस के कारण है, जो लाटेक्स दस्तावेजों को संपादित / संकलित करते समय आता है (और शायद अन्य, लेकिन यह वह है जो मुझे सबसे अधिक बार पागल करता है):

  1. यह देखने के लिए फ़ाइल में एक छोटा सा बदलाव करें कि यह संकलित डॉक को कैसे प्रभावित करेगा
  2. फ़ाइल सहेजें (जो टाइमस्टैम्प को अपडेट करता है)
  3. latexफ़ाइल पर चलाएँ
  4. निर्णय लें कि परिवर्तन एक बुरा है
  5. undo बदलाव

चरण (5) ( undo) में समस्या यह है कि यह चरण (1) में किए गए परिवर्तन को पूर्ववत नहीं करता है, बल्कि चरण (2) में टाइमस्टैम्प अपडेट को पूर्ववत करता है। यह मुझे परेशान नहीं करेगा (मैं undoफिर से कर सकता हूं ) सिवाय इसके कि यह फ़ाइल के शीर्ष पर टाइमस्टैम्प के लिए सभी तरह से आगे बढ़ता है, जो वास्तविक मूल परिवर्तन से लगभग हमेशा कई, कई लाइनों दूर है। यह बहुत घबराहट है और मेरी एकाग्रता को पूरी तरह से तोड़ देता है।

मैं उस फ़ाइल के संबंध में प्रश्न पूछ रहा हूं जो मैं देख रहा हूं, लेकिन यह आम तौर पर बफ़र्स को संशोधित करने के बारे में अधिक है।

तो: मैं undoएक बफर में विशिष्ट संशोधन को नोटिस करने से कैसे रोक सकता हूं ?


1
यह आपके पूर्ववत् प्रश्न से संबंधित नहीं है, लेकिन यह "पूर्ववत बिंदु को आगे बढ़ाता है" समस्या के साथ मदद कर सकता है: stackoverflow.com/a/20510025/1279369
नानी

2
क्या यह सबसे अच्छा नहीं होगा अगर यह तारीख-स्टाम्प परिवर्तन पूर्ववत इतिहास में सबसे हाल के आइटम के साथ जोड़ा गया हो? इस तरह से undoदोनों को पूर्ववत किया जाएगा।
मालाबार

मुझे लगता है कि आप वास्तव में क्या चाहते हैं atomic-change-group

@ जॉन: यह कैसे मदद करेगा? समूह में दो बदलावों को अलग-अलग कमांडों द्वारा ट्रिगर किया जाता है: एक "छोटा परिवर्तन" (जैसे एक प्रविष्टि) और बचत करते समय किए गए समय टिकट का अद्यतन।
गाइल्स का SO- बुराई पर रोक '

ध्यान दें कि किसी कारण के लिए मौजूदा उत्तरों में इन तरीकों में से कोई भी मेरे लिए काम नहीं करता है, हालांकि यह उत्तर एक with-undo-collapseमैक्रो को परिभाषित करता है जो बहुत उपयोगी था: emacs.stackexchange.com/a/7560/2418
ideasman42

जवाबों:


6

@ stsquad का जवाब मुझे सही रास्ते पर मिला। मूल रूप से, चरण हैं:

  1. सहेजें buffer-undo-list
  2. अक्षम undo
  3. अपना काम करो
  4. पुनः सक्षम करें undoऔर पुनर्स्थापित करेंbuffer-undo-list

तो यहाँ इस तरह के एक समारोह का एक स्केच है:

(defun disable-undo-one-off ()
  (let ((undo buffer-undo-list))        ; save the undo list
    (buffer-disable-undo)               ; disable undo
    (do-some-stuff)                     ; do your thing
    (buffer-enable-undo)                ; re-enable undo
    (setq buffer-undo-list undo)))      ; restore the undo list

संपादित करें: वास्तव में, यह पता चला है कि एक सरल समाधान अभी भी let-bind है buffer-undo-listताकि letमूल सूची के बहाल होने पर क्लोएबर्ड के शरीर में सूची में परिवर्तन हो:

(defun disable-undo-one-off ()
  (let (buffer-undo-list)
    (do-some-stuff)))

इसके साथ मुख्य सीमा यह है कि यह उन संशोधनों के लिए काम करता है जो बफर में वर्णों की संख्या में परिवर्तन नहीं करते हैं (उदाहरण के लिए, "बिल्ली के बच्चे" को "पिल्लों" में बदल रहे हैं, लेकिन "बिल्लियों") नहीं, क्योंकि अन्यथा पूर्ववत करें सूची में अब गलत बिंदुओं का जिक्र है। इसलिए, यह केवल एक आंशिक समाधान है


तुम लपेटना चाहते हो सकता है कि एक मामले की रक्षा के मामले में आप अपनी बात के माध्यम से गतिविधि के बीच से बाहर तोड़। मुझे नहीं पता था कि आप यह सब एक फंक्शन में कर रहे हैं, जो सामान का ट्रैक रखना आसान बनाता है।
stsquad 15

क्या आप पूर्ववत इतिहास (और यदि संभव हो, तो इतिहास को अद्यतन नहीं करने के लिए) समय-स्टैम्प अद्यतन के समाधान में जोड़ सकते हैं?
कौशल मोदी 15

@stsquad: अच्छा विचार, बाद में ऐसा करने की कोशिश करेगा। फ़ंक्शंस पर टिप-ऑफ़ के लिए फिर से धन्यवाद और प्रश्न में सूची।
दान

@kaushalmodi: स्पष्ट प्रश्न: क्या आप वास्तविक टाइमस्टैम्प अपडेट फ़ंक्शन देखना चाहते हैं?
दान

@ देखें कि पूर्ववत या बिंदु इतिहास को अद्यतन नहीं करने के लिए टाइमस्टैम्प अपडेट फ़ंक्शन को कैसे संशोधित किया जाए।
कौशल मोदी

3

एक पूर्ववत ऑपरेशन पूर्ववत सूची से कई तत्वों को जोड़ता है । nilसूची में एक प्रविष्टि दो परिवर्तन समूहों के बीच की सीमा को चिह्नित करती है। nilसूची की शुरुआत में हटाकर जो स्वचालित रूप से टॉपवेल लूप द्वारा डाला जाता है, आप अंतिम बफर परिवर्तन के साथ टाइमस्टैम्प अपडेट को समूहित कर सकते हैं, जो तकनीकी रूप से आपके अनुरोध से मेल नहीं खाता है लेकिन व्यावहारिक रूप से आपके परिदृश्य में समस्या को हल करना चाहिए।

(defun time-stamp-group-undo ()
  (if (eq nil (car buffer-undo-list))
      (setq buffer-undo-list (cdr buffer-undo-list)))
  (time-stamp))

(चेतावनी: अप्रयुक्त, पूर्ववत सूची में अधिक मालिश की आवश्यकता हो सकती है।)

टाइमस्टैम्प अपडेट के लिए स्थिति प्रविष्टि (एक पूर्णांक) को संशोधित करके आप एक अलग तरीके से पूर्ववत सूची के साथ भी खेल सकते हैं ।

¹ समूह सम्मिलन के समान निष्कासन करता है। self-insert-command


2

आप जो सुझाव देते हैं, उसके साथ समस्या यह है कि पूर्ववत पेड़ आपको जहां होना चाहते हैं, वहां से प्राप्त करने के लिए डेल्टास की एक सूची है। हालांकि एक बफर पर पूर्ववत ट्रैकिंग को अक्षम करना पूरी तरह से संभव है, मुझे यकीन नहीं है कि सक्रिय रूप से रिकॉर्डिंग परिवर्तनों का प्रभाव नहीं होगा। वर्तमान में मेरे पास एक विशेष बफर पर पूर्ववत / बंद करने के लिए टॉगल है क्योंकि यह बढ़ते लॉग या रीफ़्रेशिंग पृष्ठ पर पूर्ववत जानकारी रखने का कोई मतलब नहीं है। हालाँकि यह टॉगल पर होने वाले परिवर्तनों को निक्स करता है:

(defun my-toggle-buffer-undo ()
  "Toggle undo tracking in current buffer."
  (interactive)
  (with-current-buffer (current-buffer)
    (if (eq buffer-undo-list t)
        (setq buffer-undo-list nil)
      (buffer-disable-undo (current-buffer)))))

(define-key my-toggle-map "u" 'my-toggle-buffer-undo)

बफ़र-अक्षम-पूर्ववत वास्तव में सिर्फ सेट बफ़र-पूर्ववत-सूची के लिए नहीं के बराबर । हो सकता है कि अगर आपने अपने आप को टॉगल करने के लिए बफर-अनडू-लिस्ट की स्थिति को बचाया तो आप इसे बाद में बहाल कर सकते हैं?

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