vim 围绕换行符搜索

vim 围绕换行符搜索

当我在 vim 中编辑 LaTeX 文档时,我经常想要搜索一个短语。因为我有 LaTeX 设置来换行,有时一半的短语会在一行上,而另一半在下一行上。在这种情况下,搜索找不到我要查找的内容。例如

blah blah blah hello
world blah blah blah

使用 搜索时/hello world,我找不到我要找的东西。有没有一种快速简便的方法来修改此搜索以到达我想要的位置?或者更好的是,有一种方法告诉 vim 将任何空白(空格、制表符、换行符)与搜索字符串中的空格相匹配?

答案1

经过更多搜索,看起来最简单的方法是使用\_s.例如:

/hello\_sworld

答案2

这个问题已在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是换行符
  • ...\+表示匹配前面的一个或多个。

有关正则表达式的更多信息,您可以询问 vim:

:help regexp
:help usr_27

答案4

我个人会使用[ \t\n]*而不是空格。这将匹配零个或多个“ ”、制表符和换行符。这样,如果搜索模式的一个实例跨越换行符,但另一个实例没有跨越换行符,则两者都会匹配。

相关内容