J'ai commencé à coder un mode mineur pour fournir des raccourcis clavier. Ma tentative initiale avait une faute de frappe:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(([b] . 'previous-line)))
J'avais l'intention d'utiliser la b
clé et j'ai immédiatement réalisé que j'aurais dû utiliser à la "b"
place de [b]
. J'ai donc redéfini le mode mineur:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(("b" . 'previous-line)))
Cependant, cela n'a pas fonctionné. Cela m'a lancé sur une chasse aux oies sauvages à travers toutes les différentes façons de lier les clés (c'est-à-dire, (kbd ...), [...], etc.). Finalement, je me suis rendu compte que la simple réévaluation du (define-minor-mode ...)
formulaire ne changeait rien, j'étais coincé avec la carte des touches originale et cassée. J'ai ensuite essayé de changer le clavier directement via (define-key borked-mode-map ...)
et je n'ai toujours pas pu charger le clavier corrigé. Enfin, j'ai redémarré Emacs et mon mode mineur était correctement chargé.
Ma question est: comment mettre à jour une définition de mode mineur pendant que vous la développez? Existe-t-il un moyen de vider une définition cassée, ou devez-vous redémarrer emacs pour effacer les bits cassés?
la source
defvar
n'évaluera pas sa valeur à nouveau aprèsC-M-x
:) Vous auriez besoindefparameter
ou d'un séparésetf
.define-minor-mode
macro: appelerdefvar
pour définir la carte. Évaluer ce defvar une deuxième fois n'a aucun effet.C-M-x
(eval-defun
) pour réévaluer ladefvar
alors la variable est mise à jour. Ceci est un cas spécial danseval-defun
; si vous appelezeval-buffer
oueval-region
alors la valeur existante n'est pas modifiée.C-M-x
sur ledefvar
formulaire ne met à jour que la variable mode-map elle-même. Vous devez égalementC-M-x
sur ledefine-minor-mode
formulaire pour obtenir la carte modifiée «installée» dans le mode mineur. J'ai essayé de comprendre pourquoi en étendant les macros, mais ça me dépasse.