# Encoding: UTF-8

{fileTypes: ["tcl"],
 firstLineMatch: "^#!/.*\\btclsh\\b",
 foldingStartMarker: /\{\s*$/,
 foldingStopMarker: /^\s*\}/,
 keyEquivalent: "^~T",
 name: "Tcl",
 patterns: 
  [{begin: /(?<=^|;)\s*(?<_1>(?<_2>#))/,
    beginCaptures: 
     {1 => {name: "comment.line.number-sign.tcl"},
      2 => {name: "punctuation.definition.comment.tcl"}},
    contentName: "comment.line.number-sign.tcl",
    end: "\\n",
    patterns: [{match: /(?<_1>\\\\|\\\n)/}]},
   {captures: {1 => {name: "keyword.control.tcl"}},
    match: 
     /(?<=^|[\[{;])\s*(?<_1>if|while|for|catch|return|break|continue|switch|exit|foreach)\b/},
   {captures: {1 => {name: "keyword.control.tcl"}},
    match: /(?<=^|})\s*(?<_1>then|elseif|else)\b/},
   {captures: 
     {1 => {name: "keyword.other.tcl"},
      2 => {name: "entity.name.function.tcl"}},
    match: /^\s*(?<_1>proc)\s+(?<_2>[^\s]+)/},
   {captures: {1 => {name: "keyword.other.tcl"}},
    match: 
     /(?<=^|[\[{;])\s*(?<_1>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*(?<_1>regexp|regsub)\b\s*/,
    beginCaptures: {1 => {name: "keyword.other.tcl"}},
    comment: 
     "special-case regexp/regsub keyword in order to handle the expression",
    end: "[\\n;]|(?=\\])",
    patterns: 
     [{match: /\\(?:.|\n)/, name: "constant.character.escape.tcl"},
      {comment: "switch for regexp", match: /-\w+\s*/},
      {applyEndPatternLast: 1,
       begin: /--\s*/,
       comment: "end of switches",
       end: "",
       patterns: [{include: "#regexp"}]},
      {include: "#regexp"}]},
   {include: "#escape"},
   {include: "#variable"},
   {begin: /"/,
    beginCaptures: {0 => {name: "punctuation.definition.string.begin.tcl"}},
    end: "\"",
    endCaptures: {0 => {name: "punctuation.definition.string.end.tcl"}},
    name: "string.quoted.double.tcl",
    patterns: 
     [{include: "#escape"}, {include: "#variable"}, {include: "#embedded"}]}],
 repository: 
  {:"bare-string" => 
    {begin: /(?:^|(?<=\s))"/,
     comment: "matches a single quote-enclosed word without scoping",
     end: "\"([^\\s\\]]*)",
     endCaptures: {1 => {name: "invalid.illegal.tcl"}},
     patterns: [{include: "#escape"}, {include: "#variable"}]},
   braces: 
    {begin: /(?:^|(?<=\s))\{/,
     comment: "matches a single brace-enclosed word",
     end: "\\}([^\\s\\]]*)",
     endCaptures: {1 => {name: "invalid.illegal.tcl"}},
     patterns: 
      [{match: /\\[{}\n]/, name: "constant.character.escape.tcl"},
       {include: "#inner-braces"}]},
   embedded: 
    {begin: /\[/,
     beginCaptures: {0 => {name: "punctuation.section.embedded.begin.tcl"}},
     end: "\\]",
     endCaptures: {0 => {name: "punctuation.section.embedded.end.tcl"}},
     name: "source.tcl.embedded",
     patterns: [{include: "source.tcl"}]},
   escape: 
    {match: /\\(?<_1>\d{1,3}|x[a-fA-F0-9]+|u[a-fA-F0-9]{1,4}|.|\n)/,
     name: "constant.character.escape.tcl"},
   :"inner-braces" => 
    {begin: /\{/,
     comment: "matches a nested brace in a brace-enclosed word",
     end: "\\}",
     patterns: 
      [{match: /\\[{}\n]/, name: "constant.character.escape.tcl"},
       {include: "#inner-braces"}]},
   regexp: 
    {begin: /(?=\S)(?![\n;\]])/,
     comment: 
      "matches a single word, named as a regexp, then swallows the rest of the command",
     end: "(?=[\\n;\\]])",
     patterns: 
      [{begin: /(?=[^ \t\n;])/,
        end: "(?=[ \\t\\n;])",
        name: "string.regexp.tcl",
        patterns: 
         [{include: "#braces"},
          {include: "#bare-string"},
          {include: "#escape"},
          {include: "#variable"}]},
       {begin: /[ \t]/,
        comment: "swallow the rest of the command",
        end: "(?=[\\n;\\]])",
        patterns: 
         [{include: "#variable"},
          {include: "#embedded"},
          {include: "#escape"},
          {include: "#braces"},
          {include: "#string"}]}]},
   string: 
    {applyEndPatternLast: 1,
     begin: /(?:^|(?<=\s))(?=")/,
     comment: "matches a single quote-enclosed word with scoping",
     end: "",
     name: "string.quoted.double.tcl",
     patterns: [{include: "#bare-string"}]},
   variable: 
    {captures: {1 => {name: "punctuation.definition.variable.tcl"}},
     match: 
      /(?<_1>\$)(?<_2>(?:[a-zA-Z0-9_]|::)+(?<_3>\([^\)]+\))?|\{[^\}]*\})/,
     name: "variable.other.tcl"}},
 scopeName: "source.tcl",
 uuid: "F01F22AC-7CBB-11D9-9B10-000A95E13C98"}
