3

例如,使用 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-模式映射唯一的方法?

4

1 回答 1

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)

这些数字意味着本地和全球地图中没有任何匹配项。

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)))
于 2013-09-14T11:37:30.393 回答