use-package -: init ou: config

14

Existe-t-il une règle permettant à l'utilisateur de déterminer si la configuration du package requiert :initou :config?

rchar01
la source

Réponses:

13

Existe-t-il une règle permettant à l'utilisateur de déterminer si la configuration du package requiert :initou :config?

Il n'y a pas de règle générale qui s'applique à tous les paramètres et packages; il vous suffit de vous familiariser avec la signification de ces mots clés en lisant le fichier README de use-package.

En résumé, le :initbloc est exécuté au démarrage, comme si vous aviez placé ses formes constitutives au niveau supérieur (c'est-à-dire en dehors d'un appel typique à use-package) de votre user-init-file. Cela signifie qu'ils sont toujours exécutés, que le package correspondant ait été chargé ou non.

Le :configbloc, en revanche, est exécuté après le chargement du package correspondant, via le eval-after-loadmécanisme.

En tant que tel, vous pouvez améliorer votre temps de démarrage en déplaçant les paramètres de longue durée applicables de :inità :config. Si vous devez modifier une variable qui n'est définie qu'après le chargement d'un package particulier, vous devez également le placer dans le :configbloc. Certaines variables, telles que gnus-home-directory, doivent être définies avant le chargement de leur package correspondant, elles doivent donc être placées dans :init. Je conseille fortement de mettre tous les appels applicables add-hook/ remove-hookdans le :initbloc, car les hooks peuvent être modifiés même lorsqu'ils ne sont pas liés, ce qui offre plus de modularité à votre configuration.

Vous pouvez souvent éviter d'avoir à déterminer où placer un paramètre particulier en utilisant le nouveau :custommot clé ou en utilisant directement l'interface de personnalisation facile .

Basilic
la source
2

Je ne sais pas s'il existe une règle générale (à part "utiliser :initpour la préconfiguration avant le chargement réel du paquet et l'utiliser :configpour une autre configuration)".

Mais j'utilise moi-même :initquand, par exemple, je veux ajouter d'autres raccourcis clavier de mappage de mode pour utiliser les fonctions de "ce" package. Et je veux toujours que "ce" paquet soit chargé paresseusement.

Voici l'exemple de chargement paresseux de dired-ranger:

(use-package dired-ranger
  :commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
  :init
  (add-hook 'dired-mode-hook
            (lambda ()
              (define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
              (define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
              (define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))

PS: S'il n'y a pas :defer, :commands, :modeet d' autres qui facilite le chargement des paquets paresseux, alors :initet :configdevrait être plus ou moins les mêmes (mais :initsera évalué plus tôt :))

Maxim Kim
la source
4
La modification des liaisons de touches dans un hook de mode signifie qu'elles sont exécutées chaque fois que vous ouvrez un tampon dans ce mode. Vous ne devez modifier les liaisons de touches qu'une seule fois, une fois le package chargé. Vous pouvez utiliser le :bindmot - clé pour cela ou modifier les raccourcis clavier dans le :configbloc.
Basil
En effet, je n'y ai jamais pensé. Mais :configc'est trop tard - le chargement paresseux n'appliquera pas mes liaisons. Et :bindavec :mapne le lie pas réellement.
Maxim Kim
3
:confign'est pas trop tard - c'est exactement quand dired-mode-mapest défini pour la première fois. Vous le mettez probablement sous la mauvaise use-packageforme dired-rangerau lieu de dired, où dired-mode-mapest défini. Cela pourrait également expliquer pourquoi votre :bindne fonctionne pas. Fondamentalement, soit vous faites quelque chose de mal, soit vous avez use-packageun bug. Ne confondez pas les raccourcis clavier locaux et eval-after-loadles raccourcis clavier globaux des commandes / cartes de touches chargées automatiquement.
Basil
@Basil, thx, vous avez raison. Mon problème est que j'ai défini use-package-always-ensureet lorsque j'essaie d'utiliser dir-package, il ne parvient pas à le récupérer sur elpa. Mais :ensure nily avoir résout le problème et je peux configurer le chargement de paquets chaînés dired-> en dired-rangerutilisant :after.
Maxim Kim