Wie dupliziere ich eine ganze Zeile in Vim bei Eclipse?

1624

Wie dupliziere ich eine ganze Zeile in Vim auf ähnliche Weise wie Ctrl+ Din IntelliJ IDEA / Resharper oder Ctrl+ Alt+ / in Eclipse ?

Sumek
quelle
49
Führen die Leute keinen Vimtutor mehr aus? Dies ist wahrscheinlich innerhalb der ersten fünf Minuten nach dem Erlernen der Verwendung von Vim.
Dash-Tom-Bang
131
Möchten Sie diese Zeile duplizieren? Yes Pleasen. :)
Stavr00
3
FWIW Ich habe in den letzten 2 Monaten ungefähr ein Dutzend Mal Vimtutor gemacht und dieses Konzept wird nicht behandelt. Hier erfahren Sie, wie Sie "dd" und "v - navigieren - y" gefolgt von "p" ausführen. Es wird nicht angegeben, wie eine einzelne Zeile kopiert werden soll, ohne sie zu löschen, wie hier gefragt.
Danielson317

Antworten:

2769

yyoder Ydie Zeile zu kopieren (mnemonic: y ank )
oder
ddauf d ÉLETE die Linie (Vim Kopien , was Sie in einem gelöschten Zwischenablage-like „registrieren“, wie ein Schnitt - Betrieb)

dann

pauf p aste die kopiert oder gelöscht Text nach der aktuellen Zeile
oder
Pauf p aste die kopiert oder gelöscht Text vor der aktuellen Zeile

Mark Biek
quelle
129
Ein ausgezeichneter Punkt. Aus irgendeinem Grund finde ich, dass es für mich schneller ist, y zweimal zu treffen als SHIFT-y
Mark Biek
25
@ Camflan Ich denke, das Y sollte "Kopie vom Cursor bis zum Ende" sein
Dzung Nguyen
42
und 2yy kann verwendet werden, um 2 Zeilen (und für jedes andere n) zu kopieren
Amir Ali Akbari
5
@nXqd: Ja, ein großer Prozentsatz der Nutzer Karten Yzu y$. (In Übereinstimmung mit Dund C; (aber nicht Vi-kompatibel (niemand kümmert sich darum.))) Das wird sogar in vorgeschlagen :help Y.
Aaron Thoma
11
Um zwei Zeilen zu kopieren, ist es noch schneller, einfach zu gehen yjoder yk, zumal Sie nicht auf ein Zeichen verdoppeln. Außerdem ykist dies eine Rückwärtsversion, 2yydie nicht funktioniert, und Sie können die Anzahl der Zeilen eingeben, die rückwärts in y9joder y2kusw. reichen . Der einzige Unterschied besteht darin, dass Ihre Anzahl n-1für insgesamt nZeilen gelten muss, aber Ihr Kopf kann dies lernen wie auch immer.
Zelk
406

Normaler Modus: Siehe andere Antworten.

Der Ex- Weg:

  • :t. wird die Zeile duplizieren,
  • :t 7 kopiert es nach Zeile 7,
  • :,+t0kopiert die aktuelle und nächste Zeile am Anfang der Datei ( ,+ist ein Synonym für den Bereich .,.+1),
  • :1,t$kopiert Zeilen vom Anfang bis zur Cursorposition bis zum Ende ( 1,ist ein Synonym für den Bereich 1,.).

Wenn Sie verschieben müssen, anstatt zu kopieren, verwenden Sie :manstelle von :t.

Dies kann sehr effektiv sein, wenn Sie es mit :goder kombinieren :v:

  • :v/foo/m$ verschiebt alle Zeilen, die nicht mit dem Muster "foo" übereinstimmen, an das Ende der Datei.
  • :+,$g/^\s*class\s\+\i\+/t.kopiert alle nachfolgenden Zeilen des Formulars class xxxdirekt nach dem Cursor.

Referenz: :help range, :help :t, :help :g, :help :mund:help :v

