Vim - Text auswählen, der durch die Suche hervorgehoben wird?

53

In der Praxis führe ich häufig Suchvorgänge durch, um zu einem Wort oder einer Phrase zu springen, anstatt dort mit zu navigieren h/j/k/l. Dann habe ich getroffen, num zwischen den Ereignissen zu hüpfen.

Angenommen, ich habe folgenden Text:

Time flies like an arrow; fruit flies like a banana. - Groucho Marx

Ich tippe /an arrowund drücke Enter. Dieser Satz wird hervorgehoben, und ich springe mit zu ihm n.

Jetzt möchte ich diesen Text visuell auswählen , möglicherweise ändern oder löschen. (Ja, mir ist der :sErsetzungsbefehl bekannt.)

Da sich mein Cursor am Anfang eines Pfeils auf dem Buchstaben "a" befindet, kann ich ein paar Mal vdrücken e, um die gesamte Phrase hervorzuheben. Aber ich habe das Gefühl, dass es einen kürzeren und semantischeren Weg gibt. Immerhin habe ich den Text, der mich interessiert, bereits angegeben.

Wie kann ich einen Befehl erstellen, der besagt, dass die aktuelle Suchauswahl visuell ausgewählt wird?

Nathan Long
quelle

Antworten:

38

Sie können gnab Version 7.4 (und gNzum Zurückgehen) verwenden. Es ersetzt den v//eTrick.

Suchen Sie vorwärts nach dem zuletzt verwendeten Suchmuster, wie mit `n`, und starten Sie den visuellen Modus, um die Übereinstimmung auszuwählen.

Weitere Informationen finden Sie in :help gnoder in diesem Vimcast .

David Lord
quelle
Dies dupliziert einen Kommentar zu einer anderen Antwort und ist in der jetzigen Form nicht sehr nützlich. Es ist möglicherweise eine gute Idee, wenn Sie die Dokumentation zitieren, damit Ihre Antwort für sich allein steht.
bwDraco
2
Freut mich, die Antwort besser zu machen, aber ich bin mir nicht sicher, ob das helfen würde. Die Frage legt das Ziel gngenau fest ("das nächste Suchergebnis visuell auswählen") und erfüllt genau die gestellten Anforderungen. Wenn Sie es als separate Antwort einreichen, wird betont, dass es ein vollständiger Ersatz für ist v//e. Ich habe gerade meine Antwort bearbeitet, um Dokumentation hinzuzufügen. Ist das besser?
David Lord
Das ist gut, danke. Wenn Sie Hilfe benötigen, lesen Sie unbedingt die Tour und das Hilfezentrum . Willkommen bei Super User, und wir hoffen, dass Sie Ihren Aufenthalt genießen.
bwDraco
1
Fantastisch! Vielen Dank für die Aktualisierung dieses Threads mit den neuesten und besten. :)
Nathan Long
29

Versuche dies:

/an arrow
v//e

Es geht in den visuellen Modus, wiederholt die letzte Suche und wählt bis zum Ende.

Dennis Williamson
quelle
1
Ab Vim 7.4 gnfunktioniert dies auch (ohne die nMittel zu ändern )
smathy
8

Ich habe festgestellt, dass dies v//eallein nicht ausreicht, da der Cursor nach dem Verlassen des visuellen Modus beim Springen zum nächsten / vorherigen Suchergebnis am Ende des Ergebnisses und nicht am Anfang steht, wie Sie es normalerweise erwarten würden.

Um dies zu beheben, sollten wir zuerst an das Ende des Suchergebnisses springen ( //e) und dann visuell an den Anfang auswählen ( v??):

" visually select a search result
nnoremap g/ //e<Enter>v??<Enter>

Prost.

Sunaku
quelle
Für Symmetrie: nnoremap g? ??b<cr>v//e<cr>(macht dasselbe, sucht aber rückwärts statt vorwärts)
Kyle Strand
2

Es gibt jetzt ein Vim-Search-Objects-Plugin , mit dem Vim Such-Übereinstimmungen als normale Textobjekte behandelt, sodass Sie va/nach einer Suche einfach eine Übereinstimmung visuell auswählen können.

Sunaku
quelle
1

Eine "dumme" Möglichkeit, dies zu tun, besteht darin, eine Taste (in diesem Fall F5) wie folgt zuzuordnen:

nnoremap <F5> v/<c-r>=strpart(@/,1) . '/e+1'<CR><CR>

Nachdem Sie /an arrowF5 gedrückt haben.

Johnny
quelle
Das wählt ein Zeichen mehr wegen der +1. Lassen Sie das weg und es wird nur der Teil ausgewählt, nach dem gesucht wurde. Auf der anderen Seite nnoremap <F5> v//e<CR>scheint es gut zu funktionieren.
Dennis Williamson
@Dennis Williamson, + 1 ist erforderlich, um genau auszuwählen, wonach gesucht wurde. Wenn Sie +1 entfernen, wird das letzte Zeichen nicht ausgewählt, da das Zeichen nicht ausgewählt wird, auf dem sich der Cursor befindet. Auf jeden Fall ist nnoremap <F5> v // e <CR> viel besser.
Johnny
Es wählt den Charakter für mich aus. Wenn ich xoder drücke, cnachdem ich dies getan habe, wird F5jedoch ohne die +1gesamte Suchzeichenfolge, einschließlich des Zeichens unter dem Cursor, gelöscht.
Dennis Williamson
@Dennis Williamson, ich habe gerade erfahren, dass meine Auswahloption auf "exklusiv" gesetzt ist, aber der Standardwert ist "inklusive". Deshalb hat es bei Ihnen auch ohne +1 geklappt. (Siehe: Hilfe Auswahl)
Johnny