2011-09-13 7 views
9

मैं article about well-formatted Git commits पढ़ रहा था, और मैं सोच रहा था कि मैं मैगिट लॉग मोड में कुछ नियम कैसे लागू कर सकता हूं।मैं एक साथ कई Emacs मोड में एक हुक कैसे लागू कर सकता हूं?

ऐसा लगता है कि यह 3 प्रमुख मोड एक साथ उपयोग करता है: Magit, Log, Edit

तो मैं स्वचालित रूप से 72 वर्णों पर हार्ड-रैप करने के लिए, उन तरीकों को कैसे प्राप्त करूंगा, जब एक साथ उपयोग किया जाता है?

उत्तर

4

Emacs बफर में केवल एक प्रमुख मोड हो सकता है (जब तक कि आप something like MMM or MuMaMo का उपयोग नहीं कर रहे हों)। आपके मामले में एक प्रमुख मोड magit-log-edit-mode है, जिसका नाम तीन शब्द ("मैगिट लॉग संपादित करें") होता है। तुम बस जो कुछ भी हुक आप की तरह इसे करने के लिए जोड़ सकते हैं:

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(add-hook 'magit-log-edit-mode-hook 'my-turn-on-auto-fill) 
+0

बिल्कुल सही, धन्यवाद! एक स्पर्शरेखा के रूप में, मैं प्रमुख तरीकों के बारे में उलझन में था - उनमें से प्रत्येक क्लिक पर एक अलग "संदर्भ मेनू" पॉप करता है। किसी भी तरह से, आपका समाधान पूरी तरह से काम करता है। –

+1

मैं हुक के लिए 'लैम्ब्डा' अभिव्यक्ति जोड़ने के खिलाफ दृढ़ता से सलाह दूंगा। एक कारण यह है कि यह देखना मुश्किल है कि इसकी सामग्री का अध्ययन करते समय एक हुक क्या होता है। एक अन्य कारण यह है कि जब आप अपने हुक को संशोधित कर रहे होते हैं, तो नए और हर पुराने संस्करण मौजूद होते हैं (जब तक कि आप पुराने संस्करण को ध्यान से हटा नहीं देते), जिससे दिलचस्प प्रभाव हो सकते हैं। – Lindydancer

+0

@ लिंडिडांसर मैं पूरी तरह से सहमत हूं, लेकिन यह सिर्फ प्रदर्शन उद्देश्य के लिए था। वैसे भी, अलग समारोह में बदल दिया। –

1

सामान्य तौर पर, आप अपने खुद के समारोह को परिभाषित कर सकता है, my-common-hook कहना है और सभी प्रमुख मोड में जोड़ने, उदाहरण के लिए:

(defun my-common-hook() 
    ... do stuff ... 
    ) 
(add-hook 'one-mode-hook 'my-common-hook) 
(add-hook 'another-mode-hook 'my-common-hook) 
(add-hook 'a-third-mode-hook 'my-common-hook) 
7

में मूल प्रश्न के जवाब में कहा गया है, अगर आप कई हुक चर में जोड़ने के लिए एक भी समारोह है, तो आप इस तरह यह कर सकता है: नहीं सबसे अच्छा उदाहरण है, शायद, लेकिन मैं इतना है

(defun my-add-to-multiple-hooks (function hooks) 
    (mapc (lambda (hook) 
      (add-hook hook function)) 
     hooks)) 

(defun my-turn-on-auto-fill() 
    (setq fill-column 72) 
    (turn-on-auto-fill)) 

(my-add-to-multiple-hooks 
'my-turn-on-auto-fill 
'(text-mode-hook 
    magit-log-edit-mode-hook 
    change-log-mode-hook)) 

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

4

Emacs मोड में "आधार मोड" हैं जो बाडे मोड कहने के लिए हैं। उदाहरण के लिए python-modeprog-mode बढ़ाता है जो स्वयं fundamental-mode फैलाता है। सभी मोड fundamental-mode का विस्तार करते हैं। तो python-mode प्लस c-mode को हुक करने के लिए लेकिन text-mode पर नहीं, आप prog-mode को हुक कर सकते हैं।

1

बस इसे अभी देख रहा है, लेकिन यहां मैंने जो किया है। अंतिम परिणाम यह है कि मैं निम्नलिखित करना चाहता हूं: (hook-up-modes my-lisps 'standard-lisp-environment)

ऐसा करने के लिए, मैं निम्नलिखित defvar एस को परिभाषित करता हूं।

(defun append-suffix (suffix phrases) 
    "take SUFFIX and append it to each of the PHRASES." 
    (mapcar #'(lambda (phrase) (concat phrase suffix)) phrases)) 

ताकि ("clojure" "तुतलाना") => ("clojure:

(defvar my-lisps "clojure lisp emacs-lisp cider-repl") 
(defun standard-lisp-environment() 
    (paredit-mode 1) 
    (rainbow-delimiters-mode 1) 
    (eldoc-mode 1)) 

मैं lisps मैं उपयोग करने के लिए तुतलाना संलग्न मोड हुक करने के लिए तो मैं निम्नलिखित है चाहता हूँ -मोड-हुक "" लिस्प-मोड-हुक ")।

(defun multiple-mode-add-hook (modes hook) 
    "Given a list of x-mode-hook symbols in MODE, add the HOOK to them." 
    (mapc (lambda (mode) (add-hook mode hook)) modes)) 

ये सब:

अब हम आसानी से इन हो सकता है, हम अपने पाठक प्रतीकों, जो हम आसानी से से

(defun symbols-from-strings (strings) 
    "Given a list of strings, get their symbol values" 
    (mapcar #'intern strings)) 

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

(defun hook-up-modes (strings hook) 
    (let ((modes (symbols-from-strings 
       (append-suffix "-mode-hook" (split-string strings))))) 
    (multiple-mode-add-hook modes hook))) 

अब यह बहुत सुपाठ्य होना चाहिए: हम तार के एक अंतरिक्ष सीमांकित सूची से हमारे मोड बना सकते हैं और इसे करने के लिए हुक लागू होते हैं।इसके अलावा, चूंकि मैंने मानक-लिस्प-पर्यावरण को परिभाषित किया है, इसलिए मेरे सभी लिस्प्स समान व्यवहार करते हैं, और अगर मुझे पसंद है तो मैं आसानी से हुक को हटा सकता हूं। फिर कोड जो वास्तव में काम करता है वह सुपर सरल वाक्यांश (hook-up-modes my-lisps 'standard-lisp-environment) है।

+0

एक सूची के बजाय एक स्ट्रिंग के साथ शुरू करना बहुत अजीब है। प्रतीकों की एक सूची एक सामान्य सामान्य बिंदु होगा। प्रसंस्करण करते समय, स्ट्रिंग को समेकित करने के बराबर स्ट्रिंग प्राप्त करने के लिए आप 'प्रतीक-नाम' का उपयोग कर सकते हैं। – phils

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

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