如何在 vim 中搜索字符串,从而忽略任何字符之间的任何空格(或特别是换行符)?
并可能因此创建一个可以忽略所有空白进行搜索的函数。
我找到了一种忽略正则表达式中空格的方法。没有真正优雅。只需\s*
在任意字符之间插入即可。因此,真正需要将其作为一个函数。
https://stackoverflow.com/questions/4590298/how-to-ignore-whitespace-in-a-regular-expression-subject-string
我还找到了一种在 vim 中搜索换行符的方法:
vim 围绕换行符搜索
但是,只有当换行符中有空格时,最后一个链接才会提供解决方案。但是我想忽略所有空白。
所以当我在这里搜索 helloworld 时:
blabla blalba hell
oworld bla bla h
elloworl bla bla
尽管有换行符,它应该匹配两次。
我想我基本上需要稍微改变一下 vim 链接的功能,将搜索更改为:
h\n?e\n?l\n?l\n?o\n? \n?w\n?o\n?r\n?l\n?d
或者:
h\s_?e\s_?l\s_?l\s_?o\s_? \s_?w\s_?o\s_?r\s_?l\s_?d
但我不知道如何改变这个功能。
答案1
这搜索视觉选择的文本Vim Tips Wiki 上的主题有一个映射,可以搜索当前的视觉选择,而不管单词之间的空白数量和类型。您可以像使用内置映射一样使用它*
来搜索(忽略空格)当前选择。非常便利!
但是,您希望对空白更加漠不关心,允许在文本中的任何位置换行(和其他空白?)。这也是有可能的。您可以使用以下命令调整当前搜索模式(存储在寄存器中/
,可通过 Vimscript 访问@/
):
:let @/ = join(split(@/, '\zs'), '\_s*')
第split()
一个将当前(文字)搜索切割为单个字符列表(因此它无法与现有的正则表达式内容一起正常工作,例如\+
或\|
!),然后join()
将其返回到一起\_s*
(匹配任意数量的空格),并分配它返回到搜索寄存器。
您可以根据该 ( ) 构建映射:nnoremap <Leader>/ :let ...<CR>
,或将其合并到上面提到的视觉模式映射中。
答案2
这个解决方案https://stackoverflow.com/questions/20053907/how-can-i-get-vim-find-to-ignore-whitespace指出可能适合您的情况的视觉解决方案。