考虑Emacs中的击键,例如 C-x C-s 。我可以通过键入 C-h c 击键 找出它调用的函数,但是如何找到定义此键绑定的位置?
(也许正确的答案是无法确定,因为键盘映射不存储此类信息。)
答案 0 :(得分:5)
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)))))
您是否正在尝试解决一个特定问题(除了这个问题)?
答案 1 :(得分:1)
只做M-x查找功能
来自Emacs doc:
(查找功能函数)
找到函数的定义 近点。
查找包含的源文件 近点函数的定义 (由...选择 a中的`function-called-at-point') 缓冲区和位置之前的点 定义。移动前设置标记,如果 缓冲区已经存在。