tuteurs.ens.fr/unix/editeurs/vim.tml

405 lines
18 KiB
Text
Raw Normal View History

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
"tuteurs://DTD/tml.dtd">
<html>
<head>
<title>Vim</title>
</head>
<body>
<h1>Vim</h1>
<div class="resume">
<p>
Vim est un <20>diteur de textes difficile <20> prendre en main, mais extr<74>mement
puissant. Il s'agit d'un des nombreux h<>ritiers (moraux) de l'historique Vi
des Unix ancestraux, et c'est dans cette famille probablement le plus
puissant. L'essentiel de ce qui sera dit ici sera aussi valable pour les
autres, mais pas tout<75>; la documentation de Vim pr<70>cise pour chaque
commande si elle est sp<73>cifique ou pas.
</p>
</div>
2003-03-27 16:34:53 +01:00
<h2>Concepts de base</h2>
<h3>Les deux modes</h3>
<p>
Vi poss<73>de deux modes. En fait, ce n'est pas vrai, il en poss<73>de plus, et
Vim encore plus, mais il y en a deux qui sont plus importants que les autres
pour comprendre le fonctionnement. L'un de ces modes s'appelle le <em>mode
insertion</em><3E>: c'est dans ce mode-l<> qu'on tape l'essentiel du texte. La
particularit<EFBFBD> de Vi est que ce mode propose tr<74>s peu de fonctions de
manipulation du texte (recherche, copier-coller, sauvegarde). En effet, la
manipulation du texte se fait en <em>mode normal</em><3E>: dans ce mode, <20>
peu pr<70>s tous les caract<63>res ont une signification et d<>clenchent des
modifications du texte ou un d<>placement du curseur.
</p>
<p>
Il est possible, avec Vi, de d<>finir de nouvelles touches pour des actions.
Quand on d<>bute, il est tentant de d<>finir des touches pour les actions les
plus fr<66>quentes (sauver, rechercher, quitter, copier, coller), et de rester
tout le temps en mode insertion. L'usage montre que c'est en g<>n<EFBFBD>ral une
mauvaise id<69>e<EFBFBD>: une fois l'habitude des deux modes prises, et l'automatisme
du changement de mode connu des doigts, l'efficacit<69> cro<72>t avec
l'utilisation des commandes <20>volu<6C>es. Autant prendre l'habutude rapidement
donc.
</p>
<div class="encadre">
<p>
On revient en mode normal avec la touche <code>Escape</code>
</p>
</div>
<p>
Suivant la configuration, le changement peut ne prendre effet qu'au moment
o<EFBFBD> la touche suivante est tap<61>e. En cas de probl<62>me, <kbd>Ctrl-C</kbd>
ram<EFBFBD>ne <em>toujours</em> en mode normal.
</p>
<h3>Action et d<>placement</h3>
<p>
Beaucoup de commandes de Vi (en mode normal, donc) servent <20> d<>placer le
curseur. Vers la droite ou la gauche, le haut et le bas bien s<>r, mais aussi
de paragraphe en paragraphe, de mot en mot, en sautant <20> des marques
pr<EFBFBD>d<EFBFBD>finies ou en recherchant rapidement un caract<63>re donn<6E>, etc.
</p>
<p>
Vi a aussi des commandes pour supprimer, copier, ou d'autres plus exotiques,
comme passer en majuscules. C'est bien beau, mais supprimer ou copier
quoi<EFBFBD>? Faut-il une commande pour supprimer un mot, une autre pous supprimer
une ligne, encore une autre pour supprimer un paragraphe, etc.<2E>? L<>, on
d<EFBFBD>couvre un des aspects les plus astucieux de Vi<56>: les commandes d'action
d<EFBFBD>finissent ce qu'il y a <20> faire, mais attendent ensuite une commande de
d<EFBFBD>placement. L'action est alors appliqu<71>e <20> tout le texte parcouru par le
curseur dans le d<>placement.
</p>
<p>
Par exemple la commande <kbd>w</kbd> avance jusqu'au mot suivant, la
commande <kbd>d</kbd> est celle pour effacer. Alors <kbd>dw</kbd> supprime
tout du curseur au d<>but du mot suivant.
</p>
<p>
Avec ce syst<73>me, conna<6E>tre n commandes de d<>placement et m commandes
d'action se conjuguent en n<>m possibilit<69>s de manipulations diff<66>rentes.
</p>
<h2>Principales commandes</h2>
<p>
Voici un tableau r<>capitulant les principales commandes de Vim. Les
commandes marqu<71>es <20><>action<6F><6E> attendent une commande de d<>placement pour
agir (cette d<>nomination n'est pas standard), et agissent alors sur le texte
toucert par le d<>placement ainsi d<>sign<67>. Certains des termes utilis<69>s dans
ce tableau seront expliqu<71>s un peu plus loin. Cette liste n'est pas
exhaustive du tout.
</p>
<table class="tableau">
<tr><th>Commande</th><th>Sens</th><th>Type</th><th>Effet</th></tr>
<tr><td><kbd>i</kbd></td><td>insert</td><td></td><td>passe en mode insertion</td></tr>
<tr><td><kbd>a</kbd></td><td>append</td><td></td><td>passe en mode insertion en faisant avancer le curseur</td></tr>
<tr><td><kbd>o</kbd></td><td>open</td><td></td><td>passe en mode insertion en cr<63>ant une nouvelle ligne sous le curseur</td></tr>
<tr><td><kbd>O</kbd></td><td>open</td><td></td><td>passe en mode insertion en cr<63>ant une nouvelle ligne au dessus du curseur</td></tr>
<tr><td><kbd>R</kbd></td><td>replace</td><td></td><td>passe en mode remplacement</td></tr>
<tr><td><kbd>A</kbd></td><td></td><td></td><td>passe en mode insertion en allant <20> la fin de la ligne</td></tr>
<tr><td><kbd>I</kbd></td><td></td><td></td><td>passe en mode insertion en allant au d<>but de la ligne</td></tr>
<tr><td><kbd>v</kbd></td><td>visual</td><td></td><td>passe en mode visuel</td></tr>
<tr><td><kbd>V</kbd></td><td></td><td></td><td>passe en mode visuel par ligne</td></tr>
<tr><td><kbd>Ctrl-V</kbd></td><td></td><td></td><td>passe en mode visuel par bloc</td></tr>
<tr><td><kbd>h</kbd></td><td></td><td>d<>placement</td><td>d<>place le curseur vers la gauche</td></tr>
<tr><td><kbd>j</kbd></td><td></td><td>d<>placement</td><td>d<>place le curseur vers le bas</td></tr>
<tr><td><kbd>k</kbd></td><td></td><td>d<>placement</td><td>d<>place le curseur vers le haut</td></tr>
<tr><td><kbd>l</kbd></td><td></td><td>d<>placement</td><td>d<>place le curseur vers la droite</td></tr>
<tr><td><kbd>w</kbd></td><td>word</td><td>d<>placement</td><td>avance d'un mot</td></tr>
<tr><td><kbd>b</kbd></td><td>back</td><td>d<>placement</td><td>recule d'un mot</td></tr>
<tr><td><kbd>e</kbd></td><td>end</td><td>d<>placement</td><td>avance jusqu'<27> la fin d'un mot</td></tr>
<tr><td><kbd>W</kbd></td><td></td><td>d<>placement</td><td>avance d'un MOT</td></tr>
<tr><td><kbd>B</kbd></td><td></td><td>d<>placement</td><td>recule d'un MOT</td></tr>
<tr><td><kbd>E</kbd></td><td></td><td>d<>placement</td><td>avance jusqu'<27> la fin d'un MOT</td></tr>
<tr><td><kbd>f<i>x</i></kbd></td><td>forward</td><td>d<>placement</td><td>avance jusqu'au prochain <i>x</i></td></tr>
<tr><td><kbd>F<i>x</i></kbd></td><td></td><td>d<>placement</td><td>recule jusqu'au <i>x</i> pr<70>c<EFBFBD>dent</td></tr>
<tr><td><kbd>t<i>x</i></kbd></td><td></td><td>d<>placement</td><td>avance jusqu'<27> juste avant le prochain <i>x</i></td></tr>
<tr><td><kbd>T<i>x</i></kbd></td><td></td><td>d<>placement</td><td>recule jusqu'<27> juste apr<70>s le <i>x</i> pr<70>c<EFBFBD>dent</td></tr>
<tr><td><kbd>gg</kbd></td><td></td><td>d<>placement</td><td>va au d<>but du texte</td></tr>
<tr><td><kbd>G</kbd></td><td></td><td>d<>placement</td><td>va <20> la fin du texte</td></tr>
<tr><td><kbd>$</kbd></td><td></td><td>d<>placement</td><td>va <20> la fin de la ligne</td></tr>
<tr><td><kbd>0</kbd></td><td></td><td>d<>placement</td><td>va au d<>but de la ligne</td></tr>
<tr><td><kbd>{</kbd></td><td></td><td>d<>placement</td><td>va au d<>but du paragraphe</td></tr>
<tr><td><kbd>}</kbd></td><td></td><td>d<>placement</td><td>va <20> la fin du paragraphe</td></tr>
<tr><td><kbd>(</kbd></td><td></td><td>d<>placement</td><td>va au d<>but de la phrase</td></tr>
<tr><td><kbd>)</kbd></td><td></td><td>d<>placement</td><td>va <20> la fin de la phrase</td></tr>
<tr><td><kbd>n</kbd></td><td>next</td><td>d<>placement</td><td>continue une recherche</td></tr>
<tr><td><kbd>N</kbd></td><td></td><td>d<>placement</td><td>continue une recherche, en sens inverse</td></tr>
<tr><td><kbd>u</kbd></td><td>undo</td><td></td><td>annule la derni<6E>re action</td></tr>
<tr><td><kbd>Ctrl-R</kbd></td><td>redo</td><td></td><td>refait la derni<6E>re action annul<75>e</td></tr>
<tr><td><kbd>.</kbd></td><td>redo</td><td></td><td>r<>p<EFBFBD>te la derni<6E>re op<6F>ration</td></tr>
<tr><td><kbd>x</kbd></td><td></td><td></td><td>supprime un caract<63>re vers la droite (<28><>delete<74><65>)</td></tr>
<tr><td><kbd>X</kbd></td><td></td><td></td><td>supprime un caract<63>re vers la gauche (<28><>backspace<63><65>)</td></tr>
<tr><td><kbd>s</kbd></td><td>substitute</td><td></td><td>supprime un caract<63>re et passe en mode insertion</td></tr>
<tr><td><kbd>r<i>x</i></kbd></td><td>replace</td><td></td><td>remplace un caract<63>re par <i>x</i></td></tr>
<tr><td><kbd>p</kbd></td><td>paste</td><td></td><td>colle un registre apr<70>s le curseur</td></tr>
<tr><td><kbd>P</kbd></td><td></td><td></td><td>colle un registre avant le curseur</td></tr>
<tr><td><kbd>~</kbd></td><td></td><td></td><td>passe un caract<63>re de majuscule en minuscule ou l'inverse</td></tr>
<tr><td><kbd>/</kbd></td><td></td><td></td><td>fais une recherche</td></tr>
<tr><td><kbd>?</kbd></td><td></td><td></td><td>fais une recherche vers l'arri<72>re</td></tr>
<tr><td><kbd>*</kbd></td><td></td><td></td><td>cherche le mot sous le curseur</td></tr>
<tr><td><kbd>#</kbd></td><td></td><td></td><td>cherche le mot sous le curseur vers l'arri<72>re</td></tr>
<tr><td><kbd>d</kbd></td><td>delete</td><td>action</td><td>supprime</td></tr>
<tr><td><kbd>c</kbd></td><td>change</td><td>action</td><td>supprime et passe en mode insertion</td></tr>
<tr><td><kbd>y</kbd></td><td>yank</td><td>action</td><td>copie dans un registre</td></tr>
<tr><td><kbd>gu</kbd></td><td></td><td>action</td><td>passe en minuscules</td></tr>
<tr><td><kbd>gU</kbd></td><td></td><td>action</td><td>passe en majuscules</td></tr>
<tr><td><kbd>g?</kbd></td><td></td><td>action</td><td>passe en rot13</td></tr>
<tr><td><kbd>&lt;</kbd></td><td></td><td>action</td><td>d<>cale vers la gauche</td></tr>
<tr><td><kbd>&gt;</kbd></td><td></td><td>action</td><td>d<>cale vers la droite</td></tr>
<tr><td><kbd>gq</kbd></td><td></td><td>action</td><td>recoupe les lignes</td></tr>
<tr><td><kbd>=</kbd></td><td></td><td>action</td><td>met en forme un programme</td></tr>
<tr><td><kbd>"</kbd><i>x</i></td><td></td><td></td><td>s<>lectionne le registre <i>x</i></td></tr>
<tr><td><kbd>m</kbd><i>x</i></td><td></td><td></td><td>pose la marque <i>x</i></td></tr>
<tr><td><kbd>'</kbd><i>x</i></td><td></td><td>d<>placement</td><td>va <20> la marque <i>x</i> (par ligne)</td></tr>
<tr><td><kbd>`</kbd><i>x</i></td><td></td><td>d<>placement</td><td>va <20> la marque <i>x</i> (par caract<63>re)</td></tr>
</table>
<p>
La plupart des commandes peuvent <20>tre pr<70>c<EFBFBD>d<EFBFBD>es d'un nombre, tap<61>
directement avec les chiffres<65>: ce nombre va alors en g<>n<EFBFBD>ral multiplier
l'action. Ainsi, puisque <kbd>w</kbd> avance d'un mot, <kbd>42</kbd> avance
de 42 mots.
</p>
<p>
Le mode remplacement est similaire au mode insertion, mais les caract<63>res
viennent remplacer ceux qui se trouvaient auparavant. Les modes visuels sont
des modes utilis<69>s pour s<>lectionner du texte, nous verrons leur fonction
plus en d<>tail plus bas.
</p>
<p>
Un mot est une suite de lettres et de chiffres, ou une suite de signes
autres, except<70>s les espaces. Un <20><>MOT<4F><54> est une suite de signe qui ne
sont pas des espaces. Ainsi, <code>tuteurs@clipper.ens.fr</code> est un seul
MOT, form<72> de sept MOTS.
</p>
<p>
Quand on r<>p<EFBFBD>te une touche correspondant <20> une action, le r<>sultat est
souvent d'agir sur la ligne enti<74>re. Ainsi <kbd>dd</kbd> supprime une ligne.
Quand on la met en majuscule, elle agit souvent de la position du curseur <20>
la fin de la ligne (comme si la commande de d<>placement <20>tait <kbd>$</kbd>.
Ainsi <kbd>D</kbd> supprime jusqu'<27> la fin de la ligne.
</p>
<p>
Certaines commandes de d<>placement sont dites <em>horizontales</em> alors
que d'autres sont <em>verticales</em>. Quand une action est suivie d'un
d<EFBFBD>placement vertical, elle agit par lignes enti<74>res (par exemple
<kbd>dj</kbd> supprime la ligne o<> est le curseur et la ligne en dessous, en
entier). Cette distinction peut para<72>tre difficile <20> saisir, mais <20> l'usage
le comportement est tel qu'on peut s'y attendre naturellement.
</p>
<h2>Op<4F>rations usuelles</h2>
<h3>Copier-coller, registres</h3>
<p>
Vim poss<73>de un certain nombre de registres qui peuvent contenir du texte.
Ils servenr pour les op<6F>rations de copier-coller. Lors qu'une op<6F>ration
supprime une portion de texte, celle-ci est automatiquement copi<70>e dans le
registre s<>lectionn<6E>. La commande <kbd>y</kbd> sert <20> copier du texte dans
un registre sans le supprimer.
</p>
<p>
Si on ne pr<70>cise rien, c'est le registre <code>"</code> qui est s<>lectionn<6E>.
La commande <kbd>"</kbd> permet de choisir le registre pour la prochaine
op<EFBFBD>ration. Il y a 26 registres g<>n<EFBFBD>riques portant les lettres de
<code>a</code> <20> <code>z</code>. Sion utilise une lettre en majuscule, le
texte copi<70> o<> coup<75> va s'ajouter au contenu du registre au lieu de le
remplacer. Il est donc possible de maintenir 26 bouts de textes qu'on peut
ensuite coller n'importe o<>.
</p>
<p>
C'est la commande <kbd>p</kbd> ou <kbd>P</kbd> qui sert <20> coller le contenu
d'un registre. Comme les autres, elle peut <20>tre pr<70>c<EFBFBD>d<EFBFBD>e de <kbd>"</kbd>
pour s<>lectionner le registre qui doit <20>tre coll<6C>.
</p>
<p>
<EFBFBD> chaque fois qu'un registre est modifi<66>, le registre <code>1</code> est
rempli <20>galement, tandis que son ancien contenu est transf<73>r<EFBFBD> dans le
registre <code>2</code>, dont l'ancien contenu est <20> son tour transf<73>r<EFBFBD> dans
le registre <code>3</code>, et ainsi de suite jusqu'<27> 9.
</p>
<p>
Attention. Un registre se souvnet de la mani<6E>re dont il a <20>t<EFBFBD> rempli<6C>: par
une action verticale ou horizontale. Lors du collage, il s'ins<6E>re de la
m<EFBFBD>me mani<6E>re<72>: un registre copi<70> verticalement s'ins<6E>rera sur des lignes
enti<EFBFBD>res, quelle que soit la position du curseur. <20>a marche <20>galement pour
des copies faites en mode visuel par bloc.
</p>
<h3>Le mode visuel</h3>
<p>
Le move visuel, ou plut<75>t les modes visuels, permettent de s<>lectionner du
texte. Une commande de modification faite en mode visuel va agir sur la zone
s<EFBFBD>lectionn<EFBFBD>e au lieu d'un seul caract<63>re, ou d'attendre un d<>placement. Pour
les d<>placements, le mode visuel fonctionne comme le mode commande.
</p>
<p>
Le mode visuel normal s<>lectionne une zone qui va pr<70>cis<69>ment de l'endroit
o<EFBFBD> se trouvait le curseur quand on a appuy<75> sur <kbd>v</kbd> <20> la position
curseur courante. Il est donc similaire <20> une commande de d<>placement
<em>horizontal</em>. Le mode visuel par ligne s<>lectionne des lignes
enti<EFBFBD>res, il est donc similaire <20> une commande de d<>placement
<em>vertical</em>.
</p>
<p>
Le mode visuel par bloc s<>lectionne un rectangle de texte, ind<6E>pendemment
des coupures des lignes. Ceci peut servir pour des constructions en colonnes
ou des alignements. Dans ce mode, les commandes de remplacement
(<kbd>c</kbd> et <kbd>s</kbd>) et d'insertion (<kbd>I</kbd> et <kbd>A</kbd>
au lieu de <kbd>i</kbd> et <kbd>a</kbd>) ont un fonctionnement
particulier<EFBFBD>: le texte tap<61> sur la premi<6D>re ligne va <20>tre r<>p<EFBFBD>t<EFBFBD> de la m<>me
mani<EFBFBD>re sur toutes les lignes. Attention<6F>: pour que <20>a marche il ne faut
pas utiliser de d<>placement du curseur pendant l'insertion. Exemple<6C>: pour
ajouter un <code>&gt;</code> au d<>but de toutes les lignes d'un bout de
texte, se placer au d<>but, faire <kbd>Ctrl-V</kbd>, descendre jusqu'<27> la
derni<EFBFBD>re ligne, faire <kbd>I&gt;</kbd>, puis <kbd>Escape</kbd>.
</p>
<h3>Les marques</h3>
<p>
Vim est capable de poser des marques dans le texte, afin d'y revenir plus
tard facilement. On pose une marque avec <kbd>m</kbd> suivi d'une lettre. Il
y a donc 26 marques librement utilisables.
</p>
<p>
On peut aller <20> une marque ainsi pos<6F>e avec la commande <kbd>'</kbd> suivie
de la lettre, ou <kbd>`</kbd> pour un d<>placement horizontal. Si la lettre
est donn<6E>e en majuscule, le saut peut faire changer de fichier si la marque
est dans un autre.
</p>
<p>
Il existe deux marques sp<73>ciales, <kbd>&lt;</kbd>et <kbd>&gt;</kbd>, qui
d<EFBFBD>signent respectivement le d<>but et la fin du dernier mode visuel. Elles
sont surtout utiles pour d<>signer un intervalle en ligne de commande.
</p>
<h2>La ligne de commande</h2>
<p>
Pour les op<6F>rations plus complexes, en particulier celles qui agissent sur
la totalit<69> du texte, Vim utilise une ligne de commande. Si on tape
<kbd>:</kbd> en mode normal, on peut taper une commande enti<74>re, qui ne sera
<EFBFBD>valu<EFBFBD>e que lorsqu'on validera avec entr<74>e. Avec Vim (et pas avec Vi), la
ligne de commande est compl<70>tement <20>ditable, et comporte un hitorique.
</p>
<p>
La plupart des commandes peuvent s'abr<62>ger. Les plus utilis<69>es peuvent
descendre jusqu'<27> une seule lettre.
</p>
<h3>Sauver, charger, quitter</h3>
<table class="tableau">
<tr>
<th>Commande</th><th>Abbr<62>viation</th><th>Effet</th>
</tr>
<tr>
<td><code>:write</code></td><td><code>:w</code></td>
<td>sauve le fichier en cours d'<27>dition</td>
</tr>
<tr>
<td><code>:write <i>fichier</i></code></td><td><code>:w</code></td>
<td><3E>crit le texte dans le fichier indiqu<71></td>
</tr>
<tr>
<td><code>:saveas <i>fichier</i></code></td><td><code>:sav</code></td>
<td>sauve le fichier sous un nouveau nom</td>
</tr>
<tr>
<td><code>:edit <i>fichier</i></code></td><td><code>:ed</code></td>
<td><3E>dite un nouveau fichier</td>
</tr>
<tr>
<td><code>:quit</code></td><td><code>:q</code></td>
<td>quitte</td>
</tr>
<tr>
<td><code>:exit</code></td><td><code>:x</code></td>
<td>sauve si n<>cessaire et quitte</td>
</tr>
<tr>
<td><code>:wq</code></td><td></td>
<td>sauve et quitte</td>
</tr>
</table>
<p>
La diff<66>rence entre <code>:w</code> avec un nom de fichier et
<code>:save</code>, c'est le nom qui sera utilis<69> pour les <code>:w</code>
suivants<EFBFBD>: l'ancien nom dans le premier cas, le nouveau dans le second.
</p>
<p>
Selon la configuration de Vim, ouvrir un nouveau fichier va soit fermer le
fichier en cours d'<27>dition (avec confirmation, <20>videmment) soit simplement
le cacher, tout en permettant d'y revenir.
</p>
<p>
On peut insister pour quitter sans sauver, ou pour sauver sur un fichier qui
existe d<>j<EFBFBD>, en ajoutant <code>!</code> <20> la fin de la commande, ce qui
donne <code>:w!</code> et <code>:q!</code>.
</p>
<h3>Les recherches et remplacements</h3>
<p>
Les recherches ne se font pas en ligne de commande <20> proprement parler, mais
le comportement de Vim y est le m<>me. Une recherche se fait avec la touche
<code>/</code>. Vim passe alors dans un mode proche de la ligne de commande,
et attend qu'on saisisse une expression rationnelle. On valide par entr<74>e,
et Vim saute <20> la premire occurence. On navigue alors entre les diff<66>rentes
occurences avec <code>n</code> (comme <em>next</em>) et <code>N</code>.
</p>
<p>
Selon la configuration, Vim peut afficher la premi<6D>re occurence au fur et <20>
mesure de la saisie de l'expression cherch<63>e. Attention toutefois<69>: quand
on a trouv<75>, il faut bien valider, sinon on se retrouve au point de d<>part.
</p>
<!--Toujours selon la configuraiton, -->
<div class="metainformation">
Auteur<EFBFBD>: Nicolas George. Derni<6E>re modification le <date value="$Date: 2003-06-05 16:17:14 $"/>.
<br/>
to <span style="color: blue">B</span><span style="color: red">e</span> continued
</div>
</body>
</html>