मामूली मोड को सक्षम करने का उचित तरीका


24

मेरे पास फू-मोड है और इसके लिए बार-माइनर-मोड सक्षम करेगा । तो कौन सा तरीका अधिक सामान्य और बेहतर है?

(add-hook 'foo-mode-hook 'bar-minor-mode)

बी

(add-hook 'foo-mode-hook (lambda ()
                           "Turn on `bar-minor-mode' mode."
                           (bar-minor-mode 1)))

सी

(defun bar-minor-mode-on ()
  "Turn on `bar-minor-mode' mode."
  (interactive)
  (bar-minor-mode 1))

(add-hook 'foo-mode-hook 'bar-minor-mode-on)

डी

• वेरिएंट C, लेकिन फंक्शन अपस्ट्रीम में धकेल दिया गया

• वैरिएंट C, लेकिन प्लगइन रेसिपी में संग्रहित फंक्शन


4
हाय @Netsu, मैंने देखा कि आपने मेरे लंबोदर से हटाए गए उद्धरण को वापस जोड़ दिया। सामान्य तौर पर, लैम्बदास को उद्धृत करना हानिकारक है, इसलिए स्टीफन और मैं सिर्फ अच्छी प्रथाओं को प्रेरित करने की कोशिश कर रहे हैं। :-)
मालाबार

जवाबों:


26

यह इस बात पर निर्भर करता है कि आप किस Emacs (या लक्ष्यीकरण) का कौन सा संस्करण (ओं) का उपयोग कर रहे हैं। Iff आप विशेष रूप से Emacs 24+ का उपयोग कर रहे हैं तो आप सुरक्षित रूप से वेरिएंट A का उपयोग कर सकते हैं:

* Incompatible Lisp Changes in Emacs 24.1

** Passing a nil argument to a minor mode function call now ENABLES
the minor mode unconditionally.  This is so that you can write e.g.

 (add-hook 'text-mode-hook 'foo-mode)

to enable foo-mode in Text mode buffers, removing the need for
`turn-on-foo-mode' style functions.  This affects all mode commands
defined by `define-minor-mode'.  If called interactively, the mode
command still toggles the minor mode.

यह NEWS फ़ाइल से है, लेकिन टिप्पणियों के अनुसार फ़ंक्शन प्रतीकों के लिए फ़ंक्शन-कोटिंग का उपयोग करना अच्छा है, जैसे:

 (add-hook 'text-mode-hook #'foo-mode)

यदि कोड को Emacs 23 (या पहले) के तहत चलाने की आवश्यकता हो सकती है, तो मैं वैरिएंट C के साथ जाऊंगा, क्योंकि व्यक्तिगत रूप से मैं हुक चर में अनाम कार्यों को देखना पसंद करता हूं। (मुझे यकीन नहीं है कि मैं समझ सकता हूं कि आपके वेरिएंट डी एंड ई से क्या मतलब है, मन)।


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

धन्यवाद। लेकिन क्या फंक्शन-कोटिंग अभी भी आवश्यक है? क्या लाभ देता है? साथ ही यह लंबोदर के लिए भी आवश्यक है?
नटसू


7

यहां ऐसा करने का एक और तरीका है जिसके कुछ फायदे हैं, यह मानते हुए कि आप अपने स्वयं के कॉन्फ़िगरेशन को संपादित कर रहे हैं, न कि एक पैकेज जिसे आप वितरित करते हैं।

(add-hook 'foo-mode-hook
          #'custom-foo-hook)

(defun custom-foo-hook ()
  (bar-minor-mode 1)
  (baz-minor-mode 1)
  ;; ...
  (define-key foo-mode-map "C-c C-b" #'foobar))

लाभ यह है कि सब कुछ इतना कुछ सामान निष्क्रिय करने के लिए, तुम क्या करने की जरूरत नहीं है एक हुक में संग्रहीत है, है remove-hook, लेकिन इसके बजाय में कुछ सामान टिप्पणी custom-foo-hookऔर C-M-x

तुम भी एक आदेश है कि किसी भी मोड से यह कस्टम हुक करने के लिए कूदता लिख ​​सकते हैं।


1
यह (अनिवार्य रूप से) भिन्न नाम वाला वेरिएंट सी है, लेकिन मैं मानता हूं कि यह जोर देने लायक है। यह निश्चित रूप से दृष्टिकोण है जब मैं अपने स्वयं के विन्यास में प्रमुख मोड व्यवहार को अनुकूलित कर रहा हूं।
फिल्स

1
वेरिएंट C में add-hookप्रत्येक मामूली मोड को सक्षम करने के लिए कई कथन दिए गए हैं। मैं इस बात पर जोर देना चाहता था कि केवल एक add-hookबयान होने का एक फायदा है।
अबो-अबो

माना। मेरे सिर में मैंने बहुत से वेरिएंट C का अनुवाद किया है, "एक कस्टम फ़ंक्शन को परिभाषित करने के लिए जो मोड को सक्षम करता है" के बजाय "एक कस्टम फ़ंक्शन को परिभाषित करता है जो केवल मोड को सक्षम करता है", लेकिन पूर्वव्यापी में यह प्रतीत होता है कि इरादा है। जैसा कि आप कहते हैं, यह निर्भर करता है कि कोड निजी उपयोग के लिए है या नहीं।
फिल्स

7

आप एक नई कमांड को परिभाषित क्यों करेंगे जो वास्तव में करता है bar-minor-mode करती है?

24.1 से शुरू, ये सभी पूरी तरह से समतुल्य हैं, इसलिए बस कम निरर्थक एक का उपयोग करें: विकल्प

(add-hook 'foo-mode-hook #'bar-minor-mode)

1
क्या यह सुरक्षित समाधान है? मेरा मतलब है कि अगर फू-मोड-हुक पैरेंट मोड्स में से एक ही हुक है तो बार-माइनर-मोड दो बार कॉल करेगा, इसलिए अक्षम हो जाएगा। अप्रत्याशित व्यवहार।
नेट्सू

2
@ नेट्सू हां, बिना किसी तर्क के एक मामूली मोड फ़ंक्शन को कॉल करता है जो बिना मोड के मामूली मोड को सक्षम करता है।
मालाबार

4
@Malabarba केवल Emacs 24 के रूप में। पहले के संस्करणों में यह l है, यह वास्तव में मोड को चालू करता है।
चंद्रग्रहण

1
@lunaryorn हाँ, यही कारण है कि phils का जवाब बेहतर है। :-) मैं अपने को ठीक करने के लिए बहुत आलसी हो रहा था।
मालाबार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.