VIM-解释';正常';和';全球';命令
有人能告诉我全局(VIM-解释';正常';和';全球';命令,vim,Vim,有人能告诉我全局(:h:g)和norm(: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=跳到第四行 dd=删除当前(第四)行 所以我期待着: 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或no
:h:g
)和norm(: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
=跳到第四行dd
=删除当前(第四)行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也没关系代码>,有什么区别,你能给我解释一下这是如何工作的,或者给我指一些好的参考资料吗?我已经读了:h:g
和:h:norm
,但它没有帮助。多谢各位
注:我可以使用:4d
,但我对:g
和:norm
解释感兴趣,提到的问题只是一个简单的例子。它的意思是:
对于包含0
和9
之间任何数字的每一行,请转到第四行并将其删除。因此,在第一次迭代中,它删除数字4
,在下一次迭代中删除数字5
,依此类推。当光标以不包含数字的行开始时,它不匹配并且不执行normal
指令,因此它不会删除任何内容
:g/pattern/do something
将在与模式匹配的每一行上执行操作。所以你得到了输出
尝试:
第1行打印匹配的行
第二个打印匹配的行号
因此,您将看到,对于每个匹配的行,vim都做了一些事情(在本例中为echo)
因此,为什么4
仍然存在,因为在4gg
和dd
之间有一个空格
带有数字的行只有一个字符,所以空格将光标移动到下一行。这就是为什么4
不会被删除的原因
删除空格 :正常
:{range}normal {command}
:{range}g/{pattern}/{command}
在{range}
中的每一行上执行正常模式{command}
。如果没有{range}
,它将在当前行上运行
例如:
:5,18normal 0df=
:全局
:{range}normal {command}
:{range}g/{pattern}/{command}
仅对{range}
中与{pattern}
匹配的行执行{command}
。如果没有{range}
,它将在整个缓冲区上运行
示例:
:5,18g/^foo/normal 0df=
:5,18g/^foo/s/^.\{-}=/
要完成您的问题(请注意,问几个问题(除非关系密切),是不好的方式,您应该能够通过优秀的:help
)解决大部分问题:
:normal
和:normal之间的区别代码>是指前者考虑映射,而后者总是在默认Vim命令上工作。因此,前者适用于特殊命令(使用映射),但后者适用于插件(独立于任何映射)。这就是我的答案。不幸的是,这并没有删除第4行。出于某种原因,它删除了第五行(你可以在OP给出的输出中看到4仍然存在,我能够重现这种行为)。我不知道为什么会这样。是吗?@Cubic:据我所知,normal
执行它的参数时没有空格,比如::g/[0-9]/norm 4ggdd
,这是正确的。空间对我来说不起作用,它什么都没有。顺便说一句(几乎完全无关),:g/pattern/do something
就是grep
的名字:g/regular expression/print
->g/re/p
。