有人可以澄清全局(:h :g
)和规范(:h norm
)命令在VIM中是如何工作的吗?我有档案:
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
G
H
我发布了:g/[0-9]/norm 4gg dd
希望它能够在以下方面发挥作用:
[0-9]
=仅匹配带数字的行4gg
=跳转到第4行dd
=删除当前(第4行)所以我期待这个:
1
2
3
5
6
7
8
9
A
B
C
D
E
F
G
H
但不是我得到了:
1
2
3
4
A
B
C
D
E
F
G
H
如果我使用norm
或norm!
也没关系,有什么区别,请你解释一下这是如何工作的,或者指出一些好的参考资料,我读过{{ 1}}和:h :g
但它没有帮助。谢谢
PS:我可以使用:h :norm
,但我对:4d
和:g
解释感兴趣,这个问题就像一个简单的例子一样被提到。
答案 0 :(得分:8)
:g/pattern/do something
会在与<{1}}匹配的每个行上do something
。所以你得到了那个输出。
尝试:
pattern
第1行打印匹配的行 2nd打印匹配的行号。
所以你会看到每个匹配的行,vim做某事(在这种情况下是echo)
因为为什么:g/\d/echo getline('.')
:g/\d/echo line('.')
到那里,因为4
和4gg
之间有空格。
您的数字行只有一个字符,因此空格会将光标移动到下一行。这就是为什么dd
不会被删除的原因。
删除空格!
答案 1 :(得分:6)
<强> :normal
强>
:{range}normal {command}
在{command}
的每个行的上执行正常模式{range}
。如果没有{range}
,它将在当前行上运行。
示例:
:5,18normal 0df=
<强> :global
强>
:{range}g/{pattern}/{command}
仅在{command}
中与{range}
匹配的行上执行{pattern}
。如果没有{range}
,它将在整个缓冲区上运行。
示例:
:5,18g/^foo/normal 0df=
:5,18g/^foo/s/^.\{-}=/
答案 2 :(得分:2)
这意味着:
对于包含0
和9
之间任意数字的每一行,请转到第四行并将其删除。因此,在第一次迭代中,它会删除数字4
,在下一个数字中删除数字5
,依此类推。当光标以不包含数字的行开头时,它不匹配并且不执行normal
指令,因此它不会删除任何内容。
答案 3 :(得分:1)
完成你的问题(注意问几个问题是不好的风格(除非紧密相关),你应该能够通过优秀的:help
来解决大部分问题:
:normal
和:normal!
之间的区别在于前者考虑映射,而后者始终适用于默认的Vim命令。因此,前者适用于ad-hoc命令(使用您的映射),但后者建议用于插件(独立于任何映射)。