vim commnad表示“:v”或“:g!”是什么意思?当它在范围内说话时

all4register

Vim手册说

:[range]v[global]/{pattern}/[cmd] Execute the Ex command [cmd] (default ":p") on thelines within [range] where {pattern} does NOT match."

但是当使用“:v / {pattern1} /,/ {pattern2} / [cmd]”之类的命令时,结果不是我想要的,我也不明白为什么。

对于exapler,有一个文本文件

1
2
3
4
5

当我执行命令“:g / 2 /,/ 4 / d”时,从“ 2”到“ 4”的行将被删除。没关系。

但是,如果我执行命令“:v / 2 /,/ 4 / d”,它就不会像我所知道的那样起作用。

我认为应该将三行从“ 2”保留为“ 4”,删除其他行,但不要删除。

或者,我认为命令“:v / 2 /,/ 4 / d”可能类似于“:g / [^ 2] /,/ [^ 4] / d”,但事实并非如此。

那么,命令“:v / {pattern1} /,// {pattern2} / [cmd]”的确切含义是什么

肯特郡

该命令将执行应做的事情。我认为您无法正确理解该命令。我尝试解释一下。

首先,:g一个。您有::g/p1/,/p2/d我们应该将命令读取为:

:g/p1/   "for each line match p1
,/p2/d   "till line match p2, delete.

在这里,您使用了一个范围,从行匹配p1到(,逗号)行匹配p2在您的1-5示例中,vim找到第一个匹配的行#2,然后有一个2,/4/d,因此删除了第2-4行。:g还没有完成,它看起来是剩下的行:这5行,它不匹配/2/,下一行,哎呀,打了EOF,所以:g就完成了它的工作。

如果从中创建示例1 to 20,则会看到一些错误msg Pattern not found,这是因为:g可以找到/2/,但再也找不到范围结尾了/4/,该位置已由上一条d命令删除自己做一个测试,您会明白我的意思的。

如果:g很清楚,:v就很容易理解。:v/2/,/4/d

vim搜索第一行不匹配/2/,它将是第一行1,然后执行do 1,/4/d,即删除了第1-4行。:v命令尚未完成,它转到的行5,现在是行号1,也不匹配/2/,因此vim接受它,执行a 1,/4/d,但是/4/缓冲区中没有行匹配,因此pattern not found错误消息将是显示。:v命令完成了它的任务。

您应该记住,:g/{pattern}/cmd不是:g{range}cmd模式范围是不同的东西。做一个:h range看细节

这就是为什么您得到结果。希望是清楚的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章