Chapitre 13. Edition

Table des matières
13.1. Introduction à vi
13.2. Configurer vi
13.3. Utilisation des tags avec vi

Ce chapitre décrit l'éditeur standard de NetBSD, j'ai nommé vi. La première partie présente les bases d'utilisation et les parties suivantes décrivent quelques caractéristiques avancées, avec des références particulières à la version installée sur NetBSD.

13.1. Introduction à vi

Pas besoin de présenter vi : il a été développé par Bill Joy, de l'université Berkeley de Californie, pour devenir l'éditeur standard d'à peu près toutes les versions d'Unix, le compagnon et l'ami de confiance des administrateurs système et des programmeurs mais la bête noire de l'utilisateur débutant.

Il vaut toutefois la peine de placer quelques mots sur son utilisation car il est aussi le seul éditeur présent sur votre machine à la fin de l'installation de NetBSD (à part ed). Il est, de fait, le seul dont vous ayez besoin pour effectuer la configuration du système. Par la suite, naturellement, vous serez libre d'installer l'éditeur que vous préférez ou que vous connaissez le mieux, le choix étant assez nourri dans la collection de paquetages de NetBSD (voir le Chapitre 8).

Cette section est une introduction à l'utilisation de vi mais qui devrait être suffisante au débutant pour créer ou modifier des fichiers texte. Seules les caractéristiques de base et les commandes les plus courantes seront décrites, sans prétention d'exhaustivité ou de précision : pour plus de détails, reportez-vous à la Section 13.2.2.

Le débutant ne doit pas commettre l'erreur de juger vi à partir de cette introduction : utilisé de façon " minimaliste" , il existe certainement des outils plus pratiques. Ses vertus se découvrent lorsque l'on connaît toutes ses commandes (!) et que l'on commence à utiliser ses fonctions avancées. Alors, vi n'est plus l'éditeur de base mais un instrument confortable, puissant et fiable. Ce guide a été écrit à l'aide de l'éditeur vi.

13.1.1. Premières étapes

Pour le lancer, tapez simplement la commande :

$ vi fichier	
fichier est le nom du fichier à éditer (qui peut ne pas exister). Si nomefile est omis, vi utilise un fichier vide (qui n'a pas encore de nom : il faudra lui en donner un au moment de l'enregistrement). Dans cet exemple, nous allons créer un nouveau fichier :
$ vi monfichier	
monfichier est le nom du fichier qui n'existe pas encore, dans le répertoire courant.

Une fois que vi est démarré, l'écran montre une colonne de caractères tilde sur la gauche et, tout en bas, le nom du fichier et des informations dont la signification est évidente. Cet écran, sur plus de lignes, ressemble à:

~
~
~
~
~
~
monfichier: new file: line 1	
Le caractère tilde en début de ligne indique que celle-ci est vide, c'est à dire ne contient rien qui appartienne au fichier. Puisque le fichier chargé (monfichier) n'existe pas encore, toutes les lignes sont vides.

A ce point, appuyer la grande majorité des touches provoque un signal sonore ou un message d'erreur (essayez avec j ou k). C'est parce que l'éditeur est modal et qu'une pression sur une touche n'a pas le même effet suivant le " mode" . Au départ, vi est en mode commande et les touches sont interprétées comme des commandes et non comme du texte ajouté au fichier. Certaines commandes permettent de passer du mode commande au mode insertion : les touches sont interprétées comme du texte ajouté au fichier. Voyons un exemple.

Appuyez sur i pour passer en mode insertion et tapez le texte suivant (en appuyant sur Entrée à chaque fin de ligne):

Première ligne de texte inséré,
deuxième ligne de texte inséré,
troisième et dernière ligne de texte inséré.	
Une fois terminé, appuyez sur ESC pour retourner en mode commande.

Dans cet exemple, nous avons vu comment passer du mode commande au mode insertion avec la touche i, comment insérer quelques lignes de texte en terminant chacune par Entrée, puis comment repasser en mode commande avec ESC. Maintenant que notre fichier contient quelque chose, nous allons pouvoir expérimenter quelques commandes. Commençons par celles qui nous permettent de naviguer à l'intérieur du fichier.

