# SYNTAX TEST "Packages/TCL/Tcl.sublime-syntax" # ----------------- # # Line continuation # ----------------- # set MyDict [list\ Key1 {Key Value 1}\ # ^ punctuation.separator.continuation ] pg_select $database \ "SELECT abc, def FROM xyz" # <- string pg_select $database \ "SELECT abc, def FROM xyz" \ data # <- - variable.function becs::wizFrame -info [becs_infobody "interface.jpg" \ "Specify VID parameters

VID groups can be used to build ranges that is added to the VID range field."] \ -title "$ifacename VID parameters" # ^ - meta.substitution if {[catch {becs::objectCreate -class interface \ -flags "statistics,interfaceautoprobe" \ -name $aggrname -role $extra_role \ -parameters [array get params] \ -opaque [list "becs.editor" "ifrole.tcl"] \ -parentoid $aggr_attach_oid} err]} { return "Creating aggregator interface $aggrname under element/management element-module OID $aggr_attach_oid: $err" } #^ - meta.block #^ - meta.substitution # -------------------------------------------------------------------------- # # Issue 134: https://github.com/SublimeTextIssues/DefaultPackages/issues/134 # -------------------------------------------------------------------------- # regsub -all {\/} $line {\\} line; # <- keyword.other # ^ string.regexp # ^ constant.character.escape foreach {one_arg_opt_pattern} [list {-first\S*} {-second\S*} {-group\S*}] { regsub -- "${one_arg_opt_pattern}\\s+\\S+" $args {} args # ^ string.quoted.double } regsub -all {\\\\} $line {\\} line; # <- keyword.other # ^ string.regexp constant.character.escape # ^ constant.character.escape puts "Not Highlighting" # <- keyword.other # ^ string.quoted.double namespace eval A { #^^^^^^^^^^^^^^^^^ meta.namespace # ^ entity.name.namespace namespace eval B { # ^^^^^^^^^^^^^^^^^^ meta.namespace meta.namespace # ^ entity.name.namespace proc C { # ^^^^^^^^^^^ meta.function # ^ entity.name.function puts hi } } } set dirname "${v_seagull_cfg_root}/seagull-[format "%02d" [expr $ctrlport - $v_seagull_ctrl_port]]" # ^^^^^^ keyword.other # ^^^^ keyword.other set a [list] # ^^^^ keyword.other set res "[join [lrange [split $res ","] 0 end-1] ","] ..." # ^^^^ keyword.other # ^^^^^^ keyword.other # ^^^^^ keyword.other regexp {instance="?([^" \t]+)"?} $counter matchedstring instance; # comment # ^^^^^^^^^^^^^^^^^^^^^^^ string.regexp regexp -- tralla(lla) $text allMatched var1 # ^^ punctuation.separator # ^^^^^^^^^^^ string.regexp # ^ variable.other punctuation.definition.variable set check1 [regexp {^'(.){0,32}'$} $param] # ^^^^^^^^^^^^^ string.regexp set check2 [regexp {[*\?\|"<>:/\]+} $param] # ^^^^^^^^^^^^^^ string.regexp set stepquote [regsub -all {"} $line {""} ] # ^ - string set copy [[$root selectNodes //*\[@ID="$idref"\]] cloneNode -deep] # ^^ constant.character.escape # ^^ constant.character.escape set v "String with $var and [command substitution] in it. Also, \n escapes." # ^^^^ variable.other # ^^^^^^^^^^^^^^^^^^^^^^ meta.substitution # ^^^^^^^ variable.function # ^^ constant.character.escape proc a {} { return "this is [proc c {p1 p2 p3} { puts 42 }; set b 42;] here, \[here it's $b\], highlighted too" # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.substitution # ^ entity.name.function # ^^^^^^^^^^ meta.block meta.substitution meta.function.parameters # ^ punctuation.terminator # ^ keyword.other # ^^ constant.numeric # ^^^^^^^^^^^^^^^ - meta.substitution # ^^ constant.character.escape # ^^^^ - variable.function # ^^ constant.character.escape } expr 5 + 4 # ^ constant.numeric # ^ constant.numeric proc D {a {b "default"} args} { #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.function # ^ entity.name.function # ^^^^^^^^^^^^^^^^^^^^^^ meta.function.parameters meta.block # ^ variable.parameter # ^^^^^^^^^^^^^ meta.block meta.block # ^ variable.parameter # ^^^^^^^^^ string.quoted.double # ^^^^ variable.parameter } # <- meta.function # <- - meta.function proc ${ns}::suffix {} {} # ^^^^^^^^^^^^^ entity.name.function # -------------------------------------------------------------------------- # # Issue 131: https://github.com/SublimeTextIssues/DefaultPackages/issues/131 # -------------------------------------------------------------------------- # set ok1 {["]"]} # ^^^^^^^ string.quoted.brace set ok2 {["][]"]} # ^^^^^^^^^ string.quoted.brace set not_ok {["]["]} # ^^^^^^^^ string.quoted.brace puts $ok1 ;# ["]"] # ^ keyword.other # ^^^^ variable.other # ^ punctuation.definition.variable # ^ comment.line puts $ok2 ;# ["][]"] # ^ keyword.other # ^^^^ variable.other # ^ punctuation.definition.variable # ^ comment.line puts $not_ok ;# ["]["] # ^ keyword.other # ^^^^^^^ variable.other # ^ punctuation.definition.variable # ^ comment.line my-command param1 $param2 # <- variable.function ${ns}::command 1 2 #^^^^^^^^^^^^^ variable.function array 1 2 3 #^^^^ keyword.other [ list foo baz] # ^ keyword.other #^^^^^^^^^^^^^^ meta.substitution if {$var == true} { # <- keyword.control # ^^^^^^^^^^^^^^ meta.block # ^^ keyword.operator # ^ meta.block } elseif {$foo < $bar} { # ^^^^^^ keyword.control # ^^^^^^^^^^^^^ meta.block # ^ keyword.operator } else { # ^^^^ keyword.control } # Ensure else doesn't work outside of if command else {} # <- - keyword.control # Ideally this would be a test to make the "a" invalid, # but there isn't a good way to handle that and brace strings # containing regexes as exhibited in the tests for issues # 783 and 784 set y {1 2 3}a # ^^^^^^^^ string.quoted.brace # ^ punctuation.definition.string.begin # ^ - punctuation.definition.string # -------------------------------------------------# # https://github.com/sublimehq/Packages/issues/779 # ------------------------------------------------ # regexp -inline -all -- {%[a-zA-Z_]*%} "whatever" # ^^^^^^^^^^^^^^^^ - string regexp -all -inline {%[a-zA-Z_]*%} "whatever" # ^^^^^^^^^^^^^ - string # -------------------------------------------------# # https://github.com/sublimehq/Packages/issues/783 # https://github.com/sublimehq/Packages/issues/784 # ------------------------------------------------ # set objRegExp {(^[a-zA-Z]{2}[a-zA-Z0-9-]{2,12}$)} # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.brace - invalid # ^ - meta.block set objRegExp {(.{0,200})} # ^^^^^^^^^^^^ string.quoted.brace - invalid # ^ - meta.block proc test {} { set saoid [svcmap_saoid sm] # ^^^ keyword.other # Syntax highligting works inside an if statement: if {[defvar cpe_uplink_ifoid 0] == 0} { array set cpe_param [objectGetField -oid $cpeoid -fieldname parameters] # ^^^^^ keyword.other # ^^^^^^^^^^^^^^ variable.function if {[info exists cpe_param(model)]} { set cpe_model $cpe_param(model) } else { error "ERROR: Model not set" # ^^^^^ keyword.other # ^ string.quoted.double } } # but not within for example a foreach loop: foreach cpe_ifoid [objectTreeFind -oid $cpeoid -walkdown 0 -classmask interface] { # ^^^^^^^ keyword.control # ^^^^^^^^^^^^^^ variable.function set cpe_if_role [objectGetField -oid $cpe_ifoid -fieldname role] # ^^^ keyword.other if {[string match "uplink.running" $cpe_if_role]} { # ^^ keyword.control # ^^^^^^ keyword.other set cpe_uplink_ifoid $cpe_ifoid set cpe_uplink_name [objectGetField -oid $cpe_uplink_ifoid -fieldname name] break } } switch -- $parclass { # ^^^^^^ keyword.control "element-attach" { # ^^^^^^^^^^^^^^^^ string.quoted.double # CPE SA # ^^^^^^^^^ comment return [svcmap_hook_return sm] # ^^^^^^ keyword.control # ^^^^^^^^^^^^^^^^^^ variable.function } "interface" { # ^^^^^^^^^^^ string.quoted.double set ifoid $paroid set eaoid [elm_oid_by_iface $ifoid] set earole [objectGetField -oid $eaoid -fieldname role] } } } # https://github.com/sublimehq/Packages/issues/1145 # When set has a brace followed by non-whitespace, # we treat it as a string set w {foobar} # ^^^^^^^^ string.quoted.brace # ^ punctuation.definition.string.begin # ^ punctuation.definition.string.end # For set when the brace is not followed by a newline, # we treat it as expression, but without command names set x { 1 { 2 3 } } # ^^^^^^^^^^^^^ meta.block # ^ constant.numeric # ^^^^^^^ meta.block meta.block # ^ constant.numeric # ^ constant.numeric set y { foo {} # ^^^^^^^^ meta.block # ^ punctuation.section.block.begin # ^ - variable.function # ^^ meta.block meta.block # ^ punctuation.section.block.begin # ^ punctuation.section.block.end # comment # ^^^^^^^^^^ comment bar {} # ^^^^^^ meta.block # ^ - variable.function # ^^ meta.block meta.block # ^ punctuation.section.block.begin # ^ punctuation.section.block.end baz {} } # ^^^^^^^^ meta.block # ^ - variable.function # ^^ meta.block meta.block # ^ punctuation.section.block.begin # ^ punctuation.section.block.end # ^ meta.block punctuation.section.block.end # For a set with a brace followed by a newline, we # treat it as a block of code with commands set z { # ^ meta.block punctuation.section.block.begin foo {} # ^ meta.block variable.function # ^^ meta.block meta.block # ^ punctuation.section.block.begin # ^ punctuation.section.block.end bar {} # ^ variable.function # ^^ meta.block meta.block # ^ punctuation.section.block.begin # ^ punctuation.section.block.end baz {} # ^ variable.function # ^^ meta.block meta.block # ^ punctuation.section.block.begin # ^ punctuation.section.block.end } # <- meta.block punctuation.section.block.end if { 1 } { # <- keyword.control # ^^^^^ meta.block # ^ constant.numeric # ^ - meta.block # ^ meta.block # This tests an implicit block after the if statement. This could # be refactored, but the current implementation treats it this way. if 2 { # ^^^ meta.block - meta.block meta.block # ^^ keyword.control # ^ meta.block meta.block constant.numeric # ^ meta.block - meta.block meta.block # ^ meta.block meta.block punctuation.section.block.begin set x 1 # ^^^^^^^ meta.block meta.block # ^ constant.numeric set y 2 # ^^^^^^^ meta.block meta.block # ^ constant.numeric } # ^ meta.block meta.block punctuation.section.block.end } # <- meta.block punctuation.section.block.end if { $mpv(radar) eq "VHF" } { # <- keyword.control # ^^^^^^^^^^^^^^^^^^^^^^^^ meta.block # ^^ keyword.operator.word # ^ meta.block punctuation.section.block.begin if [ catch {UpdateIfKst} imf ] { # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block # ^^ keyword.control # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.substitution # ^ meta.block meta.block punctuation.section.block.begin set imf -1 # ^ keyword.operator # ^ constant.numeric if { $mpv(ifmon_errcount) < 5 } { # ^ keyword.control # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ meta.block meta.block meta.block # ^ keyword.operator # ^ constant.numeric EngineMsg [list $msg] [Utime] # ^ variable.function incr mpv(ifmon,errcount) } else { # ^ punctuation.section.block.end # ^ keyword.control # ^ punctuation.section.block.begin set msg "Too many IF monitor errors -- giving up" # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ string.quoted.double EngineMsg [list $msg] [Utime] # ^ variable.function } } }