VADEMECUM VIM

Rédacteur

Ceci est la modeste contribution à la promotion de vim du Cosmotien

VIM est un éditeur puissant, dérivé de VI, avec les même fonctions de base mais des suppléments destinés à améliorer son confort et son efficacité. Vous pouvez télécharger VIM pour Windows comme pour votre UNIX préféré à partir de http://www.vim.org. Bien que disponible en ligne de commande, il existe aussi en version graphique, plus conviviale.

1.Demarrer avec vim

Vous venez d'entrer sous l'éditeur vim. Vous pouvez utiliser les touches de déplacement (flèches et pagination) pour vous déplacer dans ce texte.

La chose la plus importante à connaître et qui rend vim (vi) unique est le fait que vim (vi) est un éditeur multimode.

Les modes de vim sont:

2.Mode de saisie vi

Dans vim le mode saisie est identique à un éditeur comme notepad.

On rentre dans ce mode à partir du mode commande vi par saisie des commandes suivantes:

On saisie le texte avec les touches habituelles, on se déplace avec les flèches, les touches de pagination, on peut changer de mode "insertion" "remplacement", supprimer un caractère par Suppr et utiliser les commandes des menus pour sauver les modifications, sortir faire des recherches, sélectionner avec la souris, utiliser le copier-coller.

On peut donc considérer que vim est un sur-ensemble de notepad.

Il n'y a donc aucune raison de continuer à utiliser notepad si on dispose de vim.

On sort du mode de saisie par la touche d'échappement ESCAPE.

3.Mode ligne de commande vi

Il s'agit en fait des commandes de l'éditeur "télétype" précurseur de vi, l'éditeur "ed".Lorsque la saisie informatique à pu se visualiser sur écran plutôt que sur une télétype, "ed" a évolué pour devenir "vi" (qui est une abbréviation de "visual"). Ce qui veut dire que "vi" contient les gènes de "ed".

ed par ailleurs a donné naissance à la commande "sed" qui pourrait signifier "stream ed" par exemple. On accéde à ce mode par la saisie du caractère ":" à partir du mode commande vi.

Sous vim, il est possible de récupérer les commandes déjà saisie en naviguant avec les flèches hauts et bas. On peut même saisir le début d'une commande pour ensuite avec les flèches sélectionner seulement les commandes correspondant au préfixe saisi.


commandenoteaction
:b nn++rend courant le buffer (fichier) identifié sous le numéro "nn", pour la liste des buffers voir commande :ls
:e fichier+édite le fichier dont le chemin est saisie
:g/expr/+++global : sélectionne les lignes qui contiennent l'expression régulière "exp" et :
:g/expr/l++- liste les lignes
:g/expr/d++- détruit les lignes
:g/expr/s///++- applique sur les lignes sélectionnées la commande de substitution s
:ls+++liste les buffers déjà édité durant la session et affiche leur numéro (cf commande :b nn)
:n+next - édite le buffer suivant si plusieurs fichiers ont été demandés
:q+quitte l'éditeur :q! force la sortie sans sauvegarde
:r+rewind - revient au premier buffer demandé lors de l'ouverture de vi ou lors de la commande ":n fichier"
:s++++substitution de chaine
:w++++++enregistre le fichier en cours :w! force la réécriture en cas de warning
:x+eXit sauvegarde le buffer courant et quitte vi
:map++++crée une nouvelle commande du mode commande vi par combinaison de commande de ce mode
!++++++shell vi, permet l'interaction avec l'environnement extérieur du programme vi, offre des possibilités sans limites
/ ou :/++++recherche d'une expression régulière (les cibles sont visualisée en jaune) la commande "n" permet naviguer sur la recherche

3.1.Astuce mode ligne de commande vi

Le caractère point d'exclamation "!" indique :

3.2.Shell vi

L'utilisation du caractère "!" dans différent contexte permet de lancer des commandes systèmes.

Sur la ligne de commande vi par exemple taper ":!dir " pour ouvrir un shell et lancer la commande dir.

