Page précédente Page suivante Table des matières

3. Extensions

3.1 Paquetages

L'architecture exceptionnellement originale d'Emacs en fait un outil très ouvert et extensible. Ajouter une nouvelle fonctionnalité, un nouveau mode majeur ou mineur ou même une nouvelle application revient à créer un code source en elisp et de de l'associer à un mode ou un nom de fonction. elisp permet de ne pas se soucier de la gestion mémoire ou de la portabilité. Toutes les fonctionnalités d'Emacs sont de plus à portée de main, ce qui permet de ne pas réinventer la roue comme c'est souvent le cas sous d'autres applications. Emacs offre ainsi bien plus qu'un « langage » de macros : un environnement de développement complet et puissant. Certes, la nature fonctionnelle (disons préfixée car les constructions impératives courantes sont proposées) du langage en étonnera plus d'un mais tous ceux qui y ont goûté vous le dirons : « le Lisp, y'a que ça de vrai ! ».

Avec ce fort penchant « évolutif », les logiciels supplémentaires pour Emacs n'ont pas tardé à voir le jour. Aujourd'hui, plusieurs centaines de paquetages fonctionnant sous Emacs (« packages ») sont disponibles, assurant une ahurissante gamme de services. On trouve parmi eux, par exemple, le mode dired que nous avons déjà découverts, le célèbre et très puissant Gnus qui permet la lecture de messages électroniques ou autres articles Usenet. Un client Web est même disponible, il ne brille pas par sa "concision" (en matière de ressources) mais permet de rechercher des infos sur le web sans quitter Emacs. Le très pratique Ange-ftp s'occupe comme son nom l'indique des sites ftp. Pour ceux qui ont un peu le blues, testez M-x doctor et répondez aux questions !

Bref, les extensions sont inombrables et il vous faudra les explorer au plus vite ! Pour vous donner une petite idée de tout ce qu'il est possible de créer, n'oubliez pas qu'Emacs lui-même est en grande partie un source elisp.

La Licence Publique Générale GNU protège d'ordinaire ces logiciels, chacun peut donc les employer et disposer de leurs codes source. En bénéficiant des fonctions standard d'Emacs, l'ensemble des paquetages offre un ensemble complet et cohérent.

Mon exemplaire d'Emacs, au moment où j'édite le présent document, offre ainsi près de 7000 fonctions.

L'utilisateur ne peut évaluer directement (hors d'un programme) que les fonctions dites « interactives ».

3.2 Modes

HTML

Pour illustrer l'installation, la configuration et l'utilisation d'un mode haut-niveau, nous allons nous intéresser au mode html-helper qui est d'une puissance remarquable. Certaines distributions d'emacs proposent ce mode mais ce n'est pas une généralité et la distribution "officielle" ne le fournit pas.

Ce Mode permet, vous l'aurez compris, de faciliter l'édition de documents HTML. Certains trouvent ce mode beaucoup plus pratiques que n'importe quel éditeur "WYSIWYG".

Le paquetage peut être récupéré sur l'Internet. Vous devez récupérer les modules (fichiers sources Emacs lisp) "html-helper-mode.el" et "html-font.el" et les copier dans le répertoire des paquetages : /usr/share/emacs/site-lisp ou /usr/lib/emacs/site-lisp (ou tout autre chemin du même accabit, cherchez un peu ! La variable load-path en abrite la liste).

