So suchen Sie nach Zeilen, die mit der aktuellen Zeile in vim übereinstimmen


11

Normalerweise suche ich nach Wörtern nach :/string, aber wenn ich die gesamte aktuelle Zeile durchsuchen muss, wie geht das?

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Zum Beispiel, wenn cursores derzeit line 1darum geht, ähnlich wie :/nach Text zu suchen, der die gesamte aktuelle Zeile enthält. Der Cursor sollte dann zum Matching line 4und wieder zum springenline 7

Antworten:


7

So würde ich es machen:

  1. Ziehen Sie die Zeile (in das unbenannte Register), ohne die neue Zeile am Ende einzufügen: 0y$
  2. Initiieren Sie eine sehr nomagische Suche:/\V
  3. Fügen Sie die gezogene Linie hinzu: <c-r>"
  4. Feuern Sie die Suche ab: <cr>

Wie @EvergreenTree in einem Kommentar hervorhebt , können Sie natürlich ein Mapping erstellen, um alle Schritte auf einmal auszuführen:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Relevante Hilfethemen:

:help registers
:help /magic
:help c_CTRL-R

Hinweis: Wenn die gesuchte Zeile Backslashes enthält, müssen Sie diese auch bei einer sehr nomagischen Suche noch durchgehen (durch Hinzufügen eines weiteren Backslashs) .


4
Natürlich können Sie auch ein Mapping dafür erstellen: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree

9

Besonders für Mapping-Zwecke finde ich die Verwendung getline()eleganter als das Ziehen selbst. Wenn Sie getline()mit einer Zeichenfolge '.'aufrufen, wird die Zeile unter dem Cursor zurückgegeben. Es gibt zwei gute Möglichkeiten, dies zu verwenden:

:exec '/' . getline('.')

Das analysiert die Zeichenfolgen '/'und was von getline()zusammen zurückgegeben wird und führt dies als vim-Befehl aus.

oder

/<C-r>=getline('.')<CR>

welches das Ausdrucksregister verwendet @=. Der folgende Ausdruck =wird nach dem ersten ausgewertet <CR>und in die Befehlszeile eingefügt.


Nett! Wenn die Zeile zeichenähnlich enthält /oder 'nicht sehr gut funktioniert. Jedenfalls lerne ich heute etwas! Vielen Dank
Luc M

4

Persönlich würde ich ein Visual Star Plugin bekommen ( es gibt nur wenige da draußen ). Dazu gibt es einen schönen Vimcast: Suche nach dem ausgewählten Text . Dies bedeutet, dass Sie die Linie visuell auswählen und dann drücken können *.

Wenn ein Plugin nicht Ihr Ding ist, können Sie Ihrem Mapping die folgende Zuordnung hinzufügen vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Hinweis: Visual-block ( <c-v>) wird für diese Zuordnung nicht unterstützt.


Ich habe die Zuordnungen hinzugefügt, aber tatsächlich springt es zum ersten übereinstimmenden Wort und wählt NICHT die gesamte Zeile aus.
Manav Mn

Wenn es mit einem Wort übereinstimmt, *gehe ich davon aus, dass Sie es aus dem normalen Modus verwenden oder das Mapping nicht richtig installiert haben.
Peter Rincker

4

Die vorhandenen Antworten schlagen alle fehl, wenn Ihre Zeile bestimmte Elemente enthält, die als Teil eines Musters interpretiert werden. Der \VPunkt kommt den größten Teil des Weges dorthin, bringt aber immer noch den Backslash durcheinander.

Versuchen Sie dies, um den Backslashes zu entkommen ...

/\V<C-R>=escape(getline('.'), '\')

Und wenn Sie es in einem Mapping verwenden, benötigen Sie <Enter>am Ende ein oder zwei Sekunden, je nachdem, wie es funktionieren soll.


Hervorragende Antwort! Zeilen enthalten oft beide Arten von Schrägstrichen, die die anderen Antworten verwirren. Das letzte Argument der Flucht sollte aber auch einen Schrägstrich beinhalten:escape(…, '/\')
Bobbogo

2

Mit vim-Sterne gerade installiert verwenden V$*(oder 0v$*) die aktuelle Zeile zu wählen und danach suchen.

Im zweiten Befehl 0ist dies nicht erforderlich, wenn sich der Cursor bereits am Zeilenanfang befindet.


1
*Sucht nicht nur nach dem Wort unter dem Cursor und nicht nach der aktuellen visuellen Auswahl?
EvergreenTree

1
@EvergreenTree Ich habe vergessen, das Plugin zu erwähnen. Vielen Dank für die Benachrichtigung
Adelarsq

2

Eine weitere Möglichkeit, dies zu tun, ist die Verwendung des Befehlszeilenfensters: yy/<Ctrl-F>p<Enter>

  • Ziehen Sie die ganze Linie, die Sie brauchen yy
  • Drücken Sie /und dann Strg-F, um das Befehlszeilenfenster zu öffnen
  • Drücken Sie pzum Einfügen der Zeile
  • Drücken Sie die Eingabetaste, um die Suche zu starten

5
Sie können auch verwenden q/, um den gleichen Effekt zu erzielen wie/<c-f>
evilsoup

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.