6

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

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

4

2 回答 2

5

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

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

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

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

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

(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)))))

是否有您要解决的特定问题(除了这个问题)?

于 2009-05-04T13:14:22.783 回答
1

只需执行 Mx 查找功能

来自 Emacs 文档:

(查找函数)

求近点函数的定义。

在缓冲区中查找包含函数近点定义的源文件(由 `function-called-at-point' 选择),并将点放在定义之前。如果缓冲区已经存在,则在移动之前设置标记。

于 2009-05-04T11:20:35.817 回答