假设我有一个包含2个选择器的短CSS文件(下面的代码)。
.selector1 {
margin: 0;
padding: 2px 3px;
background-color: #ffe0e0;
}
.selector2 {
cursor: pointer;
text-decoration: underline;
}
我的目标是在下一个选择器中打印所有规则。光标位于文件的最开始(第一行的第一个字符)。所以我尝试:
:/V{/+1,/V}/-1 print
我得到的是:Backward range given
。
我研究了这背后的原因,这是因为search /
命令在用作范围时开始查看当前命令的下一行。因此,它找到的第一个{
在selector2
中,而它找到的第五个}
仍在selector1
中。我认为这是因为Ex命令作用于行(而不是字符),而默认情况下,/
的行为是开始查看下一个字符(在本例中为下一行)。
对于selector2
,如果光标放在selector2
的一行上,但selector1
在第一行上,则该命令将起作用,因此不可能将光标放在它上面。
实现目标的最简单方法是什么?从下一个选择器打印规则?,即使光标在第一行上。
有没有办法以某种方式抑制/克服/
在当前行的下一行开始搜索的默认行为?
范围中的/
确实与包含模式的下一行匹配。来自:h :/
:
/{pattern}[/] the next line where {pattern} matches
但是,您可以将count
传递给/
,以指示从何处开始搜索。仍然来自:help
:
The "/" and "?" may be preceded with another address. The search starts from there.
(...)
The {number} must be between 0 and the number of lines in the file.
(...)
Some commands interpret the zero as "before the first line" (:read, search pattern, etc).
在你的情况下,你可以使用
:0/V{/+1,/V}/-1 print
从"第一行之前"开始搜索
一种更通用的匹配当前行的方法是使用:.-/<pattern>
,意思是:"当前行之前的行"(当当前行是第一行时也适用)。
您只需要一个初步步骤:
:/}/;?{?+,-p
首先将光标移动到下一个右大括号(使用/}/
),然后(;
)通过向后搜索(?{?+
)和当前行上方的行(-
)构建范围。
如果您的问题是如何使/foo/,/bar/
范围从当前行开始,您可以执行:
exec search("{")+1.';/V}/-1 print'
search()
将从光标位置进行搜索。
对于您的具体问题,您可以先搜索关闭的}
,然后向后搜索{
:
/V}/-1,?V{?+1 print
根据不同的需求调整CCD_ 26至CCD_。
或者这样做:
/{<cr>
vi{
:print