如何从 Emacs 中的次要模式键盘映射中删除键?

Posted

技术标签:

【中文标题】如何从 Emacs 中的次要模式键盘映射中删除键?【英文标题】:How to remove a key from a minor-mode keymap in Emacs? 【发布时间】:2011-11-27 17:53:36 【问题描述】:

我已将 C-c/ 全局分配给 ace-jump-mode,但 reftex-mode(与 AucTeX 一起使用的引用的次要模式)用我从未使用过的一些功能覆盖了此键。

我尝试了local-unset-key,但它只是从当前主要模式的地图中解除绑定键。

如何在不更改 reftex.el 的情况下从 reftex-mode-map 中删除 C-c/

【问题讨论】:

【参考方案1】:

您可以使用define-key 更改现有的键映射。通过将nil 作为要调用的函数传递,键将变为未绑定。我想您应该能够执行以下操作:

(define-key reftex-mode-map "\C-c/" nil)

当然,您应该在某种钩子中执行此操作,例如:

(defun my-reftex-hook ()
  (define-key reftex-mode-map "\C-c/" nil))
(add-hook 'reftex-mode-hook 'my-reftex-hook)

【讨论】:

没有。不要从钩子中调用define-key,除非非常特定的模式会积极地强制执行自己的绑定。我真的想不出任何例子。每个次要/主要模式只有一个键盘映射,因此每次进入该模式时都重复修改它是没有意义的。请改用eval-after-load 感谢两位。我没有想到使用 nil 取消定义密钥。 eval-after-load 提示完成了答案。我会接受答案并 +1 评论。 需要明确的是,@event_jr 建议类似(eval-after-load 'reftex '(define-key reftex-mode-map "\C-c/" nil))eval-after-load 的第一个参数——这里是reftex——是模式“提供”的名称。 作为对 event_jr 的响应,这里有一个积极强制执行模式自身绑定的示例:flyspell-mode。有时它会覆盖我的键绑定,即使我使用 eval-after-load 将其设置为 null,然后在我的模式下将其设置为我想要的。 (define-key reftex-mode-map "\C-c/" nil :append t) 附加以防绑定本身在挂钩中定义。【参考方案2】:

您可以使用以下命令:

(define-key reftex-mode-map "\C-c/" nil)

C-c /取消映射这个函数...但是reftex-mode应该被加载,所以reftex-mode-map可以修改

【讨论】:

【参考方案3】:

这就是我的做法。不过,它还可以改进。

 (defun get-key-combo (key)
  "Just return the key combo entered by the user"
  (interactive "kKey combo: ")
  key)

(defun keymap-unset-key (key keymap)
    "Remove binding of KEY in a keymap
    KEY is a string or vector representing a sequence of keystrokes."
    (interactive
     (list (call-interactively #'get-key-combo)
           (completing-read "Which map: " minor-mode-map-alist nil t)))
    (let ((map (rest (assoc (intern keymap) minor-mode-map-alist))))
      (when map
        (define-key map key nil)
        (message  "%s unbound for %s" key keymap))))
;;
;; Then use it interativly
;; Or like this:

(keymap-unset-key  '[C-M-left]   "paredit-mode")
..
..

【讨论】:

这对于交互使用最有用。我通常这样做是为了找出要从中删除密钥的映射以及密钥的名称。然后在源代码中查找地图并知道要解除绑定的 键名 会更容易。例如 Ctrl-|是关键 [67108988]。然后我使用 repeat-complex-command 并将其剪切并粘贴到 .emacs 中。

以上是关于如何从 Emacs 中的次要模式键盘映射中删除键?的主要内容,如果未能解决你的问题,请参考以下文章

在 Emacs 中全局覆盖键绑定

在 Emacs 中,如何根据缓冲区名称自动启用次要模式?

如何在 emacs 启动时默认启用非全局次要模式?

如何在 Emacs 中选择或突出显示一个块?

运行 emacs 时将自动填充模式作为次要模式打开

emacs 的使用:哪些是真正有用的组合键