Emacs 25
Comme mentionné par @YoungFrog dans les commentaires, à commencer par Emacs 25.1 , la bonne vieille C-h k
méthode de description des raccourcis clavier vous indiquera également le type de clavier dans lequel la clé a été trouvée.
Avant Emacs 25
Il y a du code
ici
, mais il est incomplet car il ne couvre pas tout. Vous trouverez ci-dessous une version améliorée de celle-ci.
Les clés peuvent être liées de 9 (!) Façons. Merci à @Drew pour ce lien (également complété par celui-ci ) avec la liste complète. Par ordre de priorité, ils sont:
- Un ensemble spécifique terminal de clés,
overriding-terminal-local-map
. Ceci est défini par la set-transient-map
fonction.
- Une carte de commande prioritaire tampon local,
overriding-local-map
. Si celui-ci est défini, les éléments 3 à 8 sont ignorés (probablement pourquoi vous n'en voyez pas beaucoup).
- Au point via la
keymap
propriété text (qui peut aller sur du texte réel ou sur des superpositions).
- Une variable qui simule essentiellement différents ensembles possibles de petits-modes activés,
emulation-mode-map-alists
.
- Une variable où les grands-modes peuvent remplacer les keybinds de modes mineur,
minor-mode-overriding-map-alist
.
- Les modes mineurs réels , dont les combinaisons de clés sont stockées dans
minor-mode-map-alist
.
- Au point ( à nouveau), via la
local-map
propriété text. Si cela existe, le point 8 est ignoré.
- Le mappage de clés tampon-local standard (où les raccourcis clavier en mode majeur ou tampon-local sont renvoyés), renvoyé par la fonction
current-local-map
.
- Le clavier global , renvoyé par
current-global-map
.
Il existe également un semi-élément 10. Toute commande trouvée dans le cadre de la procédure ci-dessus aurait également pu être remappée.
La fonction suivante interroge certaines de ces possibilités (les plus probables) et renvoie ou affiche le résultat.
(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))
Il existe des fonctions intégrées pour chacun d’eux, à l’exception de la première; nous devons donc en créer une (également une version améliorée du code lié ci-dessus).
(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))))))
Puisque vous dites que le comportement est actif lorsque le point est sur une pièce jointe, il y a de fortes chances pour que ce raccourci clavier se produise sur une superposition ou une propriété de texte.
Si cela ne fonctionne pas , essayez également la commande suivante. Il suffit de placer le curseur sur la pièce jointe et de le faire 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
. Voir aussi les nœudsFunctions for Key Lookup
etActive Keymaps
.