L'Éditeur de texte Emacs

Introduction

Emacs est un éditeur de texte extrêmement puissant, conçu pour tourner sous UNIX, mais disponible sous à peu près toutes les plateformes. Je l'utilise depuis trois ans, et je suis encore loin de maîtriser toutes ses possibilités ...

Je ne ferais pas ici une encyclopédie sur Emacs, mais je présente les (toutes) petites extensions que j'ai écrites, et d'une manière générale, la démarche pour installer n'importe quelle extension (bibliothèque) d'Emacs. Vous trouverez également ici quelques précieuses instructions pour utiliser le retour à la ligne automatique d'Emacs, si vous ne le connaissez pas déjà.

Bien sûr, je ne peux lire le tutorial à votre place. Si vous ne l'avez pas déjà lu, alors, ouvrez un Emacs, et tapez Control-h, puis t, ou bien cherchez dans le menu help, à Emacs tutorial. Il y en a dans plusieurs langues, et une traduction française est disponible ici.

Ces explications s'addressent pour l'instant surtout à des débutants, mais devraient être utiles également à des utilisateurs un peu plus expérimentés. Les gourous peuvent aller trouver les liens vers les fichiers lisp, mon .emacs et .gnus à la fin de la page.

La dernière version de ce document se trouve sur la page http://www-verimag.imag.fr/~moy/emacs/

Installer une bibliothèque pour Emacs

Une bibliothèque (ou, par abus de language, librairie) peut se présenter sous plusieurs formes : Un fichier avec l'extension .el, qui est en fait un code source elisp, un ensemble de fichiers .el, souvent rassemblés dans une archive, ou encore un package pour XEmacs. Je n'ai jamais utilisé de package pour XEmacs, donc, je serais bien en mal de les documenter !

Les instructions données ici sont adaptées à un environnement UNIX (Linux en fait bien sûr partie), et devront sans doute être adaptées pour fonctionner sous Windows.

Dans tous les cas, il va falloir mettre ces fichiers quelque part. Je suppose ici que vous souhaitez une installation pour un seul utilisateur, donc, que vous souhaitez les installer dans votre répertoire personnel.

Il faut créer un répertoire dédié aux fichiers lisp. Par exemple, `emacs-lisp'. Il faut alors dire à Emacs que ce répertoire contient des fichiers qu'il peut utiliser. Pour ça, ajouter ces lignes à votre fichier de configuration (~/.emacs.el, ou ~/.emacs). Si vous n'en avez pas, depuis Emacs, tappez C-x C-f ~/.emacs.el RET (Même sous Windows, si, si !).

;;  Positionner  la variable  `my-lisp-directory'  sur  une chaine  de
;; caractères contenant le  chemin complet du repertoire contenant les
;; fichiers lisp. 
(setq my-lisp-directory (expand-file-name "~/emacs-lisp/"))

