Je veux ajouter une liaison de clé spécifique au mode latex:
(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)
En même temps, je veux le définir uniquement lorsque le mode spécifique est chargé. Je voudrais donc savoir s'il existe une préférence (meilleure pratique) entre l'utilisation du hook approprié ( latex-mode-hook
) pour accomplir cela ou l'utilisation de la clause (with-eval-after-load "tex-mode" ...
pour encapsuler la définition de liaison de clé. J'ai testé les deux et ils fonctionnent bien, mais je me demande lequel est la bonne façon de le faire.
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).Réponses:
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)
dansemacs -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 fairelocal-set-key
dans les crochets.Enfin, notez que
with-eval-after-load
GNU Emacs 24.4 est un wrapper de 2 ligneseval-after-load
où ilbody
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
ouhl-line-mode
. Par exemple(add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Comme le souligne Rémi , iladd-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: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éfiniorg-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")
. Depuisorg-inlinetasks.el
directement(require 'org)
, tous les éléments agréablesautoload
que vos sympathiques responsables Emacs ont pris grand soin à fournir seront "ignorés" et tousorg.el(c)
seront chargés.Mais que faire si votre (personnel)
defun
est requis à plusieurs endroits? Si vous êtes vraiment difficile, vous pouvez mettre lesdefun
s dans un autre fichier de votreload-path
et ajouter desautoload
cookies, ou vous pouvez dire à Emacs où trouver la fonction avec laautoload
fonction. Alors quelque chose comme ça fonctionnerait: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
(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).
la source
with-eval-after-load
sans perdre les avantages d'initialisation paresseux?En plus de vos suggestions
eval-after-load
et de l'utilisation d'un crochet, laissez-moi vous suggéreruse-package.el
. Vous pouvez faire ce dont vous avez besoin avecLaTeX ne sera chargé qu'après votre demande.
Juste comme remarque: une utilisation prudente de
use-package
a réduit mes temps de démarrage à moins d'une seconde. (Cela prenait environ quatre secondes.)la source
use-package
avec Emacs 25.