Zasadniczo nie jest to możliwe.
Powodem jest to, że może istnieć kilka map, które definiują to samo wiązanie, i nie ma sposobu, aby automatycznie ustalić, który z nich chcesz. (w twoim przykładzie elisp-slime-nav-mode
jest to taki niewielki tryb). Tak więc jedyne naprawdę niezawodne podejście polega na tym, aby dokładnie ustalić, jakiej definicji chcesz.
To powiedziawszy ... istnieje możliwość włamania (nie zawsze tam jest ...) Częścią tego, co sprawia, że jest to trudne, jest to, że wiązanie, które chcesz odwzorować, jest potencjalnie już maskowane przez złą aktywną mapę klawiszy, więc uzyskanie bieżącego wiązania M-.
jest bezużyteczny.
(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-]"))
Zwykle w ogóle nie używam zła, więc mogą być potrzebne poprawki (patrz osadzone komentarze)
Bardziej czystym podejściem byłoby też sprawdzenie powiązań jeden raz (na przykład w trybie haka), zamiast dynamicznego wyszukiwania za każdym razem, gdy naciśnie się klawisz. Ale nie jestem pewien, jakiego złego haka użyć, więc pozostało to jako ćwiczenie;) (i w zależności od kolejności, w której używasz swoich mniejszych trybów lub jeśli przełączasz je dynamicznie, może to być niepoprawne)