解释foldexpr语法

xra*_*alf 16 vim folding

你可以在下面的例子中解释一下我的语法,或者给我发一个链接,其中更详细的解释个别符号?vim的帮助不完整

:set foldexpr=getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
Run Code Online (Sandbox Code Playgroud)

什么不清楚?

  1. 字符串在单引号而不是双引号之间?或者我可以选择?
  2. 什么意思是解释标记(?)?在=~'\\S'?'<1':1
  3. 什么意思表达'string1'string2'string3
  4. 什么意思:1

谢谢

ib.*_*ib. 34

foldexpr选项应该包含一个表达式,该表达式求值为整数或特定格式的字符串,用于指定在v:lnum评估时存储在全局变量中的行的折叠级别.

让我们foldexpr从上到下遵循这个例子的逻辑.

getline(v:lnum)=~'^\\s*$'&&getline(v:lnum+1)=~'\\S'?'<1':1
Run Code Online (Sandbox Code Playgroud)

在顶层,整个表达式是三元运算符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'
Run Code Online (Sandbox Code Playgroud)

两种条件都具有相同的形式

getline(N) =~ S
Run Code Online (Sandbox Code Playgroud)

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=...
Run Code Online (Sandbox Code Playgroud)

Vim首先解释一些字符序列(参见参考资料:help cmdline-special).特别是,\\序列被视为单个反斜杠.

将所有内容放在一起,表达式测试行号是否 v:lnum仅包含空白字符,而它旁边的行(数字v:lnum+1)是否具有任何非空白字符(请参阅:help pattern了解模式的含义).如果是,则表达式求值为字符串'<1',否则求值为数字1.

  • 谢谢你的好解释. (2认同)