Pregunta:
Comencé a codificar un modo menor para proporcionar algunas combinaciones de teclas. Mi intento inicial tuvo un error tipográfico:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(([b] . 'previous-line)))
Tenía la intención de usar la tecla b
, e inmediatamente me di cuenta de que debería haber usado "b"
lugar de [b]
. Así que redefiní el modo menor:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(("b" . 'previous-line)))
Sin embargo, esto no funcionó. Esto me puso en una búsqueda inútil a través de todas las diversas formas de vincular claves (es decir, (kbd …), […], etc.). Finalmente me di cuenta de que simplemente reevaluar la forma (define-minor-mode ...)
no cambiaba nada, estaba atascado con el mapa de teclas original roto. Luego intenté cambiar el (define-key borked-mode-map ...)
directamente a través de (define-key borked-mode-map ...)
y todavía no pude cargar el (define-key borked-mode-map ...)
corregido. Finalmente reinicié Emacs y mi modo menor se cargó correctamente.
Mi pregunta es: ¿cómo se actualiza una definición de modo menor a medida que la desarrolla? ¿Hay alguna forma de eliminar una definición rota, o tiene que reiniciar emacs para borrar los bits rotos?
Respuesta:
La primera vez que evalúa su define-minor-mode
, define una variable borked-mode-map
con las borked-mode-map
teclas que especificó. Una vez que se ha definido ese símbolo, sin embargo, reevaluar su modo define-minor-mode
no lo cambiará.
Puede eliminar los diversos borked-mode-xxx
usando unintern
y luego reevaluar su código. Tratar:
(unintern 'borked-mode-map)
Es posible que le interese expandir la macro define-minor-mode
para ver qué está haciendo realmente. Ponga el punto al final y llame a Mx pp-macroexpand-last-sexp
. Esto abrirá un nuevo búfer que muestra la macro expandida. Allí verá las llamadas defvar
utilizadas para configurar sus variables de modo. Si lee la ayuda para defvar
, verá que el valor inicial solo se usa si el símbolo que se está definiendo es nulo; una vez que existe, las defvar
llamadas a defvar
no cambiarán su valor.