Pregunta:
Cuando evalúo (local-key-binding key)
para cualquier clave arbitraria que no tenga un enlace local , espero un valor de retorno nil
, pero casi siempre obtengo un 1
. Si la clave realmente tiene un enlace local (digamos de un modo principal) en el búfer actual, entonces local-key-binding
comporta como se esperaba y devuelve la función a la que está enlazada la clave.
Entonces, mi pregunta es, ¿ por qué el local-key-binding
menudo devuelve 1
cuando de hecho no hay un enlace local para la clave dada?
Como ejemplo, después de abrir emacs con emacs -Q
, escriba
(key-binding (kbd "C-h h"))
(local-key-binding (kbd "C-h h"))
en el búfer temporal y evaluar cada uno de los formularios. Observe que key-binding
devuelve view-hello-file
y local-key-binding
devuelve 1
. El enlace para Ch h
se define globalmente, no localmente, por lo que espero que local-key-binding
devuelva nil
. Ahora intenta
(local-set-key (kbd "C-h h") 'describe-bindings)
(key-binding (kbd "C-h h"))
(local-key-binding (kbd "C-h h"))
y evaluar cada uno de los formularios. Observe que tanto key-binding
local-key-binding
devuelven describe-bindings
. Ahora intenta
(local-unset-key (kbd "C-h h"))
(key-binding (kbd "C-h h"))
(local-key-binding (kbd "C-h h"))
y evaluar cada uno de los formularios. Observe que key-binding
ha vuelto a view-hello-file
, y local-key-binding
ahora muestra nil
.
Respuesta:
local-key-binding
usa lookup-key
cuya doc-string contiene esto:
Un número como valor significa que la CLAVE es "demasiado larga"; es decir, los caracteres o símbolos que contiene, excepto el último, no son una secuencia válida de prefijos en KEYMAP. El número es cuántos caracteres al principio de KEY se necesitan para llegar a una clave sin prefijo.
local-unset-key
no revierte el efecto de local-key-binding
, porque en realidad no hace lo que su doc-string afirma que hace:
Eliminar el enlace local de KEY
Pero lo que realmente sucede se reduce a:
(define-key (current-local-map) "\C-hh" nil)
(Se podría argumentar que hace lo que afirma la cadena de documentos, pero ciertamente no hace lo que uno esperaría al leer por primera vez esa cadena de documentos).
El mapa de teclas pasó por estas etapas:
(keymap)
(keymap (8 keymap (104 . describe-bindings))))
(keymap (8 keymap (104)))
Para eliminar la vinculación de una clave en lugar de volver a vincularla a nil
, puede usar kmu-remove-key
de mi biblioteca keymap-utils .
Cuando una clave está vinculada a nil
en un mapa de teclas local, eso evita que la búsqueda de claves considere el enlace en el mapa de teclas principal, pero no anula el enlace global.