Maneira correta de ativar o modo secundário

24

Eu tenho o modo foo e habilitaria o modo barra menor para ele. Então, de que maneira é mais comum e preferível?

UMA

(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, mas função empurrada para montante

E

• variante C, mas função armazenada na receita do plugin

Netsu
fonte
4
Olá @Netsu, notei que você adicionou novamente a cotação que eu havia removido da sua lambda. Em geral, é prejudicial citar lambdas, então Stefan e eu estamos apenas tentando motivar boas práticas. :-)
Malabarba

Respostas:

26

Depende de quais versões do Emacs você está usando (ou direcionando). Se você estiver usando exclusivamente o Emacs 24+, poderá usar com segurança a 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.

Isso é do arquivo NEWS, mas de acordo com os comentários, é uma boa prática usar a citação de funções para símbolos de funções, como:

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

Se o código precisar ser executado no Emacs 23 (ou anterior), eu iria com a variante C, pois pessoalmente não gosto de ver funções anônimas em variáveis ​​de gancho. (Não sei se entendi o que você quer dizer com variantes D & E, lembre-se).

phils
fonte
3
Você deve preferencialmente usar aspas de função para o modo secundário, para que o compilador de bytes possa avisá-lo se o modo estiver indefinido.
lunaryorn
Obrigado. Mas a citação de funções ainda é necessária? Que vantagens isso oferece? Também é necessário para lambdas também?
Netsu
7

Aqui está mais uma maneira de fazer isso que tem algumas vantagens, assumindo que você está editando sua própria configuração, não um pacote que você distribui.

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

A vantagem é que tudo é armazenado em um gancho; portanto, para desativar algumas coisas, você não precisa fazer remove-hook, mas comentar algumas coisas em custom-foo-hooke C-M-x.

Você pode até escrever um comando que salta de qualquer modo para seu gancho personalizado.

abo-abo
fonte
1
Esta é (essencialmente) a variante C com um nome diferente, mas concordo que vale a pena enfatizar. Essa é certamente a abordagem adotada ao personalizar os principais comportamentos de modo em minha própria configuração.
Phd #
1
A variante C implica várias add-hookinstruções para cada modo secundário a ser ativado. Eu queria enfatizar que ter apenas uma add-hookafirmação é uma vantagem.
abo-abo
Acordado. Na minha cabeça, traduzi a variante C para "definir uma função personalizada que habilita o modo" em vez de "definir uma função personalizada que habilita apenas o modo", mas, em retrospecto, a última parece ter sido a intenção. Como você diz, depende se o código é ou não para uso pessoal.
Phd #
7

Por que você definiria um novo comando que faz exatamente o que bar-minor-modefaz?

Começando com 24.1, todos esses itens são completamente equivalentes; portanto, use o menos redundante: opção A

(add-hook 'foo-mode-hook #'bar-minor-mode)
Malabarba
fonte
1
É uma solução segura? Quero dizer, se um dos modos pai foo-mode-hook tiver o mesmo hook que o modo bar-minor chamará duas vezes, então será desativado. Comportamento inesperado.
Netsu
2
@ Netsu sim, chamar uma função de modo secundário sem argumentos HABILITA o modo secundário incondicionalmente.
Malabarba
4
@ Malabarba Somente a partir do Emacs 24. Nas versões anteriores, eu alternava o modo.
lunaryorn
1
@ lunaryorn Sim, é por isso que a resposta do phils é melhor. :-) Eu estava com preguiça de consertar o meu.
Malabarba