Un init paresseux est un bon init.
(OMI)
Quand utiliser with-eval-after-load
with-eval-after-load
est chargé une fois lorsqu'une certaine fonctionnalité ou un fichier est chargé pour la première fois , donc un changement de keymap va clairement à l'intérieur de l'un d'entre eux. Pas des moindres car le keymap peut ne pas être connu au moment de l'initialisation [essayez quelque chose comme (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
dans emacs -q
]. Un hook n'est pas une bonne solution ici car il lie la fonction à une clé à chaque démarrage du hook. Comme le note Tarsius , vous pouvez en savoir plus sur pourquoi ne pas le faire local-set-key
dans les crochets.
Enfin, notez que with-eval-after-load
GNU Emacs 24.4 est un wrapper de 2 lignes eval-after-load
où il body
n'est pas nécessaire de le citer.
Quand utiliser des crochets
Les crochets sont une liste de fonctions chargées à chaque fois qu'un critère est satisfait, par exemple un certain mode est démarré. Une utilisation courante des crochets consiste à charger des modes mineurs, tels que flyspell-mode
ou hl-line-mode
. Par exemple (add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Comme le souligne Rémi , il add-hooks
est intelligent et fera ce qu'il faut même si la variable hook n'a pas encore été chargée. Néanmoins, j'ai de nombreuses clauses comme les suivantes, qui peuvent être négligeables pour les gains de vitesse, mais donnent un sens de l'organisation et de la structure de dépendance:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
Pourquoi ajouter au crochet après org-agenda
? Comme toujours, C-h v org-agenda-mode-hook C-j
délivre. Le crochet est défini org-agenda.el
comme indiqué dans *help*
.
Chargement de fonctionnalités supplémentaires with-eval-after-load
with-eval-after-load
est également important pour le chargement de fonctionnalités supplémentaires. Vous voudriez probablement quelque chose comme (with-eval-after-load 'org (require 'org-inlinetask))
charger des tâches en ligne d'organisation. Pour voir pourquoi (find-library "org-inlinetask")
. Depuis org-inlinetasks.el
directement (require 'org)
, tous les éléments agréables autoload
que vos sympathiques responsables Emacs ont pris grand soin à fournir seront "ignorés" et tous org.el(c)
seront chargés.
Mais que faire si votre (personnel) defun
est requis à plusieurs endroits? Si vous êtes vraiment difficile, vous pouvez mettre les defun
s dans un autre fichier de votre load-path
et ajouter des autoload
cookies, ou vous pouvez dire à Emacs où trouver la fonction avec la autoload
fonction. Alors quelque chose comme ça fonctionnerait:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
Ou vous pourriez tout simplement require
org
tirercdlatex
Et, honnêtement, le désamorçage personnel n'aura pas d'importance la plupart du temps. Les 1150 lignes de defuns personnels (84 defuns) dans mon init.el
ajoute 0,02s sur Emacs vanille.
Mesurer le temps d'initialisation
Un moyen simple d’estimer le temps d’initialisation est
time emacs --eval "(kill-emacs)"
(référence par rapport à emacs -q
.
Mais pour obtenir une approximation plus détaillée de l'endroit où se trouvent les goulots d'étranglement d'initialisation, consultez Joe Schafer's esup
.
Enfin, le temps de chargement ne disparaît pas comme par magie. Vous ne faites que le pousser vers l'avant (dans la mesure où vous utilisez toutes les fonctionnalités de chaque session).
with-eval-after-load
est chargé une fois , donc un changement de keymap y va. Les hooks se chargent à chaque exécution du mode , par exemple lors du chargement d'un nouveau fichier associé au mode, ou cependant le hook est défini. Vous chargeriez par exempleflyspell-mode
ouhl-line-mode
dans un crochet. Dans moninit.el
j'utilisewith-eval-after-load
environ 160 fois etadd-hook
110 fois. Un init paresseux est un bon init (OMI).