Emacs 25
Como mencionó @YoungFrog en los comentarios, comenzando con Emacs 25.1 , el C-h k
método antiguo de describir las asociaciones de teclas también le dirá en qué mapa de teclas se encontró la clave.
Antes de Emacs 25
Hay algo de código
aquí
sobre esto, pero está incompleto ya que no cubre todo. A continuación se muestra una versión mejorada de la misma.
Las teclas se pueden enlazar de 9 (!) Formas. Gracias a @Drew por este enlace (también complementado por esto ) con la lista completa. Por orden de precedencia, son:
- Un conjunto terminal específica de teclas,
overriding-terminal-local-map
. Esto está definido por la set-transient-map
función.
- Un mapa de anulación local al búfer,
overriding-local-map
. Si este está configurado, se omiten los elementos 3–8 (probablemente por qué no ve muchos de estos).
- En el punto a través de la
keymap
propiedad de texto (que podría ir en texto real o en superposiciones).
- Una variable que simula esencialmente diferentes conjuntos posibles de modos menores habilitados,
emulation-mode-map-alists
.
- Una variable donde las principales modos pueden anular los vínculos de teclado de menores modos,
minor-mode-overriding-map-alist
.
- Los modos menores reales , cuyas teclas están almacenadas
minor-mode-map-alist
.
- En el punto (nuevamente), a través de la
local-map
propiedad de texto. Si esto existe, se omite el elemento 8.
- El mapa de teclas local de búfer estándar (donde se encuentran las combinaciones de teclas locales de modo principal o búfer), devuelto por la función
current-local-map
.
- El mapa de teclas global , devuelto por
current-global-map
.
También hay un semi-elemento 10. Cualquier comando encontrado a través del procedimiento anterior también podría haberse reasignado.
La siguiente función consulta algunas de estas posibilidades (las más probables) y devuelve o imprime el resultado.
(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))
Hay funciones integradas para cada una de ellas, excepto la primera, por lo que debemos crear una (también una versión mejorada del código vinculado anteriormente).
(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))))))
Como está diciendo que el comportamiento está activo cuando el punto está en un archivo adjunto, hay una buena posibilidad de que esta combinación de teclas tenga lugar en una superposición o propiedad de texto.
Si eso no funciona , pruebe el siguiente comando también. Simplemente coloque el cursor en el archivo adjunto y listo 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
. Ver también nodosFunctions for Key Lookup
yActive Keymaps
.