Eles são diferentes se o pacote for adiado, ou seja, não carregado até que seja necessário. Nesse caso :init
, será executado no momento em que seu arquivo emacs for lido pela primeira vez, mas :config
será executado no momento em que o pacote for realmente carregado.
No seu exemplo, o uso de mode
implicitamente adia o carregamento do pacote. Você configurou o pacote para ser carregado na primeira vez que um arquivo html é visitado.
Você pode usar :demand
para garantir que o pacote esteja sempre carregado na inicialização, mas é mais provável que você queira fazer isso aqui :init
.
Da documentação:
:init Code to run when `use-package' form evals.
Como você está colocando isso no arquivo user-init, isso basicamente significa que ele será executado na inicialização.
:config Runs if and when package loads.
Portanto, não execute até que o pacote esteja realmente sendo carregado.
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Observe a lista de itens que automaticamente tornam um pacote adiado. Basicamente, se você informar use-package
as condições em que precisa deste pacote, ele pressupõe que não deseja carregá-lo até que essas condições ocorram.
:demand Prevent deferred loading in all cases.
Verifique se o pacote está carregado na inicialização, independentemente de outras opções que você especificou.
Atualizar
Revisitando isso com base nos comentários recentes ... O que eu disse acima é verdade, mas acho que não responde corretamente à pergunta. O problema raiz aqui é, na verdade, que html-mode
não é um pacote, mas um modo definido pelo pacote sgml-mode
. Isso funciona como esperado para mim:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
No exemplo original, a :config
expressão nunca é avaliada porque um pacote chamado html-mode
nunca é carregado. Mover a mesma expressão para :init
funciona porque o código init é sempre avaliado, independentemente de o pacote ser carregado.