【问题标题】:Could someone explain a particular use case of ‘foldexpr’ syntax in Vim?有人能解释一下 Vim 中“foldexpr”语法的一个特定用例吗?
【发布时间】:2011-08-24 02:07:52
【问题描述】:

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

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

我不清楚的是以下内容。

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

【问题讨论】:

    标签: vim folding


    【解决方案1】:

    foldexpr 选项应该包含一个计算表达式 转换为指定折叠的特定格式的整数或字符串 编号存储在v:lnum 全局变量中的行的级别 在评估的那一刻。

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

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

    在顶层,整个表达式是三元的一个实例 运营商A ? B : C。运算符的结果是 B 表达式如果 A 计算结果为非零,并且 否则为C 表达式(请参阅:help expr1)。在这种情况下,B 是 字符串文字'&lt;1',而C 是数字1(用于表示 '&lt;1'1 作为折叠级别说明符,请参阅 :help fold-expr)。

    A 表达式由两个条件组成 &amp;&amp;运营商:

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

    两个条件的形式相同:

    getline(N) =~ S
    

    getline 函数返回该行的内容(在当前 缓冲区),由作为参数传递的行号引用 (见:help getline)。在评估 foldexpr 时,v:lnum 变量包含应折叠级别的行号 进行计算。

    =~ 运算符测试其左操作数是否与正则匹配 由其右字符串操作数给出的表达式,并返回布尔值 (请参阅:help expr4,尤其是在expr4 部分的末尾附近)。 因此,A 条件旨在检查v:lnum-th 行 匹配'^\\s*$' 模式和v:lnum-th 之后的行 行匹配'\\S' 模式。

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

    双引号字符串语法的显着后果是 反斜杠符号本身必须转义 (\\)。这就是为什么单身 带引号的字符串通常用于指定正则表达式: 没有必要逃避不断要求的反斜杠符号。一罐 但是请注意,反斜杠在那些 上面的图案。这是由于某些符号(包括反斜杠) 在 Ex 命令中具有特殊含义(包括:set, 课程)。当您按 Enter 启动命令时

    :set foldexpr=...
    

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

    综上所述,表达式测试行号是否 v:lnum 仅包含空白字符以及以下行是否 (号码v:lnum+1)有任何非空白字符(见:help pattern 掌握模式的含义)。如果是,则表达式计算 到字符串'&lt;1',否则计算为数字1

    【讨论】:

    • 感谢您的精彩解释。
    • 哇..我见过的最好和最详细的答案之一。伟大的工作。
    • vimrc中单引号中的反斜杠是否也需要转义?
    • @happycoder97:在 Vim 中,无需转义单引号字符串文字中的反斜杠(参见 :help expr-')。但是,您确实需要在上面的 :set foldexpr=… 命令中使用这些双反斜杠,即使您从 .vimrc 文件执行它也是如此,因为 Vim 扩展了一些转义字符(如空格、|,或者,可以使用文件名的地方, %, #) 首先在 Ex 命令中,它使用反斜杠来执行此操作。因此,要在 Ex 命令中的任何位置(甚至在字符串文字中)使用反斜杠,您必须使用另一个反斜杠对其进行转义。
    猜你喜欢
    • 1970-01-01
    • 2019-10-24
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多