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

Wak*_*nka 3 vim

有人可以澄清一下global(:h :g)和norm(:h norm)命令在VIM中是如何工作的吗?我有档案:

1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
G
H
Run Code Online (Sandbox Code Playgroud)

我已发布: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
Run Code Online (Sandbox Code Playgroud)

但我得到的不是:

1
2
3
4
A
B
C
D
E
F
G
H
Run Code Online (Sandbox Code Playgroud)

另外,如果我用它没关系norm或者norm!,有什么区别,可以请你解释我这是怎么工作或点我一些很好的参考,我已阅读:h :g:h :norm,但它并不能帮助.谢谢

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

Ken*_*ent 8

:g/pattern/do something
Run Code Online (Sandbox Code Playgroud)

do something在匹配的每一行上做pattern.所以你得到了那个输出.

尝试:

:g/\d/echo getline('.')
:g/\d/echo line('.')
Run Code Online (Sandbox Code Playgroud)

第1行打印匹配行第2行打印匹配的行号.

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

因为,为什么4到那里,因为你4gg和之间有一个空间dd.

带数字的行只有一个字符,因此空格会将光标移动到下一行.这就是为什么4不被删除.

删除空间!

  • 顺便说一句(并且几乎完全不相关),`:g/pattern/do something`是`grep`得名的地方:`g/regular-expression/print` - >`g/re/p`. (2认同)

rom*_*inl 6

:normal

:{range}normal {command}
Run Code Online (Sandbox Code Playgroud)

{command}每一行执行正常模式{range}.没有{range},它在当前行上运行.

例:

:5,18normal 0df=
Run Code Online (Sandbox Code Playgroud)

:global

:{range}g/{pattern}/{command}
Run Code Online (Sandbox Code Playgroud)

{command} {range}该匹配的行上执行{pattern}.没有{range},它在整个缓冲区上运行.

例子:

:5,18g/^foo/normal 0df=
:5,18g/^foo/s/^.\{-}=/
Run Code Online (Sandbox Code Playgroud)