VIM Wort durch Inhalt des Einfügepuffers ersetzen?

110

Ich muss eine Reihe von Wortersetzungen in einer Datei durchführen und möchte dies mit einem vi-Befehl tun, nicht mit einem EX-Befehl wie :%s///g. Ich weiß, dass dies die typische Art ist, das Wort an der aktuellen Cursorposition zu ersetzen. cw<text><esc>Aber gibt es eine Möglichkeit, dies mit dem Inhalt des unbenannten Registers als Ersatztext zu tun, ohne das Register zu überschreiben?

plong
quelle
8
ENTSCHLIESSUNG: Für meinen unmittelbaren Bedarf habe ich 12yl12 Zeichen gezogen und "_cw^r0ein Wort ersetzt. Ich konnte dann den .Befehl verwenden, um das Ersetzen in der gesamten Datei zu wiederholen.
Plong

Antworten:

127

Ich denke mit "Einfügen" meinst du das unbenannte Register (yank / put / change / delete / replace), oder? (Da dies derjenige ist, der durch den Änderungsbefehl überschrieben wird.)

Die Register werden in der Regel festgelegt , indem Sie "dann den Namen (Zeichen) des Registers, wie "aydann "apheftig zu ziehen in dem Register a, dann den Inhalt des Registers setzen a. Gleiches gilt für einen Änderungsbefehl. In diesem Fall können Sie das Schwarzlochregister verwenden, wenn Sie nicht möchten, dass der mit dem Befehl change entfernte Text irgendwohin geht "_: "_cw. Sobald Sie sich im Einfügemodus befinden, können Sie Strg-R drücken, gefolgt von dem Register, das Sie (wahrscheinlich ") in den Inhalt dieses Registers einfügen möchten .

  • "* - Auswahlregister (Einfügen der mittleren Taste)
  • "+ - Zwischenablage-Register (wahrscheinlich auch mit Strg-Umschalt-V über das Terminal zugänglich)
  • "" - vims Standardregister (unbenannt) ruckeln / setzen / ändern / löschen / ersetzen.

Kurze Antwort: "_cw^R"

Bearbeiten: Wie andere vorschlagen, können Sie natürlich ein anderes Register für den Ruck (oder was auch immer) verwenden, der Ihren Text in das Standardregister gebracht hat. Sie denken jedoch nicht immer zuerst daran, daher ist es schön, einen einzelnen Änderungsbefehl auszuführen, ohne ihn wegzublasen. Obwohl es nicht total weggeblasen ist. Es gibt die nummerierten Register "0durch "9:

Vim füllt diese Register mit Text aus Ruck- und Löschbefehlen.

