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