Faire des calculs avec le registre d'expression
Vous pouvez effectuer des calculs en mode normal et en mode insertion.
Mode normal
En mode normal, si vous tapez, @=
votre curseur se déplacera vers la ligne de commande, où vous pourrez saisir n'importe quelle expression. Lorsque vous appuyez sur Entrée, le résultat de l'expression sera exécuté en tant que commandes en mode normal.
Par exemple, supposons que vous souhaitiez accéder à la colonne du milieu de la ligne actuelle. L'appel de fonction col('$')
renvoie le nombre de colonnes de la ligne, afin que nous puissions accomplir quoi en tapant ce qui suit:
@=col('$')/2<CR>|
Lorsque vous appuyez sur entrée, le curseur revient dans le tampon et vim attend un opérateur (comme |
) comme si vous veniez de saisir un nombre. Alternativement, vous auriez pu saisir ceci:
@=col('$')/2.'|'
... mais bien sûr, c'est plus d'octets.
Mode d'insertion
Vous pouvez également utiliser le registre d'expression en mode insertion en appuyant sur <Ctrl-r>=
au lieu de @=
. Cela fonctionne de la même manière en mode normal, sauf que le résultat de l'expression que vous entrez sera exécuté en mode insertion. Par exemple, si vous avez tapé <Ctrl-r>=col('$')<CR>
, le nombre de colonnes de la ligne actuelle serait inséré au niveau du curseur comme si vous l'aviez tapé.
Pour plus d'informations sur le registre d'expression, tapez :help "=
.
Réutiliser des expressions
La dernière expression utilisée est stockée dans le registre d'expression, "=
. Taper @=<CR>
en mode normal ou <Ctrl-r>=<CR>
en mode insertion évaluera à nouveau l'expression, vous permettant de les utiliser un peu comme des macros.
Faire des calculs par substitution
Vous pouvez également évaluer des expressions lorsque vous effectuez des substitutions d'expressions régulières. Tout ce que vous avez à faire est de commencer votre substitution par \=
. Par exemple, supposons que vous vouliez numéroter les lignes de ce fichier:
foo
bar
baz
L'appel de fonction line('.')
renvoie le numéro de ligne actuel, donc le travail est facile. Entrer ceci:
:s/^/\=line('.').' '/g<CR>
... donne le résultat souhaité:
1 foo
2 bar
3 baz
Pour utiliser des groupes capturés dans une telle expression, vous pouvez utiliser la submatch()
fonction, où par exemple submatch(0)
est équivalent à \0
dans une substitution ordinaire, submatch(1)
est équivalent à \1
, etc. Cela mange beaucoup de frappes, malheureusement.
Pour plus d'informations sur la substitution d'expression, tapez :help sub-replace-expression
.