Bien que je ne puisse pas nier que j'ai moi aussi eu du mal avec vi au début, je pense que l'on peut faire valoir que vi est en fait très simple à apprendre. (Quand j'ai commencé à utiliser Unix, le choix était soit vi, soit emacs, donc au moment où j'ai choisi ed, ed étant un éditeur de ligne très simple, que j'avais déjà appris en lisant les premiers manuels Unix.) J'utilise vi quotidiennement, mais j'ai probablement utiliser uniquement un très petit sous-ensemble de ses fonctionnalités.
Voici d'abord un argument pour utiliser vi: vi existe sur tous les systèmes, utilise très peu de ressources et peut être utilisable sur des connexions instables et lentes, où d'autres éditeurs peuvent échouer ou être lents et inutilisables. Ou dans des situations où le système est cassé, donc les touches fléchées ne sont pas interprétées correctement (mauvais paramètres terminfo par exemple.) Ainsi, vi peut être utilisé pour corriger les fichiers de configuration menant au problème, sans être affecté par le problème.
Et voici comment apprendre un sous-ensemble utile de vi: Premièrement: arrêtez de penser à vi comme un "éditeur" interactif de GUI de terminal, et voyez-le comme un langage de programmation pour manipuler des fichiers texte. Au début, "vi" signifiait le mode visuel, et vi a un homologue non visuel ex, qui est un bon point de départ. Tapez ex à l'invite du shell (j'utiliserai ¬ pour représenter le retour):
$ ex¬
Entering Ex mode. Type "visual" to go to Normal mode.
:
Appuyez maintenant sur Entrée.
:¬
E749: empty buffer
:
Alors, mettons quelque chose dedans. Tapez "a¬", et tapez une ligne de texte, puis un point sur une ligne par lui-même:
:a¬
Hello World¬
.¬
:
C'était la commande append. Facile, court et mnémonique. Mais ce serait bien de voir ce qu'il y a dans le tampon:
:%p¬
Hello World
:
C'était la commande d'impression, p, évidemment. Le% est un raccourci de gamme de lignes. Chaque commande peut être précédée d'un numéro de ligne ou d'une plage à laquelle la commande doit s'appliquer. % signifie "toutes les lignes". $ signifie la dernière ligne et un point signifie la ligne actuelle. Un nombre signifie cette ligne particulière. Une plage est écrite n, m et un nombre peut être ajouté ou soustrait, ainsi. + 1, $ - 1 signifie de la ligne suivante à l'avant-dernière ligne. Une commande composée uniquement d'un numéro de ligne va à cette ligne. Voici le petit sous-ensemble de commandes que j'utilise:
:1i¬
this text is inserted before line 1.¬
.¬
:
:w /tmp/filename¬
"/tmp/filename" [New] 2L, 49C written
:
w écrit toutes les lignes (ou la plage choisie) dans un fichier.
:1d¬
supprime la ligne 1.
:.s/Hello/Hello,/¬
Hello, World
:.s/$/!/¬
Hello, World!
s substitue une expression régulière. C'est bon de connaître les expressions régulières!
:q¬
E37: No write since last change (add ! to override)
q se ferme. wq écrit et quitte. q! quitte sans écrire, et dans la même veine, w! force une écriture dans un fichier si possible.
Maintenant cool:
:p
Hello, World!
:.!tr a-z A-Z
:p
HELLO, WORLD!
! comme une commande filtre les lignes dans une commande shell.
Et enfin:
:vi¬
passe en mode VISUAL. Ne vous laissez pas berner. Il ressemble à un éditeur, mais ce n'est encore qu'un shell de programmation interactif. Vous obtenez juste de regarder le tampon tout le temps, et quelques autres commandes. En mode visuel a: affiche l'invite: depuis le mode ex. Les touches fléchées (si elles fonctionnent) se déplacent, et si elles ne le font pas, alors hjkl fait! h gauche, j bas, k haut et l droite. 0 passe au premier caractère et ^ (pensez à l'expression rationnelle ici!) Au premier caractère non espace sur la ligne. $ (regex again!) se déplace à la fin de la ligne. Taper: 999¬ va naturellement à la ligne 999, comme en mode ex.
"i" entre en mode d'insertion, qui insère maintenant sur les caractères au lieu des lignes, et se termine en appuyant sur échappement au lieu de ".¬". "I" insère au début, "a" après le caractère sous le curseur et "A" après la fin de la ligne courante. Appuyez toujours sur Échap lorsque vous avez terminé de taper du texte. "x" supprime le caractère sous le curseur et "D" supprime le curseur jusqu'à la fin de la ligne. "Y" tire (copie) la ligne actuelle et "P" la colle. ": pu" fait de même, mais peut être précédé d'un numéro de ligne. ": ya" est l'ex équivalent de "Y", et encore une fois, utile pour appliquer à une plage de lignes. Je pense qu'il y a aussi une commande mark, mais je dois admettre que je ne m'en souviens pas. Ça ne me manque pas.
Ce qui précède est ce que j'utilise, et je sais que je ne suis probablement pas un utilisateur vi très "efficace". D'un autre côté, j'utilise la polyvalence d'ex, par exemple pour éditer des fichiers de configuration par script. Besoin de changer votre nom d'hôte foo.bar.com en www.foobar.com dans un certain nombre de fichiers conf?
for file in conf/*
do (echo "%s/foo.bar.com/www.foobar.com/" ; echo "wq") |ex $file ; done
Ce que j'essaie de dire, c'est que je pense que le problème avec vi est que les gens le considèrent comme un éditeur difficile. Tout ce qu'il faut, c'est changer un peu votre état d'esprit et le voir comme un langage de programmation interactif très simple mais aussi très puissant à la place. Si puissant que même avec un sous-ensemble des commandes disponibles, vous pouvez l'utiliser à bon escient - pas seulement en tant qu'éditeur mais en tant qu'outil scriptable général bien intégré au reste d'Unix. Je doute que nano ferait tout cela - emacs ... peut-être.