Memento vi
vi (prononcer vi aïe) est l'éditeur de texte en mode console par excellence, il permet de manipuler des fichiers textes sans accès graphique, une console lui suffit.
Sa prise en main est difficile mais une fois maîtrisées et en mémoire la plupart des commandes, cela en fait un très puissant éditeur.
C'est vi que j'ai utilisé pour écrire la totalité des scripts PHP générant ce site WEB, c'est aussi vi que j'utilise pour éditer les fichiers de configuration de mon serveur.
Sommaire
01. Notations
02. Ligne de commande
03. Modes de vi
04. Opérations sur les fichiers en mode EX
05. Déplacement du curseur en mode commande
06. Ajustement de l'écran
07. Commandes de marquage
08. Commandes de recherche
09. Entrée dans le mode d'édition
10. Corrections en mode édition
11. Commandes du mode commande
12. Commandes EX
13. Expressions régulières pour les recherches
14. Configuration de vi
15. Références
01 Notations
| Notation | Signification |
| x ou X | caractère tapé (minuscule ou majuscule) |
| ^x | caractère tapé en maintenant la touche Ctrl appuyée |
| ESC | touche échappement |
| CR | touche entrée |
| ESP | touche espace |
| ARR | touche retour arrière |
| [] | facultatif |
| car | un seul carctère |
| chn | une chaîne de caractères |
| fich | un nom de fichier |
| cmd | une commande |
| n | un nombre |
| nn | référence à un numéro de ligne - un nombre - un marqueur de déplacement ($,'x, x, etc.) - une expression à chercher (/chn/, etc.) |
Les commandes ex (commencant par :, / ou ?) se terminent par CR.
02. Ligne de commande
/usr/bin/vi [-R] [-wn] [+[nn]] [-c command] [fich...]
| Paramètre | Rôle |
| -R | Mode lecture seule |
| -wn | Définit la taille par défaut de la fenêtre a n |
| -c command | Commence l'édition par l'exécution de la commande spécifiée |
| +[nn] | Commence l'édition à la dernière ligne [à la ligne nn] |
| fich | Liste des fichiers à éditer |
03. Modes de vi
| Mode | Description |
| commande | Mode normal et initial. On y retourne ou on interromp une commande par ESC. |
| édition | On y entre depuis le mode commande par les caractères a A i I o O c C s S r ou R On sort du mode édition par ESC. |
| ex | On y entre depuis le mode commande par les caractères : / ? ou ! On sort du mode commande ex par ESC. Toutes le commandes ex sont terminées par CR. Le séparateur de commandes est |. |
04. Opérations sur les fichiers en mode EX
| Commande | Action |
| :[nn,nn] w[!] [[>>] fich] | sauve le texte dans fich |
| :w | sauve le fichier courant |
| :w! | sauvegarde forcée du fichier |
| :w >> fich | sauve le texte à la fin de fich |
| :nn,nn w fich | sauve les lignes de l'intervalle nn,nn dans fich |
| :q | quitte vi s'il n'y a pas de changements à enregistrer |
| :q! | quitte vi et oublie les changements |
| :wq | enregistre et quitte |
| :x | enregistre et quitte |
| :ar[gs] | affiche la liste des arguments (liste des fichiers à éditer) |
| :rew[!] | édite le premier fichier de la liste des arguments |
| :n[!] | édite le fichier suivant dans la liste des arguments |
| :f | affiche le nom du fichier et la ligne courants |
| :.= | affiche le numéro de la ligne courante |
| := | affiche le nombre de ligne du fichier |
| :e[!] [+n] [fich] | édite le fichier fich |
| :e! | réédite le fichier (oublie les changements) |
| :e! +n fich | édite le fichier fich en ligne n, ignore les changements |
| :e + fich | édite le fichier fich, démarre à la fin |
| :e# | édite le dernier fichier édité |
| :sh | exécute un shell sh et revient par exit |
| :so[urce] fich | exécute le script shell fich |
| :!cmd | exécute la commande cmd et revient |
| :! | réexécute la dernière commande :!cmd |
:st[op] :su[spend] | suspend vi, on revient par fg |
| :cd [rep] | change de répertoire de travail |
| :[nn] r fich | insère fich dans le texte édité [à la ligne nn] |
| :[nn] r !cmd | exécute la commande cmd et insère sa sortie dans le texte |
| Paramètres des commandes: |
| % | nom du fichier courant |
| # | nom du dernier fichier édité |
| ! | nom de la dernière commande lancée par :! |
05. Déplacement du curseur en mode commande
[n] = n fois
| Touche ou combinaison | Déplacement |
[n]flêche gauche [n]h [n]^h | un caractère à gauche |
[n]flêche droite [n]l [n]ESP | un caractère à droite |
[n]flêche bas [n]j | un caractère vers le bas |
[n]flêche haut [n]k | un caractère vers le haut |
[n]+ [n]CR | ligne suivante, premier caractère non-blanc |
| [n]- | ligne précédente, premier caractère non-blanc |
| nG | va à la ligne numero n si elle existe sans n ou avec n=$ : fin du fichier |
| n| | va à la colonne numéro n si elle existe |
| [n]( | début de la phrase [n fois] |
| [n]) | fin de la phrase |
| [n]{ | début du paragraphe |
| [n]} | fin du paragraphe |
| [n][[ | début de la section/fonction |
| [n]]] | fin de la section/fonction |
| [n]H | première [nième] ligne de l'écran |
| [n]L | dernière [- n] ligne de l'écran |
| M | ligne du milieu de l'écran |
^ _ | premier caractère non-blanc de la ligne |
| 0 | début de la ligne |
| [n]$ | fin de la ligne |
| [n]w | mot suivant |
| [n]W | mot entouré de blanc suivant |
| [n]b | mot précédent |
| [n]B | mot entouré de blanc précédent |
| [n]e | fin du mot |
| [n]E | fin du mot entouré de blanc |
| [n]fcar | va au prochain car de la ligne |
| [n]Fcar | va au précédent car de la ligne |
| [n]tcar | va au caractère précédent le prochain car de la ligne |
| [n]Tcar | va au caractère suivant le précédent car de la ligne |
06. Ajustement de l'écran
| Touche ou combinaison | Action |
| ^l | efface et retrace la fenêtre |
| ^f | descend d'une page |
| ^b | remonte d'une page |
| ^u | descend d'une demi page |
| ^d | remonte d'une demi page |
| ^e | descend la fenêtre d'une ligne |
| ^y | monte la fenêtre d'une ligne |
| [n]zCR | positionne la ligne courante [la ligne n] en haut de la fenêtre |
| [n]z- | positionne la ligne courante [la ligne n] en bas de la fenêtre |
| [n]z. | positionne la ligne courante [la ligne n] au milieu de la fenêtre |
07. Commandes de marquage
| Touche ou combinaison | Action |
| mx | marque la position courante avec le caractère x [a-z] |
| `x | va à la marque x |
| 'x | va au premier caractère non-blanc de la ligne contenant la marque x |
| `` | retourne à la ligne d'origine du dernier déplacement |
| '' | retourne au premier non-blanc de la dernière ligne changée |
08. Commandes de recherche
08.1 Recherche en mode EX
| Expression | Action |
| /exp[/] | va à la prochaine occurence de exp |
| ?exp[?] | va à la précédente occurence de exp |
| /exp/+n | va à la nième ligne après la prochaine occurence de exp |
| /exp/-n | va à la nième ligne avant la prochaine occurence de exp |
| ?exp?+n | va à la nième ligne après la précédente occurence de exp |
| ?exp?-n | va à la nième ligne avant la précédente occurence de exp |
| /exp/z | positionne la ligne de la prochaine occurence de exp en haut de la fenêtre |
| /exp/z. | positionne la ligne de la prochaine occurence de exp au milieu de la fenêtre |
| /exp/z- | positionne la ligne de la prochaine occurence de exp en bas de la fenêtre |
| ?exp?z | positionne la ligne de la précédente occurence de exp en haut de la fenêtre |
| ?exp?z. | positionne la ligne de la précédente occurence de exp au milieu de la fenêtre |
| ?exp?z- | positionne la ligne de la précédente occurence de exp en bas de la fenêtre |
/ // | répète la dernière commande / |
? ?? | répète la dernière commande ? |
08.2 Recherche en mode commande
[n] = n fois
| Touche ou combinaison | Action |
| [n]fcar | va au prochain car de la ligne |
| [n]Fcar | va au précédent car de la ligne |
| [n]tcar | va au caractère précédent le prochain car de la ligne |
| [n]Tcar | va au caractère suivant le précédent car de la ligne |
| n | répète la dernière commande / ou ? |
| N | inverse la dernière commande / ou ? |
| [n]; | répète la dernière commande t, T, f ou F |
| [n], | inverse la dernière commande t, T, f ou F |
| % | trouve le caractère (, ), { ou } correspondant |
09. Entrée dans le mode d'édition
| Touche | Où ? |
| a | après le curseur |
| A | après la fin de la ligne |
| i | avant le curseur |
| I | avant le premier caractère non-blanc de la ligne |
| o | nouvelle ligne après |
| O | nouvelle ligne avant |
10. Corrections en mode édition
| Touche ou combinaison | Action |
| ^h | efface le caractère précédent |
| ARR | efface le caractère précédent |
| ^w | efface le mot précédent |
| ^v^car | permet de saisir un caractère de commande (^car) |
| ^t | indente |
11. Commandes du mode commande
11.1 Syntaxe des commandes
["buf][n]oper[n'][depl]
| Paramètre | Signification |
| "buf | tampon pour l'opérateur (buf=a-z) |
| n | nombre d'applications de la commande |
| n' | ligne n |
| depl | déplacement du curseur (voir paragraphe correspondant) |
Où oper =
| Opérateur | Action |
| y | copie jusqu'au curseur déplacé |
| c | change jusqu'au curseur déplacé |
| d | coupe jusqu'au curseur déplacé |
| x | coupe le caractère courant |
| X | coupe le caractère précédent |
| cc | change la ligne |
| dd | coupe la ligne |
| yy | copie la ligne |
Toutes les commandes d, y, ou c s'appliquent aux déplacements.
11.2 Autres commandes
| Touche ou combinaison | Action |
| p | colle le buffer après |
| P | colle le buffer avant |
| [n]rcar | remplace n carcatères par car à partir de la position du curseur |
| [n]RchnESC | remplace le texte à partir du curseur par chn [n fois] |
| [n]schnESC | substitue chn au caractère sous le curseur [n caractères] |
| [n]SchnESC | substitue chn à la ligne [aux n lignes] |
| [n]C | change le reste de la ligne à partir du caractère courant |
| [n]D | coupe jusqu'à la fin de la ligne |
| [n]Y | copie la ligne |
| [n]~ | change le caractère [les n caractères] en minuscule/majuscule |
| u | annule le dernier changement |
| U | restaure la ligne courante |
| [n]. | répète le dernier changement [n fois] |
| [n]J | concatène avec la ligne suivantes [sur n lignes] |
| [n]>> | indente n lignes |
| [n]<< | désindente n lignes |
| ![depl]cmdCR | filtre avec la commamde cmd le texte entre la ligne courante et le curseur déplacé par depl |
| ZZ | enregistre et quitte |
| ^g | affiche le nom du fichier et le numéro de la ligne courants |
| ^z | suspend vi, on revient par fg |
11.3 Exemples de commandes de substitution
| Touche ou combinaison | Action |
| cl | remplace le caractère sous le curseur |
| cw | change le mot à partir du caractère courant |
| cW | change le mot entouré de blanc à partir du caractère courant |
| cb | change le début du mot jusqu'au caractère avant le curseur |
| cB | change le début du mot entouré de blanc jusqu'au caractère avant le caractère courant |
| c$ | change le reste de la ligne à partir du caractère courant |
| ce | change le début du mot |
| cc | substitue la ligne |
11.4 Exemples de commandes copier, coller et couper
| Touche ou combinaison | Action |
| dw | coupe le mot à partir du caractère courant |
| dW | coupe le mot entouré de blanc à partir du caractàre courant |
| db | coupe le mot du début jusqu'au caractère avant le courant |
| dB | coupe le mot entouré de blanc du début jusqu'au caractère avant le caractère courant |
| dd | coupe la ligne |
| d0 | coupe d'avant le curseur au début de la ligne |
| d^ | coupe d'avant le curseur au premier carcatère non-blanc de la ligne |
| d$ | coupe jusqu'à la fin de la ligne |
| dl | coupe le caractère |
| yw | copie le mot à partir du caractère courant |
| yW | copie le mot entouré de blanc à partir du caractère courant |
| yb | copie le mot du début jusqu'au caractère avant le courant |
| yB | copie le mot entouré de blanc du début jusqu'au caractère avant le caractère courant |
| yy | copie la ligne |
| yl | copie le caractère |
11.5 Autres exemples
| Touche ou combinaison | Action |
| ddp | inverse la ligne courante avec la suivante |
| 27z. | la ligne 27 devient la ligne courante au milieu de la fenêtre |
| 2cltextESC | remplace 2 caractères par le texte text |
| !4+sort -nCR | trie numériquement les 5 lignes à partir de la courante |
| !'fsortCR | trie toutes les lignes jusqu'au marqueur f |
| 'd!'fsortCR | trie numériquement les lignes entre les marqueurs d et f |
| 1G!Gdos2unix -CR | convertit le fichier du format dos vers le format unix |
| 1G!Gawk '{print $2}'CR | ne garde que le deuxième mot entouré de blanc de chaque ligne |
| 1G!Gsort -n t : -k 3,3CR | lors de l'édition du fichier passwd, trie le fichier par UID |
| 1G!Gsort -n -t \. -k 1,1 -k 2,2 -k 3,3 -k 4,4CR | lors de l'édition du fichier hosts, trie le fichier par adresses |
| 20G!50Gtr "[:lower:]" "[:upper:]"CR | met en majuscules les lignes 20 a 50 |
12. Commandes EX
12.1 Adresse @ pour les opérations sur les lignes
| Expression | Correspond à |
| n | ligne n |
| +n | ligne courante + n |
| -n | ligne courante - n |
| $ | dernière ligne |
| . | ligne courante |
| n,m | de la ligne n à la ligne m |
| + | ligne suivante |
| - | ligne précédente |
| /exp/ | prochaine ligne contenant l'expression exp |
| ?exp? | précédente ligne contenant l'expression exp |
| g/exp/ | toutes les lignes contenant l'expression exp |
| g!/exp/ | toutes les lignes ne contenant pas l'expression exp |
| 'x | ligne marquée par x |
| 1,$ | toutes les lignes |
12.2 Opérations sur les lignes
| Commande | Action |
| :[@] | va à l'adresse |
| :[@] d [buf] [nb] | coupe |
| :[@] pu [buf] | colle |
| :[@] ya [buf] [nb] | copie |
| :[@] j [nb] | joint avec la ligne suivante |
| :n ma car | marque la ligne avec le caractère car |
| :[@] m n | déplace la ligne [l'intervalle] après la ligne n |
| :[@] t n | copie la ligne [l'intervalle] après la ligne n |
| :n > [nb] | indente [nb lignes] à partir de la ligne n |
| :[@] > | indente les lignes |
| :n < [nb] | désindente [nb lignes] à partir de la ligne n |
| :[@] < | désindente les lignes |
| :ab chn texte | abréviation, dès que chn est inséré, remplace par texte |
| :una chn | supprime la définition de l'abréviation chn |
| :ab | affiche les abréviations définies |
| :map chn cmd | macro, exécute cmd lorsque chn est tapé |
| :unmap chn | supprime la macro chn |
| :map | affiche les macros définies |
| :[@] s/exp1/exp2/[g][c][p] | remplace exp1 par exp2 le séparateur / peut être un autre caractère |
12.3 Exemples
| Commande | Action |
| :g/LOLO/ s/laurent/bob/g | dans toutes les lignes contenant LOLO, remplace tous les laurent par des bob |
| :g!/LOLO/ s/laurent/bob/g | dans toutes les lignes ne contenant pas LOLO, remplace tous les laurent par des bob |
| :1,$ s/laurent/bob/g | remplace laurent par bob dans tout le texte |
| :1,$ g/laurent/ | va à la derniere ligne contenant laurent |
| :$ m 1 | 1 m 2 | déplace la dernière ligne au début du fichier |
| :g/^d/ d | supprime toutes les lignes commencant par d |
| :g/0$/ m $ | déplace à la fin du fichier toutes les lignes terminant par 0 |
| :'a,'b ya q | copie dans le buffer q toutes les lignes entre celle marquée par a et celle marquée par b (incluses) |
| :.,$ s/e//g | supprime tous les e de la ligne courante à la fin du fichier |
| :. m + | inverse la ligne courante avec la suivante |
:.,+9 s/^[^$]/#&/ :.,+9 g!/^$/ s/^/#/ | commente les lignes non vides sur 10 lignes à partir de la courante |
| :10,50 s/^#// | décommente les lignes de 10 à 50 |
| :'d,'f m 'm | déplace les lignes entre les lignes contenant les marques d et f (incluses) après la ligne contenant la marque m |
13. Expressions régulières pour les recherches
| Expression | Correspond à |
| ^ | début de la ligne (si premier caractère de l'expression) |
| $ | fin de la ligne (si dernier caractère de l'expression et magic) |
| . | joker, caractère quelconque |
| [chn] | un caractère de chn |
| [^chn] | un caractère non contenu dans chn |
| \< | début d'un mot |
| \> | fin d'un mot |
| * | 0, 1 ou plusieurs occurences du caractère précédent |
| \( \) | délimiteurs de sous-expressions pour les remplacements |
| & | chaîne trouvée |
|
| nième sous-expression |
| \car | le caractère spécial car /$^.*[]&|\ |
| // | dernière expression régulière entrée |
| ~ | dernière expression de remplacement entrée |
14. Configuration de vi
14.1 Modification des options de vi
| Commande | Action |
| :set option | positionne l'option à vrai |
| :set nooption | positionne l'option à faux |
| :set option=val | donne la valeur val à l'option |
| :set option? | affiche la valeur de l'option |
| :set all | affiche toutes les options |
| :set | affiche les options différentes de leur valeur par défaut |
14.2 Liste non exhaustive des options
| Nom | Abreviation | Défaut | Description |
| autoindent | ai | noai | indentation automatique |
| autoprint | ap | ap | affiche la ligne après c,d,j,m, :s, t, u |
| autowrite | aw | aw | sauvegarde automatique |
| directory | dir | dir=/tmp | emplacement du tampon disque |
| errorbells | eb | noeb | sonne lors des messages d'erreur |
| exrc | ex | noex | utilise le fichier .exrc du répertoire courant |
| hardtabs | ht | ht=8 | position des tabulateurs du terminal |
| ignorecase | ic | noic | maj/min indiférenciées pour les recherches |
| list | - | nolist | affiche tabulations et fins de ligne |
| magic | - | magic | étend aux caractères spéciaux en recherche |
| number | nu | nonu | numérote les lignes |
| readonly | ro | noro | mode lecture seule |
| scroll | - | - | nombre de lignes pour le scroll (z et ^d) |
| shell | sh | sh=$SHELL | nom du shell pour :! et :sh |
| shiftwidth | sw | sw=8 | taille de l'indentation en caractères |
| showmatch | sm | nosm | indique le séparateur () [] {} associé |
| showmmode | smd | nosmd | indique le mode d'édition |
| tabstop | ts | ts=8 | taille des tabulations ^i |
| term | - | term=$TERM | nom du terminal utilisé |
| warn | - | warn | warning "changements non enregistrés" |
| wrapmargin | wm | wm=0 | retour auto à n caractères de la marge droite |
| wrapscan | ws | ws | les recherches à la fin recommencent au début |
| writeany | wa | nowa | pas de vérification des droits d'accès |
14.3 Options au démarrage
S'il existe une variable EXINIT, elle est utilisée.
EXINIT="set option1 option2 nooption3 ..."
Sinon, s'il existe un fichier ${HOME}/.exrc, il est utilisé.
set option1
set option2
set nooption3
...
Sinon, utilise les options par défaut.
15. Références
Page du manuel de vim (une extension de vi)