Note : le texte que nous avons tapé appartient logiquement au fichier monfichier (le nom passé comme paramètre à l'éditeur). Mais pour le moment, il ne fait que résider en mémoire vive puisqu'il n'a pas été enregistré dans le fichier. Toutes les opérations effectuées sur le texte (ajout, modification...) ne sont pas enregistrées sur le disque tant que l'utilisateur ne l'a pas explicitement demandé avec une commande d'enregistrement. De cette façon, il est toujours possible d'abandonner les modifications en quittant l'éditeur sans enregistrer et laisser le fichier du disque tel qu'il était. Les commandes pour enregistrer, abandonner, quitter sont décrites à la Section 13.1.9.

13.1.2. Commandes de navigation dans un fichier

En mode commande, quelques commandes permettent de se déplacer à l'intérieur du fichier (c'est à dire changer la position du curseur). La liste suivante résume les principales commandes de navigation :

h       curseur vers la gauche      (flèche gauche)
j       curseur vers le bas         (flèche vers le haut)
k       curseur vers le haut        (flèche vers le bas)
l       curseur vers la droite      (flèche droite)
^F      page suivante               (PgDn)
^B      page précédente             (PgUp)
0       curseur en début de ligne
$       curseur en fin de ligne
b       mot précédent
w       mot suivant
Entrée  premier caractère de la ligne suivante (espace exclus)
+       premier caractère de la ligne suivante (espace exclus)
-       premier caractère de la ligne précédente (espace exclus)	
Le symbole ^ indique qu'il faut appuyez sur Contrôle en même temps que la touche. ^F signifie donc Contrôle-F. Suivant la configuration du terminal, il est possible que l'éditeur réussisse à utiliser les touches fléchées et PgUp, PgDn.

Vous avez remarqué que les touches servent à se positionner dans le texte lorsque l'éditeur se trouve en mode commande : utilisées en mode insertion, en revanche, elles servent à écrire du texte dans le fichier (c'est à dire qu'appuyer sur h revient à écrire " h" ). Nous observons donc un premier fait : en mode insertion, le texte ne peut être ajouté que séquentiellement. Pour se déplacer dans le texte, il est nécessaire de quitter ce mode (avec ESC) pour retourner en mode commande. C'est l'une des conséquence du fait que nous ayons affaire à un éditeur modal.

En mode commande, il possible de se rendre directement à la ligne voulue en connaissant son numéro. Par exemple :

12G     va à la ligne 12	
La commande G sans numéro envoie le curseur à la fin du fichier.

Préfixe numérique : de nombreuses commandes acceptent un préfixe numérique qui modifie l'interprétation d'une partie de l'éditeur. Bien que ces préfixes ne soient pas décrits ici, voici un exemple pour vous donner une idée des possibilités :

9k      curseur 9 lignes vers le haut
12dd    efface 12 lignes
3w      le curseur avance de trois mots
5x      efface 5 caractères	  

Dans cette section, ont été décrites les principales commandes de déplacement qui peuvent être utilisée sur du texte déjà écrit. L'éditeur vi possède encore de nombreuses commandes sophistiquées pour se déplacer dans un fichier mais elles ne seront pas abordées dans ce guide.

13.1.3. Commandes de changement de mode

Dans le premier exemple, nous avons vu que pour passer du mode insertion au mode commande, il fallait appuyez sur ESC. Si l'on appuie sur cette touche alors que l'on est déjà en mode commande, l'éditeur émet un inoffensif signal sonore. De cette façon, quand on ne sait pas dans quel mode on se trouve, une pression sur la touche Esc garantie de se retrouver en mode commande.

Si Esc est la seule façon de passer en mode commande, il en existe de nombreuses pour passer en mode insertion. Elles dépendent de l'effet voulu, comme le montre le tableau suivant :

i       insère du texte avant le curseur
a       insère du texte après le curseur
A       insère du texte en fin de ligne
I       insère du texte en début de ligne
o       entame une nouvelle ligne après la ligne courante
O       entame une nouvelle ligne avant la ligne courante	
La présence de nombreuses commandes qui effectuent des choses similaires est une constante avec vi. Il y a donc plusieurs façons de faire quelque chose. Les experts finissent toujours par trouver la solution pour arriver à quelque chose avec le minimum de fonctions. Par exemple, pour ajouter " fin"  en fin de ligne, voici deux séquences équivalentes:
$afineESC
AfineESC	
la première amène le curseur en fin de ligne avec $, puis passe en mode insertion avec a, ajoute le texte puis retourne en mode commande avec ESC. Dans la seconde, la commande A combine les fonctions de$ et a.

