如果我知道一个 emacs 命令名称,说,“ goto-line”; 如果我想查询是否有任何键序列绑定到这个命令,该怎么办?
反之亦然,给定一个键序列,我如何找到它的命令名称?
要查找命令的键绑定,您可以使用 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 v isearch-mode-map
要获得更多帮助,您可以输入
C-h ?
要以交互方式将命令绑定到一个快捷键(或 Emacs 术语中的键序列) ,请参阅选定的答案。
要以编程方式获取绑定到给定密钥序列的命令,请使用函数 key-binding或 lookup-key,该函数接受一个密钥序列并返回其绑定命令。函数 key-binding就是 C-h k使用的函数。
key-binding
lookup-key
C-h k
(key-binding (kbd "C-h m"))
返回通过搜索所有当前键盘映射绑定到 C-h m的命令。函数 lookup-key在一个键盘映射中搜索:
C-h m
(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的人应该首先检查 重新定位钥匙是否能够实现他们的目标。
where-is-internal
internal
找到绑定到特定命令(例如 forward-char)的键的另一种方法是 substitute-command-keys(例如 (substitute-command-keys "\\[forward-char]"))。 这在较大的文本中特别有用。
forward-char
substitute-command-keys
(substitute-command-keys "\\[forward-char]")
C-h w(或 F1-w) : where-is RET 某个命令名 RET
C-h w
F1-w
where-is
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-x或 C-c,将显示该前缀中可用的绑定列表。
C-x
C-c
还可以使用以下方法查看当前模式下可用的密钥绑定列表:
M-x which-key-show-top-level
将 which-key-show-top-level绑定到您选择的键和弦是非常有用的,因此您可以在任何地方查看可用的键。
which-key-show-top-level
例如,C-s(isearch-forward)有一个广泛的关键字映射,这通常是未知的。例如,M-s o使用当前的搜索字符串启动 occur,我使用 Emacs 很多年都不知道这一点。which-key帮助我在 Emacs 中发现了许多稀有的宝石。
C-s
isearch-forward
M-s o
occur
which-key
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命令执行此操作。
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 <function name>
C-h c <key sequence>
describe-key-briefly