有人可以澄清一下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
希望它能在以下方面起作用:
[0-9]
=仅匹配带数字的行4gg
=跳到第4行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
解释,问题被提到就像一个简单的例子.
: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
不被删除.
删除空间!
: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)
归档时间: |
|
查看次数: |
2569 次 |
最近记录: |