हुक के साथ प्रमुख मोड कुंजी सेट करने के बीच अंतर मोड मोड में उन्हें जोड़ना


13

मान लें कि मैंने नामक एक प्रमुख मोड डाउनलोड किया है magical-mode, और इसका अपना जादुई कीमैप है magical-mode-map। यह मोड एक हुक भी प्रदान करता है magical-mode-hookजो हर बार चलने वाले magical-modeबफर का प्रमुख मोड बन जाता है। अब मैं उस मोड में उपयोग करने के लिए कुछ कस्टम कुंजी बाइंडिंग जोड़ने के लिए अपनी इनिट फ़ाइल को संशोधित करना चाहता हूं।

ऐसा लगता है कि कस्टम कुंजी बाइंडिंग सेट करने के लिए (कम से कम) दो तरीके हैं magical-mode। जो मैं सबसे अधिक देखता हूं वह यह है:

(defun my-magical-keys ()
  (local-set-key (kbd "C-i") 'previous-line)
  (local-set-key (kbd "C-k") 'next-line)
  (local-set-key (kbd "C-j") 'backward-char)
  (local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)

लेकिन यह इस तरह से करना भी संभव है:

(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)

दूसरी विधि वास्तव में मुझे साफ लगती है। वहाँ एक दूसरे पर एक तरह से करने के लिए कोई लाभ हैं?


मैं मूल आंदोलन कमांड के लिए समान कुंजियों का उपयोग करता हूं। सावधान रहें: यह एक कठिन लड़ाई है और आप ऐसा करने से पहले कुंजी बाइंडिंग के बारे में थोड़ा और सीखना चाह सकते हैं।
तारसियस

@tarsius एक कठिन लड़ाई वास्तव में। मैं पहले भी उस रास्ते से नीचे जा चुका हूं, लेकिन अब मैं अच्छे ओल में वापस आ गया हूं ' C-nऔर C-p। इसका उदाहरण सिर्फ डमी कोड है। मैं कुछ बहुत ही सरल उदाहरण मोड और उदाहरण बाइंडिंग के साथ आना चाहता था, ठीक है ताकि बाइंडिंग स्वयं प्रश्न के वास्तविक उद्देश्य से विचलित न हो।
nispio

जवाबों:


15

दूसरा दृष्टिकोण बेहतर है क्योंकि यह मोड के कीमैप को केवल एक बार संशोधित करता है।

यदि आप इसे मोड के हुक का उपयोग करते हैं तो इसे हर बार कहा जाएगा कि मोड कुछ बफर में सक्षम है। ऐसा करने से आम तौर पर वास्तव में प्रभाव नहीं पड़ेगा क्योंकि चाबियाँ बस फिर से वही हैं जो वे पहले से ही बंधे हैं। मेजर मोड कीमैप प्रमुख मोड में "स्थानीय" होते हैं न कि अलग-अलग बफ़र्स जो उस मोड का उपयोग करते हैं, इसलिए यदि आप इन बफ़र्स में से किसी एक में बाइंडिंग का उपयोग करते हैं local-set-keyतो वह सभी बफ़र्स को एक ही प्रमुख मोड से प्रभावित करता है।

local-set-keyमुख्य रूप से एक कमांड के रूप में उपयोग करने का इरादा है। एक बार जब आप यह निर्धारित कर लेते हैं कि आप कुछ बदलावों को जारी रखना चाहते हैं, define-keyतो पहले तर्क के रूप में मोड कीमैप का उपयोग करें ।

यदि आप बार-बार कीमैप को संशोधित करने के लिए एक हुक का उपयोग करते हैं तो उस के उपयोग के साथ संघर्ष हो सकता है local-set-key। कहते हैं कि आपने उपयोग किया M-x local-set-key RET C-i fancy-previous-line RETक्योंकि आप उस संस्करण को आज़माना चाहते हैं previous-line। यदि आप अब एक नया बफर खोलते हैं जो उसी प्रमुख मोड का उपयोग करता है, तो हुक फिर से चलेगा और आपके अस्थायी बंधन को ओवरराइड करेगा , उस बफर मोड का उपयोग करने वाले सभी बफर में, जिसमें आपने पहले उपयोग किया था local-set-key


मुझे यह जवाब पसंद है लेकिन क्या होगा अगर मोड ऑटोलॉगेड है?
१५

2
कुछ लाइब्रेरी लोड होने के बाद आप किसी भी कोड को लोड करने में देरी कर सकते हैं (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...)):।
tarsius

4

उपयोग करना (define-key my-magical-mode-map …)सामान्य तरीका है।

जब आप एक हुक का उपयोग करते हैं और local-set-key, कुंजियों को हर बार कुछ बफर में माई मैजिकल मोड में प्रवेश करने पर जोड़ा जाता है। यह अजीब है क्योंकि local-set-keyसभी बफ़र्स को प्रभावित करता है जो एक ही मोड में हैं (अधिक सामान्यतः, एक ही कीमैप का उपयोग करने वाले सभी बफ़र्स)। इसलिए यदि आपने कीमैप में कोई बदलाव किया है, तो जब भी आप बफर में माई मैजिकल मोड में प्रवेश करते हैं, तो उन्हें ओवरराइड किया जाएगा।

यदि आप विभिन्न स्थानों में कीमैप को अनुकूलित करते हैं तो दूसरी विधि भी भ्रामक हो सकती है। हुक को उनके द्वारा जोड़े गए आदेश से रिवर्स ऑर्डर में निष्पादित किया जाता है, और जब तक उन्हें पहली बार निष्पादित नहीं किया जाता है, तब तक आपको अपने अनुकूलन के कोई निशान नहीं दिखाई देंगे।


2

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

यह सुनिश्चित करने के लिए कि आप जो कहते हैं वह आपको सबसे अधिक दिखाई देता है, यह वह नहीं है जो आमतौर पर एक प्रमुख-मोड कीमैप को परिभाषित करने के लिए उपयोग किया जाता है । यह वह नहीं है जो आप उदाहरण के लिए Emacs के सोर्स कोड में पाते हैं। और यह वह नहीं है जो एलिफ़स मैनुअल (नोड Major Mode Conventions) में अनुशंसित है ।

बस उस रास्ते से बाहर निकलना चाहते थे, दूसरों के लिए स्पष्ट होना: आप आम तौर पर प्रमुख हुक को परिभाषित करने के लिए मोड हुक का उपयोग नहीं करना चाहते हैं।


उपयोगकर्ता कुंजी अनुकूलन के बारे में आपके प्रश्न के लिए -

किसी भी मामले में ऐसा नहीं है local-set-keyकि आपको एक मोड हुक का उपयोग करना चाहिए। बस define-keyप्रमुख-मोड कीमैप के साथ उपयोग करें , बिल्कुल आपके पहले उदाहरण में। @tarsius पहले से ही यह अच्छी तरह से समझाया है।

इसके अलावा, इसका उत्तर है: यह थोड़ा अंतर करता है, सामान्य रूप से , चाहे आप define-keyएक बार और सभी के लिए कुंजियों को बाँधते हैं ( मोड मैप के साथ) और यदि आप हर बार मोड में प्रवेश करने के लिए हुक का उपयोग करते हैं।

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

यह एकमात्र प्रभाव है, जिसके बारे में मैं सोच सकता हूं। आपके लिए यह तय करना कि आप उस अंतर को एक या दूसरे दृष्टिकोण का लाभ मानते हैं। FWIW, अपने स्वयं के कोड को देखते हुए, मुझे नहीं लगता कि मैं कभी भी मोड हुक पर चाबियाँ बांधता हूं।


धन्यवाद। मैंने इस सवाल को उम्मीद के साथ संशोधित किया है कि मैं इस तथ्य को स्पष्ट करता हूं कि मैं एक प्रमुख मोड नहीं बना रहा हूं , बस अपने स्वयं के प्रमुख बाइंडिंग और मौजूदा प्रमुख मोड को जोड़ रहा हूं ।
nispio

0

आपका नामकरण थोड़ा भ्रमित है (मुझे लगता है कि आपको myअपने प्रश्न के दूसरे भाग में हटा देना चाहिए )।

वैसे भी मान my-magical-keysलेना एक उपयोगकर्ता का कार्य है magical-mode, मैं एक स्पष्ट लाभ देखता हूं । remove-hookएक ही बार में हुक को हटाना (द्वारा ) आसान है ।

दूसरा फायदा यह है कि कार्यों के लिए क्या हैं। मेरा मतलब है कि वे पुन: प्रयोज्य हैं। आप उन्हें अन्य मोड पर हुक कर सकते हैं।

संपादित करें:

जैसा कि @tarsius ने बताया है, हुक हटाने से मूल व्यवहार बहाल नहीं होगा और फ़ंक्शन को मामूली मोड में बदलना बेहतर हो सकता है।


मैं एक काल्पनिक प्रमुख मोड को अनुकूलित कर रहा हूं जिसे कहा जाता है my-magical-mode। हालाँकि, यदि my-उपसर्ग का उपयोग भ्रामक है , तो मैं निश्चित रूप से प्रश्न को संपादित कर सकता हूं।
nispio

हां, यह बेहतर होगा, आमतौर पर (जैसा कि मैं जंगली में देखता हूं) my-उपयोगकर्ता कार्यों के लिए जोड़ा जाता है।
किंडरो

1
माना। मैंने सिर्फ my-इसलिए आवेदन किया कि कोई यह न सोचे कि मैं पूछ रहा था कि वास्तविक मोड को कॉन्फ़िगर कैसे करें magical-mode(यदि यह मौजूद है)।
nispio

1
नहीं, हुक हटाने से पुराने बाइंडिंग पुनर्स्थापित नहीं होंगे। कम से कम नहीं जब तक Emacs को फिर से शुरू नहीं किया जाता है, और तब मुझे इतने बड़े सुधार के रूप में चार के बजाय केवल एक लाइन पर टिप्पणी करने की आवश्यकता नहीं होती है।
तारसियस

2
दूसरे लाभ के रूप में आप इसका उल्लेख करते हैं: यहां एक मामूली मोड बनाना बेहतर होगा, जो कि तब विभिन्न प्रमुख मोड और / या केवल कुछ बफ़र्स के लिए सक्षम किया जा सकता है जो किसी विशेष प्रमुख मोड का उपयोग कर रहे हैं।
तारसियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.