--- name: Tcl fileTypes: - tcl scopeName: source.tcl repository: escape: name: constant.character.escape.tcl match: \\(\d{1,3}|x[a-fA-F0-9]+|u[a-fA-F0-9]{1,4}|.|\n) bare-string: endCaptures: "1": name: invalid.illegal.tcl begin: (?:^|(?<=\s))" end: "\"([^\\s\\]]*)" patterns: - include: "#escape" - include: "#variable" comment: matches a single quote-enclosed word without scoping regexp: begin: (?=\S)(?![\n;\]]) end: (?=[\n;\]]) patterns: - name: string.regexp.tcl begin: (?=[^ \t\n;]) end: (?=[ \t\n;]) patterns: - include: "#braces" - include: "#bare-string" - include: "#escape" - include: "#variable" - begin: "[ \\t]" end: (?=[\n;\]]) patterns: - include: "#variable" - include: "#embedded" - include: "#escape" - include: "#braces" - include: "#string" comment: swallow the rest of the command comment: matches a single word, named as a regexp, then swallows the rest of the command braces: endCaptures: "1": name: invalid.illegal.tcl begin: (?:^|(?<=\s))\{ end: \}([^\s\]]*) patterns: - name: constant.character.escape.tcl match: \\[{}\n] - include: "#inner-braces" comment: matches a single brace-enclosed word inner-braces: begin: \{ end: \} patterns: - name: constant.character.escape.tcl match: \\[{}\n] - include: "#inner-braces" comment: matches a nested brace in a brace-enclosed word variable: name: variable.other.tcl captures: "1": name: punctuation.definition.variable.tcl match: (\$)([a-zA-Z0-9_:]+(\([^\)]+\))?|\{[^\}]*\}) string: name: string.quoted.double.tcl begin: (?:^|(?<=\s))(?=") applyEndPatternLast: 1 end: "" patterns: - include: "#bare-string" comment: matches a single quote-enclosed word with scoping embedded: name: source.tcl.embedded endCaptures: "0": name: punctuation.section.embedded.end.tcl begin: \[ beginCaptures: "0": name: punctuation.section.embedded.begin.tcl end: \] patterns: - include: source.tcl uuid: F01F22AC-7CBB-11D9-9B10-000A95E13C98 foldingStartMarker: \{\s*$ patterns: - begin: (?<=^|;)\s*((#)) contentName: comment.line.number-sign.tcl beginCaptures: "1": name: comment.line.number-sign.tcl "2": name: punctuation.definition.comment.tcl end: \n patterns: - match: (\\\\|\\\n) - captures: "1": name: keyword.control.tcl match: (?<=^|[\[{;])\s*(if|while|for|catch|return|break|continue|switch|exit|foreach)\b - captures: "1": name: keyword.control.tcl match: (?<=^|})\s*(then|elseif|else)\b - captures: "1": name: keyword.other.tcl "2": name: entity.name.function.tcl match: ^\s*(proc)\s+([^\s]+) - captures: "1": name: keyword.other.tcl match: (?<=^|[\[{;])\s*(after|append|array|auto_execok|auto_import|auto_load|auto_mkindex|auto_mkindex_old|auto_qualify|auto_reset|bgerror|binary|cd|clock|close|concat|dde|encoding|eof|error|eval|exec|expr|fblocked|fconfigure|fcopy|file|fileevent|filename|flush|format|gets|glob|global|history|http|incr|info|interp|join|lappend|library|lindex|linsert|list|llength|load|lrange|lreplace|lsearch|lset|lsort|memory|msgcat|namespace|open|package|parray|pid|pkg::create|pkg_mkIndex|proc|puts|pwd|re_syntax|read|registry|rename|resource|scan|seek|set|socket|SafeBase|source|split|string|subst|Tcl|tcl_endOfWord|tcl_findLibrary|tcl_startOfNextWord|tcl_startOfPreviousWord|tcl_wordBreakAfter|tcl_wordBreakBefore|tcltest|tclvars|tell|time|trace|unknown|unset|update|uplevel|upvar|variable|vwait)\b - begin: (?<=^|[\[{;])\s*(regexp|regsub)\b\s* beginCaptures: "1": name: keyword.other.tcl end: "[\\n;\\]]" patterns: - name: constant.character.escape.tcl match: \\(?:.|\n) - match: -\w+\s* comment: switch for regexp - begin: --\s* applyEndPatternLast: 1 end: "" patterns: - include: "#regexp" comment: end of switches - include: "#regexp" comment: special-case regexp/regsub keyword in order to handle the expression - include: "#escape" - include: "#variable" - name: string.quoted.double.tcl endCaptures: "0": name: punctuation.definition.string.end.tcl begin: "\"" beginCaptures: "0": name: punctuation.definition.string.begin.tcl end: "\"" patterns: - include: "#escape" - include: "#variable" - include: "#embedded" foldingStopMarker: ^\s*\} keyEquivalent: ^~T