【问题标题】:In which file was the keybinding defined?在哪个文件中定义了键绑定?
【发布时间】:2009-05-04 11:17:04
【问题描述】:

考虑 Emacs 中的击键,例如C-x C-s。我可以通过键入 C-h c keystroke 来确定它调用了哪个函数,但是我如何才能找到这个键绑定的定义位置呢?

(也许正确的答案是无法确定,因为键盘映射不存储此类信息。)

【问题讨论】:

    标签: emacs keyboard-shortcuts key-bindings


    【解决方案1】:

    Emacs 不保存有关键绑定与函数关联的位置的信息。事实上,答案通常是不确定的。

    很多时候键绑定被设置为次要模式的副作用,或者通过模式挂钩。次要模式的键绑定通常存储在一些变量中,例如comint-mode-map。通过设置模式变量comint-mode 启用此键盘映射。但是,该模式映射是一个全局变量,任何地方的任何人都可以向它添加键绑定。所以,做你想做的事情本质上是跟踪谁设置了一个具有特定值的变量。类似地,对于通过模式挂钩在本地设置的键绑定(使用local-set-key)。此外,您甚至可以通过file variables 设置键绑定。所有这些只是说 Emacs 中的键绑定是短暂的。

    您能做的最好的事情是找到与密钥关联的函数,然后查看该文件(或任何相关文件,如果该模式被拆分为多个文件)。

    由于您可以通过多种方式设置/关联击键(全局、主要模式、次要模式、覆盖次要模式、缓冲区本地、文本属性等),因此在 emacs 中的键绑定查找相当复杂。如需快速概览,请查看this documentation

    您可以编写这样的函数来查看次要模式以查看可能设置键绑定的位置,但当然我的第一个测试显示键绑定没有在那里定义。但也许代码会很有启发性。

    (defun guess-where-keybinding-is-defined (key)
      "try to guess where a key binding might be defined"
      (interactive (list (read-key-sequence "Describe key: ")))
      (let ((bindings (minor-mode-key-binding key))
            found)
        (while (and bindings (not found))
          (if (setq found (caar bindings))
              (find-function (cdar bindings)))
          (setq bindings (cdr bindings)))))
    

    您是否正在尝试解决特定问题(除了这个问题)?

    【讨论】:

    • 感谢您的详细解答。昨天当我试图弄清楚这是在核心模式中或由外部包定义的特定键绑定时,我想到了这个问题。
    【解决方案2】:

    只做 M-x 查找功能

    来自 Emacs 文档:

    (查找函数函数)

    找到函数的定义 近点。

    查找包含 近点函数的定义 (由选择 `function-call-at-point') 在一个 缓冲区和地点之前的点 定义。移动前设置标记,如果 缓冲区已经存在。

    【讨论】:

    • 这不是我要找的。它告诉我在哪里定义了 function 而不是 keybinding
    • 我不认为你能找到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2023-03-08
    • 2011-08-06
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多