Files
nx_post_support/syntaxes/tcl.tmLanguage.json
T
2025-01-10 08:06:42 +01:00

5469 lines
202 KiB
JSON

{
"$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json",
"foldingStartMarker": "([{(\\[])",
"foldingEndMarker": "([})\\]])",
"name": "Tcl",
"patterns": [
{
"include": "#root"
}
],
"repository": {
"root": {
"patterns": [
{
"include": "#invariant"
},
{
"include": "#brackets"
},
{
"include": "#proc-call"
}
]
},
"invariant": {
"patterns": [
{
"include": "#ignore-long-lines"
},
{
"include": "#no-starting-empty-brackets"
},
{
"include": "#no-empty-square-brackets"
}
]
},
"no-starting-empty-brackets": {
"patterns": [
{
"match": "(?<=^)\\s*+(\\{\\}|\\[\\])",
"captures": {
"1": {
"name": "invalid.illegal.termination.tcl"
}
}
}
]
},
"no-empty-square-brackets": {
"patterns": [
{
"match": "(\\[\\])",
"captures": {
"1": {
"name": "string.empty.square.brace"
}
}
}
]
},
"ignore-long-lines": {
"comment": "long lines are not parsed for performance",
"patterns": [
{
"match": "^.{1000,}"
}
]
},
"brackets": {
"patterns": [
{
"include": "#invariant"
},
{
"include": "#special-brackets"
},
{
"include": "#empty-brackets"
},
{
"include": "#square-brackets"
},
{
"include": "#curly-brackets"
}
]
},
"square-brackets": {
"patterns": [
{
"begin": "\\s*+(?<!\\\\)(\\[)",
"end": "(?:(?<!\\\\)|(?<=\\\\{2}))(\\])",
"beginCaptures": {
"1": {
"name": "meta.brace.square.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.brace.square.close.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#invariant"
},
{
"include": "#proc-call"
}
]
}
]
},
"curly-brackets": {
"patterns": [
{
"begin": "\\s*+({)",
"end": "(})",
"name": "meta.curly.enclosed",
"beginCaptures": {
"1": {
"name": "meta.brace.curly.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.brace.curly.close.tcl"
}
},
"patterns": [
{
"include": "#invariant"
},
{
"include": "#special-brackets"
},
{
"include": "#curly-brackets"
},
{
"include": "#proc-call"
}
]
}
]
},
"curly-string-brackets": {
"patterns": [
{
"include": "#empty-brackets"
},
{
"begin": "\\s*+({)",
"end": "(})",
"name": "meta.curly.enclosed",
"contentName": "string.quote.bracketed.nosubstitution.tcl",
"beginCaptures": {
"1": {
"name": "meta.brace.curly.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.brace.curly.close.tcl"
},
"2": {
"name": "invalid.illegal.charafterbrace.tcl"
}
},
"patterns": [
{
"match": "([\\[\\]])",
"name": "string"
},
{
"include": "#variable-non-substituting"
},
{
"include": "#curly-string-brackets"
},
{
"include": "#quoted-string"
},
{
"include": "#bare-string"
}
]
}
]
},
"empty-brackets": {
"patterns": [
{
"match": "\\s*+(?={)({})",
"captures": {
"1": {
"name": "punctuation.definition.string.brackets.tcl"
}
}
},
{
"comment": "enclosed brackets",
"match": "\\s*+{([{}]*)}",
"captures": {
"1": {
"name": "punctuation.definition.string.brackets.tcl"
}
}
}
]
},
"special-brackets": {
"comment": "Support for special cases that brackets may be used",
"patterns": [
{
"comment": "Need to handle the case that we have {*}$varname",
"include": "#variable"
},
{
"comment": "Need to handle the case we spread a command {*}[list one two]",
"match": "\\s*({(\\*)}?)(?=\\[|{|\")",
"captures": {
"1": {
"name": "entity.function.name.tcl.markup.italic"
},
"2": {
"name": "support.type"
}
}
}
]
},
"expression-brackets": {
"patterns": [
{
"comment": "Expressions utilize special syntax highlighting",
"begin": "(\\{)",
"end": "(\\})",
"beginCaptures": {
"1": {
"name": "meta.expression.start.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.expression.end.tcl"
}
},
"patterns": [
{
"include": "#empty-brackets"
},
{
"include": "#curly-string-brackets"
},
{
"include": "#square-brackets"
},
{
"include": "#expressions"
}
]
}
]
},
"proc-call": {
"comment": "handles a proc call",
"patterns": [
{
"include": "#invariant"
},
{
"include": "#comment-blocks"
},
{
"include": "#variable-object"
},
{
"include": "#variable"
},
{
"include": "#quoted-string"
},
{
"include": "#keywords"
},
{
"include": "#proc-call-args"
}
]
},
"proc-call-args": {
"comment": "Arguments given to a proc that is being called",
"patterns": [
{
"include": "#special-brackets"
},
{
"include": "#brackets"
},
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#quoted-string"
},
{
"include": "#variable"
},
{
"include": "#constant-numeric"
},
{
"include": "#bare-string"
},
{
"begin": "(?=::)",
"end": "\\s|(?=[\\]};\n])",
"patterns": [
{
"include": "#namespace-name"
}
]
}
]
},
"keywords": {
"patterns": [
{
"include": "#square-brackets"
},
{
"include": "#tcl-subst"
},
{
"include": "#variable"
},
{
"include": "#tcl-proc"
},
{
"include": "#tcl-binary"
},
{
"include": "#tcl-string"
},
{
"include": "#tcl-throw"
},
{
"include": "#tcl-switch"
},
{
"include": "#tcl-info"
},
{
"include": "#tcl-incr"
},
{
"include": "#tcl-interp"
},
{
"include": "#tcl-oo"
},
{
"include": "#tcl-try-catch"
},
{
"include": "#tcl-setters"
},
{
"include": "#tcl-expression-keywords"
},
{
"include": "#tcl-dict"
},
{
"include": "#tcl-foreach"
},
{
"include": "#tcl-namespace"
},
{
"include": "#tcl-oo-keywords"
},
{
"include": "#regexp"
},
{
"include": "#tcl-lassign"
},
{
"include": "#tcl-array"
},
{
"include": "#tcl-catch"
},
{
"include": "#tcl-ns-commands"
},
{
"include": "#tcl-puts"
},
{
"include": "#tcl-upvar"
},
{
"include": "#tcl-global"
},
{
"include": "#tcl-vwait"
},
{
"include": "#tcl-entity-commands"
},
{
"match": "(?<=^|[\\[;{])\\s*+([^\\s]*)\\s+\\b(destroy|new)\\b",
"captures": {
"1": {
"patterns": [
{
"include": "#keywords"
}
]
},
"2": {
"name": "keyword.control.special.tcl"
}
}
},
{
"include": "#tcl-core-commands"
},
{
"match": "(?:(?<=^|[\\[{;])\\s*|(?<=::)(?![\\s\"]))([^\\s}\\]{\\[;\\\\\"]*)(?=$|{}|[\\s\n\\]}\\[;])",
"captures": {
"1": {
"patterns": [
{
"include": "#namespace-name"
}
]
}
}
}
]
},
"tcl-core-commands": {
"patterns": [
{
"comment": "imports & requires",
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(package|include|includes)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;}\\]]))",
"captures": {
"1": {
"name": "support.type.ns.separator"
},
"2": {
"name": "keyword.control.import.package.tcl"
},
"3": {
"name": "support.type.ns.separator"
}
},
"patterns": [
{
"begin": "(?<=package)\\s*(require|provide)\\s*(?!$|\n)",
"end": "(?=(?<!\\\\)(?:$|[\n;}\\]]))",
"captures": {
"1": {
"name": "keyword.control.package.require.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#constant-numeric"
},
{
"include": "#variable"
},
{
"include": "#namespace-name"
}
]
},
{
"begin": "(?<=include|includes)",
"end": "(?=(?<!\\\\)(?:$|[\n;}\\]]))",
"contentName": "string"
}
]
},
{
"include": "regexp"
},
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(format|scan)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n\\]};]))",
"captures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.format.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#square-brackets"
},
{
"include": "#variable"
},
{
"include": "#quoted-string"
},
{
"include": "#constant-numeric"
},
{
"match": "(%)([.])?([0-9]*)?([.duioxXcsfegG])",
"captures": {
"1": {
"name": "support.type.tcl"
},
"2": {
"name": "meta.class"
},
"3": {
"name": "meta.constant.tcl"
},
"4": {
"name": "entity.function.name.tcl"
}
}
},
{
"match": "(?<=\\s)\\s*(?![%.$])([^\\s\\]}\\[{;\n]*)",
"captures": {
"1": {
"name": "variable",
"patterns": [
{
"include": "#variable-bare-italic"
}
]
}
}
},
{
"include": "#format-brackets"
}
]
},
{
"match": "(?:(?<=^|\\[|{|;)\\s*(::)?|(?<=::))\\b(try|apply|exit|flush|chan|lreverse|error|gets|for|lrepeat|lsearch|fconfigure|chan|open|close|next|while|format|lindex|linsert|concat|lsort|glob|tuapi|subst|upvar|uplevel|fileutil|continue|cluster|break|yield|load|split|switch|yieldto|catch|source|cd|file|wget|join|throw|lrange|lset|lmap|lassign|llength|lwhere|list|return|puts|clock|state|variable|after|task|return|interp)\\b(::)?",
"name": "keyword.control.tcl",
"captures": {
"1": {
"name": "support.type.ns.separator"
},
"2": {
"name": "keyword.control.tcl"
},
"3": {
"name": "support.type.ns.separator"
}
}
}
]
},
"format-brackets": {
"patterns": [
{
"begin": "\\s*({)",
"end": "(})",
"contentName": "string.format.contents.tcl",
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"include": "#format-brackets"
},
{
"include": "#empty-brackets"
},
{
"match": "([#0-9+-])([duioxXcsfegG]?)",
"captures": {
"1": {
"name": "meta.constant"
},
"2": {
"name": "support.type"
}
}
},
{
"match": "\\s*+(%)([.duioxXcsfegG])",
"captures": {
"1": {
"name": "support.type.tcl"
},
"2": {
"name": "entity.function.name.tcl"
}
}
},
{
"match": "([;])",
"name": "string"
},
{
"include": "#constant-numeric"
}
]
}
]
},
"regular-expression": {
"patterns": [
{
"match": "(?<!\\\\)(\\#.*)(?=\n|$)",
"name": "comment"
},
{
"match": "(\\.)([?+*])",
"captures": {
"1": {
"name": "support.type.re.anychar.tcl"
},
"2": {
"name": "variable.re.modifier.tcl"
}
}
},
{
"match": "(?<={|^)\\s*(\\^)",
"name": "meta.class.re.start.tcl"
},
{
"match": "(?<!\\\\)(\\$)(?=\\s*}|\n)",
"name": "meta.class.re.end.tcl"
},
{
"match": "(\\\\)(?=\\s*})",
"name": "invalid.illegal.re.tcl"
},
{
"match": "(?<!\\\\)(\\|)",
"name": "meta.constant.re.or.tcl"
},
{
"comment": "the character whose value is 0",
"match": "(?<!\\\\)(\\\\)0[^0-9a-fA-F]",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
}
}
},
{
"comment": "(where X is any character) the character whose low-order 5 bits are the same as those of X, and whose other bits are all zero",
"match": "(?<!\\\\)(\\\\)(c)(.)",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
},
"3": {
"name": "entity.function.name.re.unicode.punctuation.italic.tcl"
}
}
},
{
"comment": "(up to four hexadecimal digits) the Unicode character U+wxyz",
"match": "(?<!\\\\)(\\\\)(u)([0-9a-fA-F]{1,4})",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
},
"3": {
"name": "entity.function.name.re.unicode.punctuation.italic.tcl"
}
}
},
{
"comment": "reserved for a Unicode extension up to 21 bits. The digits are parsed until the first non-hexadecimal character is encountered, the maximun of eight hexadecimal digits are reached, or an overflow would occur in the maximum value of U+10ffff.",
"match": "(?<!\\\\)(\\\\)(U)([0-9a-fA-F]{1,8})",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
},
"3": {
"name": "entity.function.name.re.unicode.punctuation.italic.tcl"
}
}
},
{
"comment": "(where hh is one or two hexadecimal digits) the character whose hexadecimal value is 0xhh",
"match": "(?<!\\\\)(\\\\)(x)([0-9a-fA-F]{1,2})",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
},
"3": {
"name": "entity.function.name.re.unicode.punctuation.italic.tcl"
}
}
},
{
"comment": "the character whose octal value is 0xy?z?. The first digit must be in the range 0-3, otherwise the two-digit form is assumed.",
"match": "(?<!\\\\)(\\\\)([0-3][0-7]{2}|[0-7]{2})",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
},
"3": {
"name": "entity.function.name.re.unicode.punctuation.italic.tcl"
}
}
},
{
"match": "(?<!\\\\)(\\\\)([1-9][0-9]?[0-9]?)",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "meta.constant.numeric.tcl"
}
}
},
{
"match": "(?<!\\\\)(\\\\)([abBefnrtv0dswDSWAmMyYZ])?",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
}
}
},
{
"begin": "(?<!\\\\)(\\()(\\?[!:=])",
"end": "(?<!\\\\)(\\))",
"beginCaptures": {
"1": {
"name": "meta.constant.re.lookahead.close.punctuation.italic.tcl"
},
"2": {
"name": "meta.class.re.lookahead.type.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.constant.re.lookahead.close.punctuation.italic.tcl"
}
},
"patterns": [
{
"include": "#regular-expression"
}
]
},
{
"begin": "(?<!\\\\)(\\()(\\?)(?![!:=\\)])",
"end": "(?<!\\\\)(\\))",
"contentName": "entity.function.name.punctuation.italic.underline.re.meta.flags.tcl",
"beginCaptures": {
"1": {
"name": "meta.constant.re.lookahead.open.punctuation.italic.tcl"
},
"2": {
"name": "keyword.control.re.meta.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.constant.re.lookahead.close.punctuation.italic.tcl"
}
}
},
{
"begin": "(?<!\\\\)(\\[)(\\^)?",
"end": "(?<!\\\\)([\\]])([*?+]([?+]?))?",
"beginCaptures": {
"1": {
"name": "meta.constant.re.lookahead.close.punctuation.italic.tcl"
},
"2": {
"name": "meta.variable.re.negate.chars.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.constant.re.lookahead.close.punctuation.italic.tcl"
},
"2": {
"name": "variable.re.modifier.tcl"
},
"3": {
"name": "support.type.re.nongreedy.punctuation.italic.tcl"
}
},
"contentName": "meta.class",
"patterns": [
{
"match": "(?<!\\\\)(\\\\)(.)",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "meta.class"
}
}
},
{
"begin": "(?<!-)(\\[[:=])",
"end": "([:=]\\])(?!-)",
"beginCaptures": {
"1": {
"name": "entity.function.name.re.bracket.expression.open.punctuation.italic.tcl"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name.re.bracket.expression.close.punctuation.italic.tcl"
}
},
"patterns": [
{
"match": "([^:=\\]]*)(?=[:=]\\])",
"name": "support.type.punctuation.italic.tcl"
}
]
},
{
"match": "(\\\\)([abBefnrtv0dsw])",
"captures": {
"1": {
"name": "support.type.re.escape.tcl"
},
"2": {
"name": "support.type.re.escaped.value.tcl"
}
}
},
{
"match": "(?<!(?<!\\\\)\\\\)(-)",
"name": "entity.function.name"
}
]
},
{
"begin": "(?<!\\\\)(\\()",
"end": "(?<!\\\\)(\\))",
"beginCaptures": {
"1": {
"name": "keyword.control"
}
},
"endCaptures": {
"1": {
"name": "keyword.control"
}
},
"patterns": [
{
"include": "#regular-expression"
}
]
},
{
"match": "(?<!\\\\)({([0-9]*)(\\,)?([0-9]*)?})",
"captures": {
"1": {
"name": "entity.function.name"
},
"2": {
"name": "meta.constant.re.number.tcl"
},
"3": {
"name": "support.type.re.expand.tcl"
},
"4": {
"name": "meta.constant.re.number.tcl"
}
}
},
{
"match": "(?:(?<!\\\\\\.)(?<=\\.))(?<=\\.|\\])((?<!\\\\)[*?+])",
"name": "meta.constant.re.tcl"
},
{
"match": "(?<=\\*|\\+)((?<!\\\\)[*?+])",
"name": "support.type.re.tcl"
},
{
"match": "(?<!\\\\)(\\*)",
"name": "variable.re.modifier.tcl"
},
{
"match": "((?<!\\\\)[.?^!$+])",
"name": "variable.re.modifier.tcl"
},
{
"match": "(?<=\\.)((?<!\\\\)[*?])",
"name": "variable.re.modifier.tcl"
}
]
},
"expressions": {
"patterns": [
{
"include": "#variable"
},
{
"include": "#curly-string-brackets"
},
{
"include": "#square-brackets"
},
{
"include": "#expression-functions"
},
{
"include": "#constant-numeric"
},
{
"include": "#expression-operators"
},
{
"comment": "order-of-operations",
"begin": "(\\()",
"end": "\\s*(\\))",
"beginCaptures": {
"1": {
"name": "entity.function.name.expression.brace.ooo.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name.expression.brace.ooo.close.tcl"
}
},
"patterns": [
{
"include": "#expressions"
}
]
},
{
"include": "#quoted-string"
}
]
},
"constant-numeric": {
"patterns": [
{
"match": "\\s*+((?:#?|\\.)?(?:\\B[-+])?(?:\\b0[bB][0-1]*|\\b0[oO][0-7]*|\\b(0([xX]))[0-9a-fA-F]*|(\\B\\.[0-9]+|\\b[0-9]+(\\.[0-9]*)?)([eE][-+]?[0-9]+)?))",
"captures": {
"1": {
"name": "meta.constant.numeric"
},
"2": {
"name": "punctuation.italic"
},
"3": {
"name": "support.type"
}
}
},
{
"match": "\\s*+\\b(true|false|bool|entier|integer|float|null)\\b",
"name": "meta.constant.punctuation.italic"
}
]
},
"expression-operators": {
"patterns": [
{
"comment": "expression word operators",
"match": "\\b(in|ni|eq|ne)\\b",
"name": "support.type.operator.punctuation.italic.tcl"
},
{
"comment": "expression operators",
"match": "(=|\\+|-|\\*|/|%)",
"name": "support.type.operator.tcl"
},
{
"comment": "expression comparisons",
"match": "([<>])",
"name": "support.type.expression.operator.tcl"
},
{
"comment": "expression bitwise",
"match": "([|^&!~])",
"name": "support.type.expression.operator.tcl"
},
{
"comment": "expression ternary",
"match": "([?:])",
"name": "support.type.expression.operator.tcl"
}
]
},
"expression-functions": {
"patterns": [
{
"begin": "\\b(abs|acos|asin|atan|atan2|bool|ceil|cos|cosh|double|entier|exp|floor|fmod|hypot|int|isqrt|log|log10|max|min|pow|rand|round|sin|sinh|sqrt|srand|tan|tanh|wide)\\b(\\()",
"end": "(\\))",
"beginCaptures": {
"1": {
"name": "entity.function.name.math.function.punctuatio.italic.tcl"
},
"2": {
"name": "entity.function.name.math.function.brace.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name.math.function.brace.close.tcl"
}
},
"patterns": [
{
"include": "#expressions"
}
]
}
]
},
"tcl-vwait": {
"patterns": [
{
"include": "#line-escape"
},
{
"comment": "vwait varName",
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(vwait)\\b\\s*+(?!$|\n|;|^|\\]|})",
"end": "(?=$|\n|;|\\]|}|\\s)\\s*([^$\n^\\];}\\[\\\\]*)?(\\\\(?!\n))?",
"beginCaptures": {
"1": {
"name": "support.type.ns.tcl"
},
"2": {
"name": "keyword.control.vwait.tcl"
}
},
"endCaptures": {
"1": {
"name": "invalid.illegal.numargs.tcl"
},
"2": {
"name": "invalid.illegal.escape.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-proc": {
"patterns": [
{
"begin": "(?<=^|[\\[{;])\\s*(::)?\\b(proc)\\b\\s+([^\\s\n]+)\\s+(?={|\\b|\\[|\"|\\\\$)",
"end": "(?=(?<!\\\\)$)",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.proc.tcl"
},
"3": {
"patterns": [
{
"include": "#variable"
},
{
"include": "#brackets"
},
{
"include": "#namespace-name"
}
]
}
},
"patterns": [
{
"include": "#quoted-string"
},
{
"include": "#proc-arguments"
},
{
"include": "#brackets"
}
]
}
]
},
"tcl-subst": {
"patterns": [
{
"begin": "(?<=^|[\\[{;])\\s*((?:::)?\\bsubst\\b)(?!\\s*$)",
"end": "(?=(?<!\\\\)(?:$|[;\\]}]))|(?<=})",
"beginCaptures": {
"1": {
"name": "keyword.control.subst.tcl",
"patterns": [
{
"include": "#namespace-separator"
}
]
}
},
"patterns": [
{
"begin": "(?<=subst)\\b((?:\\s+(?:-nobackslashes|-nocommands|-novariables))?)(?!\\s*$)",
"end": "(?=(?<!\\\\)(?:$|[;\\]}]))|(?<=})",
"beginCaptures": {
"1": {
"patterns": [
{
"include": "#opt"
}
]
}
},
"patterns": [
{
"include": "#proc-call-args"
}
]
}
]
}
]
},
"tcl-throw": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(throw)\\b\\s+(?!\n)([^\\s]*)",
"end": "\\s*(?=$|\n|}|\\]|;)",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.throw.tcl"
},
"3": {
"name": "support.type",
"patterns": [
{
"include": "#variable"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-binary": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(binary)\\b\\s+(?!\n)([^\\s\\[{;\n\\]]*)",
"end": "\\s*(?=$|\n|\\]|;|})",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.throw.tcl"
},
"3": {
"name": "entity.function.name.binary.tcl",
"patterns": [
{
"include": "#variable"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"begin": "(?<=scan|format)\\s+(?!\n)",
"end": "(?=(?<!\\\\)(?:$|[\n\\]};]))",
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#glob-match"
}
]
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-switch": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(switch)\\b",
"end": "(?=(?<!\\\\)(?:$|[;\\]}]))|(?<=})",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.switch.tcl"
},
"3": {
"name": "entity.function.name.state.tcl"
}
},
"patterns": [
{
"begin": "(?<=switch)\\b(\\s+(?!$)(?:(?:-|\\$)[^\\s\n]*\\s+|\\[[^\\]\n]*(?=\\]))*+)(?!\\s*{|\\[|\\s*$)",
"end": "(?=(?<!\\\\)(?:$|[;\\]}]))",
"beginCaptures": {
"1": {
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#double-dash"
},
{
"include": "#variable"
},
{
"include": "#square-brackets"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"match": "(default)",
"name": "keyword.control.default.switch.unbraced.tcl"
},
{
"include": "#brackets"
},
{
"include": "#bare-string"
}
]
},
{
"begin": "(?<=switch)\\b(\\s+(?!$)(?:(?:-|\\$)[^\\s]*\\s+|\\[[^\\]\n]*(?=\\]))*+)(?=\\s*{)",
"end": "(?=(?<!\\\\)(?:$|[;\\]}]))|(?<=})",
"beginCaptures": {
"1": {
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#double-dash"
},
{
"include": "#variable"
},
{
"include": "#square-brackets"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"begin": "\\s*+({)",
"end": "(})",
"beginCaptures": {
"1": {
"name": "meta.brace.switch.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.brace.switch.close.tcl"
}
},
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"include": "#empty-brackets"
},
{
"match": "\\s?(-)\\s",
"name": "meta.constant.switch.next.tcl"
},
{
"match": "\\s*\\b(default)\\b\\s+(?={)",
"name": "keyword.control.punctuation.italic.tcl"
},
{
"include": "#brackets"
},
{
"include": "#glob-match"
},
{
"include": "#bare-string"
}
]
},
{
"match": "(default)",
"name": "keyword.control.default.switch.unbraced.tcl"
},
{
"include": "#brackets"
},
{
"include": "#bare-string"
}
]
},
{
"begin": "(?<=switch)\\b(\\s+(?!$)(?:(?!(?<!\\\\)$)(?:-|\\$)[^\\s]*(?:(?!\\s*$)\\s+)?|\\[[^\\]\n]*(?=\\]))*+)",
"end": "(?=(?<!\\\\)(?:$|[;\\]}]))|(?<=})",
"beginCaptures": {
"1": {
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#double-dash"
},
{
"include": "#variable"
},
{
"include": "#square-brackets"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"match": "(default)",
"name": "keyword.control.default.switch.unbraced.tcl"
},
{
"include": "#brackets"
},
{
"include": "#bare-string"
}
]
}
]
}
]
},
"tcl-puts": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*\\b(puts)\\b",
"end": "(?=$|\n|}|\\]|;)",
"beginCaptures": {
"1": {
"name": "keyword.control.puts.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"match": "(?:(?<=puts)|^|(?<=-nonewline))\\s*+(?!\n|$)([^\\s$\n;}\\]\\[{\"]*+)(?!\\s*(?:$|\n|}|\\]|;|^))",
"name": "support.type.puts.channel.punctuation.italic.tcl"
},
{
"include": "#square-brackets"
},
{
"include": "#curly-string-brackets"
},
{
"include": "#quoted-string"
},
{
"include": "#bare-string"
}
]
}
]
},
"tcl-global": {
"patterns": [
{
"begin": "(?<=^|{|\\[|;)\\s*\\b(global)\\b",
"end": "(?=$|\n|\\]|}|;)",
"captures": {
"1": {
"name": "keyword.control.global.tcl"
}
},
"patterns": [
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-state-keywords": {
"patterns": [
{
"include": "#line-escape"
},
{
"match": "(?<=state)\\s+\\b(set|get|pull|register|apply_middleware|configure|push|subscription|query|json|serialize)\\b",
"name": "entity.function.state.name.tcl"
},
{
"match": "(?<=state::)([^\\s\\]};]*)",
"captures": {
"1": {
"name": "entity.function.state.name.tcl",
"patterns": [
{
"include": "#namespace-separator"
}
]
}
}
}
]
},
"tcl-state-configure": {
"patterns": [
{
"begin": "(?<=configure|apply_middleware)\\s+(?!$|\n|;|\\]|}|^)([^\\s$}\\]\\[{;\\\\]*)",
"end": "(?=$|\n|\\]|}|;)",
"beginCaptures": {
"1": {
"name": "meta.class"
},
"2": {
"patterns": [
{
"include": "#tcl-class-name"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-state-register": {
"patterns": [
{
"begin": "(?<=register)(\\s+[^\\s\\[\\];\n]+)?",
"end": "(?<=})",
"beginCaptures": {
"1": {
"name": "meta.constant",
"patterns": [
{
"include": "#tcl-class-name"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#square-brackets"
},
{
"begin": "\\s*({)",
"end": "\\s*(})",
"captures": {
"1": {
"name": "meta.bracket.state.register.tcl"
}
},
"patterns": [
{
"include": "#tcl-state-option-title"
},
{
"include": "#tcl-state-option-items"
},
{
"begin": "(?<=^|\\s)(middlewares|config|default)\\b(?=\\s*{)",
"end": "(?<=})",
"beginCaptures": {
"1": {
"name": "keyword.state.register.tcl"
}
},
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"begin": "(?<=config|default)\\s+({)",
"end": "\\s*(})",
"captures": {
"1": {
"name": "meta.bracket.state.config.tcl"
}
},
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"begin": "\\s*([^\\s|}|{|;]*)\\s+({)",
"end": "(})",
"beginCaptures": {
"1": {
"name": "variable"
}
},
"patterns": [
{
"include": "#property-list"
}
]
},
{
"match": "\\s*([^\\s|}|{|;]*)(\\s+[^}|{|;]*)",
"captures": {
"1": {
"name": "variable",
"patterns": [
{
"include": "#variable"
}
]
},
"2": {
"name": "string",
"patterns": [
{
"include": "#constant-numeric"
}
]
}
}
},
{
"include": "#curly-string-brackets"
}
]
},
{
"begin": "(?<=middlewares)\\s*+({)",
"end": "\\s*(})",
"patterns": [
{
"match": "\\s*([^\\s|}|;]*)",
"captures": {
"1": {
"name": "meta.class.state.middleware.tcl"
}
}
}
]
}
]
}
]
}
]
}
]
},
"tcl-state-unsubscribe": {
"patterns": [
{
"begin": "\\b(unsubscribe)\\b",
"end": "(?=$|\n|;|\\]|})",
"patterns": [
{
"include": "#opt"
},
{
"include": "#glob-match"
}
]
}
]
},
"tcl-state-subscribe": {
"patterns": [
{
"begin": "\\s*\\b(subscribe)\\b",
"end": "(?<=})|(?=$|\n|;|\\])",
"beginCaptures": {
"1": {
"name": "entity.function.name.state.subscribe.tcl"
}
},
"patterns": [
{
"match": "(?<=subscribe)\\b(?!\\[)(\\s+[^\\s\n]*)(?:(?!\\s*(?:$|;|}|\\]))\\s*)?",
"name": "meta.class.state.name",
"captures": {
"1": {
"patterns": [
{
"include": "#variable"
}
]
}
}
},
{
"match": "(?=\\s*\\$)(\\s*[^\\s]*)(?:(?!\\s*(?:$|;|}|\\]))\\s*)?",
"captures": {
"1": {
"patterns": [
{
"include": "#variable"
}
]
}
}
},
{
"include": "#square-brackets"
},
{
"include": "#empty-brackets"
},
{
"begin": "(?<!})\\s*({)",
"end": "\\s*(})",
"beginCaptures": {
"1": {
"name": "meta.brace.state.subscribe.params.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.brace.state.subscribe.params.close.tcl"
}
},
"patterns": [
{
"include": "#tcl-state-common-options"
},
{
"include": "#variable-non-substituting"
},
{
"include": "#tcl-state-id"
},
{
"begin": "(?<=^|\\s|;)\\s*(conditions)\\b",
"end": "(?<=})",
"beginCaptures": {
"1": {
"name": "keyword.state.register.tcl"
}
},
"patterns": [
{
"include": "#tcl-state-conditions"
}
]
}
]
},
{
"include": "#brackets"
}
]
}
]
},
"tcl-state-common-options": {
"patterns": [
{
"include": "#tcl-state-option-title"
},
{
"include": "#tcl-state-option-items"
},
{
"match": "(?<=^|;)\\s*(config|vendor)",
"name": "keyword.control.tcl"
},
{
"begin": "(?<=config|default|vendor)\\s*+({)",
"end": "\\s*(})",
"patterns": [
{
"match": "(\\s*[^\\s|}|{|;]*)(\\s+[^\\s|}|{|;]*)",
"captures": {
"1": {
"name": "variable"
},
"2": {
"name": "string",
"patterns": [
{
"include": "#constant-numeric"
}
]
}
}
},
{
"include": "#curly-string-brackets"
}
]
}
]
},
"tcl-state-option-title": {
"patterns": [
{
"match": "(?<=^|\\s)\\s*(title)\\b(\\s+[^$|\n|;]*)",
"captures": {
"1": {
"name": "keyword.state.register.tcl"
},
"2": {
"patterns": [
{
"include": "#quoted-string"
},
{
"include": "#curly-string-brackets"
},
{
"match": "\\b([^\\s]*)\\b\\s*([^$|\n]*)?",
"captures": {
"1": {
"name": "string"
},
"2": {
"name": "invalid.illegal.state.title.tcl"
}
}
}
]
}
}
}
]
},
"tcl-state-option-attributes": {
"patterns": [
{
"begin": "(?<=^|\\s)\\s*(attributes|formatters)\\b\\s+{",
"end": "\\s*(})",
"beginCaptures": {
"1": {
"name": "keyword.control.state.attributes.tcl"
}
},
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"begin": "\\s*\\[",
"end": "\\s*]",
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"include": "#proc-call"
}
]
},
{
"match": "(?<!\\|)(\\s+[^\\s|\\$|\\[|\\]|}|{|;]*)(\\s+[^\\s|\\$|\\[|\\]|}|{|;]*)",
"captures": {
"1": {
"name": "variable"
},
"2": {
"name": "support.type.state.attribute.name.tcl"
}
}
},
{
"match": "\\s*(\\|)",
"name": "entity.function.name.separator.tcl"
},
{
"include": "#variable-non-substituting"
},
{
"include": "#constant-numeric"
},
{
"include": "#curly-string-brackets"
}
]
}
]
},
"tcl-state-option-descriptions": {
"patterns": [
{
"include": "#tcl-state-option-descriptions-titles"
},
{
"include": "#tcl-state-option-descriptions-descriptions"
}
]
},
"tcl-state-option-descriptions-titles": {
"patterns": [
{
"begin": "(?<=^|\\s)\\s*(titles)\\b\\s+{",
"end": "\\s*(})",
"contentName": "variable",
"beginCaptures": {
"1": {
"name": "keyword.control.state.attributes.tcl"
}
},
"patterns": [
{
"include": "#tcl-state-option-descriptions-patterns"
},
{
"include": "#tcl-state-option-descriptions-titles"
}
]
}
]
},
"tcl-state-option-descriptions-descriptions": {
"patterns": [
{
"begin": "(?<=^|\\s)\\s*(descriptions)\\b\\s+{",
"end": "\\s*}",
"beginCaptures": {
"1": {
"name": "keyword.control.state.attributes.tcl"
}
},
"patterns": [
{
"include": "#quoted-string"
},
{
"include": "#tcl-state-option-descriptions-patterns"
},
{
"begin": "\\s*({)",
"end": "\\s*}",
"patterns": [
{
"include": "#tcl-state-option-descriptions-patterns"
}
]
}
]
}
]
},
"tcl-state-option-descriptions-patterns": {
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"include": "#quoted-string"
},
{
"begin": "(?<=^|{)\\s*([^\\s]*)\\s+(?=\")",
"end": "(?<=\")",
"beginCaptures": {
"1": {
"name": "support.type"
}
},
"patterns": [
{
"include": "#quoted-string"
}
]
},
{
"include": "#constant-numeric"
},
{
"begin": "(?<=^|{)\\s*(items)\\s+{",
"end": "\\s*(})",
"beginCaptures": {
"1": {
"name": "support.type"
}
},
"patterns": [
{
"include": "#tcl-state-option-descriptions-patterns"
},
{
"include": "#quoted-string"
}
]
},
{
"begin": "(?<=^|{)\\s*([^\\s]*)\\s+(?={)",
"end": "(?<=})",
"beginCaptures": {
"1": {
"name": "support.type"
}
},
"patterns": [
{
"include": "#html-curly-brackets"
}
]
}
]
},
"tcl-state-option-items": {
"patterns": [
{
"begin": "(?<=^|\\s)\\s*(items)\\b",
"end": "(?<=})",
"beginCaptures": {
"1": {
"name": "keyword.state.register.tcl"
}
},
"patterns": [
{
"begin": "\\s*+({)",
"end": "\\s*(})",
"patterns": [
{
"begin": "(?<=^|;)\\s*\\b(optional|required|key)?\\b\\s+(string|bool|number|string|ip|json|mac|enum|ni|match|include|range|percent|greater|less|dict|array|numberArray)\\b\\s+([^\\s|\\||;|}]*)",
"end": "\\s*(?=$|;|\n)",
"beginCaptures": {
"1": {
"name": "meta.constant",
"patterns": [
{
"match": "(key)",
"name": "markup.bold"
}
]
},
"2": {
"name": "support.type"
},
"3": {
"name": "variable"
}
},
"patterns": [
{
"begin": "\\s*+(\\|)",
"end": "(?=$|;|\n)",
"beginCaptures": {
"1": {
"name": "support.type"
}
},
"name": "string",
"patterns": [
{
"include": "#constant-numeric"
}
]
}
]
}
]
}
]
}
]
},
"tcl-state-option-evaluate": {
"patterns": [
{
"applyEndPatternLast": 1,
"begin": "(?<=^|\\s)\\s*(evaluate)\\b\\s*",
"end": "(?<=})",
"beginCaptures": {
"1": {
"name": "keyword.state.register.tcl"
}
},
"patterns": [
{
"include": "#proc-arguments"
},
{
"include": "#brackets"
}
]
}
]
},
"tcl-state-id": {
"patterns": [
{
"match": "(?<=^|\\s)\\s*(id)\\b(\\s+[^$|\n|;]*)",
"captures": {
"1": {
"name": "markup.bold.keyword.state.register.tcl"
},
"2": {
"patterns": [
{
"include": "#quoted-string"
},
{
"include": "#curly-string-brackets"
},
{
"match": "\\b([^\\s]*)\\b\\s*([^$|\n]*)?",
"captures": {
"1": {
"name": "string"
},
"2": {
"name": "invalid.illegal.state.title.tcl"
}
}
}
]
}
}
}
]
},
"tcl-state-conditions": {
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"begin": "\\s*+({)",
"end": "\\s*(})",
"patterns": [
{
"include": "#tcl-state-conditions"
},
{
"include": "#constant-numeric"
},
{
"match": "(?<=\\s|{|^)(\\*)\\s",
"name": "meta.class"
},
{
"match": "(?<={|^|;)\\s*([^\\s|}|\\*|;]*)\\s+",
"captures": {
"1": {
"name": "variable"
}
}
},
{
"match": "\\b(set|modified|change(?:d|s)|created|removed|deleted|existed|defined|exists|created|added)\\b\\s*(?=$|}|;)",
"name": "entity.function.name"
},
{
"match": "([^\\s]*)\\s*(?=$)",
"name": "meta.class"
},
{
"match": "\\b(is|becomes|was|not|reverse)\\b(?!\\s*\\|)",
"name": "punctuation.italic.entity.name.function"
},
{
"match": "(?<=\\s)(\\b(?:rises above|include|ne|not equal|eq|equal|greater equal|ge|greather than|ge|less equal|le|falls below|divisible by|is in|in|not in|ni|match|regexp|notInclude|startsWith|starts with|endsWith|ends with|command|isType|eval)\\b|(?:\\>|=|==|<=|>=|>_|_<|%))(?=\\s*\\|)",
"name": "support.type"
},
{
"begin": "\\s*+(\\|)",
"end": "(?=$|;|\n|}|\\])",
"beginCaptures": {
"1": {
"name": "entity.function.name.condition.tcl"
}
},
"name": "string",
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"include": "#glob-match"
},
{
"include": "#constant-numeric"
}
]
}
]
}
]
},
"tcl-state-setter-getter": {
"patterns": [
{
"begin": "(?<=set|get|pull|push)\\b",
"end": "(?=(?<!\\\\)$|[\n;\\]}])",
"patterns": [
{
"include": "#line-escape"
},
{
"begin": "(?<=set|get|pull|push)\\b\\s*",
"end": "(?=$|[\\s\\]};])",
"patterns": [
{
"include": "#tcl-class-name"
}
]
},
{
"begin": "\\s*({)",
"end": "(})",
"beginCaptures": {
"1": {
"name": "entity.function.name.state.brace.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name.state.brace.close.tcl"
}
},
"patterns": [
{
"match": "\\s*([^\\s|}|\\]|$|\n]*)\\s+([^\\s|}]*)",
"captures": {
"1": {
"name": "string"
},
"2": {
"name": "variable"
}
}
}
]
},
{
"include": "#brackets"
},
{
"include": "#variable"
},
{
"include": "#variable-bare"
}
]
}
]
},
"tcl-class-name": {
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#namespace-separator"
},
{
"include": "#square-brackets"
},
{
"match": "(?:(?=\\s)\\s*)?(\\w+)",
"name": "meta.class"
}
]
},
"tcl-incr": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(incr)\\b",
"end": "\\s*(?=$|\n|}|\\]|;)",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.incr.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#constant-numeric"
},
{
"include": "#brackets"
},
{
"include": "#variable"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-lassign": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(lassign)\\b",
"end": "\\s*(?=$|\n|\\]|})",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.lassign.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#brackets"
},
{
"include": "#variable"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-entity-commands": {
"patterns": [
{
"begin": "\\s*(::)?\\b(tailcall)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"captures": {
"1": {
"name": "support.type.ns.separator.tcl"
},
"2": {
"name": "keyword.control.tailcall.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#proc-call"
},
{
"include": "#namespace-name"
}
]
},
{
"begin": "(?<=^|[\\[{;]|tailcall)\\s*(::)?\\b(info|eof|read|fileevent|fblocked|flush|gets|chan|coroutine|eval|tls|http|clock|array|encoding|binary|file|task|after|tailcall|rename|callback|state|json|exec|pubsub)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.ent.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"match": "(?<=(?:info|clock|http|binary|coroutine|chan|encoding|file|task|array|after|tailcall|rename|callback|state|json|exec|pubsub))\\s+(?:(?!$|{|\\[|;|\n)([^\\s\\]}\\[{;\n\"]*))?",
"captures": {
"1": {
"patterns": [
{
"include": "#variable"
},
{
"include": "#constant-numeric"
},
{
"include": "#opt"
},
{
"include": "#namespace-name"
}
]
}
}
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-array": {
"patterns": [
{
"include": "#namespace-separator"
},
{
"begin": "(?<=^|[\\[{;]|tailcall\\s)\\s*(?:::)?(array\\b)",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "keyword.control.array.tcl"
}
},
"patterns": [
{
"include": "#tcl-array-set"
},
{
"include": "#tcl-array-get"
},
{
"include": "#tcl-array-commands"
}
]
}
]
},
"tcl-array-commands": {
"patterns": [
{
"begin": "(?<=array)(?:::)?\\s+(names|donesearch|anymore|exists|nextelement|size|startsearch|statistics|unset)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "entity.function.name.array.command.tcl"
}
},
"patterns": [
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-array-set": {
"patterns": [
{
"begin": "(?<=array)(?:::)?\\s+(set)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "entity.function.name.array.set.tcl"
}
},
"patterns": [
{
"begin": "(?<=set)\\s+(?!$|[\n;}\\]])([^\\s\\];]*)",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"patterns": [
{
"include": "#variable"
},
{
"include": "#variable-bare"
}
]
}
},
"patterns": [
{
"include": "#empty-brackets"
},
{
"include": "#property-list-brackets"
},
{
"include": "#proc-call-args"
}
]
}
]
}
]
},
"tcl-array-get": {
"patterns": [
{
"begin": "(?<=array)(?:::)?\\s+(get)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "entity.function.name.array.get.tcl"
}
},
"patterns": [
{
"begin": "(?<=get)(\\s+(?!$|[\n;\\]])[^\\s\\]};\n]*)",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"captures": {
"1": {
"patterns": [
{
"include": "#variable-bare"
}
]
}
},
"patterns": [
{
"include": "#proc-call-args"
}
]
}
]
}
]
},
"tcl-oo": {
"comment": "handle tcl specific commands and evaluation",
"patterns": [
{
"begin": "(?<=^|[\\[{;]|tailcall)\\s*((?:::)?(oo)::)?\\b((?:module|mixin|define|(?:meta)?class|objdefine|Helpers|InfoObject|copy|object|Slot|UnknownDefinition)\\b|Obj[0-9]*)",
"end": "(?=$|[\n;}\\]\\[{])",
"beginCaptures": {
"1": {
"name": "entity.function.name.tcl"
},
"2": {
"name": "keyword.control.oo.tcl"
},
"3": {
"name": "keyword.control.oo.command"
}
},
"patterns": [
{
"include": "#opt"
},
{
"include": "#variable"
},
{
"include": "#tcl-oo-commands"
}
]
}
]
},
"tcl-oo-commands": {
"patterns": [
{
"include": "#tcl-oo-create"
},
{
"include": "#tcl-oo-define"
}
]
},
"tcl-oo-create": {
"patterns": [
{
"begin": "(?<=class|module|metaclass)\\b\\s+\\b(create)\\b",
"end": "(?=$|[\n;\\]])|(?<=})",
"captures": {
"1": {
"name": "entity.function.name.oo.create.tcl"
}
},
"patterns": [
{
"begin": "(?<=create)\\s+(?!$|[\\]\n\\[$;\\}])",
"end": "\\s",
"patterns": [
{
"include": "#variable"
},
{
"include": "#tcl-class-name"
}
]
},
{
"include": "#tcl-oo-eval-brackets"
},
{
"include": "#variable"
}
]
}
]
},
"tcl-oo-define": {
"patterns": [
{
"begin": "(?<=define)",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"patterns": [
{
"begin": "(?<=define)\\s+(?!$|[\n;\\]}\\[$])",
"end": "\\s",
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#tcl-class-name"
}
]
},
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#square-brackets"
},
{
"include": "#opt"
},
{
"include": "#tcl-oo-define-constructor"
},
{
"include": "#tcl-oo-define-destructor"
},
{
"include": "#tcl-oo-define-method"
},
{
"include": "#tcl-oo-eval-brackets"
},
{
"include": "#namespace-name"
}
]
}
]
},
"tcl-oo-define-destructor": {
"patterns": [
{
"begin": "(destructor)",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "keyword.control.oo.define.constructor.tcl"
}
},
"patterns": [
{
"include": "#brackets"
}
]
}
]
},
"tcl-oo-define-constructor": {
"patterns": [
{
"begin": "(constructor)\\s+(?!$|[\n;\\]}])",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "keyword.control.oo.define.constructor.tcl"
}
},
"patterns": [
{
"include": "#proc-arguments"
},
{
"include": "#brackets"
}
]
}
]
},
"tcl-oo-define-method": {
"patterns": [
{
"begin": "(method)\\s+([^\\s]*)\\s+(?!$|[\n;\\]}])",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "keyword.control.oo.define.method.tcl"
},
"2": {
"patterns": [
{
"include": "#namespace-name"
}
]
}
},
"patterns": [
{
"include": "#proc-arguments"
},
{
"include": "#brackets"
}
]
}
]
},
"tcl-oo-eval-brackets": {
"comment": "evaluating inside of a class create or define",
"patterns": [
{
"begin": "\\s*(\\{)",
"end": "\\s*(\\})",
"beginCaptures": {
"1": {
"name": "meta.bracket.curly.oo.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.bracket.curly.oo.close.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#tcl-oo-my"
},
{
"include": "#tcl-oo-constructor"
},
{
"include": "#tcl-oo-destructor"
},
{
"include": "#tcl-oo-method"
},
{
"include": "#tcl-oo-variable"
},
{
"include": "#tcl-oo-mixin"
},
{
"include": "#tcl-oo-exports"
},
{
"include": "#proc-call"
}
]
}
]
},
"tcl-oo-keywords": {
"patterns": [
{
"include": "#tcl-oo-my"
},
{
"include": "#tcl-oo-self"
}
]
},
"tcl-oo-exports": {
"patterns": [
{
"begin": "(?<=^|[{;])\\s*(unexport|export)",
"end": "(?=(?<!\\\\)(?:$|[\n;]))",
"captures": {
"1": {
"name": "keyword.control.oo.unexport.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#namespace-name"
}
]
}
]
},
"tcl-oo-method": {
"patterns": [
{
"applyEndPatternLast": 1,
"begin": "\\s*(method)\\s+([^\\s]*)\\s*",
"end": "\\s*",
"beginCaptures": {
"1": {
"name": "keyword.control.oo.method.tcl\""
},
"2": {
"name": "entity.function.name.oo.method.tcl"
}
},
"patterns": [
{
"include": "#proc-arguments"
},
{
"include": "#tcl-oo-brackets"
}
]
}
]
},
"tcl-oo-my": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*+\\b(my)\\b",
"end": "\\s*(?=$|\n|;|\\]|})",
"beginCaptures": {
"1": {
"name": "keyword.control.oo.my.punctuation.italic.tcl"
}
},
"patterns": [
{
"begin": "(?<=my)\\b\\s+\\b(variable)\\b",
"end": "(?=$|^|\n|;)",
"beginCaptures": {
"1": {
"name": "keyword.control.my.variable.oo.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"match": "([^\\s|\\]|}|$])",
"name": "variable"
}
]
},
{
"match": "(?<=my)\\b\\s+([^\\s\\]};]*)",
"captures": {
"1": {
"name": "entity.function.name.my.method.oo.tcl"
}
}
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-oo-self": {
"patterns": [
{
"match": "(?<=^|\\[)\\s*(self)",
"captures": {
"1": {
"name": "keyword.control.oo.my.punctuation.italic.tcl"
}
}
},
{
"match": "(?<=self)\\s+(next)",
"captures": {
"1": {
"name": "entity.function.name.punctuation.italic.tcl"
}
}
}
]
},
"tcl-oo-variable": {
"patterns": [
{
"begin": "(?<=^|[;{])\\s*(variable)\\b",
"end": "\\s*(?=(?<!\\\\)(?:$|[;\n]))",
"captures": {
"1": {
"name": "keyword.control.oo.variable.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-oo-constructor": {
"patterns": [
{
"begin": "(?<=^|{)\\s*\\b(constructor)\\b(?:(?!$)\\s+)?",
"end": "(?<=})",
"captures": {
"1": {
"name": "keyword.control.oo.eval.constructor.tcl"
},
"2": {
"name": "variable.other.tcl"
}
},
"patterns": [
{
"include": "#proc-arguments"
},
{
"include": "#brackets"
}
]
}
]
},
"tcl-oo-destructor": {
"patterns": [
{
"begin": "(?<=^|{)\\s*\\b(destructor)\\b",
"end": "(?<=})",
"captures": {
"1": {
"name": "keyword.contorl.oo.eval.destructor.tcl"
}
},
"patterns": [
{
"include": "#brackets"
}
]
}
]
},
"tcl-oo-mixin": {
"patterns": [
{
"begin": "\\s*\\b(mixin|superclass)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"captures": {
"1": {
"name": "keyword.control.oo.mixin.tcl"
}
},
"patterns": [
{
"include": "#tcl-class-name"
}
]
}
]
},
"classname": {
"patterns": [
{
"include": "#line-escape"
},
{
"match": "(?<=\\s)\\s*([^\\s;\\\\\\[]*)",
"name": "meta.class"
},
{
"include": "#square-brackets"
}
]
},
"tcl-expression-keywords": {
"patterns": [
{
"applyEndPatternLast": 1,
"begin": "\\s*+((::|-)?(if|expr|while))\\b\\s+(?={)",
"end": "(?<=})",
"beginCaptures": {
"1": {
"name": "keyword.control.if.tcl",
"patterns": [
{
"include": "#namespace-separator"
},
{
"include": "#opt"
}
]
},
"2": {
"name": "support.type"
},
"3": {
"name": "keyword.control.if.tcl"
}
},
"endCaptures": {
"1": {
"name": "keyword.control.if.end.tcl"
}
},
"patterns": [
{
"include": "#if-handlers"
}
]
},
{
"begin": "(?<=^|\\[|{|;)\\s*(::|-)?(expr)\\b",
"end": "(?=$|;|}|\\])",
"beginCaptures": {
"1": {
"name": "support.type.expr.ns.tcl"
},
"2": {
"name": "keyword.control.expr.unbraced.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#expressions"
}
]
}
]
},
"if-handlers": {
"patterns": [
{
"include": "#expression-brackets"
},
{
"include": "#if-else-if"
},
{
"include": "#if-else"
},
{
"include": "#curly-brackets"
}
]
},
"if-else-if": {
"patterns": [
{
"begin": "(?<=\\})\\s+(elseif)\\s+",
"end": "\\s*",
"beginCaptures": {
"1": {
"name": "keyword.control.elseif.tcl"
}
},
"patterns": [
{
"include": "#expression-brackets"
},
{
"include": "#brackets"
}
]
}
]
},
"if-else": {
"patterns": [
{
"begin": "(?<=\\})\\s+(else)\\s+(?=\\{)",
"end": "(?<=\\}|$)",
"beginCaptures": {
"1": {
"name": "keyword.control.else.tcl"
}
},
"patterns": [
{
"include": "#brackets"
}
]
}
]
},
"if-block": {
"patterns": [
{
"applyEndPatternLast": 1,
"begin": "(?<=\\})\\s+(\\{)",
"end": "(\\})",
"beginCaptures": {
"1": {
"name": "keyword.control"
}
},
"patterns": [
{
"include": "$self"
}
]
}
]
},
"tcl-try-catch": {
"patterns": [
{
"applyEndPatternLast": 1,
"begin": "(?<=^|[\\[{;]|tailcall)\\s*(::)?\\b(try)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "support.type.ns.separator"
},
"2": {
"name": "keyword.control.try.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#tcl-try-trap"
},
{
"include": "#tcl-try-on"
},
{
"include": "#tcl-try-finally"
},
{
"include": "#brackets"
}
]
}
]
},
"tcl-try-on": {
"patterns": [
{
"applyEndPatternLast": 1,
"begin": "(?<=}|\\])\\s+\\b(on)\\b\\s+\\b(error|return|break|continue|ok|[0-9]*)\\b(?:\\s+(?={|\\b|\\$|\"|\\[|\\\\\n)|\\s+(?!$|\n))",
"end": "\\s*(?=$|[{\\[;\n])",
"beginCaptures": {
"1": {
"name": "keyword.control.try.on.tcl"
},
"2": {
"name": "keyword.control.try.on.tcl",
"patterns": [
{
"include": "#constant-numeric"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#arguments-braced"
},
{
"match": "(?!\\s)([^\\s;\\]}\n$]*)(?=\\s+(?:{|\\[|\n|\\\\\n))",
"captures": {
"1": {
"name": "variable.name"
}
}
},
{
"include": "#variable"
}
]
}
]
},
"tcl-try-trap": {
"patterns": [
{
"applyEndPatternLast": 1,
"begin": "(?<=}|\\])\\s+\\b(trap)\\b",
"end": "(?=\\s*{)",
"beginCaptures": {
"1": {
"name": "keyword.control.try.trap.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#square-brackets"
},
{
"match": "(?<=trap)\\s+(?=\\b)([^\\s;\\]\\[}\n$]+)(?:(?!\n|$|\\\\)\\s+)?",
"captures": {
"1": {
"name": "support.type.try.trap.name.tcl"
}
}
},
{
"begin": "(?<=trap)\\s+({)",
"end": "(})(?:\\s+(?!\n|$|^))?",
"contentName": "support.type.try.trap.name.tcl"
},
{
"include": "#arguments-braced"
},
{
"match": "([^\\s$\n;\\[{}\\]]+)(?=\\s+{)",
"name": "variable"
}
]
}
]
},
"tcl-try-finally": {
"patterns": [
{
"begin": "(?<=})\\s+(finally)\\s+(?=[{\\[])",
"end": "(?<=[}\\];])",
"beginCaptures": {
"1": {
"name": "keyword.control.try.onerror.tcl"
}
},
"patterns": [
{
"include": "#brackets"
}
]
}
]
},
"tcl-setters": {
"patterns": [
{
"include": "#tcl-set"
},
{
"include": "#tcl-unset"
},
{
"include": "#tcl-append"
}
]
},
"tcl-set": {
"patterns": [
{
"begin": "(?<=^|[\\[{;]|tailcall)\\s*(::)?\\b(set|variable)\\b\\s+(?!\n|$)",
"end": "(?=(?<!\\\\)(?:$|[;\\]}]))",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.set.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#variable-bare"
},
{
"include": "#regexp"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-append": {
"patterns": [
{
"begin": "(?<=^|[\\[{;]|tailcall)\\s*(::)?\\b(append|lappend)\\b(?:(\\s+[^\\s]*))?",
"end": "(?=$|^|;|}|\\])",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.set.tcl"
},
"3": {
"patterns": [
{
"include": "#variable-bare-italic"
},
{
"include": "#variable"
}
]
}
},
"patterns": [
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-unset": {
"patterns": [
{
"contentName": "punctuation.variable.set.italic.tcl",
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(unset)",
"end": "\\s*(?=$|;|\n|}|\\])",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.unset.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#brackets"
},
{
"match": "\\s*([^\\s|}|\\]|;]*)",
"captures": {
"1": {
"name": "punctuation.variable.set.italic.tcl"
}
}
}
]
}
]
},
"tcl-namespace": {
"patterns": [
{
"begin": "(?<=^|[{\\[;]|tailcall)\\s*(::)?\\b(namespace)\\b",
"end": "(?=(?<!\\\\)$)|(?=[\\];}])",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.namespace.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#tcl-namespace-eval"
},
{
"include": "#tcl-namespace-entity-commands"
},
{
"include": "#tcl-namespace-subcommands"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-namespace-eval": {
"begin": "\\s*\\b(eval|exists)\\b\\s*",
"end": "(?=(?<!\\\\\n)$|(?<!\\\\)\n|[}\\];{\\[])",
"beginCaptures": {
"1": {
"name": "keyword.control.namespace.eval.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#namespace-name"
},
{
"include": "#brackets"
}
]
},
"tcl-namespace-entity-commands": {
"begin": "\\s*\\b(delete)\\b\\s*",
"end": "(?=(?<!\\\\\n)$|(?<!\\\\)\n|[}\\];{\\[])",
"beginCaptures": {
"1": {
"name": "keyword.control.name.namespace.eval.tcl"
}
},
"patterns": [
{
"include": "#variable"
},
{
"include": "#line-escape"
},
{
"include": "#namespace-name"
},
{
"include": "#brackets"
}
]
},
"tcl-namespace-subcommands": {
"match": "\\s*\\b(exists|ensemble|children|code|current|export|forget|import|inscope|origin|parent|path|qualifiers|tail|upvar|unknown|which)\\b",
"captures": {
"1": {
"name": "entity.function.name.namespace.subcommand.tcl"
}
}
},
"namespace-name": {
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#namespace-separator"
},
{
"match": "(?![\\s{}\\[\\]])([^\\s:$\\[\\]}{;\n]+)",
"name": "entity.function.name.tcl"
}
]
},
"namespace-separator": {
"patterns": [
{
"match": "(?<!:)(:)(?!:)|(?<=::)(:)(?!:)",
"name": "string"
},
{
"match": "(::)",
"name": "support.type"
}
]
},
"tcl-foreach": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(foreach)\\b(?:(?=\\s+{)\\s+)?",
"end": "(?=(?<!\\\\)$)|(?<=})",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.keyword.foreach.loop.tcl"
}
},
"patterns": [
{
"include": "#arguments-braced"
},
{
"include": "#brackets"
},
{
"include": "#variable"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-catch": {
"patterns": [
{
"begin": "(?<=\\[|{|^|tailcall)\\s*(::)?\\b(catch)\\b(?=\\s)",
"end": "(?=\\]|}|$|(?<!\\\\)\n|;)",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.string.tcl"
}
},
"patterns": [
{
"include": "#brackets"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-upvar": {
"patterns": [
{
"begin": "(?<=\\[|\\{|^|tailcall)\\s*(::)?\\b(upvar)\\b",
"end": "\\s*(?=\\]|}|$|;)",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.string.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#constant-numeric"
},
{
"include": "#variable"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-info": {
"patterns": [
{
"begin": "(?<=\\[|\\{|^|tailcall)\\s*(::)?\\b(info)\\b",
"end": "(?=(?<!\\\\)$|[\n;\\]}])",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.string.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#square-brackets"
},
{
"include": "#tcl-info-exists"
},
{
"include": "#tcl-info-oo"
},
{
"include": "#tcl-info-subcommands"
}
]
}
]
},
"tcl-info-exists": {
"patterns": [
{
"begin": "\\b(exists)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "entity.function.name.info.exists.tcl"
}
},
"patterns": [
{
"include": "#variable"
},
{
"include": "#line-escape"
},
{
"include": "#square-brackets"
},
{
"include": "#variable-bare-italic"
}
]
}
]
},
"tcl-info-oo": {
"patterns": [
{
"begin": "(?<=info)\\s+(class|object)\\b",
"end": "(?=(?<!\\\\)$|[\n;\\]}])",
"captures": {
"1": {
"name": "entity.function.name.info.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"begin": "(?<=object)\\s+\\b(isa|vars|class)\\b",
"end": "(?=(?<!\\\\)$|[\n;\\]}])",
"captures": {
"1": {
"name": "keyword.control.info.class.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#square-brackets"
},
{
"include": "#tcl-class-name"
}
]
},
{
"begin": "(?<=class)\\s+\\b(constructor|destructor|instances|subclasses|superclasses)\\b",
"end": "(?=(?<!\\\\)$|[\n;\\]}])",
"captures": {
"1": {
"name": "keyword.control.info.class.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#square-brackets"
},
{
"include": "#tcl-class-name"
}
]
},
{
"begin": "(?<=class|object)\\s+\\b(call|definition|filters|forward|methods|methodtype|mixins|variables)\\b",
"end": "(?=(?<!\\\\)$|[\n;\\]}])",
"captures": {
"1": {
"name": "keyword.control.info.class.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#tcl-class-name"
}
]
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-info-pattern-commands": {
"patterns": [
{
"begin": "\\b(command(?:s)?|globals|locals|procs|vars|functions)\\b",
"end": "\\s*(?=$|\n|}|\\]|;)",
"captures": {
"1": {
"name": "entity.function.name.tcl"
}
},
"patterns": [
{
"include": "#constant-numeric"
},
{
"include": "#namespace-name"
},
{
"include": "#glob-match"
}
]
}
]
},
"tcl-info-subcommands": {
"patterns": [
{
"include": "#tcl-info-pattern-commands"
},
{
"begin": "\\b(level|frame|coroutine|nameofexecutable|nameofexe|args|body|cmdcount|complete|default|hostname|library|loaded|patchlevel|script|sharedlibextension|tclversion)\\b\\s*",
"end": "\\s*(?=$|\n|}|\\]|;)",
"captures": {
"1": {
"name": "entity.function.name.tcl"
}
},
"patterns": [
{
"include": "#constant-numeric"
},
{
"include": "#namespace-name"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-string": {
"patterns": [
{
"begin": "(?<=^|[\\[{;]|tailcall)\\s*(::)?\\b(string)\\b",
"end": "(?=}|\\]|;|$|\n)",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.string.tcl"
}
},
"patterns": [
{
"include": "#tcl-string-is"
},
{
"include": "#tcl-string-match"
},
{
"include": "#tcl-string-matchfirst"
},
{
"include": "#tcl-string-map"
},
{
"include": "#tcl-string-subcommands"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-string-is": {
"patterns": [
{
"match": "\\s*\\b(is)\\b\\s+([^\\s}\\];]*)",
"captures": {
"1": {
"name": "entity.function.name.string.is.tcl"
},
"2": {
"name": "support.type",
"patterns": [
{
"include": "#variable"
}
]
}
}
}
]
},
"tcl-string-match": {
"patterns": [
{
"begin": "(?<=string)\\s+\\b(match)\\b",
"end": "(?=$|\n|\\]|}|;)",
"captures": {
"1": {
"name": "entity.function.name.string.is.tcl"
},
"2": {
"name": "string"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#variable"
},
{
"include": "#glob-match"
},
{
"include": "#curly-string-brackets"
},
{
"include": "#square-brackets"
},
{
"include": "#constant-numeric"
}
]
}
]
},
"tcl-string-matchfirst": {
"patterns": [
{
"begin": "\\s*\\b(matchfirst)\\b",
"end": "\\s*(?=\\]|}|$|;)",
"captures": {
"1": {
"name": "entity.function.name.string.is.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#curly-string-brackets"
},
{
"include": "#constant-numeric"
},
{
"include": "#glob-match"
},
{
"include": "#variable"
}
]
}
]
},
"tcl-string-map": {
"patterns": [
{
"begin": "(?<=string)\\b\\s+(map)\\b",
"end": "(?=$|\n|\\]|}|{|\\[)",
"captures": {
"1": {
"name": "entity.function.name.string.map.tcl"
}
},
"patterns": [
{
"include": "#square-brackets"
},
{
"include": "#variable"
},
{
"begin": "\\s*({)",
"end": "\\s*(})",
"patterns": [
{
"match": "(?<=[^\\\\]\\\\\\\\)(.)",
"name": "string"
},
{
"match": "([\\[\\]])",
"name": "string"
},
{
"include": "#quoted-string"
},
{
"include": "#curly-string-brackets"
},
{
"include": "#bare-string"
}
]
}
]
}
]
},
"tcl-string-subcommands": {
"patterns": [
{
"match": "(?<=string)\\b\\s+(match|compact|toupper|tolower|bytelength|compare|cat|first|index|is|last|length|map|range|repeat|replace|reverse|totitle|trim|trimleft|trimright|wordend|wordstart|equal)\\s+",
"name": "entity.function.name.string.subcommands.tcl"
}
]
},
"tcl-dict": {
"patterns": [
{
"begin": "(?<=^|[\\[{;]|tailcall)\\s*(::)?\\b(dict)\\b",
"end": "($)|(?=$|[;\\]}])",
"beginCaptures": {
"1": {
"name": "support.type"
},
"2": {
"name": "keyword.control.dict.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#tcl-dict-keywords"
},
{
"include": "#tcl-dict-subcommands"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"tcl-dict-keywords": {
"patterns": [
{
"include": "#tcl-dict-blocks"
},
{
"include": "#tcl-dict-setters"
}
]
},
"property-list-brackets": {
"patterns": [
{
"begin": "\\s*({)",
"end": "(})",
"patterns": [
{
"include": "#property-list"
}
]
}
]
},
"property-list": {
"begin": "(?=.)",
"end": "\\s|(?=(?<!\\\\)$|[\\]])|(?<=})",
"patterns": [
{
"include": "#empty-brackets"
},
{
"include": "#square-brackets"
},
{
"include": "#tcl-expression-keywords"
},
{
"begin": "([^\\s\\]]*)\\s+({)",
"end": "(})",
"beginCaptures": {
"1": {
"name": "variable",
"patterns": [
{
"include": "#variable"
},
{
"include": "#opt"
}
]
}
},
"patterns": [
{
"include": "#empty-brackets"
},
{
"include": "#property-list"
}
]
},
{
"begin": "\\s*(?!$|\\]|\\\\)([^\\s\\]}{]*)\\s+(?!$|[{\n])",
"end": "(?=\\s|\\]|(?<!\\\\)$)|(?<=})",
"beginCaptures": {
"1": {
"name": "variable",
"patterns": [
{
"include": "#constant-numeric"
},
{
"include": "#opt"
},
{
"include": "#variable"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#opt"
},
{
"include": "#empty-brackets"
},
{
"include": "#special-brackets"
},
{
"include": "#square-brackets"
},
{
"include": "#variable"
},
{
"include": "#constant-numeric"
},
{
"match": "(?!\\s|\\])([^\\s\\]]+)",
"name": "string"
}
]
},
{
"include": "#variable"
},
{
"include": "#bare-string"
}
]
},
"tcl-dict-blocks": {
"begin": "(?<=dict)\\b\\s+\\b(for|update|with)\\b(?:(?!$|\n|\\]|}|;|\\[|{)\\s+)?",
"end": "(?<=})|(?=(?<!\\\\)(?:$|[;\\]}\n]))",
"beginCaptures": {
"1": {
"name": "entity.function.name.dict.for.tcl"
}
},
"patterns": [
{
"include": "#arguments-braced"
},
{
"include": "#curly-brackets"
},
{
"include": "#variable"
},
{
"include": "#variable-bare-italic"
},
{
"include": "#brackets"
}
]
},
"tcl-dict-setters": {
"patterns": [
{
"begin": "(?<=dict)\\s+\\b(set|pull|unset|lappend|incr|push)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]}]))",
"beginCaptures": {
"1": {
"name": "entity.function.name.dict.setters.subcommand.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#square-brackets"
},
{
"begin": "(?<=pull|push)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]{}]))",
"patterns": [
{
"include": "#line-escape"
},
{
"match": "(?<=push)\\s+(\\-\\>)",
"captures": {
"1": {
"name": "meta.constant"
}
}
},
{
"include": "#variable"
},
{
"include": "#square-brackets"
},
{
"include": "#variable-bare"
},
{
"begin": "\\s*({)",
"end": "(})",
"patterns": [
{
"match": "(?<={)\\s*([^\\s}]*)",
"name": "string.pull.prop.tcl"
},
{
"begin": "(?<=\\s)([^\\s}]*)",
"end": "(?=})",
"captures": {
"1": {
"patterns": [
{
"include": "#variable-bare-italic"
}
]
}
},
"patterns": [
{
"include": "#constant-numeric"
},
{
"begin": "\\s*({)",
"end": "(})",
"contentName": "string.dict.pull.default.tcl",
"captures": {
"1": {
"name": "entity.function.name.dict.pull.props.tcl"
}
}
},
{
"include": "#bare-string"
}
]
},
{
"include": "#constant-numeric"
}
]
}
]
},
{
"begin": "(?<=set|unset|lappend|incr)\\b",
"end": "(?=(?<!\\\\)(?:$|[\n;\\]{}]))",
"patterns": [
{
"begin": "(?<=set|unset|lappend|incr)\\b\\s+",
"end": "\\s",
"patterns": [
{
"include": "#variable-bare-italic"
}
]
},
{
"include": "#proc-call-args"
}
]
},
{
"include": "#proc-call-args"
},
{
"include": "#variable"
}
]
}
]
},
"tcl-dict-subcommands": {
"patterns": [
{
"begin": "(?<=dict)\\s+(create)\\b(?:\\s+(?!$))?",
"end": "(?=\\])|(?<!\\\\)$",
"beginCaptures": {
"1": {
"name": "entity.function.name.dict.subcommand.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#property-list"
}
]
},
{
"match": "(?!\\])\\s*\\b(append|exists|filter|get|get\\?|incr|info|keys|lappend|map|merge|remove|replace|set|size|unset|update|values|with|pull|push|pullFrom)\\b",
"name": "entity.function.name.dict.subcommand.tcl"
}
]
},
"proc-arguments": {
"patterns": [
{
"include": "#proc-args-braced"
},
{
"include": "#proc-args-singular"
}
]
},
"proc-args-singular": {
"patterns": [
{
"match": "(?!{|\\[|\\s|}|\\]|$)([^\\s}\\];]*)(?=\\s|}|\\])",
"captures": {
"1": {
"name": "punctuation.definition.variable.tcl"
}
}
}
]
},
"proc-args-braced": {
"begin": "(?={)({)",
"end": "\\s*(})",
"beginCaptures": {
"1": {
"name": "meta.brace.curly.proc.args.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.brace.curly.proc.args.close.tcl"
}
},
"patterns": [
{
"include": "#proc-arguments-nested"
},
{
"include": "#variable-bare"
}
]
},
"proc-arguments-nested": {
"patterns": [
{
"begin": "\\s*+({)",
"end": "(})",
"beginCaptures": {
"1": {
"name": "entity.function.name"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name"
}
},
"patterns": [
{
"include": "#quoted-string"
},
{
"include": "#empty-brackets"
},
{
"match": "\\s*([^\\s|{|}]*)\\s*([^\\s|{|}]*)(?=\\s*?})",
"contentName": "variable",
"captures": {
"1": {
"name": "variable"
},
"2": {
"name": "string.proc.argument",
"patterns": [
{
"include": "#constant-numeric"
}
]
}
}
},
{
"include": "#curly-string-brackets"
},
{
"match": "\\s*([^\\s|{|}]*)",
"name": "variable.proc.argument"
}
]
}
]
},
"arguments-braced": {
"patterns": [
{
"begin": "({)(?:(?!$|\n|\\]|}|;|\\[|{)\\s*)?",
"end": "(})",
"patterns": [
{
"match": "(?:(?!$|\n|\\]|}|;|\\[|{)\\s*)?([^\\s|{|}]*)(?:(?!$|\n|\\]|}|;|\\[|{)\\s*)?",
"name": "variable"
}
]
}
]
},
"double-dash": {
"match": "\\s(--)\\s",
"captures": {
"1": {
"name": "keyword.control.tcl"
}
}
},
"quoted-string": {
"patterns": [
{
"comment": "when inside curly bracket, {\"}",
"match": "(?<={)\\s*+(\"\\s*(?=})(?!\"))",
"name": "string.quoted.tcl"
},
{
"begin": "\\s*+(?<!\\\\)(\")",
"end": "(?<!\\\\)((?:\\\\{2})*)(\")",
"beginCaptures": {
"1": {
"name": "string.quoted.double.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "constant.character.escape"
},
"2": {
"name": "string.quoted.double.close.tcl"
}
},
"patterns": [
{
"include": "#square-brackets"
},
{
"include": "#string-content"
},
{
"match": "(\\*)",
"name": "bare.string"
},
{
"match": "([{}])",
"name": "string.quoted.tcl"
}
]
}
]
},
"string-content": {
"patterns": [
{
"include": "#string-escapes"
},
{
"include": "#variable"
},
{
"include": "#square-brackets"
},
{
"include": "#bare-string"
}
]
},
"string-escapes": {
"patterns": [
{
"name": "constant.character.escape.newline.tcl",
"match": "\\\\\n"
},
{
"name": "constant.character.escape",
"match": "\\s*+\\\\[\\]\"\\\\nrtbfv0`\\[]"
},
{
"name": "constant.character.escape",
"match": "\\\\u(({[0-9a-fA-F]+\\})|[0-9a-fA-F]{4})"
},
{
"name": "constant.character.escape",
"match": "\\\\x[0-9a-fA-F]{2}"
},
{
"name": "constant.character.escape",
"match": "(?<!\\\\)(\\\\)([;])",
"captures": {
"1": {
"name": "constant.character.escape"
},
"2": {
"name": "string"
}
}
}
]
},
"bare-string": {
"patterns": [
{
"include": "#opt"
},
{
"include": "#string-escapes"
},
{
"match": "\\s*(\\$)(?=$|\n|\\]|}|\"|;|\\s)",
"name": "bare.string.tcl"
},
{
"match": "(\\\\[^\\]\"\\\\nrtbfv0`\\[])",
"name": "bare.string.tcl"
},
{
"match": "(?<!::)(?!;|\\]|}|\\*|\"|;)([^\\*}\\\\;\\]{\\[\"\\$\n\\-\\)\\(]+)",
"captures": {
"1": {
"name": "bare.string.tcl",
"patterns": [
{
"match": "(?:(?<=::)|(?=[^\\s:]*(?=::)))(?!\\s)([^\\s]*)",
"captures": {
"1": {
"patterns": [
{
"include": "#namespace-name"
}
]
}
}
},
{
"include": "#variable"
}
]
}
}
},
{
"match": "(-)(?=\\s|;|}|\\]|\"|-)",
"name": "bare.string.tcl"
},
{
"match": "(?<=-)(-)",
"name": "bare.string.tcl"
},
{
"include": "#variable"
}
]
},
"html-curly-brackets": {
"begin": "\\s*({)",
"end": "(})",
"patterns": [
{
"include": "text.html.basic"
}
]
},
"regexp": {
"patterns": [
{
"begin": "(?<=^|\\[|{|;)\\s*(::)?\\b(regexp|regsub)\\b",
"end": "(?=(?<!\\\\)(?:$|.*[\n;}\\]]))",
"beginCaptures": {
"1": {
"name": "support.type.ns.separator.tcl"
},
"2": {
"name": "keyword.control.regexp.tcl"
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#double-dash"
},
{
"include": "#quoted-string"
},
{
"match": "\\s*(->)",
"name": "meta.constant.re.trashvar.tcl"
},
{
"include": "#opt"
},
{
"begin": "\\s*({|\")",
"end": "(}|\")(?=\\s+(?:\\\\\n|$|\n|\\[|\\$|\\b|\"|;|}|-))",
"contentName": "string.tcl",
"patterns": [
{
"include": "#regular-expression"
}
]
},
{
"include": "#quoted-string"
},
{
"include": "#variable"
},
{
"include": "#variable-bare-italic"
}
]
},
{
"begin": "(?<=_regexp|_re)\\s+(?={|\")",
"end": "(?=(?<!\\\\)$)|(?<=\")|(?<=})",
"patterns": [
{
"begin": "({)",
"end": "(})",
"contentName": "string.tcl",
"patterns": [
{
"include": "#regular-expression"
}
]
},
{
"begin": "(\")",
"end": "(\")",
"contentName": "string.tcl",
"patterns": [
{
"include": "#regular-expression"
}
]
}
]
}
]
},
"comment-blocks": {
"patterns": [
{
"contentName": "comment.line.number-sign.tcl",
"begin": "(?<=^|;|{)\\s*((#))",
"end": "(?=$|\n)|((#))(?=\\s*(?:[}\n]))",
"captures": {
"1": {
"name": "comment.line.number-sign.tcl"
},
"2": {
"name": "punctuation.definition.comment.tcl"
}
}
},
{
"contentName": "comment.block.tcl",
"begin": "(?<=^|;|\\{)\\s*((?:\\%\\s+\\{)|(?:\\bif\\s+{?0}?\\s+{))",
"end": "\\s*(\\})",
"beginCaptures": {
"1": {
"name": "comment.block.multi.start.tcl"
},
"2": {
"name": "punctuation.definition.comment.tcl"
}
},
"endCaptures": {
"1": {
"name": "comment.block.multi.end.tcl"
}
},
"patterns": [
{
"include": "#annotate"
},
{
"include": "#variable-non-substituting"
}
]
}
]
},
"annotate": {
"patterns": [
{
"include": "#annotate-control-block"
},
{
"include": "#annotate-properties"
},
{
"include": "#annotate-title"
},
{
"include": "#annotate-header"
},
{
"include": "#annotate-highlight"
},
{
"include": "#annotate-type"
},
{
"include": "#annotate-list"
}
]
},
"annotate-title": {
"patterns": [
{
"comment": "adding @ in a multi-line will make the line emphasized",
"contentName": "meta.class.comment.annotate.tcl",
"begin": "\\s*+(@)",
"end": "(?={|\\s-|>)|(@|}|$|\n)|\\|",
"beginCaptures": {
"1": {
"name": "support.type.annotate.tcl"
}
},
"endCaptures": {
"1": {
"name": "support.type.annotate.tcl"
}
},
"patterns": [
{
"include": "#variable-non-substituting"
},
{
"include": "#namespace-separator"
}
]
}
]
},
"annotate-properties": {
"begin": "(?=\\s*@[^\\s\n])",
"end": "(?=$|[\n}@])",
"patterns": [
{
"comment": "special @ values that are meant as property values",
"match": "\\s*+(@)\\b(type)\\b(\\s+[^{}|@\\[<>-]*)?",
"captures": {
"1": {
"name": "meta.constant.annotate.property.tcl"
},
"2": {
"name": "support.type.name.tcl"
},
"3": {
"name": "entity.function.property.name.tcl"
}
}
},
{
"comment": "special @ values that are meant as property values",
"match": "\\s*+(@)\\b(arg(?:s)?|returns|key|prop|if|example|param|params|opt|option|argument|val|value)\\b(\\s+[^\\/{}|@\\[<>]*)?",
"captures": {
"1": {
"name": "support.type.annotate.property.tcl"
},
"2": {
"name": "variable.property.name.tcl"
},
"3": {
"name": "support.type",
"patterns": [
{
"include": "#opt"
}
]
}
}
},
{
"comment": "@<other> (no space after @)",
"match": "\\s*+(@)\\b([^\\s]*)\\b(\\s+[^\\/{}|@\\[<>-]*)?",
"captures": {
"1": {
"name": "meta.constant.annotate.property.tcl"
},
"2": {
"name": "entity.function.property.name.tcl"
},
"3": {
"name": "support.type.tcl"
}
}
},
{
"include": "#annotate"
}
]
},
"annotate-control-block": {
"patterns": [
{
"comment": "bracketed within a comment",
"contentName": "keyword.operator",
"begin": "^\\s*+(?={)",
"end": "(?<=})",
"patterns": [
{
"include": "#brackets"
}
]
}
]
},
"annotate-proc-call": {
"patterns": [
{
"begin": "(\\[)",
"end": "(\\])",
"beginCaptures": {
"1": {
"name": "support.type.annotate.proc-call.tcl"
}
},
"endCaptures": {
"1": {
"name": "support.type.annotate.proc-call.tcl"
}
},
"patterns": [
{
"include": "#proc-call"
}
]
}
]
},
"annotate-type": {
"patterns": [
{
"comment": "adding @ in a multi-line will make the line emphasized",
"contentName": "entity.function.name.comment.annotate.tcl",
"begin": "\\s*+({)",
"end": "\\s*(})",
"beginCaptures": {
"1": {
"name": "meta.constant.comment.annotate.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.constant.comment.annotate.tcl"
}
},
"patterns": [
{
"include": "#annotate-regular-expression"
},
{
"include": "#annotate-proc-call"
},
{
"begin": "(<)",
"end": "(>)|(?=[}])",
"contentName": "support.type.comment.annotate.property.punctuation.italic.tcl",
"patterns": [
{
"include": "#annotate-regular-expression"
},
{
"match": "(\\|)",
"name": "entity.function.name.tcl"
},
{
"include": "#variable-non-substituting"
},
{
"match": "([,])",
"name": "entity.function.name.annotate.opt.tcl"
},
{
"match": "([-])",
"name": "meta.constant.annotate.opt.tcl"
}
]
},
{
"match": "(?:(?<={|\\|)([?*])|([?*])(?=}|\\|))",
"name": "variable.modifier.annotate.punctuation.italic.tcl"
},
{
"match": "(\\|)",
"name": "meta.constant.comment.annotate.tcl"
}
]
}
]
},
"annotate-regular-expression": {
"patterns": [
{
"begin": "(/)",
"end": "(/|$)",
"beginCaptures": {
"1": {
"name": "support.type.annotate.re.brace.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "support.type.annotate.re.brace.close.tcl"
}
},
"contentName": "string.re.expression.comment.annotate.contents.tcl",
"patterns": [
{
"include": "#regular-expression"
}
]
}
]
},
"annotate-highlight": {
"patterns": [
{
"comment": "adding | in a multi-line will make the line highlighted (string)",
"match": "(?<=\\|)\\s*([^|]*)",
"captures": {
"1": {
"name": "string.quote.annotate.comment.tcl",
"patterns": [
{
"include": "#annotate-type"
},
{
"include": "#annotate-proc-call"
},
{
"include": "#variable-non-substituting"
},
{
"match": "\\b(http://([^\\s]*))",
"name": "entity.function.name.markup.underline"
}
]
}
}
}
]
},
"annotate-header": {
"patterns": [
{
"comment": "adding > in a multi-line will make the line emphasized",
"begin": "\\s*+(>)",
"end": "(<)|(?=$|>)",
"contentName": "meta.constant.annotate.header.tcl",
"captures": {
"1": {
"name": "entity.function.name.annotate.tcl"
},
"2": {
"name": "meta.constant.annotate.header.tcl"
}
},
"patterns": [
{
"include": "#annotate"
}
]
}
]
},
"annotate-list": {
"patterns": [
{
"match": "^\\s*([0-9]\\.)\\s+",
"name": "meta.class"
}
]
},
"opt": {
"patterns": [
{
"comment": "Handle options sent to commands at various points (cmd -name1 value -name2 value)",
"match": "\\s*+(?<=\\s|^|\"|\\()((-)(?!-|\\s|\"|;|\n|>)[^\\s$\n\\[\\];\"{)(}]*)",
"captures": {
"1": {
"name": "support.type.opt.tcl"
},
"2": {
"name": "meta.constant.opt.start.tcl"
}
}
}
]
},
"line-escape": {
"begin": "\\s*+(\\\\\n)$",
"end": "(^)(?:\\s*(?!$))?",
"beginCaptures": {
"1": {
"name": "constant.character.escape.newline.tcl"
}
},
"endCaptures": {
"1": {
"name": "meta.lineescape.highlight.tcl"
}
}
},
"glob-match": {
"patterns": [
{
"begin": "({)",
"end": "(})",
"patterns": [
{
"include": "#glob-match"
}
]
},
{
"match": "\\s*+(\\*)",
"name": "meta.class"
},
{
"include": "#string-escapes"
},
{
"begin": "(?<!\\\\)(\")",
"end": "(?<!\\\\)(\")",
"beginCaptures": {
"1": {
"name": "string.double.quoted.glob.match.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "string.double.quoted.glob.match.close.tcl"
}
},
"patterns": [
{
"include": "#glob-match"
}
]
},
{
"begin": "(?<!\\\\)(\\[)",
"end": "(?<!\\\\)(\\])",
"contentName": "support.type",
"beginCaptures": {
"1": {
"name": "meta.class"
}
},
"endCaptures": {
"1": {
"name": "meta.class"
}
}
},
{
"include": "#square-brackets"
},
{
"include": "#bare-string"
}
]
},
"spread-variable-only": {
"comment": "Only allow a variable if it is spread using {*}",
"patterns": [
{
"match": "(?<=^|\\[)\\s*(?<!\\{\\*\\})(\\$)(([a-zA-Z0-9_]|::)+(\\([^\\)]+\\))?|\\{[^\\}]*\\})",
"captures": {
"1": {
"name": "invalid.illegal.nospread.tcl"
},
"2": {
"name": "invalid.illegal.nospread.tcl"
}
}
},
{
"include": "#variable"
}
]
},
"spread-variable": {
"patterns": [
{
"match": "\\s*+({(\\*)}?)(?=\\$)",
"captures": {
"1": {
"name": "entity.function.name.tcl.markup.italic"
},
"2": {
"name": "support.type"
}
}
}
]
},
"variable-bare-italic": {
"patterns": [
{
"begin": "\\s*(?!$|[$\\[;\n{])",
"end": "(?=(?<!\\\\)$|[\n\\];\\[{}\\s])",
"patterns": [
{
"include": "#quoted-string"
},
{
"include": "#variable"
},
{
"include": "#brackets"
},
{
"begin": "\\s*(\\()",
"end": "(\\))",
"contentName": "punctuation.italic",
"beginCaptures": {
"1": {
"name": "entity.function.name.array.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name.array.close.tcl"
}
},
"patterns": [
{
"include": "#opt"
},
{
"include": "#proc-call-args"
}
]
},
{
"include": "#namespace-separator"
},
{
"match": "(?!\\s)([^\\s\\[(?:::){;\\$\"\\]};]*)",
"name": "punctuation.italic.variable"
},
{
"match": "(?<=\\*)(?!\\s)([^\\s\\[(?:::){;$\"\\];}]*)",
"name": "punctuation.italic.variable"
}
]
}
]
},
"variable-bare": {
"patterns": [
{
"begin": "(?<=\\s|^|\\*|{)\\s*(?!$|[$\n;}{\\]\\[])",
"end": "(?=(?<!\\\\)$|[\n\\];\\[{}]|(?=\\s))",
"patterns": [
{
"include": "#variable"
},
{
"include": "#quoted-string"
},
{
"begin": "(\\()",
"end": "(\\))",
"contentName": "punctuation.italic",
"beginCaptures": {
"1": {
"name": "entity.function.name.array.open.tcl"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name.array.close.tcl"
}
},
"patterns": [
{
"include": "#opt"
},
{
"include": "#proc-call-args"
}
]
},
{
"include": "#namespace-separator"
},
{
"match": "([,])",
"name": "variable"
},
{
"match": "(?!(?<!\\\\)$|\\[|\\])([^:\\s}\\]\\[\\({\",;$]*)",
"name": "variable"
},
{
"match": "(?<=\\*)(?!\\s|$|\\[|\\])([^:\\s}\\[{\\]\",;]*)",
"name": "variable"
},
{
"match": "(:)",
"name": "string"
},
{
"include": "#proc-call-args"
}
]
},
{
"include": "#variable"
}
]
},
"variable-braced": {
"patterns": [
{
"begin": "(?={)({)",
"end": "(}|\\s)",
"patterns": [
{
"include": "#variable-bare"
}
]
}
]
},
"variable-object": {
"patterns": [
{
"begin": "(?<=^|[\\[{;])(?!\\s*$|[\n\\]};])\\s*((\\$)([^\\s\n\\]}]+))(?:(?!\\s*$|\\s*[\n}\\];])\\s*([^\\s\n\\]};]*))?",
"end": "(?=(?<!\\\\)(?:$|[\n\\];\\[{}]))",
"beginCaptures": {
"1": {
"match": "(?<={)\\s*([^\\s]*)\\s*(?=})",
"captures": {
"1": {
"patterns": [
{
"include": "#variable-non-substituting"
}
]
}
}
},
"2": {
"name": "support.type"
},
"3": {
"name": "meta.class",
"patterns": [
{
"include": "#namespace-separator"
}
]
},
"4": {
"patterns": [
{
"include": "#line-escape"
},
{
"match": "(destroy|new|create)",
"name": "keyword.oo.special.tcl"
},
{
"include": "#namespace-name"
}
]
}
},
"patterns": [
{
"include": "#line-escape"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"variable": {
"patterns": [
{
"include": "#spread-variable"
},
{
"match": "^\\s*(\\$)\\s*(?=\n|$|\\]|})",
"name": "support.type"
},
{
"match": "\\s*(?:(?![\\]\n\"};])|(?=[$]))(?<!(?<!\\\\)\\\\)(\\$)(?:({)([^}\\s\\]\"\\)\\(\\$]*)(\\([^\\(\\)]*\\))?(})([^\\s\\[\\];\n\"{}]*)?|(?=[A-Za-z0-9_:])([^\\s\\*\\[}\\]/\"\\);\\(\\\\$,\\-\\+'\\*]*)(\\([^\\s\\['\\\\;}\\]\")($,+*]*\\))?)",
"captures": {
"1": {
"name": "support.type.variable.indicator.tcl"
},
"2": {
"name": "entity.function.name.variable.brace.open.tcl"
},
"3": {
"patterns": [
{
"include": "#namespace-separator"
},
{
"include": "#variable"
},
{
"match": "([^\\s:\"}{]+)",
"name": "variable.name"
}
]
},
"4": {
"patterns": [
{
"begin": "(\\()",
"end": "(\\))",
"contentName": "punctuation.italic",
"beginCaptures": {
"1": {
"name": "support.type"
}
},
"endCaptures": {
"1": {
"name": "support.type"
}
},
"patterns": [
{
"include": "#opt"
},
{
"include": "#proc-call-args"
}
]
}
]
},
"5": {
"name": "entity.function.name.variable.brace.close.tcl"
},
"6": {
"patterns": [
{
"include": "#proc-call-args"
},
{
"include": "#bare-string"
}
]
},
"7": {
"patterns": [
{
"include": "#namespace-separator"
},
{
"match": "([^\\s:\"}{\\\\\\]\\[]+)",
"name": "variable.name"
}
]
},
"8": {
"patterns": [
{
"begin": "(\\()",
"end": "(\\))",
"contentName": "punctuation.italic",
"beginCaptures": {
"1": {
"name": "entity.function.name.tcl"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name.tcl"
}
},
"patterns": [
{
"include": "#opt"
},
{
"include": "#proc-call-args"
}
]
}
]
}
}
}
]
},
"variable-non-substituting": {
"patterns": [
{
"include": "#spread-variable"
},
{
"match": "^\\s*+(\\$)\\s*(?=\n|$)",
"name": "support.type"
},
{
"match": "\\s*+(?:(?!\\]|\n|\"|>|<|,))(?<!(?<!\\\\)\\\\)(\\$)(?:({)([^}\\s\\]\"\\)\\(\\$]*)(\\(.*\\))?(})|(?=[A-Za-z0-9_:])([^\\s\\,<>\\*}\\]/\"\\);\\(\\\\\\$,\\-\\+\\*]*)(\\([^\\s\\\\;\\*}\\]\"\\)\\(\\$,\\-\\+\\*<>]*\\))?)",
"captures": {
"1": {
"name": "support.type.variable.indicator.tcl"
},
"2": {
"name": "entity.function.name.variable.brace.open.tcl"
},
"3": {
"patterns": [
{
"include": "#namespace-separator"
},
{
"include": "#variable"
},
{
"match": "([^\\s:\"}{]+)",
"name": "meta.constant.tcl"
}
]
},
"4": {
"patterns": [
{
"begin": "(\\()",
"end": "(\\))",
"contentName": "punctuation.italic.meta.constant",
"beginCaptures": {
"1": {
"name": "support.type"
}
},
"endCaptures": {
"1": {
"name": "support.type"
}
},
"patterns": [
{
"include": "#proc-call-args"
}
]
}
]
},
"5": {
"name": "entity.function.name.variable.brace.close.tcl"
},
"6": {
"patterns": [
{
"include": "#namespace-separator"
},
{
"match": "([^\\s:\"}{\\\\\\]\\[]+)",
"name": "meta.constant"
}
]
},
"7": {
"patterns": [
{
"begin": "(\\()",
"end": "(\\))",
"contentName": "punctuation.italic.meta.constant",
"beginCaptures": {
"1": {
"name": "entity.function.name"
}
},
"endCaptures": {
"1": {
"name": "entity.function.name"
}
},
"patterns": [
{
"include": "#proc-call-args"
}
]
}
]
}
}
}
]
}
},
"scopeName": "source.tcl"
}