vim - wie kann ich ein 'Änderungswort' unter Verwendung des aktuellen Einfügepuffers erstellen?

86

Ich habe Text in meinem ywEinfügepuffer , z. B. habe ich ein (Ruckwort) und jetzt habe ich 'foo' in meinem Puffer.

Ich gehe jetzt zum Wort "Leiste" und möchte es durch meinen Pastenpuffer ersetzen.

Um den Text manuell zu ersetzen, kann ich cwdas neue Wort eingeben.

Wie kann ich ein 'Änderungswort' erstellen, aber den Inhalt meines Einfügepuffers verwenden, anstatt das Ersatzwort manuell einzugeben?

Die beste Option, die ich derzeit habe, ist, an den Anfang des Wortes zu springen, das ich ersetzen und tun möchte dw(Wort löschen), dann an die andere Stelle zu gehen und das yw(Ruckwort) zu tun , und dann zum Ersetzungsbereich zurückzukehren und zu tun p(Einfügen), was etwas umständlich ist, besonders wenn sie sich nicht auf demselben Bildschirm befinden.

Michael Durrant
quelle

Antworten:

120

Option 1

Sie können dazu Register verwenden und eine Tastenkombination für den Prozess erstellen.

Reißen Sie das Wort, durch das Sie ersetzen möchten yw.

Das gezerrte Wort befindet sich in dem 0Register, das Sie durch Ausgabe sehen können :registers.

Gehen Sie zu dem Wort, das Sie ersetzen möchten, und führen Sie es aus cw. Do Ctrl+ rgefolgt von, 0um das 0Register einzufügen .

Die Map dafür würde ungefähr so ​​aussehen (vorausgesetzt, Ctrl+ ist junsere Tastenkombination):

:map <C-j> cw<C-r>0<ESC>

Option 2 (einfacher)

Bewegen Sie den Cursor mit gedrückter Maustaste über das Wort, das Sie ersetzen möchten viwp. Welches ist visuelle Auswahl inneres Wort und Einfügen.

Mit freundlicher Genehmigung von @tlo in den Kommentaren: Könntest du auch einfach machen vep. Ein Zeichen kürzer. Downside muss den Cursor am Wortanfang positionieren und (wie bei mir) den Puffer wechseln.

Kommentar (von Michael):

Das ist gut. Zusätzlicher Hinweis: Die zweite Methode ist in der Tat einfacher, funktioniert jedoch nur für EINE Ersetzung, da der Puffer nach jeder Ersetzung in das Feld geändert wird, das ersetzt wurde (alter Text). Die erste Methode ist etwas schwieriger zu verwenden, hat aber den Vorteil, dass der Puffer 0 unverändert bleibt, sodass Sie mit dieser Methode mehr als 1 Ersetzung desselben Texts durchführen können.

jmathew
quelle
14
Option 3 (noch einfacher): Fahren Sie mit gedrückter Maustaste über das erste Zeichen des Wortes, das Sie ersetzen möchten vep.
Bis zum
Ich mag Option 3, wenn nur 1 Wort zu ändern ist. Wenn mehr als ein Wort geändert werden muss, kann ich mit Option 1 das verwenden. Operator, um es zu wiederholen ..
typelogic
3
ve"0pwürde arbeiten, um Sie Ihre Änderung wiederholen zu lassen
JKillian
Wenn Sie es auf etwas abbilden möchten, ist es wahrscheinlich besser, es zu verwenden: map <C-j> ciw<C-r>0<ESC>Es spielt also keine Rolle, woher das Wort kommt, das Sie drücken ^j.
Paul Parker
Jeder, der wissen möchte, warum STRG-R magisch :help insertist, sucht nach STRG-R /CTRL-R. ve"0pSchauen Sie sich an, wie es funktioniert:help registers
Paul Parker,
12

ywBewegen Sie den Cursor zu dem Wort, das Sie ersetzen möchten, und "_dwlöschen Sie es mit, indem Sie den Text an das "Nullregister senden (damit der Inhalt des Registers nicht überschrieben wird, in dem Text mit Ruckeln / Ausschneiden standardmäßig verwendet wird) ) und dann einfach mit einfügen p.

