当我在 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]*
而不是空格。这将匹配零个或多个“ ”、制表符和换行符。这样,如果搜索模式的一个实例跨越换行符,但另一个实例没有跨越换行符,则两者都会匹配。