# Vi/Version imprimable

* Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
* Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
* Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.
Une version à jour et éditable de ce livre est disponible sur Wikilivres, une bibliothèque de livres pédagogiques, à l'URL : https://fr.wikibooks.org/wiki/Vi

# Découvrir Vi
## Découvrir vi
### Historique

L'éditeur vi (prononcez vi aïe) adhère aux principes des applications Unix : il remplit une fonction spécifique au mieux et s'intègre au reste du système, communiquant avec les autres applications pour s'associer leur capacités. Léger et portable, il peut toujours être présent, simple sur le système le plus basique ou amélioré sur un système habituel.
Bill Joy (Willam N. Joy (1954 -), co-fondateur de Sun Microsystems), étudiant à Berkeley, planche au cours de l'été 1975 sur des algorithmes dont la taille imposante (200 lignes) empêche une correcte implantation dans le cœur du système Pascal. À l'époque, l'éditeur couramment utilisé était ed et de nombreuses améliorations en étaient développées, dont em que George Coulouris lui procure. Em avait cependant quelques défauts, comme de ne pouvoir afficher que des majuscules, et Joy et Chuck Haley l'adaptent une première fois, le renommant ex. Joy travaillait sur un terminal proposant une vingtaine de lignes et sans retour possible, il lui fallait donc développer un éditeur plein écran mettant en mémoire les pages non affichées. Il fallait en outre qu'il puisse être utilisé au travers de son modem 300 baud. En quelques mois de 1976, il développe alors vi, qui sera distribué en 1978 avec la Second Berkeley Software Distribution (2BSD). Premier éditeur en plein écran, dont de nombreuses fonctionnalités ont été inspirées de Bravo, le premier WYSIWYG, vi est diffusé alors avec Unix et Pascal. Joy se désinteresse rapidement du maintien et laisse la suite du développement à Mark Horton.
Quelques sources sur les débuts de vi :
* interview de Bill Joy ;
* twenty Years of Berkeley unix.

### Vim

Vim est une version évoluée et particulièrement répandue de vi.
En 1988, Bram Moolenaar commence le portage de vi sur son Amiga fraîchement acquis, « Stevie » est alors peu fonctionnel et particulièrement buggé, mais il se corrige progressivement et passe de « Vi IMitation » à « Vi IMproved. » Gardant une grande compatiblité avec vi, les nouvelles commandes s'ajoutent aux anciennes et permettent à chaque utilisateur une approche personnalisée du logiciel. Conçu dès l'origine comme un produit open-source, la plupart des développement de vim viennent des programmeurs qui l'utilisent. L'historique de vim par Moolenaar
Si son utilisation et sa diffusion sont gratuites, son auteur le diffuse comme charityware et vous invite à participer au développement du sud de l'Ouganda et à venir en aide aux orphelins du SIDA de cette région par des dons à l'ICCF. Vous pouvez également aider cette association caritative, en achetant chez Amazon le livre de Moolenaar sur vim, des DVD du Seigneur des anneaux ou d'autres produits culturels ; en précisant que vous venez de leur part un pourcentage leur sera reversé : faire un don.

### Quelques liens

* vi lovers page
* la page officielle de vim
* HOWTO de vim
* définition de vi dans Wikipedia

# Prise en main
### Trois modes

Vi suit un principe de fonctionnement particulier qui est un frein à son apprentissage, mais qui ensuite lui donne tout son intérêt. À la différence de beaucoup d'éditeurs, vi a trois modes :
* Mode édition
* Mode commande
* Mode exécution
Lorsque vi est en « mode édition », les touches du clavier correspondent au texte écrit dans le fichier, mais lorsqu'il est en « mode commande », ces mêmes touches correspondent aux commandes de l'éditeur. Et puisque vi est en « mode commande » à son démarrage, cela le rend non opérationnel pour l'édition et perturbe en général le novice.
Le basculement entre les trois modes se fait à l'aide de la touche 'i' (pour "insertion") et la touche <ESC>.
* Pour basculer en « mode édition », tapez i.
* Pour basculer en « mode commande », tapez <ESC>
En vim, on peut utiliser également la touche <INS> à la place de 'i'.
Gvim : exemple d'une fenêtre de vi

### Une première séance de vi

