<p class="spip"><strong class="spip">Vi</strong> est un puissant éditeur de textes. On le rencontre souvent sous linux dans une version améliorée appelée <strong class="spip">vim</strong>. L’utilisation de <strong class="spip">vi</strong> est complexe pour le débutant, mais les efforts d’apprentissage sont récompensés par la puissance et la rapidité des tâches que l’on peut exécuter avec un peu de pratique.</p>

<h2>Options</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Option</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">-b</strong></td><td>Mode binaire. Permet l’édition d’un fichier binaire ou exécutable. </td></tr>
<tr class="row_odd"><td><strong class="spip">-g</strong></td><td>Active l’interface graphique si <strong class="spip">vi</strong> a été compilé avec le support d’une interface graphique. Équivalent à la commande gvim pour la version améliorée de <strong class="spip">vi</strong>, <strong class="spip">vim</strong>. </td></tr>
<tr class="row_even"><td><strong class="spip">-r </strong><i class="spip"> <strong class="spip">fichier</strong> </i></td><td>Mode récupération. Le fichier d’échange <i class="spip"> fichier </i> est utilisé pour récupérer une session après un crash. </td></tr>
<tr class="row_odd"><td><strong class="spip">-v</strong></td><td>Mode vue. L’option lecture seule est activée. L’édition est cependant possible mais le fichier est protégé contre un effacement accidentel et il faut forcer l’écrasement avec le point d’exclamation. </td></tr>
<tr class="row_even"><td><strong class="spip">&mdash;</strong></td><td>Marque la fin des options. Cela permet d’éditer un fichier dont le nom commence par un tiret. </td></tr>
</tbody>
</table>
<h2>Les modes vi : </h2>
<p class="spip">Vi possède deux modes de fonctionnement :
<br /></p>
<li> Le mode commande (Mode par défaut au démarrage). 
<br /><li> Le mode insertion.
<h2>Le mode commande </h2>
<p class="spip">Le mode commande est actif dès le lancement. On peut alors :
<br /></p>
<li> Activer le mode insertion. 
<br /><li> Lancer les commandes d’édition du texte. 
<br /><li> Déplacer le curseur dans le fichier. 
<br /><li> Lancer un shell. 
<br /><li> Sauvegarder le fichier ou quitter l’éditeur.
<h2>Le mode insertion </h2>
<p class="spip">La saisie du texte se fait en <i class="spip"> mode insertion </i>. On quitte le <i class="spip"> mode insertion </i> avec la touche Echap et l’on se retrouve alors en <i class="spip"> mode commande </i>. L’activation du mode insertion se fait avec les commandes suivantes :</p>

