给定一个Emacs命令名称,如何找到与之绑定的键?(反之亦然)

124
如果我知道一个Emacs命令的名称,比如“goto-line”,那么如果我想查询是否有任何按键序列绑定到该命令,该怎么办?
反之亦然,给定一个按键序列,如何找到它的命令名称?
5个回答

184

要查找命令的键位绑定,可以使用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 ?

51
你也可以使用 C-h w <函数名> 查看按键所在位置,而不是完整的文档。相反地,你也可以使用 C-h c <按键序列> 来查找绑定到某个按键序列上的函数。 - ShreevatsaR
8
通常情况下,C-h w 绑定到 where-is。 - Cheeso
2
所以,当我忘记 C-h w 的时候,我可以使用 where-is where-is。太棒了!;) - Sake
@ftravers - MELPA 上的 which-key 包(也是 Spacemacs 配置的一部分)可以很好地完成这项工作。它会在输入初始前缀后显示可用的键绑定。(例如 C-x)使用 M-x which-key-show-top-level 可以显示顶级绑定列表。 - ocodo
2
对于那些在窗口管理器中绑定了C-h的人: C-h w等同于M-x where-isC-h k等同于M-x describe-keyC-h f等同于M-x describe-functionC-h v等同于M-x describe-variableC-h ?等同于M-x help-for-help。 还要注意,可以使用f1代替C-h - Ricardo
显示剩余3条评论

17

要交互地获取绑定到键盘快捷方式(或Emacs术语中的键序列)的命令,请参阅所选答案。

要以编程方式获取绑定到给定键序列的命令,请使用函数key-bindinglookup-key,该函数接受一个键序列并返回其绑定的命令。函数key-bindingC-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(注意双破折号)的格式来表示“私有”函数。 - GergelyPolonkai
2
在这里描述了后缀“-internal”的用法:https://www.gnu.org/software/emacs/manual/html_node/elisp/Function-Names.html#Function-Names。它应该用于内部C函数。 - Tobias

13

C-h w(或F1-w):where-is RET somecommandname RET

这正好符合您的要求 - 列出绑定键,没有额外的信息。 :)


6

一个老问题,但为了新读者的利益,还有其他一些很好的方法可以查看键绑定

M-x describe-bindings

列出当前可用的所有绑定,使用isearch、occur等功能来充分利用此列表。

M-x describe-prefix-map

这将显示当前模式可用的所有绑定,您可以像使用任何其他只读Emacs缓冲区一样使用显示缓冲区,例如您可以自由搜索字符串等。

M-x describe-mode

除了向您提供有关当前模式的常规信息外,它还将列出所有可用的键绑定。

M-x describe-minor-mode

您将被提示输入一个次要模式的名称,然后会显示该次要模式的信息和键绑定。

注意:以下示例使用其他软件包(从MELPA获得)

Which key

这会在您需要之前显示绑定。输入前缀,例如C-xC-c,将显示该前缀中可用的绑定列表。

您还可以通过使用以下命令查看当前模式下可用的键绑定列表:

M-x which-key-show-top-level

which-key-show-top-level绑定到您选择的键组合上很有用,这样您就可以从任何地方查看可用的键。

例如,C-sisearch-forward)具有广泛的键映射,常常是未知的。例如,M-s o使用当前搜索字符串启动occur,我在使用Emacs多年后才知道这一点。使用which-key帮助我发现了Emacs中许多罕见的宝石。

https://github.com/justbur/emacs-which-key

Guide key

Guide key的工作方式与which-key类似,我建议您查看它以比较功能。

https://github.com/kai2nenobu/guide-key


0

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)来进行操作。更多信息请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接