ChatGPT解决这个技术问题 Extra ChatGPT

给定一个 emacs 命令名称,您将如何找到 key-bindings ? (反之亦然)

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

反之亦然,给定一个键序列,我怎样才能找到它的命令名称?


A
Adam Rosenfield

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

您还可以执行 C-h w <function name> 以了解关键在哪里,而不是完整的文档。相反,您也可以执行 C-h c <key sequence> 来了解绑定到键序列的函数。
好吧,这是一个更好的答案。谢谢 !
另外:Ch w 通常与 where-is 绑定。
所以,当我忘记 Ch w 时,我可以在哪里 - 在哪里 - 在哪里。那太棒了 ! ;)
对于那些在其窗口管理器中将 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
T
Tobias

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

要以编程方式获取绑定到给定键序列的命令,请使用函数 key-bindinglookup-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 函数。
G
Glen Best

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

正是您所要求的 - 列出没有附加信息的绑定键。 :)


o
ocodo

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

Mx 描述绑定

列出当前可用的所有绑定,使用 isearch、发生等以充分利用此列表。

Mx 描述前缀映射

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

Mx 描述模式

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

Mx 描述次要模式

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

注意:以下示例使用了额外的包(可从 MELPA 获得)

哪个键

这会在您需要它们之前向您显示绑定。输入前缀,例如 C-xC-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


j
jagrg

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