Diferencia entre init y config en use-package


16

Tengo una configuración como esta:

(use-package html-mode
  :mode "\\.html\\'"
  :config
  (progn
    (add-hook 'html-mode-hook 'turn-off-auto-fill)))

Ahora, cuando voy y visito un archivo HTML, observo que auto-fillno está desactivado. Pero si lo uso en :initlugar de :config, auto-fillse apaga. Entonces, mi pregunta es cuándo se :configejecutan los comandos .

Respuestas:


16

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 :configse ejecutará en el momento en que se cargue realmente el paquete.

En su ejemplo, el uso de modeimplí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 :demandpara 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-packagelas 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-modeno 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 :configexpresión nunca se evalúa porque un paquete llamado html-modenunca se carga. Mover la misma expresión a :initfunciona porque el código de inicio siempre se evalúa, independientemente de si el paquete se carga alguna vez.



@npostavs Gracias, vale la pena señalar. Todavía no me he movido a use-package 2.0. Por un lado, uso :idlebastante y no he investigado el impacto de ": inactivo ha sido eliminado".
glucas

1
Todavía no entiendo por qué, cuando visita un archivo HTML y activa la carga del paquete, auto-fillno está apagado, es decir, el código de configuración no se ejecutó. Tengo el mismo problema.
Ken Williams

@KenWilliams ¿Tu problema también es con el modo html? Creo que el problema real aquí es que html-modeno es un paquete. Al menos en mi versión actual de Emacs, html-modese define en el paquete sgml-mode. Entonces, si le dice use-packageque haga algo cuando html-modese 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 ....).
glucas

Lo siento, mi problema es con org-mode, no html-mode. Un problema similar es que se llama al paquete org-mode, pero se llama al paquete ELPA org. ¿Tal vez eso es confuso (o para mí)?
Ken Williams

7

Este ejemplo me hizo mucho más fácil entender la diferencia entre :inity :config. Tomemos un ejemplo de ace-windowpaquete (pero este puede ser cualquier paquete). Pon esto en tu init.elarchivo:

(use-package ace-window
  :ensure t
  :defer t
  :config
  (progn
    (message "ace window: hello world")))

Ahora abra sus emacs y vea en el *Messages*búfer para ver si hay algún hello worldmensaje. No podrá encontrar ninguno porque el paquete está diferido. Ahora cambie de configa init:

(use-package ace-window
  :ensure t
  :defer t
  :init
  (progn
    (message "ace window: hello world")))

Ahora cierre y vuelva a abrir emacs e inspeccione el *Messages*búfer. Verá el mensaje ace window: hello worldporque el código se ejecuta sin importar cuándo :initse da. En el caso de configque solo se ejecute cuando se cargue ese paquete.


eso ayuda, solo una pregunta secundaria, ¿cuál es la diferencia entre la palabra clave :inity :prefacesegún su ejemplo?
doctorado

@doctorate: :prefacese ejecuta incluso si el paquete en cuestión está deshabilitado, mientras :initque solo se ejecuta cuando un paquete está habilitado.
bbenne10
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.