Editeur VI
Le nom vi correspondant à la fois à des initiales et au nom de son fichier d'installation, il est usuellement prononcé en énonçant les deux lettres en anglais,
c'est-à-dire « vi-aille », [vi: aɪ], plutôt que comme un mot à part entière [vi].
L'analogie de ce nom avec le chiffre romain VI (six) est fortuite.
vi est un éditeur modal, c'est-à-dire que la signification des boutons et des touches change selon le mode dans lequel il se trouve.
vi est devenu de facto l'éditeur standard d'unix et il a été l'éditeur favori de nombreux hackers jusqu'à l'arrivée d'Emacs en 1984.
Il est à noter qu'Emacs est bien plus qu'un simple éditeur de texte et est pourtant souvent mis en concurrence avec vi.
À ce jour (2011), vi ou l'un de ses clones peut être trouvé dans presque toutes les installations de Unix.
La Single UNIX Specification (plus particulièrement l'« IEEE standard 1003.2, Part 2: Shell and utilities ») inclut vi.
Ainsi, tout système se conformant à cette spécification intègre vi.
Exemples de commandes simples
| Commande | Effet |
|---|---|
| h et l | déplace le curseur d'un caractère à gauche et à droite |
| j et k | déplace le curseur sur la ligne suivante et précédente |
| G | déplace le curseur à la fin du fichier |
| H et L | déplace le curseur en haut [H] et en bas [L] de l'écran |
| a | insère du texte après le curseur |
| A | insère du texte à la fin de la ligne courante |
| c | efface un certain nombre de caractères, en fonction de la sous-commande (par exemple cl permet de changer le caractère courant, cw la fin du mot courant) puis passe en mode insertion |
| dd | supprime la ligne courante (et la copie dans le buffer) |
| dw | supprime le mot après le curseur (et le copie dans le buffer) |
| dW | supprime la chaîne de caractères après le curseur (s'arrête au prochain caractère blanc) |
| D | supprime la fin de la ligne à partir du curseur |
| i | insère du texte avant le curseur |
| o | ouvre une nouvelle ligne en dessous de la ligne courante |
| O | ouvre une nouvelle ligne au-dessus de la ligne courante |
| p (minuscule) | insère le contenu du buffer après le curseur (ou après la ligne courante si le buffer contient des lignes) |
| P (majuscule) | insère le contenu du buffer avant le curseur (ou avant la ligne courante si le buffer contient des lignes) |
| :q | quitte vi |
| :q! | quitte vi même si les modifications n'ont pas été enregistrées |
| :s | remplace une chaîne de caractère par une autre. Par exemple, :s/avant/après/ remplace le mot « avant » par le mot « après » sur la ligne courante |
| u | undo, annule les effets de la commande précédente |
| w | place le curseur sur le premier caractère du mot suivant |
| :w | enregistre le fichier courant |
| :wq ou :x ou ZZ | enregistre le fichier courant et quitte |
| x | supprime le caractère sous le curseur |
| yy | copie la ligne courante dans le buffer (p insère la ligne copiée après la ligne courante) |
| y3y | copie 3 lignes dont la ligne courante dans le buffer (p insère les 3 lignes copiées après la ligne courante) |
| yw | copie le mot après le curseur dans le buffer (p insère le mot copié après le curseur) |
| y3w | copie les 3 mots après le curseur dans le buffer (p insère les 3 mots copiés après le curseur) |
| / | recherche une chaîne de caractères après le curseur. Une pression sur la touche "n" permet d'aller directement à l'occurence suivante. |
| ? | recherche une chaîne de caractères avant le curseur |
| #commande | exécute # fois la commande, par exemple 5dd efface 5 lignes |
| !commande | exécute une commande shell, par exemple :!gcc -o hello hello.c |
| Echap | quitte le mode insertion (retourne au mode commande) |
Exemples de commandes avancées.
| Commande | Effet |
|---|---|
| >> | ajoute une tabulation en début de ligne |
| << | retire une tabulation en début de ligne |
| "myy | mémorise la ligne courante dans le registre "m |
| "mp | insère le contenu du registre "m après la ligne courante ou après le curseur |
| :$ | place le curseur à la dernière ligne du tampon |
| :1 | (ou tout autre numéro) place le curseur sur la ligne correspondante |
| :.= | renvoie le numéro de la ligne courante |
| :10,20t 100 | copie les lignes 10 à 20 à la ligne 100 |
| :100$m 50 | déplace de la ligne 100 à la dernière ligne à la 50ème ligne |
| :10,20 s/TRUC/bidule/g | remplace tous les TRUC par des bidule dans les lignes 10 à 20 |
| :g!/machin/d | efface les lignes ne contenant pas le texte machin |
| :g/machin/d | efface les lignes contenant le texte machin |
| :r fichier.txt | insère le contenu du fichier fichier.txt |
| :10,20w fichier.txt | enregistre les lignes 10 à 20 dans le fichier fichier.txt |
| :e! | ouvre à nouveau le fichier courant (sert par exemple si le fichier a été modifié entre temps) |
| :r!ls -l | insère le résultat de la commande ls -l dans le fichier |
| :10,20g/condition/remplacer/resultat/gc | remplace tous les remplacer par des resultat dans les lignes contenant condition, en demandant confirmation à chaque fois, entre les lignes 10 et 20 |
| :40,50 g/condition/d | efface les lignes contenant condition, entre les lignes 40 et 50 |
| :s/.*/\U&/ | passe la ligne courante en majuscule |
| :%s/^mot// | efface le mot mot s'il est en début de ligne |
| :%s/foo/bar/g | Remplace toutes les occurrences de foo par bar |
| :3,7s%foo/bar%bar/foo%c | Remplace après confirmation (c) aux lignes 3 à 7 les occurrences de la sous-chaîne foo/bar par bar/foo. Cela montre que l'on peut utiliser un autre caractère séparateur que / (ici %) |
| :g/^[\.]*$/d | supprime les lignes vides |




