Mehrfach einfügen

93

Wie lassen sich mehrere Zeilen am besten durch den Inhalt der Zwischenablage ersetzen?

Das Problem, das ich habe, ist, wenn ich eine Linie ziehe und sie über eine andere Linie füge, wird der "Ruck" durch die Linie ersetzt, die ich gerade ersetze. Wenn ich nun eine andere Zeile durch dieselbe ersetzen möchte, muss ich wieder nach oben gehen und sie erneut ziehen.

Es muss einen besseren Weg geben, dies zu tun.

jwerre
quelle

Antworten:

106

Ich habe dies in meiner .vimrc:

xnoremap p pgvy

(Hinweis: Dies funktioniert nur mit dem Standardregister, aber diese Zuordnung ist leicht zu merken.) Das Schreiben einer ausführlicheren Version wäre möglich. Sie können auch weiterhin P verwenden, um das alte Verhalten zu erhalten.

Benoit
quelle
28
Klug. 'p' zum Einfügen, 'gv' zum erneuten Auswählen der ursprünglich ausgewählten Elemente. 'y', um es erneut zu kopieren.
Amjith
@SibbsGambling, wahrscheinlich mit einer Version vor Vim 7? Aktualisieren Sie dann entweder Vim oder verwenden Sie v anstelle von x ( vnoremap). Die Vim-Hilfedateistatus version7.txtxmap und smap wurden in dieser Version angezeigt.
Benoit
1
@ Benoit Hmm, ich habe 7.4.52, aber weder xnoremapnoch vnoremapfunktioniert
Sibbs Gambling
8
Warum ist dies nicht das Standardverhalten?
Seth
27

"0sollte den Inhalt Ihres Ruckes haben. Das Tippen ist etwas mühsamer, "0psollte aber tun, was Sie wollen.

Alternativ können Sie die alten Leitungen nicht vorne auswählen und ersetzen. Wenn Sie diese Zeilen mit einer Suche finden, drücken n.Sie einfach immer wieder (nach einer Initiale p). Wenn sie alle eingefügt sind, nddfolgen Sie so vielen n.s wie nötig.

Der größte mentale Wechsel, den ich bei einem Wechsel zu Vim vornehmen musste, besteht darin, herauszufinden, wie Gruppenänderungen nacheinander angewendet werden. Das heißt, anstatt eine Reihe von Änderungen in einer Zeile und dann eine Reihe derselben Änderungen in einer anderen Zeile vorzunehmen, werde ich die erste Bearbeitung in einer Reihe von Zeilen vornehmen (mit .großem Effekt), dann die zweite Bearbeitung in einer Reihe von Zeilen usw. Alternativ kann die Verwendung von Makros hilfreich sein, da sie fantastisch sind, aber manchmal etwas mühsamer, um mit "komplexen" Änderungen richtig zu arbeiten.

Dash-Tom-Bang
quelle
2
klingt wie ein Ort, an dem Regex mit :%s/.../.../gcBefehlen zum Bestätigen des Typs möglicherweise näher an
Ihren Wünschen liegt
@Milimetric +1 wusste nicht, dass Sie dies bestätigen können.
1
Upvoting, da Makros dies zu einem Problem machen können. 5@mm
Nehmen
Danke für die tolle Erklärung. Jetzt benutze ich xnoremap p "0pin meinem ~ / .vimrc
nexayq
13

Ich verwende oft eine andere Registrierung, kopiere die benötigte Zeile in eine benannte Registrierung "ayund füge sie von dort aus ein"ap

Facundo Casco
quelle
11

Wenn Sie eine Auswahl in Vim einfügen, wird das Standardregister durch den Inhalt der Auswahl ersetzt. Wenn das Einfügen über eine Auswahl den Inhalt des Zwischenablage-Registers löscht, haben Sie höchstwahrscheinlich die folgende Zeile in Ihrer .vimrc

set clipboard=unnamed

Eine Möglichkeit besteht darin, dies zu entfernen und das explizite Zwischenablage-Register zu verwenden "+

Eine andere Möglichkeit besteht darin, eines der anderen explizit benannten Register (az) zu verwenden. Nach dem ersten Einfügen ziehen Sie die Linie "czum Beispiel zurück und verwenden Sie dann, "cpum von dort aus nach außen einzufügen .

JaredPar
quelle
Eigentlich war die Standardeinstellung (hier unter Ubuntu) Zwischenablage = automatische Auswahl; Trotzdem vielen Dank für die bisher eleganteste Antwort.
Tobu
8

Verwenden Sie npwo nist die Anzahl der Zeit, die Sie die Zeilen 3peinfügen möchten, z. B. werden 3 Zeilen eingefügt.

toopay
quelle
7
Funktioniert nicht, wenn Sie dieselbe Zeile über nicht zusammenhängende Zeilen einfügen möchten.
Tobu
@Tobu, aber es beantwortet den Titel dieser Frage "Wie
fügst
6

Anstatt Kopieren / Einfügen zu verwenden, ist es oft besser, einen Textobjektbefehl zu verwenden ciw, um beispielsweise das innere Wort zu ändern. Diese Methode hat den Vorteil, dass sie mit dem .Befehl repeat leicht wiederholt werden kann .

  1. yiw Innenwort ziehen (Wort unter Cursor kopieren, "zuerst" sagen).
  2. ... Bewegen Sie den Cursor auf ein anderes Wort (sagen Sie "Sekunde").
  3. ciw<C-r>0 Ändern Sie "second" und ersetzen Sie es durch "first" (ist Strg-R).
  4. ... Bewegen Sie den Cursor auf ein anderes Wort (sagen Sie "drittes").
  5. . Ändern Sie "drittes" und ersetzen Sie es durch "erstes".
Jack Guan
quelle
1
ciw<C-r>0funktioniert in meinem Fall nicht. ciwwechselt in den Einfügemodus, in dem er <C-r>unbrauchbar wird. Gibt es eine einfache Erklärung dafür? Könnte das mit dem Texteditor zu tun haben (ich verwende kein reines VIM, sondern VIM-Tastaturbindungen in RStudio)
Bushroot
@Bushroot <C-r>soll im Einfügemodus verwendet werden, da Sie so aus einem Register einfügen, ohne den Einfügemodus zu verlassen - also in Vim; Ich bin mit RStudio nicht vertraut, aber ich würde vermuten, dass Sie Recht haben und diese spezielle Schlüsselbindung nicht implementiert wurde.
Insektean
@ Sean H: Ja. Sie haben die Schlüsselbindung nicht implementiert. Es funktioniert gut in VIM und sogar mit VIM-Bindungen in anderen Programmen (z. B. Visual Studio Code).
Bushroot