Forma correcta de habilitar el modo menor

24

Tengo el modo foo y habilitaría el modo bar-minor para ello. Entonces, ¿qué camino es más común y preferible?

UNA

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

si

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

do

(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)

re

• variante C, pero la función se empujó hacia arriba

mi

• variante C, pero función almacenada en la receta del complemento

Netsu
fuente
44
Hola @Netsu, noté que agregaste de nuevo la cita que había eliminado de tu lambda. En general, es perjudicial citar lambdas, por lo que Stefan y yo solo estamos tratando de motivar las buenas prácticas. :-)
Malabarba

Respuestas:

26

Depende de la (s) versión (es) de Emacs que esté utilizando (o de destino). Si está utilizando exclusivamente Emacs 24+, puede usar la variante A de forma segura:

* 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.

Eso es del archivo NEWS, pero según los comentarios, es una buena práctica usar comillas de función para símbolos de función, así:

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

Si el código pudiera necesitar ejecutarse bajo Emacs 23 (o anterior), iría con la variante C, ya que personalmente no me gusta ver funciones anónimas en las variables de enlace. (No estoy seguro de entender lo que quieres decir con variantes D y E, mente).

phils
fuente
3
Preferiblemente debe usar comillas de función para el modo menor, de modo que el compilador de bytes pueda advertirle si el modo no está definido.
lunaryorn
Gracias. ¿Pero sigue siendo necesaria la cita de funciones? ¿Qué ventajas da? ¿También es necesario para lambdas también?
Netsu
7

Aquí hay una forma más de hacerlo que tiene algunas ventajas, suponiendo que esté editando su propia configuración, no un paquete que distribuya.

(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))

La ventaja es que todo se almacena en un gancho, por lo que para deshabilitar algunas cosas, no tiene que hacerlo remove-hook, sino que debe comentar algunas cosas en custom-foo-hooky C-M-x.

Incluso puede escribir un comando que salte de cualquier modo a su enlace personalizado.

abo-abo
fuente
1
Esta es (esencialmente) la variante C con un nombre diferente, pero estoy de acuerdo en que vale la pena enfatizar. Este es ciertamente el enfoque que adopto cuando personalizo comportamientos de modo principal en mi propia configuración.
Phil
1
La variante C implica múltiples add-hookdeclaraciones para cada modo menor para habilitar. Quería enfatizar que tener una sola add-hookdeclaración es una ventaja.
abo-abo
Convenido. En mi cabeza, traduje prácticamente la variante C para "definir una función personalizada que habilite el modo" en lugar de "definir una función personalizada que solo habilite el modo", pero en retrospectiva, esta última parece haber sido la intención. Como usted dice, depende de si el código es o no para uso personal.
phils
7

¿Por qué definirías un nuevo comando que hace exactamente lo que bar-minor-modehace?

Comenzando con 24.1, todos estos son completamente equivalentes, así que solo use el menos redundante: opción A

(add-hook 'foo-mode-hook #'bar-minor-mode)
Malabarba
fuente
1
¿Es una solución segura? Quiero decir, si uno de los modos primarios de enlace de modo foo tiene el mismo enlace que el modo de barra menor , llamará dos veces, por lo que estará deshabilitado. Comportamiento inesperado
Netsu
2
@Netsu sí, llamar a una función de modo menor sin argumentos HABILITA el modo menor incondicionalmente.
Malabarba
44
@Malabarba Solo a partir de Emacs 24. En versiones anteriores es l realmente cambiar el modo.
lunaryorn
1
@lunaryorn Sí, por eso la respuesta de phils es mejor. :-) Estaba siendo demasiado vago para arreglar el mío.
Malabarba