<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touche</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">a</strong></td><td>Insertion après le curseur. </td></tr>
<tr class="row_odd"><td><strong class="spip">A</strong></td><td>Insertion en fin de ligne. </td></tr>
<tr class="row_even"><td><strong class="spip">c</strong></td><td>Début d’une opération de remplacement. </td></tr>
<tr class="row_odd"><td><strong class="spip">C</strong></td><td>Remplacement jusqu’en fin de ligne. </td></tr>
<tr class="row_even"><td><strong class="spip">i</strong></td><td>Insertion avant le curseur. </td></tr>
<tr class="row_odd"><td><strong class="spip">I</strong></td><td>Insertion en début de ligne. </td></tr>
<tr class="row_even"><td><strong class="spip">o</strong></td><td>Insertion à la ligne suivante. </td></tr>
<tr class="row_odd"><td><strong class="spip">O</strong></td><td>Insertion à la ligne précédente. </td></tr>
<tr class="row_even"><td><strong class="spip">R</strong></td><td>Active le mode écrasement. </td></tr>
<tr class="row_odd"><td><strong class="spip">s</strong></td><td>Remplace un caractère. </td></tr>
<tr class="row_even"><td><strong class="spip">S</strong></td><td>Remplace une ligne entière. </td></tr>
</tbody>
</table>
<h3>Déplacement du curseur</h3>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touche</strong></th><th scope='col'><strong class="spip">Commentaire </strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">h</strong></td><td>Un caractère vers la gauche . </td></tr>
<tr class="row_odd"><td><strong class="spip">j</strong></td><td>Un caractère vers le bas. </td></tr>
<tr class="row_even"><td><strong class="spip">k</strong></td><td>Un caractère vers le haut. </td></tr>
<tr class="row_odd"><td><strong class="spip">l ou ESPACE</strong></td><td>Un caractère vers la droite. </td></tr>
</tbody>
</table>
<h3>Texte </h3>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touche</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">w ou W</strong></td><td>Début du mot suivant. </td></tr>
<tr class="row_odd"><td><strong class="spip">b ou B</strong></td><td>Début du mot courant. </td></tr>
<tr class="row_even"><td><strong class="spip">e ou E</strong></td><td>Fin du mot courant. </td></tr>
<tr class="row_odd"><td><strong class="spip">)</strong></td><td>Début de la phrase suivante. </td></tr>
<tr class="row_even"><td><strong class="spip">(</strong></td><td>Début de la phrase précédente. </td></tr>
<tr class="row_odd"><td><div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
}<br />
</code></div><br />
</td><td>Début du paragraphe suivant. </td></tr>
<tr class="row_even"><td><div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
{<br />
</code></div><br />
</td><td>Début du paragraphe précédent.</td></tr>
<tr class="row_odd"><td><strong class="spip">]</strong></td><td>Début de la section suivante.</td></tr>
<tr class="row_even"><td><strong class="spip">[</strong></td><td>Début de la section précédente. </td></tr>
</tbody>
</table>
<h3>Lignes </h3>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touche</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">^</strong></td><td>Début de ligne. </td></tr>
<tr class="row_odd"><td><strong class="spip">$</strong></td><td>Fin de ligne. </td></tr>
<tr class="row_even"><td><strong class="spip">-</strong></td><td>Premier caractère de la ligne précédente. </td></tr>
<tr class="row_odd"><td><strong class="spip">+ ou Entrée</strong></td><td>Premier caractère de la ligne suivante. </td></tr>
<tr class="row_even"><td><strong class="spip">H</strong></td><td>Première ligne de l’écran. </td></tr>
<tr class="row_odd"><td><strong class="spip">L</strong></td><td>Dernière ligne de l’écran. </td></tr>
<tr class="row_even"><td>]</td><td>Début de la section suivante.</td></tr>
<tr class="row_odd"><td><strong class="spip">[</strong></td><td>Début de la section précédente. </td></tr>
</tbody>
</table>
<h3>Écrans </h3>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touche</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">CTRL-f</strong></td><td>Avance d’un écran. </td></tr>
<tr class="row_odd"><td><strong class="spip">CTRL-b</strong></td><td>Recule d’un écran. </td></tr>
<tr class="row_even"><td><strong class="spip">z Entrée</strong></td><td>Positionne la ligne active en haut de l’écran. </td></tr>
<tr class="row_odd"><td><strong class="spip">z.</strong></td><td>Positionne la ligne active au centre de l’écran. </td></tr>
<tr class="row_even"><td><strong class="spip">z-</strong></td><td>Positionne la ligne active en bas de l’écran. </td></tr>
</tbody>
</table>
<h3>Recherche </h3>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touche</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">/</strong><i class="spip"> <strong class="spip">motif</strong> </i></td><td>Recherche <i class="spip"> motif </i> vers l’avant. </td></tr>
<tr class="row_odd"><td><strong class="spip">/</strong></td><td>Répétition de la recherche vers l’avant. </td></tr>
<tr class="row_even"><td><strong class="spip"> ?</strong><i class="spip"> <strong class="spip">motif</strong> </i></td><td>Recherche <i class="spip"> motif </i> vers l’arrière. </td></tr>
<tr class="row_odd"><td><strong class="spip"> ?</strong></td><td>Répétition de la recherche vers l’arrière. </td></tr>
<tr class="row_even"><td><strong class="spip">n</strong></td><td>Répète la dernière opération de recherche. </td></tr>
<tr class="row_odd"><td><strong class="spip">%</strong></td><td>Déplacement vers le crochet, la parenthèse ou l’accolade correspondant à celui ou se trouve le curseur. </td></tr>
</tbody>
</table>
<h2>Commandes d’édition</h2>
<h3>Saisie de texte </h3>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touche</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">a</strong></td><td>Insertion après le curseur. </td></tr>
<tr class="row_odd"><td><strong class="spip">A</strong></td><td>Insertion en fin de ligne. </td></tr>
<tr class="row_even"><td><strong class="spip">i</strong></td><td>Insertion avant le curseur. </td></tr>
<tr class="row_odd"><td><strong class="spip">I</strong></td><td>Insertion en début de ligne. </td></tr>
<tr class="row_even"><td><strong class="spip">Esc</strong></td><td>Fin du mode édition. </td></tr>
<tr class="row_odd"><td><strong class="spip">Entrée</strong></td><td>Passe à la ligne suivante. </td></tr>
</tbody>
</table>
<h3>Modification de texte </h3>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touches</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">cw</strong></td><td>Modifie le mot courant. </td></tr>
<tr class="row_odd"><td><strong class="spip">cc</strong></td><td>Modifie la ligne courante. </td></tr>
<tr class="row_even"><td><strong class="spip">C</strong></td><td>Modifie du curseur jusqu’à la fin de la ligne. </td></tr>
<tr class="row_odd"><td><strong class="spip">dd</strong></td><td>Supprime la ligne en cours. </td></tr>
<tr class="row_even"><td><strong class="spip">dw</strong></td><td>Supprime le mot courant. </td></tr>
<tr class="row_odd"><td><strong class="spip">D</strong></td><td>Efface du curseur à la fin de la ligne. </td></tr>
<tr class="row_even"><td><strong class="spip">d^</strong></td><td>Efface du début de la ligne jusqu’au curseur. </td></tr>
<tr class="row_odd"><td><strong class="spip">d/</strong><i class="spip"> <strong class="spip">motif</strong> </i></td><td>Efface jusqu’à la première occurrence de <i class="spip"> motif </i>. </td></tr>
<tr class="row_even"><td><strong class="spip">p</strong></td><td>Insère après le curseur la dernière portion de texte supprimée ou copiée. </td></tr>
<tr class="row_odd"><td><strong class="spip">P</strong></td><td>Insère avant le curseur la dernière portion de texte supprimée ou copiée. </td></tr>
<tr class="row_even"><td><strong class="spip">rx</strong></td><td>Remplace le caractère courant par x. </td></tr>
<tr class="row_odd"><td><strong class="spip">R</strong></td><td>Active le mode remplacement de texte. </td></tr>
<tr class="row_even"><td><strong class="spip">u</strong></td><td>Annule la dernière opération. </td></tr>
<tr class="row_odd"><td><strong class="spip">U</strong></td><td>Annule toutes les opérations effectuées sur la ligne courante. </td></tr>
<tr class="row_even"><td><strong class="spip">.</strong></td><td>Répète la dernière opération. </td></tr>
<tr class="row_odd"><td><strong class="spip"><code class='spip_code' dir='ltr'>~</code></strong></td><td>Change la casse du caractère sous le curseur. </td></tr>
<tr class="row_even"><td><strong class="spip">J</strong></td><td>Fusionne deux lignes (join). </td></tr>
</tbody>
</table>
<h2>Copie et déplacement de texte </h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touches</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">Y</strong></td><td>Copie la ligne courante dans un nouveau tampon. </td></tr>
<tr class="row_odd"><td><strong class="spip">yy</strong></td><td>Copie la ligne courante. </td></tr>
<tr class="row_even"><td><strong class="spip">"xyy</strong></td><td>Copie la ligne courante dans le tampon x. </td></tr>
<tr class="row_odd"><td><strong class="spip">"xd</strong></td><td>Supprime la ligne courante et la place dans le tampon x. </td></tr>
<tr class="row_even"><td><strong class="spip">"Xd</strong></td><td>Supprime la ligne courante et l’ajoute au tampon x. </td></tr>
<tr class="row_odd"><td><strong class="spip">"xp</strong></td><td>Insère le contenu du tampon x. </td></tr>
</tbody>
</table>
<h2>Sauvegarder et quitter </h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touches</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">ZZ</strong></td><td>Quitte l’éditeur et enregistre le fichier s’il a été modifié. </td></tr>
<tr class="row_odd"><td><strong class="spip">:x</strong></td><td>Identique à <strong class="spip">ZZ</strong>. </td></tr>
<tr class="row_even"><td><strong class="spip">:w</strong></td><td>Enregistre le fichier. </td></tr>
<tr class="row_odd"><td><strong class="spip">:wq</strong></td><td>Enregistre le fichier et quitte l’éditeur. </td></tr>
<tr class="row_even"><td><div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
:w!<br />
</code></div><br />
</td><td>Enregistre le fichier en passant outre les protections (fichier ouvert en lecture seule, par exemple). </td></tr>
<tr class="row_odd"><td><strong class="spip">:q</strong></td><td>Quitte l’éditeur. </td></tr>
<tr class="row_even"><td><div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
:q!<br />
</code></div><br />
</td><td>Quitte l’éditeur sans enregistrer les dernières modifications. </td></tr>
<tr class="row_odd"><td><strong class="spip">:e </strong><i class="spip"> <strong class="spip">fichier</strong> </i></td><td>Édite le fichier <i class="spip"> fichier </i> sans quitter vi. </td></tr>
<tr class="row_even"><td><strong class="spip">:n</strong></td><td>Édite le fichier suivant. </td></tr>
<tr class="row_odd"><td><strong class="spip">:n </strong><i class="spip"> <strong class="spip">fichiers</strong> </i></td><td>Spécifie une nouvelle liste de <i class="spip"> fichiers </i>. </td></tr>
<tr class="row_even"><td><strong class="spip">:args</strong></td><td>Affiche la liste des fichiers à éditer. </td></tr>
</tbody>
</table>
<h2>Commandes "shell" </h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Touches</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td><strong class="spip">:r </strong><i class="spip"> <strong class="spip">fichiers</strong> </i></td><td>Insère le contenu de « <i class="spip"> fichier » </i>. </td></tr>
<tr class="row_odd"><td><div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
:r! commande<br />
</code></div><br />
</td><td>Insère le résultat de « <i class="spip"> commande » </i>. </td></tr>
<tr class="row_even"><td><div style='text-align: left;' class='spip_code' dir='ltr'><code><br />
:n1,n2! commande<br />
</code></div><br />
</td><td>Envoie les lignes <i class="spip"> n1 </i> à <i class="spip"> n2 </i> à « <i class="spip"> commande » </i> et les remplace par la sortie de « <i class="spip"> commande » </i>.</td></tr>
<tr class="row_odd"><td><strong class="spip"> !!</strong></td><td>Répète la dernière commande système. </td></tr>
</tbody>
</table>
<h2>Historique des modifications</h2>
<table class="spip">
<thead><tr class='row_first'><th scope='col'><strong class="spip">Version</strong></th><th scope='col'><strong class="spip">Date</strong></th><th scope='col'><strong class="spip">Commentaire</strong></th></tr></thead>
<tbody>
<tr class="row_even"><td>0.1</td><td>2002</td><td><strong class="spip">Thierry COLAS</strong>, auteur original du document « Lignes de commandes - le pense bête de COAGUL »</td></tr>
<tr class="row_odd"><td>0.2</td><td>2004</td><td><strong class="spip">Marc P</strong><strong class="spip">OIROUD</strong> pour la conversion en LATEX , PDF et HTML. <strong class="spip">Gnunux</strong>, pour sa relecture</td></tr>
<tr class="row_even"><td>0.3</td><td>11/03/05</td><td><strong class="spip">Tony</strong> pour la conversion au format OOo / Spip et le découpage en 7 articles.</td></tr>
</tbody>
</table>