Bonne façon d'activer le mode mineur

24

J'ai foo-mode et activerais le mode barre mineure pour cela. Alors, quelle voie est plus courante et préférable?

UNE

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

• variante C, mais fonction poussée en amont

E

• variante C, mais fonction stockée dans la recette du plugin

Netsu
la source
4
Bonjour @Netsu, j'ai remarqué que vous avez rajouté la citation que j'avais supprimée de votre lambda. En général, il est dangereux de citer des lambdas, alors Stefan et moi essayons simplement de motiver les bonnes pratiques. :-)
Malabarba

Réponses:

26

Cela dépend de la ou des versions d'Emacs que vous utilisez (ou ciblez). Si vous utilisez exclusivement Emacs 24+, vous pouvez utiliser en toute sécurité 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.

Cela provient du fichier NEWS, mais selon les commentaires, il est recommandé d'utiliser des citations de fonction pour les symboles de fonction, comme suit:

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

Si le code doit être exécuté sous Emacs 23 (ou version antérieure), je choisirais la variante C, car personnellement je n'aime pas voir les fonctions anonymes dans les variables de hook. (Je ne suis pas sûr de comprendre ce que vous entendez par variantes D & E, l'esprit).

phils
la source
3
Vous devez de préférence utiliser des guillemets de fonction pour le mode mineur, afin que le compilateur d'octets puisse vous avertir si le mode n'est pas défini.
lunaryorn
Merci. Mais la citation de fonction est-elle toujours nécessaire? Quels avantages cela donne-t-il? Est-il également nécessaire pour les lambdas?
Netsu
7

Voici une autre façon de le faire qui présente certains avantages, en supposant que vous modifiez votre propre configuration, pas un package que vous distribuez.

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

L'avantage est que tout est stocké dans un seul crochet, donc pour désactiver certaines choses, vous n'avez pas à le faire remove-hook, mais à la place, commentez certaines choses dans custom-foo-hooket C-M-x.

Vous pouvez même écrire une commande qui passe de n'importe quel mode à son crochet personnalisé.

abo-abo
la source
1
Il s'agit (essentiellement) de la variante C avec un nom différent, mais je conviens qu'elle mérite d'être soulignée. C'est certainement l'approche que j'adopte lorsque je personnalise les comportements des modes principaux dans ma propre configuration.
phils
1
La variante C implique plusieurs add-hookinstructions pour chaque mode mineur à activer. Je tenais à souligner qu'avoir une seule add-hookdéclaration est un avantage.
abo-abo
D'accord. Dans ma tête, j'ai pratiquement traduit la variante C pour "définir une fonction personnalisée qui active le mode" plutôt que "définir une fonction personnalisée qui active uniquement le mode", mais rétrospectivement, cette dernière semble avoir été l'intention. Comme vous le dites, cela dépend si le code est à usage personnel ou non.
phils
7

Pourquoi définiriez-vous une nouvelle commande qui fait exactement ce qui bar-minor-modefait?

À partir de la version 24.1, tous ces éléments sont complètement équivalents, il suffit donc d'utiliser la moins redondante: option A

(add-hook 'foo-mode-hook #'bar-minor-mode)
Malabarba
la source
1
Est-ce une solution sûre? Je veux dire que si l'un des modes parents foo-mode-hook a le même crochet que bar-minor-mode appellera deux fois, il sera donc désactivé. Comportement inattendu.
Netsu
2
@Netsu yes, l'appel à une fonction de mode mineur sans argument PERMET DE FAIRE inconditionnellement le mode mineur.
Malabarba
4
@Malabarba Uniquement à partir d'Emacs 24. Dans les versions antérieures, il était en fait de changer de mode.
lunaryorn
1
@lunaryorn Oui, c'est pourquoi la réponse de phils est meilleure. :-) J'étais trop paresseux pour réparer le mien.
Malabarba