Vi
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 :
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.
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 :
i | insert le texte avant le curseur |
a | insert 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).
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.
flèches gauche, droite, haut, bas ou h, l, k, j | déplacement à gauche, à droite, en haut et en bas |
Ctrl+F ou Page_Bas | page suivante |
Ctrl+B ou Page_Haut | page précédente |
Ctrl+D | demi-page suivante |
Ctrl+U | demi-page précédente |
Ctrl+H | un 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 |
w | mot suivant |
W | mot suivant, en ignorant la ponctuation |
b | mot précédent |
B | mot précédent, en ignorant la ponctuation |
e | fin du mot courant |
+ | ligne suivante |
- | ligne précédente |
H | première ligne de l'écran |
M | milieu de l'écran |
L | dernière ligne de l'écran |
gg | première ligne du fichier |
G | dernière ligne du fichier |
23G | aller à la 23è ligne du fichier |
Ctrl+G | affiche le nombre de lignes du fichier et parfois la position dans le fichier (dépand de la version) |
r | remplace le caractère courant par celui qu'on tape juste après |
R | remplace une suite de caractères, à partir du caractère courant. Finir avec 'Echap' |
C | efface la fin de la ligne, et passe en mode insertion |
J | joint la ligne courante à la ligne suivante, en remplaçant le saut de ligne par un espace |
x | coupe le caractère courant (donc l'efface et le garde en mémoire pour pouvoir le coller ailleurs) |
touche 'Suppr' | idem |
X | coupe le caractère précédant |
dw | coupe le mot courant |
db | coupe le début du mot courant |
dd | coupe la ligne courante |
5d | coupe 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 '^') |
yy | copie la ligne courante |
5y | copie la ligne courante et les 4 suivantes |
y3 + Entrée | copie la ligne courante et les trois lignes en dessous. Appuyez sur Entrée pour valider. On voit s'afficher "4 lines yanked" |
p | copie 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. |
fx | recherche le premier caractère x rencontré sur la ligne, après le curseur. Ne cherche pas sur les autres lignes. |
Fx | idem, mais avant le curseur |
/chaine + Entrée | positionne 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ée | idem, mais la recherche se fait en arrière. |
n | poursuit la recherche dans le même sens |
N | poursuit la recherche en sens inverse |
u | undo - 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. |
ZZ | sauvegarde le fichier et quitte vi |
Ctrl + L | rafraîchit l'écran |
: | passe en mode EX |
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.
. | 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 |
-n | la nième ligne précédente |
/texte/ | la prochaine ligne contenant le texte "texte" |
?texte? | la ligne précédente contenant le texte "texte" |
. | représente un caractère quelconque |
* | répète le caractère un nombre de fois indéfini |
^K | ligne 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.
:a | ajoute 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. |
:23a | ajoute 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. |
:c | change 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,14c | change 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. |
:j | joint la ligne courante à la ligne suivante, en remplaçant le saut de ligne par un espace |
:2,17j | joint les lignes 2 à 17 en remplaçant le saut de ligne par un espace |
:9,11m34 | déplace les lignes 9 à 11 après la ligne 34 |
:9,11t34 | copie les lignes 9 à 11 après la ligne 34 |
:d | coupe 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,8d | coupe les lignes 3 à 8 |
:%g/chaine/d | supprime 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/^$/d | supprime les lignes vides rencontrées entre la ligne 3 et la ligne 58 |
:%s/texte/TEXTE/g | remplace toutes les chaines de caractères "texte" par "TEXTE" dans tout le document |
:%s/texte/TEXTE | remplace toutes les chaines de caractères "texte" par "TEXTE" dans tout le document MAIS une seule fois par ligne |
:%s/texte/TEXTE/gc | remplace toutes les chaines de caractères "texte" par "TEXTE" dans tout le document, et demande confirmation |
:s/texte/TEXTE/g | remplace toutes les chaines de caractères "texte" par "TEXTE", uniquement sur la ligne courante |
:s/[ab]/[AB]/g | remplace "a" par "A" et "b" par "B", uniquement sur la ligne courante |
:g/linux/s/texte/TEXTE/g | remplace toutes les chaines de caractères "texte" par "TEXTE", uniquement sur les lignes qui contiennent "linux" |
:s | recommence le dernier remplacement, sur la ligne courante |
:3,8s | recommence 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/p | affiche, en bas de l'écran, toutes les lignes qui contiennent "linux" |
:g/windows/d | supprime toutes les lignes qui contiennent "windows" |
:g!/linux/d | supprime toutes les lignes SAUF celles qui contiennent "linux" |
:/ | continue la recherche de haut en bas |
:? | continue la recherche de bas en haut |
:r fichier | lit le fichier "fichier" et insert son contenu après la ligne courante |
:r !ls | exécute la commande shell "ls" insert son résultat après la ligne courante. Le "!" sert à exécuter une commande shell. |
:e fichier | charge le fichier "fichier" à la place du document courant |
:w | sauvegarde le fichier (write) |
:w! | force la sauvegarde. Utile si le fichier est en lecture seule |
:w fichier | enregistre le document sous le nom "fichier". |
:w! fichier | force l'enregistrement du document sous le nom "fichier". Si fichier existe déjà, il sera écrasé. |
:f fichier | fait un "enregistrer sous" du document, sous le nom "fichier". Attention : vous devez faire ":w" après pour confirmer l'enregistrement. |
:q | quitte 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. |
:wq | sauvegarde et quitte |
:!ls | exécute la commande shell "ls"(on peut mettre n'importe quelle commande shell) |
:sh | exé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". |
:h | affiche une fenêtre d'aide. Tapez ":q" pour quitter. |
:h commande | affiche l'aide sur la commande passée en paramètre. |
:u | undo - 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". |
:37 | dé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 |
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") :
:set all | affiche toutes les options |
:set | affiche toutes les options actives |
:set number | affiche le numéro des lignes à gauche |
:set list | affiche les caractères non imprimables |
:set errorbells | bip sonnore en cas d'erreur |
:set showmode | affiche le mode de travail (insertion, etc.) |
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 ;-).