L'éditeur Vi
vi est un éditeur de texte en mode texte plein écran écrit par Bill Joy en 1976 sur une des premières versions de la distribution Unix BSD.
Il est présent d'office sur la majorité des systèmes Unix actuels, souvent sous la forme d'un clone du logiciel vi originel.
Dans cet article, après une brève description du mode de fonctionnement, nous allons détailler les commandes les plus souvent utilisées.
Voyons tout ceci plus en détail.
- Mode de fonctionnement
- Introduction aux commandes vi
- Commandes de déplacement
- Commandes d'édition
- Sauvegarder les travaux et quitter vi
- Travail simultané sur plusieurs fichiers
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.
En mode insertion, le texte tapé est inséré dans le document. Appuyer sur la touche Echap depuis le mode insertion permet de passer dans le mode commande, dans lequel les touches correspondent à des déplacements du curseur ou à des fonctions d'édition. Par exemple, j descend le curseur d'une ligne, x efface le caractère sous le curseur (la position « sous le curseur » peut désigner la droite du curseur si ce dernier se place entre les caractères, au-dessus du caractère de soulignement ou sous le bloc rectangulaire, selon la manière dont le terminal représente le curseur).
Les touches tapées en mode commande ne sont pas insérées dans le texte, ce qui est une cause fréquente de confusion pour les utilisateurs débutants avec vi.
En mode commande, de nombreuses opérations peuvent être effectuées en série avec des séquences de touches simples, sans qu'il soit nécessaire de maintenir les touches Alt ou Ctrl enfoncées. Les opérations les plus élaborées sont composées d'opérations plus primaires. Par exemple, d3w efface trois mots (d pour delete (effacer) et w pour word (mot), c2fa change (change) le texte jusqu'à ce qu'il trouve (find) le second (2) a. Pour les utilisateurs expérimentés, cela permet de travailler très efficacement. Cela permet également à l'utilisateur de conserver en permanence ses mains sur le clavier.
Appel de vi
L'appel de vi s'effectue selon l'une des trois syntaxes suivantes :
- vi [options] fichier
- vi [options] -t tag
- vi [options] -e [fichier_erreurs]
Options
Les options doivent toujours précéder le ou les noms de fichiers.
-t tag
Le fichier à éditer et la position du curseur dépend d'un tag (d'une marque), une sorte de label de goto. Le tag est recherché dans le fichier des tags.
-e fichier_erreurs
Démarre en mode réparation rapide. Le fichier fichier_erreurs est lu et la première erreur est affichée. Voir la commande ":help quickfix".
+[num]
Pour le premier fichier, le curseur est positionné sur la ligne num. Si num est absent, il est positionné sur la dernière ligne.
+/{motif}
Pour le premier fichier, le curseur est positionné sur la première occurence de motif. Voir ":help search_pattern".
+{commande}, -c commande
La commande est exécutée lorsque le premier fichier a été lu. Elle est interprété comme une commande ex.
-b
Mode binaire. Permet l'édition d'un fichier binaire ou exécutable.
-i viminfo
Définit le fichier viminfo à utiliser à la place de celui par défaut (~/.viminfo).
-g
Cette option active l'interface graphique si vi a été compilé avec le support d'une interface graphique (GUI).
-H
Permet l'édition de fichiers dont le texte est orienté de droite à gauche, si vi a été compilé avec l'option RIGHTLEFT.
-n
N'utilise pas de fichier d'échange (swap). La récupération après un crash devient alors impossible. N'est utile que pour un système sous dimensionné en espace disque.
-o[N]
Ouvre N fenêtres. Lorsque N est omis ouvre une febêtre par fichier.
-r
Liste les fichiers d'échange et les informations permettant de les récupérer.
-r fichier
Mode récupération. Le fichier d'échange fichier est utilisé pour récupérer une session d'édition perdue lors d'un crash. Voir la commande ":help recovery".
-r scriptin
Lit le fichier scriptin. Les caractères sont interprétés comme s'ils avaient été saisis. La commande :source! {scriptin} est équivalente.
-T terminal
Donne à vi le nom du terminal utilisé
-u vimrc
Utilise les commandes du fichier vimrc pour l'initialisation. Toutes les autres initialisations sont annulées.
-v
Mode vue. L'option lecture seule est activée. L'édition est possible mais le fichier est protégé contre un écrasement accidentel. L'utilisation du point d'exclamation permet néanmoins le sauvegarde.
-w scriptout
Tous les caractères saisis sont écrits dans le fichier scriptout jusqu'à la sortie de vi. Permet de créert un script lu par la commande vi -s ou :source!
-W scriptout
Comme -w mais le fichier existant est écrasé.
--
Marque la fin des options. Les arguments suivants sont considérés comme des noms de fichiers pouvant commencer par un tiret.
Les modes vi
- Le mode commande
Le mode commande est actif dès après l'appel. On peut alors :
- activer le mode insertion
- lancer des commandes d'édition du texte
- déplacer le curseur dans le fichier
- appeler des commandes ex
- lancer un shell Linux
- sauvegarder le fichier ou quitter l'éditeur
- Le mode insertion
La saisie de texte se fait en mode insertion. On quitte le mode insertion et passer en mode commande en pressant la touche ECHAP. Les commandes suivantes permettent de passer en mode insertion en précisant l'endroit où effectuer l'insertion.
a : insertion après le curseur.
A : Insertion en fin de ligne.
c : Début d'une opération de remplacement.
C : Remplacement jusqu'en fin de ligne.
i : Insertion avec le curseur.
I : Insertion en début de ligne.
o : Insertion à la ligne suivante;
O : Insertion à la ligne précédente.
R : Active le mode écrasement.
s : Remplace un caractère.
S : remplace une ligne entière.
Syntaxes des commandes vi
Les commande vi obéissent à la syntaxe générale suivante :
[n] opérateur [m] objet
Les opérateurs principaux sont :
c : Remplacement
d : Effacement/Suppression
y : Collage (ou copie)
Si l'opération doit se dérouler sur la ligne active, l'opérateur est identique à l'objet : cc, dd, yy. Sinon l'opéateur agit sur des objets spécifiés par les commandes de déplacement du curseur ou par des expressions rationnelles. n et m sont des préfixex indiquant le nombre de fois que l'opération doit être exécutée ou sur combien d'objets. Si n et m sont tous deux spécifiés, le résultat est n x m.
Un objet peut représenter l'un ou l'autre de ces éléments de texte :
mot
Tous les caractères jusqu'au prochain espace ou signe de ponctuation. Un objet dont la première ligne est en majuscules ne reconnaît que les caratères d'espacement.
phrase
Tous les caractères jusqu'au prochain ., !, ?, suivi de deux espaces.
paragraphe
Tous les caractères jusqu'à la prochaine ligne vierge, ou selon la définition d'un paragraphe telle que spécifiée par l'opérateur para=.
section
Tout le texte jusqu'au prochain en-tête de section, tel que spécifié par l'opérateur sect=.
Exemples :
2cw : Remplace les deux prochains mots
d} : Efface jusqu'au prochain paragaphe.
d^ : Efface jusqu'au début de la ligne.
5yy : Copie les cinq prochaines lignes
y]] : Copie tout jusqu'à la prochaine section.
Travail avec la ligne d'état
On utilise la ligne d'état, en bas de la fenêtre vi, pour appeler les commandes suivantes :
/
Recherche d'un motif vers l'avant.
?
Recherche d'un motif vers l'arrière.
:
Appel d'une commande ex.
!
Appel d'une commande shell qui reçoit en entrée un objet tampon actif et le remplace par la sortie de la commande.
Les commandes appelées en ligne de commande sont lancées en pressant la touche ENTREE. Par ailleurs, les messages d'erreur et la sortie de la commande CTRL-g sont également afficés sur la ligne de commande.
On précise le nombre de fois qu'une commande doit être exécutée en la préfixant du nombre souhaité. Les commandes de déplacement peuvent aussi servir d'objet pour des opérations de remplacement, d'effacement et de collage.
Caractères
h, j, k,l : Gauche, bas, haut, droite.
ESPACE : Droite
Texte
w, W, b, B : Début du mot suivant, du mot courant.
e, E : Fin du mot courant
), ( : Début de la phrase suivante/précédente.
}, { : Début du paragraphe suivant/précédent.
]], [[ : Début de la section suivante/précédente.
Lignes
0, $ : Début de ligne, fin de ligne
^ : Premier caractère autre qu'un espace dans la ligne.
+, - : Premier caractère de la ligne suivante/précédente.
ENTREE : Premier caractère de la ligne suivante.
n| : nième colonne de la ligne courante.
H : Première ligne de l'écran.
M : Ligne centrale de l'écran.
L : Dernière ligne de l'écran.
nH : n lignes en dessous de la première ligne de l'écran.
nL : n lignes au-dessus de la dernière ligne de l'écran.
Écrans
CTRL-f, CTRL-b : Avance/recule d'un écran.
CTRL-d, CTRL-u : Avance/recule d'un demi-écran.
CTRL-e, CTRL-y : Affiche une ligne supplémentaire.
z ENTREE : Repositionne la ligne active en haut de l'écran.
z. : Repositionne la ligne active au centre de l'écran.
z- : Repositionne la ligne active en bas de l'écran.
CTRL-l, CTRL-r : Redessine l'écran (sans déplacement).
Recherche
/motif : Recherche motif vers l'avant.
/ : Répétition de la recherche vers l'avant.
/motif/+n : Rallie à la nième ligne après motif
?motif : Recherche motif vers l'arrière.
?: Répétition de la recherche vers l'arrière.
?motif?+n : Rallie à la nième ligne avant motif.
n : Répète la dernière opération de recherche.
N : Répète la dernière opération de recherche dans la direction opposée.
% : Déplacement vers la parenthèse (ou le crochet, ou l'accolade) qui complète celle sur laquelle se trouve le curseur.
fx : Déplacement vers l'avant jusqu'à x sur la ligne courante.
Fx : Déplacement vers l'arrière jusqu'à x sur la ligne courante.
tx : Déplacement vers l'avant devant x sur la ligne courante.
Tx : Déplacement vers l'arrière derrière x sur la ligne courante.
, : Inverse la direction de recherche de la dernière commande f, F, t ou T.
; : Répète la direction de recherche de caractère (f, F, t ou T).
Numérotation de lignes
CTRL-g : Affiche des informations sur le fichiers courant.
nG : Rejoint la ligne n.
G : Rejoint la dernière ligne du fichier.
:n : Rejoint la ligne n.
Marquer sa place
mx : Marque la position actuelle du curseur avec le caractère x.
`x : (accent grave) Replace le curseur sur la marque x.
'x : (apostrophe) Place le curseur au début de la ligne contenant la marque x.
`` : (accents graves) Retourne à la marque précédente (ou à l'endroit précédant la dernière recherche).
'' : (apostrophes) Identique à la commande précédente, mais se positionne en début de ligne.
On retiendra que les principaux opérateurs de saisie de texte sont c, d et y.
Saisie de texte
a : Insertion après le curseur
A : Insertion en fin de ligne
i : Insertion avant le curseur
I : Insertion en début de ligne
o : Insère une ligne vierge sous le curseur
O : Insère une ligne vierge au dessus du curseur
ESC : Met fin au mode insertion
TAB : Insère un caractère de tabulation
BACKSPACE : Recule d'un caractère
ENTREE : Passe à la ligne suivante
CTRL-j : Passe à la ligne suivante
CTRL-i : Insère un caractère de tabulation
CTRL-t : Déplacement sur le prochain taquet de tabulation
CTRL-d : Déplacement sur le prochain taquet de tabulation précédent.
CTRL-h : Recule d'un caractère
CTRL-u : Supprime la ligne suivante
CTRL-v : Insère le prochain caractère verbatim
CTRL-w : Recule d'un mot.
Ces quatre dernières commandes relèvent de stty et peuvent par conséquent varier d'un terminal à l'autre.
Modification et suppression de texte
cw : Modifie le mot courant
cc : Modifie la ligne courante
C : Modifie le texte d'ici à la fin de la ligne
dd : Efface la ligne courante
ndd : Efface n lignes
D : Efface d'ici à la fin de la fin
dw : Efface le mot courant
d} : Efface jusqu'au début du paragraphe suivant.
d^ : Efface d'ici au début de la ligne
d/motif : Efface jusqu'à la première occurence de motif
dn : Efface jusqu'à la prochaine occurence de motif
dfa : Efface d'ici à a (y compris ce dernier) sur la ligne courante
dta : Efface d'ici à a (excluant ce dernier) sur la ligne courante
dL: Efface d'ici à la fin de l'écran
dG: Efface d'ici à la fin du fichier
p: Insère après le curseur la dernière portion de texte supprimée
P: Insère avant le curseur la dernière portion de texte supprimée
rx: Remplace le caractère courant par le caractère x
Rtexte: Remplace texte à partir du curseur
s: Remplace le caractère sous le curseur
ns: Remplace n caractères à partir de celui qui se trouve sous le curseur
S: Remplace toute la ligne active
u: Annule la dernière commande
U: Annule toutes les opérations effectuées sur la ligne courante
x: Supprime le caractère sous le curseur
X: Supprime le caractère qui précède le curseur
nX: Supprime les n caractères qui précèdent le curseur
. : Répète la dernière modification apportée au tampon
": Change la casse (minuscule/majuscule) de la lettre courante.
Copie et déplacement de texte
Y: Copie la ligne courante dans un nouveau tampon.
yy : Copie la ligne courante.
"xyy : Copie la ligne courante dans le tampon x.
"xd : Supprime la ligne courante et la met dans le tampon x
"Xd : Supprime la ligne courante et l'ajoute au tampon x
"xp: Insère le contenu du tampon x.
y]]: Copie le texte d'ici au début de la prochaine section.
ye: Copie jusqu'à la fin du mot courant.
Exemple : Un simple copier coller de la ligne courante se fera par la suite de commandes suivantes :
- yy
- p (à l'endroit désiré)
Sauvegarder le travail et quitter vi
ZZ: Quitte vi, n'enregistrant le fichier que si l'on y a apporté des changements.
:x: Identique à ZZ
:w: Enregistre le fichier.
:wq: Enregistre le fichier et quitte vi
:w fichier : Enregistre le tampon sous le nom fichier
:n1,n2w fichier : Enregistre les lignes n1 à n2 sous le nom fichier.
:n1,n2w >> fichier : Ajoute les lignes n1 à n2 du tampon àfichier.
:w! : Enregistre le fichier (passant outre la protection du fichier courant)
:w! fichier : Enregistre le tampon courant sous le nom fichier et remplace tout autre fichier de même nom.
:q : Quitte vi.
:q! : Quitte vi sans enregistrer les dernières modifications au tampon courant.
Q : Passe de vi à ex
:vi : Retourne à vi après une commande Q
:e fichier2 : Edite fichier2 sans quitter vi
:n : Edite le prochain fichier.
:e! : Retourne à l'état du fichier courant lors du dernier enregistrement.
:e# : Edite l'autre fichier
% : Nom du fichier courant.
# : Nom de l'autre fichier.
Travail simultané sur plusieurs fichiers
:e fichier : Edite un autre fichier fichier, le fichier courant devenant le deuxième fichier de travail.
:e! : Retourne à l'état du fichier courant lors du dernier enregistrement.
:e + fichier : Commence l'édition à la fin de fichier
:e +n fichier : Ouvre fichier à la ligne n
:e # : Ouvre l'autre fichier à la dernière position occupée.
:ta tag : Edite le fichier à la position tag.
:n : Edite le prochain fichier.
:n! : Impose le passage au fichier suivant.
:n fichiers : Permet de spécifier une nouvelle liste de fichiers.
CTRL-g: Affiche le nom du fichier courant et le numéro de la ligne courante.
:args : Affiche une liste des fichiers chargés dans l'éditeur.
:rew : Passe au premier des fichiers présentement chargés.