的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