Wie kann man eine bestimmte Linie ziehen, ohne den Cursor in vim zu bewegen?

39

Zum Beispiel

Alt-Text

Wie kann ich Zeile 4 nur in Zeile 12 ziehen und einfügen, ohne den Cursor in Zeile 4 bewegen zu müssen?

Alt-Text

Laser
quelle
Ich beantwortete Ihre Frage anhand der Tatsache, dass "mich reißen!" ist in Zeile 4. In Ihrem 2. Screenshot erscheint es in Zeile 5.
Louis Salin
Danke @ Louis für die Antwort. Ich habe den Screenshot aktualisiert.
Lazer

Antworten:

51

Befindet sich der Cursor bereits in Zeile 12, so ist dies ein einfacher

: 4y
P

tut es für mich.

schäbig
quelle
1
Nett! Gibt es ein Äquivalent für x? Wenn ich es versuche, :4xbekomme ich E140: Use ! to write partial buffer. Vielen Dank!
Dotancohen
Ich muss sagen, das ist unglaublich: D
nXqd
@dotancohen:4d
n.st
Gibt es eine gute Möglichkeit, dies mit der relativen Zeilennummer zu tun?
TrungDQ
Verwenden Sie bei relativen Zahlen einfach + und -. Also steht -4 vier Zeilen über dem Cursor und +4 vier Zeilen darunter.
Rickythefox
10

Wie wäre es damit: Der Cursor befindet sich in Zeile 11, Sie befinden sich im "vi" -Modus.

:4co.<return>

Du kannst es anscheinend auch mit einem Muster machen:

:/^Yank/co.<return>

Sie können "mo" (Verschieben) anstelle von "co" (Kopieren) verwenden, um die Linie nur zu verschieben, anstatt zu reißen und zu setzen.

Bruce Ediger
quelle
1
Noch kürzer ( t als :4t.
Kopierbefehl
9

Versuche dies:

:4,4y  
P
Louis Salin
quelle
8

Versuchen:

:4co11

Sie können ein Argument von verwenden, 0um es in eine Zeile einzufügen 1. Dies funktioniert auch mit Bereichen:

:m,n co k

werden Zeilen kopieren mdurch ndie Linie k+1. Außerdem spielt es keine Rolle, wo Sie sich im Puffer befinden. Der moveBefehl mfunktioniert ähnlich.

gvkv
quelle
2

Dies sollte es tun:

:4,12y
p
k
Umang
quelle
1
Nein, das zieht die Zeilennummern 4 bis 12 an.
Lazer
Ich meinte Kopieren und Einfügen von Zeile 4 bis Zeile 12.
Lazer
Bearbeitet Wolltest du das?
Umang
2

Andere haben bereits die direkteste Methode erwähnt, um dies zu tun :4y, aber ich möchte zwei Anmerkungen hinzufügen, die nützlich sein können:

Eins, wenn Sie in geben :help rangeSie alle lernen über Bereiche mit Ex - Stil Befehle anzuwenden. In vielen Fällen sehr nützlich und weitaus vielseitiger als die Verwendung von Zeilennummern. Wenn Sie beispielsweise die erste Zeile nach dem Beginn des Dokuments mit "yank" beginnen möchten (auch wenn sie sich in der ersten Zeile befindet), verwenden Sie :0/^yank/y. Der mächtigste Teil von Bereichen ist die Fähigkeit, sie zu kombinieren, z. B. :./^Chapter/+50?Pete?dbedeutet "Finde die nächste Zeile, die mit dem Wort Kapitel beginnt (suche vorwärts von der aktuellen Zeile), springe dann 50 Zeilen vorwärts und suche rückwärts nach dem Wort Pete." und löschen Sie die erste Zeile, in der Sie sie finden. " Abgesehen davon, dass es den Cursor nicht bewegt, TUT es nur, was Sie ihm sagen.

(Ich habe diese Art der Bereichsspezifikation verwendet, um die Erstellung von fummeligen Dokumentationen zu automatisieren, indem ich nach dem Funktionsnamen unter dem Cursor gesucht habe, dann nach der nächsten Zeile gesucht habe, in der "Description" steht, und sie in ein bestimmtes Register gezogen habe ... usw.)

Der andere Tipp ist, dass Sie über das Springen Bescheid wissen sollten. Geben Sie :help jump-motionsdarüber erfahren voll, aber so , wie es hier bezieht , ist , dass Sie springen 4 Zeile, zerren sie und dann RETURN mit 4Gyy''(oder verwenden Sie Backticks anstelle von Apostrophe exakt auf Ihre Ausgangsposition zurück zu springen, anstatt nur die gleiche Linie Du hast angefangen um.)

Platzhalter
quelle
2

Kürzeste:

:1t. kopiert die erste Zeile unter die aktuelle.

Mit Bereichen: :1,4t.Kopiert Zeile 1 bis 4 (einschließlich) unter den aktuellen.

Auch mit relativen Zeilennummern möglich:

:-1t. kopiert die vorherige Zeile unter die aktuelle.

In Ihrem Beispiel :4t-1würde die vierte Zeile unter der gewünschten Zeile kopiert.

Hinweis: :tist ein Synonym für den :co[py]Befehl.

Erwin Rooijakkers
quelle