Springe zum nächsten Vorkommen des Wortes, das ich gerade geändert habe


11

Wenn ich folgendes habe:

function foo(bar) {
    return bar + 1;
}

Und ich cwändere das erste barin 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 barersten Mal gesucht habe, also nnicht 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 barin 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.


2
Das folgt nicht vollständig dem von Ihnen beschriebenen Workflow, aber vim-oblique verbessert die *Suche. Insbesondere wird *das aktuelle Wort visuell ausgewählt, ohne den Cursor zu bewegen. Sobald es installiert ist, können Sie *ciwdas alte Wort in das Suchregister einfügen und das Wort ändern. Dann können Sie nund verwenden ..
Statox

Durch Drücken von n gelangen Sie zum nächsten Vorkommen des zuletzt gesuchten Musters. Warum hast du das nicht versucht?
SibiCoder

... weil ich nicht gesucht habe, um zum ersten Vorkommen zu gelangen, also nnicht funktioniert.
Roger Lipscombe

Antworten:


13

Der Text, mit dem Sie gerade geändert haben, cwwurde in das unbenannte Register geschnitten, damit Sie ihn wiederverwenden können mit:

/<C-r>"<CR>

um zum nächsten Vorkommen des von Ihrer letzten Änderung abgedeckten Textes zu springen.


4

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.

  • : - Da Sie sich im visuellen Modus befinden, wird dies :'<,'>
  • s/ - Finden
  • CTRL+ "- letztes Element ziehen / löschen (Balken im Beispiel)
  • / - und ersetzen
  • CTRL+ .- letzte Einfügung (baz im Beispiel)

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."


1

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 platzieren

nmap <leader>a "1yiw:let @/=@1^Mciw

in Ihrer .vimrcDatei. Beachten Sie, dass dies ^M eine Erfassung der Eingabetaste ist und nicht der Zeichen ^und M. Sie erhalten es, indem Sie im Einfügemodus Ctrl+ drücken V, gefolgt von Enter. Wenn dies definiert ist, <leader>awird das Drücken genauso ausgeführt wie cw, 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 dann cw. Das nmap <leader>a "/yciwwar 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 das 1Register zu ziehen, dann das /Register gleich zu setzen und dann zu tun cw. So "1yiwist der Teil, der das innere Wort unter dem Cursor in das Register zerrt 1. Wenn Sie nichts über innere Wörter wissen, können Sie auschecken :help iw. Anschließend :let @/=@1folgt eine Erfassung von Entersetzt den Inhalt des 1Registers in die /. An diesem Punkt nundNfunktioniert als nächstes und vorheriges Vorkommen des Wortes unter dem Cursor, und dann ciwwird 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 iwstatt wüberall verwendet. Wenn dies nicht der Fall ist, sollten Sie verwenden

nmap <leader>a "1yw:let @/=@1^Mcw

stattdessen. 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 Ersetzen iwvon iW, ib, isoder ipoder etwas (obwohl ich weiß nicht , warum würden Sie möchte diese Funktion mit ganzen Sätzen)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.