Gvim按块搜索

问题描述 投票:2回答:3

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

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
search vim block
3个回答
0
投票

您可以为此折叠。

折叠包含最后搜索的图案的连续行块:

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

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

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

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


0
投票

放手,我不记得vim是否具有进行多行匹配的能力。如果是这样,则可以在搜索模式中指定换行符。在Perl中,这看起来像是这样(我已经在不查找多行正则表达式的情况下快速将其剔除了,因此我可能在语法上有些误解,但是它足够接近以作为示例)。

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

这将查找'pattern',然后是可能包含或不包含'pattern'的4行。

问题是,如果有两个重叠的块,我认为此搜索将变得混乱。

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

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

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

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


0
投票

[可以使用两种不同的策略来翻译您对Vim正则表达式中的一个块。首先,可以将其设计为与块的第一行,即与模式匹配但后面没有与该模式匹配的行。

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

第二,可以搜索与模式,但是,为了跳过整个块以查找下一个发生时,光标将在匹配时放在块的末尾。

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

个人,我更喜欢前一种解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.