Ne vous est-il jamais arrivé d'écrire un script pour une raison x ou y et de vouloir y utiliser une fonction d'emacs ?
Plusieurs méthodes existent, celle présentée ici consiste à écrire un petit fichier lisp comprenant les commandes qui nous interessent et ensuite de faire compiler ledit fichier lisp par emacs. Dans cet exemple, il s'agit d'ouvrir un fichier texinfo, de mettre à jour toutes les nodes et tous les menus et de sauvegarder les changements.
Supposons que le script est en perl (pour les besoins de la démonstration ; cela pourrait être du shell ou n'importe quoi d'autre), que le fichier texinfo s'appelle monfichier.texi :
---- DEBUT ----
open(TMP, "> tmpfile");
print TMP "(find-file \"monfichier.texi\")\n";
print TMP "(texinfo-every-node-update)\n";
print TMP "(texinfo-all-menus-update)\n";
print TMP "(save-buffer)\n";
close(TMP);
system("/usr/bin/emacs",
"-q",
"-batch",
"-l",
"tmpfile",
"batch-byte-compile");
---- FIN ----
Bien entendu, vu la foultitude de commandes que proposent emacs, il y a de quoi laisser votre imagination cavaler.
Voici un second exemple, un script complet qui compile tous les fichiers lisp présents dans un dossier donné, ici le dossier d'init d'emacs. Ce script ne s'emcombre pas de savoir si le fichier est à jour ou pas (un (file-newer-than-file-p "fichier.el" "fichier.elc") pourrait aider en la matière), il écrase et regénère sans discrimination.
---- DEBUT ----
#!/usr/bin/perl
use strict;
my $tmp = "/tmp/emacsstart.el";
my @dirs = ("/etc/emacs/site-start.d", "/etc/emacs21/site-start.d");
my @el;
my @elc = ($tmp);
foreach my $dir (@dirs) {
if (-e $dir) {
opendir(REP, $dir);
while (defined(my $file = readdir(REP))) {
push(@el, $dir."/".$file) if $file =~ m/(.*)\.el$/;
push(@elc, $dir."/".$file) if $file =~ m/(.*)\.elc$/;
}
closedir(REP);
}
}
unlink(@elc);
foreach my $file (@el) {
open(TMP, ">> $tmp");
print TMP "(byte-compile-file \"$file\")\n";
close(TMP);
}
`emacs -q -batch -l $tmp -f batch-byte-compile 2> /dev/null`;
unlink($tmp);
--- FIN ----
# Voui pourquoi pas ..
Posté par Laurent DELAGE . Évalué à 1.
# Oui, mais maintenant ...
Posté par Matthieu Moy (site web personnel) . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.