Page suivante Page précédente Table des matières

9. Tutoriel Vi

Dans ce tutoriel, nous décrirons quelques commandes et concepts vi avancés, vous pourrez ainsi apprécier la puissance de vi et décider de construire vos connaissances avec les commandes vi. Quasiment toutes les références listent les commandes disponibles, mais beaucoup ne montrent pas comment ces commandes interagissent ; ce point précis est le thème principal de ce tutoriel.

9.1 Commandes du mouvement du curseur

Les commandes du mouvement du curseur de vi vous permettent de positionner le curseur dans le fichier et/ou à l'écran de manière efficace, avec un nombre minimal de frappe de touches. Il y a de nombreuses commandes contrôlant les mouvements du curseur - n'essayez pas de toute les mémoriser en une fois ! Plus tard, nous verrons que la majeure partie de la puissance de vi vient du mélange entre les commandes de mouvement du curseur et les autres commandes pour effacer, changer, copier, et filtrer le texte.

Veuillez éditer un gros fichier texte (disons, wknight) afin d'expérimenter chaque commande décrite. Gardez en tête que ces commandes ne marchent qu'en Mode Commande, et pas en Mode Insertion ; si vous voyez vos « commandes » dans votre texte, appuyez sur ESC pour retourner en Mode Commande.

9.2 Compteurs de répétitions

La plupart des commandes de mouvements présentées ci-dessus peuvent être précédées d'un compteur de répétitions ; le mouvement est simplement répété le nombre de fois donné :

Pour certaines commandes, les « compteurs de répétitions » ont des significations spéciales : Pour plusieurs commandes (telles que ^) le compteur de répétition est ignoré ; pour d'autres (par exemple, / et ?) il est illégal.

9.3 Effacer du texte

Nous avons vu que dd efface la ligne courante. Ceci peut être utilisé avec un compteur de répétitions : 3dd efface trois lignes, la ligne courante et les 2 lignes suivantes.

La commande d peut être utilisée comme un « préfixe » pour la plupart des commandes de mouvement ci-dessus pour effacer à peu près toute sorte de parties de texte. Lorsqu'elles sont utilisées avec d, les commandes de mouvements sont appellées des spécificateurs de cibles. On peut donner un compteur de répétition à d (lorsque vous essayez ces expériences, rappellez vous d'appuyer sur u après chaque commande pour annuler l'effacement).

Pour effacer de simples caractères, utilisez x. x peut être utilisé en utilisant un compteur répétitif : x est simplement une abbréviation de d1 ; c'est-à-dire efface un caractère à droite.

9.4 Changer le texte

La commande c est similaire à d, à part qu'elle change le mode de vi en insertion, autorisant le texte original (non désiré) à être changé en quelque chose d'autre.