;;  Ajouter ce  répertoire à  la liste  des répertoires  contenant les
;; bibliothèques :
(add-to-list 'load-path my-lisp-directory)

Une archive (fichier.tar.gz en général)

Bien sur, il faut commencer par décompresser l'archive. La plupart des lecteurs doivent déjà connaître ça, mais ça ne fait pas de mal de le rappeler :
tar xzvf fichier.tar.gz
Dans un environnement GNU (Linux & Cie). Explications :

Si celà ne marche pas, c'est que la version de tar utilisée n'est pas GNU. Alors, il faut appeler Gzip à la main pour décompresser l'archive : gunzip fichier.tar.gz, qui crée le fichier fichier.tar, puis tar xvf fichier.tar, qui extrait tous les fichiers contenus dans l'archive dans un répertoire.

Lire les fichiers README et/ou INSTALL ! En général, il suffit d'executer successivement les commandes

./configure --lispdir=$HOME/emacs-lisp
make
make install
Puis ajouter quelques lignes à votre .emacs. Tout ceci est forcément expliqué dans le fichier INSTALL ou README.

Un fichier elisp seul

Pour des petits programmes, il n'est pas nécessaire de sortir l'artillerie lourde des ./configure, make, ... Le fichier elisp peut être distribué seul, et l'installation est encore plus simple :

Dans tous les cas

Lire le fichier INSTALL, c'est bien, mais le comprendre, c'est mieux. Voilà quelques indications : Par soucis d'efficacité, Emacs attends qu'on lui demande quelque chose pour charger le contenu d'un fichier. Il y a principalement deux moyens de gérer celà :

Pour automatiser tout ça

Compiler les fichiers, ajouter les autoloads, ce n'est pas grand chose, mais c'est encore mieux quand c'est fait automatiquement. Et c'est bien sur possible. Il faut pour cela télécharger un petit Makefile (à nommer Makefile), éditer le début du fichier pour l'adapter à votre configuration, puis tapper "make". Il vous dira même quelles lignes ajouter à votre .emacs. Il y a 3 variables à configurer au début du fichier :

Une condition, toutefois : Que les fichiers aient été bien écrits. La compilation en byte-code est tout à fait standard, donc ne devrait jamais poser de problèmes, mais la génération d'autoloads ne peut se faire que si les fonctions concernées sont déclarées en temps que tel, c'est à dire précédées exactement de la ligne

;;;###autoload
Comme par exemple, dans le morceau de code suivant :
;;;###autoload
(defun bbdb/send-hook ()
  "Parse headers of outgoing message, insert the addresses of the
  recipients one by one into BBDB if they do not exist already"
  (interactive)

Cas particulier des modes Emacs

Premières manipulations

Un mode Emacs n'est guère plus qu'une fonction qui est appelée automatiquement à chaque chargement d'un fichier. En général, ladite fonction s'intitule <nom-du-language>-mode. Par exemple, le mode Ada appelle ada-mode, le mode C appelle c-mode.

La première chose à faire, c'est de vérifier que tout marche bien. Supposons que vous venez d'installer un mode PHP. Ouvrez un fichier .php. Avec de la chance, vous passerez automatiquement en mode PHP. Sinon, tappez M-x php-mode. Si vous obtenez un message d'erreur, c'est que l'installation du package n'a pas été faite correctement. Fermez Emacs, relancez-le, et réessayez, avec un peu de chance ...

Sinon, quelque part dans la modeline (la barre en bas de l'écran), doit apparaitre PHP, et avec encore un peu de chance, vous aurez la coloration syntaxique. Sinon, M-x font-lock-mode devrait faire l'affaire.

Automatisation

Bon, si la partie précédante a bien marché, vous pouvez bien sur automatiser tout ça en modifiant votre .emacs.

Pour lancer un mode automatiquement, c'est la variable auto-mode-alist qui s'en occupe. C'est une liste de doublets (expression régulière, mode). Par exemple, pour lancer php-mode pour tous les fichiers ayant l'extension .php, il faut écrire :

(add-to-list 'auto-mode-alist (cons "\\.php$" 'php-mode))
Explications : le "." est un caractère spécial pour les expressions régulières, et doit être échappé avec un "\". Mais le "\" est un caractère spécial pour les chaînes en elisp, et doit lui-même être échappé par un autre "\". Le "$" à la fin est un caractère de fin de chaîne. En bref, "\\.php$" veut dire "Toute chaine se terminant par la séquence .php".

Allez, pour la route, un exemple plus compliqués : ".[eE]macs[0-9]+\\.[0-9]+".

Pour avoir la coloration syntaxique automatiquement, c'est

(global-font-lock-mode 1)
Toujours dans le fichier ~/.emacs.el.

Mes bibliothèques

Je me suis mis il y a quelques temps à Gnus , un mailer/lecteur de news qui tourne sous Emacs. Il est vraiment très bien, mais il me manquait quelques fonctionnalités, et j'ai commencé à piocher dans les sources, pour écrire les fonctions dont j'avais besoin. Voilà ce que ça donne :

J'en profite pour publier mes fichiers de configuration :

Les retours à la ligne automatiques sous Emacs

Quand on écrit du code ou des mails, la convention est de jamais dépasser 80 caractères dans la longueur des lignes. Pour les mails (et donc les news), la netiquette impose, selon les versions, de tronquer à 70 ou 76 caractères, pour que les réponses précédées de > > ne débordent pas. S'il vous plaît, respectez ces consignes.

Après la 5ème ligne, vous en avez tous eu marre de compter les caractères et de placer vous même les RET à la main.

Là, vous découvrez M-q : Cette commande permet de reformater un paragraphe. Par exemple, le texte

ceci
est
un
paragraphe, mais avec une ligne vraiment très très très très longue. Elle dépasse même sans doute la largeur de l'écran.
par contre, celle-ci est plus
courte.
en
ceci est  un paragraphe, mais avec  une ligne vraiment  très très très
très longue. Elle dépasse même  sans doute la largeur de l'écran.  par
contre, celle-ci est plus courte.
C'est mieux, non ?

Mais vous ne vous arrêtez pas là. On vous a dit qu'Emacs pouvait tout faire, alors vous vous demandez comment aller plus loin, et automatiser celà pour ne même pas avoir à tapper ce M-q ... Et vous avez raison : essayez M-x auto-fill-mode dans un buffer de texte, puis tappez une longue ligne. lorsque vous pressez la touche espace, Emacs revient à la ligne automatiquement si la ligne est trop longue.

Bon, c'est mieux, mais c'est encore fatiguant de devoir passer à la main en mode auto-fill. Il faudrait le faire automatiquement. Et c'est encore une fois assez simple : Pour passer en mode auto-fill dans tous les buffers en mode texte, ajouter cette ligne à votre fichier .emacs:

(add-hook 'text-mode-hook 'turn-on-auto-fill)

Que fait-elle ? Elle ajoute la fonction turn-on-auto-fill au crochet text-mode-hook. Un crochet est une liste de fonctions qui sont executées quand Emacs rentre dans un mode. Si vous voulez ne passer en auto-fill que pour les compositions de message sous Gnus, par exemple, la ligne devient :

(add-hook 'message-mode-hook 'turn-on-auto-fill)

Bon, là, vous avez l'essentiel.

Personnellement, j'aime bien justifier mon texte à gauche et à droite,
pour avoir  des paragraphes  comme celui-ci, qui  ressemble à  un vrai
rectangle,   quelque    soit   la    longueur   des   mots    qui   le
composent. Certaines personnes ne  trouvent pas celà joli ni pratique,
donc, si c'est votre cas,  passez votre chemin. Dans le cas contraire,
il  suffit  de   positionner  la  variable  `default-justification'  à
'full. Comment ? Comme-ça :

(add-hook 'text-mode-hook 
          (lambda ()
            (auto-fill-mode t)
            (setq default-justification 'full))
          )

Par exemple.

Une petite exception pour le mode AUC-TeX : M-q formate un paragraphe sans le justifier, et C-u M-q le justifie.

Après quelque temps d'utilisation, on est souvent génés par les coupures mal placées, typiquement avec les `:' en fin de ligne. Et bien il suffit de dire à Emacs de ne pas couper à ces endroits là !

(defun my-fill-nobreak-predicate ()
  (save-match-data                 
    (or (looking-at "[ \t]*[])}»!?;:]")
	(looking-at "[ \t]*\\.\\.\\.")
	(save-excursion
	  (skip-chars-backward " \t")
	  (backward-char 1)
	  (looking-at "[([{«]")))))

(setq fill-nobreak-predicate 'my-fill-nobreak-predicate)

Mais les endroits ou l'on ne veut pas couper peuvent changer selon les modes. Par exemple, j'ai ça dans mon .emacs.el pour ne pas couper au milieu d'une chaine dans le mode Ada :

(add-hook 'ada-mode-hook
	  '(lambda ()
	     (make-local-variable 'fill-nobreak-predicate)
	     (setq fill-nobreak-predicate 'ada-in-string-p)
	   ))

le make-local-variable est là pour que la valeur de fill-nobreak-predicate ne soit positionnée que pour le buffer courrant.

Pour tout le reste, je vous suggère un M-x customize-group fill RET. Vous y trouverez certainement votre bonheur pour toutes les autres paramètrages que vous pourriez imaginer.

Certaines personnes tiennent absoluement à sauvegarder leurs fichiers avec des lignes de 3kms de long, mais veulent visualiser leurs fichiers avec des lignes tronquées. Il y a le mode longlines pour cela, mais il faut l'installer, par exemple à partir d'ici.

Des liens pratiques



Matthieu Moy
Valid HTML 4.0!