2008-11-25 10 views
11

मैं अपने .emacs फ़ाइल में निम्न है बचत untabify करने के लिए। यह सीए ++ फ़ाइल को सहेजने से पहले बफर पर untabify चलाने के लिए emacs का कारण बनता है।हो रही Emacs जब कुछ फ़ाइल प्रकारों (और केवल उन फ़ाइल प्रकारों)

समस्या यह है कि बाद मैं एक सी ++ फ़ाइल लोड है, untabify हुक करने के लिए सभी बाद फ़ाइल लिखते हैं लागू किया जा रहा है, यहां तक ​​कि अन्य फ़ाइल प्रकार के बफर के लिए है। इसका अर्थ यह है कि यदि मैं एक सी ++ फ़ाइल खोलता हूं और फिर एक टैब-सीमांकित टेक्स्ट फ़ाइल संपादित करता हूं, तो फ़ाइल को सहेजते समय टैब को क्लोब किया जाता है।

मैं एक elisp गुरु नहीं हूं, लेकिन मुझे लगता है कि (make-local-hook 'write-contents-hooks) लाइन write-contents-hooks को जोड़ने के लिए केवल स्थानीय बफर पर लागू करने की कोशिश कर रहा है। हालांकि, यह काम नहीं कर रहा है, और c++-mode-untabify सभी बफर के लिए write-contents-hooks में है।

मैं एक विंडोज एक्सपी बॉक्स पर EmacsW32 22.0 का उपयोग कर रहा हूं। क्या किसी को कोई विचार है कि write-contents-hooks स्थानीय को किसी विशिष्ट बफर में कैसे बदलें या इसे nil पर रीसेट करने के लिए कैसे करें, अन्य, गैर-सी ++ बफर पर स्विच करते समय?

उत्तर

5

मेरे इमाक्स में प्रलेखन का कहना है कि मेक-लोकल-हुक अब 21.1 के रूप में अप्रचलित है, क्योंकि ऐड-हुक अब हुक बफर-स्थानीय बनाने के लिए वैकल्पिक तर्क लेता है। तो आप कोशिश कर सकते हैं:

(add-hook 'c++-mode-hook 
      '(lambda() 
       (add-hook 'write-contents-hooks 'c++-mode-untabify nil t))) 

एक और विकल्प है कि C++ - मोड-untabify फ़ंक्शन वर्तमान मोड की जांच करें। मैं शायद सिर्फ लिखते हैं कि के रूप में कुछ की तरह:

(defun c++-mode-untabify() 
    (if (string= (substring mode-name 0 3) "C++") 
     (save-excursion 
     (delete-trailing-whitespace) 
     (untabify (point-min) (point-max))))) 
2

कोशिश इस तरह अपने हुक जोड़ने:

(add-hook 'c++-mode-hook 
      '(lambda() 
       (add-hook 'write-contents-hooks 'c++-mode-untabify nil t))) 

सूचना दो अतिरिक्त aguments एड-हुक करने के लिए। यदि मैं इसे सही तरीके से पढ़ रहा हूं, तो दस्तावेज के अनुसार टी को पीछे हटाना चाहिए जो स्थानीय-हुक करता है (या वीज़ा बनाम), लेकिन मैंने स्थानीय-हुक को बहिष्कृत करने के संदर्भ भी देखे हैं। कम से कम मेरे बॉक्स पर (लिनक्स, gnu emacs 21.3.1) मैं आपको जो प्रभाव चाहता हूं उसे देख रहा हूं - हुक केवल सी ++ बफर से जुड़ा हुआ है और अन्य सभी नहीं।

आखिरी उपाय के रूप में आप हमेशा अपने सी ++ - मोड-अनबैबिफ़ फ़ंक्शन में चेक डाल सकते हैं ताकि वर्तमान मोड मोड सी ++ - मोड हो।

हालांकि यह एक उत्सुक समाधान है। यदि आप सभी टैब हटाते हैं, तो टैब को वापस रखने के लिए आप क्या कर रहे हैं? यदि आप जो कुछ भी रोकते हैं तो आपको इस हैक की आवश्यकता नहीं होगी।

+0

धन्यवाद:

(add-hook 'c++-mode-hook '(lambda() (add-hook 'before-save-hook (lambda() (untabify (point-min) (point-max)))))) 

यह मैं क्या उपयोग है, जो कुछ अन्य बातें करता है और बाहर निकाला गया है प्रोग्रामिंग विशेष मोड के साथ काम करने के लिए से आसवित! मैंने इसे पुराने कोड से टैब को स्वचालित रूप से हटाने के लिए रखा है जिसे मैंने नहीं लिखा था लेकिन कभी-कभी इसे बनाए रखना होता था, – DanielMcP

19

लेखन-सामग्री-हुक भी अप्रचलित है। यह वह जगह है क्या आप के बाद कर रहे हैं:

(defun untabify-buffer() 
    "Untabify current buffer" 
    (interactive) 
    (untabify (point-min) (point-max))) 

(defun progmodes-hooks() 
    "Hooks for programming modes" 
    (yas/minor-mode-on) 
    (add-hook 'before-save-hook 'progmodes-write-hooks)) 

(defun progmodes-write-hooks() 
    "Hooks which run on file write for programming modes" 
    (prog1 nil 
    (set-buffer-file-coding-system 'utf-8-unix) 
    (untabify-buffer) 
    (copyright-update) 
    (maybe-delete-trailing-whitespace))) 

(defun delete-trailing-whitespacep() 
    "Should we delete trailing whitespace when saving this file?" 
    (save-excursion 
    (goto-char (point-min)) 
    (ignore-errors (next-line 25)) 
    (let ((pos (point))) 
     (goto-char (point-min)) 
     (and (re-search-forward (concat "@author +" user-full-name) pos t) t)))) 

(defun maybe-delete-trailing-whitespace() 
    "Delete trailing whitespace if I am the author of this file." 
    (interactive) 
    (and (delete-trailing-whitespacep) (delete-trailing-whitespace))) 

(add-hook 'php-mode-hook 'progmodes-hooks) 
(add-hook 'python-mode-hook 'progmodes-hooks) 
(add-hook 'js2-mode-hook 'progmodes-hooks) 
संबंधित मुद्दे