有人可以向我解释一下 global ( :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 = 跳转到第 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
    

    此外,如果我使用 normnorm! 也没关系,有什么区别,请您解释一下这是如何工作的或给我一些好的引用资料,我已经阅读了 :h :g:h :norm 但它没有帮助。谢谢

    PS:我可以使用 :4d 但我对 :g:norm 的解释感兴趣,这个问题只是作为一个简单的例子提到的。

    最佳答案

    :g/pattern/do something
    

    将在 上执行 do somethingpattern 匹配的每个 行。所以你得到了那个输出。

    尝试:
    :g/\d/echo getline('.')
    :g/\d/echo line('.')
    

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

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

    出于这个原因, 为什么 4 直到那里, 因为您在 4ggdd 之间有一个空格。

    您的数字行只有一个字符,因此空格会将光标移动到下一行。这就是 4 不会被删除的原因。

    删除空间 !

    关于VIM - 解释 'normal' 和 'global' 命令,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20685363/

    10-13 04:12