GAZETTE N°29: EMACSulation

EMACSulation

Par Éric Marsden.

Adaptation française : Éric Jacoboni.


Précédent Suivant Table des Matières

2. EMACSulation

Cette rubrique explique comment mieux utiliser Emacs, ce merveilleux éditeur de texte. Dans chaque numéro, je présenterai une extension d'Emacs qui d'augmentera votre productivité, l'ensoleillement et la belle couleur verte de l'herbe.

2.1 Emacs : un serveur

De nombreux utilisateurs abordent Emacs via Elm qui le lance par défaut pour éditer les messages électroniques. Il est plutôt dommage de lancer Emacs de cette façon à cause des ressources mémoire utilisées et du temps de chargement, mais aussi parce cette instance d'Emacs ne partage ni tampons ni kill ring (tampon utilisé pour les opérations de couper/coller) avec ses autres instances. Plutôt que de lancer un nouvel Emacs pour chaque message, vous pouvez configurer la variable d'environnement EDITOR à emacsclient.

Le mécanisme serveur d'Emacs (attention : cela ne fonctionne pas avec XEmacs...) permet à un processus Emacs d'honorer les requêtes d'édition d'autres applications. Pour l'activer, il faut ajouter la ligne (server-start) dans votre ~/.emacs. Lorsque vous invoquerez >emacsclient nom_fichier, le programme recherchera un processus Emacs (et en lancera un si nécessaire) et lui enverra un message lui demandant d'éditer nom_fichier. Le processus appelant (le shell, par exemple) est bloqué pendant l'édition du fichier. Lorsque vous avez fini, tapez C-x # et le client sera débloqué.

2.2 Gnuserv