Par exemple, placez le curseur sur le début d'un mot (tapez w pour arriver au début du prochain mot). Ensuite, tapez cw pour changer ce mot. À l'écran, le dernier caractère de ce mot en cours de changement sera remplacé par un symbole $ indiquant la fin du changement ; tapez un nouveau mot (vous réécrirez le mot original à l'écran) et tapez la touche ESC lorsque vous aurez fini. Votre entrée peut être plus longue ou plus courte que le mot en cours de changement.

Placez le curseur au début d'une ligne contenant au moins trois mots, et taper c3w pour changer ces trois mots. Essayez c$ pour changer la fin de la ligne actuelle. Dans tous les cas où le changement affecte uniquement la ligne courante, la fin du changement est indiquée avec $.

Lorsqu'un changement affecte plus que la ligne courante, vi efface le texte original de l'écran et se place en mode insertion. Par exemple, essayez c3+ pour changer la ligne courante et les trois suivantes ; vi supprime les quatres lignes originales de l'écran et se place en mode d'insertion sur une nouvelle ligne blanche. Comme toujours, tapez la touche ESC lorsque vous aurez fini d'entrer votre nouveau texte.

Quelques autres commandes de changement :

9.5 Emmener (copier) du texte

La commande y emmène une copie du texte dans un buffer ; le texte copié peut être placé (ou collé) n'importe où dans le fichier en utilisant p ou P.

La forme la plus simple de copie est yy pour copier la ligne courante ; après yy, essayez p pour mettre une copie de la ligne copiée après le curseur. En suivant yy, vous pouvez faire autant de copie de la ligne emmenée que vous le voulez en vous déplaçant dans le fichier et en tapant p.

Pour copier plusieurs lignes, essayez, par exemple, 5yy (copie la ligne courante et les 4 lignes suivantes). p place une copie des lignes emmenées après le curseur ; la séquence 5yyp « marche » mais ce n'est probablement pas ce que vous voudriez faire. La commande P fonctionne comme p, mais place une copie de la ligne au-dessus du curseur ; essayez la séquence 5yyP.

Autres commandes de copie :

9.6 Filtrer le texte

La commande de filtrage ! demande le nom d'une commande UNIX (qui doit être un filtre), passe les lignes sélectionnées par ce filtre, en remplaçant les lignes sélectionnées dans le buffer vi avec la sortie de la commande filtrante. La capacité de vi à passer des parties arbitraires de texte au travers de tout filtre UNIX ajoute une flexibilité incroyable à vi, sans « coût supplémentaire » de taille ou de performance à vi même.

Quelques exemples peuvent aider l'illustration. Créez une ligne dans votre fichier contenant juste le mot « who » et absolument aucun autre texte. Placez le curseur sur cette ligne, et tapez !!. Cette commande est analogue à dd, cc, ou yy, mais au lieu d'effacer, de changer ou de copier la ligne courante, elle filtre la ligne courante. Lorsque vous pressez le second !, le curseur descend vers le coin en bas à gauche de l'écran et un simple ! est affiché, vous demandant d'entrer le nom d'un filtre. En tant que nom de filtre, tapez « sh » et pressez la touche Entrée. sh (le shell Bourne) est un filtre ! Il lit l'entrée standard, exécute une partie de l'entrée (c'est-à-dire qu'il exécute des commandes), et envoie sa sortie (la sortie de ces commandes) à la sortie standard. Filtrer la ligne contenant « who » au travers de « sh » remplace la ligne contenant « who » par la liste des utilisateurs du système courant -- directement dans votre fichier !

Essayez de répéter ce procédé avec date. C'est-à-dire, créez une ligne ne contenant rien d'autre que le mot date, puis placez le curseur sur cette ligne, et tapez !!sh et la touche Entrée. La ligne contenant date est remplacée par la sortie de la commande date.

Mettez votre curseur sur la première ligne de la sortie de « who ». Comptez le nombre de lignes. Supposons, par exmple, que ce nombre soit six. Sélectionnez alors ces six lignes à filtrer au travers de sort ; tapez 6!!sort et la touche Entrée. Les six lignes seront passées à sort, et la sortie de sort remplacera les six lignes d'origine.

La commande filtre peut uniquement être utilisée sur des lignes complètes, pas sur des caractères ou des mots.

Quelques autres commandes de filtres (ici, « CR » indique pressez Entrée) :

9.7 Marquer des lignes et des caractères

Vous pouvez marquer des lignes et des caractères pour être utilisés en tant que cible pour des mouvements, effacement, changement, copie, et filtration en utilisant la commande mc, où c est une lettre minuscule.

Par exemple, mettez le curseur au milieu d'un mot et tapez ma. Ceci marque le caractère sous le curseur sous la marque a.

Maintenant, déplacez le curseur en dehors du caractère marqué vers une ligne différente (utilisez les flèches curseur, CTRL-u, ou autre). Pour retourner à la ligne marquée, tapez 'a (c'est-à-dire apostrophe, puis a). Ceci vous place sur le premier caractère non-blanc de la ligne contenant la marque a.

