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.
:idle
bastante extensivamente e não examinei o impacto de ": ocioso foi removido".auto-fill
não está desativado, ou seja, o código de configuração não foi executado. Eu tenho o mesmo problema.html-mode
não é um pacote. Pelo menos na minha versão atual do Emacs,html-mode
está definida no pacotesgml-mode
. Portanto, se você pediruse-package
para fazer alguma coisa quando um pacote nomeadohtml-mode
for carregado, esse código nunca será executado porque esse pacote nunca será carregado. Você precisa colocar a configuração do modo html em um arquivo(use-package sgml-mode ....)
.org-mode
, nãohtml-mode
. Um problema semelhante é que o pacote é chamadoorg-mode
, mas o pacote ELPA é chamadoorg
. Talvez isso seja confuso (ou eu)?Este exemplo me facilitou muito a compreensão da diferença entre
:init
e:config
. Vamos dar um exemplo deace-window
pacote (mas pode ser qualquer pacote). Coloque isso no seuinit.el
arquivo:Agora abra o seu emacs e veja no
*Messages*
buffer para ver se há algumahello world
mensagem. Você não poderá encontrar nenhum porque o pacote foi adiado. Agora mude deconfig
parainit
:Agora feche e reabra o emacs e inspecione o
*Messages*
buffer. Você verá a mensagemace window: hello world
porque o código é executado, independentemente de quando:init
é fornecido. No caso,config
ele será executado apenas quando esse pacote for carregado.fonte
:init
e com:preface
base no seu exemplo?:preface
é executado mesmo que o pacote em questão esteja desabilitado, enquanto:init
é executado somente quando um pacote está habilitado.