मैं "समूह" कैसे कर सकता हूँ?


14

कुछ चीजें हैं जैसे अनुगामी व्हाट्सएप का प्रदर्शन, बफर सीमाओं का प्रदर्शन, इंद्रधनुष के रंग का सीमांकक और बहुत कुछ मैं अधिकांश मोड या यों कहें, सभी प्रोग्रामिंग- और पाठ से संबंधित लोगों को सक्षम करना चाहता हूं (क्योंकि अनुगामी रिक्त स्थान प्रदर्शित करना) कहते हैं ediff-mode, प्रमुख नियमों के साथ टकराव होगा) अपवाद नियमों के साथ एक वैश्विक मामूली मोड का उपयोग करने के बजाय। चूंकि अधिकांश मोड prog-modeया तो दोनों से प्राप्त होते हैं text-mode, दोनों को कार्य में जोड़ते हैं prog-mode-hookऔर text-mode-hookकाम करते हैं, हालांकि इस विनिर्देश का पालन नहीं करने के लिए पर्याप्त मोड हैं, जैसे कि css-modeया LaTeX-mode

मैं एक ऐसे हुक को परिभाषित करना चाहता हूं जिसमें इन सभी साधनों को शामिल किया गया हो, केवल एक हुक में फ़ंक्शन जोड़ने के लिए। चलो इसे कहते हैं non-special-mode-hook(इसे भेद करने के लिए special-mode-hook)। मैं ऐसे हुक कैसे बना पाऊंगा जो सभी प्रमुख मोडों के लिए चलाया जाता है?


जवाबों:


19

बस उन सेटिंग्स को एक फंक्शन में समूहित करें, और उस फ़ंक्शन को सभी संबंधित हुक फ़ंक्शंस में जोड़ें:

(defun my-non-special-mode-setup ()
  (setq show-trailing-whitespace t)
  ...)
(dolist (hook '(prog-mode-hook text-mode-hook css-mode-hook ...))
  (add-hook hook 'my-non-special-mode-setup))

ऐसा करने का कोई अन्य तरीका अधिक संक्षिप्त नहीं होगा: जो कुछ भी होता है, कहीं न कहीं आप या तो एक श्वेतसूची या मोड के ब्लैकलिस्ट करने जा रहे हैं। व्यवहार में, आपको केवल कुछ मोड मिलेंगे, जिन्हें सूची में जोड़ने की आवश्यकता है, इसलिए मेरा सुझाव है कि चीजों को सरल रखें।

अपने स्वयं के कॉन्फ़िगरेशन में, मैं कई लिस्प-उन्मुख मोड के कॉन्फ़िगरेशन को एकजुट करने के लिए इस ट्रिक का उपयोग करता हूं ।


धन्यवाद, मुझे लगता है कि मैं इस समाधान को अन्य उपयोगी समूहों (जैसे कि खस्ता लोगों) के लिए भी अनुकूलित करूंगा।
वामासा

1
ठीक यही मैं खुद करता हूँ: github.com/purcell/emacs.d/blob/…
sanityinc

1
बहुत बढ़िया, क्या आप अपने उत्तर में URL जोड़ सकते हैं? मेरा मानना ​​है कि हाइलाइट किए गए स्निपेट न केवल वास्तविक उपयोग को बहुत अच्छी तरह से समझाते हैं, बल्कि आगे के उपयोग को भी प्रदर्शित करते हैं, जैसे कि Emacs लिस्प से संबंधित "हुक" का उपयोग एक बड़े "हुक" के सबसेट के रूप में और कैसे कोई मौजूदा मोड से स्वचालित रूप से हुक नामों का निर्माण करेगा। के साथ derived-mode-hook-name
वामासा

मैं इस से अधिक पसंद करता हूं, बस (dolist ...)बनाम के लिए (add-hook ...)<दोहराने>। मोड-विशिष्ट परिवर्तनों को अलग-अलग रखने के दौरान (फ़ाइल-प्रति-मोड use-package, el-get) रखते हुए मैं केवल मेरे साथ रहना चाहूंगा । दोनों सभी एक-से-एक समाधान हैं, लेकिन विभिन्न बिंदुओं से।
जोनाथन लीच-पेपिन

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

5

आप एक फ़ंक्शन जोड़ सकते हैं after-change-major-mode-hook, जो यह जांचता है कि नया मोड एक दिलचस्प है (संभवतः के माध्यम से (not (derived-mode-p 'special-mode))), और यदि ऐसा है तो चलता है non-special-mode-hook


यह बहुत बुरा लगता है (एक बार सभी "अनिर्दिष्ट" मोड का पता लगा लिया है क्योंकि कुछ ऐसे हैं जो बस उपयोग करते हैं fundamental-mode, लेकिन सिर्फ पाठ प्रदर्शित करने से अधिक करते हैं), लेकिन मेरे स्वाद के लिए थोड़ा सा जादू। इसलिए अपवित्र।
वामासा

4

मैंने खुद पाया कि अक्सर अपनी सेटिंग में मेरी सेटिंग्स और मामूली मोड की एक्टिविटीज़ को रैप करने के लिए @ संन्यासी का पैटर्न होता है और इसे कॉल करने के लिए हुक के माध्यम से लूपिंग किया जाता है, लेकिन मुझे एक क्लीनर दृष्टिकोण चाहिए था इसलिए मैंने यह मैक्रो लिखा:

(defmacro hook-modes (modes &rest body)
  (declare (indent 1))
  `(--each ,modes
     (add-hook (intern (format "%s-hook" it))
               (lambda () ,@body))))

नोट: मैं dash.elस्वच्छता के लिए हूं लेकिन इसे आसानी से उपयोग करने के लिए अनुकूलित किया जा सकता है (dolist)

तब आप समूहीकृत मोड को सूची चर के रूप में परिभाषित कर सकते हैं और इसका उपयोग कर सकते हैं:

(defvar progish-modes
  '(prog-mode css-mode sgml-mode))

(hook-modes progish-modes
  (highlight-symbol-mode)
  (highlight-symbol-nav-mode))

1
ध्यान दें कि यहां आप derived-mode-hook-nameएक मोड के हुक वैरिएबल का नाम प्राप्त करने के लिए उपयोग कर सकते हैं , जिससे internचाल से बचा जा सकता है ।
पवित्रता

@sanityinc टीआईएल derived-mode-hook-name। अच्छी टिप!
वेन्डमांडो

1

एक नए हुक को परिभाषित करने के बजाय जो इन सभी गैर-व्युत्पन्न मोड के लिए काम करता है, आप निम्न कार्य कर सकते हैं।

(defun run-my-hooks ()
  "Run all the following functions in the hook"
  (smartparens-mode 1)
  (whitespace-mode 1)
  (my-needed-mode 1)
  ...)

(add-hook 'specific-mode-hook 'run-my-hooks)
(add-hook 'another-mode-hook 'run-my-hooks)

आपको अभी भी इसे सभी मोड्स में जोड़ने की आवश्यकता होगी, लेकिन सभी मोड्स को शामिल करने के लिए अपने फ़ंक्शन को परिभाषित करके आपको एडिटिव फीचर्स को जोड़ने / हटाने के दौरान केवल एक परिभाषा बदलनी होगी।


-2

शायद आप यह कोशिश कर सकते हैं:

(setq lisp-dialects-mode-hook '(lisp-mode-hook
                            lisp-interaction-mode-hook
                            emacs-lisp-mode-hook
                            ;; common-lisp-mode-hook
                            scheme-mode-hook
                            clojure-mode-hook
                            cider-repl-mode-hook
                            ))

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