Wie wiederhole ich eine Bearbeitung in Vim in mehreren Zeilen?


122

Mir ist bewusst, dass ich in Vim einen Befehl oft wiederholen kann, indem ich einfach eine Zahl davor hinzufüge. Zum Beispiel kann man 5 Zeilen löschen durch:

5dd

Oft ist es auch möglich, einen Zeilenbereich anzugeben, auf den beispielsweise ein Befehl angewendet werden soll

:10,20s:hello:goodbye:gc

Wie kann ich eine vertikale Bearbeitung durchführen? Ich möchte zum Beispiel am Anfang jeder Zeile in einer bestimmten Zeile ein bestimmtes Symbol einfügen, z. B. ein Komma (Überspringen von Leerzeichen, dh was Sie erhalten, wenn Sie im Befehlsmodus nach Umschalt-I ein Komma eingeben) Angebot. Wie kann dies erreicht werden (ohne auf Down-Period-Down-Period-Down-Period zurückzugreifen)?

Antworten:


107

:10,20s/^/,/

Oder verwenden Sie ein Makro und zeichnen Sie mit:

q a i , ESC j h q

benutzen mit:

@ a

Erläuterung: q aStartet die Aufzeichnung eines zu registrierenden Makros aund qbeendet die Aufzeichnung. Hierfür stehen Register azur zVerfügung.


Vielen Dank. Was wäre, wenn ich das Äquivalent eines Shift-I wollte? Das heißt, das anfängliche Leerzeichen überspringen?
Saffsd

2
Erläuterung: ^\(\s*\)Erfasst das anfängliche Leerzeichen und speichert es in einem Register, mit dem Sie dann lesen können \1.
Svante

136

Ctrl- wechselt vblockweise in den visuellen Modus. Sie können sich dann bewegen (wie hjklgewohnt), und wenn Sie etwas in mehrere Zeilen einfügen möchten, verwenden Sie Shift- i.

Also für den Text:

abc123abc
def456def
ghi789ghi

Wenn Sie drücken Ctrl- vmit dem Cursor über die 1, jzweimal drücken, um zwei Spalten nach unten zu gehen Shift- i,ESC, sieht Ihr Text folgendermaßen aus:

abc,123abc
def,456def
ghi,789ghi

(Die mehrzeilige Einfügung weist eine kleine Verzögerung auf und wird erst nach dem Drücken gerendert ESC.)


3
Nett. Strg-V bedeutet übrigens Großbuchstaben, man könnte Strg-Umschalt-v
Svante

8
Eigentlich ist es entweder STRG-V oder STRG-V. Vim unterscheidet bei STRG-Codes nicht zwischen Groß- und Kleinschreibung (siehe: Hilfe STRG- {char}).
Rampion

2
Nachdem ich ein bisschen nach dem Grund gesucht habe, warum diese Methode nicht funktioniert hat, weil sie ein Großbuchstaben I (Shift-i) anstelle von i verwendet (außerdem war es nur Strg-V, da Strg-Shift-V mich zum Ende bewegt hat)
Willyfrog

4
Ich bin neugierig. Warum verwenden sie nicht einfach iohne Umschalttaste?
off99555

1
i ohne Verschiebung wird an der aktuellen Position eingefügt. Shift + i wird
Kevin P


44

Wenn Sie bereits das '.' Um Ihren letzten Befehl oft zu wiederholen, fand ich dies die bisher bequemste Lösung. Mit dieser Option können Sie Ihren letzten Befehl in jeder Zeile eines visuellen Blocks wiederholen

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Dies ist hilfreich, aber auch begrenzt, da die .Bedienung im visuellen Modus zeilenweise erfolgt. Ich denke, der visuelle Modus kann in diesem Fall manchmal praktisch sein, um einen Linienbereich auszuwählen. Befehle und Makros sind in diesem Fall jedoch flexibler und leistungsfähiger.
Bohr

23

Ich glaube, der einfachste Weg, dies zu tun, ist

1) ein Makro für eine Zeile aufzeichnen, 'a' nennen; in diesem Fall tippt man

qa I, ESC jq

2) Wählen Sie den Zeilenblock aus, auf den Sie das Makro anwenden möchten

3) Verwenden Sie die Funktion 'Norm', um das Makro 'a' über diesen Zeilenblock auszuführen, d. H.

:'<,'>norm@a

17

Ich denke, am einfachsten ist es, ein Makro aufzuzeichnen und es dann so oft zu wiederholen, wie Sie möchten. Um beispielsweise am Anfang jeder Zeile ein Komma hinzuzufügen, geben Sie Folgendes ein:

q a I , ESC j q

Um dies 5 Mal zu wiederholen, geben Sie ein

5 @ a


2

Gehen Sie .wie folgt vor, wenn Ihre Bearbeitung bereits im Operator gespeichert ist :

  1. Wählen Sie den Text aus, auf den Sie den Operator im visuellen Modus anwenden möchten
  2. Führen Sie dann den Befehl aus :norm .

1

Abgesehen von den Makros, wie bereits beantwortet, können Sie für den speziellen Fall des Einfügens eines Kommas in einen Zeilenbereich (z. B. von Zeile 10 bis 20) Folgendes tun:

:10,20s/\(.*\)/,\1

Das heißt, Sie können eine nummerierte Gruppenübereinstimmung mit \ (und \) erstellen und \ 1 in der Ersetzungszeichenfolge verwenden, um "durch den Inhalt der Übereinstimmung ersetzen" zu sagen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.