Puis, en tant que root, lancez Emacs dans ce répertoire. Appelez alors la fonction byte-compile-file pour chacun des deux fichiers copiés. Ceci aura pour effet de "transformer" le code lisp en un code semi-compilé (fichiers d'extension .elc) pour en améliorer l'efficacité.

Vous pouvez désormais quitter Emacs et invoquer :

 chmod a+r /usr/share/emacs/site-lisp/*

La prochaine étape consiste à configurer le nouveau mode au démarrage de toute session d'emacs. Il faut, pour arriver à nos fins, ajouter des lignes dans le fichier standard de configuration d'emacs par l'utilisateur. Ce fichier est généralement nommé .emacs et se trouve à la racine de votre répertoire de travail (on écrit donc  /.emacs).

Les lignes suivantes, ajoutées au contenu du fichier  /.emacs configure le mode html-helper-mode au démarrage :

 ;;; config html-helper-mode
 (autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)
 (setq html-helper-do-write-file-hooks t
        html-helper-build-new-buffer t)
 (add-hook 'html-helper-load-hook '(lambda () (require 'html-font)))
 (add-hook 'html-helper-mode-hook '(lambda () (font-lock-mode 1)))
 ;;; end cfg html-helper-mode

Toujours dans  /.emacs, nous pouvons associer automatiquement les fichiers d'exetensions .html au mode html-helper-mode de la façon suivante :

 (setcdr (assoc "\\.s?html?\\'" auto-mode-alist) 'html-helper-mode)

Pour pouvoir tester notre nouveau mode, nous pouvons relancer Emacs et éditer un fichier au nom suffixé .html n'existant pas encore (C-x f toto.html). Les balises HTML minimum doivent doit être automatiquement générées dans le tampon ("buffer") ainsi créé dont la ligne d'état (fond noir, avant-dernière) doit comporter les mots "HTML Helper Font".

En utilisant le mode mineur font-lock-mode, html-helper permet de représenter les balises avec différentes couleurs. Voici un exemple de configuration à placer dans  /.emacs et qui offre un environnement de base intéressant :

  (require 'font-lock)
  (global-font-lock-mode 't)
  (setq font-lock-maximum-decoration 't
     font-lock-background-mode 'dark)  ; ou "light", selon couleur de fond
  (setq font-lock-face-attributes
     '((font-lock-comment-face "Red4")
     (font-lock-string-face "Green4")
     (font-lock-keyword-face "Orange4")
     (font-lock-function-name-face "Blue4")
     (font-lock-variable-name-face "Blue2")
     (font-lock-type-face "Wheat")
     (font-lock-reference-face "VioletRed4")
     (message-cited-text-face "Blue1")
     (message-header-name-face "Green3")))

  (global-set-key (read-kbd-macro "<f12>") 'font-lock-mode)
  (global-set-key (read-kbd-macro "S-<f12>") 'show_face_on_point_name)

Attention : certains éléments de cette configuration peuvent perturber votre environnement Emacs. Consultez en ce cas un expert (à quoi servent les forums (newsgroups) ?) ou retirez les lignes qui vous semblent douteuses. N'oubliez tout de même pas de conserver des configurations fonctionnelles en cas de comportement étrange (il est pratiquement impossible de planter Emacs, tenez le vous pour dit).

Trève de discussion alarmante (après tout, la plupart d'entre vous commencent à se débrouiller sous Linux, du moins on l'espère !), continuons notre découverte du html-helper-mode. Chargez un fichier HTML au hasard puis placez le curseur ("point") sur un caractère dont la couleur déplaît et taper Shift-F12. La valeur du symbole associé au type syntaxique associé apparaît dans le minitampon. Il suffit alors de modifier, dans le fichier d'initialisation, la table font-lock-face-attributes.

N'oubliez pas (ou apprenez, pour ceux qui ne lisent pas les articles traitant de X11) le fichier /usr/X11R6/lib/X11/rgb.txt contient la liste des noms de couleurs utilisables.

Les modifications ainsi opérées ne seront prises en compte qu'après un nouveau démarrage d'Emacs (qui sait comment réinitialiser font-lock en cours de session ? arg !).

Amusez-vous maintenant à découvrir les capacités de ce mode HTML qui, comme tout mode spécifique à un type de fichier, l'auto-indentation ( appuyez sur TAB puor indenter la ligne courante, quelle que soit la position du curseur). Signalons par exemple le mode tempo-interactive qui permet l'édition interactive des fichiers HTML. Les initiés s'en passeront bien volontiers mais le débutant dispose ainsi d'un moyen efficace pour "découvrir" les balises HTML. Rajouter un lien se fait simplement par l'appel de la fonction tempo-template-html-anchor associée à la séquence C-c C-a l (C-c étant commun à pratiquement toutes les commandes de html-helper).

Gnus

Gnus est une des extensions les plus prisées des utilisateurs "branchés" d'Emacs. Sa vocation première est la gestion des messages (mails) et des articles (forums de discussions (newsgroups) de l'Usenet). Cet outil d'une alliant puissance et souplesse, en général préinstallé, offre des fonctions de base accessibles à tout un chacun et des possibilités par ailleurs très étenudues. M-x gnus permet de le lancer. Sur les systèmes Unix, il faut en général exporter la variable d'environnement NNTPSERVER contenant le nom du serveur Usenet à contacter. Après connexion au seveur, votre première envie sera de récupérer la liste de tous les forums proposés. Utiliser pour cela la fonction gnus-group-list-all-groups ( touche L ). La variante gnus-group-list-groups (touche I ) n'affiche que les forums contenant des articles à lire.

Pour raffiner votre sélection, utilisez la touche q pour vous abonner/désabonner à un groupe. La touche R (gnus-group-restart) permet de revenir à la liste par défaut des groupes auxquels vous êtes abonnés. N'oubliez pas cette fonction lorsque vous êtes coincés !

Ensuite, la consultation se fait simplement en se positionnant sur son nom et en appuyant sur ESPACE. Consulter un message se fait en appuyant sur g. Pour répondre à un article, quatre possibilités de base sont offertes :

Le mail-mode d'Emacs est alors lancé, il permet la saisie du texte de la réponse. Pour envoyer ce message, utilisez la commande mail-send-and-exit (C-c C-c).

Pour revenir de la liste des articles à la liste des groupes, utilisez q pour gnus-summary-exit. Gnus dispose d'un nombre incalculable de fonctions (tris évolués des articles, filtres, etc.) et je vous encourage vivement à lire la documentation du paquetage.

Autres modes : FTP, WWW ...

Pour le ftp, Ange-ftp est incontournable. Cette extension s'intègre parfaitement à Emacs. Les fichiers distants sont accessibles de façon transparente par la syntaxe /user@ftp.quelquepart.fr/repertoire. Le mode dired profite également de cette ouverture vers le monde ftp.

Enfin, w3 fournira le minimum aux inconditionnels du Web qui ne peuvent ou ne veulent quitter leur Emacs. Voici une configuration possible (pour le  /.emacs) :

    (add-to-list 'load-path "/usr/share/emacs/site-lisp/w3")
    (require 'w3-auto "w3-auto")

    (autoload 'w3-preview-this-buffer "w3" "WWW Previewer" 't)
    (autoload 'w3 "w3" "WWW Browser" 't)
    (autoload 'w3-open-local "w3" "Open local file for WWW browsing" 't)
    (autoload 'w3-fetch "w3" "Open remote file for WWW browsing" 't)
    (autoload 'w3-use-hotlist "w3" "Use shortcuts to view WWW docs" 't)

    (setq-default w3-do-incremental-display t
                  url-be-asynchronous t)
;; (setq w3-use-netscape-configuration-file t
;; w3-netscape-configuration-file
;; "/where/the/file/is/.netscape-preferences")
    (setq url-using-proxy t
;          w3-hotlist-file (expand-file-name "~/.netscape/bookmarks.html")
          browse-url-browser-function 'browse-url-netscape
          url-proxy-services
          '(("ftp" . "localhost:8080")
            ("http" . "localhost:8080")
            ("gopher" . "localhost:8080")
            ("no_proxy" . "localhost"))
          url-confirmation-func 'y-or-n-p
          w3-default-homepage "http://localhost:8080/"
          w3-default-homepage "une-URL"                       MODIFIER CECI
          url-pgp/pem-entity "mon-adresse@mon-domaine"        MODIFIER CECI
          url-personal-mail-address "mon-adresse@mon-domaine" MODIFIER CECI
          url-xterm-command "nxterm -title %s -ut -e %s %s %s"
          w3-delimit-links t
          url-confirmation-func 'y-or-n-p
          w3-show-status t
;         w3-debug-html t
          url-show-status t)

Les principales commandes de base de w3 sont :

Pour les programmeurs

Emacs dispose de nombreux modes permettant une édition améliorée de sources pour de nombreux langages : C, C++, Java, Lisp (et pour cause !), Prolog, etc... Le principal avantage de ces modes spécifiques provient de l'auto-indentation (touche TAB) qui permet au programmeur de ne plus du tout se soucier de l'indentation de son code source.

Par exemple, sous cc-mode , vous pourrez saisir le programme bien connu :

int main(void)
{
int i;

printf("Hello world !\n"); /* ceci est normal */

for(;;) {
printf("bzooutt !\n"); /* ceci ne l'est pas */
printf("mmmoutt !\n");
printf("zzzzuuutt !\n");
}
}

