如何从Emacs的次模式按键映射中删除一个按键?

43

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

我尝试了local-unset-key,但它只取消当前major模式映射中的键绑定。

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

3个回答

57

你可以使用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)

23
不要在挂钩函数中调用define-key,除非是极力执行自己的绑定的特定模式。实际上我想不出任何例子。每个较小/较大的模式只有一个按键映射,因此每次进入模式时重复修改它没有意义。请改用eval-after-load - event_jr
谢谢你们两位。我没有想到可以使用nil来取消定义一个键。eval-after-load的提示完善了答案。我会接受这个答案并点赞评论。 - malana
2
要明确一点,@event_jr建议使用类似于(eval-after-load 'reftex'(define-key reftex-mode-map "\C-c/" nil))的方法。eval-after-load的第一个参数--这里是reftex--是模式“提供”的名称。 - ntc2
1
作为对event_jr的回应,这里有一个积极强制执行模式自身绑定的示例:flyspell-mode。偶尔它会覆盖我的按键绑定,即使我使用eval-after-load将其设置为null,然后在我的模式中将其设置为我想要的。 - Adrian Chira
(define-key reftex-mode-map "\C-c/" nil :append t) 如果绑定在hook中定义,请附加。 - Michael Fox

7
您可以使用以下命令:
(define-key reftex-mode-map "\C-c/" nil)

要将此功能从C-c /取消映射... 但是需要加载reftex-mode,以便可以修改reftex-mode-map


1

这是我做事的方式。虽然还有改进的空间。

 (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中。 - knobo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接