Quand dois-je utiliser le chargement automatique au lieu d'exiger?

30

D'après ce que je comprends, requireest utilisé pour charger de gros morceaux de code (quelque chose comme des modules) bien qu'il puisse également charger des fonctions individuelles.

L'autochargement de l'autre côté, enregistre uniquement les fonctions et reporte le chargement au temps d'exécution.

J'ai récemment lu un article qui préconise l'utilisation autoloadexclusive de.

Est-ce mieux autoloadque de faire require? Quels sont les cas d'utilisation typiques pour chacun d'eux?

caisah
la source
3
@Gilles: FWIW, je ne suis pas d'accord avec le fait que vous ayez supprimé les balises autoloadet requirede cette question. Ajouter une balise librariesétait bien, mais maintenant, toute personne recherchant, utilisant des balises, des questions sur autoloadou requirene trouvera pas celle-ci. Ce sont deux fonctions importantes d'Emacs-Lisp que les gens rechercheront. Dommage. Et pensez à quel point elispet libraries(en particulier elisp) sera vraiment pratique pour un site Emacs: ils ne se distinguent pas beaucoup dans Emacsland, je le crains. (Mais non, je ne suis pas contre les avoir et les utiliser.)
Drew
@Drew Je vais par la méta-discussion applicable . Si vous pensez que ce principe général ne s'applique pas ici, veuillez le soulever sur meta.
Gilles 'SO- arrête d'être méchant'
1
@ Gilles: Terminé . Oui, j'ai lu cela et j'ai pensé que c'était peut-être ce qui vous avait motivé. Je ne suis pas en désaccord avec beaucoup de principes généraux. Cela ne signifie pas que les suivre de manière globale est toujours TRT.
Drew
2
Je suis d'accord avec Drew: puisque cette question concerne spécifiquement la distinction des cas d'utilisation autoloadet requireje pense que ces balises sont justifiées. En fait, étiqueter cette question [uniquement] avec librariesest une généralisation excessive. Pour ma part, pour requiredéclencher le chargement de "my-foobar-cfg", qui, comme son nom l'indique, ne contient que ma configuration, pas une bibliothèque.
paprika

Réponses:

28

autoloadn'est pas un substitut pour require. requireEst généralement utilisé pour s'assurer qu'un certain fichier est chargé. autoloadd'autre part, donne à Emacs une indication dans quel fichier trouver une fonction donnée sans charger le fichier immédiatement. Ce n'est que lorsque la fonction de chargement automatique est appelée que le fichier correspondant est chargé.

Fondamentalement, autoloadvous pouvez retarder le chargement d'un fichier entier au moment où vous en avez réellement besoin. C'est pourquoi (particulièrement les gros) packages définissent généralement leurs fonctions d'entrée comme autoloads.

Si vous souhaitez effectuer de lourdes personnalisations pour un package, vous n'avez généralement pas de chance autoload. Si vous souhaitez toujours éviter, requirevous pouvez différer vos personnalisations jusqu'à ce que le fichier ait été chargé à l'aide de eval-after-load.

Le manuel Emacs couvre ce sujet dans les sections suivantes:

paprika
la source
2
Il convient peut-être de mentionner également: il autoloads'agit (plus ou moins) de fournir des définitions de commandes, afin que vous puissiez utiliser ces commandes. requireconsiste à rendre tout disponible dans une bibliothèque (et dans les bibliothèques dont la bibliothèque a besoin, récursivement) disponibles. Emacs ne se limite pas aux commandes. (Mais oui, bien sûr, une fois qu'une commande chargée automatiquement est invoquée, toute sa bibliothèque est chargée.)
Drew
4

En termes d'initialisation Emacs, ne faites aucun choix. L'utilisateur de GitHub jwiegley possède l'excellente macro de déclaration use-package , qui nécessitera ou chargera automatiquement un paquet selon les besoins. Il est préférable de différer le chargement des packages pouvant être chargés à la demande.

Andy
la source
3

Si vous voulez qu'une certaine fonctionnalité soit chargée et disponible directement lorsque votre Emacs a démarré, utilisez require, sinon utilisez le chargement automatique. Personnellement, j'apprécie beaucoup le temps de démarrage (je redémarre Emacs plusieurs fois par semaine, parfois plusieurs fois par jour), donc j'accepte que cela prenne un peu de temps lorsque Emacs charge automatiquement une certaine fonction lorsque j'en ai besoin. Pensez donc à ce que vous voulez être disponible directement après le démarrage d'Emacs et à ce qui peut être chargé en cas de besoin.

Mathias Dahl
la source