¿Por qué este código no puede anular todas las combinaciones de teclas en un mapa de teclas?

7

Para resumir, hay una pequeña biblioteca que me gusta pero no me gusta ninguna de las combinaciones de teclas predeterminadas. Por ejemplo, es un modo menor global y vincula una función C-c C-s, pero eso se oculta org-scheduleen mis buffers de org y org-agenda.

Quiero mantener la pequeña biblioteca pero deshacerme de todos los enlaces en el pequeño mapa de teclas de la biblioteca.

En un intento temprano de hacer esto, probé lo siguiente (después de confirmar que little-library-mode-mapes donde viven los enlaces):

(with-eval-after-load "little-library-mode"
  (setq little-library-mode-map (make-sparse-keymap)))

El código "tiene éxito" ( C-h v little-library-mode-map RETmuestra que es (keymap)ahora), pero todas las pequeñas combinaciones de teclas de la biblioteca aún "funcionan" ( C-c C-stodavía funciona la pequeña función de la biblioteca, incluso en los buffers de org y org-agenda).

He encontrado otra forma de resolver mi problema, pero tengo mucha curiosidad por qué este enfoque falla. Las combinaciones de teclas de Emacs todavía me parecen magia negra.

flechas_púrpura
fuente
Tendrá que modificar destructivamente la estructura de datos que usa el modo menor, como (setcdr little-library-mode-map nil).
wasamasa

Respuestas:

3

Hay tres cosas importantes en esta historia:

  • el mapa de teclas de modo menor
  • su nombre
  • el escaso mapa de teclas que creas

Básicamente, lo que hizo fue hacer que el nombre apunte al mapa de teclas disperso en lugar del original, pero es demasiado tarde: el modo menor usa el original.

YoungFrog
fuente
Ah, lo tengo. Cuando lo pones de esa manera, tiene mucho sentido. ¿Sabes cómo Emacs / el modo menor encuentra el mapa de teclas original? ¿En qué estructura de datos se ve?
purple_arrows
3
@purple_arrows se encuentra el mapa de teclas original minor-mode-map-alist.
npostavs
2

En algún momento al activar little-library-modeel mapa de teclas almacenado en la variable little-library-mode-mapse agrega a minor-mode-map-alist:

(push (cons 'little-library-mode little-library-mode-map) minor-mode-map-alist)

Emacs usa esta lista para buscar enlaces de modo menor. Cuando vincula la variable little-library-mode-mapa un nuevo valor después, esto no tiene efecto en los minor-mode-map-alistpuntos del mapa de teclas . Como se señaló en el comentario de @wasamasa, una forma de deshacerse de todos los enlaces en este mapa de teclas es mutar el mapa de teclas directamente:

 (setcdr little-library-mode-map nil)

Otra forma es restablecer el mapa de teclas antes de cargar la biblioteca:

(setq little-library-mode-map (make-sparse-keymap))
(with-eval-after-load "little-library-mode" 
    ...more-setup-code)

Si el modo menor se comporta bien, esto también evitará crear instancias de sus enlaces.

clemera
fuente