19

谁能提供对以下示例中的语法的解释,或者给我发一个链接,在该链接中对该表达式中使用的各个符号进行更一般的解释?我发现 Vim 帮助在这方面是不完整的。

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

我不清楚的是以下内容。

  1. 为什么字符串用单引号而不是双引号括起来?是选择问题吗?
  2. 中的解释标记是什么意思=~'\\S'?'<1':1
  3. 表达'string1'string2'string3是什么意思?
  4. 是什么:1意思?
4

1 回答 1

38

foldexpr选项应该包含一个表达式,该表达式计算为整数或特定格式的字符串,该格式指定在计算时将数字存储在v:lnum全局变量中的行的折叠级别。

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

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

在顶层,整个表达式是三元运算符的一个实例A ? B : CB如果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

于 2011-05-12T15:19:19.077 回答