Benoit
quelle
1
Wenn Sie :im visuellen Modus drücken , wird die Transformation '<,'>so geändert, dass der Linienbereich, über den sich die visuelle Auswahl erstreckt, vorab ausgewählt wird. Im visuellen Modus :t0werden also die Zeilen am Anfang kopiert.
Benoit
1
Für den Datensatz: Wenn Sie einen Doppelpunkt (:) eingeben, wechseln Sie in den Befehlszeilenmodus, in dem Sie Ex-Befehle eingeben können. vimdoc.sourceforge.net/htmldoc/cmdline.html Ex-Befehle können sehr leistungsfähig und knapp sein. Die yyp-Lösungen sind "Normalmodus" -Befehle. Wenn Sie eine weit entfernte Zeile oder einen Zeilenbereich kopieren / verschieben / löschen möchten, kann ein Ex-Befehl viel schneller sein.
Niels Bom
7
Downvoted nicht aufgrund eines Problems mit der Antwort als solche (obwohl es für meine Situation nicht funktionieren würde, habe ich keine Ahnung, auf welche Zeilennummer ich duplizieren möchte), sondern weil es WIRKLICH nicht die beste / akzeptierte Antwort dafür sein sollte häufig gesuchte Frage.
mjaggard
9
@mjaggard: Akzeptierte Antworten stehen immer ganz oben, unabhängig von ihrer Punktzahl. Ja, ich habe diese Antwort als Ergänzung hinzugefügt, und es scheint, dass sie gut zum OP passt.
Benoit
7
:t.ist die genaue Antwort auf die Frage.
Burak Erdem
294

YPoder Ypoder yyp.

Linulin
quelle
Ywird normalerweise y$bis zum Ende der Zeile (von der aktuellen Cursorposition, nicht bis zum Zeilenanfang) neu zugeordnet (ziehen (kopieren)). Mit dieser Zeile in .vimrc::nnoremap Y y$
Aaron Thoma
1
Vergessen Sie nicht arme alteyyP
icc97
253

Kopieren und Einfügen in vim

Einfacher geht es nicht! Aus dem normalen Modus:

yy

Bewegen Sie sich dann zu der Zeile, die Sie an und einfügen möchten

p
Adam
quelle
34
Was hast du benutzt, um das GIF zu machen?
Zoltán
4
@ Zoltán können Sie LiceCap verwenden, die klein ist
onmyway133
53

yy

zieht die aktuelle Zeile, ohne sie zu löschen

dd

löscht die aktuelle Zeile

p

wird puteine Linie von einer der vorherigen Methoden erfasst

pjz
quelle
3
Dieser kam zuerst, aber sein Duplikat wird akzeptiert: stackoverflow.com/a/73357/1438029
Geoffrey Hale
44

Mach das:

Zuerst yydie aktuelle Zeile kopieren und dann peinfügen.

Eric Z Bart
quelle
20
Geben Sie das Leerzeichen nicht ein.
Niels Bom
1
Ja, wenn sich der Cursor am Ende der Zeile befindet und Sie das Leerzeichen wie gezeigt eingeben, duplizieren Sie die Zeile, die Sie gezogen haben, 2 Zeilen unter der Zeile, die Sie gezogen haben.
44

Wenn Sie einen anderen Weg wollen:

"ayy: Dadurch wird die Zeile im Puffer gespeichert a.

"ap: Dadurch wird der Inhalt des Puffers aauf den Cursor gesetzt.

Hier gibt es viele Variationen.

"a5yy: Dadurch werden die 5 Zeilen im Puffer gespeichert a.

Weitere Informationen finden Sie unter " Vim-Hilfedateien " .

Kwondri
quelle
Danke, ich habe dies als Bindung verwendet: map <Leader> d "ayy" ap
frbl
39

yyp - erinnere dich daran mit "yippee!"

Mehrere Zeilen mit einer Zahl dazwischen:

y7yp

theschmitzer
quelle
17
7yy entspricht y7y und ist wahrscheinlich leichter zu merken, wie es geht.
Graywh
10
y7yp (oder 7yyp) ist selten nützlich; Der Cursor bleibt in der ersten kopierten Zeile, sodass p die kopierten Zeilen zwischen der ersten und zweiten Zeile der Quelle einfügt. Um einen Zeilenblock zu duplizieren, verwenden Sie 7yyP
Nefrubyr
@ Nefrubyr oder :.,.+7 copy .+7: P
DarkWiiPlayer
23

yyp - einfügen nach

yyP - vorher einfügen

Yemu
quelle
6
Da die Zeile dupliziert wird, ist das Endergebnis des Inhalts dasselbe.
Acumenus
4
@ABB Hier gibt es jedoch einen kleinen Unterschied - auf welcher Linie landet Ihr Cursor?
Mikk
12

Ich mag: Shift+ v(um die ganze Zeile sofort auszuwählen und Sie können andere Zeilen auswählen, wenn Sie möchten), y, p

