的foldexpr
選項應該包含,用於評估 成,指定哪個號碼被存儲在v:lnum
全球 線的 摺疊級的整數或特定格式的字符串的表達式在評估時可變。
讓我們從上到下地遵循這個foldexpr
示例的邏輯。
getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
在頂層,整個表達式是一個三元運算符A ? B : C
。 如果A
的計算結果爲非零,則運算符的結果爲B
表達式的值,否則C
表達式的值將爲 (請參閱:help expr1
)。在這種情況下,B
是字符串文字 '<1'
,和C
是( 水平符看到:help fold-expr
用於'<1'
和1
含義倍)數1
。
的A
表達包括由&&
操作者接合的兩個條件:
getline(v:lnum) =~ '^\\s*$' && getline(v:lnum+1) =~ '\\S'
兩個條件具有相同的形式
getline(N) =~ S
的getline
函數返回該行的內容(在當前(參見 :help getline
))。當評估foldexpr
時,變量將包含計算摺疊級別應爲 的行的編號。
=~
的操作者的測試其左操作數是否匹配由它的右邊字符串操作數給定正則表達式 ,並返回布爾值 (參見:help expr4
,特別是,靠近expr4
部的端部)。 因此,A
條件旨在檢查v:lnum
個線 的'^\\s*$'
模式相匹配,和線旁邊v:lnum
第一個 的'\\S'
模式匹配。
正則表達式模式在表達式中指定爲 字符串文字。字符串文字有兩種語法形式,可以使用雙引號或單引號引用 。這些 格式之間的區別在於雙引號字符串可能包含以反斜槓開頭的各種控制序列。該序列允許指定 特殊字符,否則不能輕鬆鍵入(例如雙引號, ,它寫入\"
)。另一方面,單引號字符串 不允許使用這種反斜槓序列。 (對於 單,雙引號的字符串完整描述見:help expr-string
和:help literal-string
。)
雙引號的字符串語法的顯着後果是, 反斜線符號本身必須進行轉義(\\
)。這就是爲什麼單個 引用字符串經常用於指定正則表達式:有 不需要不斷地要求反斜槓符號。可以注意到, 儘管如此,反斜槓仍然以上述模式 逃脫。這是因爲在Ex命令中(包括:set
當然),某些符號(包括反斜槓)具有特殊含義。當 你打輸入啓動命令
:set foldexpr=...
Vim的解釋一些字符序列(見:help cmdline-special
)。特別是,\\
序列被視爲 單個反斜槓。
全部放在一起,表達測試的行號 v:lnum
是否只包含空白字符而線旁邊 (數v:lnum+1
)具有任何非空白字符(見:help pattern
到 把握模式的含義)。如果是這樣,則表達式求值爲 字符串'<1'
,否則其求值爲1
。
謝謝你的解釋。 – xralf 2011-05-12 15:52:48
哇..我見過的最好和詳細的答案之一。做得好。 – Cricrazy 2016-09-01 13:46:30