So ersetzen Sie inneren Text durch gezerrten Text

17

Ein Schnittmuster, auf das ich häufig stoße, ist das folgende: Ich möchte einen Textabschnitt in Anführungszeichen oder Klammern setzen und diesen Textabschnitt in ein anderes Paar von Anführungszeichen / Klammern setzen.

Wenn ich zum Beispiel den Klassennamen kopieren foo barund an einer anderen Stelle einfügen möchte :

<span class="foo bar">

<div class="this-should-be-replaced-with-foo-and-bar">

Was ich weiß, ist yi"Folgendes : Wenn ich mich in der Klasse des Spans bewege, ziehe ich den Text in den Anführungszeichen.

Jetzt habe ich das in meinem Register, also sollte ich den Klasseninhalt des div damit ersetzen können. Aber ich kann keinen praktischen Weg finden, dies zu tun.

Wenn ich dies benutze ciw, überschreibe ich mein Register mit dem zu ändernden Inhalt, sodass ich meinen zerrissenen Text verliere.

Das Beste, was ich mir einfallen lassen kann, ist, zum ersten Zitat der Klasse des Div zu wechseln, zu schlagen pund dann zum nächsten Zitat mit zu streichen dt".

Normalerweise vermassle ich meine Position und füge sie irgendwo in die Anführungszeichen ein, um die beiden Zeichenfolgen zu verschmelzen, und es bringt die Dinge durcheinander.

Ich hoffe, dass es eine Möglichkeit gibt, die Kombination "Ersetzen Sie den inneren Text bitte durch meinen zerrissenen Inhalt", um dies zu vereinfachen.

jurgenb
quelle

Antworten:

19

Sie können vi"pim Inneren verwenden "". Dies kann Text in der Ruckliste ersetzen. Daher ist es wichtig, wenn Sie den ursprünglichen Rucktext mehrmals verwenden möchten.

BEARBEITEN : Zusätzliche Informationen von Octaviour bezüglich der mehrfachen Verwendung:

Um das zu tun, würde ich zu einem benannten Register ziehen, das die zwei Befehle macht: "ayi"und und vi""apwenn Sie Register verwenden a.

grodzik
quelle
2
Ich werde auf diese Lösung näher eingehen. Sie ziehen zuerst den Text, den Sie kopieren möchten. Dann gehen Sie zu der Stelle, an der Sie einfügen möchten, und wählen sie visuell mit vi "aus. Ein Einfügebefehl setzt nun gleichzeitig den Inhalt des unbenannten Registers an den Cursor und löscht den ausgewählten Text. Damit erreicht vi" p genau das, was Sie wollen, aber Es ersetzt den Inhalt des unbenannten Registers und verhindert, dass Sie denselben Text zweimal einfügen. Zu diesem Zweck würde ich in ein benanntes Register ziehen, das die beiden Befehle "ayi" und "vi" ap ausführt, wenn Sie das Register a verwenden.
Octaviour
Vielen Dank für die Ausarbeitung. Es hilft, Dinge mit vim Bewegungen zu formulieren, es macht es leichter, sich später zu erinnern. Es ist immer noch nicht so einfach, wie ich es mir erhofft hatte, aber es macht auf eine vim Weise Sinn. Es scheint jedoch nicht zu funktionieren, den Punktbefehl zu verwenden, um ihn zu wiederholen und ein zweites Mal schnell zu ersetzen. Ich hoffte, das wäre eine Abkürzung. :)
Jürgenb
11

Sie können das nummerierte Register verwenden. Zuerst mit "Foo-Bar" ziehen yi", die das "0Register füllen wird , siehe :h "0. Dann machen Sie ci"<c-r>0mit dem Inhalt des Registers 0 zu ersetzen.

Siehe :h i_CTRL-Rfür eine Beschreibung des letzten Teils.

Karl Yngve Lervåg
quelle
2
Warum nicht einfach in das unbenannte Register ziehen ( yi") und es aus dem Register einfügen, in dem 0es gespeichert ist, nachdem Sie den zu ändernden Text gelöscht haben ( ci"<c-r>0)? In Bezug auf Vimgolf gewinnst du 2 Tastenanschläge und spielst nicht mit deinen Registern herum.
statox
Sobald ich 'a'
drücke, lande
@ n3wjack Das ist wahrscheinlich , weil Sie nicht gedrückt haben CTRL+rvor a, das ist , was <c-r>bedeutet.
statox
1
@ KarlYngveLervåg Stellt ciwden gelöschten Text tatsächlich in das unbenannte Register, aber die Register werden verschoben, deshalb müssen Sie <c-r>0anstelle von verwenden <c-r>". Sehen :h quote_number.
statox
1
Ich würde genauer gesagt denken, dass es hier nicht um das unbenannte Register geht, sondern um das nummerierte Register. Das "0Register wird nur durch den Befehl yank gefüllt und wird zB nicht gestört c.
Karl Yngve Lervåg
8

Ich brauche das so oft, dass ich ein Plugin geschrieben habe, um die maximale Geschwindigkeit zu vereinfachen und zuzulassen: ReplaceWithRegister .

Dieses Plugin bietet einen Zwei-in-Eins- grBefehl, der Text, der von einem {motion} / text-Objekt, einer ganzen Zeile oder der aktuellen Auswahl abgedeckt wird, durch den Inhalt eines Registers ersetzt. Der alte Text wird im Black-Hole-Register gelöscht, dh er ist weg. Es behandelt transparent viele Eckfälle und ermöglicht eine schnelle Wiederholung über den Standardbefehl .. Sollte es Ihnen nicht gefallen, finden Sie auf der Seite Links zu Alternativen.

Ingo Karkat
quelle
Groß! Das sollte Vanille sein.
Philipp Moers
8

Hier ist eine andere Lösung. Es ist nicht das beste in Bezug auf Vimgolf, aber es verwendet das Black-Hole-Register:

Sobald Sie an der foo barSaite angelangt sind, können Sie sie normal mit reißen yi".

Dann in den Klammern ändern: "_di"P

Welches ist:

"_       We will use the black hole register
di"      Delete the inner brackets and put the deleted text in the black hole register
P        Put the previously yanked text

Der Vorteil des Black Hole Registers ist, dass es Ihre anderen Register nicht durcheinander bringt. Sehen Sie :h quote_für weitere Details.

(Beachten Sie, dass diese Antwort nur hier ist, um über das Blackout-Register zu sprechen. Ich persönlich verwende die visuelle Auswahl, wie von @grodzik vorgeschlagen.)

statox
quelle
Ich denke, Sie brauchen einen Großbuchstaben Pdafür. Wenn Sie di"den Cursor auf die letzten Anführungszeichen setzen und danach peinfügen, wird wie Pvor der aktuellen Position eingefügt.
Jecxjo
@jecxjo Das stimmt, ich habe meine Antwort bearbeitet, danke!
statox