--- 
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
