भरने के रूप में पैराग्राफ अंक फ़ाइल बदल गया, भले ही यह कुछ भी नहीं किया


11

जब भी मैं कॉल करता हूं fill-paragraph, तो बफर को हमेशा संशोधित के रूप में चिह्नित किया जाता है, भले ही कमांड का कोई प्रभाव न हो (यानी यदि पैराग्राफ पहले से ही भरा हुआ था)। यह एक खाली पूर्ववत क्रिया भी बनाता है (आसानी से पता लगाया जाता है undo-tree-mode)। अन्य आदेशों में परिवर्तन करने की क्षमता है, जैसे कि इंडेंटेशन कमांड, बफर को संशोधित नहीं करते हैं या यदि कुछ भी नहीं बदला गया था, तो यह एक अनुपयुक्त कार्रवाई पैदा करता है। क्या कोई तरीका है fill-paragraphकि आप बफर को चिन्हित करें और एक पूर्ववत कार्रवाई करें अगर यह वास्तव में कुछ बदल गया है?


मुझे नहीं लगता कि यह सही M-qहै - डिफ़ॉल्ट रूप से परिवर्तित बफर को चिह्नित नहीं करता है, कम से कम मेरे परीक्षण से। आप किस विधा का उपयोग कर रहे हैं? मुझे लगता है कि मोड fill-paragraphकिसी तरह से ओवरराइट कर रहा है।
शोस्ती

@shosti मैं फंडामेंटल मोड का उपयोग कर रहा हूं। पैराग्राफ को एक पंक्ति से अधिक लंबा होना चाहिए (जब ठीक से भरा हुआ हो)।
लिली चुंग

आह ठीक है अब मैं इसे देखता हूं।
शोस्ती

जवाबों:


2

ध्यान दें कि यह नए Emacsen (v.26 ऊपर की ओर) के लिए तय किया गया है।


10

समस्या यह है कि fill-paragraph(या बल्कि fill-region-as-paragraph) नए पैराग्राफ को हटा और फिर से सम्मिलित करेगा जबकि यह आपके पैराग्राफ को तोड़ता है। यह केवल एक पंक्ति है, तो यह बफर को संशोधित नहीं करेगा। आपके द्वारा देखी गई पूर्ववत सूची में कोई विकल्प नहीं है, केवल fill-paragraphनई सूचियाँ निकाल रहा है और पुन: सम्मिलित कर रहा है।

इससे बचना गैर-तुच्छ है। निम्नलिखित एक बहुत बुरा हैक है, और बड़े बफ़र्स के लिए अत्यधिक अक्षम है, लेकिन शायद यह आपके लिए काम करता है। समान व्यवहार वाले कमांड मिमिक fill-paragraph( M-q), सिवाय इसके कि यह कॉल करने से पहले बफर की सामग्री को संग्रहीत करता है, और बाद में, यदि सामग्री समान रहती है, तो यह परिवर्तन से पहले संशोधन राज्य और पूर्ववत सूची को पुनर्स्थापित करेगा। ऐसा करने के लिए, इसे बफर सामग्री की एक प्रतिलिपि (दो, वास्तव में) की आवश्यकता है, इसलिए वास्तव में, यह काफी अक्षम है। :-)

(defun my/fill-paragraph (&optional justify region)
  (interactive (progn
                 (barf-if-buffer-read-only)
                 (list (if current-prefix-arg 'full) t)))
  (let ((old-text (buffer-string))
        (old-modified (buffer-modified-p))
        (old-undo-list buffer-undo-list))
    (fill-paragraph justify region)
    (when (equal old-text (buffer-string))
      (setq buffer-undo-list old-undo-list)
      (set-buffer-modified-p old-modified))))

आप उसे बांध सकते हैं M-q


1
हां, यह लंबे समय से एक दर्द है। ;-) मुझे आश्चर्य है (मुझे याद नहीं है) कि क्या इसके लिए कोई फिक्स पहले अनुरोध किया गया है। ऐसा लगता है जैसे यह होगा।
ड्रू

हममम। मुझे आश्चर्य है कि अगर कोई बेहतर समाधान है जिसे पूरे बफर की जांच करने की आवश्यकता नहीं है- शायद यह केवल चयनित पैराग्राफ की जांच कर सकता है?
लिली चुंग

fill-paragraphविभिन्न मामलों के बीच कुछ अंतर करता है, अर्थात एक सक्रिय क्षेत्र, मौजूदा फ़िल-पैरा फ़ंक्शंस आदि के आधार पर अलग-अलग व्यवहार करता है, आपको उस व्यवहार को दोहराने के लिए यह पता लगाना होगा कि बफर के कौन से हिस्से वास्तव में बदले जा रहे हैं। संभव है, लेकिन मुश्किल है। :-)
जोर्गेन शेफर

@ ड्रू पिछले साल मेलिंग सूची पर इसके बारे में एक लंबी चर्चा हुई: बग # 13949: 24.3.50; 'भरण-परिच्छेद' को हमेशा बफर को संशोधित नहीं करना चाहिए
dkim

@ डकीम: हां, मुझे अब याद है। और इसका कभी कुछ नहीं हुआ ...
ड्रू

1

देर से जवाब, लेकिन यहाँ एक साधारण संस्करण है जो पाठ को नहीं बदलने पर बफर को संशोधित नहीं करता है।

(defun my-fill-paragraph (&optional justify region)
  "Fill paragraph, but don't modify the buffer if filling doesn't
change the text.  See `fill-paragraph' for details."
  (interactive (progn
                 (barf-if-buffer-read-only)
                 (list (if current-prefix-arg 'full) t)))
  (if (buffer-modified-p)
      ;; if modified: use standard fill-paragraph
      (fill-paragraph justify region)
    ;; if unmodified: get a candidate filled version
    (save-excursion
      (let* ((col fill-column)
             (beg (progn (forward-paragraph -1)
                         (skip-syntax-forward " >")
                         (point)))
             (end (progn (forward-paragraph 1)
                         (skip-syntax-backward " >")
                         (point)))
             (old (buffer-substring-no-properties beg end))
             (new (with-temp-buffer
                    (setq fill-column col)
                    (insert old)
                    (fill-paragraph justify region)
                    (buffer-string))))
        ;; don't modify unless the old and new versions differ
        (unless (string-equal old new)
          (delete-region beg end)
          (insert new))))))

यह @ JorgenSchäfer के उत्तर में कुछ विचारों को स्वीकार करता है, लेकिन केवल वर्तमान पैराग्राफ के साथ काम करता है, और केवल एक सरल, व्हाट्सएप-अलग तरीके से (हुड के नीचे जटिलताओं के साथ @ JorgenSchäfer के उत्तर पर टिप्पणी देखें)।

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

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