Xavier Guihot
quelle
11

Sie können auch <Cx> <Cl> ausprobieren, wodurch die letzte Zeile aus dem Einfügemodus wiederholt wird und ein Abschlussfenster mit allen Zeilen angezeigt wird. Es funktioniert fast wie <Cp>


quelle
Dies ist sehr nützlich, aber um zu vermeiden, dass ich viele Tasten drücken muss, habe ich es nur STRG-L zugeordnet. Dies ist meine Karte: inoremap ^ L ^ X ^ L
Jorge Gajon
11

Eine andere Option wäre:

nmap <C-d> mzyyp`z

gibt Ihnen den Vorteil, die Cursorposition beizubehalten.

Turm
quelle
10

Für jemanden, der vi nicht kennt, könnten einige Antworten von oben ihn mit Sätzen wie "Einfügen ... nach / vor der aktuellen Zeile " irreführen .
Es ist eigentlich "Einfügen ... nach / vor dem Cursor ".

yyoder Ydie Zeile zu kopieren
oder
dddie Zeile löschen

dann

pum den kopierten oder gelöschten Text nach dem Cursor einzufügen
oder
Pum den kopierten oder gelöschten Text vor dem Cursor einzufügen


Weitere Schlüsselbindungen finden Sie auf dieser Website: vi Vollständige Schlüsselbindungsliste

Michael
quelle
3

1 gotcha: Wenn Sie "p" verwenden, um die Linie zu setzen, wird sie nach der Linie gesetzt, auf der sich Ihr Cursor befindet. Wenn Sie also die Linie nach der Linie hinzufügen möchten, die Sie ziehen, bewegen Sie den Cursor nicht um eine Linie nach unten bevor Sie die neue Zeile setzen.

cori
quelle
4
oder verwenden Sie Kapital P - setzen Sie vor
Ghoti
3

Die Standardeinstellung ist yyp, aber ich verwende diese Neubindung seit ungefähr einem Jahr und liebe sie:

" set Y to duplicate lines, works in visual mode as well. nnoremap Y yyp vnoremap Y y`>pgv

Chris Penner
quelle
3

Ich weiß, dass ich zu spät zur Party komme, aber was auch immer; Ich habe dies in meiner .vimrc:

nnoremap <C-d> :copy .<CR>
vnoremap <C-d> :copy '><CR>

Der :copyBefehl kopiert nur die ausgewählte Zeile oder den Bereich (immer ganze Zeilen) unter die als Argument angegebene Zeilennummer.

Im normalen Modus copy . kopiert dies diese Zeile direkt unter diese Zeile .

Im visuellen Modus wird es '<,'> copy '> vom Beginn der Auswahl bis zum Ende der Auswahl in die Zeile unter dem Ende der Auswahl kopiert .

DarkWiiPlayer
quelle
1
↑↑ beste Antwort hier!
2

Für diejenigen, die anfangen, vi zu lernen, finden Sie hier eine gute Einführung in vi, indem Sie nebeneinander vi-Befehle für typische Cursorbewegungen und Tastenkombinationen des Windows-GUI-Editors auflisten. Es listet alle grundlegenden Befehle auf, einschließlich yy(Zeile kopieren) und p(nach einfügen) oder P(vor einfügen).

vi (Vim) für Windows-Benutzer

ap-osd
quelle
1

Wenn Sie eine Linie kopieren mögen und es sofort unter der aktuellen pastös, genau wie in Sublime Ctrl+ Shift+ D, dann können Sie diese in Ihrer hinzufügen .vimrcDatei.

nmap <S-C-d> <Esc>Yp

Oder für den Einfügemodus:

imap <S-C-d> <Esc>Ypa

Jedi
quelle
Dadurch bleibt jedoch der Einfügemodus und das Hinzufügen i zum Ende, um ihn erneut aufzurufen undo, wird unterbrochen , sodass die Lösung für das Duplizieren von Zeilen im Einfügemodus nicht so trivial ist, wie es scheint.
DarkWiiPlayer
Das funktioniert bei mir einwandfrei: imap <S-C-d> <Esc>Ypi Einfügemodus und nmap <S-C-d> <Esc>Ypim normalen Modus
jedi
0

Ich verwende dieses Mapping gerne:

:nnoremap yp Yp

weil es die Verwendung neben dem nativen YPBefehl konsistent macht .

Yolenoyer
quelle