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

409 lines
18 KiB
Text
Raw Normal View History

<?xml version="1.0" encoding="UTF-8"?>
<!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 éditeur de textes difficile à prendre en main, mais extrê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 ; la documentation de Vim précise pour chaque
commande si elle est spé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ède deux modes. En fait, ce n'est pas vrai, il en possède plus, et
2003-03-27 16:34:53 +01:00
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> : c'est dans ce mode-là qu'on tape l'essentiel du texte. La
particularité de Vi est que ce mode propose très peu de fonctions de
2003-03-27 16:34:53 +01:00
manipulation du texte (recherche, copier-coller, sauvegarde). En effet, la
manipulation du texte se fait en <em>mode normal</em> : dans ce mode, à
peu près tous les caractères ont une signification et déclenchent des
modifications du texte ou un déplacement du curseur.
2003-03-27 16:34:53 +01:00
</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équentes (sauver, rechercher, quitter, copier, coller), et de rester
tout le temps en mode insertion. L'usage montre que c'est en général une
mauvaise idée : une fois l'habitude des deux modes prises, et l'automatisme
du changement de mode connu des doigts, l'efficacité croît avec
l'utilisation des commandes évoluées. Autant prendre l'habutude rapidement
2003-03-27 16:34:53 +01:00
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ù la touche suivante est tapée. En cas de problème, <kbd>Ctrl-C</kbd>
ramène <em>toujours</em> en mode normal.
2003-03-27 16:34:53 +01:00
</p>
<h3>Action et déplacement</h3>
2003-03-27 16:34:53 +01:00
<p>
Beaucoup de commandes de Vi (en mode normal, donc) servent à 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 à des marques
prédéfinies ou en recherchant rapidement un caractère donné, etc.
2003-03-27 16:34:53 +01:00
</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 ? Faut-il une commande pour supprimer un mot, une autre pous supprimer
une ligne, encore une autre pour supprimer un paragraphe, etc. ? Là, on
découvre un des aspects les plus astucieux de Vi : les commandes d'action
définissent ce qu'il y a à faire, mais attendent ensuite une commande de
déplacement. L'action est alors appliquée à tout le texte parcouru par le
curseur dans le déplacement.
2003-03-27 16:34:53 +01:00
</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.
2003-03-27 16:34:53 +01:00
</p>
<p>
Avec ce système, connaître n commandes de déplacement et m commandes
d'action se conjuguent en n×m possibilités de manipulations différentes.
2003-03-27 16:34:53 +01:00
</p>
<h2>Principales commandes</h2>
<p>
Voici un tableau récapitulant les principales commandes de Vim. Les
commandes marquées « action » 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é. Certains des termes utilisés dans
ce tableau seront expliqués un peu plus loin. Cette liste n'est pas
2003-03-27 16:34:53 +01:00
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é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éant une nouvelle ligne au dessus du curseur</td></tr>
2003-03-27 16:34:53 +01:00
<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 à 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>
2003-03-27 16:34:53 +01:00
<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'à 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'à 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écédent</td></tr>
<tr><td><kbd>t<i>x</i></kbd></td><td></td><td>déplacement</td><td>avance jusqu'à 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'à juste après le <i>x</i> précé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 à la fin du texte</td></tr>
<tr><td><kbd>$</kbd></td><td></td><td>déplacement</td><td>va à 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 à 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 à 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ère action</td></tr>
<tr><td><kbd>Ctrl-R</kbd></td><td>redo</td><td></td><td>refait la dernière action annulée</td></tr>
<tr><td><kbd>.</kbd></td><td>redo</td><td></td><td>répète la dernière opération</td></tr>
<tr><td><kbd>x</kbd></td><td></td><td></td><td>supprime un caractère vers la droite (« delete »)</td></tr>
<tr><td><kbd>X</kbd></td><td></td><td></td><td>supprime un caractère vers la gauche (« backspace »)</td></tr>
<tr><td><kbd>s</kbd></td><td>substitute</td><td></td><td>supprime un caractè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ère par <i>x</i></td></tr>
<tr><td><kbd>p</kbd></td><td>paste</td><td></td><td>colle un registre après le curseur</td></tr>
2003-03-27 16:34:53 +01:00
<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ère de majuscule en minuscule ou l'inverse</td></tr>
2003-03-27 16:34:53 +01:00
<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ère</td></tr>
2003-03-27 16:34:53 +01:00
<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ère</td></tr>
2003-03-27 16:34:53 +01:00
<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>
2003-03-27 16:34:53 +01:00
<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>
2003-03-27 16:34:53 +01:00
<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 à 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 à la marque <i>x</i> (par caractère)</td></tr>
2003-03-27 16:34:53 +01:00
</table>
<p>
La plupart des commandes peuvent être précédées d'un nombre, tapé
directement avec les chiffres : ce nombre va alors en général multiplier
2003-03-27 16:34:53 +01:00
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ères
2003-03-27 16:34:53 +01:00
viennent remplacer ceux qui se trouvaient auparavant. Les modes visuels sont
des modes utilisés pour sélectionner du texte, nous verrons leur fonction
plus en détail plus bas.
2003-03-27 16:34:53 +01:00
</p>
<p>
Un mot est une suite de lettres et de chiffres, ou une suite de signes
autres, exceptés les espaces. Un « MOT » est une suite de signe qui ne
2013-10-20 00:04:58 +02:00
sont pas des espaces. Ainsi, <code>tuteurs@sas.eleves.ens.fr</code> est un seul
MOT, formé de sept mots.
2003-03-27 16:34:53 +01:00
</p>
<p>
Quand on répète une touche correspondant à une action, le résultat est
souvent d'agir sur la ligne entière. Ainsi <kbd>dd</kbd> supprime une ligne.
Quand on la met en majuscule, elle agit souvent de la position du curseur à
la fin de la ligne (comme si la commande de déplacement était <kbd>$</kbd>.
Ainsi <kbd>D</kbd> supprime jusqu'à la fin de la ligne.
2003-03-27 16:34:53 +01:00
</p>
<p>
Certaines commandes de déplacement sont dites <em>horizontales</em> alors
2003-03-27 16:34:53 +01:00
que d'autres sont <em>verticales</em>. Quand une action est suivie d'un
déplacement vertical, elle agit par lignes entières (par exemple
<kbd>dj</kbd> supprime la ligne où est le curseur et la ligne en dessous, en
entier). Cette distinction peut paraître difficile à saisir, mais à l'usage
2003-03-27 16:34:53 +01:00
le comportement est tel qu'on peut s'y attendre naturellement.
</p>
<h2>Opérations usuelles</h2>
2003-03-27 16:34:53 +01:00
<h3>Copier-coller, registres</h3>
<p>
Vim possède un certain nombre de registres qui peuvent contenir du texte.
Ils servent pour les opérations de copier-coller. Lors qu'une opération
supprime une portion de texte, celle-ci est automatiquement copiée dans le
registre sélectionné. La commande <kbd>y</kbd> sert à copier du texte dans
2003-03-27 16:34:53 +01:00
un registre sans le supprimer.
</p>
<p>
Si on ne précise rien, c'est le registre <code>"</code> qui est sélectionné.
2003-03-27 16:34:53 +01:00
La commande <kbd>"</kbd> permet de choisir le registre pour la prochaine
opération. Il y a 26 registres génériques portant les lettres de
<code>a</code> à <code>z</code>. Si on utilise une lettre en majuscule, le
texte copié où coupé va s'ajouter au contenu du registre au lieu de le
2003-03-27 16:34:53 +01:00
remplacer. Il est donc possible de maintenir 26 bouts de textes qu'on peut
ensuite coller n'importe où.
Par exemple, si on veut copier du texte dans le registre <code>r</code>, on
tape <kbd>"ry</kbd>.
2003-03-27 16:34:53 +01:00
</p>
<p>
C'est la commande <kbd>p</kbd> ou <kbd>P</kbd> qui sert à coller le contenu
d'un registre. Comme les autres, elle peut être précédée de <kbd>"</kbd>
pour sélectionner le registre qui doit être collé.
Par exemple, si on veut coller le contenu du registre <code>r</code>, on
tape <kbd>"rp</kbd>.
2003-03-27 16:34:53 +01:00
</p>
<p>
À chaque fois qu'un registre est modifié, le registre <code>1</code> est
rempli également, tandis que son ancien contenu est transféré dans le
registre <code>2</code>, dont l'ancien contenu est à son tour transféré dans
le registre <code>3</code>, et ainsi de suite jusqu'à 9.
2003-03-27 16:34:53 +01:00
</p>
<p>
Attention. Un registre se souvient de la manière dont il a été rempli : par
une action verticale ou horizontale. Lors du collage, il s'insère de la
même manière : un registre copié verticalement s'insérera sur des lignes
entières, quelle que soit la position du curseur. Ça marche également pour
2003-03-27 16:34:53 +01:00
des copies faites en mode visuel par bloc.
</p>
<h3>Le mode visuel</h3>
<p>
Le mode visuel, ou plutôt les modes visuels, permettent de sélectionner du
2003-03-27 16:34:53 +01:00
texte. Une commande de modification faite en mode visuel va agir sur la zone
sélectionnée au lieu d'un seul caractère, ou d'attendre un déplacement. Pour
les déplacements, le mode visuel fonctionne comme le mode commande.
2003-03-27 16:34:53 +01:00
</p>
<p>
Le mode visuel normal sélectionne une zone qui va précisément de l'endroit
où se trouvait le curseur quand on a appuyé sur <kbd>v</kbd> à la position
curseur courante. Il est donc similaire à une commande de déplacement
<em>horizontal</em>. Le mode visuel par ligne sélectionne des lignes
entières, il est donc similaire à une commande de déplacement
2003-03-27 16:34:53 +01:00
<em>vertical</em>.
</p>
<p>
Le mode visuel par bloc sélectionne un rectangle de texte, indépendemment
2003-03-27 16:34:53 +01:00
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 : le texte tapé sur la première ligne va être répété de la même
manière sur toutes les lignes. Attention : pour que ça marche il ne faut
pas utiliser de déplacement du curseur pendant l'insertion. Exemple : 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'à la
dernière ligne, faire <kbd>I&gt;</kbd>, puis <kbd>Escape</kbd>.
2003-03-27 16:34:53 +01:00
</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 à une marque ainsi posée avec la commande <kbd>'</kbd> suivie
de la lettre, ou <kbd>`</kbd> pour un déplacement horizontal. Si la lettre
est donnée en majuscule, le saut peut faire changer de fichier si la marque
2003-03-27 16:34:53 +01:00
est dans un autre.
</p>
<p>
Il existe deux marques spéciales, <kbd>&lt;</kbd> et <kbd>&gt;</kbd>, qui
dé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.
2003-03-27 16:34:53 +01:00
</p>
<h2>La ligne de commande</h2>
<p>
Pour les opérations plus complexes, en particulier celles qui agissent sur
la totalité du texte, Vim utilise une ligne de commande. Si on tape
<kbd>:</kbd> en mode normal, on peut taper une commande entière, qui ne sera
évaluée que lorsqu'on validera avec entrée. Avec Vim (et pas avec Vi), la
ligne de commande est complètement éditable, et comporte un hitorique.
2003-03-27 16:34:53 +01:00
</p>
<p>
La plupart des commandes peuvent s'abréger. Les plus utilisées peuvent
descendre jusqu'à une seule lettre.
2003-03-27 16:34:53 +01:00
</p>
<h3>Sauver, charger, quitter</h3>
<table class="tableau">
<tr>
<th>Commande</th><th>Abbréviation</th><th>Effet</th>
</tr>
<tr>
<td><code>:write</code></td><td><code>:w</code></td>
<td>sauve le fichier en cours d'édition</td>
</tr>
<tr>
<td><code>:write <i>fichier</i></code></td><td><code>:w</code></td>
<td>écrit le texte dans le fichier indiqué</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>é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érence entre <code>:w</code> avec un nom de fichier et
<code>:save</code>, c'est le nom qui sera utilisé pour les <code>:w</code>
suivants : 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'édition (avec confirmation, é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à, en ajoutant <code>!</code> à 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 à 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ée,
et Vim saute à la premire occurence. On navigue alors entre les différentes
occurences avec <code>n</code> (comme <em>next</em>) et <code>N</code>.
</p>
<p>
Selon la configuration, Vim peut afficher la première occurence au fur et à
mesure de la saisie de l'expression cherchée. Attention toutefois : quand
on a trouvé, il faut bien valider, sinon on se retrouve au point de départ.
</p>
<!--Toujours selon la configuraiton, -->
<div class="metainformation">
Auteur : Nicolas George. <date value="from git" />
<br/>
to <span style="color: blue">B</span><span style="color: red">e</span> continued
</div>
</body>
</html>