OVH Cloud OVH Cloud

Explication de `eval-after-load'

14 réponses
Avatar
Xavier Maillard
Bonsoir et bonne année à tous,

J'aurais voulu comprendre le fonctionnement de la macro
`eval-after-load' et la comparer à d'autres « structures » de
chargement.

Quel est l'impact de faire quelque chose comme:

(eval-after-load "foo"
'(message "bar"))

par exemple ? Quand est-ce que Emacs se dit qu'il doit charger
foo ?

Merci
--
Xavier Maillard, zedek@gnu-rox.org

10 réponses

1 2
Avatar
drkm
Xavier Maillard writes:

Quel est l'impact de faire quelque chose comme:

(eval-after-load "foo"
'(message "bar"))

par exemple ? Quand est-ce que Emacs se dit qu'il doit charger
foo ?



Jamais. C'est toi qui lui dis. Mais tu viens de lui dire que
lorsqu'il chargera le package "foo", il devra évaluer :

(message "bar")

Si "foo" est déjà chargé, il évalue directement la forme. Note que
le premier argument (ici "foo") peut maintenant être un symbole,
désignant une « feature ». Ce que je trouve plus cohérent, mais n'est
apparu qu'assez tard, je pense.

Je m'en sers par exemple dans mon module de configuration. J'ai des
fichiers subdirs.el, automatiquement chargés au démarrage. Je peux y
demander d'ajouter des répertoires au path dans lequel recherche le
lecteur de fichier Info. Il y a donc à un moment une forme du style :

(push "un répertoire" Info-directory-list)

Mais cette variable doit donc être définie. Et si je fais quelque
chose comme :

(unless (boundp 'Info-directory-list)
(setq Info-directory-list '()))
(push "un répertoire" Info-directory-list)

je perd la valeur par défaut de cette variable (pourtant bien utile).
Et je n'ai évidemment pas envie d'un (require 'info) dans mon .emacs.
Finalement, j'ai donc plutôt quelque chose comme :

(eval-after-load "info"
`(push ,dir Info-directory-list))

Tu peux fouiller dans :

<URL:http://cvs.sourceforge.net/viewcvs.py/drkm-lib/drkm-lib/drkm/drkm-config.el?rev=1.6&view=auto>

peut-être y trouveras-tu des exemples intéresants. Il devrait y avoir
au moins ce que je viens de t'expliquer (mais en contexte). Mais il
me semble que j'ai justement modifié cela il y a peu, sans l'avoir
encore commité sur le CVS.

--drkm
Avatar
Xavier Maillard
On 5 jan 2005, drkm wrote:

Xavier Maillard writes:

> Quel est l'impact de faire quelque chose comme:

> (eval-after-load "foo"
> '(message "bar"))

> par exemple ? Quand est-ce que Emacs se dit qu'il doit
> charger foo ?

Jamais. C'est toi qui lui dis. Mais tu viens de lui dire que



C'est vrai ;) Je faisais déjà la confusion il y a un certains
temps et voilà que cela se reproduit ;)

En même temps la suite de ton message est assez révélatrice des
cas d'utilisation de cette macro;)

J'irais fouillé dans ton CVS pour voir si il ne contiendrait pas
quelques petites merveilles :)

A+
--
No e-patents, pas de brevets logiciels
Pétition contre les brevets logiciels : http://petition.eurolinux.org
Avatar
drkm
drkm writes:

Mais il
me semble que j'ai justement modifié cela il y a peu, sans l'avoir
encore commité sur le CVS.



Voilà, c'est fait, si ça t'intéresse. Mais il faut plusieurs heures
avant que les modifs ne soient visibles sur l'interface web du CVS.
J'imagine que ViewCVS utilise un cache, regénéré un ou deux fois par
jours. Par le serveur CVS, j'imagine que les modifs sont de suite
disponibles.

Dernier détail, la doc sur la homepage n'est pas à jour, alors que
je viens justement de commiter des infos sur les fichiers Subdirs dans
le fichier Texinfo <FILE:[drkm-lib]/drkm-lib/drkm/doc/drkm-lib.texi>.

--drkm
Avatar
drkm
Xavier Maillard writes:

J'irais fouillé dans ton CVS pour voir si il ne contiendrait pas
quelques petites merveilles :)



Pas encore ;-). Et tu sais ce que c'est : « work in progress »,
« en constante évolution », « pas de doc », etc. C'est plutôt une
facilité pour maintenir mon code perso que réellement pour le
diffuser.

Mais toute visite est bien sûr appréciée.

--drkm
Avatar
drkm
Xavier Maillard writes:

J'irais fouillé dans ton CVS pour voir si il ne contiendrait pas
quelques petites merveilles :)



Et au fait, j'ai visité ta homepage il y a peu. Et je n'y ai
toujours vu ni .emacs, ni .gnus :-(. C'est en projet ?

--drkm
Avatar
Matthieu Moy
Xavier Maillard writes:

Bonsoir et bonne année à tous,

J'aurais voulu comprendre le fonctionnement de la macro
`eval-after-load' et la comparer à d'autres « structures » de
chargement.



Je m'en sert pour la config de certains modes :

Pour un mode X, j'ai un fichier moy-X.el quelque part, qui contient

;;;###autoload
(eval-after-load
"X-mode"
'(progn
(require 'moy-X)
))

Avec un coup de génération d'autoloads dans un Makefile[1], ça me
permet d'avoir un Emacs qui ne charge que ce dont il a besoin de
manière assez simple.

[1] http://www-verimag.imag.fr/~moy/emacs/Makefile

--
Matthieu
Avatar
Xavier Maillard
On 5 jan 2005, drkm wrote:

Xavier Maillard writes:

> J'irais fouillé dans ton CVS pour voir si il ne contiendrait
> pas quelques petites merveilles :)

Pas encore ;-). Et tu sais ce que c'est : « work in progress »,
« en constante évolution », « pas de doc », etc. C'est plutôt
une facilité pour maintenir mon code perso que réellement pour
le diffuser.



Lol, c'est l'esprit « hacker » ça. Moi c'est pareil sauf que 1)
je n'utilise plus du tout CVS et 2) mon archive est locale (pour
le moment).

Mais toute visite est bien sûr appréciée.



Merci Monsieur... :/

--
Hito no kokoro wa kawareru mono
Avatar
Xavier Maillard
On 5 jan 2005, drkm wrote:

Xavier Maillard writes:

> J'irais fouillé dans ton CVS pour voir si il ne contiendrait
> pas quelques petites merveilles :)

Et au fait, j'ai visité ta homepage il y a peu. Et je n'y ai
toujours vu ni .emacs, ni .gnus :-(. C'est en projet ?



Cf. Post un peu plus tôt concernant mon foutoir :)
--
Xavier Maillard

main(){printf(&unix["21%six12"],(unix)["have"]+"fun"-0x60);}
Avatar
Xavier Maillard
On 5 jan 2005, Matthieu Moy wrote:

Xavier Maillard writes:

> Bonsoir et bonne année à tous,
>
> J'aurais voulu comprendre le fonctionnement de la macro
> `eval-after-load' et la comparer à d'autres « structures » de
> chargement.

Je m'en sert pour la config de certains modes :




[ ... ]

Avec un coup de génération d'autoloads dans un Makefile[1], ça
me permet d'avoir un Emacs qui ne charge que ce dont il a
besoin de manière assez simple.



Pas mal comme technique :)

Je vais reprendre l'idée du Makefile, ça me plait bien :)
--
.o. Xavier Maillard Tel: +33 6 68 04 64 37
..o
ooo
Avatar
Matthieu Moy
Xavier Maillard writes:

Je vais reprendre l'idée du Makefile, ça me plait bien :)



Ensuite, j'ai un

(if (file-exists-p (expand-file-name "~/emacs-lisp/moy/Makefile"))
(shell-command "cd ~/emacs-lisp/moy/ ; make"))

dans mon .emacs.el, pour être sur de ne rien oublier.

--
Matthieu
1 2