(comment) @comment @spell

(command
  name: (simple_word) @function)

"proc" @keyword.function

(procedure
  name: (_) @variable)

(set
  (simple_word) @variable)

(argument
  name: (_) @variable.parameter)

((simple_word) @variable.builtin
  (#any-of? @variable.builtin
    "argc" "argv" "argv0" "auto_path" "env" "errorCode" "errorInfo" "tcl_interactive" "tcl_library"
    "tcl_nonwordchars" "tcl_patchLevel" "tcl_pkgPath" "tcl_platform" "tcl_precision"
    "tcl_rcFileName" "tcl_traceCompile" "tcl_traceExec" "tcl_wordchars" "tcl_version"))

"expr" @function.builtin

(command
  name: (simple_word) @function.builtin
  (#any-of? @function.builtin
    "cd" "exec" "exit" "incr" "info" "join" "puts" "regexp" "regsub" "split" "subst" "trace"
    "source"))

(command
  name: (simple_word) @keyword
  (#any-of? @keyword
    "append" "break" "catch" "continue" "default" "dict" "error" "eval" "global" "lappend" "lassign"
    "lindex" "linsert" "list" "llength" "lmap" "lrange" "lrepeat" "lreplace" "lreverse" "lsearch"
    "lset" "lsort" "package" "return" "switch" "throw" "unset" "variable"))

[
  "error"
  "on"
  "set"
  "try"
] @keyword

"namespace" @keyword.type

(unpack) @operator

[
  "while"
  "foreach"
] @keyword.repeat

[
  "if"
  "else"
  "elseif"
] @keyword.conditional

[
  "**"
  "/"
  "*"
  "%"
  "+"
  "-"
  "<<"
  ">>"
  ">"
  "<"
  ">="
  "<="
  "=="
  "!="
  "eq"
  "ne"
  "in"
  "ni"
  "&"
  "^"
  "|"
  "&&"
  "||"
] @operator

(variable_substitution) @variable

(quoted_word) @string

(escaped_character) @string.escape

[
  "{"
  "}"
  "["
  "]"
  ";"
] @punctuation.delimiter

((simple_word) @number
  (#lua-match? @number "^[0-9]+$"))

((simple_word) @boolean
  (#any-of? @boolean "true" "false"))

; after apply array auto_execok auto_import auto_load auto_mkindex auto_qualify
; auto_reset bgerror binary chan clock close coroutine dde encoding eof fblocked
; fconfigure fcopy file fileevent filename flush format gets glob history http
; interp load mathfunc mathop memory msgcat my next nextto open parray pid
; pkg::create pkg_mkIndex platform platform::shell pwd re_syntax read refchan
; registry rename safe scan seek self socket source string tailcall tcl::prefix
; tcl_endOfWord tcl_findLibrary tcl_startOfNextWord tcl_startOfPreviousWord
; tcl_wordBreakAfter tcl_wordBreakBefore tcltest tell time timerate tm
; transchan unknown unload update uplevel upvar vwait yield yieldto zlib
