Emacs 25
Seperti yang disebutkan oleh @YoungFrog dalam komentar, dimulai dengan Emacs 25.1 , C-h k
metode lama yang bagus untuk menggambarkan key-bind juga akan memberi tahu Anda keymap mana kunci tersebut ditemukan.
Sebelum Emacs 25
Ada beberapa kode di
sini
tentang ini, tetapi tidak lengkap karena tidak mencakup semuanya. Di bawah ini adalah versi yang disempurnakan.
Kunci dapat diikat dengan 9 (!) Cara. Terima kasih kepada @Drew untuk tautan ini (juga dilengkapi dengan ini ) dengan daftar lengkap. Atas perintah diutamakan, mereka adalah:
- Satu set kunci khusus terminal
overriding-terminal-local-map
,. Ini ditentukan oleh set-transient-map
fungsi.
- Peta override buffer-lokal
overriding-local-map
,. Jika ini disetel, item 3–8 dilewati (mungkin mengapa Anda tidak melihat banyak dari ini).
- Pada titik melalui
keymap
propety teks (yang bisa pergi pada teks aktual atau overlay).
- Variabel yang pada dasarnya mensimulasikan berbagai set kemungkinan mode minor yang diaktifkan
emulation-mode-map-alists
,.
- Variabel di mana mode-utama dapat menimpa ikatan tombol mode-kecil
minor-mode-overriding-map-alist
,.
- Mode minor aktual , yang keybind-nya disimpan
minor-mode-map-alist
.
- Pada titik (lagi), melalui
local-map
properti teks. Jika ini ada, item 8 dilewati.
- Keymap buffer-local standar (di mana mode utama atau buffer-local keybinds pergi), dikembalikan oleh fungsi
current-local-map
.
- The keymap global yang , dikembalikan oleh
current-global-map
.
Ada juga semi-item 10. Perintah apa pun yang ditemukan melalui prosedur di atas mungkin juga telah dipetakan kembali.
Fungsi berikut menanyakan beberapa kemungkinan ini (yang paling mungkin), dan mengembalikan atau mencetak hasilnya.
(defun locate-key-binding (key)
"Determine in which keymap KEY is defined."
(interactive "kPress key: ")
(let ((ret
(list
(key-binding-at-point key)
(minor-mode-key-binding key)
(local-key-binding key)
(global-key-binding key))))
(when (called-interactively-p 'any)
(message "At Point: %s\nMinor-mode: %s\nLocal: %s\nGlobal: %s"
(or (nth 0 ret) "")
(or (mapconcat (lambda (x) (format "%s: %s" (car x) (cdr x)))
(nth 1 ret) "\n ")
"")
(or (nth 2 ret) "")
(or (nth 3 ret) "")))
ret))
Ada fungsi bawaan untuk masing-masing fungsi ini kecuali yang pertama, jadi kita harus membuatnya (juga versi yang ditingkatkan dari kode yang ditautkan di atas).
(defun key-binding-at-point (key)
(mapcar (lambda (keymap) (when (keymapp keymap)
(lookup-key keymap key)))
(list
;; More likely
(get-text-property (point) 'keymap)
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point)))
;; Less likely
(get-text-property (point) 'local-map)
(mapcar (lambda (overlay)
(overlay-get overlay 'local-map))
(overlays-at (point))))))
Karena Anda mengatakan perilaku aktif saat titik ada pada lampiran, ada kemungkinan keybind ini terjadi pada overlay atau properti teks.
Jika itu tidak berhasil , coba perintah berikut juga. Cukup tempatkan kursor pada lampiran, dan lakukan M-x
keymaps-at-point
.
(defun keymaps-at-point ()
"List entire keymaps present at point."
(interactive)
(let ((map-list
(list
(mapcar (lambda (overlay)
(overlay-get overlay 'keymap))
(overlays-at (point)))
(mapcar (lambda (overlay)
(overlay-get overlay 'local-map))
(overlays-at (point)))
(get-text-property (point) 'keymap)
(get-text-property (point) 'local-map))))
(apply #'message
(concat
"Overlay keymap: %s\n"
"Overlay local-map: %s\n"
"Text-property keymap: %s\n"
"Text-property local-map: %s")
map-list)))
Searching Keymaps
. Lihat juga nodeFunctions for Key Lookup
danActive Keymaps
.