请求解释一个vim命令

时间:2014-06-14 12:55:11

标签: vim

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

以上命令在匹配模式后添加计数器编号。因此,以下文字已更改。

aaab
aaab
aaab

aaa1b
aaa2b
aaa3b

'|'将命令关联到一个命令中。在我看来,命令按顺序执行,如首先让我= 1 ,然后 g / aaa \ zs / s // \ = i / ,最后让i = i + 1 。从上面的结果中, s // \ = i / **和** let i = i + 1 g 命令执行。谁能解释一下? 以下命令执行错误的操作。但我不知道为什么。

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

3 个答案:

答案 0 :(得分:1)

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

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

(括号仅用于解释,如果键入,它们会导致语法错误) 即g/<pattern/之后的所有内容都是作为全局g命令的参数给出的单个命令。

确实如此:我们从let i=1开始,然后对于匹配模式aaa的所有行,我们执行:s//\=i/ | let i=i+1(替换,然后递增i)。

您的第二个命令不起作用,因为s的功能与g的功能不同,并且在表达式替换为模式后需要结束/

答案 1 :(得分:1)

s//\=i/中,替换字符串终止,|被全局视为参数。但是,当您删除尾随/时,s的替换字符串会消耗| let i=i+1。从sub-replace-special的帮助文档中,您可以找到:“当替换字符串以”\ =“开头时,余数被解释为表达式。”因此,计算表达式i | let i=i+1,但在该评估之外不能使用增量。

答案 2 :(得分:0)

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