循环通过vim获得的线:g

时间:2013-08-22 09:40:41

标签: vim

我在vim中使用:g命令。有没有办法直接跳转(一个接一个,类似于:cn)到:g找到的行?

:h :g似乎不包含此类设施。

3 个答案:

答案 0 :(得分:3)

这取决于你对:g做了什么。

如果您的:g命令未更改匹配的模式,则可以按n转到下一个匹配的行。

但如果您更改了模式,例如您执行:g/foo/d:g/foo/s/foo/bar/g后,在您发出:g命令后,这些行不会出现在那里。然后再也无法到达那条线。

答案 1 :(得分:2)

连续跳转到模式匹配的常用方法是使用普通搜索,而不是全局命令。对于连续匹配,这是/<pattern>,然后是n

全局命令:g用于在非连续行上运行另一个命令。对于一组连续的线,范围就足够了。例如::1,5<command>

但是,如果由于某种原因你需要使用全局命令,或者只是为了记录,有一种方法可以使用:g做你想做的事。

来自Vim的帮助:

When using "global" in Ex mode, a special case is using ":visual" as a
command.  This will move to a matching line, go to Normal mode to let you
execute commands there until you use |Q| to return to Ex mode.  This will be
repeated for each matching line.  While doing this you cannot use ":global".
To abort this type CTRL-C twice.

要查看完整故事:h multi-repeat

所以,一步一步,它将是:

  • 进入ex模式(按Q)。

    这类似于命令行模式,但在命令执行后您不会返回正常模式,并且您不必键入前导:。要从此处返回正常模式,请使用:visual

  • 运行全局命令执行:visual子命令。这是:g/<pattern>/visual

    这将使您进入每场比赛的正常模式。每次,您都可以使用所有vim的力量来完成匹配所需的任何操作,完成后,返回到ex模式(再次按Q)继续下一场比赛。

  • 完成上一场比赛后,您将再次进入前进模式。输入:visual然后返回正常模式。

答案 2 :(得分:0)

根据您的需要,您只需使用:grep:vimgrep代替:g,这会将匹配的行放入quickfix列表中。 (使用命令的l变体来填充位置列表)。