एमएसीएस में विश्व स्तर पर महत्वपूर्ण बाध्यकारी


100

मैं एक महत्वपूर्ण बाइंडिंग कैसे सेट कर सकता हूं जो विश्व स्तर पर ओवरराइड करता है और उस कुंजी के लिए अन्य सभी बाइंडिंग पर पूर्वता लेता है? मैं सभी प्रमुख / लघु मोड मानचित्रों को ओवरराइड करना चाहता हूं और सुनिश्चित करता हूं कि मेरा बंधन हमेशा प्रभाव में रहे।

यह काम नहीं करता है:

(global-set-key "\C-i" 'some-function)

यह काम करता है text-mode, लेकिन जब मैं उपयोग करता हूं lisp-mode, तो C-iइसका पलटाव होता है lisp-indent-line

मैं lisp-modeव्यक्तिगत रूप से और हर मोड में इस बंधन को पार कर सकता हूं और पार कर सकता हूं , लेकिन एक आसान तरीका होना चाहिए। हर बार जब मैं एक नई फ़ाइल प्रकार के लिए एक नया मोड स्थापित करता हूं, तो मुझे वापस जाना होगा और यह सुनिश्चित करने के लिए जांचना होगा कि मेरे सभी प्रमुख बाइंडिंग नए मोड द्वारा ओवरराइड नहीं किए जा रहे हैं।

मैं ऐसा करना चाहता हूं क्योंकि मैं उन बाइंडिंग का अनुकरण करना चाहता हूं जो मैंने पहले से ही सीखा है और अन्य संपादकों से निपुण हूं।

जवाबों:


149

मैं अपने सभी "ओवरराइड" कुंजी बाइंडिंग के लिए एक मामूली मोड का उपयोग करता हूं:

(defvar my-keys-minor-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "C-i") 'some-function)
    map)
  "my-keys-minor-mode keymap.")

(define-minor-mode my-keys-minor-mode
  "A minor mode so that my key settings override annoying major modes."
  :init-value t
  :lighter " my-keys")

(my-keys-minor-mode 1)

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

ध्यान दें कि आपको इसे मिनीबार में बंद करने की आवश्यकता हो सकती है:

(defun my-minibuffer-setup-hook ()
  (my-keys-minor-mode 0))

(add-hook 'minibuffer-setup-hook 'my-minibuffer-setup-hook)

1
यह एक अच्छा विचार है। क्या यह सुनिश्चित करने का कोई तरीका है कि आपका मामूली मोड अन्य मामूली मोड के साथ नहीं लड़ता है?
ब्रायन कारपर

3
सुनिश्चित करें कि आपका मामूली मोड सूची में मामूली-मोड-मैप-एलिस्ट पर है।
ट्रे जैक्सन

2
ट्रे सही है। आमतौर पर इसे अपने .emacs के अंत के पास रखना पर्याप्त होता है। इसके अलावा, आपके द्वारा ओवरराइड किए जाने वाले अधिकांश बाइंडिंग ऐसे होंगे जो प्रमुख मोड सेट कर रहे हैं ... मामूली मोड आमतौर पर रास्ते से बाहर रहते हैं।
स्काउटफ्रैजर

मैंने इस दृष्टिकोण का पालन किया, लेकिन फिर मुझे एहसास हुआ कि मैं जिस चीज से सीआई को बांधता हूं वह भी टीएबी कुंजी से बंध जाती है। कोई सुझाव?
स्टीव

3
ब्रायन छिद्रान्वेषी: यहाँ बाद में-भरी हुई नाबालिग मोड से निपटने के लिए बढ़ा हुआ है: stackoverflow.com/questions/683425/...
फिल्स

30

इसके अलावा scottfrazer के जवाब के लिए , मैंने निम्नलिखित लिखा है ताकि मेरी कीबाइंडिंग पूर्वता बनाए रखें, भले ही बाद में भरी हुई लाइब्रेरी अपने स्वयं के नए कीमैप में लाए।

क्योंकि संकलन समय पर कीमैप उत्पन्न किया जा सकता है, loadऐसा करने के लिए सबसे अच्छी जगह की तरह लग रहा था।

(add-hook 'after-load-functions 'my-keys-have-priority)

