foldexpr 选项应该包含一个计算表达式
转换为指定折叠的特定格式的整数或字符串
编号存储在v:lnum 全局变量中的行的级别
在评估的那一刻。
让我们从上到下遵循这个foldexpr示例的逻辑。
getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
在顶层,整个表达式是三元的一个实例
运营商A ? B : C。运算符的结果是
B 表达式如果 A 计算结果为非零,并且
否则为C 表达式(请参阅:help expr1)。在这种情况下,B 是
字符串文字'<1',而C 是数字1(用于表示
'<1' 和 1 作为折叠级别说明符,请参阅 :help fold-expr)。
A 表达式由两个条件组成
&&运营商:
getline(v:lnum) =~ '^\\s*$' && getline(v:lnum+1) =~ '\\S'
两个条件的形式相同:
getline(N) =~ S
getline 函数返回该行的内容(在当前
缓冲区),由作为参数传递的行号引用
(见:help getline)。在评估 foldexpr 时,v:lnum
变量包含应折叠级别的行号
进行计算。
=~ 运算符测试其左操作数是否与正则匹配
由其右字符串操作数给出的表达式,并返回布尔值
(请参阅:help expr4,尤其是在expr4 部分的末尾附近)。
因此,A 条件旨在检查v:lnum-th 行
匹配'^\\s*$' 模式和v:lnum-th 之后的行
行匹配'\\S' 模式。
正则表达式模式在表达式中指定为
字符串文字。字符串文字有两种语法形式,可以是
使用双引号或单引号引用。这些之间的区别
形式是双引号字符串可以包含各种控件
以反斜杠开头的序列。该序列允许指定
否则不容易输入的特殊字符(双
引用,例如——它写\")。单引号字符串,在
另一方面,不允许这样的反斜杠序列。 (对于完整的
单引号和双引号字符串的描述见:help expr-string
和:help literal-string。)
双引号字符串语法的显着后果是
反斜杠符号本身必须转义 (\\)。这就是为什么单身
带引号的字符串通常用于指定正则表达式:
没有必要逃避不断要求的反斜杠符号。一罐
但是请注意,反斜杠在那些
上面的图案。这是由于某些符号(包括反斜杠)
在 Ex 命令中具有特殊含义(包括:set,
课程)。当您按 Enter 启动命令时
:set foldexpr=...
Vim 首先解释一些字符序列(见:help cmdline-special)。
特别是,\\ 序列被视为单个反斜杠。
综上所述,表达式测试行号是否
v:lnum 仅包含空白字符以及以下行是否
(号码v:lnum+1)有任何非空白字符(见:help pattern
掌握模式的含义)。如果是,则表达式计算
到字符串'<1',否则计算为数字1。