Back to homepage

vim Éditeur VI - VIM


I. Introduction

Vi/Vim n'est pas un éditeur trivial. Il dispose de commandes ésotériques et fonctionne en 'modes', ce qui n'accroit pas sa facilité d'appréhension.
On le qualifie d'éditeur modal.

Il est souvent opposé à son concurent Emacs ; ces deux éditeurs sont en effets les éditeurs des hackers, geeks et autres développeurs.
Voici quelques éléments de comparaisons rapide entre ces deux éditeurs :

ViEmacs
Appréhension difficile.Prise en main aisée.
Programme rapide et léger.Programme complet, de poids moyen.
Dans les spécifications POSIX.Programme pas toujours présent de base, mais presque toujours installable.
Déplacement des doigts réduits et frappe accélérée.Combinaisons de touches fréquentes, mains sollicités.
Scriptable.Nombreux plugins, scriptable en LISP.
Compacité.Emacs dispose d'un mode vi-like.

II. Fonctionnement modal

Vi/Vim fonctionne en mode, c'est à dire que dans chacun de ces modes, l'éditeur se comportera différemment :

a. Modes principaux

mode insert
mode insertion
mode normal
mode normal
mode visuel
mode visuel
mode ex
mode ex

Le mode qui va vous intéresser en premier sera très probablement le mode insertion qui correspond à ce que vous avez déja rencontré chez les éditeurs textes traditionnels, c'est le mode qui permet l'édition. Un mode très proche est le mode remplacement.

Le mode normal est le mode des opérations textes. C'est comme si vous aviez la touche [Control] resté enfoncée sur un editeur graphique.

Vous basculez en mode visuel lorsque vous opérer une séléction sur le texte. Sur un éditeur graphique vous obtenez traditionnellement votre séléction (faite à l'aide de la souris ou avec [Shift]) en surbrillance bleu.

Enfin, ke mode ex lance une micro-console qui ouvre la voie a la saisie de commandes en CLI. Les commandes sont compatibles avec celles d'Ex, un viel éditeur hérité d'Unix.

Mode insertion
Mode normal
Mode visuel
Mode ex
libérer )

b. Changement de mode

Le changement de mode a proprement parlé est généralement ce qui déroute le plus le néophyte. Nombreuses seront les fois ou vous serez perdu entre les diffèrents modes. Le mieux alors est de revenir au mode normal.

Le mode initial est le mode normal. Pour y revenir, double [Esc] ou, si vous êtes bloqué en mode ex, utilisez la commande :visual

Pour basculer en mode insertion, le plus classique est le célébre [i] mais vous avez également [a] ou [o]. Les majuscules de ces touches fonctionnent également, testez-les !.

La sélection, qui vous fera passer en mode visuel, se fait avec [v], sa majuscule ou même la souris si vous l'avez activée.

Le mode ex s'obtient avec [:] pour une commande simple ou encore avec [Q] pour la saisie de commandes multiples.

III. Préfixes modificateurs

a. Définition

La majorité des commandes peuvent être préfixées par des modificateurs qui vont étendre ou préciser le champs d'action de celles-ci.
La plupart des commandes s'appliquent par défaut une seule fois sur la ligne ou le caractère courant.
Pour travailler sur zone autre, ou répéter la commande, il est possible d'utiliser ces préfixes modificateurs.

b. Préfixes de répétition

Ce préfixe sert à répéter plusieurs fois la commande en question. Il s'agit simplement de préfixer la commande par ce nombre.
Si ce nombre n'est pas précisé la commande s'éxécutera une fois.
Symbole : [nombre]

c. Préfixes de zone d'action

Ce préfixe sert à préciser la zone sur laquelle la commande va agir.
Si cette zone n'est pas précisée, la commande agira sur la ligne courante.

Soit on précise une seule ligne qui est la ligne de zone d'action, soit on précise deux lignes séparées par une virgule qui sont alors respectivement la ligne de début de zone et la ligne de fin de zone.
Symbole : [zone]

Certains jokers sont disponibles pour identifies certaines lignes particulières

.Ligne courante
$Dernière ligne
'>'Ligne du début de sélection
'<'Ligne de fin de fin de sélection

Le joker % identifie une zone qui est l'ensemble du tampon courant, ce qui est équivalent à 1,$

IV. Notations

<caractère> Caractère
<min> Lettre minuscule
<maj> Lettre majuscule
<chaîne> Chaîne de caractère
<regex> Expression rationnelle
<chiffre> Chiffre
<vi> Commande vi
<shell> Commande externe
<fichier> Fichier
<ligne> Ligne (numérique)
<colonne> Colonne (numérique)

V. Commandes

a. Insertion

i
Bascule en insertion après le caractère courant
I
Bascule en insertion en début de ligne
a
Bascule en insertion avant le caractère courant
A
Bascule en insertion en fin de ligne

b. Indentation

[nombre]>>
Indente à droite [nombre] fois
[nombre]<<
Indente à gauche [nombre] fois
:set autoindent
Active l'indentation automatique
:set noautoindent
Désactive l'indentation automatique
[zone]=
Ré-indentation automatique

c. Saut au debut / à la fin

^
Début de ligne
$
Fin de ligne
gg
Début de fichier
G
Fin de fichier

