Vim reißt / ersetzt in einer Sequenz

8

Ziel

  • Ziehen Sie eine Zeile, und verwenden Sie sie, um "einige" der folgenden Zeilen zu überschreiben.

Annahme

In diesem Fall ist es vorzuziehen, manuell auszuwählen, auf welche Zeilen die Ersetzung angewendet werden soll. d. automatisiertes Suchen und Ersetzen ist nicht erwünscht .

Analogie

Stellen Sie sich diesen Prozess so vor, als würden Sie aus einer Textzeile einen "Stempel" erstellen und eine Liste von Elementen durchgehen, wobei jedes Element eine Textzeile nach der "Stempel" -Zeile ist und entscheidet, ob diese Zeile überschrieben werden soll Inhalt des "Stempels" oder nicht. Ist dies der Fall, ersetzen Sie die Zeile durch den "Stempel".

Der letzte Schritt, nämlich das Löschen / Ersetzen der Zeile unter dem Cursor mit dem Inhalt des Stempels auszulösen, sollte so einfach wie möglich sein, vorzugsweise so einfach wie das Drücken von . (wiederhole die letzte Änderung) oder @@ (führe den Inhalt des Makroregisters @) aus.

Problem

Der einfache Workflow von:

  • Positionierung des Cursors auf der zu kopierenden Zeile (mit Bewegungsbefehlen)
  • V (zeilenweise den visuellen Modus starten)
  • y (Text in unspezifiziertes Register verschieben)
  • Setzen Sie den Cursor manuell auf die zu ersetzende Linie (mit Bewegungsbefehlen)
  • V (zeilenweises Starten des visuellen Modus) (um den zu ersetzenden Text auszuwählen)
  • p (den Text nach dem Cursor in das nicht angegebene Register setzen)

funktioniert nicht, wenn es mehrmals angewendet wird.

Insbesondere ersetzt das Ersetzen des Textes das Register, das die anfänglich kopierte Zeile enthält und als "Stempel" verwendet werden soll.

Was ich versucht habe

Ich habe versucht, "_y entweder yank oder delete in named Register "Unterstrich" zu verwenden, den Verlust des Inhalts des Stempels zu vermeiden, aber ich suche nach etwas, das endet schnell und bequem zu tippen, wie ich manuell durch die Liste gehen und Ersatz anwenden, wo ich es für richtig halte.

Was ich lieber nicht verwenden würde

Ich habe dafür eher keine Makros oder "Remaps" verwendet, wenn ich helfen kann.

Illustrative Beispieldatei

Sehen Sie die Beispiel-Startdatei unten, gefolgt von der gewünschten Endstufe, für weitere Klarheit.

Beispieldatei, Startbedingung

In diesem Stadium wähle ich blueberry und mache es zu meinem "Stempel".

%Vor%

Beispieldatei, gewünschter Endzustand

Nachdem ich durch die Liste gegangen bin, habe ich einige Ersetzungen angewendet, indem ich den "Stempel" "oben" einiger Zeilen benutzt habe, so dass sie mit der "Stempel" -Zeile übereinstimmen.

> %Vor%     
Robottinosino 22.09.2012, 20:15
quelle

6 Antworten

2

Damit Ihr Workflow wie erwartet funktioniert, müssen Sie das vorherige Ziehregister "0 anstelle des Standardregisters einfügen.

Verwenden Sie also Vy (oder yy , das ist das gleiche), um die erste Zeile wie zuvor zu ziehen, positionieren Sie dann den Cursor über die Zeile, die Sie ersetzen möchten, und führen Sie

aus %Vor%

Dies ersetzt die aktuelle Zeile durch den zuvor gezogenen Text, überschreibt jedoch den gerippten Text nicht. Ich hoffe ich habe dich richtig verstanden!

BEARBEITEN 1: Wiederholen mit einem Makro

Ich war überrascht, dass dieser Vorgang mit . nicht wiederholbar ist, aber das liegt vermutlich an der Verwendung des visuellen Modus. Um den Vorgang mit einem Makro zu wiederholen, tun Sie Folgendes:

%Vor%

Das Makro kann dann durch Drücken von @q oder @@ wiederholt werden.

