# Vim

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.

## Concepts de base

### Les deux modes

Vi possède deux modes. En fait, ce n'est pas vrai, il en possè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 mode insertion : 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 manipulation du texte (recherche, copier-coller, sauvegarde). En effet, la manipulation du texte se fait en mode normal : 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.

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 donc.

On revient en mode normal avec la touche `Escape`

Suivant la configuration, le changement peut ne prendre effet qu'au moment où la touche suivante est tapée. En cas de problème, `Ctrl-C` ramène toujours en mode normal.

### Action et déplacement

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.

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.

Par exemple la commande `w` avance jusqu'au mot suivant, la commande `d` est celle pour effacer. Alors `dw` supprime tout du curseur au début du mot suivant.

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.

## Principales commandes

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 exhaustive du tout.

Commande | Sens | Type | Effet
--- | --- | --- | ---
`i` | insert |  | passe en mode insertion
`a` | append |  | passe en mode insertion en faisant avancer le curseur
`o` | open |  | passe en mode insertion en créant une nouvelle ligne sous le curseur
`O` | open |  | passe en mode insertion en créant une nouvelle ligne au dessus du curseur
`R` | replace |  | passe en mode remplacement
`A` |  |  | passe en mode insertion en allant à la fin de la ligne
`I` |  |  | passe en mode insertion en allant au début de la ligne
`v` | visual |  | passe en mode visuel
`V` |  |  | passe en mode visuel par ligne
`Ctrl-V` |  |  | passe en mode visuel par bloc
`h` |  | déplacement | déplace le curseur vers la gauche
`j` |  | déplacement | déplace le curseur vers le bas
`k` |  | déplacement | déplace le curseur vers le haut
`l` |  | déplacement | déplace le curseur vers la droite
`w` | word | déplacement | avance d'un mot
`b` | back | déplacement | recule d'un mot
`e` | end | déplacement | avance jusqu'à la fin d'un mot
`W` |  | déplacement | avance d'un MOT
`B` |  | déplacement | recule d'un MOT
`E` |  | déplacement | avance jusqu'à la fin d'un MOT
`fx` | forward | déplacement | avance jusqu'au prochain x
`Fx` |  | déplacement | recule jusqu'au x précédent
`tx` |  | déplacement | avance jusqu'à juste avant le prochain x
`Tx` |  | déplacement | recule jusqu'à juste après le x précédent
`gg` |  | déplacement | va au début du texte
`G` |  | déplacement | va à la fin du texte
`$` |  | déplacement | va à la fin de la ligne
`0` |  | déplacement | va au début de la ligne
`{` |  | déplacement | va au début du paragraphe
`}` |  | déplacement | va à la fin du paragraphe
`(` |  | déplacement | va au début de la phrase
`)` |  | déplacement | va à la fin de la phrase
`n` | next | déplacement | continue une recherche
`N` |  | déplacement | continue une recherche, en sens inverse
`u` | undo |  | annule la dernière action
`Ctrl-R` | redo |  | refait la dernière action annulée
`.` | redo |  | répète la dernière opération
`x` |  |  | supprime un caractère vers la droite (« delete »)
`X` |  |  | supprime un caractère vers la gauche (« backspace »)
`s` | substitute |  | supprime un caractère et passe en mode insertion
`rx` | replace |  | remplace un caractère par x
`p` | paste |  | colle un registre après le curseur
`P` |  |  | colle un registre avant le curseur
`~` |  |  | passe un caractère de majuscule en minuscule ou l'inverse
`/` |  |  | fais une recherche
`?` |  |  | fais une recherche vers l'arrière
`*` |  |  | cherche le mot sous le curseur
`#` |  |  | cherche le mot sous le curseur vers l'arrière
`d` | delete | action | supprime
`c` | change | action | supprime et passe en mode insertion
`y` | yank | action | copie dans un registre
`gu` |  | action | passe en minuscules
`gU` |  | action | passe en majuscules
`g?` |  | action | passe en rot13
`<` |  | action | décale vers la gauche
`>` |  | action | décale vers la droite
`gq` |  | action | recoupe les lignes
`=` |  | action | met en forme un programme
`"`x |  |  | sélectionne le registre x
`m` x |  |  | pose la marque x
`'`x |  | déplacement | va à la marque x (par ligne)
```x |  | déplacement | va à la marque x (par caractère)

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 l'action. Ainsi, puisque `w` avance d'un mot, `42` avance de 42 mots.

Le mode remplacement est similaire au mode insertion, mais les caractères 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.

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 sont pas des espaces. Ainsi, `tuteurs@clipper.ens.fr` est un seul MOT, formé de sept MOTS.

Quand on répète une touche correspondant à une action, le résultat est souvent d'agir sur la ligne entière. Ainsi `dd` 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 `$`. Ainsi `D` supprime jusqu'à la fin de la ligne.

Certaines commandes de déplacement sont dites horizontales alors que d'autres sont verticales. Quand une action est suivie d'un déplacement vertical, elle agit par lignes entières (par exemple `dj` supprime la ligne où est le curseur et la ligne en dessous, en entier). Cette distinction peut paraître difficile à saisir, mais à l'usage le comportement est tel qu'on peut s'y attendre naturellement.

## Opérations usuelles

### Copier-coller, registres

Vim possède un certain nombre de registres qui peuvent contenir du texte. Ils servenr 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 `y` sert à copier du texte dans un registre sans le supprimer.

Si on ne précise rien, c'est le registre `"` qui est sélectionné. La commande `"` permet de choisir le registre pour la prochaine opération. Il y a 26 registres génériques portant les lettres de `a` à `z`. Sion utilise une lettre en majuscule, le texte copié où coupé 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ù.

C'est la commande `p` ou `P` qui sert à coller le contenu d'un registre. Comme les autres, elle peut être précédée de `"` pour sélectionner le registre qui doit être collé.

