要求解释一条vim命令

要求解释一条vim命令,vim,Vim,上面的命令在匹配模式后添加计数器编号。因此,下面的文本被更改 let i=1 | g/aaa\zs/s//\=i/ | let i=i+1 到 “|”将命令合并为一个命令。在我看来,这些命令是按顺序执行的,首先是让i=1,然后是g/aaa\zs/s/\=i/,最后是让i=i+1。根据上述结果,g命令执行s/\=i/**和**let i=i+1。有人能解释一下吗? 以下命令执行错误的操作。但我不知道为什么 aaa1b aaa2b aaa3b 您应该将第一个命令理解为: let i=1 | g/

上面的命令在匹配模式后添加计数器编号。因此,下面的文本被更改

let i=1 | g/aaa\zs/s//\=i/ | let i=i+1

“|”将命令合并为一个命令。在我看来,这些命令是按顺序执行的,首先是让i=1,然后是g/aaa\zs/s/\=i/,最后是让i=i+1。根据上述结果,g命令执行s/\=i/**和**let i=i+1。有人能解释一下吗? 以下命令执行错误的操作。但我不知道为什么

aaa1b
aaa2b
aaa3b

您应该将第一个命令理解为:

let i=1 | g/aaa\zs/s//\=i | let i=i+1
(括号仅用于解释,如果键入会导致语法错误)。

i、 e.
s/\=i/
中的
g/之后的所有内容,替换字符串被终止,
|
被全局变量视为参数。但是,当删除尾随的
/
时,
s
的替换字符串将使用
| let i=i+1
。从
sub replace special
的帮助文档中,您可以找到:“当替换字符串以“\=”开头时,余数被解释为一个表达式。”因此表达式
i | let i=i+1
被计算,但增量在该计算之外不可用。

通常,
分隔两个Ex命令,然后它们确实是按顺序执行的。但是有些命令将
|
作为其参数的一部分<代码>:global
就是其中之一(完整列表位于
:help:bar
)。因此,命令在匹配行上的特殊应用同时适用于
:s
:let
命令(后者可以缩写为
:let i+=1
BTW)。

“因此表达式i | let i=i+1的计算结果是”我认为你的想法无法回答我的问题。在我看来,let i=i+1根本没有执行。@river对此不确定,但是:如果在
\=
之后需要一个表达式,您确定
| let i=i+1
是一个表达式吗?我在vim表达式语法帮助页中找不到类似的结构。g/aaa/s//bbb | echo“ccc”我测试这个命令,“echo“ccc”将被插入。@river
echo“ccc”
确实是作为字符串插入的,而不是作为命令执行的结果插入的。此外,该命令中没有更多的
\=
,因此不应使用任何表达式?g/aaa/s/\=i|echo“ccc”这里也不打印ccc。“它确实需要在表达式的结尾/后面替换为模式”。也许这不是关键问题。@river好吧,也许不是。但是,在这种情况下,也许你可以更好地明确你的问题:澄清你所知道/怀疑/想确切知道的内容(例如关于威廉的回答/评论)有助于回答。谢谢你的帮助!
let i=1 | g/aaa\zs/s//\=i | let i=i+1
let i=1 | g/aaa\zs/ ( s//\=i/ | let i=i+1 )