Forum Astuces.divers [Terminal] Utiliser emacs dans un script

Posté par  .
Étiquettes : aucune
0
20
mar.
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 ----

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.