Modo corretto per abilitare la modalità secondaria


24

Ho la modalità foo e abiliterei la modalità bar-minor per questo. Quindi in che modo è più comune e preferibile?

UN

(add-hook 'foo-mode-hook 'bar-minor-mode)

B

(add-hook 'foo-mode-hook (lambda ()
                           "Turn on `bar-minor-mode' mode."
                           (bar-minor-mode 1)))

C

(defun bar-minor-mode-on ()
  "Turn on `bar-minor-mode' mode."
  (interactive)
  (bar-minor-mode 1))

(add-hook 'foo-mode-hook 'bar-minor-mode-on)

D

• variante C, ma funzione spinta a monte

E

• variante C, ma funzione memorizzata nella ricetta del plugin


4
Ciao @Netsu, ho notato che hai aggiunto nuovamente la citazione che avevo rimosso dalla tua lambda. In generale, è dannoso citare le lambda, quindi Stefan e io stiamo solo cercando di motivare le buone pratiche. :-)
Malabarba,

Risposte:


26

Dipende dalle versioni di Emacs che stai utilizzando (o dal targeting). Se stai utilizzando esclusivamente Emacs 24+, puoi tranquillamente utilizzare la variante A:

* Incompatible Lisp Changes in Emacs 24.1

** Passing a nil argument to a minor mode function call now ENABLES
the minor mode unconditionally.  This is so that you can write e.g.

 (add-hook 'text-mode-hook 'foo-mode)

to enable foo-mode in Text mode buffers, removing the need for
`turn-on-foo-mode' style functions.  This affects all mode commands
defined by `define-minor-mode'.  If called interactively, the mode
command still toggles the minor mode.

Viene dal file NEWS, ma secondo i commenti è buona norma usare la quotazione di funzioni per i simboli di funzione, in questo modo:

 (add-hook 'text-mode-hook #'foo-mode)

Se potrebbe essere necessario eseguire il codice con Emacs 23 (o precedente), andrei con la variante C, poiché personalmente non mi piace vedere le funzioni anonime nelle variabili hook. (Non sono sicuro di aver capito cosa intendi per varianti D ed E, mente).


3
È preferibile utilizzare le virgolette di funzione per la modalità secondaria, in modo che il compilatore di byte possa avvisare se la modalità non è definita.
lunaryorn,

Grazie. Ma la quotazione delle funzioni è ancora necessaria? Quali vantaggi offre? Inoltre è necessario anche per i lambda?
Netsu,


7

Ecco un altro modo per farlo che presenta alcuni vantaggi, supponendo che tu stia modificando la tua configurazione, non un pacchetto che distribuisci.

(add-hook 'foo-mode-hook
          #'custom-foo-hook)

(defun custom-foo-hook ()
  (bar-minor-mode 1)
  (baz-minor-mode 1)
  ;; ...
  (define-key foo-mode-map "C-c C-b" #'foobar))

Il vantaggio è che tutto è memorizzato in un hook, quindi per disabilitare alcune cose, non devi farlo remove-hook, ma invece commentare alcune cose in custom-foo-hooke C-M-x.

Puoi persino scrivere un comando che salta da qualsiasi modalità al suo hook personalizzato.


1
Questa è (essenzialmente) la variante C con un nome diverso, ma concordo che vale la pena sottolineare. Questo è certamente l'approccio che seguo quando personalizzo i comportamenti in modalità principale nella mia configurazione.
phils,

1
La variante C implica più add-hookistruzioni per ogni modalità minore da abilitare. Volevo sottolineare che avere una sola add-hookaffermazione è un vantaggio.
abo-ABO

Concordato. Nella mia testa ho praticamente tradotto la variante C per "definire una funzione personalizzata che abilita la modalità" piuttosto che "definire una funzione personalizzata che abilita solo la modalità", ma a posteriori sembra che questo sia stato l'intento. Come dici tu, dipende dal fatto che il codice sia o meno per uso personale.
phils,

7

Perché dovresti definire un nuovo comando che fa esattamente cosa bar-minor-modefa?

A partire da 24.1, tutti questi sono completamente equivalenti, quindi basta usare quello meno ridondante: opzione A

(add-hook 'foo-mode-hook #'bar-minor-mode)

1
È una soluzione sicura? Voglio dire se una delle modalità genitore foo-mode-hook ha lo stesso hook di bar-minor-mode chiamerà due volte, quindi sarà disabilitata. Comportamento imprevisto.
Netsu,

2
@Netsu sì, chiamando una funzione in modalità minore senza argomenti ABILITA la modalità minore incondizionatamente.
Malabarba,

4
@Malabarba Solo da Emacs 24. Nelle versioni precedenti è in realtà attiva la modalità.
lunaryorn,

1
@lunaryorn Sì, ecco perché la risposta di phils è migliore. :-) Ero troppo pigro per sistemare il mio.
Malabarba,
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.