如何从 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 中的次要模式键盘映射中删除键?的主要内容,如果未能解决你的问题,请参考以下文章