(defun my-keys-have-priority (_file)
  "Try to ensure that my keybindings retain priority over other minor modes.

Called via the `after-load-functions' special hook."
  (unless (eq (caar minor-mode-map-alist) 'my-keys-minor-mode)
    (let ((mykeys (assq 'my-keys-minor-mode minor-mode-map-alist)))
      (assq-delete-all 'my-keys-minor-mode minor-mode-map-alist)
      (add-to-list 'minor-mode-map-alist mykeys))))

मैं अपनी स्क्रिप्ट चिपकाया लेकिन यह किसी भी को प्रभावित नहीं किया :(
alper

@alper मैं सुझाव देता हूं कि आप सभी प्रासंगिक विवरणों के साथ एक प्रश्न पोस्ट करें, जिसमें आपके द्वारा उपयोग किए जा रहे कोड और समस्या को पुन: उत्पन्न करने के लिए एक विशिष्ट उदाहरण / नुस्खा शामिल है।
phils

21

स्थापित use-package, eval और आप कर रहे हैं:

(require 'bind-key)
(bind-key* "C-i" 'some-function)

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

2
यह ('बाइंड-की' पैकेज) सबसे सुविधाजनक समाधान लगता है; साझा करने के लिए धन्यवाद।
ऑलिगिलो

मैं मैच के लिए सक्षम नहीं था use-package:Install package: use-package [No Match]
alper

14

मुझे यह प्रश्न "emacs undefine org mode keybindings" की खोज करते हुए मिला, क्योंकि मैं अपने Cc Cb व्यवहार को मौजूदा करने के लिए अपने वैश्विक मानचित्र को बरी-बफर को ऑर्गन बफर में काम करने की अनुमति देना चाहता था।

यह मेरे लिए सबसे सरल उपाय रहा:

(add-hook 'org-mode-hook
      (lambda ()
        (local-unset-key (kbd "C-c C-b"))))

1
यह मोड-विशिष्ट है और बड़ी तस्वीर को संबोधित नहीं करता है, भले ही यह आपके एकल उपयोग के मामले में काम करता हो।
रिचीएच

12

यद्यपि स्कॉचफ्राज़र का उत्तर ठीक वही है जो आपने पूछा था, मैं पोस्टरिटी के लिए एक और समाधान का उल्लेख करूंगा।

से Emacs मैनुअल :

"लिस्प कार्यक्रमों में एक कुंजी के रूप में सीसी पत्र को परिभाषित न करें। सीसी और एक पत्र (या तो ऊपरी या निचले मामले) से युक्त अनुक्रम उपयोगकर्ताओं के लिए आरक्षित हैं; वे केवल उपयोगकर्ताओं के लिए आरक्षित अनुक्रम हैं, इसलिए उन्हें ब्लॉक न करें।"

यदि आप अपने व्यक्तिगत वैश्विक बाइंडिंग को Cc प्लस एक पत्र से जोड़ते हैं, तो आपको "सुरक्षित" होना चाहिए। हालाँकि, यह केवल एक सम्मेलन है, और कोई भी मोड अभी भी आपके बाइंडिंग को ओवरराइड करने में सक्षम है।


3
मुझे इस नियम को तोड़ने के लिए सभी मोड के org-mode की उम्मीद नहीं थी। `Cc Ch 'मुझे बताता है कि Cc a, b, c, और l क्रमशः org- एजेंडा, org-iswitchb, org- कैप्चर और ऑर्ग-स्टोर-लिंक से जुड़े हैं।
नैट पार्सन्स

7
Afaik, बाइंडिंग यह पहला चरण org- मोड है जिसका उपयोग करने के लिए यह सुझाव देता है, लेकिन उपयोगकर्ता को उन्हें स्वयं परिभाषित करना होगा (अर्थात यह डिफ़ॉल्ट रूप से नहीं किया गया है), और ऐसा करते समय कोई अन्य चुन सकता है। (यह भी, क्योंकि इन बाइंडिंग को वैश्विक माना जाता है,
ऑर्गन

3

यदि आप "हमेशा मानचित्र में कीबाइंड का उपयोग करना चाहते हैं, जब तक कि मैं स्पष्ट रूप से एक विशिष्ट मोड-मैप के लिए उन्हें ओवरराइड नहीं करता हूं", और यह मानते हुए कि आप स्कॉचफ्रेज़ियर के दृष्टिकोण का उपयोग कर रहे हैं , आप चाहते हैं:

(defun locally-override (key cmd)
  (unless (local-variable-p 'my-keys-minor-mode-map)
    (set (make-variable-buffer-local 'my-keys-minor-mode-map)
         (make-sparse-keymap))
    (set-keymap-parent my-keys-minor-mode-map 
                       (default-value 'my-keys-minor-mode-map)))
  (define-key my-keys-minor-mode-map key cmd))

इसलिए

(locally-override "\C-i" nil)

केवल वर्तमान बफ़र में मामूली मोड से "\ Ci" बाइंडिंग को निकालना चाहिए। चेतावनी: यह पूरी तरह से अप्रयुक्त है, लेकिन सही दृष्टिकोण की तरह लगता है। माता-पिता को सेट करने के बजाय मेरी-कीस-मामूली-मोड-मैप के वैश्विक मूल्य का मुकाबला करने के बजाय वैश्विक मूल्य में बाद में होने वाले परिवर्तन स्वचालित रूप से स्थानीय मूल्य में परिलक्षित होते हैं।


2

मुझे नहीं लगता कि आप कर सकते हैं। यह मोटे तौर पर यह कहने के बराबर है कि आप एक वैश्विक वैरिएबल को परिभाषित करना चाहते हैं जिसे फ़ंक्शंस में स्थानीय चर घोषणाओं द्वारा छिपाया नहीं जा सकता है। स्कोप बस उस तरह से काम नहीं करता है।

हालाँकि, मोड सूची के माध्यम से जाने के लिए और आपके लिए हर एक में इसे फिर से असाइन करने के लिए एक संभावित फ़ंक्शन लिखने का एक तरीका हो सकता है।


स्कूपिंग का यह विचार तकनीकी रूप से सही है, लेकिन overriding-local-mapविशेष रूप से अन्य सभी मानचित्रों को ओवरराइड करने के लिए डिज़ाइन किया गया है। हालांकि इसका इस्तेमाल करना खतरनाक है।
Event_jr

2

जब तक आप वास्तव में खुद ऐसा नहीं करना चाहते हैं, आपको अपने आस-पास की जाँच करनी चाहिए और देखना चाहिए कि क्या किसी और ने पहले ही कर लिया है।

Emacs के लिए एक पैकेज है जो आपकी विंडोज़ जैसी कीबाइंडिंग देता है। आपको इसे Google के माध्यम से खोजने में सक्षम होना चाहिए।


4
आप जिस पैकेज के बारे में सोच रहे हैं वह शायद है cua-mode
आकर्षित किया

1
हां, वह पैकेज है।
जेसपेई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.