Sie könnten die folgende Zuordnung verwenden, um die Dinge ein wenig einfacher zu machen:

nnoremap <leader>d "_d

... so können Sie im normalen Modus \dwein Wort löschen, ohne das "Register zu beeinflussen.

Übelsuppe
quelle
3

Um dies auf die VIM-Weise zu tun, verwenden Sie absichtlich die Register yank, delete und andere.

Register "0ist das Ameisenregister. Alles, was Sie reißen, wird hier abgelegt, aber das Löschen berührt niemals das Register "0.

In Ihrem Beispiel hatten Sie also gerade ein Wort gezerrt. Um ein Wort durch das zu ersetzen, was Sie gerade gezerrt haben, nutzen Sie Löschvorgänge, die das Zerrregister niemals berühren. So bewegen sich auf dem Zielwort, löschen Sie ihn mit dw, dann fügen Sie von Ihrem yank-Register mit "0p, oder besser noch, cwdann ^R0(was wiederholbar ist).

Ein enges Gegenteil zum Yank-Register ist das kleine Deletions-Register "-. Alle kleinen Lösch- oder Änderungsentfernungen werden hier abgelegt, aber die Amis berühren sich nie "-. Eine Löschung gilt als klein, wenn sie weniger als eine vollständige Zeile enthält.

Register "1- "9sind die Löschhistorienregister. Mit dem "1Enthalten der neuesten großen Löschung oder Änderungsentfernung und dem "9Enthalten der ältesten großen Löschung oder Änderungsentfernung. Nur nicht kleine Löschungen, dh Löschungen einer oder mehrerer Zeilen, werden auf "1- verschoben "9.

Bei jeder Operation, die ein Register ändert, wird eine Kopie auch immer im Standardregister (auch als unbenanntes Register bezeichnet) abgelegt "". Dies ist das Register, das verwendet wird, wenn Sie ein Register nicht explizit benennen.

Register "_ist das Register der Schwarzen Löcher und es ist immer leer. Wenn Sie es löschen, wird nichts in einem Register geändert, nicht einmal das Standardregister ""oder das Black-Hole-Register. Der entfernte Text ist abgesehen von Ihrem Rückgängig-Verlauf vollständig verschwunden. Das Ziehen an oder Einfügen aus dem Schwarzlochregister bewirkt im Wesentlichen nichts.

Mit dem Black-Hole-Register "_können Sie beispielsweise zuerst eine kleine Löschung, dann eine Reihe anderer Löschungen vornehmen, "_ohne das kleine Löschungsregister zu ändern "-, und dann Ihre erste kleine Löschung einfügen.

Andere Register sind das zuletzt eingefügte Register "., die Dateinamenregister "%und "#das Befehlsregister ":, das Suchregister "/und Ausdrucksregister "=.

Mit dem Befehl können Sie eine Liste aller dieser Register und ihrer Inhalte abrufen :register. Dieser Befehl ist sehr nützlich, um zu experimentieren und zu lernen, was wo landet.

00prometheus
quelle
2

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
2

Verwenden Sie den Befehl change, um das Einfügen zu wiederholen.

cw ^R0ESC (^ R = Strg + R; 0 für Register 0)

ersetzt das Wort durch den Inhalt aus reg. 0 und lassen Sie es uns mit wiederholen.

Dies ist ideal für cgn(VIM 7.4), um Suchmuster zu ersetzen:

  • Zuerst mit /oder suchen*
  • cgn ^R0ESC
  • .beim nächsten Spiel wiederholen oder nüberspringen
laktak
quelle
1

