vim commnad是什么意思v";或g&引用;当它在范围内的话

vim commnad是什么意思v";或g&引用;当它在范围内的话,vim,Vim,Vim手册上说 :[range]v[global]/{pattern}/[cmd] 在[range]内{pattern}不匹配的行上执行Ex命令[cmd](默认值:p)。 但是当使用诸如“:v/{pattern1}/,/{pattern2}/[cmd]”这样的命令时,结果并不是我想要的,我不明白为什么 例如,有一个文本文件 1 2 3 4 5 当我执行命令“:g/2/,/4/d”时,从“2”到“4”的行将被删除。 很好 但是如果我执行命令“:v/2/,/4/d”,它就不会像我知道的那样工作 我

Vim手册上说

:[range]v[global]/{pattern}/[cmd]
在[range]内{pattern}不匹配的行上执行Ex命令[cmd](默认值:p)。

但是当使用诸如“:v/{pattern1}/,/{pattern2}/[cmd]”这样的命令时,结果并不是我想要的,我不明白为什么

例如,有一个文本文件

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.
这里使用了一个范围,从行匹配到(
逗号)行匹配
p2
。以
1-5
为例,vim找到第一个匹配的行
#2
,然后你有一个
2,/4/d
,因此删除了行2-4。
:g
未完成,它看起来是剩余的行:
5
行,它不匹配
/2//code>,下一行,oops,点击EOF,所以
:g
已经完成它的工作

如果您从
1到20
,您会看到一些错误消息
模式未找到
,这是因为
:g
可以找到
/2/
,但是结束的范围
/4/
再也找不到了,它已被上一个
d
命令删除。您自己做一个测试,您将看到我所做的意思是

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

vim搜索第一行不匹配
/2/
,它将是第一行
1
,然后执行
1,/4/d
,即删除第1-4行。
:v
命令尚未完成,它将转到带有
5
的行,这是现在的行号1,它也不匹配
/2//code>,因此vim接受它,执行
1,/4/d
,但缓冲区中没有与
/4/
匹配的行,因此将显示
找不到模式
错误消息。并且
:v
命令已完成其工作

你应该记住,
:g/{pattern}/cmd
不是
:g{range}cmd
patternrange是不同的东西。执行
:h range
查看详细信息


这就是你得到结果的原因。希望它是清楚的。

哦,我知道,不匹配的:v只是在parttern 1上工作,而不是在parttern 2上工作。谢谢。不,关键是您完全误解了命令语法。只有一种模式会影响:v。命令中的第二个模式是应用于:d命令的范围的一部分。它与:v命令无关。