Sie können den folgenden Befehl versuchen:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
Zuerst initialisiert es die Variable c
( let c=0
), dann führt es den globalen Befehl g
aus, der nach dem Muster sucht ^*
(ein Zeilenanfang, gefolgt von einem Sternchen und einem Leerzeichen).
Immer wenn eine Zeile mit diesem Muster gefunden wird, führt der globale Befehl den Befehl aus:
let c+=1 | s//\=c.'. '
Er erhöht die Variable c
( let c+=1
) und |
ersetzt ( s
) das zuvor gesuchte Muster ( //
) durch die Auswertung eines Ausdrucks ( \=
):
den Inhalt der c
verketteten Variablen ( .
) mit der Zeichenfolge'. '
Wenn Sie nicht alle Zeilen aus Ihrem Puffer ändern möchten, sondern nur einen bestimmten Absatz, können Sie einen Bereich an den globalen Befehl übergeben. So ändern Sie beispielsweise nur die Zeilen, deren Nummer zwischen 5 und 10 liegt:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
Wenn Sie eine Datei mit mehreren ähnlichen Listen haben, die Sie konvertieren möchten, zum Beispiel:
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
Sie können dies mit dem folgenden Befehl tun:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
Es ist nur eine Variante des vorherigen Befehls, der die Variable zurücksetzt, c
wenn Sie zu einer anderen Liste wechseln. Um festzustellen, ob Sie sich in einer anderen Liste befinden, wird in der Variablen d
die Nummer der letzten Zeile gespeichert, in der eine Ersetzung vorgenommen wurde.
Der globale Befehl vergleicht die aktuelle Zeilennummer ( line('.')
) mit d+1
. Wenn sie identisch sind, bedeutet dies, dass wir uns in derselben Liste wie zuvor befinden, und c
wird inkrementiert ( c+1
). Andernfalls bedeutet dies, dass wir uns in einer anderen Liste befinden und c
zurückgesetzt ( 1
) werden.
Innerhalb einer Funktion let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
könnte der Befehl folgendermaßen umgeschrieben werden:
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
Oder so:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
Um einige Tastenanschläge zu speichern, können Sie auch den benutzerdefinierten Befehl definieren :NumberedLists
, der einen Bereich akzeptiert, dessen Standardwert 1,$
( -range=%
) ist:
command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
Wann :NumberedLists
wird ausgeführt <line1>
und <line2>
wird automatisch durch den von Ihnen verwendeten Bereich ersetzt.
Um alle Listen im Puffer zu konvertieren, geben Sie Folgendes ein: :NumberedLists
Nur die Listen zwischen Zeile 10 und 20: :10,20NumberedLists
Nur die visuelle Auswahl: :'<,'>NumberedLists
Weitere Informationen finden Sie unter:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command