Gnuserv est un mécanisme d'invocation distante plus sophistiqué, écrit par Andy Norman (qui est aussi l'auteur d'ange-ftp, que j'ai décrit dans le numéro 26 de la Linux Gazette). Il permet d'envoyer des commandes Elisp quelconques à un processus Emacs s'exécutant sur la machine locale ou sur une autre machine du réseau.

  1. Si vous utilisez XEmacs, tout est déjà configuré : il suffit d'ajouter les lignes suivantes dans votre ~/.emacs :
    (require 'gnuserv)
    (gnuserv-start)
    
  2. Récupérez le RPM gnuserv-2.1alpha des contribs Red Hat, ou le .deb http://cgi.debian.org/www-master/debian.org/Packages/unstable/editors/gnuserv.html pour la Debian Hamm et passez au point 6 ;
  3. Téléchargez les sources 
  4. Éditez les fichiers config.h (je vous conseille d'utiliser #define DONT_USE_LITOUT) et gnuserv.h, où vous choisirez la méthode de communication (celle par défaut est les sockets du domaine Internet), nécessaire pour réaliser les opérations distantes 
  5. Placez le fichier gnuserv.el quelque part dans le chemin de recherche (load-path) d'Emacs. Supposons que vous ayez un répertoire ~/elisp/ où vous placez vos extensions Elisp favorites : une autre possibilité est de copier gnuserv.el dans un répertoire elisp de votre site, tel que /usr/lib/emacs/site-lisp (tapez C-h v load-path sous Emacs pour voir une liste des possibilités) 
  6. Ajoutez ces lignes dans votre ~/.emacs :
        (setq load-path (cons (expand-file-name "~/elisp") load-path))
        (autoload 'gnuserv-start "gnuserv" "Better Emacs server support")
        (setq gnuserv-frame (current-frame))
        (gnuserv-start)
    
    La deuxième ligne indique à Emacs que la fonction gnuserv-start est définie dans un fichier nommé gnuserv.el, qu'Emacs chargera à la demande. La troisième ligne désactive le comportement par défaut consistant à ouvrir un nouveau cadre pour chaque nouveau fichier édité (vous pouvez le laisser, si c'est ce que vous préférez). La dernière ligne lance le serveur.

Pour vous assurer que tout fonctionne, tapez :

    ~$ gnuclient <nomfichier>

Cela demande à Emacs d'ouvrir <nomfichier>, comme avec emacsclient. Si cela ne fonctionne pas (et qu'un message comme « Refused connection » ou « Broken pipe«nbsp;» apparaît), passez à la section Sécurité. Vous pouvez aussi envoyer un peu d'Elisp :

    
    ~$ gnudoit '(message "Salut, je suis %s !" (user-full-name))'

2.3 Applications

Vous pouvez maintenant faire toutes sortes de choses bizarres. Par exemple avoir deux Emacs sur des machines en réseau pour jouer au ping pong en vous envoyant des messages. Vous pouvez utiliser Emacs comme serveur de script CGI et profiter de sa puissante bibliothèque pour ne pas avoir à lancer un interpréteur pour chaque script (un petit peu comme dans le cas du mécanisme FastCGI). Par exemple, bricolons ensemble une interface externe pour le psychologue intégré à Emacs :

     (defun eliza-start ()
       "appel du docteur"
       (interactive)
       (doctor)
       ;; On doit simplement taper <Entrée> une fois sous cette interface.
       (re-search-backward " twice" nil t)
       (replace-match "")
       (goto-char (point-max))
       (buffer-substring (point-min) (point-max)))

     (defun eliza-continue (str)
       "Envoie une chaine au docteur et renvoie sa réponse."
       (interactive)
       (switch-to-buffer "*doctor*")
       (insert "\n" str "\n")
       (doctor-read-print)
       (save-excursion
         (re-search-backward "\n\n\\(\\(.+\n?\\)+\\)\n\n")
         (match-string 1)))

     (defun eliza-cleanup ()
       "Paye la facture et quitte."
       (interactive)
       (let ((buf (get-buffer "*doctor*")))
          (if buf (kill-buffer buf))))

Ceci peut être utilisé en ligne de commande (pour utiliser CGI, vous devez vous poser la question peu évidente des accès concurrents) avec un script tel que celui-ci :

     #! /bin/sh
     
     gnudoit '(eliza-start)'
     while read line
     do
         gnudoit "(eliza-continue \"$line\")"
     done
     gnudoit '(eliza-cleanup)'

Vous pouvez même trouver des utilisations constructives à gnuserv, comme lancer Gnus (un client news/courrier pour Emacs) et des transferts ange-ftp à partir d'un « Emacs réseau » afin que votre Emacs principal ne soit pas affecté par les délais de communication du réseau. Vous pouvez aussi communiquer avec Emacs à l'aide d'une crontab, et lui demander de rechercher des pages Web à l'aide d'Emacs/w3, ou d'envoyer un courrier électronique à quelqu'un. Vous pouvez également utiliser l' API courrier/news de Netscape pour qu'elle invoque Emacs au lieu de ses clients de courrier et de news intégrés. Cela peut aussi permettre d'envoyer des commandes à Emacs à partir d'un menu d'un gestionnaire de fenêtres.

2.4 Considérations sur la sécurité

De plus en plus de distributions Linux utilisent par défaut une bonne sécurité X. Vous noterez, par exemple que, lorsque vous faites un su root sur un système moderne, vous ne pouvez pas lancer de clients X car le serveur X est protégé par un cookie xauth.

Bien qu'autoriser l'accès à votre serveur X soit déconseillé (car quelqu'un pourrait, par exemple, capturer tout ce que vous tapez au clavier), donner un accès distant à votre processus Emacs est encore pire, car Emacs peut exécuter des commandes quelconques sous votre identité, détruire des fichiers, envoyer un courrier d'insultes au Président de la République, etc.

Depuis la version 2.1, gnuserv sait utiliser l'authentification MIT-MAGIC-COOKIE-1 pour les requêtes distantes. Ce protocole utilise le contenu de votre fichier ~/.Xauthority, décrit dans la page man de xauth(1). Gnuserv nécessite qu'un cookie affiche le nombre 999, ce qui peut être fait de la façon suivante (blade est le nom de la machine) :

    
      ~$ xauth add blade:999 . `cat /etc/passwd | md5sum` 
      ~$ xauth list
      blade/unix:0  MIT-MAGIC-COOKIE-1  bc1d627babdbabe9d1f288d2b57c348f
      blade:999  MIT-MAGIC-COOKIE-1  d89570b20925d401c05a79be67159cae

(`cat /etc/passwd | md5sum` est simplement un moyen pratique pour produire un cookie  sur la plupart des systèmes Linux, vous pourrez utiliser la commande mcookie, ou en faire un à la main). Vous devriez maintenant pouvoir utiliser gnuclient/gnudoit sur la machine locale. L'étape suivante consiste à transférer le cookie sur chaque machine distante de laquelle vous comptez accéder à Emacs. Ceci est réalisé par la commande suivante :

     ~$ xauth extract - blade:999 | rsh remotehost.edu xauth merge -

Si vous n'utilisez pas X, vous devrez utiliser un système de controle d'accès sur l'hôte (host-based) : la variable d'environnement GNU_SECURE est sensée pointer vers un fichier contenant une liste des machines qui sont autorisées à ouvrir des connexions sur votre processus Emacs. Enfin, si votre machine n'est pas en réseau, vous êtes déjà probablement passé à la section suivante.

2.5 Comment ça marche ?

Votre commande suit une route plutôt biscornue pour atteindre Emacs. Une transaction implique quatre parties :

  • le « client », ou programme demandant un service à Emacs (Elm, par exemple) ;
  • le programme gnuclient qui tourne sur la machine qui fait la requête ;
  • le processus gnuserv qui tourne sur la machine sur laquelle Emacs s'exécute ;
  • et, bien sûr, le processus Emacs lui-même.

Ces parties communiquent de la façon suivante :


"Schéma de Communication"

Le talon d'Achille du système est que, si le programme gnuserv meurt pour une raison ou une autre, tout sera bloqué. Une autre méthode de communication qui invoquerait moins de parties en interaction consiste à s'inspirer du protocole d'invocation distante de Netscape. Les possibilités de gnuclient seront directement ajoutées à Emacs et une requête gnudoit ressemblera à ça :

    emacs -remote -lisp '(message "Salut")'

Le nouveau processus Emacs recherchera un processus Emacs existant auquel il pourra envoyer la requête ou qu'il pourrait servir directement. L'inconvénient est que chaque requête sera plus lente car Emacs a besoin d'être forké à chaque fois. L'image est le plus souvent dans le cache disque et cela ne devrait pas être d'une lenteur trop catastrophique (cela fonctionne parfaitement avec Mozilla qui est bien plus gros qu'Emacs).

2.6 La prochaine fois...

J'ai recu pas mal de courrier me demandant comment personnaliser les différents aspects d'Emacs, j'essaierai donc de gratter la surface de ce vaste sujet le mois prochain et d'aborder le paquetage Customize. N'hésitez pas à me contacter à <emarsden@mail.dotcom.fr> et à m'envoyer vos commentaires, corrections ou suggestions (quel est votre paquetage « je-ne-pourrais-vivre-sans » favori pour Emacs ?). C-u 1000 M-x hail-emacs !

PS : Emacs n'est, en aucune manière, limité à Linux, puisqu'il existe des implantations pour un grand nombre d'autres systèmes d'exploitation. Cependant, en tant qu'un des logiciels phares du mouvement pour le logiciel libre, l'un des plus puissants, complexes et paramétrables, je pense qu'il a sa place dans la Linux Gazette.


Précédent Suivant Table des Matières

Copyright (c) 1998, Eric Marsden - paru dans le numéro 29 de la Linux-Gazette

Adaptation française : Éric Jacoboni.