एक ही बफर में दो प्रमुख-मोड-मैप का उपयोग करें


11

मैंने कुछ स्थितियों में भाग लिया है जहाँ एक प्रमुख मोड के कीमैप को एक अन्य प्रमुख-मोड के लिए फ़ॉलबैक कीमैप के रूप में होना बहुत सुविधाजनक होगा। उदाहरण के लिए:

  • मैं अपने कुछ ओआरजी दस्तावेजों में बहुत सारे एलईटीएक्स लिखता हूं, इसलिए latex-modeसंपादन करते समय आसानी से उपलब्ध होने वाली कमांड के लिए यह बहुत अच्छा होगा org-mode
  • मैं बार-बार markdown-modeमार्कडाउन समर्थन के साथ एक irc कमरे में आता हूं, इसलिए इसमें कीबाइंड को जोड़ना भी अच्छा होगा erc-mode

दोनों ही मामलों में इस अतिरिक्त कीमैप को एक कमबैक के रूप में कार्य करना चाहिए (इस कारण मैं इसके लिए मामूली मोड का उपयोग नहीं कर सकता)। मैं किसी भी org-modeकुंजी को ओवरराइड करने के लिए लेटेक्स कमांड नहीं चाहता । मैं जो चाहता हूं वह है:
यदि एक कुंजी को परिभाषित किया गया है latex-mode-mapऔर यह परिभाषित नहीं है org-mode-mapतो latex-mode-mapबाध्यकारी का उपयोग करें

प्रश्न: मैं एक की -मैप को एक प्रमुख-मोड के लिए फ़ॉलबैक कीमैप के रूप में कैसे सेट कर सकता हूं?
या
क्यू: कैसे एक प्रमुख-मोड-मैप से दूसरे में कॉपी कर सकते हैं, बिना कुछ ओवरराइड किए?


केवल स्पष्ट करने के लिए। मुझे पता है कि मैं इन कुंजियों को एक-एक करके परिभाषित कर सकता हूं, लेकिन स्वचालित समाधान के लिए यह असीम रूप से अधिक सुविधाजनक होगा।


6
एक कीमैप मर्ज का उपयोग करें। देखते हैं make-composed-keymap
ड्रू

जवाबों:


12

यह सरल हो गया तो उम्मीद थी। जैसा कि यहां टिप्पणियों में और प्रश्न पर सुझाव दिया गया है:

(with-eval-after-load 'erc
  (require 'markdown-mode)
  (require 'cl-lib)
  (setq erc-mode-map
        (make-composed-keymap (cl-copy-list erc-mode-map)
                              markdown-mode-map)))

यह एक कीमैप बनाएगा, जो एक प्रति है, erc-mode-mapलेकिन यह भी विरासत में मिला है markdown-mode-mapmarkdownजब भी वे चाबियों से टकराएंगे तो सभी चाबियां छाया रहेंगी erc

अगर आप चाहते हैं कि मुख्य केमप को आउट करने के लिए फॉलबैक कीमैप की कुछ चाबियां हैं, तो उन्हें मुख्य एक में अक्षम करें।

(define-key erc-mode-map "\C-c\C-a" nil)

2
मैंने देखा है कि का उपयोग कर define-keyकी वापसी मूल्य पर make-composed-keymapमूल keymaps पर अप्रत्याशित दुष्प्रभाव हो सकते हैं, और मैं एक ही इस मैन्युअल रूप से करने के लिए लागू हो सकता है पर शक appendedनक्शा। यदि आप उपयोग करना चाहते हैं define-key, तो यह एक नया कीमैप बनाने के लिए सबसे सुरक्षित प्रतीत होता है जिसका मूल कीमैप एक बनावटी कीमैप है।
जॉन ओ।

@JonO। वास्तव में, मुझे यह जानकर बहुत आश्चर्य हुआ कि यहाँ ऐसा नहीं होता है। यदि मैं करता हूं (define-key erc-mode-map "\C-c\C-s" nil), तो संबंधित markdown-modeकुंजी अभी भी erc बफ़र्स में भी उपलब्ध होगी ।
मालाबार

मालाबार: मेरा मानना ​​है कि आपकी पिछली टिप्पणी उस कोड परिवर्तन के बाद लागू नहीं होगी। make-composed-keymapप्रलेखन कहते हैं, "एक शून्य एमएपीएस में बाध्यकारी किसी भी PARENT में बाध्यकारी इसी है, लेकिन यह इसी एमएपीएस के अलावे कुंजीमैप में बाइंडिंग पर हावी नहीं होता ओवरराइड करता है।" जैसा कि markdown-mode-mapआपके उदाहरण में मौजूद है, मुझे उम्मीद है कि nilबाइंडिंग मार्कडाउन बंधन को बाधित करेगी ?
फिल्स

2
मेरी व्याख्या यह है कि आपके द्वारा वर्णित प्रभाव (make-composed-keymap (list erc-mode-map markdown-mode-map)) होगा , हालांकि?
फिल्स

1
cl-copy-listवास्तव में आप क्या चाहते हैं नहीं करेंगे। यदि आप कीमैप को कॉपी करना चाहते थे, तो आपको उपयोग करना चाहिए था copy-keymap
स्टीफन

3

जैसा कि @Malabarba द्वारा बताया गया है, आप इसके लिए उपयोग कर सकते हैं make-composed-keymap। लेकिन यदि आप वास्तव में चाहते हैं कि नया कीमैप दोनों कीमैप से प्राप्त हो, तो इस तरह के नए कीमैप को संशोधित करने से अन्य दो कीमैप पर कोई प्रभाव नहीं पड़ता है, आपको इसे दो चरणों में करने की आवश्यकता है:

(make-composed-keymap
 nil (make-composed-keymap (list erc-mode-map markdown-mode-map)))

ऐसा इसलिए है क्योंकि define-keyकभी-कभी पास किए गए नक्शों को पहले तर्क के रूप में संशोधित किया जा सकता है, make-composed-keymapलेकिन दूसरे के रूप में पारित नहीं किए गए। मुझे लगता है कि आपको दूसरे तर्क के रूप में कीमैप की एक सूची स्वीकार करने का M-x report-emacs-bugअनुरोध करना चाहिए , ताकि आप बस कर सकेंmake-composed-keymap

(make-composed-keymap nil (list erc-mode-map markdown-mode-map))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.