किमैप्स के लिए अपनी कुंजियों को कैसे बांधें जो अभी तक लोड नहीं हुए हैं?


9

मैं use-packageस्थापित पैकेजों का प्रबंधन bind-keyकरने के लिए और मुझे पसंद आने वाली कस्टम कुंजियों को कार्य सौंपने के लिए उपयोग करता है।

मैं अधिकांश डिफ़ॉल्ट इमैक कीबाइंडिंग (जैसे C-nबन जाता है M-k, C-pबन जाता है M-i) को ओवरराइड करता हूं, लेकिन मैं अपनी कीबाइंडिंग योजना को ओवरराइड करने वाले अन्य मोड के साथ ठीक हूं। हालांकि, मैं चाहता हूं कि मेरी कीबाइंडिंग बनी रहे। मुझे M-kडिफ़ॉल्ट Gnus या Helm की तुलना में कुछ और मतलब है।

हालाँकि, वे Emacs स्टार्टअप पर एक-दूसरे के साथ संघर्ष करते हैं, क्योंकि मैं कीमैप में बाइंडिंग नहीं जोड़ सकता, अगर यह मौजूद नहीं है (क्योंकि use-packageकभी-कभी पैकेज की लोडिंग ख़राब होती है)। उदाहरण के लिए, निम्न आदेश त्रुटियां (जैसे (void-variable helm-map)) फेंकते हैं , क्योंकि हेल्म और ग्नस अभी तक पूरी तरह से लोड नहीं हुए हैं।

