通常,这是不可能的。
原因是可能有多个映射定义了相同的绑定,并且无法自动找出想要的映射。(在您的示例中,elisp-slime-nav-mode
是次要模式)。因此,唯一真正可靠的方法是让您准确确定所需的定义。
就是说...有可能被黑客入侵(并不总是存在...)棘手的是,您要重新映射的绑定可能已经被邪恶的活动键映射掩盖了,因此获取当前的绑定M-.
是没有用的。
(defun lookup-no-evil (key)
;; excluding evil maps from the lookup. not sure if
;; anything more than evail-normal-state-map is needed
(let* ((evil-maps (list evil-normal-state-map))
(bindings
(remq nil
(mapcar
(lambda (map)
(unless (memq map evil-maps)
(lookup-key map key)))
(current-active-maps)))))
(when bindings
;; let's assume the first one is the right one.
;; Given that minor modes are at the beginning
;; (although this is *not* documented so should not
;; be relied upon), it might be what we would have
;;without evil-mode indeed
(car bindings))))
(defmacro evil-remap (from to)
;; assuming that we want to put it in the normal-state map.
;; not sure about that
`(define-key evil-normal-state-map ,to
(lambda ()
(interactive)
(call-interactively (lookup-no-evil ,from)))))
(evil-remap (kbd "M-.") (kbd "C-]"))
我通常根本不使用邪恶,因此可能需要进行调整(请参阅嵌入式注释)
同样,一种更干净的方法是一次查找绑定(例如在模式挂钩中),而不是每次按下键绑定时都动态查找。但是我不确定要使用哪个邪恶的钩子,因此请留作练习;)(并且取决于次要模式的使用顺序,或者如果您动态切换它们,则可能不正确)