如果我知道一个 emacs 命令名称,请说“goto-line”;如果我想查询是否有任何键序列绑定到这个命令怎么办?
反之亦然,给定一个键序列,我怎样才能找到它的命令名称?
要查找命令的键绑定,您可以使用 emacs 帮助的“where-is”功能
C-h w command-name
如果为命令设置了多个绑定,它们都将被列出。
相反,给定一个键序列,您可以键入
C-h k key-sequence
获取将运行的命令。
您可以通过键入获取有关命令的详细信息,以及定义的任何非交互式函数
C-h f function-name
这将为您提供有关功能的详细信息,包括它的任何键绑定,以及
C-h v variable-name
将为您提供有关任何(绑定)变量的信息。键映射保存在变量中,但键代码以原始格式存储。以 C-h v isearch-mode-map
为例。
有关获得帮助的更多帮助,您可以键入
C-h ?
要以交互方式将命令绑定到键盘快捷键(或 Emacs 术语中的键序列),请参阅所选答案。
要以编程方式获取绑定到给定键序列的命令,请使用函数 key-binding
或 lookup-key
获取键序列并返回其绑定命令。 C-h k
使用函数 key-binding
。
(key-binding (kbd "C-h m"))
通过在所有当前键盘映射中搜索返回绑定到 C-h m
的命令。函数 lookup-key
在单个键盘映射中搜索:
(lookup-key (current-global-map) (kbd "TAB")) ; => indent-for-tab-command
(lookup-key org-mode-map (kbd "TAB")) ; => org-cycle
(lookup-key text-mode-map (kbd "TAB")) ; => nil
(lookup-key isearch-mode-map (kbd "TAB")) ; => isearch-printing-char
对于以编程方式获取绑定到给定命令的所有键序列,where-is-internal
可能是要使用的函数。以 internal
结尾的函数名称似乎表明 Emacs 用户不能在他们的 init 文件中使用它,但这个具有 docstring 的函数似乎另有说明。任何考虑使用 where-is-internal
的人都应首先检查 remapping keys 是否可以实现他们的目标。
查找绑定到特定命令(例如,forward-char
)的键的替代方法是 substitute-command-keys
(例如,(substitute-command-keys "\\[forward-char]")
)。这在较大的文本中特别有用。
where-is-internal
的文档表明可以使用它。此外,通常我们对“私有”函数使用像 where-is--internal
(注意双破折号)这样的格式。
-internal
的用法:gnu.org/software/emacs/manual/html_node/elisp/…。它应该用于内部 C 函数。
C-h w
(或 F1-w
):where-is
RET somecommandname RET
正是您所要求的 - 列出没有附加信息的绑定键。 :)
一个老问题,但为了新读者的利益,还有其他一些很好的方法来查看键绑定
Mx 描述绑定
列出当前可用的所有绑定,使用 isearch、发生等以充分利用此列表。
Mx 描述前缀映射
这显示了当前模式下所有可用的绑定,您可以像使用任何其他只读 Emacs 缓冲区一样使用显示缓冲区,例如您可以自由搜索字符串等。
Mx 描述模式
除了为您提供有关当前模式的一般信息外,它还将列出所有可用的键绑定。
Mx 描述次要模式
系统将提示您输入次要模式的名称,然后显示该次要模式的信息和键绑定。
注意:以下示例使用了额外的包(可从 MELPA 获得)
哪个键
这会在您需要它们之前向您显示绑定。输入前缀,例如 C-x
或 C-c
,将显示该前缀中可用的绑定列表。
您还可以使用以下命令查看当前模式下可用的键绑定列表:
Mx which-key-show-top-level
将 which-key-show-top-level
绑定到您选择的键和弦很有用,因此您可以从任何地方查看可用的键。
例如,C-s
(isearch-forward
) 有一个通常未知的扩展键映射。例如 M-s o
使用当前搜索字符串开始 occur
,我在使用 Emacs 多年以来并不知道这一点。有 which-key
帮助我发现了 Emacs 中的许多稀有宝石。
https://github.com/justbur/emacs-which-key
引导键
指南键的工作方式与 which-key
大致相同,我建议您查看它以比较功能。
https://github.com/kai2nenobu/guide-key
lookup-key
函数运行良好,但没有用于从命令 AFAIK 以编程方式查找键绑定的函数。以下是基于 slime-cheat-sheet
命令的。
(defun lookup-function (keymap func)
(let ((all-bindings (where-is-internal (if (symbolp func)
func
(cl-first func))
keymap))
keys key-bindings)
(dolist (binding all-bindings)
(when (and (vectorp binding)
(integerp (aref binding 0)))
(push binding key-bindings)))
(push (mapconcat #'key-description key-bindings " or ") keys)
(car keys)))
(lookup-key (current-global-map) (kbd "C-x C-b")) ; => list-buffers
(lookup-function (current-global-map) 'list-buffers) ; => "C-x C-b"
正如@ShreevatsaR 建议的那样,您可以交互地使用 C-h w <function name>
(where-is
) 和 C-h c <key sequence>
(describe-key-briefly
)。有关详细信息,请参阅 here。
不定期副业成功案例分享
C-h w <function name>
以了解关键在哪里,而不是完整的文档。相反,您也可以执行C-h c <key sequence>
来了解绑定到键序列的函数。C-h
绑定到其他内容的用户:C-h w
等同于M-x where-is
。C-h k
等价于M-x describe-key
。C-h f
等价于M-x describe-function
。C-h v
等价于M-x describe-variable
。C-h ?
等同于M-x help-for-help
。另请注意,可以使用f1
代替C-h
。