ou en mode commande vi , "!" suivi d'une commande de déplacement (ne serait-ce que ENTER) affiche un prompt sur lequel on peut saisir une commande système. Le buffer selectionné par le déplacement est envoyé sur l'entrée standard de la commande (stdin) et la sortie standard de la commande (stdout) est récupérée et place le résultat dans le buffer délimité par le déplacement (l'ancien buffer est perdu).

On peut ainsi lancer une requête SQL par la commande isql , transformer un texte via un script perl, écrire des programmes C pour créer de nouvelles commandes d'édition , ... Les possibilités sont sans limites.

3.3.Map

La commande :map permet de créer de nouvelle commande.


Par exemple

La commande :map ² j. crée la commande ² qui repéte la dernière commande sur la ligne suivante.

3.3.1.Analogie vim mq

Je ne puis m'empêcher ici de faire une analogie avec la mécanique quantique et l'opérateur H hamiltonien responsable de l'évolution dans le temps. Cet opérateur est la combinaison des opérateurs de création et de destruction d'états d'énergie.

Si on considère donc sous vim la commande de destruction de caractère "x" , la commande d'insertion du contenu du buffer par défaut "p" et leur combinaison "xp" dans une commande ":map s xp" on aura crée la nouvelle commande "s" qui a curieusement le même effet que l'opérateur hamiltonien: l'évolution. Mais ici la flèche du temps doit être symbolisée par une ligne de underscore et par exemple le caractère o comme une particule en mouvement: en appliquant la commande "s" sur le caractère "o" de la ligne on fait se déplacer la particule.

On peut aussi créer l'opérateur inverse par :map S xhP

 _______o______________________________________________________________________________________________

Attention

Cette macro résursive ne peut être interrompu que par CTRL-C.

Dans Vim il existe une autre manière d'enregistrer une séquence de commande. Il s'agit de la commande q qui permet d'enregistrer la séquence des commandes qui seront ensuite tapé au clavier (la saisie d'un autre "q" arrête l'enregistrement) et de la commande @ qui permet d'exécuter ces commandes.

Les commandes sont stockées dans des buffers nommé par un caractère alphanumérique qui doit être précisé en conjonction avec les commandes q et @.


Par exemple

q03dwj enregistre dans le buffer 0 la commande 3dwjbbb qui supprime 3 mots et passe à la ligne suivante en revenant de 3 mots en arrière tout en exécutant cette séquence. la commande @0 permet de répéter la séquence.

3.4.Substitution de chaine

La commande :s/chaine1/chaine2/ de susbtitution de chaine1 par chaine2 offre de très puissantes possibilités: Si l'on veut faire des changements sur le caractère / il faut utiliser \/ pour spécifier ce caractère ou bien utiliser un autre caractère délimiteur de chaine :s.chaine1.chaine2.


:s/toto/titi/remplace "toto" par "titi" sur la ligne
:s/toto/titi/gremplace tous les "toto" par "titi" sur la ligne
:1,$/toto/titi/gremplace tous les "toto" par "titi" sur le fichier entier
:.,+10/toto/titi/gremplace tous les "toto" par "titi" à partir de la ligne courante sur dix lignes
:g/tata/s/toto/titi/gremplace tous les "toto" par "titi" sur toutes les lignes qui contiennent la chaine "tata"
:'a,'bg/tata/s/toto/titi/gremplace tous les "toto" par "titi" sur toutes les lignes qui contiennent la chaine "tata" entre les lignes mémorisées par les index "a" et "b" 

3.4.1.Expression régulière: regular expression

Les expressions régulières permette de spécifier des chaines de recherche complexes.

Un bloc sert pour spécifier un jeu de caractère possible dans l'expression régulière.


Par exemple

  • [a-zA-Z] désigne un seul caractère alphabétique majuscule ou minuscule.

  • [0-9] désigne n'importe quel chiffre

  • [1-2][0-9][0-9][0-9] désigne une forme d'année de "1000" "2999"

  • toto.*titi désigne les portion de lignes qui commence par toto et finissent par titi.

  • .*toto.*titi.* désigne les lignes qui contiennent à la fois toto et titi dans cet ordre.

  • ^toto.*titi$ désigne les lignes qui commence par toto et finissent par titi.

Vim permet de réaliser des "ou" logique sur les recherches avec l'opérateur "\|" (backslash-pipe) donc "toto.*titi\|titi.*toto" permet par exemple dans une commande g//s/// de réaliser la modification uniquement sur les lignes correspondant au critère.
On n'est presque au niveau d'un requêteur en mode texte.

3.4.1.1.Sous champs

Il est possible de décomposer une ligne ou une portion de ligne en sous-champs dans une expression régulière dans la commande :s.

Exemple

chaine cible:

Belle marquise vos beaux yeux me font mourrir d'amour

forme des sous champs

\(B.*se \)\(v.*x \)\(me font \)\(mourrir \)\(.*\)

qui se dénomme \1 \2 \3 \4 \5

La commande

s/\(B.*se \)\(v.*x \)\(me font\)\(mourrir \)\(.*\)/\5 \2\4\3\1/

avec toutes les permutations des sous-champs généres les formes moins belles de proses de la première phrase:

d'amour vos beaux yeux mourrir me font Belle marquise

4.Mode commande vi

C'est ce mode qui explique la puissance de vim.
Chaque touche est une commande.

On trouve des grands types de commandes:

On peut combiner des commandes de type différent: modification*déplacement


Par exemple

  • dw supprime le mot courant

  • df; supprime le texte sur la ligne jusqu'au prochain point-virgule (find)

  • dt; supprime le texte sur la ligne jusqu'au prochain point virgule sans supprimer le point-virgule (to)

On peut créer des macro-commande par combinaison de commande de base grâce à la commande map du mode ligne de commande vi.


Remarque

On peut considérer les commandes de ce mode comme des opérateurs pouvant être combinés. Ce mécanisme de combinaison d'opérateur (peut on parler d'algèbre d'opérateur ?) est très puissant.

Les opérateurs peuvent être associés à des cardinalités qui indique combien de fois on doit répéter la commande.


Par exemple

5dw supprime les cinq prochains mots.

Les macro-commandes peuvent être elle-même combinées et même récursivement (l'arrêt de la récursion doit être prévu: déclanché par l'impossibilité de réaliser une commande)

Un nouveau mode disponible uniquement sous vim est la sélection de texte avec "v"

4.1.Commande de déplacement vi

Les commandes de déplacement, cf type "d" dans la liste vimaz peuvent être combinées avec d'autres commandes de modification pour constituer une nouvelle commande de modification.

Le clavier de déplacement avec les flèches est bien sur opérant et fonctionne en conjonction avec les altération SHIFT, CTRL.

4.2.Commande de modification vi

Les commandes de modification, cf type "m" dans la liste vimaz

4.3.Commande de recherche vi

Les commandes de recherche, cf type "r" dans la liste vimaz

4.4.Commande de gestion de buffer vi

Les commandes de buffer, cf type "g" dans la liste vimaz

4.5.Vimaz:Vim de A à Z

L'alphabet de vim. Lorque l'on est en mode commande vi chaque lettre est une commande :


colonnedescription
Lettrela lettre de la commande. Ce peut être une lettre seule, doublée , suivi d'une autre lettre, suivi encore du type d'une commande
Lettre doublée mentionnée par ² qui lui n'est pas utilisé par vim
Lettre suivi d'une autre lettre quelconque ce dernier cas est signalé par la présence d'un "underscore" par exemple f_
Suivi encore du type d'une commande "d" pour déplacement par exemple, dans ce cas toutes commandes de déplacement est opérante
Type cmdtype de commande : d Déplacement, m Modification, r Recherche, g gestion de buffer
Noteutilité ou puissance de la commande mentionné par une série de plus ... ou de moins
Mnemoorigine de l'utilisation de la lettre pour la commande, moyen mnénotechnique, en anglais forcément

lettretype cmdmnemonoteaction
Caractère non alphabétique vi
.m+++répète la dernière commande de modification
~m+inverse majuscule-minuscule. A utiliser avec "g" : g~d
^d+va au début de la ligne
$d+va à la fin de la ligne
*r+++vim recherche le mot sous le curseur : toutes les cibles sont colorées en jaune . Voir ici g*
'_ d+++"cote" suivi d'une lettre déplace le curseur à la ligne mémorisé par cette lettre voir m_
"_ydg+++"double cote" suivi d'une lettre, suivi de "y"(Yank) suivi d'une commande de déplacement mémorise dans un buffer nommé par cette lettre le texte concerné par le déplacement  
"ayfog+++exemple: "afo mémorise dans le buffer "a" à partir du caractère courant jusqu'au prochain "o" présent sur la ligne courante
"byyg"byy mémorise la ligne courante dans le buffer b
"by'bg"b'b mémorise dans le buffer b depuis la ligne courante jusqu'à la ligne mémorisé par l'index b
Caractère alphabétique vi
amappend+ajoute du texte aprés le caractère courant bascule en mode de saisie vi  
AmdAppend+ajoute du texte en fin de ligne bascule en mode de saisie vi  
bdback+déplace le curseur d'un mot en arrière, si majuscule les mots sont juste séparé par des blancs et des espaces  
BdBack+idem "b" si majuscule les mots définis par ce qui est séparé par des blancs et des espaces  
c_mchange-"c" suivi d'une commande de déplacement vi change le texte depuis le caractère courant jusqu'a la fin du déplacement  
CmChange-change le texte depuis le caractère courant jusqu'à la fin de la ligne
ddmdelete++"d" suivi d'une commande de déplacement vi supprime le texte depuis le caractère courant jusqu'a la fin du déplacement  
mdelete+"d" doublé supprime la ligne courante
Dmdelete+supprime le texte depuis le caractère courant jusqu'à la fin de la ligne
edend+déplace le curseur à la fin du mot courant
EdEnd+déplace le curseur à la fin du "mot large" courant
f_rfind++"f" suivi d'un caractère déplace le curseur sur la ligne jusqu'au caractère s'il existe
F_rfind++"F" identique à "f" mais se déplace vers le début de la ligne
dgo+déplace le curseur au début du fichier
Gdgo+déplace le curseur à la fin du fichier
g*rglobal+++(vim) identique à "*" mais ce n'est pas le mot mais la chaine qui est recherchée (si elle apparait dans un mot)
g~dmglobalinverse les majuscules minuscules jusqu'au déplacement
gfdgo file+++++édite le fichier dont le chemin se trouve sous le curseur
iminsert+insère les caractères tapé ultérieurement avant le caractère courant bascule en mode de saisie vi
ImdInsert+insère les caractères tapé ultérieurement au début de la ligne bascule en mode de saisie vi
Jmjoin++concaténe la ligne courante avec la suivante (fusion de deux lignes) un blanc est inséré entre les deux lignes
hd+flèche gauche, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement
jd+flèche haut, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement
kd+flèche bas, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement
ld+flèche droite, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement
m_dmemorise+++"m" suivi d'une lettre mémorise la ligne suivante avec cette lettre pour index, le rappel se fait avec le caractère "cote": '
omopen++ouvre ou insère une ligne aprés la ligne courante
OmOpen++ouvre ou insère une ligne AVANT la ligne courante
pmput+++insère le contenu du buffer courant
r_mreplace+remplace le caractère courant bascule reste en mode commande vi
RmReplace+remplace le texte à partir de la position courante bascule en mode de saisie vi
smsubsitute+remplace le texte à partir de la position courante bascule en mode de saisie vi
SmSubsitute-substitue la ligne courante par les caractères tapés ultérieurement bascule en mode de saisie vi
t_rto++"t" suivi d'un caractère déplace le curseur sur la ligne immédiatement avant le caractère si il existe
T_rTo++"T" identique à "t" mais se déplace vers le début de la ligne (utilité par combinaison avec commande double-cote
umundo+++"undo" annulle la dernière modification. undo permet d'annuler toutes les modifications depuis le dernier changement de fichier édité. "redo" ctrl-r est l'inverse d'undo
vg(vim) rentre en mode sélection de texte (vision linéraire du texte) ctrl-v en mode sélection de bloc rectangulaire (vision surfacique du texte)
wdend+déplace le curseur à la fin du mot courant
WdEnd+déplace le curseur à la fin du "mot large" courant
xm++supprime la lettre
ydgyank+++"y" suivi d'une commande de déplacement vi mémorise dans le buffer par défaut le texte concerné par le déplacement, utilisé en conjonction avec les buffer nommé cf "_
+++"z." ou "zz" centre la fenêtre sur la ligne courante
zENTER+++positionne la ligne courante en haut de la fenêtre
z-+++positionne la ligne courante en bas de la fenêtre
Commandes utilisant la touche CTRL
CTRL-R"redo" inverse de "u" "undo"
CTRL-Aincrémente le nombre sous le curseur
CTRL-Xdécrémente le nombre sous le curseur

4.6.Mot large

Un mot défini par ce qui est séparé par des blancs et des espaces uniquement.

exemple: "depuis,lundi-matin" est un seul "mot large"

4.7.Majuscule

Dans vi l'altération d'une touche par shift (majuscule) altére la commande correspondant à la minuscule. L'altération peut être de plusieurs type mais la commande résultante est voisine de l'initiale.

altération possible:


Valid HTML 4.0 Transitional