Da es noch nicht enthalten ist, ersetzen Sie normalerweise Zeichenfolgen durch :%s/.../.../und Sie können dies auch mit dem Wort unter Ihrem Cursor tun.

  1. Sie geben den ersten Teil des Befehls ein, wonach Sie suchen: :s/find/
  2. Dann klicken Sie <ctrl-r>und wählen mit dem Cursor das Wort aus, durch das Sie es ersetzen möchten.
  3. Dann klicken Sie auf <ctrl-w>(kleines "Wort") oder <ctrl-a>(großes "Wort), um das Wort unter dem Cursor in die Befehlszeile einzufügen
  4. Dann beenden Sie den Befehl.

Siehe den Link zum Verwenden von Cursor-Elementen in der Befehlszeile .

erikbwork
quelle
1

Normalerweise verwende ich diese: ywheftig zu ziehen foo, dann löschen Sie barmit dw, und als letzten Schritt legen fooaus dem Register , 0das Text mit gezerrt hält "0p. Wiederholen Sie das Einfügen mit Punkt ( .) nach Bedarf.

Anstelle von ywund dwkönnen Sie auch yiwund verwenden diw(beachten Sie das Extra i- es bedeutet innen ). Damit können Sie ein Wort an einer beliebigen Stelle innerhalb des Wortes ziehen oder löschen , nicht nur am Wortanfang.

Nino
quelle
0

Ich benutze dieses Plugin zum Erweitern der Auswahlregion: https://github.com/terryma/vim-expand-region

Meine Kombination zum Ändern eines Wortes ist also: vvpan jeder Stelle eines Wortes.

Ich habe auch einen Hack zum Speichern unbenannter Registerinhalte nach dem Einfügen, damit ich dies wiederholen kann.

vnoremap p p:let @"=@0 <CR>
vnoremap P P:let @"=@0 <CR>

(meine Zwischenablage ist automatisch ausgewählt)

user2656799
quelle
0

Ich verwende die folgende Tastenbelegung, um das aktuelle Wort durch ein kopiertes Wort zu ersetzen.
" replace with Register 0
map <leader>rr ciw<C-r>0<Esc>

yiwKopieren Sie ein Wort. Navigiere zu einem Wort. ,rrErsetzen Sie das Wort.
Anführerschlüssel ist Karte zu ,.

Fischer
quelle
,rwwürde mehr Sinn machen, und auf QWERTY ist ein smidgen wohl einfacher und schneller auszurüsten. Bei DVORAK habe ich gewählt ,rc, was zwar überhaupt keinen Sinn ergibt, aber einfacher und schneller ist als alle anderen. Auf DVORAK ,rwist eine Horrorshow;)
Paul Parker
0

Navigieren Sie zunächst zum Anfang des Wortes, das Sie ruckeln möchten. Wenn Sie in der Mitte des Wortes sind, gehen Sie einfach bzum Anfang zurück. Dann tun Sie ye, um das ganze Wort ohne Leerzeichen zu reißen ( yank bis end). Gehen Sie zum Schluss zu dem Wort, das Sie ersetzen möchten - vielleicht durch mehrmaliges Ausführen w- und gehen Sie zu a , um in den Modus vepfür die vtatsächliche Auswahl zu gelangen , wählen Sie den Endpunkt edes Wortes aus und püberprüfen Sie den zuletzt gezogenen Inhalt.

(Wenn jemand wissen will , warum ich nicht einfach auf der akzeptierten Antwort kommentieren, für die kleine Änderung der Verwendung yenicht yw, dann ist es , weil mein Ruf auf diesem Stapel noch zu niedrig ist.)

Anomalie
quelle
0
  1. Verwenden ywSie, um die Welt zu reißen, gehen Sie zu der Welt, die Sie ändern möchten.
  2. Verwenden Sie v, um die Welt auszuwählen, veoder vwje nach Ihrer Situation.
  3. Geben Sie pzu Paster der Welt , die Sie kopiert den ausgewählten Block zu ersetzen
Ramwin
quelle
0

Hinzufügen zu den anderen besseren Antworten. Ein bisschen zu offensichtlich, aber Sie können es einfach einfügen, bevor Sie es löschen. "yw" und dann das Wort, das Sie ersetzen möchten, "pldw" (Einfügen, ein Zeichen nach rechts bewegen, Wort löschen).

Ali Almoullim
quelle