【发布时间】:2009-05-04 11:17:04
【问题描述】:
考虑 Emacs 中的击键,例如C-x C-s。我可以通过键入 C-h c keystroke 来确定它调用了哪个函数,但是我如何才能找到这个键绑定的定义位置呢?
(也许正确的答案是无法确定,因为键盘映射不存储此类信息。)
【问题讨论】:
标签: emacs keyboard-shortcuts key-bindings
考虑 Emacs 中的击键,例如C-x C-s。我可以通过键入 C-h c keystroke 来确定它调用了哪个函数,但是我如何才能找到这个键绑定的定义位置呢?
(也许正确的答案是无法确定,因为键盘映射不存储此类信息。)
【问题讨论】:
标签: emacs keyboard-shortcuts key-bindings
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)))))
您是否正在尝试解决特定问题(除了这个问题)?
【讨论】:
只做 M-x 查找功能
来自 Emacs 文档:
(查找函数函数)
找到函数的定义 近点。
查找包含 近点函数的定义 (由选择 `function-call-at-point') 在一个 缓冲区和地点之前的点 定义。移动前设置标记,如果 缓冲区已经存在。
【讨论】: