Emacs

2012-10-27 13 views
14

में बफर-स्थानीय रूप से नाबालिग-मोड कुंजी बाइंडिंग ओवरराइड करना मैं एक मामूली मोड का उपयोग करना चाहता हूं जो एक प्रमुख-मोड कुंजी को पुनर्निर्मित करता है जिसे मैं निश्चित रूप से रखना चाहता हूं। वैश्विक स्तर पर नाबालिग मोड मानचित्र से इसे हटाए बिना मैं कुंजी को कैसे पुनर्जीवित कर सकता हूं? मुझे पता है कि मैं इसके लिए define-key का उपयोग कर सकता हूं, लेकिन मैं अन्य बफर/प्रमुख मोड के लिए बाध्यकारी रखना चाहता हूं।Emacs

क्या कोई मदद कर सकता है?

उत्तर

12

यह थोड़ा बोझिल है। आप कुछ ऐसा कर सकते हैं:

(add-hook '<major-mode>-hook 
    (lambda() 
    (let ((oldmap (cdr (assoc '<minor-mode> minor-mode-map-alist))) 
      (newmap (make-sparse-keymap))) 
     (set-keymap-parent newmap oldmap) 
     (define-key newmap [<thekeyIwanttohide>] nil) 
     (make-local-variable 'minor-mode-overriding-map-alist) 
     (push `(<minor-mode> . ,newmap) minor-mode-overriding-map-alist)))) 
+0

बढ़िया है, कि काम! मुझे आश्चर्य है कि यह प्रतीत होता है कि यह आसान काम इतना बोझिल है ... – sebhofer

+0

सेभोफर: मोड-विशिष्ट कुंजी मानचित्रों का पूरा इरादा यह है कि वे * हर जगह प्रभाव डालते हैं कि मोड सक्रिय है, इसलिए मैं कार्य नहीं कहूंगा उस व्यवहार को "बिल्कुल सरल" पर रोकना। उन परिस्थितियों को देखते हुए, यह समाधान काफी सुरुचिपूर्ण दिखता है। – phils

+0

@phils अच्छी तरह से देखने के थोड़ा सा दृष्टिकोण से कार्य है: दिए गए बफर में एक कीबाइंडिंग ओवरराइट करें। मेरे लिए काफी सरल लगता है। – sebhofer

11

यहां सभी बोझिल बिट्स को संभालने के लिए एक फ़ंक्शन है।

(defun local-set-minor-mode-key (mode key def) 
    "Overrides a minor mode keybinding for the local 
    buffer, by creating or altering keymaps stored in buffer-local 
    `minor-mode-overriding-map-alist'." 
    (let* ((oldmap (cdr (assoc mode minor-mode-map-alist))) 
     (newmap (or (cdr (assoc mode minor-mode-overriding-map-alist)) 
        (let ((map (make-sparse-keymap))) 
         (set-keymap-parent map oldmap) 
         (push `(,mode . ,map) minor-mode-overriding-map-alist) 
         map)))) 
    (define-key newmap key def))) 

इसके बाद आप

(local-set-minor-mode-key '<minor-mode> (kbd "key-to-hide") nil) 
+0

बहुत बहुत धन्यवाद, उम्मीद के अनुसार काम करता है! – sebhofer

1

कर सकते हैं मेरे मामले में, company-modeM-p और M-n जब कंपनी प्राप्तियां मेनू दिखाया जा रहा था के लिए cider-repl-mode बाइंडिंग अधिभावी किया गया था। समापन मेनू के लिए कीपैप company-active-map है, लेकिन इसके अनुरूप कोई मामूली मोड नहीं है (company-mode मेनू के लिए सक्रिय नहीं है), इसलिए मैं किसी भी मौजूदा उत्तर का उपयोग नहीं कर सका।

यहाँ है कि मैं क्या बजाय के साथ आया है:

(add-hook 'cider-repl-mode-hook 
      (lambda() 
      (make-local-variable 'company-active-map) 
      (setq company-active-map (copy-tree company-active-map)) 
      (define-key company-active-map (kbd "M-p") nil) 
      (define-key company-active-map (kbd "M-n") nil)))