Sortez de la ligne encore une fois. Pour retourner au caractère marqué, tapez `a (apostrophe inverse, puis a). Ceci vous déplacera sur le caractère marqué par a.

Le marquage est habituellement utilisé avec l'effacement, le changement, la copie ou la filtration. Par exemple, déplacez le curseur sur une autre ligne que celle contenant la marque a, et pressez d'a (d, apostrophe, a). Ceci efface de la ligne courante jusqu'à la ligne marquée a incluse.

Mettez le curseur au milieu d'un autre mot et tapez mb pour mettre la marque b. Maintenant, déplacez le curseur hors de ce mot (mais seulement de quelques lignes, ainsi vous pourrez voir ce que nous allons faire plus facilement), et pressez d`b (d, apostrophe inverse, b). Ceci efface le caractère courant jusqu'au caractère marqué par b inclus.

Comme autre exemple, pour trier la sortie de who, marquez la première ligne (ma), puis déplacez le curseur vers la dernière ligne et taper !'asort puis la touche Entrée.

Si vous sautez jusqu'à une marque et que vous décidez de revenir en arrière, de l'endroit d'où vous avez sauté, vous pouvez taper '' (reviens à la ligne) ou `` (reviens au caractère).

9.8 Nommer les tampons

Lorsque vous effacez, modifiez, ou copier du texte, le texte original est sauvé (jusqu'au prochain effacement, changement ou copie) dans un tampon non nommé à partir duquel il peut être mis en utilisant p ou P. En utilisant le tampon non nommé, seul le plus récent changement du texte peut être récupéré.

Si vous voulez effacer, changer ou copier plusieurs parties de texte et se souvenir de toutes (jusqu'à un maximum de 26), vous pouvez donner un nom au tampon avec la commande utilisée. Un nom de tampon est de la forme "c (double apostrophe, c minuscule).

Par exemple, tapez "ayy pour copier la ligne courante dans le tampon a, puis déplacez vous sur une autre ligne et tapez "byy pour copier cette ligne dans le tampon b. Maintenant, déplacez vous n'importe où dans le fichier et tapez "ap et "bp pour placer des copies du texte sauvé dans les tampons a et b.

Quelques autres commandes de tampon :

9.9 Substitutions

Pour échanger un bloc de texte par un autre dans les lignes de votre fichier, utilisez la commande :s. Quelques exemples de substitutions :

9.10 Diverses « commandes double point »

Toutes les commandes de double point débutent avec « : » ; lorsque vous tapez ce symbole, le curseur saute vers le coin bas à gauche de l'écran, et un prompt à deux points est affiché, attendant que vous finissiez la commande.

Quelques exemples importants :

9.11 Utiliser les options

Diverses options peuvent affecter le « confort » de vi. Vous pouvez afficher toutes les diverses options pouvant être utilisées en tapant set all. Vous pouvez également utiliser « :set » pour changer les options.

Par exemple, si vous désirez voir le numéro de ligne pour les lignes du fichier que vous éditez, utilisez la commande :set number. Pour supprimer l'affichage du numéro de ligne, utilisez la commande :set nonumber. La plupart des options peuvent être abrégées ; :set nu affiche le numéro des lignes et :set nonu le supprime.

Si vous utilisez :set nomagic, la signification spéciale des caractères d'expression régulière (point, astérisque, crochet, etc.) est supprimée. Utilisez :set magic pour restaurer ces significations particulières.

Quelques options ont une valeur. Par exemple, :set tabstop=4 affiche les tabulations en quatre caractères d'espace, plutôt que les huit habituels.

Si vous trouvez que vous désirez toujours certaines options placées de certaines manières, vous pouvez mettre ces commandes optionnelles dans un fichier .exrc, ou vous pouvez utiliser la variable d'environnement EXINIT pour spécifier les options désirées.

Par exemple, si votre shell par défaut est le shell Bourne, cette ligne peut aller dans votre fichier .profile :


    EXINIT='set nomagic nu tabstop=4'; export EXINIT

Si votre shell par défaut est un C shell, cette ligne peut aller dans votre fichier .login :
    setenv EXINIT 'set nomagic nu tabstop=4'

9.12 Cartographie des touches

Si vous vous apercevez que vous utilisez encore et encore la même série de commandes simples, vous pouvez les lier à une touche de commande inutilisée en utilisant la commande :map. Si votre lien inclut des caractères de contrôle comme la touche Entrée (ctrl-M en ascii) ou ESC (ctrl-[ en ascii), vous pouvez les faire précéder de ctrl-v pour supprimer leur signification classique.

Par exemple, cette commande relit ctrl-A pour déplacer le curseur de 55 lignes, puis revenir à la ligne vide la plus récente, changer ensuite cette ligne blanche par un saut de page (ctrl-L) et trois lignes blanches. C'est à dire que chaque ctrl-A paginera la page suivante, sans couper de paragraphes entre les pages.

Note : Dans cette commande, chaque caractère de contrôle est représenté par ^C, où C est une lettre majuscule quelconque. Par exemple, ctrl-M est représenté par ^M. De même, lorsque vous entrez cette commande vous ne verrez pas les caractères ctrl-v : chaque ctrl-v se voit remplacé par la signification spéciale du caractère de contrôle suivant, ainsi lorsque vous utiliserez la séquence ^V^M, tout ce que vous verrez à l'écran est un ^M. Dans cette commande, ^M est la touche Entrée et ^[ la touche ESC.


         :map ^A  55+?^$^V^Mcc^V^L^V^M^V^M^V^M^V^[

9.13 Éditer plusieurs fichiers

Vous pouvez éditer plusieurs fichiers avec vi en lui donnant plusieurs noms de fichiers en arguments de ligne de commande :


         vi croc fatherw  wknight

Trois commandes sont utilisées pour se déplacer entre plusieurs fichiers :

Les commandes :n, :N et :rew sont quelques peu étranges, mais elles ont des bénéfices importants : le contenu des tampons ("a, "b, "c, etc.) sont connus entre les fichiers, et vous pouvez ainsi utiliser :n et :rew avec p et P pour copier le texte vers l'un ou l'autre des fichiers. De même, la plus récente chaîne de recherche des commandes / et ? sont les mêmes suivant les fichiers, et vous pouvez ainsi faire des recherches répétées sur plusieurs fichiers assez facilement.

Par exemple, tentez l'expérience suivante : tout d'abord sortez de vi, et exécutez ensuite vi avec croc et wknight en arguments :


         $ vi croc wknight

Dans croc, cherchez

/the < CR >

Copiez cette ligne dans le tampon a :

"ayy

Maintenant déplacez vous sur le prochain fichier (vous n'avez fait aucun changement à croc, donc ça marchera) :

:n < CR >

Cherchez la ligne suivante contenant « the », sans retaper la chaîne de recherche :

n

Mettez une copie du tampon après la ligne courante dans wknight :

"ap

Descendez de deux lignes, et copiez la ligne courante dans le tampon b :

jj"byy

Sauvez les changements de wknight

:w < CR >

Maintenant, retournez à croc

:rew < CR >

Cherchez encore, et mettez une copie du tampon b après la ligne trouvée :

n"bp

Sauvez les changements, et quittez vi

ZZ

9.14 Remarques finales

Ce tutoriel était prévu pour vous introduire quelques unes des possibilités de vi que vous pouvez également retrouver dans le manuel vi de votre système ou qui ne sont pas mentionnées dans ce manuel (de nombreux systèmes ont des manuels de qualité très variée).

Vous ne serez pas un expert vi après la lecture de ce tutoriel, mais vous aurez une bonne appréciation des possibilités de vi. Seul le temps et l'effort peuvent vous faire devenir un expert vi. Mais l'efficacité et l'universalité de vi rend cet effort payant dans le long terme.

Vous pouvez avoir décidé que vous détestez vi. Très bien ! Mais prenez garde, vi demeure l'éditeur de texte standard sous UNIX - le seul éditeur sur lequel vous pouvez compter pour être disponible sous tout système UNIX que vous utiliserez - donc même si vous préférez utiliser quelque chose d'autre dans la vie courante, vous seriez avisé de connaître le minimum à propos de vi qui est couvert dans ce tutoriel.


Page suivante Page précédente Table des matières