d. Saut au caractère

f<caractère>
Caractère <caractère> suivant sur la ligne courante
F<caractère>
Caractère <caractère> précédent sur la ligne courante
%
Sauter à la parenthèse/crochet/accolade correspondant au caractère courant

e. Saut à la ligne / à la colone

<ligne>G
Sauter à la ligne <ligne> (mode normal)
:<ligne>
Sauter à la ligne <ligne> (mode ex)
<colonne>|
Sauter à la colone <colonne>
[nombre](espace)
Avancer de [nombre] caractères en retourant à la ligne si besoin. Précédé de gg, il permet de sauter à un caractère précis du tampon courant.

f. Saut au mot suivant / précedent

[nombre]w
Avancer au début du/des mot suivant
[nombre]b
Reculer au début du/des mot en cours ou précédent

g. Couper

[nombre]x
Couper [nombre] caractères
[nombre]dd
Couper [nombre] lignes
:[zone]D
Couper les lignes

h. Copier

[nombre]Y
Copier [nombre] lignes
[nombre]y
Copier [nombre] caractères
y
Copier la sélection

i. Coller

[nombre]p
Coller avant
[nombre]P
Coller après
:set paste
Permet de coller sur la console dans le mode insertion en désactivant indentation, abréviations...
:set nopaste
Réactive les options coupées par :set paste

j. Opération ligne

o
Nouvelle ligne après puis bascule en mode insertion
O
Nouvelle ligne avant puis en mode insertion
[nombre]cc
Remplacer la/les ligne(s) puis passe en mode insertion
[nombre]J
Joindre la/lignes ligne suivante à celle-ci

k. Annuler

[nombre]u
Annuler
[nombre]Ctrl-R
Refaire
'.
Saute à la dernière modification

l. Déplacement

[nombre]h
Déplacement à gauche
[nombre]j
Déplacement en bas
[nombre]k
déplacement en haut
[nombre]l
déplacement à droite

m. Séléction

v
Bascule en mode sélection de caractères
V
Bascule en mode sélection de lignes
Ctrl+V
Bascule en mode sélection rectangulaire

n. Opération fichier

:e <fichier>
Éditer un nouveau fichier
:r <fichier>
Charge un fichier dans le tampon courant
:w <fichier>
Sauve un tampon dans un fichier
:set ff=unix
Bascule les fins de lignes en mode Unix
:set fenc=utf8
Bascule le charset du fichier en utf8
gf
Edition du fichier dont le nom est sur le curseur (les tampons ouverts sont fermés)

o. Commandes extérieures

:!<shell>
Éxécute la commande <shell>
:r !<shell>
Lit depuis le résultat de la commande dans le tampon courant
:w !<shell>
Envois le tampon courant vers une commande

p. Marques

m<maj>
Appose la marque <maj> à cette endroit parmis tous les tampons
m<min>
Appose la marque <min> à l'endroit du tampon
'<min|maj>
Saute à la marque <min|maj>

q. Buffers

:args
Liste les fichiers passés en arguments
:next
Saute au fichier suivant
:prev
Saute au fichier précédent
:b <chiffre>
Saute au tampon <chiffre> (spécifique VIM)

r. Rechercher

/<regex>/g
Rechercher <regex>
/
Occurence suivant
:set ignorecase
Désactive la vérification de la casse pour la recherche
gd
Recherche la défintion de l'élément sur le curseur

s. Opération texte

:[zone]s/<regex>/<chaîne>/g
Remplacer <regex> par <chaîne>
:[zone]!<shell>
Traitement extérieur par <shell>
:[zone]g/<regex>/<vi>
Traite par <vi> les lignes contenant <regex>
:[zone]g!/<regex>/<vi>
Traite par <vi> les lignes contenant <regex>
[nombre]~
Inverse la casse des caractères

t. Avancé

K
Interrogation du man avec le mot sous le curseur
Ctrl-X Ctrl-N
Auto-complétion du mot
Ctrl-X Ctrl-L
Auto-complétion de la ligne
Ctrl-R =<chaîne>
Calculatrice en mode insert où <chaîne> est le calcul
:syntax on
Active la coloration syntaxique

u. Multi-fenêtres

Ctrl-w s
Séparation horizontale
Ctrl-w v
Séparation verticale
Ctrl-w q
Ferme la fenêtre courante
Ctrl-w [flêche directionelle]
Basculer vers la fenêtre correspondante
Ctrl-w r
Rotation des fenêtres
Ctrl-w R
Rotation inverse des fenêtres
Ctrl-w x
Inversion de la fenêtre courante avec la suivante

v. Macros

q<min>
Commencer l'enregistrement de la macro <min>
q
Arrêter l'enregistrement de la macro en cours
@<min>
Lancer l'exécution de la macro <min>

VI. Conclusion

Ceci est un un petit aide mémoire que je garde sous le coude pour moi-même et quelques amis, il n'est pas complet et n'a pas pour but de le devenir. C'est une introduction ou un rappel, pour toute aide dans Vi ou Vim, ne pas hésiter à utiliser la commande d'aide interne qui détaille l'ensemble des commandes :

:help
Aide
:help <vi>
Aide sur la commande <vi>
contact/mail protection