13.1.4. Commandes d'effacement de texte

Le tableau suivant résume les commandes les plus courantes pour effacer du texte:

dd      efface la ligne courante
x       efface le caractère sous le curseur
X       efface le caractère précédant le curseur
dw      efface jusqu'à la fin du mot
D       efface du curseur à la fin de la ligne	
Bien entendu, ces commandes ne peuvent être données qu'en mode commande et pas en mode insertion. A partir de maintenant, nous considérerons que ce fait est évident et nous ne le rappellerons plus. Lorsque seront décrites des fonctions directement accessibles du mode insertion, nous l'indiquerons de façon explicite.

13.1.5. Exemple

Voyons maintenant un exemple pratique qui résume l'utilisation des commandes vues dans les sections précédentes. Prenons le fichier de trois lignes que nous avons déjà pris pour exemple. Nous voulons modifier la troisième ligne de comme ceci:

troisième ligne de texte inséré dans le fichier.        
Premièrement, effaçons de la troisième ligne les mots " et dernière"  puis ajoutons " dans le fichier"  en fin de ligne, avant le point.

Supposons que le curseur soit sur la première ligne (si ce n'est pas le cas, nous pouvons l'y porter avec la commande 1G). Pour passer de la première à la troisième ligne, l'une des séquences suivantes peut être utilisée (il en existe encore d'autres):

<Entrée><Entrée>
jj
3G
/troisième/<Entrée>
        

Une fois arrivé au début de la troisième ligne, déplaçons-nous sur le premier mot à supprimer avec

w        
puis effaçons les deux mots avec:
dwdw        

Note : rappelez-vous que vous pouvez utiliser des préfixes numériques. Ainsi, les deux commandes dw peuvent être remplacées par 2dw qui permet d'effacer un mot deux fois de suite, ou par d2w, plus surprenant, qui efface deux mots.

Pour ajouter la fin du texte, allez en fin de ligne avec $, puis passez en mode insertion avec i pour écrire:

dans le fichier	
Appuyez sur ESC pour retourner en mode commande.

13.1.6. Recherche de texte

Pour rechercher une chaîne de caractères dans le fichier courant, utilisez les commandes suivantes:

/stringa/
?stringa?	
La première commande (suivie de Entrée) cherche la chaîne indiquée à partir de la position du curseur. La deuxième commande (aussi suivie de Entrée) cherche la chaîne partir du début du fichier.

Par exemple, reprenons les trois lignes que nous avons insérées initialement et lançons la commande suivante:

