vim поиск вокруг разрывов строк


12

Когда я редактирую документ LaTeX в vim, часто я хочу найти фразу. Поскольку у меня есть настройка LaTeX для переноса строк, иногда половина фразы будет на одной строке, а другая половина - на следующей. В таком случае поиск не находит то, что я ищу. Так например

blah blah blah hello
world blah blah blah

при поиске с помощью /hello worldя не могу найти то, что я ищу. Есть ли быстрый и простой способ изменить этот поиск, чтобы получить меня там, где я хочу быть? Или, что еще лучше, способ сообщить vim, что любой пробел (пробел, табуляция, новая строка) совпадает с пробелом в строке поиска?

Ответы:


14

После дополнительных поисков, похоже, самый простой способ сделать это с \_s. Так, например:

/hello\_sworld

4
hello\_s\+worldКонечно, вы можете захотеть, если между ними будет больше одного пробела.
Wodin

5

Эта проблема была решена по адресу http://vim.wikia.com/wiki/Search_across_multiple_lines . Включена функция, которая может делать то, что мне нужно.

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>

Затем вы можете выполнить многострочный поиск, :S hello worldи он преобразует это в hello\s\+worldи ищет его. Еще одна приятная особенность заключается в том, что это также добавит этот новый поиск в историю поиска. Это позволяет вам вернуться и изменить поиск, используя q/при необходимости. Он также может быть использован для замены :%s//new thing/g. Недостатком этого является то, что он не использует, incsearchесли у вас включен.


3

То, что я знаю, не сложно, но немного утомительно. Замените каждый пробел в вашем поисковом запросе следующим:

[ \t\n]\+

(Обратите внимание на пробел после [.) Это синтаксис соответствия регулярного выражения. Сломанный, это означает:

  • [...] означает совпадение с любым из символов в скобках.
  • \t это вкладка
  • \n это Newline
  • ...\+ означает совпадение с одним или несколькими из предыдущих.

Для получения дополнительной информации о регулярных выражениях вы можете спросить vim:

:help regexp
:help usr_27

1

Я бы лично использовал [ \t\n]*вместо пробелов. Это будет соответствовать нулю или более '', табуляции и новой строки. Таким образом, если один экземпляр вашего шаблона поиска охватывает разрыв строки, а другой - нет, оба будут сопоставлены.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.