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 g
qui 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 c
concaté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 c
lorsque vous passez à une autre liste. Pour détecter si vous êtes dans une autre liste, la variable d
est 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 c
est incrémenté ( c+1
), sinon cela signifie que nous sommes dans une liste différente, donc c
est 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 :NumberedLists
sera 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