4 Comment rechercher du texte et le remplacer ?

Contents of this section

Il y a plusieurs façons de faire.

Pour faire une modification sur la ligne du curseur, il faut taper : :s/texte_à_trouver/nouveau_texte/g .

Pour agir sur l'ensemble du document : :%s/texte_à_trouver/nouveau_texte/g .

Et pour limiter la recherche à un intervalle défini : :[zone]s/texte_à_trouver/nouveau_texte/[cgi] .

La zone peut être délimitée de plusieurs façon : de la forme n,m avec n et m les numéros de lignes bornant la zone, comme on l'a vu plus haut, avec des opérateurs comme $ (fin du fichier), . (ligne du curseur), ou % (le fichier actuel). On peut ainsi écrire .,+5 pour désigner la ligne du curseur et les 5 suivantes. Si la commande est suivie de c , vi demandera confirmation avant chaque substitution. g permet de ne pas s'arrêter après la première substitution, et i demande à vi de ne pas tenir compte de la casse (minuscule ou majuscule) des caractères dans sa recherche.

On peut aussi utiliser la syntaxe suivante : :g/rototo/s/toto/titi/g , pour remplacer rototo par rotiti. L'avantage de cette méthode, qui cherche une ligne avec le mot rototo et qui remplace alors toto par titi, c'est qu'elle laisse intacte les lignes ne contenant que toto, alors que la méthode précédente les aurait modifiées aussi. Toutefois, s'il y a une ligne où se trouvent à la fois toto et rototo, alors ce toto sera modifié aussi.

On peut bien entendu utiliser des expressions régulières dans les fonctions de recherche et de substitution. Par exemple, pour permuter le premier et le deuxième mot des lignes contenant le mot toto, on peut utiliser ceci : :g/toto/s/^\([^ ]*\) \([^ ]*\)/\2 \1/

Quelques fonctionnalités spécifiques à vi : & Représente tout ce qui a été trouvé lors de la recherche.

4.1 Ma touche / ne fonctionne pas. Que faire ?

J'avoue, il n'y a pas besoin de mettre un /. Beaucoup de signes fonctionneront en lieu et place de /, suivant la syntaxe de sed. Les lettres et les chiffres ne fonctionneront pas, entre autres.

4.2 Comment exécuter un programme depuis vi ?

:!nom_du_programme lancera le programme correspondant. :sh démarrera un shell interactif. Depuis lequel on peut, si on le souhaite, lancer vi. C'est utile lorsqu'on édite des Makefiles et des fichiers de configuration afin de réussir à compiler un programme, c'est plus rapide que de sauvegarder, de quitter et de relancer vi.

4.3 Aaargh ! j'étais en train d'écrire, et mon ordinateur a planté.

Vous recevrez un courrier électronique vous informant de la marche à suivre. En tapant vi -r nom_de_fichier , on peut récupérer le fichier que l'on éditait au moment du plantage. vi -r tout court fait la liste des fichiers récupérables.

4.4 Comment rendre vi plus convivial pour le programmeur ?

:set ai permet de faire automatiquement les indentations. :set sw=N permet de régler à N le nombre d'espace d'une indentation. On peut déplacer une ligne d'un niveau d'indentation avec << et >> vers la gauche et vers la droite respectivement. En se positionnant sur le premier élément d'une paire de crochets, de parenthèses ou d'accolades, et en tapant >% ou <% on peut déplacer d'un niveau vers la droite ou vers la gauche la paire et son contenu.

