Puedes probar el siguiente comando:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
Primero inicializa la variable c
( let c=0
), luego ejecuta el comando global g
que busca el patrón ^*
(un comienzo de línea, seguido de un asterisco y un espacio).
Cada vez que se encuentra una línea que contiene este patrón, el comando global ejecuta el comando:
let c+=1 | s//\=c.'. '
incrementa la variable c
( let c+=1
), luego ( |
) sustituye ( s
) el patrón buscado anterior ( //
) con la evaluación de una expresión ( \=
):
el contenido de la variable c
concatenada ( .
) con la cadena'. '
Si no desea modificar todas las líneas de su búfer, pero solo un párrafo específico, puede pasar un rango al comando global. Por ejemplo, para modificar solo las líneas cuyo número está entre 5 y 10:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
Si tiene un archivo que contiene varias listas similares que desea convertir, por ejemplo, algo como esto:
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
Puedes hacerlo con el siguiente comando:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
Es solo una variante del comando anterior, que restablece la variable c
cuando cambia a otra lista. Para detectar si está en otra lista, la variable d
se utiliza para almacenar el número de la última línea donde se realizó una sustitución.
El comando global compara el número de línea actual ( line('.')
) con d+1
. Si son iguales, significa que estamos en la misma lista que antes, por lo que c
se incrementa ( c+1
), de lo contrario significa que estamos en una lista diferente, por lo que c
se restablece ( 1
).
Dentro de una función, el comando let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
podría reescribirse así:
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
O así:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
Para guardar algunas pulsaciones de teclas, también puede definir el comando personalizado :NumberedLists
, que acepta un rango cuyo valor predeterminado es 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.'. '
Cuándo :NumberedLists
se ejecutará <line1>
y <line2>
se reemplazará automáticamente con el rango que utilizó.
Entonces, para convertir todas las listas en el búfer, escribiría: :NumberedLists
Solo las listas entre las líneas 10 y 20: :10,20NumberedLists
Solo la selección visual: :'<,'>NumberedLists
Para más información, ver:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command