key-binding
探测当前事件键映射中的键。对于那些具有限制性的键映射,例如迷你缓冲区键映射或 isearch-mode-map
,一旦用户按下一组有限的已定义键之外的键,它们就会变得不活动,我无法在不停用这些键映射的情况下调用 key-binding
。
我如何:
确定调用某些命令后哪些键映射生效(例如,
isearch-mode-map
被isearch-forward-regexp 设置为 overriding-local-map
) 以不涉及分析源代码的方式。是否有可用于跟踪/记录变量状态的 Hook ?探测那些键映射中的键。例如,
isearch-mode-map
中的RET
绑定(bind)到什么?
我最接近的解决方案是绑定(bind)这个函数:
(defun probe_keybinding ()
(interactive)
(message (prin1-to-string (key-binding (read-key-sequence-vector "Enter key to probe"))))
)
到一个不常见的键,如“S-f9”,并在我感兴趣的键映射处于事件状态时调用它(例如,在迷你缓冲区中的 find-file
或 eval 表达式
)。这并不总是有效,例如,isearch-forward-regexp
在输入无法识别的 key 后立即退出。
最佳答案
没有简单的方法来确定将使用哪些键映射来响应特定命令。任何函数都可以随时调用
(use-local-map ...)
,因此唯一可以确定的方法是阅读源代码。话虽如此,Emacs 代码确实遵循了在许多情况下可以找到答案的约定。如果
foo-mode
有一个键映射,那么这个键映射通常会被命名为foo-mode-map
。您可以通过运行M-x apropos RET -map$ RET
查看名称以-map
结尾的变量列表。您可以使用函数
lookup-key
在键映射中查找键。请参阅 Emacs Lisp 手册中的“Functions for Key Lookup”。因此,要找出RET
在isearch-mode-map
中绑定(bind)到什么,计算:(lookup-key isearch-mode-map (kbd "RET")) ===> isearch-exit
关于Emacs,探测任意键映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200405/