2013-02-16 7 views
13

मेरे पास 'before-save-hook में स्थापित विभिन्न चीज़ें हैं I उदाहरण के लिए, मैं 'delete-trailing-whitespace चलाता हूं। यही वह है जो मैं लगभग सभी अवसरों में चाहता हूं।emacs में, मैं हुक बचाने के बिना कैसे बचा सकता हूं?

लेकिन कभी-कभी, मैं उन फ़ाइलों पर काम कर रहा हूं जो अन्य लोगों के साथ साझा की जाती हैं, और फ़ाइल में पहले से ही पीछे की जगहों का एक गुच्छा है। अगर मैं फ़ाइल को सहेजता हूं, तो मुझे एक बड़ा अंतर मिलेगा जो बहुत भ्रमित है, क्योंकि मेरा परिवर्तन दर्जनों या सैकड़ों अर्थहीन परिवर्तनों में दफनाया गया है। हां, हर कोई व्हाइटस्पेस परिवर्तन न दिखाने के लिए बस अपने diff टूल को बता सकता है, लेकिन ऐसा कुछ है जो हर बार जब वे diff को देखते हैं तो हर किसी को करना पड़ता है। मैं सफेद जगह बदलने के बजाय भी नहीं होगा।

क्या मैं खाली स्थान के बदलाव के बिना फ़ाइल को बचाने के लिए क्या कर सकते हैं कोई init.el फ़ाइल के साथ Emacs का एक नया उदाहरण शुरू करने से कम, या एक संशोधित init.el कि हुक नहीं है के साथ है?

+4

आपके द्वारा सामना किए जाने वाले सटीक कारण के लिए, पहले से बचाने-हुक का उपयोग करके पिछली सफेद जगह को अलग करना एक बुरा विचार है। इसके बजाय आपको [ws-trim] की पसंद का उपयोग करना चाहिए (ftp.lysator.liu.se/pub/emacs/ws-trim.el) या [ws-butler] (https://github.com/ लेवांग/डब्ल्यूएस-बटलर) केवल उन लाइनों से व्हाइटस्पेस को पट्टी करने के लिए जिन्हें आपने स्वयं संपादित किया है। – phils

+0

@zck: मैं Emacs '* इथेन-डब्ल्यूएस-मोड * का उपयोग करता हूं जो बहुत अच्छा है: पिछला सफेद स्थान लाल रंग में दिखाया गया है। मैं पहले से ही उन लोगों पर ध्यान नहीं देता हूं लेकिन मैं तुरंत देखता हूं कि मैं नए बना रहा हूं या नहीं।और फिर मैं अपने सहकर्मियों को कह सकता हूं: * "कृपया मनमाने ढंग से सफेद जगहों के साथ सोर्स कोड को रोकना बंद करें" * हर बार जब मैं कुछ फाइल देख रहा हूं और इथेन-डब्ल्यूएस-मोड मुझे पीछे की ओर घुमावदार दिखाता है;) तो आक्रामक हुक का उपयोग करने के बजाय मैं एक निष्क्रिय विधि का उपयोग करता हूं: यह सिर्फ * दिखाता है * गंदा सफेद जगहें और मुझे यह तय करना है कि इसके साथ क्या करना है। – TacticalCoder

उत्तर

4

@Stefan के साथ एक टिप्पणी चर्चा के आधार पर, यहाँ दो संभव (untested) समाधान कर रहे हैं

(defun save-buffer-without-dtw() 
    (interactive) 
    (let ((restore-global 
     (memq 'delete-trailing-whitespace (default-value before-save-hook))) 
     (restore-local 
     (and (local-variable-p 'before-save-hook) 
       (memq 'delete-trailing-whitespace before-save-hook)))) 
    (unwind-protect 
     (progn 
      (when restore-global 
      (remove-hook 'before-save-hook 'delete-trailing-whitespace)) 
      (when restore-local 
      (remove-hook 'before-save-hook 'delete-trailing-whitespace t)) 
      (save-buffer)) 
     (when restore-global 
     (add-hook 'before-save-hook 'delete-trailing-whitespace)) 
     (when restore-local 
     (add-hook 'before-save-hook 'delete-trailing-whitespace nil t))))) 

के साथ समस्या दूसरा समाधान यह है कि before-save-hook में फ़ंक्शंस का क्रम बदल सकता है।

1

हमें 'delete-trailing-whitespacebefore-save-hook से हटा दें, बफर को सहेजें, फिर इसे वापस जोड़ें।

यह कोड ऐसा करेगा, लेकिन केवल इसे हटाएं और इसे शुरू करें यदि यह शुरू हो रहा है।

;; save the buffer, removing and readding the 'delete-trailing-whitespace function 
;; to 'before-save-hook if it's there 
(defun save-buffer-no-delete-trailing-whitespace() 
    (interactive) 
    (let ((normally-should-delete-trailing-whitespace (memq 'delete-trailing-whitespace before-save-hook))) 
    (when normally-should-delete-trailing-whitespace 
     (remove-hook 'before-save-hook 'delete-trailing-whitespace)) 
    (save-buffer) 
    (when normally-should-delete-trailing-whitespace 
     (add-hook 'before-save-hook 'delete-trailing-whitespace)))) 
(global-set-key (kbd "C-c C-s") 'save-buffer-no-delete-trailing-whitespace) 

यह सुविधा के लिए (kbd C-c C-s) पर भी आदेश को बाध्य करता है।

उपयोग let:

(defun save-buffer-without-dtw() 
    (interactive) 
    (let ((b (current-buffer))) ; memorize the buffer 
    (with-temp-buffer ; new temp buffer to bind the global value of before-save-hook 
     (let ((before-save-hook (remove 'delete-trailing-whitespace before-save-hook))) 
     (with-current-buffer b ; go back to the current buffer, before-save-hook is now buffer-local 
      (let ((before-save-hook (remove 'delete-trailing-whitespace before-save-hook))) 
      (save-buffer))))))) 

उपयोग unwind-protect:

+0

आपको यह सुनिश्चित करने के लिए 'शर्त-केस' का उपयोग करने की आवश्यकता है कि 'सेव-सेव-हुक' पुनर्स्थापित हो गया है, भले ही 'सेव-बफर' विफल हो। वैकल्पिक रूप से (और बहुत बेहतर!) आप 'let' में 'से पहले सेव-हुक' बांध सकते हैं: '(चलो ((सेव-सेव-हुक (हटाएं' पीछे हटाना-व्हाइटस्पेस से पहले सेव-हुक) हटाएं)) (बचाने के लिए-बफर)) '। – sds

+0

@ एसडीएस: आपका लेट-ट्रिक अच्छा लग सकता है, लेकिन अगर कुछ 'बफर-स्थानीय' से पहले 'सेव-सेव-हुक' में जोड़ा गया था तो यह असफल हो जाएगा (जिस स्थिति में 'डिलीट-ट्रेलिंग-व्हाइटस्पेस' 'डिफ़ॉल्ट-मूल्य में होगा 'पहले से बचाने-हुक)' लेकिन 'पहले से बचाने-हुक' के मूल्य में नहीं)। – Stefan

+0

@Stefan: कोड दाएं बफर में निष्पादित किया गया है, इसलिए मैं सही मान को 'बाध्य' कर रहा हूं, नहीं? – sds

2

यहाँ एक और समाधान है (100% अपरीक्षित गारंटी):

(defvar my-inhibit-dtw nil) 
(defun my-delete-trailing-whitespace() 
    (unless my-inhibit-dtw (delete-trailing-whitespace))) 
(add-hook 'before-save-hook 'my-delete-trailing-whitespace) 

और फिर

(defun my-inhibit-dtw() 
    (interactive) 
    (set (make-local-variable 'my-inhibit-dtw) t)) 

तो आप कर सकते हैं M-x my-inhibit-dtw RET बफ़र्स जहां आप सफेद स्थान को ट्रिम करने के लिए नहीं करना चाहती है।

+0

धन्यवाद स्टीफन, एक आकर्षण की तरह काम करता है! – ph0t0nix

2

मेरे साथ आया एक आसान समाधान यह है कि मेरे fundamental-mode में कोई हुक स्थापित नहीं है, क्योंकि मैं इसे जितना संभव हो उतना सादा होना चाहता हूं। इस प्रकार यदि मैं हुक चलाने के बिना फ़ाइल को सहेजना चाहता हूं, तो मैं अस्थायी रूप से fundamental-mode पर स्विच करता हूं।

संबंधित मुद्दे