В общем, это невозможно.
Причина в том, что может быть несколько карт, которые определяют одну и ту же привязку, и нет способа автоматически определить, какую вы хотите. (в вашем примере 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-]"))
Обычно я вообще не использую зла, поэтому могут потребоваться корректировки (см. Встроенные комментарии)
Кроме того, более понятный подход заключается в том, чтобы искать привязки один раз (например, в хуке режима) вместо динамического поиска при каждом нажатии связывания клавиш. Но я не уверен, какой злой крючок использовать, так что это оставлено в качестве упражнения;) (и в зависимости от порядка, который вы используете для своих второстепенных режимов, или если вы переключаете их динамически, это может быть неправильно)