2015-12-28 34 views
1

假設我有一個簡短的CSS文件(代碼如下)和2個選擇器。如何讓Vim Ex命令模式範圍從當前行開始搜索?

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

.selector2 { 
    cursor: pointer; 
    text-decoration: underline; 
} 

我的目標是打印下一個選擇器中的所有規則。光標位於文件的開頭(第一行的第一個字符)。所以我嘗試:

:/\V{/+1,/\V}/-1 print 

我得到的是:Backward range given

我研究了背後的原因,並且當用作範圍時搜索/命令開始查看當前行的下一行。所以第一個{它發現在selector2,而第一個}它發現仍然在selector1。我認爲這是因爲Ex命令對行(而不是字符)起作用,而默認情況下,/行爲是開始查看下一個字符(在本例中爲下一行)。

對於selector2,如果光標放在selector2的一行上,但selector1位於第一行,因此將光標放在它上面是不可能的。

實現目標的最簡單方法是什麼 - 即使光標位於第一行上,也會從下一個選擇器打印規則?

有沒有辦法以某種方式抑制/克服/的默認行爲,開始在當前行的下一行搜索?

回答

1

/在範圍不包含圖案的下一行確實匹配。從: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>,意思是:「當前行之前的行」(噹噹前行是第一行時也行)。

+1

我覺得'.-/'是這裏最好的答案。 –

1

你只需要一個準備步驟:

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

,你首先將光標移動到下一個右括號(與/}/),然後(;)構建你的範圍內具有向後搜索(?{?+)和在當前行的上方(-)。

1

如果你的問題是,如何讓/foo/,/bar/範圍從當前行開始,你可以這樣做:

exec search("{")+1.';/\V}/-1 print' 

search()將從光標位置搜索。

爲了您的具體問題,你可以先搜索關閉},然後向後搜索{

/\V}/-1,?\V{?+1 print 

調整-1 +1-n +n不同的要求。

或做到這一點:

/{<cr> 
vi{ 
:print