Vim:在匹配另一个模式后搜索第一个匹配项

时间:2021-03-16 16:02:05

标签: search vim

如何在 Vim 中使用一个命令/搜索模式在下一次出现 bar 之后找到第一次出现的 Foo

例如:假设我有一些类似的文字:

<块引用>

酒吧,酒吧,酒吧,我真是个野蛮人。

...

Foo:那个酒吧供应德国啤酒。

酒吧酒吧和酒吧,酒吧太多了。

Foo:无关。

...bla

然后是下一个

如何在粗体​​之间跳转?

2 个答案:

答案 0 :(得分:3)

我还没有想出结合以下两种方法的方法,但它们独立地回答了您的两个请求。

  1. 如何使用一个命令查找第一次出现::norm /Foo^M/bar^M 其中 ^M 不是直接键入的,您必须按 ctrl(或在我的情况下为 ctrl+shift),然后按 v,然后按 m^M 表示输入/返回按钮,因此您基本上是在一行中进行两次单独的搜索。因为它们是分开的,所以执行 nN 向前或向后移动只会在 bar 之间向前和向后移动,无论它们是否在 Foo 之后。这导致:
  1. 如何移动到 bar 之后的下一个 Foo。您可以通过录制宏来做到这一点。按 q 然后按字母存储宏开始录制,然后您可以进行 /Foo 搜索,然后是 /bar 搜索。再次按 q 停止录音。现在您只需执行 @a,其中 a 是您选择的字母,这将使您在下一个 bar 之后进入下一个 Foo。您可以重复该命令以继续向前搜索,也可以创建另一个宏来向后搜索。

答案 1 :(得分:3)

想到的第一种方式(简单但不可重复)

你可以这样做:

/Foo/;/bar

但“最后一个模式”将是 bar 所以这不能用 nN 等重复,这意味着你必须做一次然后做 { {1}},这可能会也可能不会满足您的需求。

请注意,一旦跳到第二场比赛,您可以执行 /<Up><CR> 跳回第一场,执行 `` 跳回第二场,依此类推。

>

参见 ``:help :;

想到的第二种方式(更复杂但可重复)

使用单个模式,因此可以使用 :help ``n 等重复,您可以:

N

哪里……

  • /Foo\_.\{-}\zsbar 匹配下一个 /Foo,
  • Foo 匹配任何字符,包括 EOL,尽可能少,
  • \_.\{-} 开始实际匹配,丢弃之前的内容,
  • 我们想成为\zs

参见 bar:help \_.:help \{

相关问题