Emacs,探测任意键映射

标签 emacs elisp key-bindings

key-binding 探测当前事件键映射中的键。对于那些具有限制性的键映射,例如迷你缓冲区键映射或 isearch-mode-map,一旦用户按下一组有限的已定义键之外的键,它们就会变得不活动,我无法在不停用这些键映射的情况下调用 key-binding

我如何:

  1. 确定调用某些命令后哪些键映射生效(例如,isearch-mode-mapisearch-forward-regexp 设置为 overriding-local-map ) 以不涉及分析源代码的方式。是否有可用于跟踪/记录变量状态的 Hook ?

  2. 探测那些键映射中的键。例如,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-fileeval 表达式)。这并不总是有效,例如,isearch-forward-regexp 在输入无法识别的 key 后立即退出。

最佳答案

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

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

  2. 您可以使用函数lookup-key 在键映射中查找键。请参阅 Emacs Lisp 手册中的“Functions for Key Lookup”。因此,要找出 RETisearch-mode-map 中绑定(bind)到什么,计算:

    (lookup-key isearch-mode-map (kbd "RET"))
      ===> isearch-exit
    

关于Emacs,探测任意键映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200405/

相关文章:

shell - 在 Emacs 中分析 shell 命令

search - 将 emacs 搜索扩展到其他缓冲区

macros - 您可以在 Emacs Lisp 宏中创建交互式函数吗?

c# - 条件键绑定(bind)

java - 在 IntelliJ IDEA 中,如何创建以当前文件作为参数执行 shell 脚本的键绑定(bind)?

Emacs 组织模式在 mac os x lion 终端中被破坏

list - 如何在 ELisp 中从另一个列表中删除一个列表中的元素?

emacs - 删除带有特定单词的行

file - emacs lisp代码添加文件进行监控

Java KeyListener 未注册箭头键