在vscode语法语法中,如何在范围匹配之后隔离尾随文本的范围

时间:2019-08-13 07:26:42

标签: visual-studio-code syntax-highlighting textmate

我正在尝试编写语法语法,但是在尝试在块注释后正确确定文本范围时遇到问题:

/*
block comment
*/ troublesome text

对于以下“模式”,troublesome text的范围为invalid.illegal.mircscriptcomment.block.mircscript的范围应为invalid.illegal.mircscript

{
    "name": "comment.block.mircscript",
    "begin": "^\\x20*/\\*",
    "end": "^\\x20*\\*/(\\x20*\\S.*$)?"
    "endCaptures": {
        "1": { "name": "invalid.illegal.mircscript" }
    }
}

但是如果我分割模式,troublesome text根本就不会匹配/作用域:

{
    "patterns": [
        {
            "name": "comment.block.mircscript",
            "begin": "^\\x20*/\\*",
            "end": "^\\x20*\\*/"
        },
        {
            "name": "invalid.illegal.mircscript",
            "match": "\\G(?<=\\*/)\\x20*\\S.*$"
        }
    ]
}

我该如何从comment.block.mircscript中排除尾随文本,同时仍然在块注释后直接匹配以将其限定在invalid.illegal.mircscript范围内?

1 个答案:

答案 0 :(得分:0)

范围界定是因为您的整个规则都有"name": "comment.block.mircscript",所以它匹配的所有内容(包括开始/结束)都将具有该范围。

为避免这种情况,您可以省略顶层name,而在明确contentNamebegin捕获范围的情况下使用end

{
    "contentName": "comment.block.mircscript",
    "begin": "^\\x20*/\\*",
    "beginCaptures": {
        "0": "comment.block.mircscript.begin"
    },
    "end": "(^\\x20*\\*/)(\\x20*\\S.*$)?"
    "endCaptures": {
        "1": { "name": "comment.block.mircscript.end" },
        "2": { "name": "invalid.illegal.mircscript" }
    }
}

contentName仅设置在开始/结束规则内部匹配的内容的范围,而排除开始/结束匹配本身

相关问题