一般的に、それは不可能です。
その理由は、同じバインディングを定義する複数のマップが存在する可能性があり、必要なマップを自動的に判断する方法がないためです。(あなたの例で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-]"))
私は通常、悪をまったく使用しないため、調整が必要な場合があります(埋め込みコメントを参照)
また、キーバインドが押されるたびに動的に検索するのではなく、(たとえばモードフックで)バインディングを1回検索するのがよりクリーンなアプローチです。しかし、どの邪悪なフックを使用するのかわからないので、これは演習として残されています;)(そしてマイナーモードに使用する順序によって、またはそれらを動的に切り替える場合は間違っているかもしれません)