Lancez vi sans arguments (tapez vi dans un terminal sous Unix, double-cliquez sous Windows). L'éditeur s'ouvre en mode commande et aucun fichier n'est ouvert, nous allons donc en ouvrir un pour l'éditer. La commande permettant d'ouvrir un fichier est :e, elle prend en argument le nom du fichier que l'on veut éditer, par exemple :
permet d'éditer le fichier appelé « mon_beau_fichier ».
Maintenant que nous avons un fichier ouvert, nous allons le remplir. Pour cela, nous devons passer en mode édition, ce qui peut être fait avec la commande i (insertion). Tapez seulement i, vi passe en mode édition, ce qui est signalé par le message :
apparaissant en bas à gauche de la fenêtre. Tapez maintenant un texte que nous allons sauvegarder. Avant de pouvoir sauvegarder, nous devons retourner au mode commande, ce qui se fait grace à la touche <Echap>.
Maintenant que nous sommes revenus dans le mode commande, nous pouvons sauvegarder avec la commande :w (write en anglais).
Supposons maintenant que nous voulions modifier notre fichier, nous allons avoir besoin de nous déplacer ; dans vi, les déplacements se font uniquement en mode commande et avec les touches h, j, k et l. Cependant les versions modernes de vi telles que vim permettent de se déplacer avec les flèches et aussi de le faire en mode édition.
Une fois que nous avons effectué nos modifications et sauvegardé, nous pouvons quitter avec la commande :q (quitter).

### Résumé des commandes de la leçon

Au lancement, vi est en « mode commande » :
| :e mon_beau_fichier | édite le fichier mon_beau_fichier |
| le curseur peut alors se déplacer dans le fichier, avec les flèches ou avec les touches h, j, k et l ||
| i | passe en « mode édition » avant le curseur |
| le texte du fichier est alors modifiable ||
| <ESC> | passe du « mode édition » au « mode commande » |
| :w | enregistre les modifications |
| :q | quitte vi |

# Déplacements

