例如,使用C-h 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-mode-map唯一的方法?
答案 0 :(得分:7)
以下是您可以根据自己的需求调整的代码:
(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)
数字表示本地和全球地图中没有任何匹配。
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)))