反之亦然,给定一个按键序列,如何找到它的命令名称?
要查找命令的键位绑定,可以使用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
,该函数接受一个键序列并返回其绑定的命令。函数key-binding
是C-h k
使用的函数。
(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用户在其初始化文件中使用,但该函数具有文档字符串似乎表明相反。 考虑使用 where-is-internal
的人应首先检查是否可以使用重新映射键来实现其目标。
查找绑定到特定命令(例如forward-char
)的键的替代方法是substitute-command-keys
(例如(substitute-command-keys“\\ [forward-char]”)
)。这在较大的文本中特别有用。
where-is-internal
的文档建议可以使用它。此外,按照惯例,我们使用类似 where-is--internal
(注意双破折号)的格式来表示“私有”函数。 - GergelyPolonkaiC-h w
(或F1-w
):where-is
RET somecommandname RET
这正好符合您的要求 - 列出绑定键,没有额外的信息。 :)
一个老问题,但为了新读者的利益,还有其他一些很好的方法可以查看键绑定
M-x describe-bindings
列出当前可用的所有绑定,使用isearch、occur等功能来充分利用此列表。
M-x describe-prefix-map
这将显示当前模式可用的所有绑定,您可以像使用任何其他只读Emacs缓冲区一样使用显示缓冲区,例如您可以自由搜索字符串等。
M-x describe-mode
除了向您提供有关当前模式的常规信息外,它还将列出所有可用的键绑定。
M-x describe-minor-mode
您将被提示输入一个次要模式的名称,然后会显示该次要模式的信息和键绑定。
注意:以下示例使用其他软件包(从MELPA获得)
这会在您需要之前显示绑定。输入前缀,例如C-x
或C-c
,将显示该前缀中可用的绑定列表。
您还可以通过使用以下命令查看当前模式下可用的键绑定列表:
M-x 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
Guide key的工作方式与which-key
类似,我建议您查看它以比较功能。
lookup-key
函数很好用,但我不知道有没有函数能够通过编程方式查找键绑定。以下代码可以实现此功能,基于 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
)来进行操作。更多信息请参见此处。
C-h w <函数名>
查看按键所在位置,而不是完整的文档。相反地,你也可以使用C-h c <按键序列>
来查找绑定到某个按键序列上的函数。 - ShreevatsaRwhich-key
包(也是 Spacemacs 配置的一部分)可以很好地完成这项工作。它会在输入初始前缀后显示可用的键绑定。(例如C-x
)使用M-x which-key-show-top-level
可以显示顶级绑定列表。 - ocodoC-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
。 - Ricardo