Come si aggiorna una definizione della modalità minore mentre la si sviluppa?


13

Ho iniziato a scrivere una modalità minore per fornire alcune combinazioni di tasti. Il mio tentativo iniziale aveva un refuso:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(([b] . 'previous-line)))

Avevo intenzione di usare la bchiave e mi sono subito reso conto che avrei dovuto usare "b"invece di [b]. Quindi ho ridefinito la modalità minore:

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(("b" . 'previous-line)))

Tuttavia, questo non ha funzionato. Questo mi ha dato la caccia a un'oca selvatica attraverso tutti i vari modi di legare le chiavi (cioè, (kbd ...), [...], ecc.). Alla fine mi sono reso conto che semplicemente rivalutare il (define-minor-mode ...)modulo non stava cambiando nulla, ero bloccato con la mappa chiave originale rotta. Ho quindi provato a cambiare la keymap direttamente tramite (define-key borked-mode-map ...)e ancora non riuscivo a caricare la keymap corretta caricata. Alla fine ho riavviato Emacs e la mia modalità minore è stata caricata correttamente.

La mia domanda è: come si aggiorna una definizione della modalità minore mentre la si sviluppa? Esiste un modo per cancellare una definizione rotta o è necessario riavviare emacs per eliminare i bit rotti?

Risposte:


11

La prima volta che valuti il ​​tuo, define-minor-modeesso definisce una variabile borked-mode-mapcon le associazioni di tasti specificate. Una volta definito quel simbolo, tuttavia, rivalutare il proprio define-minor-modenon lo cambierà.

È possibile eliminare i vari borked-mode-xxxsimboli utilizzando uninterne quindi rivalutare il codice. Provare:

(unintern 'borked-mode-map)

Potresti essere interessato ad espandere la define-minor-modemacro per vedere cosa sta effettivamente facendo. Metti il ​​punto alla fine e chiama M-x pp-macroexpand-last-sexp. Questo aprirà un nuovo buffer che mostra la macro espansa. Lì vedrai le defvarchiamate utilizzate per impostare le variabili di modalità. Se leggi la guida per defvarvedrai che il valore iniziale viene usato solo se il simbolo che viene definito è nullo - una volta che esiste, le defvarchiamate successive non cambieranno il suo valore.


13

Penso che la migliore risposta che posso darti sia di stare alla larga dalla "funzione di associazione dei tasti incorporata" di define-minor-mode. Uso

(defvar borked-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [b] 'previous-line)
    ...
    map))

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  :global nil
  ...)

Anziché. Quindi è possibile utilizzare C-M-xper rivalutare tali definizioni.


1
defvarnon valuterà più il suo valore dopo C-M-x:) Ne avresti bisogno defparametero uno separato setf.
wvxvw,

Come sottolinea @wvxvw, questo in realtà non risolve il problema. Il tuo codice di esempio sta facendo lo stesso della define-minor-modemacro: chiamando defvarper definire la mappa. Valutare quella defvar una seconda volta non ha alcun effetto.
Glucas,

7
@wvxvw Se si utilizza C-M-x( eval-defun) per rivalutare, defvarla variabile viene aggiornata. Questo è un caso speciale in eval-defun; se chiami eval-buffero eval-regionil valore esistente non viene modificato.
Gilles 'SO- smetti di essere malvagio' il

Ah - sembra il punto chiave.
glucas,

1
Si noti che C-M-xnel defvarmodulo aggiorna solo la variabile mappa modalità stessa. Devi anche C-M-xsul define-minor-modemodulo per ottenere la mappa modificata 'installata' in modalità secondaria. Ho cercato di capire perché espandendo le macro, ma è oltre me.
Tyler,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.