Page suivante Page précédente Table des matières
2. EMACSulation
par Éric Marsden.
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 Personnalisation d'Emacs
La plupart des applications utilisent un fichier de configuration leur permettant d'attribuer des valeurs à certaines variables. Emacs va beaucoup plus loin puisque l'utilisateur peut personnaliser quasiment toutes les caractéristiques du système. Cette flexibilité est due au fait que la plus grosse partie du tout a été écrite à l'aide de son langage d'extension. Les premières implantations d'Emacs utilisaient un langage de traitement des chaînes caractères très hermétique nommé TECO (vous pensiez que Perl était opaque ? Jettez un coup d'oeil à TECO), qui traitait du code en langage d'assemblage PDP-10. Les versions suivantes utilisent Emacs Lisp comme langage d'extension, avec quelques composants (l'interpréteur Lisp et le code d'affichage) écrits en C.
Cette faculté d'extension est fondamentale. Les utilisateurs peuvent réaliser des améliorations, les tester puis les communiquer à leurs amis si elles fonctionnent correctement. Les meilleures idées peuvent être intégrées dans la distribution principale. Les machines Lisp du MIT, aujourd'hui disparues, étendirent cette ouverture au système d'exploitation, écrit en Lisp (animé par un matériel spécialisé, conçu pour exécuter efficacement du code Lisp). Les utilisateurs de machines Lisp avaient un bien plus grand contrôle sur leur machine qu'en ont actuellement les utilisateurs de Linux. Les systèmes Smalltalk du Xerox Parc offraient un niveau de souplesse équivalent.
Il y a, bien sûr, une différence importante entre la philosophie de développement qui a conduit à Emacs (l'approche MIT), et celle qui a mené à Unix et C (l'approche New Jersey). Celles-ci sont comparées dans un très bon article de Richard Gabriel, intitulé Worse is Better, d'où j'ai extrait le texte suivant :
Deux personnes connues, l'une du MIT et l'autre de Berkeley (mais travaillant sur Unix) se rencontrèrent un jour pour discuter du devenir des systèmes d'exploitation. La personne du MIT connaissait ITS (le système d'exploitation du département d'Intelligence Artificielle du MIT) et avait lu les sources d'Unix. Il voulait savoir comment Unix résolvait le problème de la perte du compteur ordinal. Ce problème survient lorsqu'un programme utilisateur appelle une routine système pour réaliser une longue opération. Si une interruption survient pendant cette opération, le contexte du programme utilisateur doit être sauvegardé. Comme l'appel de la routine système consiste le plus souvent en une seule instruction, le compteur ordinal du programme utilisateur ne rend pas correctement compte de l'état du processus. La routine système peut donc soit restaurer le contexte d'exécution avant appel, soit attendre la fin de l'appel système. Mieux vaut, en pratique, restaurer le compteur ordinal du programme utilisateur de sorte qu'il pointe vers l'instruction qui a appelé la routine système pour que le retour au programme utilisateur après l'interruption, par exemple, re-appelle la routine système. Ce problème s'appelle « perte du compteur ordinal » (PC loser-ing) car le compteur ordinal est forcé en mode « loser » et « loser » est le gentil nom donné aux utilisateurs au MIT.Le gars du MIT n'avait jamais vu de code gérant cette situation et demanda à celui de Berkeley comment ce problème était géré. Ce dernier dit que l'équipe Unix connaissait le problème, normalement c'était à la routine système de toujours se terminer mais parfois, un code d'erreur serait retourné pour signaler que la routine système n'avait pu le faire. Un programme utilisateur correct devait donc contrôler le code d'erreur pour savoir s'il devait rappeler la routine système. Le gars du MIT n'aima pas cette solution car elle n'était pas bonne.Le gars du New Jersey dit que la solution Unix était la bonne car la philosophie de conception d'Unix était la simplicité et que la solution réelle était trop complexe. De plus, les programmeurs pouvaient aisément insérer ce test et cette boucle supplémentaires. Celui du MIT admit que l'implantation était simple mais que l'interface vers cette fonctionnalité était complexe. Le gars du New Jersey dit qu'un bon compromis avait été choisi pour Unix : la simplicité de l'implantation était plus importante que celle de l'interface.Revenons à des considérations plus concrètes. La méthode traditionnelle pour personnaliser [X]Emacs consiste à écrire des expressions (« formes ») Emacs Lisp simples dans un fichier nommé
.emacs
placé dans votre répertoire personnel. Ces expressions peuvent attribuer une valeur à une variable, appeler une fonction ou charger une bibliothèque :
;; affecte des valeurs à quelques variables. `t' signifie Vrai et `nil' ;; signifie Faux (setq dired-listing-switches "-alF") (setq tab-width 4) (setq line-number-mode t) (setq global-font-lock-mode t) (setq next-line-add-newlines nil) ;; appelle une fonction qui affichera l'heure dans la ligne de mode (display-time) ;; charge une bibliothèque Emacs Lisp et appelle sa fonction d'initialisation (require 'jka-compr) (auto-compression-mode 1)La syntaxe a tendance à irriter ceux qui plaisantent à propos de ces « Lots of irritating spurious parentheses », mais l'utilisation d'un langage de programmation complet dans un fichier de configuration a des avantages certains. Cela vous permet de tester les caractéristiques de la configuration locale, par exemple :
(if (file-exists-p "/bin/bash") (setq explicit-shell-file-name "/bin/bash"))qui fait qu'Emacs utilisera le bash dans les tampons
*shell*
s'il existe sur la machine. Une autre raison d'utiliser un véritable langage pour les fichiers de configuration est que cela évite la prolifération de ces fichiers, chacun avec sa propre syntaxe particulière (pensez à~/.Xdefaults
, aux fichiers de configuration du gestionnaire de fenêtres, à~/.inputrc, ~/.procmailrc
, etc). Heureusement, l'utilisation de Guile comme langage de script intégré résoudra ce problème. Un dernier avantage est qu'un véritable langage de programmation donne plus de puissance à l'utilisateur. Dans l'un des premiers rapports techniques sur Emacs, Richard Stallman présente cet aspect comme un but important :
Lorsqu'un grand nombre de travailleurs non techniciens utiliseront un éditeur programmable, ils seront constamment tentés de commencer à programmer au cours de leur vie de tous les jours. Cela devrait beaucoup contribuer à l'alphabétisation informatique, notamment parce que la plupart des personnes ainsi exposées seront des secrétaires auxquelles la société à répété qu'elles sont incapables de faire des mathématiques, et qui sont elles-mêmes incapables d'imaginer un seul instant qu'elles peuvent apprendre à programmer. Mais cela ne les empêchera pas d'apprendre si elle ne savent pas que c'est la programmation qu'elles apprennent !
Customize
Les versions récentes d'[X]Emacs comprennent un paquetage nommé Customize afin de vous aider à adapter Emacs à vos goûts sans avoir à écrire la moindre ligne de Lisp. Customize a été écrit par Per Abrahamsen, qui est aussi l'auteur du paquetage Auc-TeX, très apprécié de ceux qui utilisent TeX. Customize permet à l'utilisateur de disposer d'une liste de toutes les variables qu'il peut configurer dans Emacs, et de les modifier facilement afin d'adapter l'ensemble à ses attentes. Pour lancer Customize (il n'existe que sur les Emacsen récents), choisissez le menu Help
->
Customize. En XEmacs, cela ressemble à cela :
Customize a besoin que chaque bibliothèque Emacs Lisp déclare les variables modifiables par l'utilisateur qu'elle exporte. Le type de la variable est précisé : booléen, entier, chaîne ou choix parmi plusieurs options et plusieurs variables appartiennent au même groupe, ce qui permet une représentation hiérarchique des informations. Les écrans de modification sont alors générés automatiquement et à la demande. Il s'agit d'une conception élégante car la programmation de milliers de boîtes de dialogue à la main serait un travail titanesque et occuperait beaucoup de place sur le disque. Les modifications de l'utilisateur sont stockées dans un fichier, lu par [X]Emacs lors de sa phase d'initialisation.
Un aspect malheureux de Customize est qu'il introduit deux méthodes pour faire la même chose. Les utilisateurs voulant dépasser les simples personnalisations possibles avec l'interface graphique seront confrontés à une façon de faire entièrement nouvelle, et pourront se décourager. Le chemin entre rendre simples les choses simples et possibles les choses complexes et le vieil adage Construire un système qu'un idiot peut utiliser, et que seul un idiot utilisera est difficile à suivre.
Affectation des touches
L'affectation des touches est un domaine particulièrement perfide de la personnalisation d'Emacs. Les problèmes principaux viennent des différences entre les opérations de X11 et de la console (en particulier avec la touche backspace et de celles entre la syntaxe utilisée par Emacs et XEmacs. L'une des premières choses que l'on souhaite faire est de configurer les touches « Suppr », « Home » et « Fin » avec leur signification classique dans la monde PC :
(pc-selection-mode) ; pc-select.elCette ligne vous permettra aussi de sélectionner des régions de texte à l'aide de « Shift » et des touches du curseur, de couper/copier/coller avec Shift-Suppr, Ctrl-Inser et Shift-Inser respectivement. Vous pouvez affecter les touches de fonction de la façon suivante (cette syntaxe fonctionne aussi bien avec Emacs qu'avec XEmacs) :
(define-key global-map (read-kbd-macro "<f2>") 'save-buffer) (define-key global-map (read-kbd-macro "<f4>") (lambda () (interactive) (kill-buffer nil)))La première ligne affecte à la touche
F2
la sauvegarde du tampon courant (en liant cette touche à la fonction interne), la seconde montre comment affecter ses propres fonctions : en Lisp,lambda
introduit une fonction dite « anonyme » ;(interactive)
signifie que l'on pourra accéder à la fonction n'importe quand, et le reste détruit le tampon courant sans demander confirmation.global-map
signifie que ces affectations s'appliqueront partout dans Emacs, que vous lisiez votre courrier, ou que vous composiez de l'HTML. Vous pouvez aussi définir des affectations locales qui ne s'appliqueront qu'à des tampons se trouvant dans des modes précis :
(define-key emacs-lisp-mode-map (read-kbd-macro "C-c C-e") 'eval-buffer) (define-key c-mode-map (read-kbd-macro "<f5>") 'compile)La FAQ Emacs (disponible en ligne en faisant
C-h F
) présente une autre méthode pour affecter les touches mais celle-ci peut ne pas fonctionner dans toutes les versions d'Emacs. Jari Aalto a écrit un long guide sur l'affectation des touches (en anglais) qui décrit les différentes façons de procéder.
Si vous avez la chance d'avoir un clavier '105 touches' (MS-Windows 95), vous pouvez utiliser ces adorables petites touches sous X11 avec un coup de xmodmap. Le système X Window possède cinq modifieurs de touches possibles, les trois premiers étant
Shift, Ctrl
etAlt
sur les claviers PC. Vous pouvez configurer les touches Windows pour qu'elles correspondent aux modifieursSuper
etHyper
de la façon suivante (ceci concerne un clavier français ; utilisez xev pour connaître les codes des touches de votre clavier) :
(shell-command (concat "xmodmap " "-e 'keycode 115 = Hyper_L' " "-e 'keycode 116 = Hyper_R' " "-e 'keycode 117 = Super_L' " "-e 'add mod4 = Hyper_L' " "-e 'add mod4 = Hyper_R' " "-e 'add mod3 = Super_L' ")) (message "Configuration des touches Hyper et Super") (define-key global-map [(hyper tab)] 'complete-tag) (define-key global-map [(super !)] 'speedbar-get-focus)Sauvegardes
Dans sa configuration par défaut, Emacs réalise des sauvegardes en créant un fichier dans le même répertoire que celui de l'original. Le nom de cette sauvegarde est le nom du fichier suivi du caractère tilde. Si vous préférez que toutes les sauvegardes aient lieu au même endroit, essayez le code suivant. Emacs peut aussi conserver une série de sauvegardes numérotés à la VMS : examinez la variable
version-control
.
;; crée les fichiers de sauvegarde dans ~/.backups/ au lieu de les ;; disséminer à travers le système de fichier (defun make-backup-file-name (file-name) "Crée le nom non-numérique du fichier de sauvegarde pour `file-name'." (require 'dired) (if (file-exists-p "~/.backups") (concat (expand-file-name "~/.backups/") (dired-replace-in-string "/" "|" file-name)) (concat file-name "~"))) ;; désactive la sauvegarde des fichiers de /tmp ou de mes répertoires de ;; courrier et de news. (defun ecm-backup-enable-predicate (filename) (and (not (string= "/tmp/" (substring filename 0 5))) (not (string-match "/Mail/" filename)) (not (string-match "/News/" filename)))) (setq backup-enable-predicate 'ecm-backup-enable-predicate)Autres informations
Ce que nous venons de voir ne représente que quelques exemples de ce qui peut être personnalisé dans (X)Emacs. Voici quelques adresses de sources d'inspiration supplémentaires :
- Les manuels en ligne contiennent des explications complètes et bien écrites et peuvent être parcourus à partir d'(X)Emacs (tapez
C-h-i
). Ils contiennent une page d'exemples pouvant être placés dans votre~/.emacs
.- Le Emacs Lisp manual décrit les détails et particularités du langage d'extension d'Emacs.
- La FAQ Emacs.
- La FAQ XEmacs.
- Le forum gnu.emacs.help pour les questions spécifiques à GNU Emacs, comp.emacs.xemacs pour les utilisateurs d' XEmacs users, comp.emacs pour les questions d'ordre général, et alt.religion.emacs pour les questions concernant la secte d'Emacs (NdT : le forum francophone fr.comp.applications.emacs traite de toutes les questions sur tous les Emacsen).
- Généralement, les nouveaux paquetages que vous pouvez récupérer incluent des commentaires au début de leur code source pour expliquer quelles sont les variables qui peuvent être modifiées.
- XEmacs est distribué avec un exemple de ~/.emacs.
- La XEmacs Customization Page d'Erik Sundermann est mentionnée dans la FAQ Xemacs.
Retours
Vincent Zweije m'a écrit à propos de mon article sur
gnuserv
, dans lequel je conseillai d'utilisercat /etc/passwd | md5sum
pour générer un cookie pourxauth
.J'écrivai :
[...] Bien que permettre l'accès à votre affichage X est suffisamment problématique ( quelqu'un pourrait capturer toutes vos frappes de touches, par exemple), donner un accès distant à votre processus Emacs est encore plus ennuyeux car Emacs peut exécuter n'importe quelle commande sous votre id, détruire des fichiers, envoyer des insultes par courrier au président des États Unis, etc.Il me répondit :
Ou même quelque chose de plus dangereux comme envoyer un courrier d'insultes au président d'une quelconque république bananière :-)Je poursuivai :
Depuis la version 2.1, gnuserv peut utiliser l'authentification MIT-MAGIC-COOKIE-1 pour les requêtes distantes. Ce protocole utilise le contenu de votre fichier ~/.Xauthority, décrit par la page man xauth(1). Gnuserv a besoin d'un cookie pour afficher le nombre 999, vous pouvez le créer 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 d89570b20925d401c05a79be67159caeSa réponse fut :
Vous avez choisi un mauvais exemple. Il y a de fortes chances que /etc/passwd soit stable pendant une longue période et cela signifie que le même magic cookie sera généré de nombreuses fois. Ceci est un problème si vous avez donné un cookie (volontairement ou non) et que vous voulez supprimer les permissions en en générant un autre. Le mieux est de choisir une source de données changeante, comme la sortie de ps -al ou le contenu /proc/interrupts, ou encore d'utiliser mcookie, comme vous l'indiquez plus loin.Ces remarques sont particulièrement importantes si le site utilise des mots de passe ombrés (shadow). Vincent remarque que les problèmes de sécurité sont trop importants pour être laissés aux utilisateurs ordinaires :
À ce propos, c'est sûrement une mauvaise idée de laisser les utilisateurs ordinaires s'occuper de leur propre sécurité, comme avec les cookies. Il ne sont pas assez préoccupés de cela - ils veulent simplement que leur travail soit fait. Vous seriez étonné du nombre de fois ou j'ai vu des articles Usenet conseillant de faire "xhost +" pour autoriser les connexions X de n'importe où. De telles personnes ne réalisent souvent même pas qu'elles alors dans le domaine de la sécurité. Elles considèrent la désactivation des connexions X (gnuserv) comme un gêne et veulent simplement une incantation magique pour la supprimer. C'est une question de perception. Quelqu'un s'occupant de la sécurité doit savoir ce qu'il fait. Cependant, il faut d'abord réaliser que c'est avec la sécurité que l'on joue.La prochaine fois...
Le mois prochain, j'étudierai les différents moyens d'utiliser les abréviations sous Emacs. N'hésitez pas à me contacter à l'adresse
<emarsden@mail.dotcom.fr>
pour 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.
Copyright © Juin 1998, Eric Marsden - paru dans le numéro 31 de la Linux-Gazette
Adaptation française : Éric Jacoboni.
Page suivante Page précédente Table des matières