<< Page Index

"Vim - un pas en avant"

Version 1.1 (2003/12/30) - passage en XHTML 1.0 Strict
Version 1.0 (2000/01/22)
Contactez l'auteur : qsdqsd.news (at) laposte.net - Tous les commentaires bienvenus ! -
Vous pouvez redistribuer librement ce document sous forme électronique, ou mieux, faire un lien vers celui-ci. Pour toute édition papier, veuillez me contacter.

Intro :

Cette page a pour but d'améliorer votre utilisation de Vim. Si vous êtes un vrai débutant je vous conseille vivement de commencer par autre chose. Ce texte n'est pas une référence et est loin d'être exhaustif. Il tente de présenter les fonctions et concepts de Vim un peu plus poussées que les bases.
Lire ce document est à mon avis loin d'être une perte de temps. J'espère que la progression dans votre maîtrise de Vim vous mènera à encore plus apprécier ce fabuleux logiciel si difficile à apprendre mais si puissant...

Note sur la syntaxe :

Ce document contient des macros écrites dans le langage macro de Vim. La notation utilisée est la "<> notation" (cf. : :help key-notation et :help <>). Vous devez écrire tel quel ces macros (vous pouvez même faire des coupier/coller).
Ainsi lorsque vous lisez par exemple "<Esc>" et que vous êtes en mode command-line (vous êtes dans la ligne de commande), il faut écrire la chaîne de caractères "<Esc>" et non pas appuyer sur la touche Echap. Par contre, en mode commande (lors que presser des touches exécute des commandes) cela correspondra à appuyer sur la touche Echap.
Aide sur les modes de Vim : :help vim-modes

Les registres :

En gros les registres sont des mémoires ou des clip-board de Vim.
Un registre est identifié par un caractère. On y fait appel en précédant la lettre d'un ".
Ex : "a, "t, "", "/, "1...

Les registres "normaux" sont ceux identifiés par une lettre (ex : "a ou "t). Vous pouvez en les utilisant mémoriser des choses pour plus tard...
Ex : "ayy va copier la ligne courante dans le registre "a.
Pour écrire ce que contient le registre "a faite : "ap (en mode commande) ou <Ctrl-R>a en mode insertion.
Rq : vous pouvez ajouter du texte à la suite du registre "s (ou autre) en l'appelant par sa lettre en majuscule : "S (au lieu de "s)...

Le plus commun des registres est en fait le registre "". C'est le registre courant ou encore unnamed register (le registre sans nom). Il est automatiquement utilisé par Vim lorsque vous faite une des commandes : y, d, c, s ou x. Le texte modifié ou copié y est stocké. Ainsi lorsque vous faite un yy puis p, vous faite en fait un ""yy puis ""p

Un autre registre intéressant : "0
"0 contient le dernier yank (copié) que vous avez fait. Il ressemble donc à "" mais a l'avantage de n'être affecté que par les yank.

D'autres registres intéressants existent! cf. : :help registers

mark :

Les marks permettent de marquer la position du curseur pour y revenir ultérieurement. Elles permettent aussi de délimiter un block de lignes sur lesquels on souhaite faire une commande.

Rq : faire un ` en clavier AZERTY est assez chiant : faites <AltGr-7> puis <Espace>. Une solution pour faciliter ça est de mapper une touche sur le caractère ` : faite un :map #5 ` par exemple. Maintenant quand vous pressez <F5> vous obtenez un `. Pour ne pas refaire ce map à chaque lancement de Vim, mettez le dans votre fichier vimrc.

Ex1 : Positionnez-vous à un endroit donné, faite ma, allez ailleurs. Pour revenir à la position que vous avez marquée faite un 'a (vous remmène sur sa ligne) ou mieux un `a (vous remmène à sa position exacte).
Ex2 : faite ma sur une ligne, mb sur une autre ligne. tapez : :'a,'bd
Ex3 : faite ma sur une ligne, mb sur une autre ligne. tapez : :'a,'bs/^/#/

Une mark particulière et intéressante est la mark '. Elle est automatiquement placée par Vim à l'emplacement où vous étiez avant votre dernier saut. Ainsi pour revenir à votre la position antérieure faite un simple ''.

Plus de précisions : :help mark

macro :

Ça c'est le top du top.
Comment faire simplement une macro ? Simplement en enregistrant ce que vous faites une fois. Vous pourrez ainsi le faire répéter autant de fois que vous le souhaiterez.

Ex : comment incrémenter de 7 les nombres d'un fichier ?

qz débute d'enregistrement dans le registre z.
/[0-9][0-9]*/ recherche du prochain nombre.
7<Ctrl-A> incrémente de 7.
q fin d'enregistrement.
@z fait applique la macro.

C'est puissant hein ! Vous pouvez même appeler des macros dans des macros et faire de la récursivité (la macro s'appelle elle-même).

