; highlights.scm [ "!" "\*" "/" "%" "\+" "-" ">" ">=" "<" "<=" "==" "!=" "&&" "||" ] @operator [ "{" "}" "[" "]" "(" ")" ] @punctuation.bracket [ "." ".*" "," "[*]" ] @punctuation.delimiter [ (ellipsis) "\?" "=>" ] @punctuation.special [ ":" "=" ] @none [ "for" "endfor" "in" ] @repeat [ "if" "else" "endif" ] @conditional [ (quoted_template_start) ; " (quoted_template_end); " (template_literal) ; non-interpolation/directive content ] @string [ (heredoc_identifier) ; END (heredoc_start) ; << or <<- ] @punctuation.delimiter [ (template_interpolation_start) ; ${ (template_interpolation_end) ; } (template_directive_start) ; %{ (template_directive_end) ; } (strip_marker) ; ~ ] @punctuation.special (numeric_lit) @number (bool_lit) @boolean (null_lit) @constant (comment) @comment @spell (identifier) @variable (body (block (identifier) @keyword)) (body (block (body (block (identifier) @type)))) (function_call (identifier) @function) (attribute (identifier) @field) ; { key: val } ; ; highlight identifier keys as though they were block attributes (object_elem key: (expression (variable_expr (identifier) @field))) ; var.foo, data.bar ; ; first element in get_attr is a variable.builtin or a reference to a variable.builtin (expression (variable_expr (identifier) @variable.builtin) (get_attr (identifier) @field)) (ERROR) @error