14.7. Commandes de Remplacement

Les opérations de recherche et remplacement globales ne sont pas aussi utiles sous Emacs qu'elles le sont avec d'autres éditeurs[1], mais elles sont disponibles. En plus de la commande simple M-x replace-string identique à celle trouvée dans la plupart des éditeurs, il existe une commmande M-x query-replace qui vous demande, pour chaque occurence du motif recherché, s'il faut le remplacer.

Les commandes de remplacement opérent normalement sur le texte entre le point et la fin du tampon ; cependant, dans le mode de Marque Transitoire, lorsque la marque est active, elles opérent dans la région. Les commandes de remplacement remplacent toutes une chaîne (ou une regexp) avec une chaîne de remplacement. Il est possible d'exécuter plusieurs remplacements en parallèle en utilisant la commande expand-region-abbrevs (Section 26.3).

14.7.1. Remplacement Inconditionnel

M-x replace-string RET chaîne RET nouvelle chaîne RET

Remplace toute occurence de chaîne avec nouvelle chaîne.

M-x replace-regexp RET regexp RET nouvelle chaîne RET

Remplace toute correspondance de regexp avec nouvelle chaîne.

Pour remplacer toute instance de foo après le point avec bar, utilisez la commande M-x replace-string avec les deux arguments foo et bar. Le remplacement est effectué seulement sur le texte suivant le point, donc si vous voulez couvrir le tampon en entier, vous devrez d'abord placer le point au début. Toutes les occurences jusqu'à la fin du tampon sont remplacées ; pour limiter le remplacement à une partie du tampon, restreignez à cette partie du tampon avant de faire le remplacement (Section 31.22). Dans le mode de Marque Transitoire, lorsque la région est active, le remplacement est limité à la région (Section 11.2).

Lorsque replace-string se termine, elle laisse le point à la dernière accurence remplacée. Elle place la marque à la place précédente du point (où la commande replace-string a été lancée) ; utilisez C-u C-SPC pour y retourner.

Un argument numérique restreint le remplacement aux correspondances entourées de frontières de mots. La valeur de l'argument n'importe pas.

14.7.2. Remplacement de Regexp

La commande M-x replace-string remplace des correspondances exactes d'une chaîne unique. La commande similaire M-x replace-regexp remplace toute correspondance d'un motif spécifié.

Dans replace-regexp, nouvelle chaîne n'est pas nécessairement constante : elle peut référer à tout ou partie du texte correspondant à la regexp. \& dans nouvelle chaîne indique le texte correspondant, en entier. \d dans newstring, où d est un chiffre, indique le texte correspondant au dième groupe parenthésé dans regexp. Pour inclure un \ dans le texte de remplaement, vous devez entrer \\. Par exemple,

M-x replace-regexp RET c[ad]+r RET \&-safe RET

remplace (par exemple) cadr avec cadr-safe et cddr avec cddr-safe.

M-x replace-regexp RET \(c[ad]+r\)-safe RET \1 RET

exécute la transformation inverse.

14.7.3. Commandes de Remplacement et Casse

Si le premier argument d'une commande de remplacement est uniquement en minuscule, les commandes ignorent la casse lors de la recherche des occurences à remplacer--à condition que case-fold-search est non nil. Si case-fold-search est nil, la casse est toujours significative dans toutes les recherches.

De plus, lorsque l'argument newstring est entièrement ou en partie en minuscule, les commandes de remplacement essaient de respecter le motif de la casse de chaque occurence. Ainsi, la commande

M-x replace-string RET foo RET bar RET

remplace foo en minuscule avec bar en minuscule, FOO tout en majuscule avec BAR, et Foo majuscule avec Bar. (Ces trois alternatives--minuscule, tout en majuscule, et majuscule, sont les seules que replace-string peut distinguer.)

Si des lettres majuscules sont utilisées dans la chaîne de remplacement, elles restent en majuscule chaque fois que ce texte est inséré. Si des lettres majuscules sont utilisées dans le premier argument, le second argument est toujours inséré exactement comme il est donné, sans conversion de la casse. De même, si soit case-replace soit case-fold-search est nil, le remplacement est effectué sans conversion de casse.

14.7.4. Remplacement Interrogatif

M-% chaîne RET nouvelle chaîne RET, M-x query-replace RET chaîne RET nouvelle chaîne RET

