connectiva penguin bsd logo

Utilisation de vi

1. Pourquoi choisir vi ?

2. Les différents modes

2.1 Le mode insertion
2.2 Le mode commande
2.3 Le mode EX (commandes étendues)

3. Paramétrage

4. Conclusion


1. Pourquoi choisir vi ?

vi est un éditeur de texte, au même titre que Kedit, gedit ou emacs. La particularité d'emacs et de vi est d'être beaucoup plus puissants que les autres éditeurs de texte. Entendez par là qu'ils font beaucoup plus de choses, ils ont beaucoups plus d'options pour manipuler du texte et des fichiers. Ils ont aussi l'avantage de fonctionner en mode texte, et sont donc d'un grand secours quand l'interface graphique est en panne ou désactivée. Ils sont aussi beaucoup moins gourmands en ressource et peuvent ouvrir des fichiers de 100 Mo en quelques secondes (moins de 4 secondes pour ouvrir un fichier log de 71 Mo sur mon athlon xp1600+ sous mandrake 9.1). Sachez aussi que vi existe pour quasiment toutes les plates formes : DOS, Windows, OS2, Open-VMS, Linux et bien d'autres. En contrepartie, ils sont plus difficiles à prendre en main et rebutent les débutants.

Pourquoi vi plutôt qu'emacs ? Parce que je trouve que le mode commandes de vi est beaucoup plus simple à utiliser qu'emacs et ses dizaines de raccourcis clavier qu'il faut connaitre par coeur. Mais tout est question de goût.

Les liens officiels :
- vi
- emacs
- gedit, kedit

2. Les différents modes

Vi possède trois modes de fonctionnement : le mode insertion, le mode commandes (activé par défaut au lancement de vi) et le mode commandes étendues, appelé EX.

Le mode insertion sert à saisir le texte. C'est dans ce mode qu'on écrit. Les deux autres modes servent à agir sur le texte, par exemple, rechercher/remplacer des caractères, enregistrer les modifications, etc.

Voyons en détail ces trois modes.

2.1 Le mode insertion

C'est donc dans ce mode qu'on va écrire notre texte. J'aurais donc très peu de choses à dire.

Pour entrer dans ce mode, le plus courant est d'appuyer sur la touche 'i'. On voit alors "-- INSERT --" s'afficher en bas à gauche de la fenêtre. Tous les caractères qui seront tapés ensuite, seront affichés à l'écran, jusqu'à l'appui sur la touche 'Echap", qui va faire basculer vi en mode commande. On voit alors "-- INSERT --" disparaitre.

Voici les différentes façons d'entrer dans le mode insertion :

mode insertion
iinsert le texte avant le curseur
ainsert le texte après le curseur
O (lettre O majuscule)insert une ligne au dessus de la ligne courante, et passe en mode insertion
o (lettre o minuscule)insert une ligne en dessous de la ligne courante, et passe en mode insertion
touche 'Echap'passe en mode commande

Pour se déplacer dans le texte en mode insertion, on utilise les flèches et les touches 'page_haut' et 'page_bas'. Pour effacer un caractère, on peut utiliser les touches 'Suppr' et 'BackSpace'.

Attention : avec quelques vieilles versions de vi, ou quand on est connecté à distance sur un serveur, il se peut que ces touches ne fonctionnent pas. Dans ce cas, il faut utiliser les commandes équivalentes du mode commande (voir ci-dessous).

2.2 Le mode commande

C'est ici qu'on va sauvegarder notre travail, rechecher et remplacer des caractères, demander d'afficher le numéro des lignes, etc.

Pour passer en mode commande, il faut appuyer sur la touche 'Echap'. Les commandes qu'on va taper au clavier n'apparaitront pas à l'écran ; seul le résultat sera visible. Seules exceptions : les commandes de recherche de caractères commençant par '/' ou '?', et les ':' pour passer en mode EX.

Les tableaux ci-dessous, décrivent les principales commandes.

