【问题标题】:How to remove a key from a minor-mode keymap in Emacs?如何从 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/

【问题讨论】:

    标签: emacs keyboard-shortcuts elisp


    【解决方案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 中。
      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2011-01-14
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多