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/
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)
tar xzvf fichier.tar.gzDans 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 installPuis ajouter quelques lignes à votre .emacs. Tout ceci est forcément expliqué dans le fichier INSTALL ou README.
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 :
La fonction autoload permet de dire à Emacs qu'une fonction existe, et dans quel fichier. Il se chargera ensuite de charger le fichier en question au premier appel de cette fonction. Dans la configuration par défaut d'Emacs, prèsque toutes les fonctions sont déclarées en autoload, et par exemple, les fonctions du mode emacs-lisp ne sont chargées que lorsqu'on ouvre un fichier emacs-lisp, et donc jamais pour ceux qui n'en ouvrent jamais. La syntaxe est
(autoload 'fonction "fichier (sans .el)" "La documentation de cette fonction" t)Pour les détails, C-h f autoload RET
Les autoload sont donc très pratiques, mais si j'installe une bibliothèque contenant beaucoup de fonctions, je ne veux pas voir mon .emacs augmenter de façon démesurées. Les grosses bibliothèques contiennent en général un fichier contenant tous les autoloads nécessaires, et il suffit de charger ce fichier pour installer le tout. En plus, on ne veut pas recharger une deuxième fois un fichier déjà chargé. Pour celà, la fonction adaptée est require.
(require '<fichier(sans .el)>)Si le fichier est déjà chargé, rien ne se passe, sinon, le fichier est chargé. Il faut pour celà que le fichier contienne l'instruction (provide '<fichier>), mais ça, c'est le problème du développeur. Dans certains cas, le (provide '<symbol>) et le nom du fichier ne correspondent pas. Dans ce cas, on s'en sort avec (require '<symbol> "<fichier>.el").
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
;;;###autoloadComme 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)
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.
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.
J'en profite pour publier mes fichiers de configuration :
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.