解释foldexpr语法

时间:2011-05-12 12:22:47

标签: vim folding

请您解释一下以下示例中的语法,或者给我发一个链接,其中更详细地解释个别符号? 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是什么意思?
  5. 谢谢

1 个答案:

答案 0 :(得分:34)

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'C1的数字('<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在其旁边的行中仅包含空白字符 (编号v:lnum+1)具有任何非空白字符(请参阅:help pattern至 掌握模式的意义)。如果是,则表达式求值为 字符串'<1',否则评估为1