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

4. elisp : un aperçu

Nous ne pouvons traiter d'Emacs sans présenter son plus fantastique composant : l'elisp. Nous allons réaliser ensemble une petite fonction Lisp qui transforme le contenu d'un tampon (ATTENTION : C'est irréversible) en le rendant parfaitement illisible. Pour vous prouver à quel point ce langage est abordable, commençons directement par le code complet de la fonction :

(defun silly-transform-buffer ()
  "Transforme une lettre sur deux en majuscule"
  (interactive)
  (save-excursion
    ( goto-char (point-min))
    ( while ( < (point) (point-max))
      (forward-char 1)
      (let ((char_actuel (upcase (char-after (point) ) )))
      (delete-char 1)
      (insert-char char_actuel 1)
      (forward-char 1) ))))

Pour saisir cette fonction, placez-vous dans le mode lisp (par exemple en créant un tampon silly.el vide). Une fois la fonction entrée et sauvegardée, passez dans le mode lisp-interaction ( M-x lisp-interaction ) et allez derrière la dernière parenthèse fermante. Tapez ensuite C-j et la fonction sera enregistrée dans la liste des fonctions d'emacs.

Prenez ensuite un fichier texte auquel vous ne tenez pas vraiment et lancer le mode silly-transform-buffer dans ce tampon. Vous pourrez obtenir des résultat de la forme :

AVANT traitement : Les détracteurs de gcc ont pour principal argument sa prise en charge du C++ trop limitée. Heureusement, cygnus solutions et son egcs remettent les pendules à l'heure, pour le plus grand plaisir des afficionados du C++.

APRES traitement : LEs DétRacTeuRs De Gcc onT pOur prIncIpaL aRguMenT sA pRisE eN cHarGe Du C++ trOp LimItéE. HeuReuSemEnt, cYgnUs SolUtiOns et soN eGcs reMetTenT lEs PenDulEs À l'heUre, pOur le plUs GraNd PlaIsiR dEs AffIciOnaDos du C++.

Notez bien dans la fonction les délimitations des parenthèses. Ainsi la parenthèse fermante qui correspond au defun se trouve tout à la fin de la fonction, c'est une construction englobante comme save-excursion ou while. Les blocs du type (fun1 params) (fun2 params) correspondent à une liste auto-évaluée, ce qui se rapproche d'une construction de blocs dans un langage impératif. Par exemple, le corps de la boucle while est ainsi constitué :

 (forward-char 1)
 (let ((char_actuel (upcase (char-after (point) ) )))
 (delete-char 1)
 (insert-char char_actuel 1)
 (forward-char 1) )

La première commande avant le curseur d'un caractère. Le let ouvre un nouveau bloc pour définir la variable char_actuel valant à l'origine le caractère placé sous le curseur (nommé point pour emacs), transformé en majuscule. Le caractère situé sous le curseur est ensuite effacé puis la version majuscule est insérée. Un nouveau déplacement permet de ne traiter qu'un caractère sur deux. Ceci se poursuit tant que le test :

( < (point) (point-max))  
renvoie « vrai ». Cette condition se traduit en : "la position actuelle est inférieure à la dernière position dans le tampon".

La construction (set-excursion (...) ) permet de sauvegarder la position du curseur avant l'exécution de la fonction pour la retrouver ensuite à la fin de l'exécution. La deuxième ligne entre guillemets est la documentation qu'Emacs fournira avec C-h f. Enfin la déclaration (interactive) dicte à Emacs de rajouter la fonction au fonctions accessibles depuis le minitampon. Si on place (interactive "entrer les parametres"), Emacs en fera véritablement une fonction intéractive.

Bien sûr, cet exemple simple n'est là que pour vous donner envie d'en savoir plus sur elisp, un langage simple et puissant,mais nous ne pouvons malheureusement pas entrer dans les détails ... Une archive nommée « emacs-lisp-intro », disponible en ligne, propose un bon tutoriel.


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