elisp – ¿Por qué el enlace de clave local devuelve un 1 para una clave sin enlace local?

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.

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım