如何在TextMate语言定义tmLanguage中将语法对象嵌入另一个语法对象

时间:2019-01-08 11:26:36

标签: syntax visual-studio-code tokenize vscode-extensions tmlanguage

我正在尝试在VS Code中支持Clojure的忽略文本格式-Unique(一种注释),该语法使用tmLanguage进行语法定义。由于通常使用"a","b","c","a","a","a" | Select-Object -Unique a b c 来禁用代码块,因此我希望已禁用的代码块保留其语法突出显示并以斜体表示其状态。

但是我缺乏使用tmLanguage的技能似乎阻止了我。这是失败的尝试之一($objRights | Select-Object -Unique | Export-Csv -Path $outRightsFile -Delimiter ";" -NoTypeInformation 的摘要):

#_

使用#_定义一些Clojure常量对象,例如cson

  'comment-constants':
    'begin': '#_\\s*(?=\'?#?[^\\s\',"\\(\\)\\[\\]\\{\\}]+)'
    'beginCaptures':
      '0':
        'name': 'punctuation.definition.comment.begin.clojure'
    'end': '(?=[\\s\',"\\(\\)\\[\\]\\{\\}])'
    'name': 'meta.comment-expression.clojure'
    'patterns':
      [
        {
          'include': '#constants'
        }
      ]

我想发生的是,constants定义将在注释“内部”使用。对于关键字,我有这个(失败)规范:

keyword

(该列表中的最后一个测试)。失败并显示以下消息:

  'keyword':
    'match': '(?<=(\\s|\\(|\\[|\\{)):[\\w\\#\\.\\-\\_\\:\\+\\=\\>\\<\\/\\!\\?\\*]+(?=(\\s|\\)|\\]|\\}|\\,))'
    'name': 'constant.keyword.clojure'

这意味着我没有设置constants范围,因此对我来说没有关键字着色。

有人知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

您的keyword正则表达式始于后面,要求关键字前必须有一个空格,([{_中的#_不满足该要求。

(?<=(\\s|\\(|\\[|\\{))

您只需将_添加到允许的字符列表中即可:

(?<=(\\s|\\(|\\[|\\{|_))

请注意,此still wouldn't work原样用于您的"#_:foo"测试用例,因为最后的前瞻相似。您可以在那里允许$,使匹配为可选或更改测试用例。