gpt4 book ai didi

emacs - 如何在 Emacs 中以编程方式查找键绑定(bind)来自哪个映射

转载 作者:行者123 更新时间:2023-12-01 09:59:14 24 4
gpt4 key购买 nike

例如,使用 C-h k 我可以向 Emacs 询问“C-right 在这个缓冲区中做了什么?”。如果当前缓冲区是我设置中的 Lisp 缓冲区,Emacs 将回答 paredit-forward-slurp-sexp。由此,我可以猜测 C-right 与 paredit-forward-slurp-sexp 的绑定(bind)来自 paredit 模式映射,因为命令名称以 paredit 为前缀,但这是一种启发式方法。我如何以编程方式执行此操作,即我如何询问“此缓冲区中 C-right 的绑定(bind)来自何处?”

正在编写一个函数,在这种情况下检查当前全局 map 、当前主要模式 map 、paredit-mode-map、paredit-forward-mode-map、paredit-forward-slurp-mode-map、paredit-forward-slurp -sexp-mode-map 是唯一的方法吗?

最佳答案

以下是您可以根据需要进行调整的代码:

(defun bunch-of-keybindings (key)
(list
(minor-mode-key-binding key)
(local-key-binding key)
(global-key-binding key)))

示例输入:

(bunch-of-keybindings (kbd "C-c @ C-c"))

输出:

(((hs-minor-mode . hs-toggle-hiding)) 1 2)

数字表示在本地和全局 map 中没有任何匹配项。

UPD:添加了overlay-key-binding

键盘映射也可以附加到覆盖层,在这种情况下,它们优先光标在叠加层内。例如,yasnippet 就是这样做的。这是一个用于检查的函数:

(defun overlay-key-binding (key)
(mapcar (lambda (keymap) (lookup-key keymap key))
(cl-remove-if-not
#'keymapp
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point))))))

所以更新后的列表是:

(defun bunch-of-keybindings (key)
(list
(minor-mode-key-binding key)
(local-key-binding key)
(global-key-binding key)
(overlay-key-binding key)))

关于emacs - 如何在 Emacs 中以编程方式查找键绑定(bind)来自哪个映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18801018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com