Emacs,探测任意键映射

时间:2013-10-05 17:05:26

标签: emacs elisp key-bindings

key-binding探测当前活动键盘图中的键。对于那些键盘图,例如迷你缓冲区或isearch-mode-map,一旦用户按下有限的一组有限键之外的键,就会限制并变为非活动状态,我无法在没有key-binding的情况下调用停用这些键盘图。

我如何:

  1. 确定在调用某些命令后生效的键盘映射(例如,isearch-mode-mapisearch-forward-regexp设置为覆盖本地映射),其方式不涉及分析源码。是否有可用于跟踪/记录变量状态的钩子?

  2. 这些键盘图中的探测键。例如,RET中绑定的isearch-mode-map是什么?

  3. 我最接近的解决方案是绑定此功能:

    (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就会退出。

2 个答案:

答案 0 :(得分:4)

  1. 没有简单的方法来确定响应特定命令将使用哪些键盘映射。任何函数都可以随时调用(use-local-map ...),因此唯一可以确定的是阅读源代码。

    话虽如此,Emacs代码确实遵循的惯例可以在很多情况下找到答案。如果foo-mode有一个键映射,那么键映射通常会被命名为foo-mode-map。您可以通过运行-map查看名称以M-x apropos RET -map$ RET结尾的变量列表。

  2. 您可以使用函数lookup-key在键盘映射中查找键。请参阅Emacs Lisp手册中的“Functions for Key Lookup”。因此,要找出RETisearch-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