Gvim按块搜索

时间:2011-08-22 23:21:51

标签: search vim block

我想知道Gvim是否有某种方法可以通过“阻止”浏览搜索结果。 “块”在每一行中都有搜索模式。因此命令应该从第1行导航到第5行,n + 1,n + 4,依此类推。它应该忽略连续行(A块!)中发生的匹配并跳转到下一个块。如果有某种方法来定义“无图案块”的大小

Line 1: Pattern
Line 2: Pattern
Line 3: Pattern
Line 4: 
Line 5: Pattern
---- No Pattern here ----
Line n+1: Pattern
Line n+2: 
Line n+3: 
Line n+4: Pattern
Line n+5: Pattern

3 个答案:

答案 0 :(得分:0)

当然,我不记得vim是否具有进行多线匹配的能力。如果是,您可以在搜索模式中指定换行符。在Perl中,这看起来像这样(我在没有查找多行正则表达式的情况下快速推出了这个,所以我可能有一些语法错误,但它足够接近作为一个例子)。

/(pattern)(\n(pattern)*){4}/m

这将寻找'pattern',然后是4行,可能包含也可能不包含'pattern'。

这个问题是如果你有两个重叠的块,我认为这个搜索会混淆。

你可以做的另一件事是定义一个将搜索的vim宏,然后向下移动5行。

使用+ q +定义宏,然后使用+ @ +执行。因此,对于“搜索模式块”示例,使用“t”,您可以执行以下操作:

<esc>qt   # start macro 't' 
/pattern  # search for 'pattern'
5j        # move down 5 lines
<esc>q    # end macro

然后,您将从文档顶部开始,反复按“@t”

答案 1 :(得分:0)

可以使用两种不同的策略来描述您对块的定义。 首先,可以设计搜索模式以匹配第一行 一个块,即与模式匹配但不跟随一条线的线 匹配相同的模式。

/\%(\1\n\)\@<!\(pattern\)

其次,可以搜索与模式匹配的几个后续行。 但要跳过整个块以便找到下一个匹配项,则需要它 将光标放在匹配的块的末尾。

/\(pattern\)\%(\n\1\)*/e

就个人而言,我更喜欢第一种解决方案。

答案 2 :(得分:0)

你可以为此折叠。

折叠包含最后搜索模式的连续行块:

:se fdm=expr foldenable foldexpr=getline(v:lnum)=~@/

现在您可以使用常规折叠导航

  • zM - 关闭所有折叠
  • zR - 打开所有折叠
  • zj 向下移动一次, zk 向上移动一次

  • zcdd 将当前块拖入默认寄存器