如何使Vim Ex命令模式范围从当前行开始搜索?

如何使Vim Ex命令模式范围从当前行开始搜索?,vim,Vim,假设我有一个带有2个选择器的短CSS文件(下面的代码) .selector1 { margin: 0; padding: 2px 3px; background-color: #ffe0e0; } .selector2 { cursor: pointer; text-decoration: underline; } 我的目标是在下一个选择器中打印所有规则。光标位于文件的最开头(第1行的第1个字符)。所以我试着: :/\V{/+1,/\V}/-1 pri

假设我有一个带有2个选择器的短CSS文件(下面的代码)

.selector1 {
    margin: 0;
    padding: 2px 3px;
    background-color: #ffe0e0;
}

.selector2 {
    cursor: pointer;
    text-decoration: underline;
}
我的目标是在下一个选择器中打印所有规则。光标位于文件的最开头(第1行的第1个字符)。所以我试着:

:/\V{/+1,/\V}/-1 print
我得到的是:
给定的向后范围

我研究了这背后的原因,这是search
/
命令在用作范围时开始查看当前行的下一行。因此,它找到的第一个
{
selector2
中,而找到的第一个
}
仍在
selector1
中。我认为这是因为Ex命令作用于行(而不是字符),而默认情况下,
/
行为是开始查看下一个字符(在本例中为下一行)

对于
selector2
,如果光标放在
selector2
上一行,但
selector1
在第一行,则命令将起作用,因此无法将光标行放在其上

实现目标的最简单方法是什么?从下一个选择器打印规则?即使光标位于第一行


有没有办法抑制/克服
/
在当前行的下一行开始搜索的默认行为

您只需要一个初步步骤:

:/}/;?{?+,-p

首先将光标移动到下一个右大括号(使用
/}/
),然后(
)通过向后搜索(
?{+
)和当前行上方的行(
-
)构建范围。

如果您的问题是如何使
/foo/,/bar/
范围从当前行开始,您可以执行以下操作:

exec search("{")+1.';/\V}/-1 print'
search()
将从光标位置进行搜索

对于您的具体问题,您可以先搜索关闭
}
,然后向后搜索
{

/\V}/-1,?\V{?+1 print
根据不同的要求,将
-1+1
调整为
-n+n

或者这样做:

/{<cr>
vi{
:print
/{
六{
:打印

/
范围中的确实与包含图案的下一行匹配。From
:h://

/{pattern}[/]   the next line where {pattern} matches
但是,您可以将计数传递给
/
,以指示从何处开始搜索。仍然可以从
: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
从“第一行之前”开始搜索(也匹配它)

匹配当前行的更通用方法是使用
:。-/
,意思是:“当前行之前的行”(当当前行是第一行时也有效)。

我认为
-/
是最好的答案。