Secara umum, itu tidak mungkin.
Alasannya adalah bahwa mungkin ada beberapa peta yang mendefinisikan ikatan yang sama, dan tidak ada cara untuk mencari tahu secara otomatis mana yang Anda inginkan. (dalam contoh Anda, elisp-slime-nav-mode
adalah mode minor). Jadi satu-satunya pendekatan yang benar-benar dapat diandalkan adalah Anda mengetahui dengan tepat definisi yang Anda inginkan.
Yang mengatakan ... ada kemungkinan peretasan (tidak selalu ada ...) Bagian dari apa yang membuatnya rumit adalah bahwa pengikatan yang ingin Anda remap berpotensi telah ditutup-tutupi oleh keymap aktif jahat, sehingga mendapatkan pengikatan saat ini dari M-.
tidak berguna.
(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-]"))
Saya biasanya tidak menggunakan kejahatan sama sekali, jadi mungkin ada penyesuaian yang diperlukan (lihat komentar yang disertakan)
Juga, pendekatan yang lebih bersih adalah dengan mencari binding sekali (dalam mode hook misalnya), daripada melihat secara dinamis setiap kali ikatan tombol ditekan. Tapi saya tidak yakin apa hook jahat yang digunakan, jadi ini dibiarkan sebagai latihan;) (dan tergantung pada urutan yang Anda gunakan untuk mode minor Anda, atau jika Anda mengaktifkannya secara dinamis, itu mungkin salah)