โดยทั่วไปแล้วมันเป็นไปไม่ได้
เหตุผลก็คืออาจมีหลายแผนที่ที่กำหนดการเชื่อมโยงเดียวกันและไม่มีวิธีที่จะคิดออกโดยอัตโนมัติในสิ่งที่คุณต้องการ (ในตัวอย่างของคุณelisp-slime-nav-mode
มันเป็นโหมดรอง) ดังนั้นวิธีการที่เชื่อถือได้เพียงวิธีเดียวคือให้คุณหาคำจำกัดความที่คุณต้องการอย่างแท้จริง
ที่กล่าวว่า ... มีแฮ็คที่เป็นไปได้ (ไม่เสมอไป ... ) ส่วนหนึ่งของสิ่งที่ทำให้มันยุ่งยากคือการรวมที่คุณต้องการทำการแมปอาจถูกหลอกลวงโดย keymap ที่ใช้งานที่ชั่วร้ายดังนั้นเพื่อให้ได้ผลผูกพันปัจจุบัน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-]"))
ปกติแล้วฉันจะไม่ใช้ความชั่วร้ายดังนั้นอาจจำเป็นต้องมีการปรับเปลี่ยน (ดูความคิดเห็นที่ฝังไว้)
นอกจากนี้วิธีการที่สะอาดกว่าคือการค้นหาการเชื่อมโยงหนึ่งครั้ง (ใน hook ของโหมดเป็นต้น) แทนที่จะค้นหาแบบไดนามิกทุกครั้งที่กดปุ่มลัด แต่ฉันไม่แน่ใจว่าจะใช้ตะขอตัวร้ายอะไรดังนั้นสิ่งนี้จึงเหลือไว้เป็นแบบฝึกหัด) (และขึ้นอยู่กับคำสั่งที่คุณใช้สำหรับโหมดรองของคุณหรือหากคุณสลับมันแบบไดนามิกอาจไม่ถูกต้อง)