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
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 !).
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
.
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.
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
face-comment
est la face qui gère les attributs des commentaires)
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 coolet 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 coolPuis on refait un rectangle (avec C-ESPACE) du premier "c" au "c" de la dernière ligne, et on tape C-x r t
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).
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.
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.
% etags *.c *.hce qui générera un fichier TAGS qui contient des infos sur : quel fichier contient la définition de telle fonction.
func_dede
déclarée dans foobar.c et
que vous voulez voir le corps de la fonction func_dede. Placez votre pointeur sur
le "f" de func_dede.Find tag:(default func_dede)
, ce qui veut dire
qu'il attend le nom d'une fonction, mais que si vous lui donnez rien il prendra la valeur default (ici func_dede,
ça tombe bien).
Ainsi tapez RET (puis RET pour lui confirmer que vous voulez prendre le fichier TAGS comme base de données),
et magie, Emacs ouvre le fichier foobar.c et place le pointeur là où il faut.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 ...
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.
On peut très facilement débugger sous Emacs (un peu comme sous Borland).
Compilez votre programme avec -g
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.
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.
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
.
Comme sous certains logiciels Micr...t, il est possible sous Emacs d'effectuer une vérification
orthographique. Il suffit de disposer du programme ispell
Si vous voulez que Emacs prenne le dictionnaire français, tapez M-x ispell-change-dictionary puis francais. Voir aussi configurer 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 ?