Jak szukać linii pasujących do bieżącej linii w vimie

11

Zazwyczaj szukam słów według :/string, ale jeśli muszę przeszukać całą bieżącą linię, jak to zrobić.

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

Na przykład, jeśli cursorobecnie jest w line 1wyszukiwaniu podobnie jak w :/przypadku tekstu zawierającego całą bieżącą linię. Kursor powinien przejść następnie do pasowania line 4i ponownie doline 7

manav mn
źródło

Odpowiedzi:

7

Oto jak bym to zrobił:

  1. Wciągnij linię (do rejestru bez nazwy), bez dołączania nowego wiersza na końcu: 0y$
  2. Zainicjuj bardzo nomagiczne wyszukiwanie:/\V
  3. Dodaj szarpaną linię: <c-r>"
  4. Uruchom wyszukiwanie: <cr>

Jak wskazuje @EvergreenTree w komentarzu , możesz oczywiście utworzyć mapowanie, aby wykonać wszystkie kroki za jednym razem:

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

Odpowiednie tematy pomocy:

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

Uwaga: Jeśli szukana linia zawiera odwrotne ukośniki, nadal musisz przejść przez nie i uciec (dodając kolejny odwrotny ukośnik), nawet przy bardzo nomagicznym wyszukiwaniu.

Bogaty
źródło
4
Oczywiście możesz również utworzyć dla tego mapowanie: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree
9

Szczególnie do celów mapowania uważam, że używanie getline()bardziej eleganckie niż samodzielne szarpanie. Wywołanie getline()za pomocą łańcucha '.'zwraca linię pod kursorem. Istnieją dwie dobre opcje korzystania z tego:

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

który analizuje ciągi '/'i to, co jest zwracane getline()razem, i wykonuje to jako polecenie vim.

lub

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

który używa rejestru wyrażeń @=. Wyrażenie następujące =jest oceniane po pierwszym <CR>i umieszczane w wierszu poleceń.

Sakari Cajanus
źródło
Ładny! Gdy wiersz zawiera znak podobny /lub 'nie działa zbyt dobrze. W każdym razie dzisiaj się czegoś uczę! Dziękuję
Luc M
4

Osobiście dostałbym wtyczkę z gwiazdą wizualną ( jest ich niewiele ). Jest na ten temat przyjemny Vimcast: Wyszukaj zaznaczony tekst . Oznacza to, że możesz wizualnie wybrać linię, a następnie nacisnąć *.

Jeśli wtyczka nie jest twoją rzeczą, możesz dodać następujące mapowanie do swojego vimrc:

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

Uwaga: Visual-block ( <c-v>) nie jest obsługiwany dla tego mapowania.

Peter Rincker
źródło
Dodałem mapowania, ale tak naprawdę przeskakuje do pierwszego pasującego słowa i NIE wybiera całej linii.
manav mn
Jeśli pasuje do słowa, zakładam, że używasz *trybu normalnego lub nie masz poprawnie zainstalowanego mapowania.
Peter Rincker,
4

Wszystkie istniejące odpowiedzi kończą się niepowodzeniem, jeśli twoja linia zawiera pewne elementy, które są interpretowane jako część wzorca. \VPunkt dostaje większość drogi tam, ale nadal bałagan z odwrotnym ukośnikiem.

Spróbuj tego, aby uciec przed odwrotnym ukośnikiem ...

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

A jeśli używasz go do mapowania, będziesz potrzebować jednego lub dwóch <Enter>na końcu, w zależności od tego, jak chcesz, aby działał.

dash-tom-bang
źródło
Doskonała odpowiedź! Linie często zawierają oba rodzaje ukośników, które mylą inne odpowiedzi. Ten ostatni argument ucieczki powinien również zawierać ukośnik:escape(…, '/\')
bobbogo 15.01.19
2

Po zainstalowaniu vim-gwiazdka wystarczy użyć V$*(lub 0v$*), aby wybrać bieżącą linię i wyszukać ją.

W drugim poleceniu 0nie jest konieczne, jeśli kursor znajduje się już na początku linii.

adelarsq
źródło
1
Czy nie *szuka tylko słowa pod kursorem, a nie bieżącego wyboru wizualnego?
EvergreenTree
1
@EvergreenTree Nie zapomniałem wspomnieć o wtyczce. Dzięki za powiadomienie
adelarsq,
2

Jeszcze jednym sposobem na to jest użycie okna wiersza poleceń: yy/<Ctrl-F>p<Enter>

  • Wybierz całą linię, której potrzebujesz yy
  • Naciśnij, /a następnie Ctrl-F, aby otworzyć okno wiersza polecenia
  • Naciśnij, paby wkleić linię
  • Naciśnij Enter, aby rozpocząć wyszukiwanie
Borys Serebrow
źródło
5
Możesz także użyć q/tego samego efektu, co/<c-f>
evilsoup
2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes wskazuje, że rejestr wyszukiwania można ustawić bezpośrednio, w następujący sposób:

:let @/='/abc/def/ghi/'

Umożliwia to wyszukiwanie w wierszu i działa nawet wtedy, gdy wiersz zawiera ukośniki.

Aby wykonać, powiedzmy, \*mapę do wyszukiwania linii:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
Bernard Ogden
źródło