Zacząłem kodować mniejszy tryb, aby zapewnić kilka skrótów klawiszowych. Moja pierwsza próba miała literówkę:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(([b] . 'previous-line)))
Miałem zamiar użyć b
klucz i natychmiast zrozumiał, że powinien użyłem "b"
zamiast [b]
. Dlatego przedefiniowałem tryb drugorzędny:
(define-minor-mode borked-mode
"A mode defined with a broken key binding"
nil nil
'(("b" . 'previous-line)))
Jednak to nie zadziałało. To spowodowało, że zacząłem gonić za dziką gęsią skórką poprzez różne sposoby wiązania kluczy (tj. (Kbd ...), [...] itp.). W końcu zdałem sobie sprawę, że sama ponowna ocena (define-minor-mode ...)
formularza nic nie zmienia, utknąłem z oryginalną, zepsutą mapą klawiszy. Następnie spróbowałem zmienić mapę klawiszy bezpośrednio przez (define-key borked-mode-map ...)
i nadal nie udało mi się załadować poprawionej mapy klawiszy. W końcu zrestartowałem Emacsa i mój mniejszy tryb został poprawnie załadowany.
Moje pytanie brzmi: w jaki sposób aktualizujesz definicję trybu pomocniczego podczas jej opracowywania? Czy jest jakiś sposób, aby opróżnić zepsutą definicję, czy też musisz ponownie uruchomić emacsa, aby usunąć zepsute bity?
źródło
defvar
nie oceni ponownie swojej wartości poC-M-x
:) Będziesz potrzebowaćdefparameter
lub osobnosetf
.define-minor-mode
robi makro: wywoływanie wdefvar
celu zdefiniowania mapy. Ocena tego defvarsu po raz drugi nie ma wpływu.C-M-x
(eval-defun
) do ponownej oceny,defvar
to zmienna zostanie zaktualizowana. Jest to szczególny przypadek weval-defun
; jeśli zadzwoniszeval-buffer
lubeval-region
wówczas istniejąca wartość nie ulega zmianie.C-M-x
wdefvar
formularzu aktualizuje tylko samą zmienną mapowania trybów. Musisz takżeC-M-x
wdefine-minor-mode
formularzu, aby zmienić mapę „zainstalować” w trybie pomocniczym. Próbowałem dowiedzieć się, dlaczego, rozszerzając makra, ale to mnie przerasta.Możesz zdefiniować mapę trybu w następujący sposób:
Teraz możesz ponownie ocenić definicję mapy za pomocą,
eval-defun
a ona automatycznie zaktualizuje zapisaną mapę w środkuminor-mode-map-alist
.źródło