Emacs 25
Come menzionato da @YoungFrog nei commenti, a partire da Emacs 25.1 , il buon vecchio C-h k
metodo per descrivere i key-binding ti dirà anche in quale keymap è stata trovata la chiave.
Prima di Emacs 25
C'è del codice
qui
su questo, ma è incompleto in quanto non copre tutto. Di seguito è una versione migliorata di esso.
Le chiavi possono essere associate in 9 (!) Modi. Grazie a @Drew per questo link (integrato anche da questo ) con l'elenco completo. Per ordine di precedenza, sono:
- Un insieme specifico terminale di chiavi,
overriding-terminal-local-map
. Questo è definito dalla set-transient-map
funzione.
- Una mappa di override del buffer locale,
overriding-local-map
. Se questo è impostato, le voci da 3 a 8 vengono ignorate (probabilmente perché non ne vedi molte).
- Al punto tramite il
keymap
testo-propety (che potrebbe andare sul testo reale o sugli overlay).
- Una variabile che simula essenzialmente differenti insiemi possibili di attivare minori-modi,
emulation-mode-map-alists
.
- Una variabile dove grandi-modi possono ignorare le keybinds di minori-modi,
minor-mode-overriding-map-alist
.
- Le modalità secondarie effettive , in cui sono archiviate le combinazioni di tasti
minor-mode-map-alist
.
- Al punto (di nuovo), tramite la
local-map
proprietà text. Se esiste, l'articolo 8 viene ignorato.
- La keymap buffer-locale standard (dove vanno le combinazioni di tasti in modalità principale o buffer-locale), restituita dalla funzione
current-local-map
.
- La keymap globale , restituita da
current-global-map
.
C'è anche un semi-oggetto 10. Qualsiasi comando sia stato trovato attraverso la procedura sopra potrebbe essere stato rimappato.
La seguente funzione richiede alcune di queste possibilità (le più probabili) e restituisce o stampa il risultato.
(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))
Esistono funzioni integrate per ognuna di queste ad eccezione della prima, quindi dobbiamo crearne una (anche una versione migliorata del codice linkato sopra).
(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))))))
Dato che stai dicendo che il comportamento è attivo quando il punto è su un allegato, ci sono buone probabilità che questo keybind abbia luogo su una sovrapposizione o su una proprietà text.
Se non funziona , prova anche il seguente comando. Posiziona il cursore sull'allegato e fai 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
. Vedi anche nodiFunctions for Key Lookup
eActive Keymaps
.