Vous pouvez essayer la commande suivante:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
D'abord, il initialise la variable c( let c=0), puis il exécute la commande globale gqui recherche le modèle ^*(un début de ligne, suivi d'un astérisque et d'un espace).
Chaque fois qu'une ligne contenant ce motif est trouvée, la commande globale exécute la commande:
let c+=1 | s//\=c.'. '
Elle incrémente la variable c( let c+=1), puis ( |) elle substitue ( s) le motif recherché précédent ( //) avec l'évaluation d'une expression ( \=):
le contenu de la variable cconcaténée ( .) avec la chaîne'. '
Si vous ne souhaitez pas modifier toutes les lignes de votre tampon, mais uniquement un paragraphe spécifique, vous pouvez passer une plage à la commande globale. Par exemple, pour modifier uniquement les lignes dont le nombre est compris entre 5 et 10:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
Si vous avez un fichier contenant plusieurs listes similaires que vous souhaitez convertir, par exemple quelque chose comme ceci:
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
some other random stuff some other random stuff
==>
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
* qux 4. qux
some other random stuff some other random stuff
Vous pouvez le faire avec la commande suivante:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
C'est juste une variante de la commande précédente, qui réinitialise la variable clorsque vous passez à une autre liste. Pour détecter si vous êtes dans une autre liste, la variable dest utilisée pour stocker le numéro de la dernière ligne où une substitution a été effectuée.
La commande globale compare le numéro de ligne actuel ( line('.')) avec d+1. S'ils sont identiques, cela signifie que nous sommes dans la même liste qu'avant, donc cest incrémenté ( c+1), sinon cela signifie que nous sommes dans une liste différente, donc cest réinitialisé ( 1).
À l'intérieur d'une fonction, la commande let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]pourrait être réécrite comme ceci:
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
Ou comme ça:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
Pour enregistrer certaines séquences de touches, vous pouvez également définir la commande personnalisée :NumberedLists, qui accepte une plage dont la valeur par défaut est 1,$( -range=%):
command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
Quand :NumberedListssera exécuté <line1>et <line2>sera automatiquement remplacé par la plage que vous avez utilisée.
Donc, pour convertir toutes les listes dans le tampon, vous devez taper: :NumberedLists
Seules les listes entre la ligne 10 et 20: :10,20NumberedLists
Seule la sélection visuelle: :'<,'>NumberedLists
Pour plus d'informations, voir:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command