Wenn ich folgendes habe:
function foo(bar) {
return bar + 1;
}
Und ich cw
ändere das erste bar
in baz
, wie springe ich zum nächsten Matching bar
, damit ich .
die gleiche Änderung vornehmen kann ?
Ich kann es nicht verwenden *
, da das unter dem Cursor nach dem aktuellen Wort sucht und ich dummerweise nicht zum bar
ersten Mal gesucht habe, also n
nicht funktioniert.
Gibt es eine einfache Möglichkeit, nach dem nächsten Vorkommen des Wortes zu suchen, wie es war, bevor ich es geändert habe?
Ich möchte nicht suchen und ersetzen, weil entweder andere Vorkommen bar
in meiner Datei vorhanden sind, die ich nicht ändern möchte, oder weil es nur zwei Instanzen von gab bar
, die ich :%s/bar/baz/
vor dem Start vergessen habe, und das ist auch so viel Aufwand, um die einzige verbleibende Instanz zu ändern.
*
Suche. Insbesondere wird*
das aktuelle Wort visuell ausgewählt, ohne den Cursor zu bewegen. Sobald es installiert ist, können Sie*ciw
das alte Wort in das Suchregister einfügen und das Wort ändern. Dann können Sien
und verwenden.
.n
nicht funktioniert.Antworten:
Der Text, mit dem Sie gerade geändert haben,
cw
wurde in das unbenannte Register geschnitten, damit Sie ihn wiederverwenden können mit:um zum nächsten Vorkommen des von Ihrer letzten Änderung abgedeckten Textes zu springen.
quelle
Romainl als kompletten Workflow erweitern ...
Wenn Sie mehr daran interessiert sind, eine solche Bearbeitung durchzuführen, und dann feststellen, dass Sie dieselben Änderungen auf einen Absatz / eine Funktion anwenden müssen, können Sie die Register
"
und verwenden.
.In Ihrem Beispiel können Sie die erste Bearbeitung des Arguments durchführen. Wenn Sie in den visuellen Modus wechseln (ich würde Visual Line verwenden, um sicherzustellen, dass Sie alles richtig auswählen) und dann ein Suchen und Ersetzen anwenden.
V]] - Visuelle Linie bis zum Ende des Absatzes / der Funktion.
:'<,'>
Es dauert eine Weile, bis Sie sich an dieses Muster gewöhnt haben, da Sie es verwenden müssen. Meistens möchten Sie das Suchen und Ersetzen nur auf die gesamte Funktion einschließlich des Arguments anwenden, aber es ist eine gute Möglichkeit, das Anti-Pattern nicht auszuführen. "Arbeiten Sie, stellen Sie fest, dass Sie es besser hätten machen sollen, machen Sie es rückgängig und wiederholen Sie es." korrekt."
quelle
Wenn es Ihnen nichts ausmacht, eine andere Kombination als zu drücken
cw
, können Sie meiner Meinung nach leicht das bekommen, was Sie wollen, indem Sie eine Verknüpfung definieren. Was Sie tun können, ist Folgendes zu platzierenin Ihrer
.vimrc
Datei. Beachten Sie, dass dies^M
eine Erfassung der Eingabetaste ist und nicht der Zeichen^
undM
. Sie erhalten es, indem Sie im Einfügemodus Ctrl+ drücken V, gefolgt von Enter. Wenn dies definiert ist,<leader>a
wird das Drücken genauso ausgeführt wiecw
, aber jetzt befindet sich das Wort (vor der Änderung) in Ihrem "letzten Suchregister" (dh dem/
Register). Drücken nSie also, nachdem Sie die Änderung vorgenommen und zurückgegeben haben Im normalen Modus gelangen Sie zum nächsten Ereignis. Ebenso Ngelangen Sie durch Drücken von zum vorherigen Vorkommen.Die Verknüpfung Sie können natürlich eine andere Verknüpfung als wählen
<leader>a
, aber ich finde nur, dass dies eine sehr leicht zugängliche Verknüpfung ist. Persönlich habe ich mich so eingestellt<leader>
,,
dass ich nur drücken muss, ,gefolgt von a, aber das liegt daran, dass ich keine amerikanische Tastatur benutze, so dass meine \etwas versteckt ist (ich glaube, das \ist die Standardeinstellung<leader>
).Erklärung Die Idee ist wirklich einfach. Ziehen Sie das Wort unter dem Cursor in das Suchregister
/
und tun Sie es danncw
. Dasnmap <leader>a "/yciw
war mein Ziel, aber ich glaube leider nicht, dass Sie in das Suchregister ziehen können. Die Problemumgehung besteht darin, das Wort unter dem Cursor in das1
Register zu ziehen, dann das/
Register gleich zu setzen und dann zu tuncw
. So"1yiw
ist der Teil, der das innere Wort unter dem Cursor in das Register zerrt1
. Wenn Sie nichts über innere Wörter wissen, können Sie auschecken:help iw
. Anschließend:let @/=@1
folgt eine Erfassung von Entersetzt den Inhalt des1
Registers in die/
. An diesem Punkt nundNfunktioniert als nächstes und vorheriges Vorkommen des Wortes unter dem Cursor, und dannciw
wird a ausgeführt, so dass das Wort unter dem Cursor gelöscht und Vim in den Einfügemodus versetzt wird.Wort gegen inneres Wort Mir wurde gerade klar, dass ich davon ausgegangen bin, dass Sie das gesamte Wort unter dem Cursor haben wollten, und nicht nur vom Standpunkt des Cursors und weiter. Deshalb habe ich
iw
stattw
überall verwendet. Wenn dies nicht der Fall ist, sollten Sie verwendenstattdessen. Befindet sich der Cursor auf dem ersten Buchstaben des Wortes, gibt es keinen Unterschied.
Haftungsausschluss Diese Lösung wird wahrscheinlich auch nicht, wenn Sie versuchen , es zu verwenden , um auf etwas , das Zeug unterscheidet sich von Buchstaben enthält, zum Beispiel , indem Sie auf ein den Cursor Stand mit
\
oder durch Ersetzeniw
voniW
,ib
,is
oderip
oder etwas (obwohl ich weiß nicht , warum würden Sie möchte diese Funktion mit ganzen Sätzen)quelle