如何在Vim中顺序执行多个全局命令? (错误:“无法执行:global递归”)

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

我想使用以下全局命令根据其首字母对段落进行排序:

g/_p/,/^$/mo$

这单独起作用。但是当我一次使用多个全局命令时,就会发生错误:

g/_p/,/^$/mo$|g/_w/,/^$/mo$

这将产生以下错误:

Cannot do :global recursive

如何立即顺序运行这些命令?

vim global ex
2个回答
9
投票
:exe 'g/_p/,/^$/mo$' | g/_w/,/^$/mo$

要附加更多global命令,只需将它们包装在execute中:

:execute 'g/aaa/s//bbb/g ' | execute 'g/ccc/s/ddd//g' | execute 'g/eee/s/fff/ggg/g' | g/^cake/s/$/ is a lie/g

错误原因在:help :bar中:

[:bar *:bar* *:\bar*可用于分隔命令,因此您可以在一行中给出多个命令。如果您想在[参数,请在其前面加上|

这些命令将|作为其参数,因此不能然后是另一个Vim命令:

  • (..命令列表..]
  • \
  • (..命令列表..]

请注意,这令人困惑(从Vi继承):对于|:global为包含在命令中,但不包含:g

[无论如何都可以使用其他命令,请使用|命令。

这也回答了为什么下面的链可以正常工作的原因:

:s

-1
投票

:execute是vimscript的几行,将所有段落排序。但是他们通过缩进而不是空行来识别段落。但是可以肯定的是,可以通过空行对其进行区分以区分段落。

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