In vim habe ich manchmal Gelegenheit, die ersten paar Vorkommen eines Matches in einer Zeile zu ersetzen, aber nicht jeder g
möchte. z.B:
a a a a a
zu
b b b a a
Ich weiß, dass ich es gebrauchen könnte :s/a/b/[enter]:[up][enter]:[up][enter]
, aber das ist bei drei Wiederholungen langweilig genug. Ich habe Zeilen mit möglicherweise mehr als 10 Substitutionen.
Ich habe es versucht:
:s/a/b/3g
: vim beschwerte sich über nachgestellte Zeichen.:s/a/b/3
: Ändert das erste Vorkommen in dieser und den folgenden beiden Zeilen.3:s/a/b
: das gleiche wie vorher.:s/a/b/g3
: Ändert alle Vorkommen in dieser und den nächsten beiden Zeilen.:3s/a/b
: Ändert das erste Vorkommen in Zeile 3.:/a/,3/a/s/a/b
: Ändert das erste Vorkommen in jeder Zeile zwischen der nächstena
und der dritten Zeilea
in der Datei (Aufforderung zum Umkehren, falls erforderlich).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: Ändert das erste Vorkommen in jeder Zeile zwischen dieser und der nächsten mit 3a
Sekunden (und dies wäre für eine Suche mit mehreren Zeichen nicht einfach erweiterbar gewesen).
Und verschiedene andere Adressierungsmuster, von denen keines funktionierte. Ich muss sagen, ich habe ziemlich viel über das gelernt:s
Befehl , eine Antwort auf dieses Problem zu finden, aber ich habe es immer noch nicht gelöst.
Weiß jemand, wie man das macht?
(Bonuspunkte für einen bestimmten Bereich, z. B. zweites bis viertes Vorkommen)
n
und.
obwohl ich nicht daran gedacht habe, sie hier zu verwenden. Sicher eine Verbesserung, danke.s/a/=something/
sollte den Trick machen (:help sub-replace-=
). Ich spreche Vim nicht fließend genug, um sofort zu schreibensomething
.:[up][enter]
Kann durch ersetzt werden&
, was immer noch nicht ideal ist, aber zumindest weniger schmerzhaft ist.Antworten:
Aufbauend auf der
:s/pattern/replacement/gc
Idee von Samus_ (dies scheint der einfachste Weg zu sein, um eine korrekte Operation sicherzustellen, wenn das Muster in der Ersetzungszeichenfolge enthalten ist), um das 2. bis 4. Vorkommen in einer einzelnen Zeile zu ersetzen:feedkeys()
ist eine Funktion, die die Eingabezeichenfolge in die Tastatureingabewarteschlange einfügt. Der Punkt ist, das Zählen im Voraus durchzuführen, damit Sie sich keine Sorgen machen müssen, dass Sie die Zählung verlieren oder unterbrochen werden.Für einen allgemeineren Fall, um die Vorkommen Mth bis Nth in einer einzelnen Zeile für N zu ersetzen, das größer oder gleich einem sehr großen M ist :
Ersetzen Sie M und N durch die gewünschten Werte (Sie können sogar
vim
die triviale mentale Arithmetik ausführen lassen, wenn Sie dies nicht selbst tun möchten). Beachten Sie, dass.
dies der String-Verkettungsoperator von VimL ist. Offensichtlich ist dies spart nur Tastenanschläge für großen M . Wenn Sie diese Funktion häufig verwenden, sparen Sie möglicherweise Zeit, um die oben genannten Funktionen in einen benutzerdefinierten Befehl oder eine benutzerdefinierte Funktion einzufügen, da die Eingabe ziemlich umfangreich ist.quelle
Für die erste Frage würde ich tun:
Das zweite ist schwieriger, ich weiß nicht, wie ich es automatisch machen kann, aber Sie können vim dazu bringen, Sie bei jedem Spiel wie folgt aufzufordern:
Dann antworten Sie auf die ersten n Übereinstimmungen mit "Nein" und auf die anderen mit "Ja".
quelle
c
, das könnte die bisher beste vorgeschlagene Lösung sein. Ich müsste immer noch zählen, aber ich denke, es ist die erste Option, die mit Ersetzungen funktioniert, die die Suchzeichenfolge enthalten.quelle
Ich denke, das könnte funktionieren, zuerst ersetzen, dann 2 Mal wiederholen:
quelle