%title Bien utiliser la marque et la région %keywords emacs/index %comment Un petit tutoriel rapide sur l'utilisation de la marque et de la région pour se repérer et se déplacer dans Emacs. %id $Id: bien-utiliser-marques.text,v 1.4 2008/05/24 12:19:40 minh Exp $ %copyright Copyright (c) 2008 Nhat Minh Lê 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. = Terminologie [term] 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+(en). 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/. == Analogie avec les éditeurs païens [editeurspaiens] 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. = +First encounter:+(en) la marque et la région pour les païens [paiens] 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+(en) (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+(en) 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+(en), 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+(en) (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+(en) («~cercle de meur...~» arrêtons avec les traductions). Chaque +kill+(en) 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 = +Second offence:+(en) utilisations (relativement) avancées [avanc] == Utiliser la marque pour se déplacer [depl] 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+(en). 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+(en) | `M->` | fin de +buffer+(en) | `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+(en) 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+(en). 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](a:intro-conf) 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+(en) qui sauvegarde la marque la plus récente dans chaque +buffer+(en) visité, dans l'ordre de leur visite. Cela vous permet d'aller d'un +buffer+(en) à 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+(en). # Remarque : Conseil 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+(en), 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 == Restriction de portée avec la région [portee] 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+(en) mais peuvent être limitées à une zone particulière. Les premières ont très souvent des noms qui comportent le mot +region+(en), 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 = +Final battle:+(en) utiliser la marque et la région au bon moment [quand] 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 ! %-