VIM - 解释'正常'和'全局'命令

时间:2013-12-19 15:21:52

标签: vim

有人可以澄清全局(: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希望它能够在以下方面发挥作用:

  1. [0-9] =仅匹配带数字的行
  2. 4gg =跳转到第4行
  3. dd =删除当前(第4行)
  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
    

    如果我使用normnorm!也没关系,有什么区别,请你解释一下这是如何工作的,或者指出一些好的参考资料,我读过{{ 1}}和:h :g但它没有帮助。谢谢

    PS:我可以使用:h :norm,但我对:4d:g解释感兴趣,这个问题就像一个简单的例子一样被提到。

4 个答案:

答案 0 :(得分:8)

:g/pattern/do something

会在与<{1}}匹配的每个行上do something。所以你得到了那个输出。

尝试:

pattern

第1行打印匹配的行 2nd打印匹配的行号。

所以你会看到每个匹配的行,vim做某事(在这种情况下是echo)

因为为什么:g/\d/echo getline('.') :g/\d/echo line('.') 到那里,因为44gg之间有空格。

您的数字行只有一个字符,因此空格会将光标移动到下一行。这就是为什么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)

这意味着:

对于包含09之间任意数字的每一行,请转到第四行并将其删除。因此,在第一次迭代中,它会删除数字4,在下一个数字中删除数字5,依此类推。当光标以不包含数字的行开头时,它不匹配并且不执行normal指令,因此它不会删除任何内容。

答案 3 :(得分:1)

完成你的问题(注意问几个问题是不好的风格(除非紧密相关),你应该能够通过优秀的:help来解决大部分问题:

:normal:normal!之间的区别在于前者考虑映射,而后者始终适用于默认的Vim命令。因此,前者适用于ad-hoc命令(使用您的映射),但后者建议用于插件(独立于任何映射)。