Next Previous Contents

7. Les commandes ex

ex est un autre aspect de l'éditeur vi, on peut même dire que vi n'est "que" le mode "visuel" de l'éditeur qui s'appelle en fait ex. Les commandes ex peuvent être beaucoup plus élaborées que les commandes du mode normal.

On y accède en tapant un : (un deux-points) depuis le mode normal. Ce mode s'appelle "command line" dans la documentation, parfois en anglais "colon mode" du fait du deux-points initial. Je l'appelerai (lourdement) "ligne de commande ex" pour le distinger du mode commande qui est un autre nom pour le mode normal... Ce mode ligne de commande ex permet de taper une commande ex. Après avoir exécuté la commande, on revient en mode normal.

Il y a aussi le mode "ex", contraste du mode "visual". Dans ce mode, après avoir exécuté sa commande ex, on reste en attente d'une nouvelle commande ex. Ce mode devait être utile quand dans les années 1970 on n'avait qu'une imprimante matricielle pour servir d'écran, mais j'ai du mal à lui voir une utilité hors de ce contexte.

Les caractères s'affichent en bas de l'écran. Un appui sur la touche Entrée exécute la commande ex et vous fait habituellement revenir en mode commande. Un appui sur Échap ou Ctrl-C abandonne.

Dans ces modes ex l'interprétation des touches est plus proche du shell sh. Le déplacement du curseur se fait avec les flèches, les touches curseur Home et End sont habituellement mappés en début et fin de ligne, et Ctrl-W supprime le mot précédent, par exemple.

Certaines commandes ex (notamment :version) affichent plusieurs lignes et ne reviennent pas tout de suite en mode normal. Pour cela il faut appuyer une nouvelle fois sur Entrée.

Pour distinguer les commandes mode normal des commandes ex, je les note en considèrant que le : fait partie de la commande. Pour exécuter la commande :version, on part donc comme toujours du mode normal, on tape la touche : qui au lieu de s'afficher là où est le curseur dans le texte va s'afficher en bas à gauche de l'écran. Le curseur se positionne juste après, on tape version puis la touche Entrée. Le texte informatif sur la version s'affiche, suivi d'une invitation à appuyer une nouvelle fois sur Entrée. Après avoir appuyé, le texte informatif disparaît et on revient en mode normal, avec le curseur au point d'origine puisque la commande exécutée n'avait pas pour but de déplacer le curseur. Les commandes ex qui modifient le contenu du fichier laisseront le curseur au dernier endroit où le fichier a été modifié.

Les principales commandes sont :

:q

quitter, lorsque le fichier n'a pas été modifié

:q!

quitter en abandonnant les modifications

:w

sauvegarder les modifications (write) Ajouter un ! pour forcer, par exemple quand le fichier sur disque a été modifié hors vim, ou quand il n'est en principe pas écrivable.

:wq

quitter en sauvegardant les modifications (write quit)

:x

idem que :wq (eXit)

:n

(Next) passe au fichier suivant quand on a donné plusieurs fichiers sur la ligne de commande au lancement et que l'actuel n'a pas été modifié. :wn pour sauver et passer à la suite, :n! pour passer au suivant sans sauver, :p :wp :p! pour le fichier précédent. Rajouter un ! pour forcer l'abandon d'un fichier modifié ou forcer l'écriture d'un fichier.

:w nouveaunomdefichier

sauvegarder le fichier sous un autre nom (mais sans changer le nom du fichier en cours). Rajouter un ! (donc :w! nouveaunomdefichier) pour forcer.

:f

affiche des informations en bas de l'écran (le nom du fichier, le nombre de lignes, la position dans le fichier) en plus de ce que vim met habituellement.

:history

Affiche l'historique des commandes ex. Dans la plupart des versions de vi vous pouvez aussi parcourir l'historique des commandes ex avec les flèches verticales. Il y a d'autres façons de les obtenir aussi...

:g/RECHERCHE/#

exécute une commande ex (ici #) sur toutes les lignes correspondant à la recherche. # étant une commande ex qui affiche la ligne préfixée de son numéro, cette commande-ci revient donc à un :%!grep -n 'RECHERCHE' suivi d'un u pour annuler).

:!ls

lancer une commande Unix (ici ls). La sortie s'affiche et après l'appui sur une touche vous revenez au fichier.

:r!ls | grep -i data

(read) insérer après la ligne du curseur la sortie d'une commande Unix (ici, insérer la sortie de la commande ls filtrée par un grep -i data)

:r autrefichier.txt

(read) insérer après la ligne du curseur le contenu d'un fichier. Sous vim l'autocomplétion fonctionne avec la touche Tabulation.

:%!sort X

passer tout le fichier par une commande filtre Unix, ici sort. Les lignes passées sur l'entrée standard de la commande disparaissent et sont remplacées par la sortie standard de la commande.

:%s/RECHERCHER/REMPLACER/OPTION

passer tout le fichier par le filtre interne sous-ensemble du filtre UNIX sed. L'OPTION la plus courante est g, sans laquelle seul le premier remplacement de chaque ligne sera fait. Une autre option est c qui demande confirmation avant le remplacement. Comme avec sed, on peut remplacer le / par autre chose pour travailler sur des noms de fichier sans être obligé de mettre un backslash devant chaque slash, mais on a un peu moins de choix qu'avec sed (pas de pipe, pas de lettre). Un exemple avec une virgule : :%s,/bin/,/sbin/,g

:%d

couper tout le fichier (d comme en mode normal, comme dans sed, etc.).

:%y

copier tout le fichier dans le tampon par défaut (yank, comme en mode normal)

:%w fichier

écrire tout le fichier dans un nouveau fichier (comme :w fichier)

Ces trois dernières ne servent pas tels quels, mais le % signifiant tout le fichier peut être remplacé par un spécification de lignes. Dans cette spécification, un nombre représente un numéro de ligne, un point signifie la ligne où est le curseur, un apostrophe suivi d'une lettre ou de < ou > signifiant une marque (voir la commande m) et même /REGEXP/ une ligne correspondant à l'expression régulière. On peut y ajouter un plus ou un moins suivi d'un nombre. On a ainsi

:s/RECHERCHER/REMPLACER/g

substitution de toutes les occurrences, sur la ligne courante uniquement

:/^#/,/^#/+10s/RECHERCHER/REMPLACER/

aller à la prochaine ligne commençant par un # et effectuer le remplacement sur cette ligne et les 10 suivantes.

:5s/RECHERCHER/REMPLACER/

substitution uniquement sur la ligne 5

:5,50s/RECHERCHER/REMPLACER/

substitution de la ligne 5 à 50 inclus

:.,$w nouveaufichier

écriture dans un nouveau fichier des lignes à partir de la ligne courante jusqu'à la fin

:.,.+20s/RECHERCHER/REMPLACER/

substitution entre la ligne courante et la ligne 20 lignes plus bas

Une autre façon est d'utiliser depuis le mode normal la commande ! suivi d'un déplacement. !20j affichera :.,.+20! et attendra en mode ligne de commande ex qu'on entre la commande à exécuter.

L'intérêt de ces spécifications un peu compliquées est plutôt quand on voudra copier-coller, répéter, ou scripter des commandes. En interactif avec vim on préférera la plupart du temps utiliser la commande v pour fixer le début et la fin. Cette commande est décrite dans la section copier-couper-coller.

Une dernière combinaison de touches : @: signifie "exécuter le tampon dans lequel est stocké la dernière commande ex". Cela relance donc la dernière commande ex, avec quelques restrictions cependant.


Next Previous Contents