Emacs : une motivation

Le choix d'un éditeur est une histoire quasi-religieuse. Sous Unix le choix revient à vi contre Emacs. Les deux sont très différents: vi est petit, et sa puissance dépend d'appels aux differents utilitaires Unix. C'est l'éditeur ``standard'' sous Unix, qu'on trouve sous une forme ou une autre sur n'importe quelle machine, ce qui est peut-être la meilleure raison d'en connaître les bases.

Emacs, par contre, est beaucoup plus qu'un simple éditeur. Il est complètement configurable et extensible, grâce à son interpréteur Lisp intégré. Emacs fournit des ``modes'' spécialement taillés pour différents types de texte, du code source C au Scheme en passant par le HTML, Lout et TeX, avec coloration syntaxique et indentation automatique. Il gère les undo multiples, rend transparent l'accès aux fichiers sur des machines distantes. Il facilite l'accès aux utilitaires du système (grep, find, ispell, RCS), vous permet de lire votre courrier électronique, les news du Usenet et même le Web, de tenir à jour un agenda et une base de données sur vos correspondants, il lance des compilateurs et interprète leurs messages d'erreur, il a une interface sophistiquée avec différents débogueurs, il peut servir d'éditeur hexadécimal. On peut même faire du IRC à partir de Emacs!

Toute cette puissance ne vient pas sans un certain prix à payer : Emacs est un système complexe qui demande un certain investissement initial, et il est relativement gourmand en ressources machine. Cependant, n'importe quel ordinateur d'aujourd'hui peut faire tourner Emacs sans problème, et pour un informaticien la maîtrise d'un éditeur puissant récompensera rapidement le temps investi en son apprentissage.

Histoire

Emacs est le logiciel phare du projet GNU, ayant été développé par Richard Stallman lorsqu'il travaillait encore au MIT. C'est le succès de ce logiciel, qu'il distribuait pour le prix d'une bande magnétique à tous ceux qui en faisait la demande, qui a convaincu Stallman que le logiciel libre pouvait fonctionner, à l'époche où un fabriquant de périphériques refusa de fournir le code source d'un pilote, chose inconcevable pour Stallman.

Une grande partie du système est écrit en Lisp, avec un noyau en langage C. Ceci explique qu'il soit plus lourd que d'autres éditeurs (puisqu'il faut compter une pile pour l'interpréteur Lisp). Il a été conçu dès la base pour êxtre extensible, adaptable aux besoins de chaque utilisateur. Cette extensibilité a permis à des centaines de hackers de contribuer leurs propres extensions au système, augmentant sa puissance sans pour autant alourdir l'executable. C'est un modèle de développement logiciel qui a été suivi pour la conception de AutoCAD, logiciel de CAO, et du Gimp, et qui sera repris dans le desktop Gnome.

