Emacs
comme éditeur de texte.
Dans tout ce qui suit, on va regarder comment fonctionne Emacs
comme éditeur de texte. Toutefois, 80% des commandes citées vont pouvoir vous
servir par la suite dans d'autres parties comme le courriel, la gestion des
révisions, etc., bref tout ce qui fait appel à du texte et qui est
éditable (soit quasiment tout sous Unix :-)).
ATTENTION: la faute classique du débutant consiste à se mélanger
les pinceaux en écrivant une commande. Emacs
lance alors une
série de « bips » sonores (ou « flashe » l'écran suivant
les versions) et reste bloqué sur l'erreur. C'est très énervant lorsque l'on
ne sait pas en sortir :-(
Il existe une commande miracle qui annule toute commande en cours. Si vous devez en connaître une seule par coeur, cela DOIT être celle-ci:
C-g
Avec cela, vous êtes paré pour attaquer la suite :-)
Dans tout ce qui suit, on adoptera la convention suivante d'écriture:
le raccourci clavier (la fonction LISP appelée) : son explication.
(on rappelle que l'on peut utiliser la tabulation pour « finir » l'écriture d'un nom de fichier ou la commande elle-même sans raccourci.)
C-x C-f (C-x find-file): nom du fichier | ouverture d'un fichier. C-x i (C-x insert-file): nom du fichier | insertion d'un fichier à la | position courante du curseur. C-x s (C-x write-file) | sauvegarde du tampon courant. C-x C-w (C-x write-buffer): nom | sauvegarde dans un autre | fichier. C-x C-c (C-x save-buffers-kill-emacs) | sortie.
S'il existe un tampon qui n'a pas été sauvegardé lors de la sortie de
Emacs
, ce dernier demandera une confirmation avant de sortir: il
sera nécessaire alors de répondre explicitement « yes » pour
confirmer la destruction du tampon.
Tout Emacs
moderne et bien configuré vous permet de vous déplacer
pratiquement naturellement dans le texte à l'aide des fonctions intuitives du
clavier: les flèches. Mais comme toute action sous Emacs
, cela se
traduit par l'appel d'une fonction LISP
que, dans ce cas précis,
il n'est pas forcé de connaître :-)
Toutefois, comme tout éditeur de texte digne de ce nom, Emacs
vous
en propose beaucoup plus: saut de mots, de phrases, de paragraphes, déplacement
d'un bout à l'autre du tampon, etc. Toutes ces fonctions permettent un
gain de temps extraordinaire. La connaissance de l'anglais est précieux pour
se souvenir des commandes car leur traduction apporte une connaissance
immédiate de leur nature, et souvent de leur raccourci. Par exemple, la
commande:
C-f (M-x forward-char) : déplace le curseur d'un caractère à droite, soit en avant.
Or si l'on traduit « forward-char », on a mot-à-mot « avant-caract » où « caract » est un diminutif de « caractères » bien sûr ("char" pour "character" en anglais). Or le raccourci clavier est C-f, « f » pour « forward » donc très facile à retenir... pour l'anglophone. On vous avait prévenu, l'informatique n'est faite que pour eux...
Par la suite, on omettra le « C-x » ou
« M-x » de la commande Emacs
.
C-f (forward-char) : déplace le curseur d'un caractère à droite, soit en avant. C-b (backward-char) : déplace le curseur d'un caractère à gauche, soit en arrière (« backward » en bon anglais). C-n (next-line) : déplace le curseur d'une ligne suivante (« next ») C-p (previous-line) : déplace le curseur sur la ligne précédente (« previous »)
Ces quatre actions sont avantageusement remplacées par celle des flèches du clavier, bien plus simples et plus conviviales d'utilisation :-)
M-f (forward-word) : déplace le curseur d'un mot vers la droite... M-b (backward-word) : déplace le curseur d'un mot vers la gauche...
Un raccourci du raccourci consiste à utiliser les flèches droites et gauches avec la touche « CONTROL » enfoncée. C'est plus rapide encore :-)
Les plus curieux auront noté l'analogie évidente avec le déplacement d'un
caractère. En effet, Emacs
est logique et ne vas pas appeler un
chien un chat. On garde le « f » pour « forward »
et on change simplement sa portée: C-. On touche ici une petite
subtilité d'Emacs
. De façon générale, les commandes commençant
par « M- » ont une portée locale (ici le caractère) et
celle commençant par « C- » ont une portée plus
générale, plus « supérieure » (ici le groupe de caractères puisque
l'unité est le caractère, donc le mot :-)). C'est un moyen mnémotechnique de
plus de se souvenir des raccourcis clavier :-)
C-a (beginning-of-line) : déplace le curseur en début de ligne (« begin » , début en anglais) C-e (end-of-line) : déplace le curseur en fin de ligne (« end », fin en anglais)
Ceci est un exemple typique de commande réutilisable en dehors de votre éditeur, par exemple dans votre shell préféré.
M-a (backward-sentence) : déplace le curseur en début de phrase M-e (forward-sentence) : déplace le curseur en fin de phrase M-{ (backward-paragraph) : déplace le curseur en début de paragraphe M-} (forward-paragraph) : déplace le curseur en fin de paragraphe C-v (scroll-up) : avance d'un écran de texte M-v (scroll-down) : recule d'un écran de texte.
Ces deux commandes sont avantageusement remplaçables par les touches « page up » et « page down », c'est-à-dire les touches à droite de la touche « home » ou « début » suivant les claviers et la touche « fin » (ou « end »). C'est le mini-pavé au-dessus des flèches de direction.
M-> (end-of-buffer) : déplace le curseur en fin de tampon. M-< (beginning-of-buffer) : déplace le curseur en début de tampon.
On va voir ici la première différence entre GNU Emacs
et
XEmacs
. Il existe des autres raccourcis, suivant la version de
Emacs
que vous utilisez: Pour se déplacer en début et en fin de
tampon, il suffit de taper sur la touche « début »
(« home ») et « fin » (« end »)
sous GNU Emacs
tandis qu'il faut assortir cette touche de la
touche « CONTROL » sous XEmacs
.
(rien) (goto-line) numéro : place le curseur à la ligne <numéro>
En fait, il existe un raccourci pour XEmacs
(GNU
Emacs
ne l'implémente pas...). Il s'agit de M-g.
C-l (recenter) : place la ligne actuelle au centre de l'écran.
Vous allez me dire, si vous avez tenu jusque là, que c'est bien beau, mais cela fait beaucoup à retenir, que l'on se mélange les doigts, et que (argument suprême!), on a une souris et des ascenseurs et que l'on va aussi vite ainsi...
Non. Non. Non. Pour ce qui est de la maîtrise de ses doigts, seul l'entraînement pourra vous dépanner... Cent fois sur l'ouvrage... Quant à l'utilisation de la souris et des artifices de X, vous verrez qu'à l'usage, une fois maîtrisé l'ensemble des raccourcis, que vous serez bien plus rapide avec le clavier seul. Vous verrez...
DEL (backward-delete-char) : supprime le caractère précédent. C-d (delete-char) : supprime le caractère à la position du curseur
Il va de soit qu'un Emacs
bien configuré permet ces opérations à
l'aide des touches « backspace » (la touche fléchée au
dessus de la touche « Entrée »). La touche
« DEL » est la touche « Suppr » des clavier
azerty.
M-DEL (backward-kill-word) : supprime le mot précédent. M-d (kill-word) : supprime le mot sous le curseur C-k (kill-line) : supprime la fin de la phrase à partir du curseur. M-k (kill-sentence) : supprime la phrase sous le curseur. C-w (kill-region) : supprime une région (voir § suivant)
Un éditeur de texte n'en serait pas un si l'on ne pouvait travailler exclusivement sur une région du texte sur laquelle on travaille.
C-ESPACE (set-mark-command) : marque le début d'une région.
Pour prolonger la région, il suffit à partir de la commande précédente, de
parcourir le texte à l'aide de n'importe quelles commandes de déplacement de
Emacs
précédemment citées, en amont ou en aval. La région
s'arrête alors sous le curseur et englobe l'ensemble des lignes et caractères
comptés à partir du début de la région.
Par exemple, aller dans un paragraphe, se placer en début d'un mot, marquer la région, se déplacer de trois mots et taper C-w effacera les trois mots. Avec un peu de pratique, cette opération requière un temps très court...
Attention, sous XEmacs
, par défaut, la région passe en
grisé, ce qui permet un contrôle visuel. Sous GNU Emacs
, par
défaut, la coloration ne change pas. Il faut donc faire attention à ce que
l'on fait où activer l'option par défaut (voir § configuration
avancée).
C-x h (mark-whole-buffer) : marque tout le tampon M-h (mark-paragraph) : marque le paragraphe M-g (fill-region) : reformate le paragraphe.
Cette dernière commande est particulièrement utile: par défaut, comme tous les
éditeurs Unix, Emacs
travaille par ligne et n'introduit
pas de retour chariot lorsqu'il arrive au bord de l'écran droit. Si l'on
allonge la largeur de la fenêtre, le texte se reformate automatiquement, comme
pour un butineur HTML
. Cela n'est généralement pas gênant, sauf
pour le courriel, les niouzes ou certains textes que l'on veut spécialement
formater. Emacs
découpe alors automatiquement le texte pour qu'il
tienne dans les quatre-vingt colonnes réglementaires :-)
M-w (kill-ring-save) : copie une région sans destruction.
L'avantage de cette dernière commande sur C-w est que la région copié reste en place.
C-y (yank) : recopie sous le curseur la région copiée.
Pour copier, il faut marquer une région comme précédemment dit.
c-ESPACE (set-mark-command) : marque le début d'une région C-y (yank) : colle la région sous le curseur C-x r k (kill-rectangle) : supprime un rectangle en l'enregistrant C-x r d (delete-rectangle) : supprime un rectangle sans l'enregistrer C-x r y (yank-rectangle) : insère le dernier rectangle enregistré. C-x r o (open-rectangle) : insère un rectangle de blancs.
Ces quatre opérations sont très pratiques pour des couper dans un texte
comportant des données sous forme de tableaux. Une faiblesse de
Emacs
est qu'il n'est pas prévu de copier/coller de rectangle.
Pour ce faire, il est nécessaire de couper la partie à coller, la recopier
immédiatement puis aller la recopier ailleurs. Ce n'est pas pratique...
On doit bien perdre une demi-seconde pour les moins rapides :-)
Comment est défini un rectangle? Tout simplement de la même manière que la
région (Ouf!...). Vous délimitez le début de votre rectangle par son coin
supérieur gauche par C-ESPACE puis allez vous positionnez sur son
coin inférieur droit. Il ne reste alors plus qu'à taper une des commandes
précédentes qui n'agira que sur la partie rectangle. Les personnes utilisant
un marquage de couleurs pour les régions ne doivent pas se laisser surprendre
par le fait que tous les caractères situés entre le début du rectangle et la
fin seront marqués, y compris ceux n'appartenant pas au rectangle proprement
dit. Le marquage d'une région marque l'ensemble des caractères de cette
dernière: seule la commande suivante pourra trier l'information, c'est-à-dire
traiter toute la région (C-w par exemple) ou une partie rectangle
(avec C-x r k par exemple). Emacs
n'est pas
omniscient, malgré toutes ses qualités!
Il arrive parfois que l'on désire insérer un jeux de caractères identiques
devant un certain nombre de lignes. L'exemple caractéristique est de vouloir
commenter un certain nombre de ligne dans un programme ou fichier de
configuration. Le commentaire est typiquement le caractère « # »
(C
, C++
, Perl, Shell, ...) , « % »
(TeX, LaTeX, ...) et « ;; » (LISP
).
Pour cela, il faut taper:
C-x r t
à la fin de la région. Il apparaît alors dans la ligne de commande le prompt dans lequel on tape le(s) caractère(s) voulu(s) puis la touche « Entrée ».
Tout un paragraphe sur l'annulation, quelle richesse! Emacs
mémorise tout et donc vous autorise pas mal de retours en arrière. En fait,
tant que vous n'avez pas sauvegardé votre tampon, vous pouvez annuler TOUTES
les opérations que vous avez précédemment effectuées. Pas mal, non ?
C-g (keyboard-quit) : met fin à la commande en cours (PAR COEUR!!!) C-x u (advertised-undo) : annule la dernière action. Peut être répétée.
En fait, cette combinaison de touche est malaisée, si tant est que l'on désire plus d'une annulation (essayez et vous verrez...). Elle est alors avantageusement remplacée par C _ (la touche « _ », dite « underscore » en bon franglais). Il suffit de la laisser appuyer: ATTENTION, c'est rapide...
Enfin, pour revenir directement dans l'état initial du tampon, il faut taper:
C-x revert-buffer
C-t (transpose-char) : transpose deux caractères M-t (transpose-word) : transpose deux mots C-x C-t (transpose-lines) : transpose deux lignes (rien) (transpose-sentences) : transpose deux phrases (rien) (transpose-paragraphs): transpose deux paragraphes
M-c (capitalize-word) : met la lettre sous le curseur en majuscule sinon la première lettre du mot suivant. M-u (upcase-word) : met le prochain mot en majuscule. M-l (downcase-word) : met le prochain mot en minuscule. C-x C-u (upcase-region) : met la région en majuscule. C-x C-l (downcase-region) : met la région en minuscule.
Un éditeur de texte sans un moteur de recherche d'expression évoluée n'est pas un réel éditeur de texte. On distingue deux types de recherche: la recherche d'une chaîne définie et d'une expression rationnelle.
On appelle « chaîne simple », toute expression dont on connaît chaque caractère, ou au moins le début de la chaîne de caractères. Pour rechercher dans ce cas-là, il suffit de taper:
C-s (isearch-forward) : lancement ou répétition d'une recherche incrémentale vers l'avant. C-f (isearch-backward) : lancement ou répétition d'une recherche incrémentale vers l'arrière. Entrée : Quitte une recherche réussi. C-g (keyboard-quit) : quitte une recherche et revient au point de départ. Suppr : supprime un caractère incorrect de la chaîne recherchée.
Concrètement, pour rechercher une chaîne de caractères, vous taper C-s (ou C-f suivant le sens de la recherche) puis le début de la chaîne. Si vous cherchez les occurrences du terme « Linux », vous avez deux solutions:
Pourquoi ne pas taper toute la chaîne ? C'est une question de méthode. Si
vous recherchez la chaîne « Linux » dans un texte, la probabilité de
trouver un terme contenant « lin » est faible (mais loin d'être
nulle). Or vous vous apercevrez que dès que vous tapez le début de votre
chaîne à rechercher, Emacs
commence déjà la recherche et se place
automatiquement sur le mot (ou la partie de mot) correspondant. Souvent, il
est plus aisé (et moins fatigant!) d'itérer la recherche suivante (en appuyant
une nouvelle fois sur C-s ou C-f suivant ce que vous
avez tapé au début) que de finir la chaîne de caractères. On répète que
l'informatique est là pour faire le boulot à votre place, alors profitez-en !
On se balade ainsi dans tout le tampon jusqu'à avoir trouvé la bonne chaîne.
On ne connaît pas toujours la description exacte de la chaîne recherchée. On a vu précédemment que l'on pouvait déjà rechercher une chaîne qui comportait des majuscules ou des minuscules. C'est un début de recherche « dans le doute » mais cela reste très limitée.
Les expressions rationnelles (« regular expression » en
anglais[3]) sont un des
« dadas » d'Unix et d'une myriade d'outils tournant autour
(sed
, awk
, Perl, vi
,
etc...). Cela permet de désigner une expression par ce qu'elle
pourrait contenir, bref son gabarit et non plus sa forme exacte.
Emacs
est alors capable de rechercher toutes les expressions se
rapportant à ce gabarit. La seule difficulté consiste à apprendre la syntaxe
du gabarit. Après, c'est enfantin... et d'une puissance redoutable.
M-C-s RETURN (re-search-forward) : recherche en avant à l'aide d'une expression rationnelle. M-C-f RETURN (re-search-backward) : recherche en arrière à l'aide d'une expression rationnelle. M-C-s (isearch-forward-regexp) : recherche incrémentale en avant à l'aide d'une expression rationnelle. M-C-f (isearch-backward-regexp) : recherche incrémentale en arrière à l'aide d'une expression rationnelle.
Pour la désignation du gabarit, voici la syntaxe:
^ : début de ligne $ : fin de ligne . : n'importe quel caractère .* : n'importe quelle suite de caractères, même vide. \< : début de mot \> : fin de mot [] : n'importe quel caractère contenu dans l'intervalle.
Cela parait compliqué mais cela est assez simple. Il suffit de « penser » sa recherche. Par exemple, je veux tous les mots ayant les propriétés suivantes: en tête de ligne, commençant soit par une lettre minuscule et comportant 5 caractères. Il suffit dès-lors de décomposer sa pensée:
- en tête de ligne ---> ^ - commençant (donc début de mot) ---> \< - par une minuscule donc intervalle entre a et z ---> [a-z] - comportant 5 caractères (on a déjà le premier ) ---> ....
soit l'expression rationnelle: ^\<[a-z]....
Avouez qu'il est plus facile de la trouver que de la lire, n'est-ce pas ? Le système est extrêmement puissant et facile d'utilisation. Essayez-le et vous l'adopterez.
Une dernière petite chose: pour chercher les caractères \, <, >, ., ^, [
et ], il faut les « protéger » de façon à ce que Emacs
ne les interprète pas comme une commande d'expression rationnelle. Pour ce
faire, il faut utiliser le \ (« anti-slash » ou barre
oblique) accolé au caractère que l'on veut protéger. Il faut répéter
l'opération autant de fois que de caractères spéciaux sont en jeu et doivent
être reconnu comme des caractères normaux.
Une des nombreuses fonctionnalités de Emacs
est d'offrir une
interface à un correcteur orthographique bien connu du monde Unix, à
savoir ispell
. Alors, pourquoi s'en priver, d'autant plus qu'il
est si facile de s'emmêler les doigts sur un clavier :-)
ispell
offre un choix varié de dictionnaire, dont un français
(deux même !). Par défaut, le dictionnaire est évidemment... anglais.
C'est bon, je vois que certains commencent à suivre :-). Il est aisé d'en
changer et d'installer un dictionnaire plus en accord avec la langue de
Molière. On peut même en cumuler plusieurs, suivant les besoins. Leurs
installations concernent votre distribution. Je ne saurai trop vous
recommander Debian car toutes ces opérations sont gérées très simplement, et
sans effort.
On supposera ici que votre dictionnaire est bien installé.
M-$ (ispell-word) : vérifie le mot situé sous ou après le curseur. (rien) (ispell-region) : vérifie tous les mots d'une région. (rien) (ispell-buffer) : vérifie tout le tampon. (rien) (ispell-message) : ne vérifie que le message dans le cas d'un courriel. C-u M-$ (ispell-continue): reprend le processus ispell précédemment arrêté par un C-g
Lors d'une vérification, ispell
s'arrête sur tous les mots qu'il
ne connaît pas et prend au choix une des deux attitudes suivantes. Soit le mot
est correct, mais n'appartient pas à son dictionnaire (comme un nom propre, un
sigle, etc.) et vous lui demandez de passer au suivant avec la touche
« espace », soit le mot est erroné et il vous en propose plusieurs
corrections. Chaque mot est précédé d'un chiffre entre parenthèse et il vous
suffit de taper le chiffre correspondant à la bonne correction et
Emacs
fera la substitution. Vous n'avez plus d'excuse pour
laisser des fautes de frappes après cela...
p.karatchentzeff@free.fr