2011-05-12 64 views
14

您能否在下面的例子中解释我的语法,或者给我发一个链接,哪里是对各个符号的更一般的认真解释? vim中的帮助不完整解释foldexpr语法

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

什么不清楚?

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

谢谢

回答

31

foldexpr选项应该包含,用于评估 成,指定哪个号码被存储在v:lnum全球 线的 折叠级的整数或特定格式的字符串的表达式在评估时可变。

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

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

在顶层,整个表达式是一个三元运算符A ? B : C。 如果A 的计算结果为非零,则运算符的结果为B表达式的值,否则C表达式的值将为 (请参阅:help expr1)。在这种情况下,B是字符串文字 '<1',和C是( 水平符看到:help fold-expr用于'<1'1含义倍)数1

A表达包括由&& 操作者接合的两个条件:

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

两个条件具有相同的形式

getline(N) =~ S 

getline函数返回该行的内容(在当前(参见 :help getline))。当评估foldexpr时,变量将包含计算折叠级别应为 的行的编号。

=~的操作者的测试其左操作数是否匹配由它的右边字符串操作数给定正则表达式 ,并返回布尔值 (参见:help expr4,特别是,靠近expr4部的端部)。 因此,A条件旨在检查v:lnum个线 的'^\\s*$'模式相匹配,和线旁边v:lnum第一个 的'\\S'模式匹配。

正则表达式模式在表达式中指定为 字符串文字。字符串文字有两种语法形式,可以使用双引号或单引号引用 。这些 格式之间的区别在于双引号字符串可能包含以反斜杠开头的各种控制序列。该序列允许指定 特殊字符,否则不能轻松键入(例如双引号, ,它写入\")。另一方面,单引号字符串 不允许使用这种反斜杠序列。 (对于 单,双引号的字符串完整描述见:help expr-string:help literal-string。)

双引号的字符串语法的显着后果是, 反斜线符号本身必须进行转义(\\)。这就是为什么单个 引用字符串经常用于指定正则表达式:有 不需要不断地要求反斜杠符号。可以注意到, 尽管如此,反斜杠仍然以上述模式 逃脱。这是因为在Ex命令中(包括:set当然),某些符号(包括反斜杠)具有特殊含义。当 你打输入启动命令

:set foldexpr=... 

Vim的解释一些字符序列(见:help cmdline-special)。特别是,\\序列被视为 单个反斜杠。

全部放在一起,表达测试的行号 v:lnum是否只包含空白字符而线旁边 (数v:lnum+1)具有任何非空白字符(见:help pattern到 把握模式的含义)。如果是这样,则表达式求值为 字符串'<1',否则其求值为1

+2

谢谢你的解释。 – xralf 2011-05-12 15:52:48

+0

哇..我见过的最好和详细的答案之一。做得好。 – Cricrazy 2016-09-01 13:46:30