Stellen Sie sich vor, ich hätte folgenden Text:
some random stuff
* asdf
* foo
* bar
some other random stuff
Ich möchte die Sternchen-Aufzählungszeichen wie folgt durch Zahlen ersetzen:
some random stuff
1. asdf
2. foo
3. bar
some other random stuff
Wie kann das in vim gemacht werden?
substitute
filetype-markdown
range
markup
counting
Brennan Vincent
quelle
quelle
1.
?:%s/^* /1. /
Würde es also tun. Das scheint viel weniger Arbeit zu sein.Antworten:
Sie können den folgenden Befehl versuchen:
Zuerst initialisiert es die Variable
c
(let c=0
), dann führt es den globalen Befehlg
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:
Wenn Sie eine Datei mit mehreren ähnlichen Listen haben, die Sie konvertieren möchten, zum Beispiel:
Sie können dies mit dem folgenden Befehl tun:
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 Variablend
die Nummer der letzten Zeile gespeichert, in der eine Ersetzung vorgenommen wurde.Der globale Befehl vergleicht die aktuelle Zeilennummer (
line('.')
) mitd+1
. Wenn sie identisch sind, bedeutet dies, dass wir uns in derselben Liste wie zuvor befinden, undc
wird inkrementiert (c+1
). Andernfalls bedeutet dies, dass wir uns in einer anderen Liste befinden undc
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:Oder so:
Um einige Tastenanschläge zu speichern, können Sie auch den benutzerdefinierten Befehl definieren
:NumberedLists
, der einen Bereich akzeptiert, dessen Standardwert1,$
(-range=%
) ist: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:
quelle
Dies funktioniert nur mit einer neueren Vim-Version (die hat
:h v_g_CTRL-A
):*
) und ersetzen Sie sie mit0
(Cursor auf erste ist*
):Ctrl-v
j
j
r
0
.gv
g
Ctrl-a
... und das ist es :)
(Wenn Sie einen Punkt nach jeder Nummer haben wollen, ändern 1. Schritt:
Ctrl-v
j
j
s
0
.
Esc
)quelle
Wählen Sie die Zeilen visuell aus und führen Sie den folgenden Ersetzungsbefehl aus:
Siehe
:help sub-replace-expression
,:help line()
und:help '<
.Um die Zeilen nicht auswählen zu müssen, können Rückwärts- und Vorwärtssuchen mit Offsets verwendet werden, um den Substitutionsbereich wie folgt festzulegen:
Sehen
:help cmdline-ranges
quelle
Ein anderer Weg:
quelle
Sie können auch benutzerdefinierte Operatoren definieren
Sie können sie den Tastenfolgen
'*
und zuordnen'#
. Die Markierungen*
und#
sind nicht vorhanden, sodass Sie keine Standardfunktionalität überschreiben. Der Grund für die Wahl'
als Präfix ist, eine Art Mnemonik zu erhalten. Sie fügen ein Zeichen vor einigen Zeilen ein. Und normalerweise verwenden Sie das Präfix, um zu einer Marke zu gelangen'
.Es funktioniert auch im visuellen Modus.
Ex-Befehle eignen sich gut für Skripte, aber für eine interaktive Verwendung ist ein normaler Operator wahrscheinlich besser, da Sie ihn mit jeder Bewegung oder jedem Textobjekt kombinieren können.
Sie können beispielsweise eine Liste mit Sternchen oder Minuszeichen innerhalb des aktuellen Absatzes umschalten, indem Sie auf tippen
'*ip
. Hier'*
ist ein Operator undip
ist das Textobjekt, an dem es arbeitet.Machen Sie dasselbe für eine Liste, der in den nächsten 10 Zeilen Zahlen vorangestellt sind, indem Sie auf drücken
'#10j
. Hierbei'#
handelt es sich um einen anderen Operator und10j
um eine Bewegung, die die Linien abdeckt, auf denen der Operator arbeitet.Der andere Vorteil der Verwendung eines benutzerdefinierten Operators besteht darin, dass Sie Ihre letzte Ausgabe mit dem Befehl dot wiederholen können.
quelle