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



假设我有一个包含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

最新更新