Remplace certaines occurences de chaîne avec nouvelle chaîne.

C-M-% regexp RET newstring RET, M-x query-replace-regexp RET regexp RET newstring RET

Remplace certaines correspondances de regexp avec newstring.

Si vous voulez changer seulement certaines occurences de foo en bar, en non toutes, vous ne pouvez alors pas utiliser replace-string. À la place, utilisez M-% (query-replace). Cette commande trouve des occurences de foo une par une, affiche chaque occurence et vous demande s'il doit la remplacer. Un argument numérique à query-replace lui indique de considérer seulement les occurences délimitées par des caractères de frontières de mots. Elle préserve la casse, exactement comme replace-string, lorsque case-replace est non nil, ce qu'il est normalement.

À part interroger, query-replace fonctionne exactement comme replace-string, et query-replace-regexp exactement comme replace-regexp. Cette commande est lancée par C-M-%.

Lorsqu'il vous est montré une occurence de chaîne ou une correspondance de regexp, vous pouvez taper :

SPC

pour remplacer une occurence avec nouvelle chaîne.

DEL

pour sauter à l'occurence suivante sans remplacer celle-ci.

, (Comma)

pour remplacer cette occurence et afficher le résultat. Il vous est alors demandé d'entrer un autre caractère pour indiquer quoi faire ensuite. Le remplacement ayant déjà été fait, DEL et SPC sont équivalentes dans cette situation ; toutes deux vous déplace à l'occurence suivante.

Vous pouvez taper C-r à ce moment-là (voir plus loin) pour altérer le texte remplacé. Vous pouvez aussi taper C-x u pour annuler le remplacement ; cette commande termine query-replace, et si vous voulez faire d'autres remplacements, vous devez utiliser C-x ESC ESC RET pour redémarrer (Section 8.5).

RET

pour terminer sans faire de remplacements supplémentaires.

. (Point)

pour remplacer cette occurence puis terminer sans chercher d'occurences supplémentaires.

!

pour remplacer toutes les occurences suivantes sans autre interrogation.

^

pour retourner à la position de l'occurence précédente (ou ce qui était une occurence), au cas où vous l'ayez remplacée par erreur. Ceci marche en dépilant la pile des marques. Seulement un ^ à la suite est effectif, car une seule position précéednte est sauvegardée durant query-replace.

C-r

pour entrer dans un niveau d'édition récursive, au cas où l'occurence doit être éditée pluôt que d'être simplement remplacée par nouvelle chaîne. Lorsque vous avez terminé, sortez du niveau d'édition récursive avec C-M-c pour rechercher l'occurence suivante. Section 31.26.

C-w

pour supprimer l'occurence, puis entrer dans un niveau d'édition récursive comme avec C-r. Utilisez l'édition récursive pour insérer le texte remplaçant l'occurence supprimée de chaîne. Lorsque vous avez terminé, quittez le niveau d'édition récursive avec C-M-c pour rechercher l'occurence suivante.

e

pour éditer la chaîne de remplacement dans le mini-tampon. Lorsque vous quittez le mini-tampon en tapant RET, le contenu du mini-tampon remplace l'occurence en cours du motif. Il devient aussi la nouvelle chaîne de remplacement pour toute nouvelle occurence.

C-l

pour réafficher l'écran. Vous devez alors taper un autre caractère pour spécifier quoi faire avec cette occurence.

C-h

pour afficher un message résumant ces options. Vous devez alors taper un autre caractère pour spécifier quoi faire avec cette occurence.

Certains autres caractères sont des pseudonymes de caractères listés plus hauts : y, n et q sont équivalents à SPC, DEL et RET.

En dehors de ces caractères, tout autre caractère termine query-replace, puis est relu comme partie d'une séquence de touches. Ainsi, si vous tapez C-k, query-replace se termine et la fin de ligne est coupée.

Pour redémarrer query-replace une fois qu'il a été terminé, utilisez C-x ESC ESC, qui répète query-replace car elle a utilisée le mini-tampon pour lire ses arguments. C-x ESC ESC.

Voir aussi Section 30.9, pour des commandes pour renommer, copier ou lier des fichiers en remplaçant des correspondances de regexp dans leurs noms de fichiers.

Notes

[1]

Dans certains éditeurs, les opérations de recherche et remplacement sont la seule manière de faire un changement unique dans le texte.