Emacs中的缓冲区本地覆盖次模式键绑定

时间:2012-10-27 17:35:26

标签: emacs

我想使用一个次要模式来重新绑定一个我绝对想要保留的主模式键。如何重新绑定密钥而不将其从全局的次模式映射中删除?我知道我可以使用define-key,但我想保留其他缓冲区/主要模式的绑定。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:15)

这样做有点麻烦。你可以这样做:

(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))))

答案 1 :(得分: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)

答案 2 :(得分:2)

就我而言,当公司完成菜单显示时,company-mode覆盖了cider-repl-modeM-p的{​​{1}}绑定。完成菜单的键盘映射是M-n,但没有与之对应的次要模式(company-active-map用于菜单活动时),因此我无法使用任何现有的答案。

以下是我提出的内容:

company-mode