如何在Emacs中以编程方式在哪个映射中查找键绑定

Jis*_*Yoo 3 emacs elisp key-bindings

例如,使用Ch k,我可以向Emacs询问"C-right在此缓冲区中做了什么?".如果我的设置中当前缓冲区是Lisp缓冲区,Emacs将回答paredit-forward-slurp-sexp.从那时起,我可以猜测C-right与paredit-forward-slurp-sexp的绑定来自paredit模式映射,因为命令名称以paredit为前缀,但这是一种启发式方法.我怎么能以编程方式做到这一点,也就是说,我怎么能问"这个缓冲区中C-right的绑定来自哪里?"

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

abo*_*abo 7

以下是您可以根据自己的需求调整的代码:

(defun bunch-of-keybindings (key)
  (list
   (minor-mode-key-binding key)
   (local-key-binding key)
   (global-key-binding key)))
Run Code Online (Sandbox Code Playgroud)

样本输入:

(bunch-of-keybindings (kbd "C-c @ C-c"))
Run Code Online (Sandbox Code Playgroud)

输出:

(((hs-minor-mode . hs-toggle-hiding)) 1 2)
Run Code Online (Sandbox Code Playgroud)

数字表示本地和全球地图中没有任何匹配.

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))))))
Run Code Online (Sandbox Code Playgroud)

所以更新的列表是:

(defun bunch-of-keybindings (key)
  (list
   (minor-mode-key-binding key)
   (local-key-binding key)
   (global-key-binding key)
   (overlay-key-binding key)))
Run Code Online (Sandbox Code Playgroud)