2008-12-10 12 views
86

Ich bin mir bewusst, dass ich in Vim oft einen Befehl wiederholen kann, indem ich einfach eine Zahl davor hinzufüge. Beispielsweise kann ein 5 Zeilen durch löschen:Wie wiederhole ich eine Bearbeitung für mehrere Zeilen in Vim?

5dd 

Es ist auch oft möglich, eine Reihe von Linien geben Sie einen Befehl an, zum Beispiel

:10,20s:hello:goodbye:gc 

anwenden Wie kann ich eine ‚vertikale bearbeiten ausführen '? Ich möchte zum Beispiel ein bestimmtes Symbol, sagen wir ein Komma, am Anfang einfügen (Whitespace überspringend, dh was man bekommen würde, wenn man nach dem Shift-I im Befehlsmodus ein Komma eingibt) von jeder Zeile eines gegebenen Angebot. Wie kann dies erreicht werden (ohne Rückgriff auf eine Down-Period-Down-Period-Down-Periode)?

Antwort

83

:10,20s/^/,/

Oder ein Makro verwenden, Datensatz mit:

q a i , ESC j h q

Verwendung mit:

@ a

Erläuterung: q a beginnt der Aufzeichnung eines Makros a zu registrieren, q endet Aufzeichnung. Hierfür stehen Register a bis z zur Verfügung.

+0

Danke verwenden. Was wäre, wenn ich das Äquivalent einer Schicht hätte? Das heißt, überspringen Sie die anfänglichen Leerzeichen? – saffsd

+1

: s/^ \ (\ s * \)/\ 1,/ – Svante

+1

Erklärung: '^ \ (\ s * \)' fängt anfängliche Leerzeichen ein und speichert sie in einem Register, das Sie dann mit '\ 1' lesen können . – Svante

10

Ich denke, die einfachste ist, ein Makro aufzunehmen, und wiederholen Sie das Makro so oft wie Sie möchten. Zum Beispiel ein Komma am Anfang jeder Zeile hinzuzufügen, geben Sie:

q a I , ESC j q 

zu wiederholen, dass 5-mal, geben Sie

5 @ a 
1

Neben dem Makros, wie bereits beantwortet, für die spezifischen Falls ein Komma in einer Reihe von Zeilen eingefügt (sagen sich von Zeile 10 bis 20), Sie so etwas wie tun könnten:

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

Das heißt, Sie ein nummerierte Gruppenspiel mit \ erstellen (und \) und Verwenden Sie \ 1 in den Ersatz s tring sagen "ersetzen durch den Inhalt des Spiels".

90

Strg - v tritt im visuellen Modus blockweise ein. Sie können dann bewegen (hjkl -wise, als normal), und wenn Sie etwas auf mehrere Zeilen einfügen möchten, verwenden Sie Shift- - i.

So für den Text:

abc123abc 
def456def 
ghi789ghi 

wenn Sie schlagen Ctrl - v mit dem Cursor über die 1, drücken Sie j zweimal zwei Spalten nach unten zu gehen, dann Shift- - i,ESC, würde Ihr Text wie folgt aussehen:

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

(der mehrzeilige Einsatz hat eine kleine Verzögerung, und wird nicht wiedergegeben, bis Sie ESC drücken).

+3

Schön. Strg-V bedeutet übrigens Großbuchstaben, man könnte sagen, Ctrl-Shift-v – Svante

+8

ist eigentlich entweder CTRL-v oder CTRL-V. Vim unterscheidet CTRL-Codes nicht (siehe: help CTRL- {char}). – rampion

+2

nach ein wenig suchen, warum diese Methode nicht funktionierte, weil es ein Kapital I (shift-i) anstelle von i (auch, es war nur ctrl-v, als ctrl-shift-v hat mich bis zum Ende bewegt) – Willyfrog

44

Das ist, was die: Norm (al) Befehl ist für:

 
:10,20 normal I, 
2

I block visual mode verwenden. Auf diese Weise können Sie Einfügungen/Bearbeitungen über mehrere Zeilen hinweg durchführen (auch als "vertikale Bearbeitung" bezeichnet).

+0

Ihr Link ist gebrochen –

17

Ich glaube, der einfachste Weg, dies zu tun

1) ist ein Makro für eine Zeile aufnehmen, nennen es ‚a‘; in diesem Fall eine Art

qa I, ESC jq

2) Wählen Sie den Block der Zeilen, die Sie das Makro

3) verwenden, um die 'Norm' Funktion anwenden möchten ausführen Makro 'a' über diesen Block von Linien, dh

:'<,'>[email protected] 
36

I Wenn Sie bereits das '.' um Ihren letzten Befehl viel zu wiederholen, dann fand ich this, um die bequemste Lösung bisher zu sein. Es ermöglicht Ihnen, Ihren letzten Befehl in jeder Zeile eines visuellen Blocks zu wiederholen, indem Sie

+2

sehr cool DANKE! – cmcginty

+1

Dies ist hilfreich, aber auch eingeschränkt, da das '.' im visuellen Modus zeilenweise funktioniert. Ich denke, dass der visuelle Modus in diesem Fall manchmal bequem sein kann, um einen Linienbereich auszuwählen. Aber Befehle und Makros sind in diesem Fall flexibler und leistungsfähiger. – Bohr

Verwandte Themen