:set sm déplace brièvement le curseur sur le {, ( ou [ ouvrant lorsqu'on tape le }, ), ou ] qui le ferme.

:set lisp modifie le comportement de vi pour faciliter la programmation en lisp.

4.5 Les Macros -- comment les écrire ?

:map <abréviation> <commande> . L'abréviation doit être de 10 caractères au maximum, et la commande, de 100. Les macros se lancent depuis le mode commande, mais on peut finir dans n'importe quel mode. Pour inclure un caractère de contrôle, il faut qu'il soit précédé de <C-V>. De même pour les commande ex, comme | : il faut taper :map co <C-V> <C-V>|

unmap <abréviation> permet de supprimer une macro. map! <abréviation> <texte> permet d'insérer le <texte> dans le document.

4.6 Comment associer une macro à une touche de fonction ?

Si l'on crée une macro dont l'abréviation est un chiffre entre 0 et 9, elle sera associée à la touche de fonction correspondante.

4.7 Comment abréger du texte ?

:ab mél votre.nom@fai.fr permet de remplacer automatiquement, à la saisie, mél par votre adresse. Pour arrêter cette substitution, tapez :una mél .

4.8 Comment utiliser un vérificateur orthographique sur un document ?

Placez cette macro dans votre fichier de configuration .exrc :

map V :w<entrée>:!ispell % <entrée>:e!<entrée><entrée>

Elle est simple, et lance ispell sur le document ouvert. Il faut bien sûr avoir installé ispell sur la machine :). Pour faire la vérification, tapez V . Cette lettre n'est pas utilisée par défaut dans vi, donc elle peut être utilisée aisément pour des macros.

4.9 Comment supprimer les ^M à la fin de chaque ligne ? Avec une macro ?

Ils proviennent en général de fichiers DOS édités sous UNIX. Il est facile de s'en débarrasser :

:%s/<C-V><entrée>//g

Si on veut faire une macro, c'est un peu plus compliqué, et on ne le devine pas tout seul :

map v :%s/<C-V><C-V><C-V><C-V><C-V><entrée>//g

Oui, il faut bien 5 <C-V>. Le premier sert à prendre littéralement la touche entrée, deux autres servent à prendre littéralement le ^V. La macro est une commande ex, donc il faut deux <C-V> lorsqu'elle est interprétée. Comme ça, il recherche <C-V><entrée> et le remplace par rien (= le supprime).

Si vous avez problèmes avec des macros faisant appel à des commandes d'ex, essayer de rajouter des échappements par <C-V>. Rajoutez-en quelques-un jusqu'à ce que ça marche comme vous le souhaitez :).

4.10 J'ai un terminal imprimante. Puis-je utiliser vi ?

Bon, ce n'est pas vraiment une FAQ. Mais bon, il faut bien en parler quelque part, et ça introduit la question suivante.

Vi va démarrer dans un mode particulier, le mode open . Cela ne change pas grand chose à son fonctionnement. Les caractères effacés seront représentés par des / sur votre sortie imprimée. Vi se comportera comme si la fenêtre ne faisait qu'une ligne. ^r va imprimer à nouveau la ligne actuelle. z retrace la fenêtre autour de la ligne actuelle.

4.11 Ah, c'est ça le mode open ! Mais je n'ai pas de terminal texte, et pourtant je démarre toujours dans ce mode.

C'est ce qui arrive lorsque vi ne peut déterminer le type de terminal que vous utilisez. Dans cette situation, il préfère penser que vous avez le pire terminal qui soit. Cela peut paraître inutile, puisque très peu de gens de nos jours ont ce matériel. Mais c'est pratique pour le logiciel, qui n'a pas besoin d'avoir beaucoup d'information sur le fonctionnement du terminal.

Comment faire pour s'en débarasser ? On peut changer de mode à chaque session, mais ce n'est pas très pratique. Si vous connaissez votre type de terminal, vous pouvez l'exporter dans la variable d'environnement TERM ( setenv TERM <terminal> dans les variantes de csh, export TERM=<terminal> dans les variantes de sh).

Vous pouvez régler automatiquement cette variable au moment de la connexion à la machine en plaçant cette commande dans votre .profile ou dans votre .cshrc.

Si vous ne connaissez pas votre type de terminal, essayer avec vt100. La plupart des terminaux sont capable d'émuler le vt100. Si ça ne fonctionne pas, demandez à un gourou près de chez vous.

4.12 Où puis-je trouver les sources de vi ?

Le code source de vi est une propriété d'AT&T. Si vous avez une licence des sources d'un UNIX disposant de vi, vous devriez les avoir. Sinon, pas de chance. Regardez les sources des différents clones de vi, la plupart d'entre eux sont libres.

Next Chapter, Previous Chapter

Table of contents of this chapter, General table of contents

Top of the document, Beginning of this Chapter