Nous avons pour l'instant vu que nous pouvions nous déplacer avec les touches h, j, k et l (ou avec les fléches), chacune de ces commandes permettant de se déplacer d'un caractère (ou d'une ligne) respectivement vers la gauche, le bas, le haut ou la droite. Si nous voulons nous déplacer de plusieurs caractères (ou lignes), il suffit avant la commande de spécifier un nombre. Par exemple pour se déplacer de cinq caractères vers la gauche, il faut taper 5h.
Cette syntaxe n'est en fait pas spécifique aux commandes de déplacements, mais fonctionne avec toutes les commandes vi.

### Résumé des commandes

déplacer le curseur dans le texte (les flèches sont également utilisables bien sur) : :
| h | déplace le curseur vers la gauche |
| j | déplace le curseur vers la droite |
| k | déplace le curseur vers le haut |
| l | déplace le curseur vers le bas |
| pour se déplacer dans la ligne : ||
| 0 (zéro) | déplace le curseur au début de la ligne (^ indique le début de ligne pour les commandes) |
| $ | déplace le curseur en fin de ligne |
| w | déplace le curseur d'un mot vers l'avant |
| b | déplace le curseur d'un mot vers l'arrière |
| pour se déplacer écran par écran : ||
| <CTRL> f | un écran vers l'avant |
| <CTRL> b | un écran vers l'arrière |
| se déplacer dans le fichier : ||
| nG | va à la ligne n |
| G | va à la fin du fichier |

# Débuter avec vi
## Débuter avec vi
### Quelques commandes simples et utiles

| :u | annuler |
| . | réitère la dernière commande d'édition |
| /motif | aller au motif suivant |
| ?motif | aller au motif précédent |
| n | continuer la recherche vers le bas |
| N | continuer la recherche vers le haut |
| dd | « couper » la ligne courante |
| yy | « copier » la ligne courante |
| P | « coller » avant le curseur ce qui vient d'être copié/coupé |
| Attention, vi est sensible à la casse, il s'agit bien d'un P majuscule. Le p minuscule colle après le curseur. ||
| :s/motif1/motif2 | remplace motif1 par motif2 (1ère occurrence sur la ligne du curseur) |
| :s/motif1/motif2/g | remplace motif1 par motif2 (toutes les occurrences sur la ligne du curseur) |
| :%s/motif1/motif2/g | remplace motif1 par motif2 (toutes les occurrences dans tout le fichier, de la pemière à la dernière ligne) |
| :a,bs/motif1/motif2/g | remplace motif1 par motif2 (toutes les occurrences entre les lignes "a" et "b" du fichier) |

### Manipuler les fichiers

Ouvrir un fichier avec vi :
| vi mon_beau_fichier | ouvre mon_beau_fichier en lançant vi |
| :e mon_beau_fichier | ouvre mon_beau_fichier |
| Ouvrir une série de fichiers avec vi ||
| :n fichier1 fichier2 | charge les fichiers fichier1 fichier2 |
| :n | passe au fichier suivant |
| :prev ou :N | revient au fichier précédent |
| Ouvrir plusieurs fichiers dans la même fenêtre ||
| :sp fichier2 | divise la fenêtre et charge fichier2 dans la deuxième moitié |
| "CTRL + w" w | passe d'une sous-fenêtre à l'autre. "CTRL + w" "CTRL + w" fonctionne aussi si vous relâchez la touche CTRL un peu tard |
| :close | ferme la sous fenêtre courante |
| :only | ferme toutes les sous fenêtres sauf la sous fenêtre courante |
| En cas de problème ||
| :e! | recharge le dernier enregistrement du fichier et abandonne les modifications |
| :q! | quitte vi sans enregistrer les modifications |
| vi -r mon_beau_fichier | récupère le fichier de sauvegarde temporaire de mon_beau_fichier (mon_beau_fichier.swp) |
| enregistrer et quitter ||
| :w nouveau_nom | enregistre le fichier sous nouveau_nom |
| :wq ou :x ou ZZ | enregistre le fichier et quitte vi |

# Aller un peu plus loin
## Aller un peu plus loin
### Éditer efficacement

Passer au « mode insertion » :
| i | passe au « mode insertion » avant le curseur |
| a | passe au « mode insertion » après le curseur |
| I | passe au « mode insertion » en début de ligne |
| A | passe au « mode insertion » en fin de ligne |
| o | passe au « mode insertion » sur une nouvelle ligne au-dessous du curseur |
| O | passe au « mode insertion » sur une nouvelle ligne au-dessus du curseur |
| Remplacement ||
| r | remplace le caractère sous le curseur |
| R | passe au « mode insertion » en remplaçant les caractères sous le curseur |
| Effacer (couper) ||
| x | efface le caractère sous le curseur |
| dd | efface la ligne du curseur |
| d$ | efface du curseur jusqu'à la fin de la ligne |
| dw | efface du curseur jusqu'à la fin du mot |
| dtc | efface du curseur jusqu'au caractère c suivant non-inclus |
| dfc | efface du curseur jusqu'au caractère c suivant inclus |
| Copier ||
| La syntaxe présentée pour couper est généralement valide pour copier, en remplaçant d par y, d'une manière générale le curseur indique la position de départ et un motif de déplacement indiquent la fin du texte à copier/couper. ||
| Les deux fonctions ont cependant certaines fonctionnalités spécifiques : ||
| "nP | colle le texte du nième effacement (jusqu'à 9) |
| "cyy | copie la ligne du curseur dans le tampon désigné par le caractère c |
| "cP | colle le contenu du tampon c |
Sous vi, une commande peut être lancée plusieurs fois simultanément, n commande lance n fois la commande, par exemple :
* 2yy copie la ligne du curseur et la ligne suivante ;
* 10x efface 10 caractères.

### Se déplacer efficacement

Rechercher :
| /motif | recherche motif vers le bas |
| ?motif | recherche motif vers le haut |
| n | répète la recherche |
| N | répète la recherche dans l'autre sens |
| / | répète la recherche vers le bas |
| ? | répète la recherche vers le haut |
| Déplacer le curseur dans le fichier ||
| e | déplace le curseur à la fin du mot (du mot suivant si déjà atteint) |
| ( | déplace le curseur d'une phrase vers l'arrière |
| ) | déplace le curseur d'une phrase vers l'avant |
| { | déplace le curseur d'un paragraphe vers l'arrière |
| } | déplace le curseur d'un paragraphe vers l'avant |
| [[ | déplace le curseur d'une section vers l'arrière |
| ]] | déplace le curseur d'une section vers l'arrière |
| Remarque : ces motifs de déplacement peuvent être utilisés dans la syntaxe des coupers/copiers ||
| Déplacer le curseur dans la fenêtre de vi ||
| H | déplace le curseur sur la première ligne de l'écran |
| M | déplace le curseur au milieu de l'écran |
| L | déplace le curseur sur la dernière ligne de l'écran |
| ( | déplace le curseur d'une phrase vers l'arrière |
| z <ENTRÉE> | déplace la ligne du curseur en haut de l'écran |
| z. | déplace la ligne du curseur au milieu de l'écran |
| z- | déplace la ligne du curseur en bas de l'écran |
| Marquage ||
| mc | marque la position du curseur du caractère c |
| 'c | déplace le curseur jusqu'à la marque c |
| '' | déplace le curseur jusqu'à la marque précédente |