(bind-key "M-Y" 'helm-end-of-buffer helm-map)
(bind-key "M-k" 'helm-next-line helm-find-files-map)
(bind-key "M-s" 'other-window gnus-summary-mode-map)

मेरे पास use-packageएक फाइल में और एक फाइल bind-keyमें कस्टम कीबाइंडिंग के लिए मेरे सभी चालान हैं । मैं use-packageकॉल में बाइंडिंग नहीं रखना चाहता , क्योंकि शायद मैं एक स्टैंडअलोन पैकेज के रूप में अपनी कस्टम कीबाइंडिंग योजना प्रकाशित करना चाहता हूं। क्या होगा यदि मैं चाहता हूं कि मेरी योजना को स्थापित करने वाले किसी व्यक्ति के पास हेल्म और ग्नस लोकल कीबाइंडिंग भी हो?

मैं मोड-लोकल कीबाइंडिंग का उपयोग कैसे कर सकता हूँ bind-key, ताकि सभी कुंजियाँ सेट हो जाएँ, भले ही संकुल हाल ही में लोड किए गए हों, और सभी मुख्य सेटिंग्स एक फ़ाइल के अंदर हों?

जवाबों:


20

आप with-eval-after-loadएक महत्वपूर्ण मॉड्यूल लोड होने के बाद (और इस तरह कीमैप को परिभाषित किया गया है) तक कुंजी बंधन को स्थगित करने के लिए उपयोग कर सकते हैं।

(with-eval-after-load "helm"
  (bind-key "M-Y" #'helm-end-of-buffer helm-map))

का प्रयोग करें C-h v helm-mapजो मॉड्यूल कीमैप में परिभाषित किया गया है खोजने के लिए, और इस प्रकार स्ट्रिंग में पहली पंक्ति पर क्या डाल करने के लिए।


with-eval-after-load24.4 Emacs में पेश किया गया था। यदि आपके पास पहले वाला Emacs संस्करण है, तो आपको eval-after-loadइसके बजाय उपयोग करने की आवश्यकता होती है , और bind-keyकॉल के सामने एक ही उद्धरण रखा जाता है :

(eval-after-load "helm"
  '(bind-key "M-Y" #'helm-end-of-buffer helm-map))

यदि आप bind-keyइस रूप में कई कॉल करना चाहते हैं , with-eval-after-loadतो आप बस एक के बाद एक उन्हें डालते हैं, लेकिन eval-after-loadआपको उन सभी को एक में लपेटने की आवश्यकता है progn:

(eval-after-load "helm"
  '(progn
     (bind-key "M-Y" #'helm-end-of-buffer helm-map)
     (bind-key "M-k" #'helm-next-line helm-find-files-map)))

9

समाधान

किसी दिए गए पैकेज के लोड होने के बाद सामान को निष्पादित करने के लिए, आपको उसके बाद :configमें रखना होगा use-package

यहाँ आपके प्रश्न में स्निपेट का उपयोग करने का एक उदाहरण दिया गया है:

स्निपेट # 1

(use-package helm
  :config
  (progn
    (bind-key "M-Y" #'helm-end-of-buffer helm-map)
    (bind-key "M-k" #'helm-next-line helm-find-files-map)))

(use-package gnus
  :config
  (bind-key "M-s" #'other-window gnus-summary-mode-map))

व्याख्या

आपके ईमेक में अलग-अलग स्थानों पर init.elया लोडेड / आवश्यक किसी भी नेस्टेड फ़ाइल में नीचे के 2 स्निपेट्स रखना ठीक है ।

स्निपेट # 2

(use-package gnus)

स्निपेट # 3

(use-package gnus
  :config
  (bind-key "M-s" #'other-window gnus-summary-mode-map))

कारण यह है कि इससे कोई फर्क नहीं पड़ता कि उपरोक्त 2 स्निपेट में से कौन सा पहले निष्पादित किया गया है।

यहाँ क्यों है .. नीचे क्या स्निपेट # 3 का विस्तार है।

जब आप M-x pp-macroexpand-last-sexpउस स्निपेट के अंतिम समापन कोष्ठक के बाद बिंदु (कर्सर) करते हैं तो आप नीचे प्राप्त करते हैं ।

स्निपेट # 4

(if (not (require 'gnus nil t))
    (ignore (message (format "Could not load %s" 'gnus)))
  (condition-case-unless-debug err
      (bind-key "M-s" #'other-window gnus-summary-mode-map)
    (error
     (ignore
      (display-warning 'use-package
                       (format "%s %s: %s" "gnus" ":config"
                               (error-message-string err))
                       :error))))
  t)

उपरोक्त स्निपेट मूल रूप से इसका मतलब है

  • gnusपहले आवश्यक है और फिर bind-keyफ़ॉर्म निष्पादित किया गया है।
  • यदि gnusनहीं मिला है, तो आप एक संदेश * संदेश * बफर में कहेंगे कि पैकेज लोड नहीं किया जा सकता है।
  • यदि निष्पादन में कोई समस्या है, तो यह त्रुटि को फेंक देगा (bind-key "M-s" #'other-window gnus-summary-mode-map)

इसके अलावा अगर gnusपहले से ही स्निपेट # 2 द्वारा आवश्यक है और इसे फिर से स्निपेट # 3 द्वारा आवश्यक है , तो इससे कोई फर्क नहीं पड़ता क्योंकि requireपहले से लोड होने पर पैकेज को फिर से लोड नहीं करता है।


संदर्भ

इसके गितुब पर use-packageमूल बातें से ,

:configएक पैकेज लोड होने के बाद कोड निष्पादित करने के लिए इस्तेमाल किया जा सकता है। ऐसे मामलों में जहां लोडिंग को आलसी किया जाता है (नीचे दिए गए ऑटोलॉडिंग के बारे में अधिक देखें), इस निष्पादन को ऑटोडैड के बाद तक स्थगित कर दिया जाता है:

स्निपेट # 5

(use-package foo
  :init
  (setq foo-variable t)
  :config
  (foo-mode 1))

ऊपर पैकेज लोड होने से पहले:init अनुभाग ( (setq foo-variable t)) निष्पादित करता है। लेकिन में खंड के निष्पादित होने के बाद भरी हुई है। foo(foo-mode 1):config foo


3

अन्य उत्तरों के विपरीत, मैंने हमेशा इसके लिए हुक का उपयोग किया है:

(defun my-company-maps()
  (define-key company-active-map "\C-x\M-h" 'company-show-doc-buffer)
  (define-key company-active-map "\C-n" 'company-select-next)
  (define-key company-active-map "\C-p" 'company-select-previous)
  (define-key company-active-map "\C-h" 'delete-backward-char))

(add-hook 'company-mode-hook 'my-company-maps)

मुझे भी, मुझे लगा कि यह करने का पसंदीदा तरीका था।
सार्थक यूजरनेम

2

चूंकि आप पहले से ही बिंद-कुंजी का उपयोग कर रहे हैं, सीधे इसके प्रलेखन से bind-key.el:

यदि आप चाहते हैं कि कीबाइंडिंग सभी छोटे मोड को ओवरराइड करे जो एक ही कुंजी को बाँध सकता है, तो `बाइंड-की * 'का उपयोग करें:

(bind-key* "<C-return>" 'other-window)

कीमैप के भीतर एक कुंजी को अनबाइंड करने के लिए (उदाहरण के लिए, अपने पसंदीदा प्रमुख मोड को एक बंधन को बदलने से रोकने के लिए जिसे आप हर जगह ओवरराइड नहीं करना चाहते हैं), अनबाइंड-की का उपयोग करें:

(unbind-key "C-c x" some-other-mode-map)

यदि कीमैप अभी अपरिभाषित नहीं है, तो अंतिम फ़ॉर्म टूट जाता है क्योंकि फ़ाइल की परिभाषा some-other-mode-mapअभी तक लोड नहीं की गई है। तो आप इसे एक (पैकेज परिभाषित ), या उपयोग के use-packageलिए रख सकते हैं :some-other-modesome-other-mode-mapwith-eval-after-load

(with-eval-after-load 'some-other-mode
  (unbind-key "C-c x" some-other-mode-map))

एक अन्य विकल्प आपके स्वयं के मामूली मोड को परिभाषित करेगा जिसमें सभी बाइंडिंग शामिल होंगे जिन्हें प्रमुख मोड द्वारा ओवरराइड नहीं किया जाना चाहिए:

(defvar my-very-own-keymap (make-keymap) "my very own keymap.")

(define-key my-very-own-keymap (kbd "M-i") 'my-foo)

(define-minor-mode my-very-own-keys-minor-mode
  "Minor mode with my very own keybindings."
  t " my-own-keys" my-very-own-keymap)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.