vim在换行符周围搜索


12

当我在vim中编辑LaTeX文档时,通常我想搜索一个短语。因为我有LaTeX设置来换行,所以有时短语的一半会在一行上,而另一半则在下一行。在这种情况下,搜索找不到我想要的东西。所以举个例子

blah blah blah hello
world blah blah blah

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

Answers:


14

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

/hello\_sworld

4
当然,您可能想hello\_s\+world知道它们之间是否可以有多个空格字符。
Wodin 2011年

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

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

:help regexp
:help usr_27

1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.