Wie kann ich mit vim einfügen (überschreiben)?


31

In vimich yyund pdie ganze Zeit heftig zu ziehen und fügen Linien. Wenn ich jedoch eine Zeile an mehreren Stellen in der Datei ersetzen möchte, kann ich dies nicht verwenden, yy p dd pda dd die Zeile in der Zwischenablage / im Register gelöscht wird. Während ich wahrscheinlich wissen sollte, wie man Register besser benutzt, habe ich das Gefühl, dass es wahrscheinlich einen Weg gibt p, um die aktuelle Zeile zu ersetzen.

Antworten:


27

Standardmäßig verwenden die Einfügebefehle das "Register ("unnamed") . Tatsächlich schreibt jeder Befehl, der in ein Register schreibt, auch in das unbenannte Register. Daher wirken sich alle Vorgänge, Löschungen und Änderungen auf das Register aus. Aus diesem Grund fügt Ihre Sequenz zum Einfügen von Ruckeln und Löschen den gelöschten Text anstelle des Textes mit Ruckeln ein.

Das 0Register kann hier helfen. Jegliche Yank-Befehle, die kein Register angeben, setzen den Text in das Register 0(zusätzlich zu "). Es ist nicht von Lösch- oder Änderungsvorgängen betroffen. Sie können es also verwenden, um eine gezerrte Linie mehrmals einzufügen, selbst wenn Sie zwischenzeitliche Lösch- oder Änderungsvorgänge ausführen.

  1. yy: Register 0und "beide haben jetzt die gezerrte Linie.
  2. Wechseln Sie zu einer Zeile, die ersetzt werden soll.
  3. dd: "Jetzt registrieren hat die gelöschte Linie, aber registrieren hat 0noch die gezerrte Linie.
    "0P: Füge die ursprünglich gezerrte Linie aus dem Register ein 0.
  4. Zum Ersetzen in die nächste Zeile wechseln.
  5. dd"0P (das gleiche wie oben)

(Aufgrund der Funktionsweise der Cursorpositionierung beim Ersetzen der letzten Zeile eines Puffers möchten Sie "0pstatt "0P.)

Dies kommt Bruce Edigers Antwort sehr nahe , mit der Ausnahme, dass Sie beim anfänglichen Ziehen kein Register angeben müssen. Die Verwendung eines oder mehrerer benannter Register kann jedoch sehr praktisch sein, wenn Sie (zum Beispiel) einige Zeilen durch AAA, aber andere Zeilen durch BBB( AAAin Register aund BBBin Register setzen b(oder eine davon in Register 0belassen ) ersetzen müssen , und sie dann entsprechend einfügen müssen ).

Sie können auch von Paste 0in zeilenweise visuellem Modus ( V) mit einem Tastendruck zu speichern: V"0p.

Wenn Sie nicht gerne tippen "0möchten, ist eine Zuordnung möglicherweise bequemer:

noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p

Ein alternativer Ansatz ist das Löschen in das _Register ("blackhole") . Wenn Sie darauf löschen, ist das "Register nicht betroffen, sodass Ihre Sequenz zum Löschen und Einfügen weiterhin den Text aus dem unbenannten Register einfügen kann.

  1. yy: Melde dich an 0und "beide haben jetzt die gerissene Leitung.
  2. "_dd: Keine Änderung an den Registern.
    P: Füge den ursprünglich gezogenen Text aus dem Register ein ".

Auch hier ist eine Zuordnung möglicherweise praktischer:

noremap <Leader>d "_d

2
Oder, tl; dr, benutze einfach yy(bewege dich zu der Linie, die ersetzt werden soll) S<C-r>0<Esc>. Hat den Vorteil, mit dem .Befehl wiederholbar zu sein .
Wildcard

11

Kevin hat anscheinend eine ziemlich gute Antwort, aber wenn Sie jede Zeile, die Sie löschen, im Auge behalten möchten, dann ersetzen Sie sie, es gibt eine etwas andere Lösung.

1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.

Mit dieser Art von Rezept können Sie mithilfe der Mustererkennung nach zu löschenden und zu ersetzenden Zeilen suchen und so oft Sie möchten zum Anfang der Datei zurückkehren (1G) und vorwärts suchen. Wenn ich zwei oder mehr Zeilen sammeln und wiederholt platzieren muss, verwende ich "ayyfür die erste Zeile, "byyfür die zweite, "cyyfür die dritte usw. Ich habe es mir zur Gewohnheit gemacht (was die Allgemeingültigkeit des Rezepts verringert), die mentale Belastung für mich zu verringern.


Sehr schön. Wenn ich also "ayyund dann benutze dd, ddwird nicht ersetzt, was in ist a, aber wenn ich tippe p, wird eingefügt, was gerade mit gelöscht wurde dd. Und wenn ich ersetzen wollte, was in dem ist, "ayywas ich lösche, dann würde ich verwenden "add- ist das richtig?
KWD

"ayy kopiert eine Zeile in das Register 'a'." dd "schneidet eine Zeile in ein Standardregister, nicht in ein 'a'. 'p' fügt das Standardregister ein, richtig. , die den Inhalt aus dem "Ayy-Befehl ersetzen würde.
Bruce Ediger

5

Es gibt verschiedene Möglichkeiten, dies zu tun :s, je nachdem, wie viel Sie tippen möchten. Der einfachste Weg ist ein einfaches Suchen und Ersetzen:

:%s/find this line/replace with this/

Das %durchsucht die gesamte Datei und ersetzt alle Vorkommen.

Wenn Sie zu viel tippen, können Sie die Zielzeichenfolge ( yy) ziehen und das "(Standard-) Register verwenden, indem Sie Folgendes einfügen Ctrl+r ":

:%s/<ctrl+r><">/replacement/

Oder, wenn Sie eine Kopie der Ersatzzeichenfolge haben, können Sie die beiden in getrennten Registern mit zerren "ayyund "byyreißen in die aund bRegister, bzw. (können Sie jeden Buchstaben für Ihre Register verwenden). Verwenden Sie dann Ctrl+r aund, Ctrl+r bum sie in die Such- und Ersetzungsfelder einzufügen.

Nicht für den Einzelnen Bruce, aber wenn Sie die Zeilen überprüfen möchten, bevor Sie sie ersetzen, fügen Sie einfach die folgende cOption hinzu:

:%s/find this line/replace with this/c

2

Sie können Vdie Zeile markieren, die Sie im visuellen Modus ersetzen möchten, und dann ppdrücken, um sie über dieser Zeile einzufügen.

Dies fügt nur einen Tastendruck hinzu, daher scheint es eine ziemlich gute Lösung zu sein.


Das geht nicht: Nach dem Einfügen enthält die Zwischenablage den Text, der vonV
daniel kullmann

Nur eine einzige p.
Aaron Thoma

2

Ich benutze den c"change" -Befehl ziemlich häufig für diese Art von Dingen, kombiniert mit der regulären Suche. Sie können die Datei nach jeder Zeile / jedem Textabschnitt durchsuchen, an dem Sie interessiert sind, und dann aufeinanderfolgende n.Befehle verwenden ( nfür die nächste und dann .die letzte Änderung wiederholen).

/^hello- finde eine Zeile, die mit hallo beginnt;
c$goodbye- Ändern Sie die Zeile auf Wiedersehen;
n.- Suche wiederholen, Änderung wiederholen

Wenn Sie die Zeile in eine bereits in der Datei vorhandene ändern möchten, können Sie sie einfach in Ihren Eingabepuffer kopieren (vorausgesetzt, Ihre GUI lässt dies zu) und dann einfügen, um den Inhalt des ersten Änderungsbefehls abzurufen.

Wie bei allen Dingen, ist es eine gute Idee, viele Optionen in der Tasche zu haben, abhängig davon, welche Art von Bearbeitung Sie ausführen möchten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.