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?
110
12yl
12 Zeichen gezogen und"_cw^r0
ein Wort ersetzt. Ich konnte dann den.
Befehl verwenden, um das Ersetzen in der gesamten Datei zu wiederholen.Antworten:
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"ay
dann"ap
heftig zu ziehen in dem Registera
, dann den Inhalt des Registers setzena
. 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
"0
durch"9
:quelle
:help registers
.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
cpw
für "Einfügewort ändern"quelle
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
Sie können hierfür den visuellen Modus von vim verwenden. zB ein Wort kopieren:
ye
und dann ein anderes mit dem kopierten Wort überschreiben:vep
quelle
Wenn sich Ihr Cursor auf dem Wort befindet, das Sie durch den Inhalt des unbenannten Registers ersetzen möchten, können Sie verwenden
viwp
.v
wechselt in den visuellen Modus,iw
wählt das innere Wort aus undp
setzt 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,
yiw
um das innere Wort in das unbenannte Register zu ziehen , und gehe dann zu dem Wort I '. m ersetzen undviwp
ersetzen. 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ückenn
, 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.quelle
Wenn Sie ein benanntes Register verwenden (z. B. verwenden
"ay
oder"ad
usw., um Ihr Einfügeregister zu füllen), können Sie so etwas tuncw<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, dacw
es dann mit dem Wort gefüllt wird, das von diesem Befehl geschnitten wurde.quelle
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,
"ay
um beispielsweise in das Register zu kopierena
und dann etwas zu ersetzendw"aP
quelle
dw
lösche aber nach dem, was ich als "Wort" betrachten würde , nachgestellte Leerzeichen, währendcw
nur das Wort geändert wird. Aus diesem Grunddw
wird für mich nicht funktionieren.de
sollte es für Sie funktionieren - es wird bis zum Ende dieses Wortesdw
gelöscht , während es bis zum Anfang des nächsten Wortes gelöscht wird.Sie können
yw
das Wort ziehen, dann können Sie das Wort mit dem gezogenen Wort ändern, indemvipw
Sie das Wort ziehen und das zuvor gezogene Wort einfügen.quelle
Sie können dafür Register verwenden:
Erster Platz Ersatztext im Register
<mark some text>"ay
Wo
a
ist der Registername?dann können Sie dieses Register als Ersatz verwenden
ve"ap
quelle
.
, was eine andere Sache war, die ich tun wollte. Trotzdem danke. Sehr geschätzt.Oder Sie könnten Shift+ v- p(wählen Sie die gesamte Zeile aus und fügen Sie sie an ihrer Stelle ein)
quelle