Il existe deux versions de Emacs, XEmacs et GNU Emacs. J'utilise personnellement la seconde; XEmacs (qui est également libre, mais développé par une équipe qui ne s'entend pas avec l'équipe GNU) est mieux configuré au départ pour un débutant, mais est nettement plus gourmand que la version GNU. Les deux versions diffèrent surtout au niveau de l'interface (XEmacs offrant un toolbar et des bulles d'aide, GNU Emacs étant plus sobre), de la définition de certaines touches et du nom de certaines fonctions.

La différence entres les deux équipes de développement peut être rapprochée à celle qui existe entre les developpeurs de FreeBSD --qui constituent un noyau plutôt fermé dont l'esprit est de maintenir la qualité en faisant participer que des gens auxquels on fait confiance-- et du modèle de développement de Linux, ouvert à toute contribution. La différence se fait sentir dans les produits respectifs, FreeBSD étant réputé plus stable, mais Linux le devançant sur de nombreux plans, notamment en ce qui concerne la gestion de matériel. Eric Raymond a écrit un article intéressant à ce sujet nommé The Cathedral and the Bazaar.

Utiliser Emacs

Emacs réagit à n'importe quel évènement (touche clavier, clic souris, méssage réseau) en appelant une commande appropriée. Pour la plupart des touches du clavier c'est la commande self-insert-command, qui insère le caractère concerné dans le buffer courant et l'àffiche à l'écran. On dit que Emacs est un éditeur à action directe, qui ne souffre pas :wq! des modes insertion/commande de certains autres éditeurs. Certaines touches (ou combinaisons de touches, avec un préfixe tel que Contrôle ou Alt) font appel à d'autres fonctions.

Ainsi C-e (c'est à dire Contrôle et e simultanément) avance le curseur en fin de ligne, M-e (Meta, ou Alt sur les claviers PC) avance le curseur en fin de phrase, et C-M-e avance d'un paragraphe. La définition de ce qu'est une phrase ou un paragraphe n'est pas la même suivant qu'on édite du code C ou du HTML.

On peut également appeler ces commandes directement, grâce au prompt M-x qui vous permet de renter en mode conversationnel. Vous êtes placés dans le minibuffer, ou vous pouvez rentrer n'importe quelle commande (la touche TAB fait la complétion sur les noms des commandes). Comme C-e appèlle end-of-line, vous pouvez avancer en fin de ligne en tapant M-x end-of-line.

Les fonctions les plus courantes de Emacs sont accessibles depuis des touches au clavier, mais ce ne sont en fait que des raccourcis vers des commandes. C-f appel la commande forward-char, que l'on peut également invoquer en tapant M-x forward-char. Les caractères qu'on tape sont affichées dans le minibuffer, et on peut utiliser la touche TAB pour compléter les noms. Pour savoir quelle commande est affectée à une touche, il suffit de taper C-h k <touche>, pour aller dans le sens contraire on peut taper C-h w nom-de-commande.

Emacs est auto-documenté: a n'importe quel moment l'utilisateur peut taper Crtl-h (ou utiliser le menu Help) pour obtenir de l'aide contextuelle. Il existe un tutorial en ligne pour les débutants, et une documentation très fournie au format info (auquel en accède en tapant C-h i). Chaque commande et variable de configuration de l'éditeur est documentée; il existe même une commande apropos qui permet de rechercher les occurances d'une expression régulière dans la documentation.

Le mode C

Lorsqu'on édite du code C, Emacs met à notre disposition des commandes spécifiques pour faciliter le travail. Il peut faire une coloration syntaxique du code source, facilitant sa compréhension. Il peut indenter le code automatiquement, en venant au bon niveau lors d'un retour chariot, ou lorsqu'on utilise la touche TAB. Il peut sauter jusqu'à la définition d'une fonction grâce à l'utilisation des tags (exécuter M-x etags qui construit le fichier TAGS puis M-. avec le curseur positionné sur un nom de fonction ou de variable). Il peut exécuter un make, récupérer les messages d'erreur du compilateur et vous placer sur la ligne erronée (M-x compile, C-x `). Il peut construire un menu contentant toutes les fonctions dans le fichier C, qui vous permet d'atteindre rapidement une définition (M-x imenu-add-to-menubar). Il peut vous faciliter la frappe d'éléments structurels du C, en créent automatiquement la squelette d'un switch dès que vous tapez switch( (fonctions ``electric'').

Si votre code n'est pas parfait du premier coup il existe un mode spécial d'interaction avec un déboggeur (gdb, dbx, perldb, etc), qui permet de suivre l'exécution pas-à-pas du code en synchronisation avec le code source. Si vous utilisez des outils de contrôle de version (RCS ou CVS) Emacs se charge automatiquement des check-in et check-out.

Pour aider à la navigation dans le code source Emacs a des fonctionalités d'édition ``dépliante'' ; c'est à dire qu'on peut lui demander d'afficher uniquement les en-têtes de fonction, et de cacher temporairement le reste. Ainsi on peut avoir une vue d'ensemble sur le fichier qu'on édite, réorganiser de grands blocs de code d'un coup, tout en pouvant exposer certaines parties du code quand on le souhaite. C'est le M-x outline-minor-mode qu'il faut activer; on peut alors taper C-c @ C-t pour cacher tout sauf le premier niveau de code, C-c @ C-e pour afficher un sous-arbre, ou C-c @ C-a pour réafficher tout. Ces fonctionalités marchent également en mode Emacs Lisp, perl, HTML (où on voit les balises <h1> etc).

Le mode HTML

HTML-mode with netscape previewing, LaTeX mode. M-g b etc homogène dans les différents modes.

Extensions

Il existe un grand nombre de modules d'extension qui augmentent les capacités de Emacs. jka-compr permet à Emacs d'utiliser les fichiers compréssés (gzip, compress, bzip2) de manière transparente : ils sont décompréssés à la volée à l'ouverture, et recompréssés s'il y a lieu lors de la sauvegarde. tar-mode permet d'éditer le contenu d'archives tar sans les désarchiver. ange-ftp permet à Emacs de voir Internet comme un énorme système de fichiers virtuel : lorsqu'on veut éditer un fichier sur une machine distante, ange-ftp ouvre un session ftp avec la machine, récupère le fichier (après avoir demandé un mot de passe) et l'affiche comme si il était sur la machine locale; si on sauvegarde le fichier il sera retransmi vers la machine distante. Les bookmarks permettent de mémoriser une position dans un fichier ou un répertoire et d'y retourner facilement ultérieurement. time-stamp permet de garder à jour une ligne dans l'entête d'un fichier indiquant la dernière fois qu'il a été édité (avec Emacs :-). autoinsert permet de créer des entêtes ou des squelettes de fichers personalisés, en fonction de leur mode. ediff permet de visualiser de manière très comfortable les différences entre deux fichiers, de les merger, ou encore d'appliquer des patchs de manière séléctive et interactive. Avec dabbrev vous économisez des touches clavier en complétant le mot courant en fonction des autres mots dans les fichiers qu'on a ouvert dans Emacs.

Environnement de travail

Les vrais accros de Emacs l'utilisent comme un environnement de travail complet. On commence par lire son email et les news avec Gnus, on utilise le shell sous Emacs (M-x shell), on y consulte les pages man (M-x man). Quand on a marre de travailler on joue à gomoku, quand ça va vraiment mal on consulte le psychiatre intégré (M-x doctor).

Le Futur

Emacs souffre un peu de son age. La version de Lisp utilisée est un peu viellotte; il serait souhaitable de la remplacer par un dialecte plus moderne. Certains voudraient utiliser Common Lisp, un dialecte très complet mais très lourd; la faveur de GNU semble être Scheme, dialecte pure et propre de Lisp, et plus exactement Guile, un interpréteur Scheme avec une riche librairie de code système. Le plus urgent et de pouvoir utiliser de multiples threads, notamment pour le code réseau.