Rq1 : Vous pouvez éditez votre macro qui est dans le registre.
Ex : nous voulons à présent que notre macro incremente de 2 au lieu de 7.

démerdez-vous     mettez vous sur une ligne blanche où vous allez éditer votre macro.
"zp affiche la séquence de la macro (précédemment enregistrée)
démerdez-vous     Remplacez le 7 (de la fin) par un 2 et placez vous au début de la ligne.
"zy$ restocke la macro dans le registre z

Rq2 : Vous pouvez enregistrer définitivement votre macro dans un fichier :

:w Sauvegarde le fichier courant où vous êtes.
:e mamacro.txt Ouvre un nouveau fichier (nommé mamacro.txt) où vous allez écrire votre macro.
"zp Ecrit la macro que vous avez stockée dans le registre "z
:w Sauve le fichier (et donc la macro).
:e# Revient au fichier que vous éditiez précédemment.
:so! mamacro.txt Fait exécuter la macro.

Abréviations :

:ab <abréviation> <correspondance>
A présent chaque fois que vous écrirez <abréviation> ce sera remplacé par <correspondance>.

Il existe en fait plusieurs types d'abréviations selon le(s) mode(s) où elles fonctionnent. Voici 3 commandes pour déclarer les 3 principaux types :

Ex :

  Pour tester écrire :
:ab mail_ manchot@banquise.fr mail_<espace>
:ia for for;;) {<C-CR>}<Up><Right><Right> for(
:ca aa_ 'a,'b :aa_<espace>

Plus de précisions : :help abbreviations

mapping :

Comment rendre les macros encore plus puissantes ? En les utilisant conjointement avec le mapping.
Le mapping permet d'associer une (ou une séquence de) touche(s) à une autre séquence de touches.

map <seq1> <seq2> associe les séquences
<seq1> à <seq2>
en mode command
imap <seq1> <seq2> -idem- en mode insertion.
cmap <seq1> <seq2> -idem- en mode ligne de commande.
inoremap <seq1> <seq2> -idem- en mode insertion.
Evite l'appel d'autres map éventuellement
contenus dans <seq2>
(permet notamment d'éviter les problèmes de récurcivité)
...
cf. : :help map-modes
   

Ex1 : :map ; 3x
A présent lorsque vous pressez la touche <;> en mode command, c'est comme si vous préssiez les touches <3> puis <x>

Ex2 : :imap w double-v
A présent lorsque vous pressez la touche <w> en mode insertion, c'est comme si vous faisiez la séquence de touches <d><o><u><b><l><e><-><v>

Plus sérieux et très utile, voici un map que je me suis créé :
Ex3 : :imap <F8> <Esc>diwi<<C-R>"></<C-R>"><Esc>T>i
Ecrivez maintenant table et pressez <F8> (sans sortir du mode-insert!). Cool pour faire du HTML non ?

Ex4 : :map ;l GoZ<Esc>:g/^[ <Tab>]*$/.,/[^ <Tab>]/-j<CR>Gdd
C'est un map très connu qui permet en pressant <;> puis <l> de remplacer les double-lignes vides par une seule.

Comme vous voyez le mapping est vraiment très pratique et puissant. Une chose importante à retenir est que le résultat d'un map est à son tour évalué (sauf si vous utilisez une commande de définition spécifiant le contraire tel inoremap). Un map peut ainsi appeler un autre map (et un map peut s'appeler lui-même!). Un exemple de récursivité en utilisant ce procédé est le script "vim/vimXX/macros/hanoi/hanoi.vim" qui résoud le fameux exercice récursif des tours d'Hanoi...

Plus de précisions : :help mapping