Vi 6546 28775432 2008-04-18T23:10:27Z 213.189.169.179 /* Liens externes */ ajout des drapeaux de langues dans les liens francophone {{Minuscule}} {{voir homonymes|VI}} '''vi''' est un [[éditeur de texte]] en mode texte plein écran écrit par [[Bill Joy]] en [[1976]] sur une des premières versions de la distribution [[Unix]] [[Berkeley Software Distribution|BSD]]. Il est présent d'office sur la majorité des systèmes [[Unix]] actuels, souvent sous la forme d'un [[Vi (logiciel)#Clones et dérivés|clone du logiciel ''vi'']] originel. ==Origine du nom== Le nom '''vi''' provient de l'abréviation la plus courte possible (c'est-à-dire sans ambiguïté) de la commande <tt>visual</tt> de l'éditeur de texte '''ex'''. Cette commande passe ex du mode ''ligne par ligne'' en mode ''[[plein écran]]''. Ainsi, vi était au départ conçu comme une interface visuelle (en anglais, ''Visual Interface'') rajoutée à l'éditeur ex (lui-même basé sur [[Ed (logiciel)|ed]]). ex est toujours disponible dans vi en appuyant sur <tt>:</tt> en mode commande. En pratique, un unique programme est démarré lors de l'invocation de ''vi'' ou ''ex'', son comportement change selon le nom avec lequel il est appelé. Le nom <tt>vi</tt> correspondant et à des initiales et au nom de son install, il est usuellement prononcé en énonçant les deux lettres en anglais, c'est-à-dire ''«&nbsp;vi-aille&nbsp;»'', {{IPA|[vi: aɪ]}}, plutôt que comme un mot à part entière {{IPA|[vi]}}. L'analogie de ce nom avec le chiffre romain ''VI'' (six) est fortuite. ==Principe de fonctionnement== vi est un éditeur modal, c'est-à-dire que la signification des boutons et des touches changent selon le mode dans lequel il se trouve. En mode ''insertion'', le texte tapé est inséré dans le document. Appuyer sur la touche ''Echap'' depuis le mode insertion permet de passer dans le mode ''commande'', dans lequel les touches correspondent à des déplacement du curseur ou à des fonctions d'édition. Par exemple, <tt>j</tt> descend le curseur d'une ligne, <tt>x</tt> efface le caractère sous le curseur (la position «&nbsp;sous le curseur&nbsp;» peut désigner la droite du curseur si ce dernier se place entre les caractères, au dessus du caractère de soulignement ou sous le bloc rectangulaire, selon la manière dont le terminal représente le curseur). Les touches tapées en mode commande ne sont pas insérées dans le texte, ce qui est une cause fréquente de confusion pour les utilisateurs débutants avec vi. En mode ''commande'', de nombreuses opérations peuvent être effectuées en série avec des séquences de touches simples, sans qu'il soit nécessaire de maintenir les touches ''Alt'' ou ''Ctrl'' enfoncées. Les opérations les plus élaborées sont composées d'opérations plus primaires. Par exemple, <tt>d3w</tt> efface trois mots (<tt>d</tt> pour ''delete'' (effacer) et <tt>w</tt> pour ''word'' (mot), <tt>c2fa</tt> change (''change'') le texte jusqu'à ce qu'il trouve (''find'') le second (''2'') ''a''. Pour les utilisateurs expérimentés, cela permet de travailler très efficacement. Cela permet également à l'utilisateur de conserver en permanence ses mains sur le clavier. Les premières versions de vi ne donnaient aucune indication sur le mode dans lequel elles se trouvaient. Il était fréquent que les utilisateurs tapent machinalement sur la touche ''Echap'' pour s'assurer que l'éditeur était bien dans le mode commande (vi émet un signal sonore s'il est déjà dans ce mode). Les versions plus modernes de vi indiquent le mode dans une barre d'état ou graphiquement (par exemple la forme ou la couleur du curseur). Des implémentations graphiques de vi (par exemple [[GVim]]) supportent aussi l'utilisation de la souris et des menus pour accéder aux fonctions d'édition. ==Évolution== vi est devenu [[de facto]] l'éditeur standard d'[[unix]] et il a été l'éditeur favori de nombreux [[hacker]]s jusqu'à l'arrivée d'[[GNU Emacs|Emacs]] en [[1984]]. À ce jour (2005), vi ou l'un de ses clones peut être trouvé dans presque toutes les installations de Unix. La [[Single UNIX Specification]] (plus particulièrement l'« IEEE standard 1003.2, Part 2: Shell and utilities ») inclut vi. Ainsi, tout système se conformant à cette spécification intègre vi. vi est encore largement utilisé par les utilisateurs des différentes variantes d'Unix. Il démarre plus vite que les versions lourdes de l'éditeur Emacs et utilise moins de mémoire. Conséquemment, mêmes des fans d'Emacs l'utilisent comme éditeur pour le [[courrier électronique]] ou pour de petites éditions. Lors de la création d'une disquette de récupération (''rescue disk'', pour les systèmes dont le disque dur ne fonctionne plus correctement), vi est bien souvent choisi comme éditeur, en raison de sa compacité (la place est très limitée sur les disquettes) et du fait que la majorité des gens effectuant des opérations de récupération sont capables de l'utiliser. vi et Emacs sont les éternels belligérants de la [[guerre d'éditeurs|guerre des éditeurs]]. ==Clones et dérivés== De nombreux éditeurs de texte basés sur vi existent. Les clones sont des implémentations, [[logiciel libre|libres]] ou non, de vi, c'est-à-dire qu'ils respectent théoriquement le jeu de commandes standard du vi de POSIX. Toutefois, la majorité de ces clones supportent également des fonctionnalités supplémentaires. Les dérivés sont des programmes, éditeurs de texte ou non, qui ont conservé le principe de fonctionnement de vi (en partie ou complètement) pour leur propre fonctionnement. * vi est un portage vers les systèmes Unix modernes du vi classique de la BSD 3.7. Cette implémentation, qui s'appuie sur le code de ed, est libre au sens [[Berkeley Software Distribution|BSD]] depuis janvier 2002. [http://ex-vi.sourceforge.net/] * [[nvi]] est une implémentation de l'éditeur de texte ex/vi distribuée dans la Fourth Berkeley Software Distribution (4BSD). Il s'agit de la version de vi qui est fournie avec toutes les distributions BSD open source. Elle possède de nombreuses améliorations par rapport au vi classique, notamment l'historique et l'édition des commandes, le [[complètement]] des noms de fichiers, l'édition de plusieurs tampons, le multi-fenêtrage (y compris l'édition d'un même tampon dans plusieurs fenêtres), etc. À part ces améliorations, son interface utilisateur est à peu de choses près identique à celle du vi classique. Cette implémentation est très compacte, rapide, et se fond très naturellement dans l'environnement Unix. * [[elvis (logiciel)|Elvis]] est un clone libre de vi pour Unix et d'autres systèmes d'exploitation. Il possède des fonctionnalités supplémentaires, tel que la [[coloration syntaxique]], ou une interface graphique pour différents systèmes. * [[Vim (logiciel)|Vim]], pour « Vi IMproved », est un clone de vi, moderne et extensible, considéré par beaucoup étant plus puissant et efficace que [[Emacs]] en ce qui concerne l'édition de texte. Il est généralement fourni comme implémentation de vi dans les distributions Linux. * [[svicc]] est un petit clone de Vi pour Commodore (64) [http://www.floodgap.com/retrotech/cbm/svicc/] * [[bvi]] « Binary VI » est un éditeur pour les fichiers binaires, basé sur l'éditeur de texte vi. [http://bvi.sourceforge.net/] * [[VILE]], pour « VI Loves Emacs », est un éditeur de texte qui tente de réconcilier les utilisateurs de vi et de emacs en gardant ce qu'il estime être le meilleur des deux programmes. Une liste plus complète peut être trouvée sur la page suivante&nbsp;: [http://www.saki.com.au/mirror/vi/clones.php3] ==Débuter avec vi== Les utilisateurs débutant avec vi sont souvent confrontés à des difficultés, d'une part à cause des raccourcis utilisés pour chacune des commandes, ensuite parce que l'effet de ces raccourcis change selon le mode dans lequel se trouve vi. Un moyen efficace de débuter avec vi est de suivre d'un bout à l'autre un tutoriel expliquant les commandes les plus simples. La plupart des systèmes fournissant une implémentation de vi contiennent également un tutoriel pour vi. Il existe également des [http://matrix.samizdat.net/pratique/documentation/guide-survie-VI.html guides de survie] pour les débutants. En comprenant son principe de fonctionnement avec quelques explications et des exemples simples, la majorité des utilisateurs peuvent parvenir à leurs fins avec vi. Toutefois, l'aisance (puis la virtuosité) avec vi est généralement considérée comme plus longue à venir qu'avec les autres éditeurs avec lequel il est souvent comparé. Les défenseurs de vi affirment que cette difficulté initiale est largement compensée par l'efficacité de l'éditeur une fois que l'on est à l'aise. ===Commandes jugées obscures=== Les débutants sont souvent déroutés par les commandes de vi. Ces dernières sont bien souvent réduites à une seule et unique lettre, et bien difficiles à mémoriser au premier abord. La plupart des commandes de vi sont choisies de façon à : * limiter la frappe nécessaire. Les modificateurs tels que ''Ctrl'', ''Maj'' ou ''Alt'' sont utilisés avec la plus grande parcimonie ; * limiter les mouvements des doigts et des mains sur le clavier. Par exemple, en mode commande, les touches ''h'', ''j'', ''k'' et ''l'' permettent de déplacer le curseur. Comme il s'agit d'une des fonctions les plus importantes, les touches qui lui sont affectées sont celles que l'utilisateur a immédiatement sous les doigts ; * faciliter les moyens mnémotechniques pour retenir leur(s) effet(s). Il faut toutefois garder à l'esprit que vi a été écrit par des programmeurs anglophones. Par exemple, en mode commande, <tt>d</tt> permet d'effacer ('''d'''elete), <tt>i</tt> passe en mode '''i'''nsertion, <tt>w</tt> avance le curseur d'un mot ('''w'''ord). En combinant une commande d'édition (par exemple effacer : <tt>d</tt>) et une commande de mouvement (par exemple avancer d'un mot : <tt>w</tt>), on obtient la séquence <tt>dw</tt>, qui permet d'effacer un mot. Similairement, la commande <tt>d3w</tt> efface trois mots. ===Comportement modal=== Lorsque l'on débute avec vi, il est primordial de comprendre que vi possède plusieurs modes de fonctionnement. Les deux principaux modes sont le mode ''commande'' (dans lequel vi démarre) et le mode ''insertion''. La commande <tt>i</tt> du mode commande permet de passer en mode insertion, tandis que la touche ''Echap'' permet de passer du mode insertion au mode commande. vi possède également un autre mode de fonctionnement, qui offre la possibilité de définir de [[macro|macros-commandes]] en intégrant un véritable [[langage de programmation]] pour automatiser des tâches d'édition de texte. Il est aussi possible d'appeler vi avec des arguments afin qu'il exécute automatiquement des commandes lors de l'ouverture d'un fichier. Par exemple, la ligne de commande : vi -c "1,%s/Deux/Trois/g|:wq" FICHIER lance vi, qui ouvre le fichier "FICHIER", puis remplace tous les "Deux" par des "Trois" dans le fichier, et enfin enregistre le fichier et quitte. ==Fonctionnalités de vi== ===Macros et abréviations=== vi permet de définir des macros-commandes et des abréviations. Les macros permettent de remplacer une séquence de touches par une autres, ce qui permet de définir de nouvelles commandes. Par exemple, :map v 10d crée la commande <tt>v</tt> du mode commande, qui supprime des blocs de 10 lignes. Les abréviations permettent d'éviter de taper une séquence de lettres plutôt longue. Par exemple : :ab GNU gnu is not unix crée l'abréviation ''GNU'', qui en mode insertion est remplacée par ''gnu is not unix'' dès que suffisamment de caractères sont tapés pour lever toute ambiguïté (les abréviations sont généralement étendus quand un espace est inséré pour indiquer la fin du mot). === Options === Le comportement de vi et de ses commandes peut être ajusté grâce à ce que vi appelle des « options ». La commande <tt>:set</tt> permet de les consulter et de les modifier. Certaines options sont booléennes, c'est-à-dire qu'elle peuvent prendre deux valeurs seulement : ''vrai'' ou ''faux'', ou plus exactement ''activée'' et ''desactivée''. Par exemple : :set number que l'on peut abréger par :set nu affiche le numéro de chaque ligne. :set nonumber :set nonu sont équivalentes et permettent de désactiver cette option. Parmi les options booléennes, on peut trouver (liste non exhaustive) : {| border="0" align="center" style="border: 1px solid #999; background-color:#FFFFFF; width:90%;" |- align="center" bgcolor="#CCCCCC" ! Commande !! Effet |----- | :set ignorecase || ignore la [[casse (typographie)|casse]] lors de la recherche de chaînes de caractères |-----bgcolor="#EFEFEF" | :set readonly || interdit la modification du fichier ouvert |----- | :set autoindent || indente automatiquement le code lors de l'édition |-----bgcolor="#EFEFEF" | :set ruler || indique le numéro de ligne et de colonne sur lesquelles se trouve le curseur |----- | :set showmode || montre le mode dans lequel se trouve vi |} Les autres options prennent une valeur. Par exemple : :set tags=./tags indique à vi où chercher le fichier de [[Marqueurs (édition de texte)| marqueurs]]. L'ensemble de toutes les options disponibles peut être affiché avec :set all ===Fichier de configuration=== L'ensemble des options de vi (ainsi que les macros et les abréviations) peuvent être fixées pour chaque session d'édition en les ajoutant dans le fichier ''~/.exrc''. Ce fichier est lu automatiquement au démarrage de vi, et les commandes qu'il contient sont exécutées comme si elles étaient tapées par l'utilisateur (le <tt>:</tt> initial est inutile). Exemple : set nu map @ dd ab sig Mr. Robert Le NomBienLong ==Exemples de commandes== ===Exemples de commandes simples=== Le tableau qui suit donne quelques commandes basiques de l'éditeur vi, nécessaires aux tâches d'édition les plus simples. {| border="0" align="center" style="border: 1px solid #999; background-color:#FFFFFF; width:90%;" |- align="center" bgcolor="#CCCCCC" ! Commande !! Effet |----- | <tt>h</tt> et <tt>l</tt> || déplace le curseur d'un caractère à gauche et à droite |-----bgcolor="#EFEFEF" | <tt>j</tt> et <tt>k</tt> || déplace le curseur sur la ligne suivante et précédente |----- | <tt>G</tt> || déplace le curseur à la fin du fichier |-----bgcolor="#EFEFEF" | <tt>H</tt> et <tt>L</tt> || déplace le curseur en haut [H] et en bas [L] de l'écran |----- | <tt>a</tt> || insère du texte après le curseur |-----bgcolor="#EFEFEF" | <tt>A</tt> || insère du texte à la fin de la ligne courante |----- | <tt>c</tt> || efface un certain nombre de caractères, en fonction de la sous-commande (par exemple <tt>cl</tt> permet de changer le caractère courant, <tt>cw</tt> la fin du mot courant) puis passe en mode insertion |-----bgcolor="#EFEFEF" | <tt>dd</tt> || supprime la ligne courante |----- | <tt>dw</tt> || supprime le mot après le curseur |-----bgcolor="#EFEFEF" | <tt>dW</tt> || supprime la chaîne de caractères après le curseur (s'arrête au prochain caractère blanc) |----- | <tt>D</tt> || supprime la fin de la ligne à partir du curseur |-----bgcolor="#EFEFEF" | <tt>i</tt> || insère du texte avant le curseur |----- | <tt>O</tt> || ouvre une nouvelle ligne au-dessus de la ligne courante |-----bgcolor="#EFEFEF" | <tt>o</tt> || ouvre une nouvelle ligne en dessous de la ligne courante |----- | <tt>:q</tt> || quitte vi |-----bgcolor="#EFEFEF" | <tt>:q!</tt> || quitte vi même si les modifications n'ont pas été enregistrées |----- | <tt>:s</tt> || remplace une chaîne de caractère par une autre. Par exemple, <tt>:s/avant/après/</tt> remplace le mot « avant » par le mot « après » sur la ligne courante |-----bgcolor="#EFEFEF" | <tt>w</tt> || place le curseur sur le premier caractère du mot suivant |----- | <tt>:w</tt> || enregistre le fichier courant |-----bgcolor="#EFEFEF" | <tt>:wq</tt> ou <tt>:x</tt> ou <tt>ZZ</tt> || enregistre le fichier courant et quitte |----- | <tt>x</tt> || supprime le caractère sous le curseur |-----bgcolor="#EFEFEF" | <tt>/</tt> || recherche une chaîne de caractères après le curseur |----- | <tt>?</tt> || recherche une chaîne de caractères avant le curseur |-----bgcolor="#EFEFEF" | ''<tt>#</tt>commande'' || exécute ''#'' fois la ''commande'', par exemple <tt>5dd</tt> efface 5 lignes |----- | <tt>!</tt>''commande'' || exécute une commande shell, par exemple <tt>:!gcc -o hello hello.c</tt> |-----bgcolor="#EFEFEF" | ''Echap'' || quitte le mode insertion (retourne au mode commande) |} ===Exemples de commandes avancées=== Les commandes suivantes montrent ce que permet vi quand un utilisateur cherche des commandes d'édition plus pointues. {| border="0" align="center" style="border: 1px solid #999; background-color:#FFFFFF; width:90%;" |- align="center" bgcolor="#CCCCCC" ! Commande !! Effet |----- | <tt>>></tt> || ajoute une tabulation en début de ligne |-----bgcolor="#EFEFEF" | <tt><<</tt> || retire une tabulation en début de ligne |----- | <tt>"myy</tt> || mémorise la ligne courante dans le registre ''"m'' |-----bgcolor="#EFEFEF" | <tt>"mp</tt> || insère le contenu du registre ''"m'' après la ligne courante ou après le curseur |----- | <tt>:$</tt> || place le curseur à la dernière ligne du tampon |-----bgcolor="#EFEFEF" | <tt>:1</tt> || (ou tout autre numéro) place le curseur sur la ligne correspondante |----- | <tt>:.=</tt> || renvoie le numéro de la ligne courante |-----bgcolor="#EFEFEF" | <tt>:10,20t 100</tt> || copie les lignes 10 à 20 à la ligne 100 |----- | <tt>:100$m 50</tt> || déplace de la ligne 100 à la dernière ligne à la 50ème ligne |-----bgcolor="#EFEFEF" | <tt>:10,20 s/TRUC/bidule/g</tt> || remplace tous les ''TRUC'' par des ''bidule'' dans les lignes 10 à 20 |----- | <tt>:g!/machin/d</tt> || efface les lignes ne contenant pas le texte ''machin'' |-----bgcolor="#EFEFEF" | <tt>:g/machin/d</tt> || efface les ligne contenant le texte ''machin'' |----- | <tt>:r fichier.txt</tt> || insère le contenu du fichier ''fichier.txt'' |-----bgcolor="#EFEFEF" | <tt>:10,20w fichier.txt</tt> || enregistre les lignes 10 à 20 dans le fichier ''fichier.txt'' |----- | <tt>:e!</tt> || ouvre à nouveau le fichier courant (sert par exemple si le fichier a été modifié entre temps) |-----bgcolor="#EFEFEF" | <tt>:r!ls -l</tt> || insère le résultat de la commande ''ls -l'' dans le fichier |----- | <tt>:10,20g/condition/remplacer/resultat/gc</tt> || remplace tous les ''remplacer'' par des ''resultat'' dans les lignes contenant ''condition'', en demandant confirmation à chaque fois, entre les lignes 10 et 20 |-----bgcolor="#EFEFEF" | <tt>:40,50 g/condition/d</tt> || efface les lignes contenant ''condition'', entre les lignes 40 et 50 |----- | <tt>:s/.*/\U&/</tt> || passe la ligne courante en majuscule |-----bgcolor="#EFEFEF" | <tt>:%s/^mot//</tt> || efface le mot ''mot'' s'il est en début de ligne |----- | <tt>:%s/foo/bar/g</tt> || Remplace toutes les occurrences de foo par bar |-----bgcolor="#EFEFEF" | <tt>:3,7s%foo/bar%bar/foo%c</tt> || Remplace après confirmation (c) aux lignes 3 à 7 les occurrences de la sous-chaîne foo/bar par bar/foo. Cela montre que l'on peut utiliser un autre caractère séparateur que / (ici %) |----- | <tt>:g/^[\.]*$/d</tt> || supprime les lignes vides |} ==Voir aussi== ===Articles connexes=== * [[Ed (logiciel)|ed]] ; * [[nvi]], implémentation libre ([[Berkeley Software Distribution|BSD]]) de vi ; * [[Elvis (logiciel)|Elvis]], autre implémentation de vi, plus puissante que l'originale ; * [[Vim (logiciel)|Vim]], « Vi IMproved » (vi amélioré) : un clone de vi plus puissant et plus simple que l'original ; * [[Guerre d'éditeurs]]. * [[Emacs]] - concurrent traditionnel de Vi dans le cadre de la [[guerre d'éditeurs]]. <!-- Avant d'effacer cette remarque, faites un tour sur [[Vim (logiciel)]] et sur les articles "blondes, brunes, rousses" du dictionnaire des idées reçues de [[Flaubert]] disponible sur http://www.gutenberg.org/files/14156/14156-8.txt --> ===Bibliographie=== * {{en}} Linda Lamb, Arnold Robbins, ''Learning the vi Editor, Sixth Edition'', O'Reilly, [[1998]] <small>(ISBN 1-56592-426-6)<small>. ===Liens externes=== * {{fr}} [http://matrix.samizdat.net/pratique/documentation/guide-survie-VI.html Guide de survie sous vi] - une documentation en français à destination des utilisateurs débutant avec vi ; * {{fr}} [http://vim.dindinx.net/ Traduction de la documentation de Vim en français] ; * {{fr}} [http://www.misfu.com/utiliser-configurer-editeur-texte-vi-linux.html Complément de cours en français] ; * {{fr}} [http://www.linuxcertif.com/man/1/vi/ Page de manuel de la commande] * {{en}} [http://www.thomer.com/vi/vi.html vi lovers home page] - La page des amoureux de vi ; * {{en}} [http://www.saki.com.au/mirror/vi/clones.php3 Liste de clones de vi et de programmes ayant une interface similaire à celle de vi] ; * {{en}} [http://www.hut.fi/~thyle/vi_opas.html Un court index des commandes vi]. {{Navigation commandes unix}} {{portail informatique}} [[Catégorie:Éditeur de texte]] [[Catégorie:Unix]] [[ar:في آي]] [[bn:ভিআই]] [[cs:Vi]] [[de:Vi]] [[en:Vi]] [[es:Vi]] [[fa:وی‌آی]] [[fi:Vi]] [[gl:Vi]] [[id:Vi]] [[it:Vi (software)]] [[ja:Vi]] [[ko:Vi]] [[la:VI]] [[nl:Vi (Unix)]] [[pl:Vi (program)]] [[pt:Vi]] [[ru:Vi]] [[sv:Vi (textredigerare)]] [[th:Vi]] [[tr:Vi]] [[uk:Vi]] [[vi:Vi]] [[zh:Vi]]