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.
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:
le mode commande vi: c'est le mode par défaut de vim, dans ce mode les touches du clavier ne servent pas à la saisie de caractères mais sont autant de commandes. Ces commandes sont, cela parait étonnant à priori trés ergonomiques, cf vimaz En effet elles sont facilement mémorisable pour peu que l'on cherche le mot anglais à l'origine du choix de la lettre. Si on compare l'ergonomie de WORD, lié aux touches de fonctions avec la combinaison des touches de contrôle SHIFT,CTRL,ALT, on voit tout de suite qu'il sera trés difficile de devenir un utilisateur de WORD chevronné alors que devenir un utilisateur de vim chevronné demande peut-être un effort d'adaptation au départ mais devient ensuite assez facile, car il y a un ordre sous-jacent dans la nomenclature des commandes.
le mode ligne de commande vi: si on tape le caractère ":" on va sur la ligne de commande de vim où l'on peut taper des commandes. Pour sortir de ce mode on peut le faire soit par ENTER ce qui permet de valider la commande saisie, soit par ESCAPE qui fait sortir du mode commande sans rien exécuter.
le mode de saisie vi: c'est le mode qui permet de saisir le texte. Ce mode est
présent dans tout les éditeurs. Pour rentrer dans ce mode, il faut saisir
une commande commande de modification vi qui permet de faire de la saisie
par exemple en tapant la touche "i" on rentre en insertion.
la saisie de ESCAPE permet de sortir de ce mode pour revenir au mode de
base le mode commande 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:
"a" pour ajouter du texte (ajoute aprés le caractère courant)
"i" pour insertion de texte (insére juste avant le caractère courant)
"R" pour remplacement de texte (remplace le texte à partir du caractère courant)
"o" pour ouvrir une nouvelle ligne ( "O" pour l'ouvrir au dessus de la courante)
"s" pour subsitute (équivalent à "R").
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.
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.
| commande | note | action |
|---|---|---|
| :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 |
Le caractère point d'exclamation "!" indique :
soit une emphase sur la commande (on force la commande sans tenir compte de warning associé)
soit l'interaction avec l'extérieur: shell , cette dernière possibilité fait de vi un éditeur ouvert voir 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.
La commande :map permet de créer de nouvelle commande.
La commande :map ² j. crée la commande ² qui repéte la dernière commande sur la ligne suivante.
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______________________________________________________________________________________________
Une trajectoire peut être définie par
:map #s ssssssssssssssssssssssssssssssssssssssssssssssssssssssssSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Une trajectoire cyclique (oscillation) par la macro récursive :map #S #s#S.
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 @.
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.
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/g | remplace tous les "toto" par "titi" sur la ligne |
| :1,$/toto/titi/g | remplace tous les "toto" par "titi" sur le fichier entier |
| :.,+10/toto/titi/g | remplace tous les "toto" par "titi" à partir de la ligne courante sur dix lignes |
| :g/tata/s/toto/titi/g | remplace tous les "toto" par "titi" sur toutes les lignes qui contiennent la chaine "tata" |
| :'a,'bg/tata/s/toto/titi/g | remplace 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" |
Les expressions régulières permette de spécifier des chaines de recherche complexes.
Le caractère . sert pour spécifier n'importe quel caractère.
Le caractère * sert pour spécifier n'importe quel suite de caractères.
Le caractère ^ sert pour spécifier le début de la ligne
Le caractère $ sert pour spécifier la fin de la ligne
Un bloc sert pour spécifier un jeu de caractère possible dans l'expression régulière.
[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.
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.
Les sous-champs se définissent dans la chaine cible par des parenthèses "backslashés" : \(..\)\(...\)
Les sous-champs peuvent ensuite être utilisés dans la chaine de remplacement par \1 \2 \3 etc.
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
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
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.
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.
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"
on sort de ce mode par "escape" ce qui à pour effet de mémoriser dans le buffer par défaut le texte sélectionné (configuration VT seulement)
Si on est configuration WINDOWS utiliser la souris et les raccourcis copier-coller habituel.
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.
Les commandes de modification, cf type "m" dans la liste vimaz
Les commandes de recherche, cf type "r" dans la liste vimaz
Les commandes de buffer, cf type "g" dans la liste vimaz
L'alphabet de vim. Lorque l'on est en mode commande vi chaque lettre est une commande :
| colonne | description |
|---|---|
| Lettre | la 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 cmd | type de commande : d Déplacement, m Modification, r Recherche, g gestion de buffer |
| Note | utilité ou puissance de la commande mentionné par une série de plus ... ou de moins |
| Mnemo | origine de l'utilisation de la lettre pour la commande, moyen mnénotechnique, en anglais forcément |
| lettre | type cmd | mnemo | note | action |
|---|---|---|---|---|
| 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_ | |
| "_yd | g | +++ | "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 | |
| "ayfo | g | +++ | exemple: "afo mémorise dans le buffer "a" à partir du caractère courant jusqu'au prochain "o" présent sur la ligne courante | |
| "byy | g | "byy mémorise la ligne courante dans le buffer b | ||
| "by'b | g | "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 | ||||
| a | m | append | + | ajoute du texte aprés le caractère courant bascule en mode de saisie vi |
| A | md | Append | + | ajoute du texte en fin de ligne bascule en mode de saisie vi |
| b | d | back | + | déplace le curseur d'un mot en arrière, si majuscule les mots sont juste séparé par des blancs et des espaces |
| B | d | Back | + | idem "b" si majuscule les mots définis par ce qui est séparé par des blancs et des espaces |
| c_ | m | change | - | "c" suivi d'une commande de déplacement vi change le texte depuis le caractère courant jusqu'a la fin du déplacement |
| C | m | Change | - | change le texte depuis le caractère courant jusqu'à la fin de la ligne |
| dd | m | delete | ++ | "d" suivi d'une commande de déplacement vi supprime le texte depuis le caractère courant jusqu'a la fin du déplacement |
| d² | m | delete | + | "d" doublé supprime la ligne courante |
| D | m | delete | + | supprime le texte depuis le caractère courant jusqu'à la fin de la ligne |
| e | d | end | + | déplace le curseur à la fin du mot courant |
| E | d | End | + | déplace le curseur à la fin du "mot large" courant |
| f_ | r | find | ++ | "f" suivi d'un caractère déplace le curseur sur la ligne jusqu'au caractère s'il existe |
| F_ | r | find | ++ | "F" identique à "f" mais se déplace vers le début de la ligne |
| g² | d | go | + | déplace le curseur au début du fichier |
| G | d | go | + | déplace le curseur à la fin du fichier |
| g* | r | global | +++ | (vim) identique à "*" mais ce n'est pas le mot mais la chaine qui est recherchée (si elle apparait dans un mot) |
| g~d | m | global | inverse les majuscules minuscules jusqu'au déplacement | |
| gf | d | go file | +++++ | édite le fichier dont le chemin se trouve sous le curseur |
| i | m | insert | + | insère les caractères tapé ultérieurement avant le caractère courant bascule en mode de saisie vi |
| I | md | Insert | + | insère les caractères tapé ultérieurement au début de la ligne bascule en mode de saisie vi |
| J | m | join | ++ | concaténe la ligne courante avec la suivante (fusion de deux lignes) un blanc est inséré entre les deux lignes |
| h | d | + | flèche gauche, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement | |
| j | d | + | flèche haut, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement | |
| k | d | + | flèche bas, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement | |
| l | d | + | flèche droite, clavier déplacement (à utiliser dans les macro au lieu des flèches) origine clavier sans pavé de déplacement | |
| m_ | d | memorise | +++ | "m" suivi d'une lettre mémorise la ligne suivante avec cette lettre pour index, le rappel se fait avec le caractère "cote": ' |
| o | m | open | ++ | ouvre ou insère une ligne aprés la ligne courante |
| O | m | Open | ++ | ouvre ou insère une ligne AVANT la ligne courante |
| p | m | put | +++ | insère le contenu du buffer courant |
| r_ | m | replace | + | remplace le caractère courant bascule reste en mode commande vi |
| R | m | Replace | + | remplace le texte à partir de la position courante bascule en mode de saisie vi |
| s | m | subsitute | + | remplace le texte à partir de la position courante bascule en mode de saisie vi |
| S | m | Subsitute | - | substitue la ligne courante par les caractères tapés ultérieurement bascule en mode de saisie vi |
| t_ | r | to | ++ | "t" suivi d'un caractère déplace le curseur sur la ligne immédiatement avant le caractère si il existe |
| T_ | r | To | ++ | "T" identique à "t" mais se déplace vers le début de la ligne (utilité par combinaison avec commande double-cote |
| u | m | undo | +++ | "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 |
| v | g | (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) | ||
| w | d | end | + | déplace le curseur à la fin du mot courant |
| W | d | End | + | déplace le curseur à la fin du "mot large" courant |
| x | m | ++ | supprime la lettre | |
| yd | g | yank | +++ | "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² | +++ | "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-A | incrémente le nombre sous le curseur | |||
| CTRL-X | décrémente le nombre sous le curseur | |||
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"
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:
changement de sens
action réalisée en fin ou début de ligne