EDIT 2: Wiederholen mit .

Hier ist ein Versuch, es mit . wiederholbar zu machen, indem der visuelle Modus nicht verwendet wird. Nachdem Sie die Stempel -Zeile gezogen und den Cursor bewegt haben, tun Sie Folgendes:

%Vor%

verwendet den Befehl% code% des Befehls imsert mode, um den Inhalt des Registers <c-r> einzufügen. Beachten Sie, dass 0 erforderlich ist, da die Stempelzeile einen Zeilenumbruch enthält. Wenn dies nicht der Fall ist (d. H. Das Löschen mit <delete> anstelle von y$ ), kann yy weggelassen werden.

    
Prince Goulash 22.09.2012, 20:31
quelle
1

Ich denke nicht, dass Sie Ihr Ziel erreichen werden, ohne zumindest ein bisschen "neu zu kartieren".

Ich benutze diese für eine "lange" Zeit:

%Vor%

p und P arbeiten immer noch wie gewohnt und ich treffe einfach ,p über eine visuelle Auswahl, wenn ich dieselbe Paste später wiederholen möchte. Sie könnten auch eine einzelne Funktionstaste zuordnen, um das Ganze schneller zu machen.

Wissen Sie auch über das c Flag für Ersetzungen?

%Vor%

fragt nach der Bestätigung für jedes Spiel.

    
romainl 22.09.2012 21:22
quelle
1

Man kann auf Ex-Befehle zurückgreifen, um den besagten Workflow zu erreichen.

Bei einer einzelnen Substitution ziehen Sie die Zeile "Stempel" (mit yy , Vy , :y oder jeden anderen Befehl) und führen Sie

aus %Vor%

Da dieser Befehl ein Ex ist, kann er leicht mit @: wiederholt werden, es sei denn ein anderer Ex-Befehl wurde bereits ausgegeben (in diesem Fall würde dieser Befehl) stattdessen wiederholt werden).

    
ib. 23.09.2012 05:57
quelle
0

Beginnen Sie mit dem Cursor am Anfang der zu duplizierenden Zeile:

  1. y$ , um die gesamte Zeile zu ziehen (mit Ausnahme des Zeilenvorschubs).
  2. j und k , um zur nächsten zu ersetzenden Zeile zu wechseln (bei Bedarf wiederholen)
  3. Ersetzen Sie die Zeile durch Ihren gerippten Text
    • C<c-r>0<esc>0 (erstmalig)
    • . (Folgezeiten)
  4. Wenn mehr Zeilen ersetzt werden sollen, gehen Sie zu 2.

Der Cursor bleibt nach jedem Schritt in der Spalte Null.

    
Trevor Powell 23.09.2012 00:24
quelle
0

Viele Antworten hier umreißen die allgemeinen Schlüssel oder Befehle. Ich habe sie in mein ReplaceWithRegister-Plugin umgeändert, das auch viele Corner-Cases behandelt und dies schnell ermöglicht Wiederholen Sie den Vorgang mit dem Befehl . . Ich benutze auch häufig die von Ihnen beschriebene Methode create stamp and replace und fand mein Skript unentbehrlich. Sollte es Ihnen nicht gefallen, hat die Plugin-Seite auch Links zu alternativen Plugins.

    
Ingo Karkat 23.09.2012 09:24
quelle
0

Eine wirklich einfache Lösung: Fügen Sie einfach dieses Skript in Ihre .vimrc ein und schalten Sie dann das Nebeneffekt-Verhalten des Löschschlüssels aus, indem Sie "(zwei Kommata)" eingeben, um den Modus "Keine Nebenwirkungen" einzugeben .

In diesem Modus funktioniert Ihr Workflow nun genau so, wie Sie es beschrieben haben: Ziehe alles, was du willst, und wähle dann aus, füge und lösche frei und wiederholt - dein Puffer bleibt immer intakt. Geben Sie dann ,, erneut ein, wenn Sie das normale bufferändernde Verhalten von vim wiederherstellen möchten.

Das Skript ist die akzeptierte Antwort hier:

vim schaltet das Pufferüberschreibverhalten beim Löschen um

    
Magnus 03.10.2012 14:48
quelle

Tags und Links