Emacs -- Caractéristiques avancées
Par Jesper Kjær Pedersen
Adaptation française : Éric Jacoboni.
Précédent Suivant Table des Matières
2. Emacs -- Caractéristiques avancées
Cet article décrit certaines des caractéristiques avancées d'Emacs. Je ne veux pas démarrer de polémique avec ceux qui utilisent d'autres éditeurs (le choix d'un éditeur est vraiment une affaire de religion). Je ne veux pas non plus paraphraser le manuel. Les pages info d'Emacs sont très détaillées, et il faut s'y référer pour obtenir plus d'informations. Je décrirai les caractéristiques d'Emacs que je trouve très utiles. Dans la deuxième partie de cet article, je donnerai quelques conseils simples. Vous êtes encouragés à avoir Emacs sous la main pendant que vous lisez cet article car tout sera expliqué par des exemples.
2.1 Modes
Bien sûr... Des modes majeurs pour différents langages. Avec eux, Emacs connaît le langage que vous éditez : LaTeX (auc-tex), C (c-mode) ou html (html-helper-mode), par exemple. De plus, Emacs interagit avec
ispell
afin de faciliter la vérification de l'orthographe de vos fichiers. Tapez simplement : M-x, suivi d'ispell-word, ispell-region ou ispell-buffer.C'est très utile, mais si vous connaissez un petit peu Emacs, vous savez déjà tout cela !
2.2 outline-minor-mode
NdT : Nous gardons ici le terme original, s'il fallait proposer une traduction, nous suggèrerions « mode mineur pour plan ».
Ce mode vous permet d'avoir une vue d'un fichier beaucoup plus pratique. Voici un exemple : recherchez votre plus gros programme C ou récupérez le source d'un programme que vous avez compilé sur votre système et chargez le dans Emacs. Bien, maintenant : où se trouve la fonction nommée
XX
? Je sais qu'elle est quelque part, mais le fichier fait 10000 lignes...Tapez simplement : M-x outline-minor-mode, puis M-x hide-other. Si vous avez fait cela correctement, les seules choses que vous pouvez voir sont les en-têtes des fonctions. N'ayez pas peur, les corps de vos fonctions ne sont pas partis, ils sont simplement cachés ce qui vous permet d'avoir un résumé. Essayez de déplacer le curseur sur l'un des en-têtes de fonction et pressez M-x show-subtree. Vous voyez maintenant le corps de cette fonction. C'est cela, en fait ! On peut faire encore beaucoup plus, bien sûr, mais cela implique de n'étendre qu'un niveau à chaque fois. Personnellement, je ne le fais pas car étendre/fermer une fonction entière au lieu du simple corps d'une boucle
for
, etc. me suffit.Cette fonction est liée à des touches, mais je ne les ai pas utilisé ci-dessus, car j'ai l'impression qu'elles ont changé entre les versions 19.28 et 19.30 d'Emacs. Avec la version 19.30, je crois que hide-other est liée à C-c @ C-o et show-subtree à C-c @ C-s. Pour trouver la combinaison utilisée chez vous, il vous suffit de taperC-h w hide-other, etc. (NdT : Avec XEmacs, vous avez aussi accès à ces fonctions par les options « Show » et « Hide » du menu qui s'affiche lorsque vous êtes dans ce mode, bien que les combinaisons de touches restent valables).
Pour changer le préfixe par défaut (C-c @ dans notre exemple) par autre chose, ajoutez quelque chose comme cela dans votre fichier
.emacs
 :
(setq outline-minor-mode-prefix "\C-o")
Vous aurez alors le préfixe C-o à la place du précédent (mais vous devez alors vous poser la question : utilisiez-vous open-line, qui est liée à C-o ? Oui ? Dommage...Pour éditer un nouveau fichier C en mode mineur, avec toutes les fonctions refermées, ajoutez ceci dans votre
.emacs
 :
(add-hook 'c-mode-hook (function (lambda () (outline-minor-mode) (hide-other))))
REMARQUE : les outline-minor-modes fonctionnent également avec d'autres modes, bien que cela soit surtout utile dans les modes qui concernent les langages de programmation.
ATTENTION ! Si vous supprimez les trois points après l'en-tête d'une fonction, vous détruisez en fait tout son corps. C'est donc un piège auquel vous devez faire attention continuellement lorsque vous êtes en outline-minor-mode.
2.3 TAGS
Lorsque l'on programme, on est souvent en train de rechercher dans tous les fichiers d'un programme une fonction donnée, ou un motif particulier, non ?
Si c'est le cas, vous devriez vraiment utiliser les TAGS. Un tag est un tableau de mot-clés et de fichiers qu'Emacs utilise pour retrouver sa route dans vos fichiers.
Allez dans un répertoire contenant beaucoup de fichiers C, et tapez
etags *.c *.h
dans un shell. Puis, sous Emacs, ouvrez l'un des fichiers de ce répertoire, déplacez le curseur sur l'appel d'une fonction, pressez M-., et validez. Emacs ira à l'endroit où la fonction a été définie. C'est cool, non ?Bien, maintenant nous voulons savoir à quel endroit le programme affiche « Au revoir », on tape donc M-x tags-search, on valide et on tape printf. Si ce motif existe quelque part dans votre programme, Emacs ira sur sa première occurence, et si vous pressez M-, après cela, il se déplacera sur les occurrences suivantes.
Finalement, vous avez découvert, qu'en C, on affiche avec la commande
printf
et non avecputs
comme vous aviez l'habitude en Tcl/Tk. La modification est simple avec les tags : tapez M-x tags-query-replace, validez, tapez puts( lorsque l'on vous demande d'entrer une expression rationnelle à rechercher, tapez printf( lorsque l'on vous demande l'expression de remplacement et c'est parti. Emacs placera le curseur sur la première occurence puis vous demandera quoi faire.Ah ah, vous avez bien vu les mots magiques : expression rationnelle. Bien, maintenant vous savez que l'on affiche avec
printf(...)
au lieu deputs<abc>
et vous voulez qu'Emacs corrige ce petit problème. Ok, on y va : M-x tags-query-replace, tapez puts<\(.*\)> pour répondre à la question concernant ce qu'il faut rechercher, et printf(\1) pour dire par quoi remplacer.Bien, qu'en est-il de tout cela ? Le motif \( \) indique à Emacs de tout mettre entre parenthèses et .* lui indique de tout faire correspondre. Enfin, \1 demande à Emacs d'insérer la premère correspondance, c'est-à-dire celle qui se trouve entre \( et \).
Compliqué ? Bon, alors je crois que vous devez en apprendre un peu plus sur les expressions rationnelles, donc tournons-nous vers
info
en tapant C-h i, puis allons sur la ligne :
* Emacs: (emacs). The extensible self-documenting text editor.
Validez avec le curseur sur cette ligne, et déplacez-vous sur la ligne :
* Regexps:: Syntax of regular expressions.
Vous y êtes. Lisez ce qui concerne les expressions rationnelles et, lorsque vous avez assimilé cette page, pressez deux fois
next
en haut de la page et, de là, lisez comment effectuer des remplacements en utilisant les expressions rationnelles.2.4 Signets
Les « signets » sont, comme leur nom l'indique, une liste d'endroits en différents fichiers. En fait, un fichier peut être tout ce qu'Emacs peut montrer, un contenu de répertoire, une page info, un emplacement FTP, ou simplement un fichier ordinaire. Voici comment faire : allez à l'emplacement où vous voulez placer un signet et pressez C-x r m, puis entrez un nom pour désigner cet endroit. Vous venez de créer un signet et vous pourrez retourner à cet endroit précis à chaque fois que vous le désirez s'il existe toujours. Voici quelques exemples :
Pressez C-h C-f bookmark-set, ce qui vous placera sur la page info qui décrit les signets. À cet endroit, vous pouvez lire ce qui les concerne. Bien, c'est sûrement un bon emplacement à marquer, donc pressez C-x r m, et donnez-lui un nom approprié.
Si vous êtes sur l'Internet, ouvrez le fichier
/ftp@ftp.denet.dk:/pub/OS/Linux/slackware/
, comme n'importe quel autre et vous êtes maintenant au Danemark, sur un miroir de la distribution Slackware. Pressez C-x r m, pour positionnet un signet à cet endroit.Enfin, ouvrez votre fichier
.emacs
, allez en ligne 15 et pressez C-x r m.Si vous voulez maintenant aller à l'un de ces endroits, vous pouvez presser C-x r l et consulter une liste de tous les signets (tapez ? dans cette page pour voir ce que vous pouvez faire à partir de là). Un autre moyen d'aller sur un signet précis est de presser C-x r b, puis le nom du signet où vous vouler aller (pressez la touche TAB pour en avoir la liste où compléter les caractères que vous avez déjà tapés).
REMARQUE : Lorsque vous allez sur un signet, vous serez positionné sur la bonne ligne, si possible !
2.5 Comparer des fichiers avec ediff
Si vous devez comparer deux fichiers, vous pouvez utiliser Emacs à la place du
diff
classique : lancez Emacs et tapez M-x ediff-files. Lorsque vous aurez indiqué à Emacs quels sont les fichiers que vous voulez comparer, chacun d'eux apparaîtra dans un cadre distinct et un troisième cadre apparaîtra dans sa propre fenêtre. De celle-ci, vous pouvez commander la session de comparaison. Maintenant, vous pouvez taper n pour aller sur la première différence et Emacs mettra en surbrillance celle-ci dans les 2 tampons. Un autre n vous placera sur la différence suivante, etc. Comme vous pouvez le voir au moment du démarrage d'ediff
, le fait de taper sur ? vous permet de disposer d'un résumé des commandes.2.6 Lier des macros à des touches
Dans ce qui suit, je vous montrerai que vous pouver lier une macro clavier à une touche et sauvegarder cette association dans votre fichier
.emacs
.Vous devez d'abord définir une macro clavier, pressez C-x (, puis la suite de touches composant votre macro et terminez-la par C-x ). La macro est maintenant définie et peut être lancée par C-x e.
Trouvez un joli nom pour cette macro et pressez M-x name-last-kbd-macro, suivi du nom choisi. Vous avez donné un nom à votre macro.
L'étape suivante consiste à associer cette macro à une touche, ce qui se fait en tapant M-x global-set-key. Pressez la touche que vous voulez associer et tapez le nom de votre macro. Celle-ci sera maintenant exécutée à chaque fois que vous pressez cette touche.
Enfin, il faut sauvegarder ceci dans votre fichier
.emacs
afin que la macro soit définie au prochain lancement d'Emacs. Ceci est réalisé en éditant votre fichier.emacs
, en déplaçant le curseur à l'endroit où vous souhaitez insérer cette définition et en pressant C-1 M-x insert-kbd-macro, puis le nom de votre macro. À partir de cet instant, la définition et l'association à une touche sont dans votre fichier.emacs
. J'admets que le code n'est pas très beau, mais il fonctionne et vous n'avez pas eu besoin d'apprendre le langage de programmation d'Emacs.2.7 Conseils à 100 balles
Quelles associations de touches existent dans le mode XX ?
Pour connaître les associations de touches pour un mode donné, pressez C-c C-h. Quasiment toutes les associations pour les différents modes majeurs commencent par le préfixe C-c. Donc, si vous tapez C-c C-h, Emacs vous montrera toutes les combinaisons possibles commençant par C-c.
Comment répéter 10 fois la même chose ?
Avez-vous jamais essayé d'insérer le même texte sur 10 lignes, en troisième position, ou quelque chose de ce genre ? search-and-replace ne s'applique pas ici et vous devez donc le faire manuellement... Faux : utilisez une macro !
Voici comment faire : pressez C-x (, pour lancer une définition de macro. Faites ce que vous devez faire pour une ligne et déplacez vous à la même position sur la ligne à traiter suivante, puis pressez C-x ). Vous avez maintenant défini votre macro et pouvez l'appliquer ligne par ligne en pressant C-x e autant de fois que nécessaire. Il y a mieux : si vous devez faire ça 1000 fois, cela risque de devenir ennuyeux... pressez simplement la touche ESC (Échap) puis entrez le nombre voulu de répétitions de la macro et, enfin, tapez C-x e et c'est parti.
Aide à la programmation Elisp
Vous avez sûrement remarqué que votre fichier
.emacs
est écrit dans un langage différent de ceux auxquels vous êtes habitués. Ce langage est Lisp auquel on a ajouté les commandes de l'éditeur pour qu'il devienne Emacs Lisp ou, plus simplement, elisp.Lorsque vous aurez commencé à jouer avec Emacs, vous vous demanderez peut-être : « Est-ce qu'Emacs peut faire cela pour moi ? », et la réponse est OUI. Emacs peut presque tout faire (sauf le café... POUR L'INSTANT), le problème est donc simplement de savoir comment. Pour répondre à cette question, vous disposez d'un outil très important : les pages
Info
sur elisp. Quand vous commencerez à vous intéresser à elisp, vous vous retrouverez brusquement avec l'une des fonctions d'elisp et à vouloir savoir ce qu'elle fait exactement. C'est très facile, il suffit de taper C-h C-f et Emacs ira droit à la page Info de cette fonction.Vous pouvez également rechercher une page Info pour une combinaison de touche donnée, par exemple « Que fait C-u ? ». Pressez C-h C-k C-u
Aide à la programmation ElispDécouper/compiler votre .emacs
Au fur et à mesure de votre apprentissage d'Emacs et des moyens de configurer ses différentes parties (en définissant des macros), votre fichier
.emacs
va grossir très vite et devenir très difficile à gérer. Pour éviter ce piège, vous pouvez découper celui-ci en plusieurs fichiers de la façon suivante :
Insérez les lignes suivantes dans votre
~/.emacs
original :
(load-file "~/.emacs-lib/general.elc") (load-file "~/.emacs-lib/macros.elc") (load-file "~/.emacs-lib/fonctions.elc") (load-file "~/.emacs-lib/dotfile.elc")
Désormais, tout est réparti dans plusieurs fichiers :
-  /.emacs-lib/general.el
contiendra contiendra des choses venant du fichier.emacs
original.-  /.emacs-lib/macros.el
contiendra toutes les macros clavier que vous avez définies (voir plus haut).-  /.emacs-lib/fonctions.el
contiendra les fonctions elisp que vous avez écrites.-  /.emacs-lib/dotfile.el
si vous utilisez le Dotfile Generator pour configurer Emacs, vous pouvez lui indiquer de sauvegarder ce qu'il a généré dans ce fichier.REMARQUE : Si le fichier source s'appelle
blahblah.el
, vous chargez dans votre fichier.emacs
la version compilée (byte compiled) qui s'appelleblahblah.elc
! Notez la différence des suffixes.Les fichiers doivent avoir été compilés (pour des raisons d'efficacité du code). Cela peut être fait automatiquement en insérant les lignes suivantes dans tous les fichiers emacs qui doivent être compilés :
;;; Variables locales : ;;; eval: (defun byte-compile-this-file () (write-region (point-min) \ (point-max) buffer-file-name nil 't) (byte-compile-file buffer-file-name) nil) ;;; write-file-hooks: (byte-compile-this-file) ;;; End:
Insérez cela tel quel et Emacs compilera le fichier lorsque vous le sauvegardez.
REMARQUE : vous devez quitter le tampon et le réouvrir avant que cela ne prenne effet pour la première fois.
Comment ai-je fait ça ?
Vous connaissez cette situation : vous vous amusiez avec Emacs ou vous avez simplement frappé votre clavier et, soudain, il s'est passé quelque chose que vous cherchiez à faire depuis des mois. Pressez C-h l, cela vous montrera les 100 derniers caractères que vous avez entrés.
Une petit pause publicitaire
J'ai tripoté Emacs un certain temps et cela m'a donné l'idée de créer un outil qui donnerait à l'utilisateur de base la possibilité de configurer beaucoup de choses pour Emacs sans avoir à en connaître beaucoup sur elisp, ou même sur la syntaxe de base du fichier
.emacs
.Mon patron a pensé que c'était une bonne idée et j'ai donc commencé à programmer. À peu près 6 mois plus tard, je disposai d'un outil appelé Dotfile Generator. Non seulement il peut configurer Emacs, mais c'est un outil de configuration plus général, avec des modules pour Emacs, Tcsh (le shell), et Fvwm (le gestionnaire de fenêtres : ce module a été écrit par Jeppe Buk).
Si vous débutez avec Emacs, ou si vous en avez simplement conclu qu'il était très configurable, récupérez mon programme. Voici son emplacement
Précédent Suivant Table des Matières
Copyright © 1996, Jesper Kjær Pedersen -- Publié dans la Linux-Gazette de Mars 1996.
Adaptation française : Éric Jacoboni.