vi est l'éditeur ``unix'' de base, vim est vi amélioré, gvim est le même agrémenté d'une couche graphique.
Pour lancer vim sur un fichier : vim toto
Pour lancer vim sur plusieurs fichiers :vim toto tata titi, on passe d'un buffer à l'autre avec :n (vers l'avant) ou :N (vers l'arrière)
Une sauvegarde automatique du buffer courant se trouve dans .toto.swp.
Après un crash on peut tenter de récupérer le fichier avec la commande vim -r toto.
Les différents modes
mode commande
mode insertion de texte
Au démarrage l'éditeur est en mode ``commande'', pour passer en mode ``insertion'' il faut taper la commande ``i'', pour en sortir appuyer sur la touche ESC.
:w pour sauver sans sortir
:w toto pour sauver sous le nom toto
:x pour sauver et sortir ou :wq
:q! pour sortir sans sauver
Les déplacements
h déplace le curseur vers la gauche
l déplace le curseur vers la droite
j déplace le curseur vers le bas
k déplace le curseur vers le haut
. désigne la ligne courante
0 va en début de ligne
\$ va en fin de ligne
I insertion en début de ligne (Insert)
A insertion en fin de ligne (Append)
w avance d'un mot (word)
b recule d'un mot (back)
:n va à la ligne n
\{ début de paragraphe
\ fin de paragraphe
( début de phrase
) fin de phrase
G va à la fin du fichier
* le curseur étant sur un mot, permet d'avancer à l'occurrence suivante du mot (rem : N*)
\# idem en reculant (rem : N\#)
\% si le curseur est positionné sur (, \{, $[$, on avance à ), \, $]$ (très utile en programmation !)
remarque : on peut répéter N fois la plupart des commandes précédentes par exemple Nl déplace le curseur de N caractères vers la droite. d\ efface jusqu'à la fin du paragraphe, c2) supprime les 2 prochaines phrases et passe en mode insertion, 3\{ remonte au début du 3ème paragraphe précédent.
Commandes utiles dans les combinaisons
x efface le caractère sous le curseur
d effacer
c changer
y copier (yank)
r remplacer un caractère
R remplacer plusieurs caractères
s effacer un caractère et passer en mode insertion
D effacer la fin de ligne
C changer la fin de ligne
o ouvrir une ligne après la ligne courante
O ouvrir une ligne avant la ligne courante
exemples : dw efface la fin du mot, dd efface la ligne,
pour changer la fin d'un mot, on se place à l'endroit à modifier, on tape cw et on écrit le nouveau mot cc vide la ligne yw copie un mot dans le tampon yy ou Y copie une ligne dans le tampon p colle le tampon (paste) après le curseur P colle le tampon sur le curseur ddp permet d'inverser deux lignes
remarque : on peut répéter N fois les commandes précédentes par exemple Ndd efface N lignes.
Mode visuel
Plusieurs façons de sélectionner une portion de texte.
v permet de passer en mode visuel, les déplacements habituels permettent de sélectionner le texte
V mode visuel ligne à ligne
CTRL v mode visuel en bloc (utile pour des portions de tableaux)
Recherche / Remplacement
/modèle cherche le modèle vers l'avant
?modèle cherche le modèle vers l'arrière
n cherche l'occurrence suivante
N cherche l'occurrence précédente
:s/modèle/substitut/ remplace le texte du modèle pour la première occurrence dans la ligne
:s/modèle/substitut/g remplace le texte du modèle pour toute la ligne
:s/modèle/substitut/gc remplace le texte du modèle pour toute la ligne mais demande confirmation
:\%s/modèle/substitut/g remplace le texte du modèle dans tout le fichier
:.;+4s/modèle/substitut/g remplace le texte du modèle dans la ligne courante et les 4 suivantes
remarques : dans le modèle, les caractères \^\$.*$\backslash$/$\sim$ doivent être précédés de $\backslash$ afin d'annuler leurs effets.De plus si $\backslash$c est dans le modèle alors la casse est ignorée, au contraire si c'est $\backslash$C la casse est respectée scrupuleusement. d/toto efface le texte jusqu'à toto (non compris).
Les registres
Ce sont des mémoires temporaires dans lesquelles on peut stocker de l'information. Chaque registre est identifié par un caractère (ex: a, b, 0, 1, Z, /, \% \ldots)
On fait référence à un registre en faisant précéder son caractère d'appel par'' .
''ayy copie la ligne courante dans le registre a
''ap en mode commande ou CTRL R a en mode insertion, colle le contenu du registrea
''Adw coupe le mot sous le curseur et l'ajoute au registre a (on utilise la lettre majuscule du registre)
:registers affiche le contenu de tous les registres
'''' est le registre courant (unamed register)
''0 est le registre contenant le dernier yank (copié)
Le Repliement des lignes
Pour créer une zone de repliement de lignes :
sélectionner la zone en mode visuel (commande v )
utiliser la commande zf pour créer le repliement
zo ouvre un repliement
zc referme un repliement
Gestion des fenêtres
CTRL w n : crée une fenêtre horizontale vide
:split : crée une fenêtres horizontale avec le même fichier
CTRL w v ou CTRL w CTRL V ou vsplit: crée une fenêtre verticale avec le même fichier
CTRL w + ou CTRL w - redimensionnement horizontal
CTRL w ou CTRL w redimensionnement vertical
CTRL w K ou J ou H ou L permet de passer d'une fenêtre à l'autre
Les macros
qZ lance l'enregistrement de la macro dans le registre ''Z; q fin d'enregistrement
@Z execute la macro contenue dans le registre ''Z
:so fichier.vim chargement d'un fichier de macros
Pour modifier une macro :
Se placer sur une ligne vide, afficher la séquence de la macro ''Zp, modifier la macro à volonté, restocker la macro dans son registre ''Zy\$
Mappage des touches clavier
exemple : pour commenter une ligne en langage C : :map $
lt;$F12$
gt;$ 0i/* $
lt;$ESC$
gt;$ \$a*/ $
lt;$ESC$
gt;$
remarque : dans le mapping ci-dessus, $
lt;$F12$
gt;$ est réellement la suite des 5 caractères $
lt;$F12$
gt;$
Abréviations
:ab 3to tototo chaque chaque fois que l'on tape 3to vim le remplace par tototo (mode insertion et mode commande)
:ia 3to tototo chaque chaque fois que l'on tape 3to vim le remplace par tototo (mode insertion uniquement)
:ca 3to tototo chaque chaque fois que l'on tape 3to vim le remplace par tototo (mode commande uniquement)
Comparaison de fichiers (mode diff)
Lancer la commande : vim -d fichier1 fichier2
On peut aller jusqu'à 4 fichiers. La commande :args permet d'afficher liste de fichiers chargés aux lancement de gvim.
Si on modifie un des fichiers, on peut mettre à jour la comparaison avec :diffupdate :diffpatch : prend en argument un patch existant sur le système, patche le buffer courant et ouvre une nouvelle fenêtre contenant le nouveau fichier
remarque : vim passe automatiquement en mode :scrollbind afin de lier les déplacements entre les deux fenêtres.
Historique des commandes
q: affiche une fenêtre avec l'historique des commandes
q/ cherche dans l'historique
Impression
La commande :hardcopy permet d'envoyer à l'imprimante (par défaut lpr), la coloration syntaxique est préservée.
Gestion des vues
:mkview ~/.vim/toto.vim enregistre un environnement d'édition (fichiers, mapping, pliures, position du curseur, répertoires en cours, changements)
:loadview
remarque : sans argument, par défaut le système peut stocker 10 vues différentes,
Digraphs
:digraphs Affiche les codes permettant l'accès aux caractères qui ne sont pas au clavier.
:digraphs ye 165 affecte le code ascii 165 à la séquence ye.
CTRL u (en mode insertion) efface les caractères avant le curseur dans la ligne courante
u annule la dernière commande
redo ou CTRL r annule la dernière annulation
`` retourne à la position précédent le dernier déplacement
. répète la dernière commande
J colle la ligne suivante à la ligne courante
$\sim$ permet de changer la casse
gq associé à un déplacement permet de reformatter le texte, exemple gq\ reformatte jusqu'à la fin du paragraphe
:2,4co6 copie les lignes 2 à 4 après la ligne 6
:.,+2mo3 déplace la ligne courante et les deux suivantes à après la ligne 3
Complétion
CTRL p permet de compléter le mot en cours d'écriture
CTRL x CTRL n ou CTRL x CTRL p complètent avec les mots du fichiers courant
CTRL x CTRL l complète avec une ligne entière
CTRL x CTRL t complète en utilisant le ``Thésaurus''
CTRL x CTRL k complète en utilisant le ``Dictionnaire''
CTRL x CTRL i complète en utilisant le fichier courant et les includes
CTRL x CTRL $]$ complète en utilisant les tags
CTRL x CTRL f complète en utilisant les noms de fichiers
CTRL x CTRL d complète en utilisant les noms de macro
CTRL x CTRL v complète avec les commandes vim
Utilisation des ancres
Une ancre ou marque est référencée par une lettre $[$a-zA-Z$]$.
mz pose une ancre référencée par z
'z va à la ligne contenant la marque z
`z va à la ligne et colonne contenant la marque z
exemples : d'z efface tout jusqu'à la marque z :.,'xs/\^/\#/ introduit un \# en début de ligne pour toutes les lignes comprises entre la ligne courante et l'ancre x :.,'as/toto/titi/g remplace tous les toto par titi entre la ligne courante et l'ancre a.
Configuration
Un grand nombre de paramètres peuvent être modifiés.
:set list permet d'afficher tous les caractères y compris ceux de contrôle
:syntax on active la coloration syntaxique
:set nocp mode non-compatible vi (en fait c'est le mode le plus complet)
:set tw=72 insère un CR au-delà de 72 caractères, si on ne précise pas de nombre, affiche la valeur actuelle (text width)
:set ic (ou set noic) mode ignore la casse pour les recherches
set autoindent (ou noautoindent) garde l'indentation
:set shiftwidth=8 spécifie la valeur de l'indentation
remarques : == permet d'indenter comme le voisinage; 6== idem pour les 6 lignes suivantes; 4$
gt;
gt;$ indente les 4 lignes à partir du curseur; $
gt;$ indente le texte sélectionné vers la droite; $
lt;$ décale le texte sélectionné vers la gauche; on peut utiliser = avec un déplacement; par exemple =G indente jusquèà la fin du fichier.
On peut stocker les commandes dans le fichier .vimrc
Interaction avec d'autres programmes
avec la commande less, si on tape v le buffer est envoyé dans vi
vim http://www.toto.fr/index.php charge index.php dans vi
:!commande permet de lancer une commande du shell (ex: :!ls -l)
:!bash permet de lancer un shell complet
:r toto permet d'insérer le fichier toto
:r! date permet d'insérer la date du système
:r!ls -l permet d'insérer la liste des fichiers du répertoire courant