Comme j’en ai un peu marre d’écrire des tutoriels longs et plein d’informations pour me faire devancer par des articles de dix lignes (je parle du Site du Zéro), j’ai décidé d’écrire un petit tutoriel léger sur l’utilisation de la marque et de la région dans Emacs.
Tout d’abord, si vous ne savez pas ce qu’est la marque ou la région, c’est que vous n’avez pas lu d’introduction à Emacs, ou que vous l’avez mal lue, ou qu’elle n’était pas bonne. Mais oublions ce petit détail ; je vais vous rappeler ce que sont ces éléments.
Petite explication. Dans votre fenêtre Emacs, vous avez un curseur, qui marque la position actuelle dans le buffer. C’est là où vous insérez le nouveau texte, entre autre. Et bien, vos yeux vous mentent, car il y a en vérité non pas un mais deux curseurs. Simplement, vous ne voyez pas le second. Son nom ? La marque. La marque, comme son nom l’indique, sert à repérer une position dans le texte. Comme nous allons le voir par la suite, cela a plus d’un emploi, mais l’utilisation première est de délimiter une zone : entre la marque et le point (dans la terminologie emacsienne, le point est la position du curseur, tandis que le curseur lui-même est l’entité visuelle colorée, qui peut clignoter, ou pas). Cette zone s’appelle la région.
Il existe beaucoup d’éditeurs graphiques, mais cette diversité cache en fait des concepts similaires sans aucune originalité (il paraît que c’est pour ne pas désorienter le débutant). Parmi ceux-ci en existe un du nom de sélection. Bon, la sélection, c’est la chose que vous obtenez lorsque vous surlignez un bout de texte avec votre souris. Hormis le fait qu’elle revêt alors une jolie couleur, elle sert aussi à certaines opérations de portée locale, telles que la copie, la coupure, etc.
Sous Emacs, la région est ce qui s’en rapproche le plus, mais comme nous allons le voir, son comportement diffère quelque peu.
Quant à la marque, il semble qu’elle ait disparu au profit de techniques tout à fait modernes faisant plein usage du matériel contemporain : le défilement et le pointage à la souris.
La première chose que tout le monde (moi y compris) essaie de faire avec la marque et la région est de sélectionner du texte. Par sélectionner, j’entends « faire comme dans un éditeur graphique ». Ce n’est pas un mal en soi : c’est l’usage le plus fondamental.
La commande pour poser la marque est C-SPC (ou C-@ si vous avez un
terminal tellement ésotérique qu’il ne reconnaît pas C-SPC comme un
alias de C-@). C-SPC correspond à la combinaison des touches
Ctrl et espace, pour les petits étourdis. Essayez. Un petit message
devrait s’être affiché dans le minibuffer (la zone de saisie en
bas de votre Emacs, pour les grands grands étourdis). Ce message mis
à part, vous ne devriez rien avoir remarqué de particulier. En effet,
comme je vous l’ai dit, la marque est invisible. Déplacez-vous un peu
dans votre buffer et bientôt, vous aurez oublié où vous l’avez
placée. La deuxième commande utile est donc celle qui vous indiquera
où se trouve la marque ; une façon commode d’obtenir cette information
est d’échanger la marque et le point : en d’autres termes, de vous
téléporter là où se trouve la marque et de placer la marque où vous
vous trouvez actuellement. La commande est C-x C-x. L’opération
étant symétrique, un deuxième C-x C-x vous ramènera à votre point de
départ.
Nous allons maintenant voir les deux opérations de base sur la région
(qui, je vous le rappelle, est automatiquement délimitée par la marque
et le point) : la copie et la coupure. Dans le monde d’Emacs, le terme
exact est kill, soit « tuer », en bon français. Allez savoir
pourquoi les interfaces modernes n’ont pas conservé ce
vocabulaire… Sans plus attendre, les commandes : C-w pour couper,
M-w (dois-je rappeler qu’il s’agit de Alt et w sur un clavier)
pour copier.
Pour coller le texte ainsi extrait, vous pouvez utiliser la commande
C-y ; le terme exact pour dire « coller » est en vérité yank
(dont la traduction est approximativement « tirer avec
force »). Sachez également que vous disposez d’un historique des
morceaux copiés ou coupés, appelé kill ring (« cercle de
meur… » arrêtons avec les traductions). Chaque kill est
automatiquement placé dans celui-ci. Juste après avoir utilisé C-y,
vous pouvez parcourir l’historique avec la commande M-y. Le texte
collé est alors remplacé par une des sélections précédentes ; répétez
jusqu’à obtenir le morceau voulu. Remarquez que la commande accepte
les arguments numériques. Cela n’a guère d’intérêt en temps normal
(sauf si vous vous rappelez par cœur l’ordre de vos sélections
passées), mais cela signifie surtout que vous pouvez utiliser M--
M-y pour naviguer en sens inverse, si vous sautez par mégarde le bon
élément.
En résumé :
C-SPC ou C-@ | pose la marque |
C-x C-x | échange la marque et le point |
C-w | coupe la région |
M-w | copie la région |
C-y | colle le texte coupé ou copié |
M-y | navigue dans l’historique des morceaux coupés ou copiés |
Dans Emacs, la marque a d’autres usages que la simple
sélection. L’autre utilité majeure de la marque est le déplacement. Un
certain nombre de commandes de navigation (recherche, déplacements sur
de longues distances, etc.) déposent la marque à l’endroit où vous
vous trouviez avant l’action. Si c’est le cas, un petit message vous
en informe, dans le minibuffer. Vous pouvez ainsi compter sur
C-x C-x pour retourner à votre position précédente. Essayez, par
exemple, la commande M-< suivi de la commande C-x C-x. Voici
quelques commandes usuelles qui placent la marque :
M-< | début de buffer |
M-> | fin de buffer |
C-s | recherche |
C-M-s | recherche (avec des expressions régulières) |
C-r | recherche en arrière |
C-M-r | recherche en arrière (avec des expressions régulières) |
Cette astuce est suffisante pour aller d’un bout à l’autre du
buffer tant que vous ne changez pas la position de la marque, ce
qui n’est guère pratique pour l’édition. Mais comme Emacs est bien
fait, il existe un historique des positions auxquelles vous avez placé
la marque : c’est le mark ring. La commande servant à parcourir
la liste est la même que celle pour poser la marque, mais avec un
préfixe, c’est-à-dire C-u C-SPC. Elle vous téléporte au dernier
endroit où vous avez posé la marque. Son usage répété déroule toute la
liste.
Comme il est fastidieux de taper C-u C-SPC tout le temps pour aller
là où vous voulez, la variable set-mark-command-repeat-pop
existe. Donnez lui une valeur autre que nil (généralement t ; voir
mon article sur la configuration pour savoir comment
changer la valeur d’une variable), et vous pourrez abréger la commande
en simplement C-SPC, à partir de la seconde fois consécutive (la
première doit comporter le préfixe afin de la distinguer de la
commande normale de marquage).
Il existe aussi un global mark ring qui sauvegarde la marque la
plus récente dans chaque buffer visité, dans l’ordre de leur
visite. Cela vous permet d’aller d’un buffer à l’autre tout en
suivant la marque. Je ne fais pas grand usage de ce mécanisme, mais
peut-être y trouverez-vous un intérêt. La commande est C-x C-SPC et
est l’analogue de C-u C-SPC pour le global mark ring.
Une bonne habitude, selon moi, est de placer la marque quelque part, lorsque vous voulez effectuer une opération sur une autre partie du buffer, temporairement, puis revenir à votre travail « principal » ensuite. Si vous avez deux zones d’édition d’égale importance et fréquence, préférez les registres (qui ne sont pas le sujet de cet article, cependant).
En résumé :
C-x C-x | échange la marque et le point (rappel) |
C-u C-SPC | parcourt l’historique des marques |
C-x C-SPC | parcourt l’historique global des marques |
Au-delà du copier / coller, la région a comme autre principal usage la restriction de la portée de certaines commandes. Dans cette optique, il faut distinguer les commandes spécifiquement prévues pour un usage avec la région de celles qui agissent habituellement sur tout le buffer mais peuvent être limitées à une zone particulière.
Les premières ont très souvent des noms qui comportent le mot
region, par exemple : comment-region. En vérité, les commandes
C-w et M-w vues précédemment font partie de cette catégorie. En
voici quelques unes dignes d’intérêt :
C-M-\ (ou M-x indent-region) | indente la région |
M-x comment-region | commente la région |
M-x uncomment-region | décommente la région |
La seconde catégorie repose sur la notion de région active. Par
défaut, la région est passive : les commandes ne sont pas affectées
par sa présence. En effet, comme nous avons vu dans la section
précédente, il est courant de laisser traîner la marque à des fins de
repérage et de déplacement, et il serait dérangeant que toutes les
opérations se restreignent à cette zone. Il existe plusieurs manières
d’obtenir une région active. Je vais en décrire deux, sans doute les
plus faciles à mettre en œuvre. Tout d’abord, si vous avez déjà marqué
une région et souhaitez la rendre active, tapez C-u C-x C-x. Si au
contraire, vous voulez sélectionner une région active à partir du
point jusqu’à une autre position, au lieu de déposer la marque comme
d’habitude avec C-SPC, faites plutôt C-SPC C-SPC : en plus
d’apposer la marque, cette commande active la région entre celle-ci et
le point. Une fois l’activation effectuée, vous pouvez vous déplacer
pour l’agrandir ou la rétrécir, le surlignement vous rappelle qu’elle
est bien active. C-g annule ce mode et retourne la région à son état
passif.
Les commandes les plus importantes travaillant sur la région active
sont sans doute les commandes de remplacement, interactives (M-% et
C-M-% (avec des expressions régulières)) ou non interactives
(replace-string et replace-regexp). Aussi, la commande d’insertion
de commentaires (M-;) se transforme en comment-region si la région
est active. Du reste, regardez s’il est fait mention de la région
active, dans la description des fonctions, pour repérer celles qui
tiennent compte de ce mécanisme.
En résumé :
C-u C-x C-x | active la région actuelle |
C-SPC C-SPC | pose la marque et active la région |
C-g | retourne la région au mode passif |
M-% | remplacement interactif |
C-M-% | remplacement interactif avec des expressions régulières |
M-x replace-string | remplacement |
M-x replace-regexp | remplacement avec des expressions régulières |
M-; | insère un commentaire ou commente la région active |
Bien, maintenant que vous savez utiliser la marque et la région correctement, il est temps d’apprendre à les utiliser judicieusement. Lorsque l’on débute, on a tendance à utiliser la sélection pour tout et n’importe quoi, un peu comme dans un éditeur païen.
Exemple concret : vous voulez couper le mot suivant dans le
texte. L’utilisateur bêta sous l’éditeur bêta attrape sa souris,
sélectionne le mot, et le coupe en utilisant le menu
contextuel. L’utilisateur gamma sous l’éditeur gamma sait qu’il y a un
raccourci au clavier pour se déplacer de mot en mot et un autre pour
sélectionner au fur et à mesure que l’on se déplace, par exemple
quelque chose comme « je maintiens Shift tout en appuyant sur Ctrl
et sur la flèche droite » ; puis il coupe grâce au magique
« Ctrl-X ». Le même cheminement, sous Emacs, donne C-SPC M-f
C-w. On progresse, mais ce n’est toujours pas ça. En vérité, couper
le mot suivant est le fait d’une seule commande : M-d.
Ce que je veux vous dire par là est qu’il ne faut pas abuser de la région, si vous n’en avez pas besoin. Il existe trente-six façons de tuer dans Emacs : vous pouvez couper des mots, des lignes, et plein d’autres choses ! Pour vous aider à ne pas utiliser la marque et la région pour n’importe quoi, voici une petite liste de commandes usuelles :
M-d | coupe le mot suivant |
M-DEL | coupe le mot précédent |
C-k | coupe la fin de la ligne ou la ligne entière si elle est vide |
C-M-k | coupe l’expression équilibrée débutant au point |
M-z | coupe jusqu’à un caractère donné |
Aussi, n’oubliez pas que certaines commandes placent la marque pour
vous, comme la recherche ; il est inutile donc de la poser deux
fois. Si, par exemple, vous souhaitez effacer le texte jusqu’à un
certain mot, faîtes donc une recherche sur ce mot, avec C-s, puis
tapez RET pour arrêter la recherche ; C-w coupera la région ainsi
délimitée.
Enfin, lorsque vous aurez maîtrisé les astuces présentées ici, vous aurez peut-être trop tendance à en dépendre ; par exemple, l’historique des marques est très pratique, mais si vous vous retrouvez à placer des marques de partout pour vous repérer et sentez que la navigation perd en efficacité, je vous conseille d’essayer d’utiliser les registres.
Sur ces quelques conseils pratiques s’achève ce court tutoriel sur l’utilisation d’Emacs. La prochaine fois, je parlerai de… ce qui me passera par la tête, je ne sais pas bien encore !