Que signifie (nécessite «package») pour emacs et en quoi diffère-t-il du fichier de chargement?

10

Je viens de commencer à utiliser emacs il y a quelques jours et j'ai lu quelque part qui (require 'package-name)n'est pas nécessaire lorsque ledit package est installé à l'aide de package-install. Mais pourquoi, qu'est-ce qui fait (require 'package-name)réellement et en quoi diffère-t-il load-fileou loadprocédures?

Chakravarthy Raghunandan
la source
7
L'une des premières choses que nous avons tous dû apprendre dans Emacs est M-x describe-functionde lire la doc-string. aka C-h fTapez M-x describe-function RET require RETet lisez la doc-string. Tapez ensuite M-x describe-function RET load-file RETet lisez la doc-string. Tapez ensuite M-x describe-function RET load RETet lisez la doc-string. Après avoir lu les trois chaînes de doc, veuillez modifier votre question pour comparer et contraster les trois fonctions et clarifier ce que vous ne comprenez toujours pas par rapport à celles-ci. Nous utilisons la même procédure pour les variables - à savoir, M-x describe-variable.
lawlist

Réponses:

13

Si vous loadune bibliothèque à plusieurs reprises, ce fichier sera lu et son code évalué à plusieurs reprises (à chaque fois que vous le chargez).

Si vous requireune bibliothèque à plusieurs reprises, il sera loadla bibliothèque une fois (au plus - et pas du tout si la bibliothèque avait déjà été chargée).

requirefournit cette efficacité même si elle requiren'était pas utilisée pour charger la bibliothèque au départ, car (la grande majorité des) bibliothèques contiennent le code (provide 'FEATURE)de leur FEATUREnom particulier . Ce code est évalué lors du chargement de la bibliothèque, quelle que soit la façon dont il a été chargé, et à ce moment-là, il met à jour les données qui requirevérifient lorsqu'il décide s'il doit faire quelque chose.

Généralement, vous souhaitez utiliser requiredans votre propre code, si vous devez vous assurer qu'une bibliothèque donnée a été chargée.

La raison pour laquelle vous n'avez souvent pas besoin de le faire avec les packages ELPA est que le gestionnaire de packages traite automatiquement tous les cookies de chargement automatique dans le package et génère un fichier de chargement automatique pour ce package. Lorsque le système de packages est initialisé lorsque vous démarrez Emacs, le fichier de chargement automatique de chaque package est évalué, qui identifie toutes les fonctions chargées automatiquement. Lorsqu'une fonction chargée automatiquement est appelée, la bibliothèque qui contient la définition réelle de la fonction est automatiquement chargée.

Les auteurs de packages peuvent ajouter un cookie de chargement automatique à chaque fonction que l'utilisateur pourrait appeler directement et donc, à condition que leurs attentes soient correctes, vous n'aurez pas besoin d'appeler requireou de charger explicitement le package pour l'utiliser.

Notez que vous pouvez également définir vos propres chargements automatiques personnalisés. Voir C-hig (elisp) Autoload RETet aussi (elisp) Hooks for Loadingsi vous souhaitez utiliser le chargement différé personnalisé et la configuration différée des bibliothèques dans votre propre configuration. (Ce dernier pour dire "n'évalue pas ce code jusqu'à ce que cette bibliothèque ait été chargée", ce qui correspond bien au mécanisme de chargement automatique "ne charge pas cette bibliothèque tant qu'il n'est pas nécessaire").

phils
la source
2
Puisque vous faites déjà référence au manuel Elisp, je pense qu'un autre nœud pertinent est (elisp) Named Features.
Basil