Puis utiliser c-indent-defun (C-c C-q) pour obtenir :

int main(void)
{
  int i;

  printf("Hello world !\n"); /* ceci est normal */

  for(;;) {
    printf("bzooutt !\n"); /* ceci ne l'est pas */
    printf("mmmoutt !\n");
    printf("zzzzuuutt !\n");
  }
}

Bien sûr, vous pouvez obtenir le même résultat en appuyant sur TAB sur chaque ligne (une habitude vite prise qui peut être automatisée).

Allez maintenant sur la ligne "bzouttt !" et lancez la fonction kill-comment. Par magie, le commentaire de la ligne sera retiré. Nous pouvons maintenant commenter toute la boucle en marquant (C-SPACE) le début de la boucle, en plaçant le curseur après l'accolade fermante du for et en appelant la fonction comment-region. Le résultat obtenu est un programme parfaitement inutile mais qui ne boucle plus à l'infini :

int main(void)
{
  int i;

  printf("Hello world !\n"); /* ceci est normal */

/*   for(;;) { */
/*     printf("bzooutt !\n"); */
/*     printf("mmmoutt !\n"); */
/*     printf("zzzzuuutt !\n"); */
/*   } */
}

L'autre atout majeur de ces modes spécifiques est la coloration syntaxique, proposée par le mode mineur font-lock-mode. Chaque élément syntaxique (mot réservé, ponctuation, constantes, etc...) sera colorié (sur un écran couleur) ou plus simplement accentué (gras, souligné, inverse vidéo). Esthetique autant que pratique, ce mode permet même l'impression en postscript de vos oeuvres informatiques avec ps-print-buffer-with-faces. Sur la distributions standard, le font-lock-mode n'est pas appelé automatiquement au lancement d'un mode langage comme c-mode. Pour obtenir ce comportement, il faut ajouter une ligne à votre  /.emacs du type :

(setq c-mode-hook 
 '(lambda () 
  (font-lock-mode)))

Les hook sont des bouts de code Lisp appelés avant le changement de mode, ceci permet d'automatiser de nombreuses tâches d'initialisation. Le c-mode et les autres modes comparables proposent de nombreuses autres fonctionnalités toutes plus intéressantes les unes que les autres (etags, conditional moves, etc.).


Page précédente Page suivante Table des matières