代码之家  ›  专栏  ›  技术社区  ›  user3198694

Sublime文本3中的自定义语法突出显示--内联注释由$

  •  0
  • user3198694  · 技术社区  · 6 年前

    我正在尝试为一段代码编写自定义语法文件,该代码使用“C”或“C”来表示注释行,“$”来表示内联注释。现在我有:

    comments:
    # Comments begin with a 'c' or C and finish at the end of the line.
    - match: '\b(c|C|\\$)\b'
      scope: punctuation.definition.comment.mcinp
      push:
        # This is an anonymous context push for brevity.
        - meta_scope: comment.line.c.mcinp
        - match: $\n?
          pop: true
    

    因此: 以大写或小写字母“C”开头的一行是注释。行中“$”之后的任何内容都是注释:

    c this line is a comment
    a = 1     $ anything on a line after a dollar sign is a comment
    

    这不会改变$后文本的突出显示,因此它一定是错误的。如果你能对此有所了解,我将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  1
  •   OdatNurd    6 年前

    我认为你的问题是双重的。

    首先,构造 \b 匹配单词边界,但单词边界定义如下(从 this page ):

    • 如果第一个字符是单词字符,则在字符串中第一个字符之前。
    • 如果最后一个字符是单词字符,则在字符串中最后一个字符之后。
    • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。

    Word characters 不包括空格,因此为了触发规则,需要在 $ 为了让它匹配。

    第二个问题是 \\$ 没有创建转义 $ 就像你认为的那样,这是一个逃避角色逃避自己( \\ )后跟文字 $ 与该行的结尾匹配。因此,regex永远无法匹配,因为它要求行结束后的下一个字符是单词字符,而不是单词字符。

    你可能想要的是 \$ 生成文本的步骤 $ 性格

    所有这些结合在一起,示例看起来更像这样:

    # Comments begin with a 'c' or C and finish at the end of the line.
    - match: '(?:\b[Cc]\b)|\$'
      scope: punctuation.definition.comment.mcinp
      push:
        # This is an anonymous context push for brevity.
        - meta_scope: comment.line.c.mcinp
        - match: $\n?
          pop: true
    

    这将移动 $ 超出了您定义的单词边界条件的范围,因此它将根据需要进行匹配。

    作为旁注,您的问题提到以C开头的一行是注释,但正如定义的那样,只要是一个单词,该行中的任何一个C都可以定义注释。

    为了使其按照问题所描述的方式运行,下面的内容更合适,它将C字符上的匹配限制为行中的第一个非空白字符:

    - match: '(?:^\s*[Cc]\b)|\$'