如何在 Vim 中使用一个命令/搜索模式在下一次出现 bar
之后找到第一次出现的 Foo
?
例如:假设我有一些类似的文字:
<块引用>酒吧,酒吧,酒吧,我真是个野蛮人。
...
Foo:那个酒吧供应德国啤酒。
酒吧酒吧和酒吧,酒吧太多了。
Foo:无关。
...bla
然后是下一个栏。
如何在粗体条之间跳转?
答案 0 :(得分:3)
我还没有想出结合以下两种方法的方法,但它们独立地回答了您的两个请求。
:norm /Foo^M/bar^M
其中 ^M
不是直接键入的,您必须按 ctrl
(或在我的情况下为 ctrl+shift
),然后按 v
,然后按 m
。 ^M
表示输入/返回按钮,因此您基本上是在一行中进行两次单独的搜索。因为它们是分开的,所以执行 n
或 N
向前或向后移动只会在 bar
之间向前和向后移动,无论它们是否在 Foo
之后。这导致:bar
之后的下一个 Foo
。您可以通过录制宏来做到这一点。按 q
然后按字母存储宏开始录制,然后您可以进行 /Foo
搜索,然后是 /bar
搜索。再次按 q
停止录音。现在您只需执行 @a
,其中 a
是您选择的字母,这将使您在下一个 bar
之后进入下一个 Foo
。您可以重复该命令以继续向前搜索,也可以创建另一个宏来向后搜索。答案 1 :(得分:3)
你可以这样做:
/Foo/;/bar
但“最后一个模式”将是 bar
所以这不能用 n
、N
等重复,这意味着你必须做一次然后做 { {1}},这可能会也可能不会满足您的需求。
请注意,一旦跳到第二场比赛,您可以执行 /<Up><CR>
跳回第一场,执行 ``
跳回第二场,依此类推。
参见 ``
和 :help :;
。
使用单个模式,因此可以使用 :help ``
、n
等重复,您可以:
N
哪里……
/Foo\_.\{-}\zsbar
匹配下一个 /Foo
,Foo
匹配任何字符,包括 EOL,尽可能少,\_.\{-}
开始实际匹配,丢弃之前的内容,\zs
。参见 bar
、:help \_.
和 :help \{
。