Ziehen und Einfügen beim Inkrementieren

13

Ich bearbeite eine .sql-Datei in Vim:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),

Was ich tun möchte, ist, die (1, 1),Linie zu ziehen und sie 137-mal einzufügen ; Ich möchte jedoch, dass die zweite Zahl in Klammern jedes Mal erhöht wird. Die Ausgabe würde so aussehen:

INSERT INTO apps_forms (app_id, form_id) VALUES
(1, 1),
(1, 2),
(1, 3),
...
(1, 137),

Gibt es eine Möglichkeit, dies in Vim zu tun, und wenn ja, welchen Befehl würde ich verwenden?

Vielen Dank!

glatte Griffe
quelle

Antworten:

10

Setzen Sie den Cursor auf die (1, 1),Zeile und geben Sie Folgendes ein:

qaVypt)<C-a>q135@a

Erklärung:

qabeginnt die Aufzeichnung eines Makros innerhalb des Registers a (Sie können einen anderen Buchstaben wählen).

Vyp dupliziert die aktuelle Zeile, indem Sie die gesamte Zeile auswählen (V), kopieren (y) und dann darunter einfügen (p).

t) Bewegen Sie den Cursor kurz vor die nächste geschlossene Klammer, damit sie auf der zweiten Ziffer steht.

<C-a>( Ctrlund a) erhöht die Zahl.

q Beendet die Aufzeichnung des Makros.

135@aWiederholt das in dem Register gespeichert Makro ein 135 mal.

Edit: Peter Rincker hat einen kürzeren Befehl:

qqYpW<c-a>q135@q

Die Unterschiede sind:

es verwendet das Register q das Makro (schneller tippen zu speichern qqals , qaweil es der gleiche Schlüssel ist),
kopiert es die Zeile mit nur einem Tastendruck Y(statt zwei Vy),
und es bewegt den Cursor in die zweite Zahl mit nur einem Tastendruck W(statt von t)).

saginaw
quelle
4
Vim Golf: qqyypW<c-a>q135@q. Noch kürzer, wenn Sie Ystatt verwenden yy.
Peter Rincker
9

Neueste Vims haben gelernt, visuell ausgewählte Bereiche zu erhöhen und eine Sequenz zu erstellen. Sie können dies also tun, nachdem Sie Ihre Zeile 137 Mal eingefügt haben:

1) Wählen Sie Ctrl-Vausgehend von Zeile 3 ( ) die zweite 1 aus.

2) drücken gCtrl-A

Ich habe einen Screencast aufgezeichnet hier

Haftungsausschluss: Dies benötigt eine Vim 7.4.900 oder so.

Christian Brabandt
quelle
Erfolgreich getestet in Vim 7.4.826 auf Debian / Sid.
Dubu
Ihr Screencast ist verschwunden, aber diese Methode ist FANTASTISCH! Vielen Dank.
david_nash
2

Die einfach zu verstehende / leicht zu merkende / leicht anpassbare Methode: Verwenden Sie das VisIncr- Plugin (wenn Sie lieber eine Version verwenden möchten , die mit den Paketmanagern aus diesem Jahrhundert gut funktioniert, als mit vimballs umzugehen) , Sie können es von GitHub erhalten ). Damit:

  • Gehe zur (1, 1),Linie und ziehe daran:Vy
  • Füge es 136 Mal ein: 136p
  • gehe zur zweiten Spalte von 1und markiere sie vertikal:C-vGf)h
  • Führen Sie das Inkrement aus: :II
  • Lesen Sie das Handbuch über die anderen guten Sachen , um herauszufinden: :help visincr.
Sato Katsura
quelle
1

Ich würde mit spielen g^a.

Versuchen Sie es 137i0^v137kg^a.

Moisès
quelle
1
Willkommen bei Vi und Vim ! Ich habe Ihre Antwort mit Markdown formatiert. Es wäre sogar noch besser, wenn Sie die Antwort auf die Frage von OP bearbeiten .
D. Ben Knoble