Das nummerierte Register 0 enthält den Text des letzten Yank-Befehls, es sei denn, der Befehl hat ein anderes Register mit ["x] angegeben.

Das nummerierte Register 1 enthält den Text, der durch den letzten Lösch- oder Änderungsbefehl gelöscht wurde, es sei denn, der Befehl hat ein anderes Register angegeben oder der Text ist kleiner als eine Zeile (das kleine Löschregister wird dann verwendet). Eine Ausnahme gilt für den Operator delete mit diesen Bewegungsbefehlen aus: %, (, ), `, /, ?, n, N, {und }. Das Register "1 wird dann immer verwendet (dies ist Vi-kompatibel). Das Register" - "wird auch verwendet, wenn sich das Löschen innerhalb einer Zeile befindet.

Mit jedem aufeinanderfolgenden Löschen oder Ändern verschiebt Vim den vorherigen Inhalt von Register 1 in Register 2, 2 in 3 usw. und verliert den vorherigen Inhalt von Register 9.

Cascabel
quelle
1
Okay, denkst du, ich habe schon genug von den Dokumenten in den Registern in meine Antwort kopiert? Es ist alles da unter :help registers.
Cascabel
48

Mit den Informationen in diesem Beitrag habe ich diese nützliche Zuordnung erstellt. Ich habe 'cp' gewählt, weil es "Paste ändern" bedeutet.

nmap <silent> cp "_cw<C-R>"<Esc>

BEARBEITEN:

Auch ich ging noch einen Schritt weiter und unterstützte jede Bewegung.

Um das Äquivalent des obigen Befehls zu erhalten, wäre es cpwfür "Einfügewort ändern"

"This allows for change paste motion cp{motion}
nmap <silent> cp :set opfunc=ChangePaste<CR>g@
function! ChangePaste(type, ...)
    silent exe "normal! `[v`]\"_c"
    silent exe "normal! p"
endfunction
ostler.c
quelle
Das <silent> führt dazu, dass es bei mir nicht funktioniert ... eine Idee, warum das so ist? Ich bin ein n00b bei Mappings & Funktionen.
Hollister
Das einzige Problem dabei ist, dass Sie kein Register zum Einfügen auswählen können ... aber in diesem Fall könnten Sie einfach STRG + R
Steve Vermeulen
2
Es gibt vielleicht einen besseren Weg, um Registernamen hinzuzufügen, aber das Folgende funktioniert für mich: nmap <silent> cp :let g:currentRegister=v:register<cr>:set opfunc=ChangePaste<CR>g@ function! ChangePaste(type, ...) silent exe "normal! `[v`]\"_c".getreg(g:currentRegister) endfunction
Steve Vermeulen
@eventualEntropy Dies funktioniert gut zum Ersetzen von Zeilen. Wie kann ich diese Funktion für Wörter anstelle von Zeilen verwenden? Ich lerne immer noch vim. Danke für die Hilfe.
Xavitoj Cheema
@XavitojCheema Ich erinnere mich nicht einmal daran, diesen Kommentar abgegeben zu haben, haha. Aber wie sich herausstellt, habe ich seitdem ein Plugin geschrieben, um diese Funktionalität bereitzustellen ( github.com/svermeulen/vim-easyclip )
Steve Vermeulen
27

Sie können hierfür den visuellen Modus von vim verwenden. zB ein Wort kopieren: yeund dann ein anderes mit dem kopierten Wort überschreiben:vep

Ste
quelle
9
Dies funktioniert, es sollte jedoch auch beachtet werden, dass das visuelle Einfügen den Ruck-Puffer für den neu gelöschten Text überschreibt.
ostler.c
24

Wenn sich Ihr Cursor auf dem Wort befindet, das Sie durch den Inhalt des unbenannten Registers ersetzen möchten, können Sie verwenden viwp. vwechselt in den visuellen Modus, iwwählt das innere Wort aus und psetzt den Inhalt des Registers an seine Stelle.

Wenn ich in der Praxis ein Wort (Funktionsname usw.) durch ein anderes ersetzen muss, gehe ich zu dem einen, um es als Ersatz zu verwenden, yiwum das innere Wort in das unbenannte Register zu ziehen , und gehe dann zu dem Wort I '. m ersetzen und viwpersetzen. Ziemlich schnelle Möglichkeit, ein Wort durch ein anderes zu ersetzen. Wenn Sie ( /) nach dem Wort gesucht haben, das Sie ersetzen, um dorthin zu gelangen, können Sie einfach drücken n, um zum nächsten Vorkommen zu gelangen, das Sie ersetzen müssen. Natürlich kein Ersatz für die Verwendung :%s/find/replace/g, aber für ein paar schnelle Ersetzungen kann es nützlich sein, insbesondere wenn Sie das neue Wort bereits in einem Register haben.

Travis Northcutt
quelle
4
Ich bin überrascht, dass dies nicht die akzeptierte Lösung ist: Alle oben genannten sind zwar in einigen Randfällen flexibler , aber viel ausführlicher , wenn Sie einfach das aktuelle unbenannte Register gegen eine Auswahl irgendwo austauschen. Dies ist die Situation des Originals Fragesteller kam hierher für.
ELLIOTTCABLE
1
Dies ist sehr nützlich und intuitiv.
Lacostenycoder
6

Wenn Sie ein benanntes Register verwenden (z. B. verwenden "ayoder "adusw., um Ihr Einfügeregister zu füllen), können Sie so etwas tun

cw<CTRL-R>a<esc>

Welches wird das Wort durch den Inhalt des Registers ersetzen a. Soweit ich das beurteilen kann, können Sie das Standardregister nicht verwenden, da cwes dann mit dem Wort gefüllt wird, das von diesem Befehl geschnitten wurde.

Daniel Vandersluis
quelle
Sie können das Standardregister verwenden! Schau dir meine Antwort an.
Cascabel
2

Meinen Sie den System-Einfügepuffer oder das vi-Register?

Wenn Sie den Systempaste-Puffer verwenden möchten, sind Sie in Ordnung und könnten dies tun dw"+P- Sie "wählen ein Register und "+sind der System-Paste-Puffer.

Andernfalls kopieren Sie in das nicht standardmäßige Register, "ayum beispielsweise in das Register zu kopieren aund dann etwas zu ersetzendw"aP

Hamish Downer
quelle
Danke, Hamish. Ich habe das versucht, dwlösche aber nach dem, was ich als "Wort" betrachten würde , nachgestellte Leerzeichen, während cwnur das Wort geändert wird. Aus diesem Grund dwwird für mich nicht funktionieren.
Plong
In diesem Fall desollte es für Sie funktionieren - es wird bis zum Ende dieses Wortes dwgelöscht , während es bis zum Anfang des nächsten Wortes gelöscht wird.
Hamish Downer
1

Sie können ywdas Wort ziehen, dann können Sie das Wort mit dem gezogenen Wort ändern, indem vipwSie das Wort ziehen und das zuvor gezogene Wort einfügen.

Jewgenij York
quelle
0

Sie können dafür Register verwenden:

Erster Platz Ersatztext im Register <mark some text>"ay

Wo aist der Registername?

dann können Sie dieses Register als Ersatz verwenden

ve"ap

Lollinus
quelle
Leider konnte ich den letzten Einfügevorgang nicht einfach über wiederholen ., was eine andere Sache war, die ich tun wollte. Trotzdem danke. Sehr geschätzt.
Plong
0

Oder Sie könnten Shift+ v- p(wählen Sie die gesamte Zeile aus und fügen Sie sie an ihrer Stelle ein)

Elimirks
quelle
1
oder pdw ... Liebst du vim nicht? : P
elimirks