2012-10-27 8 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

sebhofer:モード固有のキーマップの全体の意図は、モードがアクティブなどこでも有効になるということです。その行動を「一見一見単純」にすることを回避する。こうした状況を考えると、このソリューションはかなりエレガントに見えます。 – 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-pM-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))) 
関連する問題