Puoi provare il seguente comando:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
Prima inizializza la variabile c
( let c=0
), quindi esegue il comando globale g
che cerca il modello ^*
(un inizio di riga, seguito da un asterisco e uno spazio).
Ogni volta che viene trovata una riga contenente questo modello, il comando globale esegue il comando:
let c+=1 | s//\=c.'. '
incrementa la variabile c
( let c+=1
), quindi ( |
) sostituisce ( s
) il precedente modello cercato ( //
) con la valutazione di un'espressione ( \=
):
il contenuto della variabile c
concatenato ( .
) con la stringa'. '
Se non si desidera modificare tutte le righe dal buffer, ma solo un paragrafo specifico, è possibile passare un intervallo al comando globale. Ad esempio, per modificare solo le righe il cui numero è compreso tra 5 e 10:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
Se si dispone di un file contenente diversi elenchi simili che si desidera convertire, ad esempio qualcosa del genere:
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
Puoi farlo con il seguente comando:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
È solo una variante del comando precedente, che reimposta la variabile c
quando si passa a un altro elenco. Per rilevare se ci si trova in un altro elenco, la variabile d
viene utilizzata per memorizzare il numero dell'ultima riga in cui è stata effettuata una sostituzione.
Il comando globale confronta il numero di riga corrente ( line('.')
) con d+1
. Se sono uguali, significa che siamo nella stessa lista di prima così c
è incrementato ( c+1
), altrimenti significa che siamo in una lista diversa, quindi c
è reset ( 1
).
All'interno di una funzione, il comando let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
potrebbe essere riscritto in questo modo:
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
O così:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
Per salvare alcune sequenze di tasti, è possibile anche definire il comando personalizzato :NumberedLists
, che accetta un intervallo il cui valore predefinito è 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.'. '
Quando :NumberedLists
verrà eseguito <line1>
e <line2>
verrà automaticamente sostituito con l'intervallo utilizzato.
Quindi, per convertire tutti gli elenchi nel buffer, digitare: :NumberedLists
Solo gli elenchi tra le righe 10 e 20: :10,20NumberedLists
Solo la selezione visiva: :'<,'>NumberedLists
Per ulteriori informazioni, vedere:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command