À chaque fois qu'un registre est modifié, le registre `1` est rempli également, tandis que son ancien contenu est transféré dans le registre `2`, dont l'ancien contenu est à son tour transféré dans le registre `3`, et ainsi de suite jusqu'à 9.

Attention. Un registre se souvnet 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 des copies faites en mode visuel par bloc.

### Le mode visuel

Le move visuel, ou plutôt les modes visuels, permettent de sélectionner du 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.

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 `v` à la position curseur courante. Il est donc similaire à une commande de déplacement horizontal. Le mode visuel par ligne sélectionne des lignes entières, il est donc similaire à une commande de déplacement vertical.

Le mode visuel par bloc sélectionne un rectangle de texte, indépendemment des coupures des lignes. Ceci peut servir pour des constructions en colonnes ou des alignements. Dans ce mode, les commandes de remplacement (`c` et `s`) et d'insertion (`I` et `A` au lieu de `i` et `a`) 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 `>` au début de toutes les lignes d'un bout de texte, se placer au début, faire `Ctrl-V`, descendre jusqu'à la dernière ligne, faire `I>`, puis `Escape`.

### Les marques

Vim est capable de poser des marques dans le texte, afin d'y revenir plus tard facilement. On pose une marque avec `m` suivi d'une lettre. Il y a donc 26 marques librement utilisables.

On peut aller à une marque ainsi posée avec la commande `'` suivie de la lettre, ou ``` pour un déplacement horizontal. Si la lettre est donnée en majuscule, le saut peut faire changer de fichier si la marque est dans un autre.

Il existe deux marques spéciales, `<`et `>`, 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.

## La ligne de commande

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 `:` 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.

La plupart des commandes peuvent s'abréger. Les plus utilisées peuvent descendre jusqu'à une seule lettre.

### Sauver, charger, quitter

Commande | Abbréviation | Effet
--- | --- | ---
`:write` | `:w` | sauve le fichier en cours d'édition
`:write fichier` | `:w` | écrit le texte dans le fichier indiqué
`:saveas fichier` | `:sav` | sauve le fichier sous un nouveau nom
`:edit fichier` | `:ed` | édite un nouveau fichier
`:quit` | `:q` | quitte
`:exit` | `:x` | sauve si nécessaire et quitte
`:wq` |  | sauve et quitte

La différence entre `:w` avec un nom de fichier et `:save`, c'est le nom qui sera utilisé pour les `:w` suivants : l'ancien nom dans le premier cas, le nouveau dans le second.

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.

On peut insister pour quitter sans sauver, ou pour sauver sur un fichier qui existe déjà, en ajoutant `!` à la fin de la commande, ce qui donne `:w!` et `:q!`.

### Les recherches et remplacements

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 `/`. 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 `n` (comme next) et `N`.

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.

Auteur : Nicolas George. Dernière modification le .
to Be continued