1G/dernière/	
appuyez sur Entrée après la dernière barre oblique. La commande 1G porte le curseur sur la première ligne du fichier (notez que cette commande ne renvoie aucun écho). La séquence /dernière/ (qui se visualise sur la dernière ligne de l'écran), suivie par Entrée, lance la recherche de la chaîne "dernière" dans le fichier et positionne le curseur sur la ligne trouvée.

Note : les commandes de recherche constituent donc une autre méthode de positionnement dans un fichier, permettant de le visualiser rapidement.

Pour répéter la dernière recherche effectuée sans avoir à la retaper, utilisez les commandes:

n       recommence la recherche dans la même direction
N       recommence la recherche dans la direction opposée	

13.1.7. Commandes en mode insertion

Même lorsque vous saisissez du texte, quelques commandes sont disponibles, généralement accessibles avec la touche Contrôle:

^H      efface le caractère à gauche du curseur
BS      efface le caractère à gauche du curseur
^W      efface le mot précédent
^U      efface à partir du début de la ligne
ESC     retourne en mode commande	

13.1.8. Annuler l'effet d'une action

Si, une fois que vous êtes retourné en mode commande, vous vous apercevez que vous avez commis une erreur, il est possible d'utiliser la commande d'annulation undo (touche u) pour revenir à l'état lors de la dernière commande.

13.1.9. Commandes pour quitter vi

Les principales commandes pour terminer de travailler et quitter vi sont:

:w      enregistre le fichier
:q      quitte
:wq     enregistre le fichier puis quitte
:q!     quitte sans enregistrer (les modifications sont perdues)
:w abc  enregistre le fichier sous le nom "abc"	
Pour changer le nom du fichier en cours (ou pour lui en donner un s'il n'en a pas):
:file nom-fichier	

Les commandes décrites dans cette section sont des exemples du fonctionnement de vi, le modo ex qui n'est pas décrit dans ce guide. L'éditeur vi est, en fait, issu de la combinaison de deux éditeurs distincts dont l'un (vi pour le nommer) sert d'interface plein écran pour l'autre (ex) qui fournit les fonctions de base de l'édition. Ex peut être pris comme une version évoluée de l'éditeur ed.

13.1.10. Conclusion

Comme le disait l'introduction, seules les commandes les plus élémentaires de vi ont été abordées dans cette section afin que l'utilisateur soit en mesure d'écrire les fichiers de configuration de NetBSD après l'installation. Pour pouvoir utiliser cet éditeur de façon productive (et confortable), il est nécessaire d'approfondir votre connaissance des commandes, par exemple, à l'aide des documents cités à la Section 13.2.2.

13.2. Configurer vi

L'éditeur standard fournit par NetBSD est, est-il besoin de le préciser, vi, l'outils le plus aimé et le plus haï du monde. Si vous n'utilisez pas vi, passez cette section sinon, lisez-la avant d'installer une autre version de vi. Le vi de NetBSD (nvi) a été écrit par Keith Bostic de l'UCB afin d'en avoir une version librement redistribuable, possédant de nombreuses extensions puissantes tout en restant compatible avec la version originale. Nvi est depuis devenu la version standard de vi pour BSD.

Parmi les extensions les plus connues, citons:

13.2.1. Extensions de .exrc

Les exemples suivants montrent un fichier .exrc dont certaines options étendues sont activées.

set showmode ruler
set filec=^[
set cedit=^[      

La première ligne active l'affichage de la position du curseur (en lignes et colonnes) et du mode courant (Commande, Insertion, Ajout) sur la ligne d'état. La seconde ligne (où ^[ est le caractère Esc), permet de compléter automatiquement les noms de fichiers à l'aide du caractère Esc. La troisième ligne active l'édition de l'history de la ligne de commandes (aussi avec le caractère Esc). Par exemple, taper ":" puis Esc ouvre une fenêtre contenant la liste des commandes précédentes qui peuvent être modifiées et exécutées (Appuyez sur Entrée pour exécuter la commande sur laquelle vous êtes).

13.2.2. Documentation

L'archive des sources (src.tgz)) contient une grande quantité de documentation sur vi/nvi et ex, dans le répertoire /usr/src/usr.bin/vi/docs. Par exemple:

  • Edit: A tutorial

  • Ex Reference Manual

  • Page de manuel de Vi

  • An Introduction to Display Editing with Vi par William Joy et Mark Horton

  • Ex/Vi Reference Manual par Keith Bostic, le manuel de référence de nvi qui décrit en détail toutes les commandes de l'éditeur.

  • Vi Command & Function Reference

  • Vi tutorial (débutants et confirmés)

Si vous n'avez jamais utilisé vi, le Vi tutorial est un bon point de départ. Il a été conçu pour être lu avec vi en présentant graduellement au lecteur les commandes qui peuvent être essayées dans le document. An Introduction to Display Editing with Vi par William Joy et Mark Horton est aussi un bon point de départ. Si vous voulez en apprendre plus sur vi et les extensions nvi, lisez Ex/Vi Reference Manual de Keith Bostic qui documente toutes les commandes et options de l'éditeur.

13.3. Utilisation des tags avec vi

Ce thème n'est pas directement lié à NetBSD mais peut s'avérer utile, par exemple, pour lire les sources du noyau.

Lorsque vous consultez du code source dans une arborescence de répertoires et sous-répertoires, vous pouvez simplifier l'exploration à l'aide de la fonction tag de vi. La méthode est la suivante:

  1. Allez dans le répertoire racine des sources.

    $ cd /chemin	  

  2. Tapez les commandes suivantes:

    $ find . -name "*.[ch]" > listefichiers
    $ ctags -L listefichiers
              

  3. Ajoutez la ligne suivante à .exrc:

    set tags=/chemin/tags          
    (mettez le chemin d'accès correct à la place de "chemin")