Previous Next Table of Contents

4. Fonctionnalités avancées

4.1 La mise en page, l'indentation

Quand vous êtes en C-mode (traduit par le fait de voir C en major mode (cf structure de l'écran) dans la région modeline), Emacs peut indenter automatiquement votre code (comme le programme indent).

Il suffit de taper TAB (qui ne réalise par de tabulation du coup) et la ligne s'indente automatiquement.

Là encore vous pouvez configurer les valeurs des indentations (en nombre d'espaces) cf doc de emacs.

Vous pouvez aussi ne pas avoir à taper sur TAB en réglant une valeur (cf configurer emacs), et du coup à chaque fin de ligne quand vous tapez sur RET il se place directement là où il faut.

Vous pouvez indenter toute une région en la sélectionnant (comme quand on veut la couper, cf édition basique), puis tapez M-x (cf fonctions utiles) suivit de indent-region.

Ainsi, si on vous donne du code mal indenté, tapez : C-x h ce qui sélectionne tout le contenu du buffer, puis M-x indent-region (note : cela peut parfois prendre du temps, alors prenez patience) .

Notez que parfois vous avez l'impression que Emacs indente mal. C'est que vous avez un problème dans votre code (accolade ou parenthèse fermante manquante etc...). Ainsi ça permet de voir les problèmes de syntaxe de votre programme sans lancer le compilateur (qu'il est fort ce Emacs !).

4.2 Remplacer un mot par un autre

Tapez M-%, puis votre premier mot mot1 RET puis le second mot2 RET. Emacs placera le pointeur sur la première occurrence de mot1. Tapez alors y ou n, puis il ira sur l'occurrence suivante. Tapez alors y ou n et ainsi de suite.

Pour ne pas avoir à dire y à chaque fois, tapez ! au lieu de y.

Il est possible de remplacer des regexps (regular expression ou expression régulière) par un mot (très puissant). Par exemple remplacer tous les MOTS dede par menfout : tapez M-x replace-regexp puis \<dede\> RET puis menfout RET (\< veut dire début de mot et \> fin de mot).

Puissant, non ? Et c'est pas fini, le meilleur est à venir.

Les expressions régulières sont un concept UNIX très important et très puissant. Pour plus d'informations voir dans le manuel hypertexte de Emacs (cf doc de emacs) le noeud searching and replacement.

4.3 Completion bis, le retour

Nous avons déjà vu que Emacs aidait l'utilisateur à compléter les mots dans le minibuffer. Il peut le faire aussi dans les fichiers. Il suffit de taper les premières lettres d'un mot, par exemple pad puis M-/ et alors il complétera par padioleau (si le mot est présent dans le buffer courant ou dans les autres).

Fantastique. Ainsi, imaginez que vous faites du C++ (y a des masos partout), et que vous voulez appeler une fonction déclarée plus haut (ou plus bas) dans le fichier ou dans un autre fichier (ouvert par Emacs). Vous savez que la fonction commence par fo. Tapez fo puis M-/ et avec un peu de chance il complétera par foobar. Si ce n'est pas le cas, retapez sur M-/ jusqu'à ce qu'il trouve, si il ne trouve pas c'est que cette fonction n'est dans aucun des buffers.

4.4 Les couleurs sous Emacs

Emacs peut rendre votre code plus lisible pour vous, en y ajoutant des couleurs. Il beautifie votre code. Les couleurs sont accessibles uniquement sous X (XEmacs gère aussi la couleur en mode console).

Ainsi les commentaires seront en rouge, les mots clés en jaune, etc...

Pour rendre votre code beau tapez M-x font-lock-mode RET. Ceci fera rentrer le minor mode Font dans modeline(cf structure de l'écran). Si votre code n'est toujours pas beau, essayez M-x font-lock-fontify-buffer.

Le problème c'est que vous devrez taper pour chaque buffer M-x font-lock-mode. Mais ceci est paramétrable dans le fichier .emacs (cf configurer emacs).

En plus des couleurs, XEmacs gère des fontes différentes pour telle ou telle entité (commentaires, mots clés, etc...). Le choix des couleurs est bien sûr lui aussi paramétrable (c'est pas compliqué, sous Emacs tout est paramétrable).

Pour voir la liste des faces (note : une face représente l'entité. par exemple la face-comment est la face qui gère les attributs des commentaires) et leurs attributs tapez M-x list-faces-display.

4.5 Rectangles

Le problème est le suivant : imaginez que vous avez ceci

   
   essai a la con c est cool
   essai d la cin c est cool
   essao a la cun c est cool
   essaa i la con c est cool
   
et que vous voulez remplacer les 3 premières colonnes par dede. La région concernée est un rectangle. Une solution est de faire une macro (cf macro), mais il y a plus simple : les rectangles.

C'est pas facile à faire avec les fonctions standards comme couper, copier, coller (cf édition basique). La démarche c'est de se placer en haut à gauche du rectangle (sur le "e" de essai de la première ligne ), de taper C-ESPACE (classique, on dépose une marque comme en édition basique), puis de se déplacer en bas à droite du rectangle et de taper C-x r k qui va couper le rectangle (que l'on peut réinsérer à un autre endroit par C-x r y).

On obtient

   con c est cool
   cin c est cool
   cun c est cool
   con c est cool
   
Puis on refait un rectangle (avec C-ESPACE) du premier "c" au "c" de la dernière ligne, et on tape C-x r t (note : cette fonction est très pratique pour mettre en commentaire un ensemble de lignes qui se suivent (en mode bash par exemple avec comme commentaire "#") ) puis dede RET, et Ooooh magique ça marche.
   dedecon c est cool
   dedecin c est cool
   dedecun c est cool
   dedecon c est cool
   

Il n'existe pas de fonction pour copier un rectangle (on ne peut que les couper). Ainsi la méthode est de couper le rectangle comme d'habitude, puis de faire un undo avec C-/ (cf undo).

4.6 Macro

Il arrive que vous ayez à répéter plusieurs fois une séquence de touches. Pour gagner du temps Emacs met à notre disposition les macros. Tapez C-x ( puis votre séquence de touches puis C-x ), et votre macro est enregistrée. Pour l'appeler tapez simplement C-x e.

4.7 Les TAGS : très important

Le but est de trouver l'endroit où est définie une fonction rapidement. Comment ? Réponse : les TAGS. Démonstration : imaginons que vous avez un projet avec 4 fichiers contenant du C : foo1.c foo2.c bar1.c foobar.c et des fichiers .h.

Si vous voulez revenir dans votre précédent buffer, tapez C-x b (cf multiple buffer) puis foo.c (ou RET si la valeur default est bonne).

Le programme etags reconnaît un certain nombre de langage, dont le C, C++, Java, Pascal, LaTeX, Scheme, Prolog, assembleur etc ...

4.8 Compiler sous Emacs

Sous les environnements Borland de développement, quand vous compilez votre projet et que le code souffre d'erreurs de syntaxe (ou de type) l'éditeur Borland place le pointeur directement sur l'erreur. Sous Emacs c'est pareil (mais en mieux).

Pour compiler tapez M-x compile RET.

Il vous demande alors la commande de compilation (souvent make mais peut être aussi gcc foo.c etc..), rentrez la commande puis RET (ou RET tout court si vous voulez faire un make), et là vous voyez dans une fenêtre le déroulement de la compilation (et souvent les erreurs).

Pour aller à la première erreur, soit vous repérez à quelle ligne s'est produite l'erreur, et vous y allez à la main (approche textedit), soit vous tapez C-x `. Emacs place alors votre pointeur à la ligne où c'est produite l'erreur. Corrigez, puis pour aller à la prochaine erreur retapez encore C-x ` et ainsi de suite.

4.9 Débugger sous Emacs

On peut très facilement débugger sous Emacs (un peu comme sous Borland). Compilez votre programme avec -g (note : pour que le binaire contienne des infos de débuggage) et au lieu d'utiliser gdb tout seul (sans Emacs), tapez sous Emacs M-x gdb RET. Vous voilà alors comme si vous étiez sous gdb classique. Tapez b main RET (break-point sur main), puis r RET (run), et là magie, vous voyez deux fenêtres, une sous gdb et l'autre contenant le fichier.c qui contient la fonction main, ainsi qu'une petite flèche vous indiquant où vous êtes dans votre programme (magique).

Vous pouvez alors taper les commandes classiques de gdb (b break-point, c pour continue (va au prochain break-point), n pour prochaine instruction (next), s pour rentrer dans une fonction, f pour finish pour sortir de la fonction, etc... cf doc de gdb) et votre petite flèche bougera en même temps que vous tracez votre programme.

4.10 Shell

Vous n'êtes pas obligé de quitter Emacs pour lancer des commandes shell.

Tapez M-x shell RET et vous voilà avec un buffer de nom *shell* où vous pouvez taper vos commandes.

Ce buffer est un buffer comme un autre (les copier couper et touti quanti sont disponibles, la completion aussi). De plus vous avez l'historique des commandes en tapant M-p et M-n (Previous et Next). Ceci est très utile avec camllight par exemple qui lui ne possède pas d'historique dans son interface. Ainsi tapez M-x shell RET, puis camllight RET et vous entrez sous camllight. Vous pouvez alors faire des copier coller de votre source CAML dans ce buffer, le faire interpréter par CAML, puis tapez M-p pour avoir la dernière commande.

4.11 Rcs, le gestionnaire de versions

Emacs offre un environnement de travail avec rcs très facile. Après avoir créé un répertoire RCS dans le répertoire de votre projet, tapez simplement C-x v v. Vous voyez à présent dans modeline (cf structure de l'écran) RCS:1.1.

Pour archiver une nouvelle version, retapez C-x v v. Il vous demande alors de décrire les changements apportés. Après avoir fini de taper vos commentaires tapez C-c C-c. Vous voyez ainsi dans modeline que le numéro de version a changé, et que le fichier est en lecture seule car on voit %% dans modeline ( Voir structure de l'écran). Retapez encore C-x v v et c'est impeccable.

Pour revoir une version antérieure, tapez C-x v ~ puis un numéro de version.

Rcs est un outil permettant de gérer un projet plus efficacement, mais il nécessite des connaissances qui sortent du cadre de ce tutorial. Pour plus d'informations voir la page man de rcs, et la documentation de Emacs (cf doc de emacs) dans le noeud Version Control.

4.12 Vérificateur orthographique

Comme sous certains logiciels Micr...t, il est possible sous Emacs d'effectuer une vérification orthographique. Il suffit de disposer du programme ispell (note : non fournie avec Emacs) et du dictionnaire orthographique de la langue. Pour lancer la vérification sur un fichier tapez M-x ispell-buffer. Emacs vous demandera dès qu'il trouve une erreur de donner une réponse. L'écran se scinde en deux, et dans la fenêtre du haut on peut voir un certain nombre de choix et des couples mot-nombre. Si l'un des choix proposés vous va, tapez alors le nombre correspondant au mot. Si aucun choix n'est donné alors tapez sur R si vous voulez corriger le mot. Si le mot est selon vous bien écrit tapez sur ESPACE. L'ennui c'est que selon lui ce mot est mal écrit, et donc si il le rencontre encore, il vous requestionnera. La solution est de taper sur a au lieu de ESPACE. Si vous voulez insérer le mot dans votre propre dictionnaire (ispell ne connaît pas tous les mots) tapez sur i. On peut aussi:

Si vous voulez que Emacs prenne le dictionnaire français, tapez M-x ispell-change-dictionary puis francais. Voir aussi configurer emacs.

4.13 Configurer Emacs avec le .emacs

Pour configurer Emacs, il suffit d'écrire en LISP certaines commandes dans le fichier .emacs. Comme la plupart des autres outils UNIX, le comportement de Emacs dépend d'un fichier .qqchose dans le répertoire de l'utilisateur.

Ainsi créez un fichier .emacs dans votre répertoire HOME, et écrivez vos fonctions dedans.

prenons comme exemple une partie de mon fichier .emacs :

   (global-font-lock-mode t) ;pour avoir les couleurs sans avoir à taper font-lock-mode
   (setq font-lock-maximum-decoration t) ;maximum de couleurs
   (setq font-lock-maximum-size nil)
   (transient-mark-mode t) ;pour que la région sélectionnée soit mise en surbrillance
   (setq compilation-window-height 10) ;pour que la fenêtre de compilation ne soit pas trop grande
   (standard-display-european 1)   ;pour avoir les accents
   (setq ispell-dictionary "francais") ;dictionnaire français par défaut
   (defun padcomment()
     "pad comment"
       (interactive)
       (newline)
       (insert "/***********************************************")
       (newline)
       (insert "** **")
       (newline)
       (insert "***********************************************/")
       (previous-line 1)
       (forward-char 2)  
  )
  (setq c-mode-hook ;fonction appelée des que l'on ouvre un fichier .c
      '(lambda ()
         (setq c-auto-newline t) ; pour que l'on n'ait pas à taper sur TAB pour indenter
         (message "modifie par pad")
         (define-key c-mode-map "\C-c\C-i" 'padcomment) ;bind à la touche C-c C-i la fonction pad-comment
         ))
   

Vous me direz c'est pas évident de savoir que c'est telle variable qui fait telle chose. Comment faire pour réussir ?


Previous Next Table of Contents