Ils sont différents si le package est différé, c'est-à-dire qu'il n'est pas chargé jusqu'à ce qu'il soit nécessaire. Dans ce cas, :init
il sera exécuté au moment de la première lecture de votre fichier emacs, mais :config
sera exécuté au moment où le paquet est réellement chargé.
Dans votre exemple, l'utilisation de mode
diffère implicitement le chargement du package. Vous avez configuré le package pour qu'il soit chargé la première fois qu'un fichier html est visité.
Vous pouvez utiliser :demand
pour vous assurer que le package est toujours chargé au démarrage, mais plus probablement ce que vous voulez faire ici est de mettre votre crochet :init
.
De la docstring:
:init Code to run when `use-package' form evals.
Puisque vous placez cela dans votre fichier d'initialisation utilisateur, cela signifie essentiellement qu'il s'exécutera au démarrage.
:config Runs if and when package loads.
Donc, ne courez pas tant que le paquet n'est pas réellement chargé.
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Notez la liste des choses qui rendent automatiquement un package différé. Fondamentalement, si vous indiquez use-package
les conditions dans lesquelles vous avez besoin de ce package, cela suppose que vous ne voulez pas le charger jusqu'à ce que ces conditions se produisent.
:demand Prevent deferred loading in all cases.
Assurez-vous que le package est chargé au démarrage, quelles que soient les autres options que vous avez spécifiées.
Mise à jour
Revisiter cela sur la base des commentaires récents ... Ce que j'ai dit ci-dessus est tout à fait vrai, mais je ne pense pas qu'il réponde correctement à la question. Le problème racine ici est en fait qu'il html-mode
ne s'agit pas d'un package, mais plutôt d'un mode défini par le package sgml-mode
. Cela fonctionne comme prévu pour moi:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
Dans l'exemple d'origine, l' :config
expression n'est jamais évaluée car un package nommé html-mode
n'est jamais chargé. Le déplacement de la même expression :init
fonctionne car le code init est toujours évalué, que le package soit ou non chargé.
:idle
assez largement et je n'ai pas examiné l'impact de ": l'inactivité a été supprimée".auto-fill
n'est pas désactivé, c'est-à-dire que le code de configuration ne s'est pas exécuté. J'ai le même problème.html-mode
n'est pas un paquet. Au moins dans ma version actuelle d'Emacs,html-mode
est défini dans le packagesgml-mode
. Donc, si vous ditesuse-package
de faire quelque chose lorsqu'un package nomméhtml-mode
est chargé, ce code ne s'exécute jamais car aucun package de ce type n'est jamais chargé. Vous devez mettre la configuration en mode html dans un fichier(use-package sgml-mode ....)
.org-mode
, nonhtml-mode
. Un problème similaire est que le package est appeléorg-mode
, mais le package ELPA est appeléorg
. C'est peut-être déroutant (ou moi)?Cet exemple m'a permis de comprendre la différence entre
:init
et:config
. Prenons un exemple deace-window
package (mais cela peut être n'importe quel package). Mettez ceci dans votreinit.el
dossier:Ouvrez maintenant votre emacs et voyez dans le
*Messages*
tampon pour voir s'il y a unhello world
message. Vous ne pourrez pas en trouver car le package est différé. Passez maintenant deconfig
àinit
:Maintenant, fermez et rouvrez emacs et inspectez le
*Messages*
tampon. Vous verrez le messageace window: hello world
car le code est exécuté quel que soit le moment où il:init
est donné. Dans ce cas,config
il ne sera exécuté que lorsque ce package sera chargé.la source
:init
et:preface
basé sur votre exemple?:preface
est exécuté même si le package en question est désactivé alors qu'il:init
n'est exécuté que lorsqu'un package est activé.