Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

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 ----

> Lire le message (2 commentaires, moyenne: 1,5).  

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.

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