after-init-hook vs eval-after-load / com-eval-after-load

13

Eu achei o útil como How Packages funciona no Emacs 24 , no entanto, eu gostaria de uma resposta definitiva de um usuário experiente ou de um desenvolvedor principal sobre qual deles é realmente preferido no caso típico da 24.4.

Afaik, (add-hook 'after-init-hook ...)é a abordagem de força bruta, por assim dizer, para configurar personalizações para pacotes. No entanto, eval-after-loade sua mais sintaticamente açucarada with-eval-after-loadparece mais apropriada para uma configuração mais dinâmica e de granulação fina que funciona bem com o carregamento gradual, separado e lento das extensões.

Meu entendimento está correto? O que mais devo ter em mente?

Erik Kaplun
fonte

Respostas:

11

Afaik, (add-hook 'after-init-hook ...)é a abordagem de força bruta, por assim dizer, para configurar personalizações para pacotes.

Não. Se você deseja configurar pacotes no seu arquivo init, a abordagem típica é chamar (package-initialize)na parte superior do arquivo e, em seguida, fazer as configurações. after-init-hooké desnecessariamente complicado para esse fim.

No entanto, eval-after-loade sua mais sintaticamente açucarada with-eval-after-loadparece mais apropriada para uma configuração mais dinâmica e de granulação fina que funciona bem com o carregamento gradual, separado e lento das extensões.

(with-)eval-after-loadé usado para coisas que você deseja fazer após o carregamento de um pacote. package-initializenão carrega os pacotes, apenas os "prepara" (carrega seus carregamentos automáticos).

Se você usar eval-after-loadtodos os conjuntos de configurações, não precisará ligar (package-initialize)para o topo. Mas o que as pessoas costumam fazer é chamar (package-initialize), para que a maioria das configurações possa ser gravada diretamente no arquivo init, e somente o eval-after-loadcódigo que é muito longo ou depende do pacote sendo carregado.

Malabarba
fonte
mas ainda seria bom colocar tudo abaixo eval-after-loadde qualquer pacote, certo, e não usar (package-initialize)?
precisa
@ErikAllik Sim. Se você usar eval-after-load em todos os conjuntos de configurações, não precisará chamar (inicializar pacote) na parte superior.
Malabarba