Son diferentes si el paquete se difiere, es decir, no se carga hasta que se necesita. En ese caso :init
, se ejecutará en el momento en que se lea por primera vez su archivo emacs, pero :config
se ejecutará en el momento en que se cargue realmente el paquete.
En su ejemplo, el uso de mode
implícitamente difiere la carga del paquete. Ha configurado el paquete para que se cargue la primera vez que se visita un archivo html.
Puede usar :demand
para asegurarse de que el paquete siempre se carga al inicio, pero lo más probable es que lo que quiera hacer aquí sea conectarlo :init
.
Desde la cadena de documentación:
:init Code to run when `use-package' form evals.
Como está poniendo esto en su archivo de inicio de usuario, eso básicamente significa que se ejecutará al inicio.
:config Runs if and when package loads.
Por lo tanto, no se ejecute hasta que el paquete se esté cargando.
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Tenga en cuenta la lista de cosas que automáticamente hacen diferido un paquete. Básicamente, si indica use-package
las condiciones en las que necesita este paquete, se supone que no desea cargarlo hasta que surjan esas condiciones.
:demand Prevent deferred loading in all cases.
Asegúrese de que el paquete se cargue al inicio, independientemente de las otras opciones que haya especificado.
Actualizar
Revisando esto basado en los comentarios recientes ... Lo que dije arriba es cierto, pero no creo que responda correctamente la pregunta. El problema raíz aquí es en realidad que html-mode
no es un paquete, sino un modo definido por el paquete sgml-mode
. Esto funciona como se esperaba para mí:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
En el ejemplo original, la :config
expresión nunca se evalúa porque un paquete llamado html-mode
nunca se carga. Mover la misma expresión a :init
funciona porque el código de inicio siempre se evalúa, independientemente de si el paquete se carga alguna vez.
:idle
bastante y no he investigado el impacto de ": inactivo ha sido eliminado".auto-fill
no está apagado, es decir, el código de configuración no se ejecutó. Tengo el mismo problema.html-mode
no es un paquete. Al menos en mi versión actual de Emacs,html-mode
se define en el paquetesgml-mode
. Entonces, si le diceuse-package
que haga algo cuandohtml-mode
se carga un paquete llamado ese código nunca se ejecuta porque nunca se carga dicho paquete. Necesita poner la configuración del modo html en a(use-package sgml-mode ....)
.org-mode
, nohtml-mode
. Un problema similar es que se llama al paqueteorg-mode
, pero se llama al paquete ELPAorg
. ¿Tal vez eso es confuso (o para mí)?Este ejemplo me hizo mucho más fácil entender la diferencia entre
:init
y:config
. Tomemos un ejemplo deace-window
paquete (pero este puede ser cualquier paquete). Pon esto en tuinit.el
archivo:Ahora abra sus emacs y vea en el
*Messages*
búfer para ver si hay algúnhello world
mensaje. No podrá encontrar ninguno porque el paquete está diferido. Ahora cambie deconfig
ainit
:Ahora cierre y vuelva a abrir emacs e inspeccione el
*Messages*
búfer. Verá el mensajeace window: hello world
porque el código se ejecuta sin importar cuándo:init
se da. En el caso deconfig
que solo se ejecute cuando se cargue ese paquete.fuente
:init
y:preface
según su ejemplo?:preface
se ejecuta incluso si el paquete en cuestión está deshabilitado, mientras:init
que solo se ejecuta cuando un paquete está habilitado.