Charges automatiques et variables

8

Je comprends ce que le chargement automatique fait pour les fonctions (enregistrer le fichier à charger lorsqu'une telle fonction est appelée ou que sa chaîne de documentation est récupérée). Cependant, il n'est pas clair comment utiliser la fonction de chargement automatique en conjonction avec des variables et des macros.

J'ai deux questions:

  1. Que se passe-t-il lorsque le package a un paramètre implémenté en tant que variable que l'utilisateur peut définir, mais qu'il n'est pas chargé automatiquement? Ces variables doivent-elles être chargées automatiquement? Sinon, il s'avère que de telles variables n'existent pas, l'environnement Lisp n'en sait rien, y compris leurs valeurs par défaut, jusqu'à ce qu'une fonction de chargement automatique du package soit utilisée (généralement après le chargement des fichiers de configuration), puis si l'utilisateur les définit dans son / son fichier de configuration, c'est comme définir une variable non existante. Si la valeur de la variable est une liste non vide et que l'utilisateur utilise pushou add-to-listpour modifier sa valeur, que se passe-t-il exactement? Les valeurs par défaut sont-elles perdues?

  2. Que se passe-t-il lorsqu'une macro est chargée automatiquement? Quand faut-il charger automatiquement une macro?

Mark Karpov
la source

Réponses:

5

Le chargement automatique s'applique uniquement à l'emplacement de valeur de fonction d'un symbole. En particulier, le chargement automatique d'une variable n'existe pas.

Il est probablement mauvais qu'un package contienne des variables pour la personnalisation de l'utilisateur dont la valeur par défaut est une liste non vide, précisément parce qu'il devient difficile de personnaliser la variable dans ce cas. Pire encore, si la valeur par défaut devait changer, la valeur personnalisée devrait probablement changer aussi, mais l'utilisateur n'en sera pas conscient. Si un package contient de telles variables, il peut être préférable de le modifier après le chargement du package, à l'aide de eval-after-load.

La plupart des variables de personnalisation auront une valeur par défaut de nil, auquel cas vous les définissez simplement en utilisant setqdans votre fichier init (ou utilisez l'interface de personnalisation). En supposant que le package utilise defvarou defcustompour définir la variable, comme il se doit, il ne remplacera pas votre paramètre.

Macros de chargement automatique: définissez le cinquième argument de autoloadpour y parvenir. Comme pour les fonctions, cela devrait être fait s'il est probable que vous souhaitiez utiliser la macro sans charger d'abord le package - soit explicitement, soit implicitement en appelant d'abord d'autres symboles chargés automatiquement à partir du package.

Addendum: Comme l'OP l'a souligné dans les commentaires, un ;;;###autoloadcommentaire magique copiera également un defvar(en fait, n'importe quelle forme elisp) dans le fichier de chargement automatique. Voir la Autoload section du manuel elisp pour plus de détails.

Harald Hanche-Olsen
la source
Ainsi, les variables qui peuvent être juste setqéditées (c'est-à-dire peu importe les valeurs qu'elles avaient avant) peuvent avoir une valeur par défaut spécifiée dans defvarou defcustomsous forme, mais en cas de liste qui peut être étendue par l'utilisateur, il est préférable d'utiliser eval-after-loadnon? De plus, parfois de bons défauts sont bons, même s'ils prennent la forme d'une liste ;-)
Mark Karpov
C'est vrai. Je dirais que si une personnalisation commune nécessite eval-after-load, c'est un bug dans l'implémentation du package. En règle générale, eval-after-loaddoit être utilisé pour des corrections de bogues ou des personnalisations très inhabituelles. Soit dit en passant, il peut être préférable d'utiliser un crochet si le paquet en met un à disposition.
Harald Hanche-Olsen
Le problème est que je voulais avoir une variable liée à une liste de trois éléments (par défaut). Les valeurs par défaut sont ce que la plupart des utilisateurs veulent, j'en suis sûr. Mais si je vais eval-after-loadbien, les utilisateurs ne pourront toujours pas supprimer les éléments de la liste! Cela me fait me demander si je devrais abandonner les valeurs par défaut.
Mark Karpov
1
Je ne suis pas d'accord que cela eval-after-loadne devrait être nécessaire que pour des situations inhabituelles. C'est l'un des outils standard de la boîte à outils à chargement différé. Si les gens ne veulent pas utiliser de tels outils, ils peuvent requireconsulter la bibliothèque à l'avance (c'est en effet ce que les nouveaux arrivants sont invariablement recommandés de faire - au moment où ils se mettent à penser "Je souhaite qu'Emacs démarre un peu plus vite", ils ' ai probablement appris suffisamment pour ne pas être effrayé par la nouvelle syntaxe :)
phils
1
@Drew: Votre point sur l'utilisation customize-set-variableplutôt que setqpeut être un bon. Mais je n'ai pas le temps maintenant pour l'étude approfondie requise pour améliorer ma réponse à cet égard. Si vous pensez que c'est important, pourquoi n'écrivez-vous pas votre propre réponse? Il sera plus visible que ce long fil de commentaires.
Harald Hanche-Olsen