vim szukaj wokół podziałów linii

12

Kiedy edytuję dokument LaTeX w vimie, często chcę wyszukać frazę. Ponieważ mam konfigurację LaTeX do zawijania linii, czasami połowa frazy będzie w jednej linii, a druga połowa w następnej. W takim przypadku wyszukiwanie nie pozwala znaleźć tego, czego szukam. Na przykład

blah blah blah hello
world blah blah blah

podczas wyszukiwania za pomocą /hello worldnie znajduję tego, czego szukam. Czy istnieje szybki i łatwy sposób zmodyfikować to wyszukiwanie, aby dostać się tam, gdzie chcę być? A może jeszcze lepiej, aby powiedzieć vimowi, aby dopasował dowolne białe spacje (spację, tabulator, nową linię) do spacji w ciągu wyszukiwania?

Bryan Ward
źródło

Odpowiedzi:

15

Po dalszych poszukiwaniach wygląda na to, że najłatwiej to zrobić \_s. Na przykład:

/hello\_sworld
Bryan Ward
źródło
4
Oczywiście możesz chcieć, aby hello\_s\+worldmiędzy nimi była więcej niż jedna biała spacja.
Wodin
5

Ten problem rozwiązano na stronie http://vim.wikia.com/wiki/Search_across_multiple_lines . Zawarta jest funkcja, która może zrobić to, czego potrzebuję.

function! SearchMultiLine(bang, ...)
  if a:0 > 0
    let sep = (a:bang) ? '\_W\+' : '\_s\+'
    let @/ = join(a:000, sep)
  endif
endfunction
command! -bang -nargs=* -complete=tag S call SearchMultiLine(<bang>0, <f-args>)|normal! /<C-R>/<CR>

Następnie możesz przeprowadzić wyszukiwanie wieloliniowe za pomocą, :S hello worlda to przekonwertuje je hello\s\+worldi wyszuka. Kolejną fajną funkcją jest to, że doda to nowe wyszukiwanie do historii wyszukiwania. Dzięki temu możesz cofnąć i zmodyfikować wyszukiwanie, używając w q/razie potrzeby. Można go również wykorzystać do zastąpienia :%s//new thing/g. Wadą tego jest to, że nie działa, incsearchjeśli masz włączone.

Bryan Ward
źródło
3

To, co znam, nie jest trudne, ale jest trochę nudne. Zastąp wszystkie spacje w zapytaniu następującym:

[ \t\n]\+

(Zwróć uwagę na spację po [.) Jest to składnia dopasowywania wyrażeń regularnych. W rozbiciu oznacza:

  • [...] oznacza dopasowanie dowolnej z listy znaków w nawiasach.
  • \t jest Tab
  • \n jest Newline
  • ...\+ oznacza dopasowanie jednego lub więcej poprzednich.

Aby uzyskać więcej informacji na temat wyrażeń regularnych, możesz zapytać vima:

:help regexp
:help usr_27
Jander
źródło
1

Osobiście użyłbym [ \t\n]*zamiast spacji. To dopasuje zero lub więcej „”, tabulatora i nowej linii. W ten sposób, jeśli jedno wystąpienie wzorca wyszukiwania obejmuje podział linii, a inne nie, oba zostaną dopasowane.

alesplin
źródło