key-binding
探测当前活动键盘图中的键。对于那些键盘图,例如迷你缓冲区或isearch-mode-map
,一旦用户按下有限的一组有限键之外的键,就会限制并变为非活动状态,我无法在没有key-binding
的情况下调用停用这些键盘图。
我如何:
确定在调用某些命令后生效的键盘映射(例如,isearch-mode-map
被isearch-forward-regexp
设置为覆盖本地映射),其方式不涉及分析源码。是否有可用于跟踪/记录变量状态的钩子?
这些键盘图中的探测键。例如,RET
中绑定的isearch-mode-map
是什么?
我最接近的解决方案是绑定此功能:
(defun probe_keybinding ()
(interactive)
(message (prin1-to-string (key-binding (read-key-sequence-vector "Enter key to probe"))))
)
到一个不常见的密钥,如'S-f9',并在我感兴趣的键盘映射处于活动状态时调用它(例如在迷你缓冲区的find-file
中间或eval-expression
)。这并不总是有效,例如,只要输入了未识别的密钥,isearch-forward-regexp
就会退出。
答案 0 :(得分:4)
没有简单的方法来确定响应特定命令将使用哪些键盘映射。任何函数都可以随时调用(use-local-map ...)
,因此唯一可以确定的是阅读源代码。
话虽如此,Emacs代码确实遵循的惯例可以在很多情况下找到答案。如果foo-mode
有一个键映射,那么键映射通常会被命名为foo-mode-map
。您可以通过运行-map
查看名称以M-x apropos RET -map$ RET
结尾的变量列表。
您可以使用函数lookup-key
在键盘映射中查找键。请参阅Emacs Lisp手册中的“Functions for Key Lookup”。因此,要找出RET
中isearch-mode-map
绑定的内容,请评估:
(lookup-key isearch-mode-map (kbd "RET"))
===> isearch-exit
答案 1 :(得分:2)
答案的另一个要素是查看单个键盘图。不幸的是,如果您只是C-h v isearch-mode-map
(或任何其他键映射变量),您将看到一个不太可读的Lisp表达式。
相反,您可以使用库help-fns+.el
中的describe-keymap
。它绑定到C-h M-k
,它以人类可读的方式显示键盘映射中绑定的所有(非菜单)键。更多description here。