Retourner aux forums || Retourner au forum Astuces.divers
Astuces.divers : [Terminal] Utiliser emacs dans un script
Posté par gnap gnap (page perso, ) le 19 mars 2004
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 ----
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 ----
> Lire le message (2 commentaires, moyenne: 1,5).
Voui pourquoi pas ..
Posté par
Laurent DELAGE (page perso, ) le 05/05/2004 à 22:55. (lien). Évalué à 1.
... Mais je n'ai pas compris ce que faisait ton script ;-)
Oui, mais maintenant ...
Posté par
Matthieu Moy (page perso, ) le 15/11/2005 à 21:02. (lien). Évalué à 2.
Avec Emacs 22 (sorti tout droit du CVS), on peut aussi faire
#!/usr/bin/emacs --script
(print (format "Ma version est %s" (emacs-version)))
Revenir en haut de page || Retourner aux forums || Retourner au forum Astuces.divers



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.