给定一个 emacs 命令名,如何找到密钥绑定? (反之亦然)

如果我知道一个 emacs 命令名称,说,“ goto-line”; 如果我想查询是否有任何键序列绑定到这个命令,该怎么办?

反之亦然,给定一个键序列,我如何找到它的命令名称?

30381 次浏览

要查找命令的键绑定,您可以使用 emacs 帮助的“ where-is”特性

C-h w command-name

如果为该命令设置了多个绑定,则将列出所有绑定。

For the inverse, given a key sequence, you can type

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-bindinglookup-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 用户不能在初始化文件中使用它,但是这个带有 docstring 的函数似乎表明情况并非如此。任何考虑使用 where-is-internal的人应该首先检查 重新定位钥匙是否能够实现他们的目标。

找到绑定到特定命令(例如 forward-char)的键的另一种方法是 substitute-command-keys(例如 (substitute-command-keys "\\[forward-char]"))。 这在较大的文本中特别有用。

C-h w(或 F1-w) : where-is RET 某个命令名 RET

Does just what you're asking - lists bound keys with no additional information. :)

这是一个老问题,但是为了方便新读者,还有其他一些查看键绑定的好方法

M-x describe-bindings

列出当前可用的所有绑定,使用 issearch、启动等等,以便充分利用这个列表。

M-x describe-prefix-map

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

M-x describe-mode

除了提供关于当前模式的一般信息外,它还将列出所有可用的键绑定。

M-x describe-minor-mode

You will be prompted to enter the name of a minor mode, and then be shown info and key bindings for that minor mode.

注意 : 下面的示例使用其他包(可从 MELPA获得)

哪把钥匙

这显示了在需要绑定之前的绑定。输入一个前缀,例如 C-xC-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 works in much the same way as which-key I'd recommend taking a look at it to compare features.

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)。