例如,使用C-h k我可以问Emacs“C-right在此缓冲区中做什么?”。如果当前缓冲区是我设置中的Lisp缓冲区,则Emacs将回答paredit-forward-slurp-sexp。由此,我可以猜测C权限与paredit-forward-slurp-sexp的绑定来自paredit模式映射,因为命令名称以paredit为前缀,但这是一种启发式方法。我如何以编程方式做到这一点,即如何问“此缓冲区中C权的绑定从何而来?”

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

最佳答案

这是您可以适应您的需求的代码:

(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)))

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

10-08 22:52