要求解释一条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”将被插入。@riverecho“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 )