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
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.
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.
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
Einfacher geht es nicht! Aus dem normalen Modus:
yy
Bewegen Sie sich dann zu der Zeile, die Sie an und einfügen möchten
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.
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
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>
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.
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
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.
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).
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.
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 .
Y
esP
leasen. :)Antworten:
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
quelle
Y
zuy$
. (In Übereinstimmung mitD
undC
; (aber nicht Vi-kompatibel (niemand kümmert sich darum.))) Das wird sogar in vorgeschlagen:help Y
.yj
oderyk
, zumal Sie nicht auf ein Zeichen verdoppeln. Außerdemyk
ist dies eine Rückwärtsversion,2yy
die nicht funktioniert, und Sie können die Anzahl der Zeilen eingeben, die rückwärts iny9j
odery2k
usw. reichen . Der einzige Unterschied besteht darin, dass Ihre Anzahln-1
für insgesamtn
Zeilen gelten muss, aber Ihr Kopf kann dies lernen wie auch immer.Normaler Modus: Siehe andere Antworten.
Der Ex- Weg:
:t.
wird die Zeile duplizieren,:t 7
kopiert es nach Zeile 7,:,+t0
kopiert 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 Bereich1,.
).Wenn Sie verschieben müssen, anstatt zu kopieren, verwenden Sie
:m
anstelle von:t
.Dies kann sehr effektiv sein, wenn Sie es mit
:g
oder 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 Formularsclass xxx
direkt nach dem Cursor.Referenz:
:help range
,:help :t
,:help :g
,:help :m
und:help :v
quelle
:
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:t0
werden also die Zeilen am Anfang kopiert.:t.
ist die genaue Antwort auf die Frage.YP
oderYp
oderyyp
.quelle
Y
wird normalerweisey$
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$
yyP
Einfacher geht es nicht! Aus dem normalen Modus:
Bewegen Sie sich dann zu der Zeile, die Sie an und einfügen möchten
quelle
yy
zieht die aktuelle Zeile, ohne sie zu löschen
dd
löscht die aktuelle Zeile
p
wird
put
eine Linie von einer der vorherigen Methoden erfasstquelle
Mach das:
Zuerst yydie aktuelle Zeile kopieren und dann peinfügen.
quelle
Wenn Sie einen anderen Weg wollen:
"ayy
: Dadurch wird die Zeile im Puffer gespeicherta
."ap
: Dadurch wird der Inhalt des Puffersa
auf den Cursor gesetzt.Hier gibt es viele Variationen.
"a5yy
: Dadurch werden die 5 Zeilen im Puffer gespeicherta
.Weitere Informationen finden Sie unter " Vim-Hilfedateien " .
quelle
yyp - erinnere dich daran mit "yippee!"
Mehrere Zeilen mit einer Zahl dazwischen:
y7yp
quelle
:.,.+7 copy .+7
: Pyyp - einfügen nach
yyP - vorher einfügen
quelle
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
quelle
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
Eine andere Option wäre:
gibt Ihnen den Vorteil, die Cursorposition beizubehalten.
quelle
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
quelle
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.
quelle
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
quelle
Ich weiß, dass ich zu spät zur Party komme, aber was auch immer; Ich habe dies in meiner .vimrc:
Der
:copy
Befehl 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 .quelle
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
quelle
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
.vimrc
Datei.nmap <S-C-d> <Esc>Yp
Oder für den Einfügemodus:
imap <S-C-d> <Esc>Ypa
quelle
i
zum Ende, um ihn erneut aufzurufenundo
, wird unterbrochen , sodass die Lösung für das Duplizieren von Zeilen im Einfügemodus nicht so trivial ist, wie es scheint.imap <S-C-d> <Esc>Ypi
Einfügemodus undnmap <S-C-d> <Esc>Yp
im normalen ModusIch verwende dieses Mapping gerne:
weil es die Verwendung neben dem nativen
YP
Befehl konsistent macht .quelle