Gibt es in Vim / Vi einen Befehl, um den Cursor an das Ende einer Suchmarkierung zu bewegen?

83

Gibt es in Vim / Vi Befehle zum Verschieben innerhalb eines ausgewählten Suchsegments?

Wenn ich beispielsweise nach einem Wort suche, gibt es Befehle, um den Cursor an das Ende des hervorgehobenen Segments zu bewegen? Angenommen, ich habe ein Wort, "FishTaco", und ich möchte nach allen Instanzen von "Fish" suchen und danach etwas einfügen. Ich weiß, dass ich einen globalen Ersatz durchführen kann, aber was ist, wenn ich die Änderung nur in einigen nicht sequentiellen Instanzen vornehmen möchte?

Ich konnte sehen, wo es bequem wäre, den Cursor an das Ende des aktuell hervorgehobenen Segments zu bewegen, um eine Aktion auszuführen.

Jordan Parmer
quelle
3
Dies ist keine Antwort auf die Frage, aber um Ihr letztendliches Ziel zu erreichen, alle Fishdurch zu ersetzen FishTaco, können Sie dies tun :%s/Fish\(Taco\)\@!/&Taco/, indem Sie alle Fishnicht bereits gefolgt finden Tacound durch ersetzen FishTaco. Kombiniert eine Suche mit negativem Lookahead mit einer Ersetzung, die den übereinstimmenden Begriff gefolgt von enthält Taco.
Jim Stewart
@ JimStewart Ich habe keine Ahnung, warum dieser Kommentar nicht mindestens so viele +1 enthält wie die Antwort. Dies ist Ninja Level Vim.
Still.Tony

Antworten:

131

Sie können es damit machen:

/Fish/e

Am /eEnde steht der Cursor am Ende des Suchbereichs (standardmäßig anstelle des ersten Zeichens).

Tim
quelle
30
Beachten Sie, dass Sie + n oder -n hinzufügen können , um den Cursor n Zeichen vor oder nach dem Ende zu setzen.
Nathan Fellman
10
Beachten Sie, dass Sie, nachdem Sie die /FishSuche bereits durchgeführt haben, mit //eund von Vim 7.4 zum Ende springen können gn, um das gefundene Ergebnis visuell hervorzuheben.
Smathy
79

Wenn Sie Ihren Cursor nur nach dem letzten Zeichen von Fish platzieren möchten, können Sie verwenden

/Fish/e+1

Dadurch wird der Cursor nach dem h gesetzt. (Ohne das wird +1der Cursor links vom letzten Zeichen angezeigt.)

Wenn Sie besonders daran interessiert sind, den Cursor nach Fish zu platzieren, aber nur, wenn er in "FishTaco" angezeigt wird, können Sie eine der folgenden Optionen ausprobieren:

Sie können verwenden

/FishTaco/s+4

und Ihr Cursor landet zwischen Fish und Taco. Der /s+4Cursor wird 4 Stellen nach dem Start des Suchbegriffs platziert.

Sie könnten auch verwenden

/FishTaco/e-3

Dadurch wird der Cursor 3 Stellen links von der linken Seite des letzten (End-) Zeichens platziert.

Sie können auch verwenden

/FishTaco/b+4 

weil /b+4wird behandelt als /s+4.

Ghbarratt
quelle
13
Tolle Erklärung, aber jetzt habe ich nur noch Hunger.
Kenny
27

Wenn Sie bereits gesucht haben /Fish, können Sie die Suche schnell ändern, um zum Ende des Spiels über zu gelangen. //eDies wiederholt die letzte Suche, fügt jedoch den ebereits erläuterten Modifikator hinzu.

Ingo Karkat
quelle
1
Die // e + Nummer ist genau das, wonach ich gesucht habe! genial.
Arkod
12

/ long-regexp1 \zs long-regexp2 / Der Cursor stoppt bei \ zs , siehe: help \ zs

mosh
quelle
11

Sobald Sie eine visuelle Auswahl getroffen haben, können Sie odie Cursorposition zwischen dem Anfang und dem Ende des ausgewählten Blocks umschalten. Bei der Auswahl zeilenweise schaltet dies die Linie Position, bewegt sich der Cursor zum Starten und Beenden Zeile der Auswahl bedeutet aber nicht zum Starten oder Beenden Charakter. Wenn die Auswahl zeichenweise ist, ist die Bewegung auch zeichenweise.

Sie können auch verwenden , `<und `>den Cursor zwischen Anfang und Ende des visuellen Block zu wechseln, was jedoch selbst die Auswahl betrifft, so ist es verwendet wird , zurückgesetzt oder die Auswahlgrenzen einzustellen.

Bearbeiten: Ah, aber für Suchhighlights funktioniert dies nicht, da eine oZeileneinfügung eingeleitet wird. Ich denke, das Suchhighlight ist nicht dasselbe wie eine visuelle Auswahl, sorry :)

kprobst
quelle
Das wusste ich auch nicht. Dies ist ideal, um den Anfang einer Auswahl zu ändern, ohne von vorne zu beginnen. (zB Sie haben die Auswahl ein Wort zu früh oder zu spät begonnen)
Timothée Boucher
8

Der Teil "Cursor am Ende des Spiels" Ihrer Frage ist bereits beantwortet.

Das kannst du machen :%s/Fish/FishTaco/c. Dies gibt Ihnen die Möglichkeit, jede Ersetzung zu bestätigen oder abzulehnen und das gesamte Geschäft "Cursor am Ende des Spiels" zu überspringen.

romainl
quelle
Super Tipp. Wenn ich 'y' eingebe, wird der Austausch nur beim ersten Mal durchgeführt. Wie kann ich es für jeden bestätigen lassen?
Jordan Parmer
1
Es geht zum nächsten Spiel und wartet darauf, dass Sie tippen yoder nso weiter, bis keine Übereinstimmungen mehr vorhanden sind. Um alle weiteren Ersetzungen zu akzeptieren a, geben Sie ein, um sie abzulehnen, geben Sie ein q.
Romainl
1
Eigentlich fehlte mir das gnach dem Finale, /so dass es in meiner Linie nicht weiterging. Danke für den Tipp.
Jordan Parmer