19

絶対に残しておきたいメジャーモードキーを再バインドするマイナーモードを使いたいです。マイナー モード マップからグローバルにキーを削除せずにキーを再バインドするにはどうすればよいですか? 私はそれを使用できることを知っていますがdefine-key、他のバッファー/メジャーモードのバインディングを維持したいと考えています。

誰でも助けることができますか?

4

3 に答える 3

16

するのは少し面倒です。次のようなことができます:

(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))))
于 2012-10-27T18:13:47.873 に答える
14

これは、すべての面倒なビットを処理する関数です。

(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)
于 2013-02-08T09:11:26.493 に答える
3

私の場合、会社の完了メニューが表示されていたときのバインディングをオーバーライドcompany-modeしていました。補完メニューのキーマップは ですが、それに対応するマイナーモード (メニューがアクティブでない場合) がないため、既存の回答を使用できませんでした。cider-repl-modeM-pM-ncompany-active-mapcompany-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)))
于 2016-08-01T23:41:28.777 に答える