2009-12-19 8 views
10

मैं इसे कैसे समझूं?emacs: पहले-सेव-हुक एक स्थानीय चर है?

मैं अपने c-mode-common-hook में before-save-hook करने के लिए delete-trailing-whitespace जोड़ा है, लेकिन यह delete-trailing-whitespace की तरह हर फ़ाइल के लिए बुलाया जा रहा है, न सिर्फ सी-मोड और डेरिवेटिव का उपयोग कर बफ़र्स लग रहा है।

क्या मैं before-save-hook बफर स्थानीय बना सकता हूं?

+1

'ws-trim' भी है, जो मैं उपयोग करता हूं: ftp.ftsator.liu.se/pub/emacs/ws-trim.el –

उत्तर

18

यह बजाय write-contents-functions में जोड़ें:

(add-hook 'c-mode-common-hook 
    (lambda() 
    (add-hook 'write-contents-functions 
     (lambda() 
     (save-excursion 
      (delete-trailing-whitespace))) 
     nil t))) 

Emacs लिस्प संदर्भ मैनुअल के रूप में बताते हैं:

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

यह Emacs 24.2.1 में मेरे लिए ठीक से काम करता है (यानी, सी फाइलों से सभी पिछली श्वेत रिक्ति हट जाता है लेकिन अन्य सभी फ़ाइल प्रकारों में खाली स्थान के अनुगामी को बरकरार रखता है)।बजाय

+0

धन्यवाद; मैंने EmacsWiki पर संबंधित बग को सही किया और क्रेडिट के लिए यहां वापस इशारा किया। –

+1

(लगभग) सभी हुक स्थानीय और वैश्विक दोनों हैं। यह कहने के लिए कि आप अपने फ़ंक्शन को वैश्विक स्तर पर या बफर-स्थानीय रूप से जोड़ना चाहते हैं, बस 'एड-हुक' के 'स्थानीय' तर्क का उपयोग करें। 'स्थानीय-लेखन-फ़ाइल-हुक' अप्रचलित है क्योंकि Emacs-22.1 'लिखने-फ़ाइल-हुक' ('लिखने-फ़ाइल-फ़ंक्शंस' द्वारा प्रतिस्थापित किया गया है), इसलिए आप अपना संदर्भ मैन्युअल अपडेट करना चाहेंगे। – Stefan

+0

धन्यवाद, मैंने अपना जवाब अपडेट किया। –

3

पहले कभी यह करने के लिए चाहता था, लेकिन यह काम करना चाहिए:

(set (make-local-variable 'before-save-hook) '((lambda() (rg-msg "foobie")))) 

सामान्य सी एच वी में एक चर नाम के लिए संकेत है और एक वर्णन आपको बता रहा है कि क्या वर बफर-स्थानीय है प्रदर्शित करेगा।

पहले-सेव-हुक 'variable.el' में एक चर परिभाषित है। इसका मूल्य शून्य

यह चर संभावित रूप से जोखिम भरा है जब फ़ाइल स्थानीय चर के रूप में उपयोग किया जाता है।

प्रलेखन: एक बफर को अपनी फ़ाइल में सहेजने से पहले सामान्य हुक चलाया जाता है।

आप इस चर को कस्टमाइज़ कर सकते हैं।

बनाम

अगली त्रुटि समारोह एक चर `simple.el 'में परिभाषित किया गया है। इसका मान शून्य

किसी भी फैशन में सेट होने पर स्वचालित रूप से बफर-स्थानीय बन जाता है। यह वैरिएबल संभावित रूप से जोखिम भरा है जब फ़ाइल स्थानीय चर के रूप में उपयोग किया जाता है।

प्रलेखन: वर्तमान बफर में अगली त्रुटि खोजने के लिए उपयोग करने के लिए फ़ंक्शन। समारोह 2 मानकों के साथ कहा जाता है:

[...]

+1

मुझे यकीन नहीं है कि यह सही था या नहीं समय यह लिखा गया था, लेकिन वर्तमान दस्तावेज कहता है "हुक वैरिएबल बफर-लोकल बनाने के लिए 'मेक-लोकल-वेरिएबल' का उपयोग न करें। इसके बजाय, 'एड-हुक' का उपयोग करें और स्थानीय तर्क के लिए' t' निर्दिष्ट करें। " – phils

0

उपयोग write-contents-function:

write-contents-functions is a variable defined in `files.el'. 
Its value is nil 

    Automatically becomes buffer-local when set in any fashion. 

Documentation: 
List of functions to be called before writing out a buffer to a file. 
If one of them returns non-nil, the file is considered already written 
and the rest are not called and neither are the functions in 
`write-file-functions'. 

This variable is meant to be used for hooks that pertain to the 
buffer's contents, not to the particular visited file; thus, 
`set-visited-file-name' does not clear this variable; but changing the 
major mode does clear it. 

For hooks that _do_ pertain to the particular visited file, use 
`write-file-functions'. Both this variable and 
`write-file-functions' relate to how a buffer is saved to file. 
To perform various checks or updates before the buffer is saved, 
use `before-save-hook'. 

आप के रूप में आप यह सुनिश्चित करें कि आप आवरण से nil वापसी चाहते हैं एक आवरण delete-trailing-whitespace कॉल करने के लिए तैयार करना चाहिए, ताकि आगे की प्रक्रिया (और अंततः बचत) जगह लेता है।

+2

स्थानीय-लेखन-फ़ाइल-हुक के बजाय किसी को लेखन-सामग्री-फ़ंक्शंस का उपयोग क्यों करना चाहिए? –

15

नहीं, परिवर्तनीय before-save-hook स्वाभाविक रूप से स्थानीय नहीं है। वेरिएबल का प्रलेखन यह नहीं कहता कि यह बफर स्थानीय है या कहें कि सेट होने पर यह स्वचालित रूप से बफर स्थानीय बन जाएगा।

(add-hook 'before-save-hook 'foo nil t) 

ऐड-हुक प्रलेखन कहते हैं:

आप इसे करने के लिए एक बफर-स्थानीय हुक जोड़ना चाहते हैं, यह करने के लिए सही तरीका सिर्फ मानक add-hook समारोह के वैकल्पिक स्थानीय पैरामीटर का उपयोग करने के लिए है :

वैकल्पिक चौथे तर्क, स्थानीय, अगर गैर शून्य, हुक के बफर-स्थानीय के बजाय अपनी वैश्विक मूल्य मूल्य को संशोधित करने के कहते हैं। यह हुक बफर-स्थानीय बनाता है, और यह बफर-स्थानीय मान का सदस्य बनाता है। यह ग्लोबल वैल्यू के साथ-साथ स्थानीय मूल्य में हुक फ़ंक्शन चलाने के लिए ध्वज के रूप में कार्य करता है।

इसे local-write-file-hooks में जोड़ने का चयनित उत्तर गलत है, मुझे विश्वास है। यदि आप उस समारोह के लिए प्रलेखन को देखते हैं, emacs 24.3 पर, यह कहता है कि चर 22.1 के बाद अप्रचलित है, और आपको write-file-functions का उपयोग करना चाहिए। और यदि आप write-file-functions के दस्तावेज़ीकरण को देखते हैं, तो यह अधिक जटिल व्यवहार का वर्णन करता है और अंत में कहता है कि "बफर सहेजने से पहले विभिन्न चेक या अपडेट करने के लिए, 'पहले से बचाने-हुक' का उपयोग करें।

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