Comment puis-je utiliser des nombres consécutifs dans une commande de substitution de style Ex?

8

Par exemple, disons que je veux mettre un nombre avant chaque ligne qui commence par le mot "Do". La commande ressemblerait à quelque chose :%s/^(Do )/1. \1/, mais que puis-je faire pour qu'elle applique les numéros consécutivement au lieu du même numéro à chaque fois?

Notez que je suis bien conscient des nombreuses façons de le faire en utilisant des macros et Ctrl-A, mais pour une utilisation dans des commandes en mode Ex plus compliquées, je voudrais connaître la réponse à la question de titre exactement.

Pour un autre exemple où une approche macro ne serait pas si facile, disons que je veux ajouter un nombre à toutes les instances du mot "Section", et les faire numéroter consécutivement mais en redémarrant le décompte après chaque ligne qui commence "Chapitre". Une commande en mode Ex qui peut presque faire cela, sauf pour incrémenter réellement le nombre à ajouter, est:

:g/^Chapter/;/^Chapter/-s/Section\zs/ 1/g

Vous pouvez voir qu'une méthode simple pour incrémenter des nombres dans la commande de substitution en mode Ex pourrait être très utile.

Caractère générique
la source

Réponses:

8

Cette commande fait ce que vous voulez:

:let i = 1|g/^Do/s/^/\=i/|let i = i + 1

Explication…

  • let i = 1initialise le compteur i,
  • g/^Do/s/^/\=i/ajoute ià chaque ligne commençant par Do,
  • let i = i + 1incréments i.

L'astuce est que l'incrémentation a lieu avant la prochaine substitution.

--- Éditer ---

Si nous utilisions une seule substitution, le compteur ne serait incrémenté qu'une seule fois, une fois tout terminé.

Puisque nous effectuons plusieurs substitutions - une pour chaque ligne correspondante - au lieu d'une seule, le compteur est correctement incrémenté avant la prochaine substitution.

romainl
la source
Comment mettre un point après le chiffre? \=i. est une expression non valide.
David Conrad
2
@DavidConrad, .devient un opérateur concaténé dans l' \=expression. Ainsi s//\=i . '. '/sera ajouté '. ' Check out :help expression-syntax.
Wildcard
l'incrémentation se produit après la substitution
Christian Brabandt
@ChristianBrabandt, oups j'ai accidentellement un mot.
romainl