该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
第 - 行是否与'^\\s*$'
模式匹配,以及该第 - 行之后的v:lnum
行是否与'\\S'
模式匹配。
正则表达式模式在表达式中指定为字符串文字。字符串文字有两种语法形式,可以使用双引号或单引号引起来。这些形式之间的区别在于双引号字符串可以包含以反斜杠开头的各种控制序列。该序列允许指定其他无法轻松键入的特殊字符(例如,双引号 - 它写\"
)。另一方面,单引号字符串不允许这样的反斜杠序列。(有关单引号和双引号字符串的完整描述,请参见:help expr-string
和:help literal-string
。)
双引号字符串语法的显着后果是反斜杠符号本身必须转义(\\
)。这就是为什么单引号字符串经常用于指定正则表达式:不需要转义不断要求的反斜杠符号。但是,人们可以注意到,反斜杠在上述模式中仍然被转义。这是因为某些符号(包括反斜杠)在 Ex 命令(:set
当然包括 )中具有特殊含义。当你点击Enter启动命令时
:set foldexpr=...
Vim 首先解释一些字符序列(参见 参考资料:help cmdline-special
)。特别是,该\\
序列被视为单个反斜杠。
综上所述,表达式测试行号是否
v:lnum
仅包含空白字符以及下一行 (number v:lnum+1
) 是否有任何非空白字符(请参阅:help pattern
了解模式的含义)。如果是,则表达式计算为 string '<1'
,否则计算为 number 1
。