【问题标题】:VIM - explain 'normal' and 'global' commandsVIM - 解释“普通”和“全局”命令
【发布时间】:2014-01-08 05:42:39
【问题描述】:

有人可以解释一下 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,希望它能按照以下方式工作:

  1. [0-9] = 只匹配带数字的行
  2. 4gg = 跳转到第 4 行
  3. 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 和@987654333 @ 但它没有帮助。谢谢

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

【问题讨论】:

    标签: vim


    【解决方案1】:
    :g/pattern/do something
    

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

    尝试:

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

    第一行打印匹配的行 第二次打印匹配的行号。

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

    原因是,为什么4 一直存在,因为4ggdd 之间有一个空格。

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

    删除空格

    【讨论】:

    • 顺便说一下(几乎完全不相关),:g/pattern/do somethinggrep 得名的地方:g/regular-expression/print -> g/re/p
    【解决方案2】:

    :normal

    :{range}normal {command}
    

    {range}每一 行上执行普通模式{command}。没有{range},就在当前行运行。

    例子:

    :5,18normal 0df=
    

    :global

    :{range}g/{pattern}/{command}
    

    只在{range} 中匹配{pattern} 的行上执行{command} 。没有{range},它对整个缓冲区进行操作。

    例子:

    :5,18g/^foo/normal 0df=
    :5,18g/^foo/s/^.\{-}=/
    

    【讨论】:

      【解决方案3】:

      意思是:

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

      【讨论】:

      • 这就是我的答案。不幸的是,这不会删除第 4 行。它出于某种原因删除了 fifth 行(您可以在输出中看到 OP 给出的 4 仍然存在,并且我能够重现该行为)。我不知道为什么会这样。你呢?
      • @Cubic:据我了解,normal 执行它的参数时不带空格,例如::g/[0-9]/norm 4ggdd,这是正确的。空间不适合我,它什么也没做。
      【解决方案4】:

      完成您的问题(请注意,提出几个问题(除非密切相关)是不好的风格,您应该能够通过出色的:help 解决大部分问题):

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-01
        • 2011-09-06
        • 2018-07-22
        • 1970-01-01
        • 2019-03-25
        • 2021-08-26
        • 2012-10-20
        • 2011-08-03
        相关资源
        最近更新 更多