mode commandes - déplacements
flèches gauche, droite, haut, bas
ou h, l, k, j
déplacement à gauche, à droite, en haut et en bas
Ctrl+F ou Page_Baspage suivante
Ctrl+B ou Page_Hautpage précédente
Ctrl+Ddemi-page suivante
Ctrl+Udemi-page précédente
Ctrl+Hun caractère en arrière (comme flèche gauche ou h)
0 (chiffre 0)déplacement en début de ligne
$déplacement en fin de ligne
wmot suivant
Wmot suivant, en ignorant la ponctuation
bmot précédent
Bmot précédent, en ignorant la ponctuation
efin du mot courant
+ligne suivante
-ligne précédente
Hpremière ligne de l'écran
Mmilieu de l'écran
Ldernière ligne de l'écran
ggpremière ligne du fichier
Gdernière ligne du fichier
23Galler à la 23è ligne du fichier
Ctrl+Gaffiche le nombre de lignes du fichier et parfois la position dans le fichier (dépand de la version)
mode commandes - copier / coller / remplacer
rremplace le caractère courant par celui qu'on tape juste après
Rremplace une suite de caractères, à partir du caractère courant. Finir avec 'Echap'
Cefface la fin de la ligne, et passe en mode insertion
Jjoint la ligne courante à la ligne suivante, en remplaçant le saut de ligne par un espace
xcoupe le caractère courant (donc l'efface et le garde en mémoire pour pouvoir le coller ailleurs)
touche 'Suppr'idem
Xcoupe le caractère précédant
dwcoupe le mot courant
dbcoupe le début du mot courant
ddcoupe la ligne courante
5dcoupe la ligne courante et les 4 suivantes
d$coupe jusqu'à la fin de la ligne
d^coupe du début de la ligne jusqu'au curseur (il faut appuyer deux fois sur touche '^')
yycopie la ligne courante
5ycopie la ligne courante et les 4 suivantes
y3 + Entréecopie la ligne courante et les trois lignes en dessous.
Appuyez sur Entrée pour valider. On voit s'afficher "4 lines yanked"
pcopie les caractères mémorisés (par les commandes précédentes) après le curseur si des caractères ont été mémorisés, ou à la ligne suivante si une ligne a été mémorisée.
Si rien n'est mémorisé, recopie la ligne courante sous la ligne courante.
mode commandes - rechercher
fxrecherche le premier caractère x rencontré sur la ligne, après le curseur. Ne cherche pas sur les autres lignes.
Fxidem, mais avant le curseur
/chaine + Entréepositionne le curseur sur la prochaine occurence de "chaine". La recherche se fait en avançant dans le fichier. Retour automatique au début du fichier si nécessaire. Certaines versions de vi colorent toutes les occurences trouvées. Valider avec 'Entrée'.
?chaine + Entréeidem, mais la recherche se fait en arrière.
npoursuit la recherche dans le même sens
Npoursuit la recherche en sens inverse
mode commandes - divers
uundo - annule la ou les dernières commandes en remontant dans l'historique des commandes. Les veilles versions de vi ne peuvent annuler que la dernière commande.
ZZsauvegarde le fichier et quitte vi
Ctrl + Lrafraîchit l'écran
:passe en mode EX

2.3 Le mode EX (commandes étendues)

Comme je l'ai dit plus haut, le mode EX est le mode commandes étendues. Ce mode fonctionne exactement comme le mode commande, mais avec des commandes plus complexes, donc plus longues. Cette fois, on va voir à l'écran la commande qu'on tape, pour éviter les erreurs. Et on va valider notre commande avec la touche 'Entrée'. Pour indiquer à vi qu'on veut une commande étendue, on passe en mode commande, et on appuie sur ':'. On voit alors les deux-points apparaitre en bas à gauche de l'écran. Il suffit alors de compléter notre commande et de la valider.

La plupart des commandes étendues portent sur le numéro de ligne. On va donc taper notre première commande étendue, qui va afficher le numéro des lignes : ":set number". On voit maintenant s'afficher le numéro de ligne à gauche de chaque ligne, ce qui est très pratique. Si vous voulez les effacer, tapez ":set nonumber".

Avant de continuer, il nous faut apprendre la syntaxe utilisée par vi pour désigner, par exemple, la ligne courante, ou les lignes de 10 à 20. Cette syntaxe est décrite dans le tableau suivant.

mode EX - syntaxe des commandes
.la ligne courante
$la dernière ligne
1,$ ou %de la première à la dernière ligne
n (par exemple 23)la ligne n°23
-la ligne précédente
-nla nième ligne précédente
/texte/la prochaine ligne contenant le texte "texte"
?texte?la ligne précédente contenant le texte "texte"
mode EX - caractères spéciaux dans les chaines
.représente un caractère quelconque
*répète le caractère un nombre de fois indéfini
^Kligne qui commence par K
K$ligne qui se termine par K
^a.*z$ligne qui commence par a ("^a"), suivi de n'importe quel caractère (".") n'importe quel nombre de fois ("*"), et qui se termine par z ("z$")

Voyons maintenant les différentes commandes.

mode EX - ajout et modification de texte
:aajoute du texte après la ligne courante.
Le texte qu'on tape s'affiche en bas de l'écran. Il faut appuyer sur 'Echap' pour valider.
:23aajoute du texte après la ligne 23.
Le texte qu'on tape s'affiche en bas de l'écran. Il faut appuyer sur 'Echap' pour valider.
:cchange la ligne courante par la nouvelle saisie.
Le texte qu'on tape s'affiche en bas de l'écran. Il faut appuyer sur 'Echap' pour valider.
:3,14cchange les lignes 3 à 14 par la nouvelle saisie.
Le texte qu'on tape s'affiche en bas de l'écran. Il faut appuyer sur 'Echap' pour valider.
:jjoint la ligne courante à la ligne suivante, en remplaçant le saut de ligne par un espace
:2,17jjoint les lignes 2 à 17 en remplaçant le saut de ligne par un espace
mode EX - effacement, copie et déplacement de texte
:9,11m34déplace les lignes 9 à 11 après la ligne 34
:9,11t34copie les lignes 9 à 11 après la ligne 34
:dcoupe la ligne courante (donc l'efface et le garde en mémoire pour pouvoir le coller ailleurs)
Fait exactement la même chose que la commande dd.
:3,8dcoupe les lignes 3 à 8
:%g/chaine/dsupprime toutes les lignes (de 1 à $) contenant la chaine de caractères "chaine" (garde la dernière ligne trouvée en mémoire tampon)
:3,58g/^$/dsupprime les lignes vides rencontrées entre la ligne 3 et la ligne 58
mode EX - recherche et remplacement de texte
:%s/texte/TEXTE/gremplace toutes les chaines de caractères "texte" par "TEXTE" dans tout le document
:%s/texte/TEXTEremplace toutes les chaines de caractères "texte" par "TEXTE" dans tout le document MAIS une seule fois par ligne
:%s/texte/TEXTE/gcremplace toutes les chaines de caractères "texte" par "TEXTE" dans tout le document, et demande confirmation
:s/texte/TEXTE/gremplace toutes les chaines de caractères "texte" par "TEXTE", uniquement sur la ligne courante
:s/[ab]/[AB]/gremplace "a" par "A" et "b" par "B", uniquement sur la ligne courante
:g/linux/s/texte/TEXTE/gremplace toutes les chaines de caractères "texte" par "TEXTE", uniquement sur les lignes qui contiennent "linux"
:srecommence le dernier remplacement, sur la ligne courante
:3,8srecommence le dernier remplacement, sur les lignes 3 à 8
:s/K.*$//remplace la chaine de caractères qui commence par un K, suivi de n'importe quel caractères (".") n'importe quel nombre de fois ("*") par une chaine vide
:s/^K.*$//remplace la ligne qui commence par un K, suivi de n'importe quel caractères (".") n'importe quel nombre de fois ("*") par une chaine vide. Donc supprime toutes les lignes qui commences par K.
:%g/linux/paffiche, en bas de l'écran, toutes les lignes qui contiennent "linux"
:g/windows/dsupprime toutes les lignes qui contiennent "windows"
:g!/linux/dsupprime toutes les lignes SAUF celles qui contiennent "linux"
:/continue la recherche de haut en bas
:?continue la recherche de bas en haut
mode EX - ouvrir, fermer et sauvegarder un fichier
:r fichierlit le fichier "fichier" et insert son contenu après la ligne courante
:r !lsexécute la commande shell "ls" insert son résultat après la ligne courante. Le "!" sert à exécuter une commande shell.
:e fichiercharge le fichier "fichier" à la place du document courant
:wsauvegarde le fichier (write)
:w!force la sauvegarde. Utile si le fichier est en lecture seule
:w fichierenregistre le document sous le nom "fichier".
:w! fichierforce l'enregistrement du document sous le nom "fichier". Si fichier existe déjà, il sera écrasé.
:f fichierfait un "enregistrer sous" du document, sous le nom "fichier".
Attention : vous devez faire ":w" après pour confirmer l'enregistrement.
:qquitte vi. Si les dernières modifications n'ont pas été enregistrées, la sortie est refusée.
:q!force vi à quitter, même si les dernières modifications n'ont pas été enregistrées.
:wqsauvegarde et quitte
mode EX - divers
:!lsexécute la commande shell "ls"(on peut mettre n'importe quelle commande shell)
:shexécute un shell. Tapez "exit" pour revenir à vi.
Remarque : le shell exécuté est le shell par défaut (bash sous linux). Pour choisir votre shell, vous pouvez, par exemple, taper ":!/bin/csh".
:haffiche une fenêtre d'aide. Tapez ":q" pour quitter.
:h commandeaffiche l'aide sur la commande passée en paramètre.
:uundo - annule la ou les dernières commandes en remontant dans l'historique des commandes. Les veilles versions de vi ne peuvent annuler que la dernière commande. Identique à la commande "u".
:37déplace le curseur à la ligne 37
:=affiche le numéro de la ligne courante
:se nu
ou :set number
affiche le numéro des lignes à gauche
:se nonu
ou :set nonumber
efface le numéro des lignes à gauche

3. Paramétrage

Il existe des commandes EX qui permettent de paramétrer vi. On en a déjà vu une : ":set number". Toutes les commandes de paramétrage commencent par ":set" suivi du paramètre. Pour désactiver un paramètre, il faut rajouter un "no" devant le nom du paramètre, sans espace. Par exemple ":set nonumber".

Voici les principales options (pour les voir toutes, tapez ":set all") :

paramétrage de vi
:set allaffiche toutes les options
:setaffiche toutes les options actives
:set numberaffiche le numéro des lignes à gauche
:set listaffiche les caractères non imprimables
:set errorbellsbip sonnore en cas d'erreur
:set showmodeaffiche le mode de travail (insertion, etc.)

4. Conclusion

Il est clair que vi est plus compliqué à prendre en main qu'un éditeur de texte classique, comme kedit ou gedit. Mais il permet de faire des choses que les autres ne savent pas faire ou qu'ils ne peuvent faire qu'à l'aide de nombreuses actions ; par exemple, joindre des lignes. En plus, dans le cas ou vous n'avez pas d'interface graphique (connexion distante sur un serveur, par exemple), vous n'aurez probablement pas d'autre choix que d'utiliser vi. Mais ne vous inquiétez pas, il suffit de connaitre les commandes indispensables, comme la suppression de caractères et l'enregistrement. Les autres commandes sont là pour vous faire gagner du temps (parfois précieux), mais vous n'êtes pas obligé de les connaitre par coeur. Eventuellement, glissez cette page dans vos favoris pour vous y reporter quand vous en aurez besoin ;o).

Dernière mise à jour : 12 octobre 2006

Valid XHTML 1.1

logo firefox logo ubuntu logo debian logo mandriva logo gimp