; Fish highlighting
; Operators
[
  "&&"
  "||"
  "|"
  "&"
  ".."
  "!"
  (direction)
  (stream_redirect)
] @operator

; match operators of test command
;(command
;  name: (word) @function.builtin (.eq? @function.builtin "test")
;  argument: (word) @operator (#match? @operator "^(!?\\=|-[a-zA-Z]+)$"))
; match operators of [ command
;(command
;  name: (word) @punctuation.bracket (.eq? @punctuation.bracket "[")
;  argument: (word) @operator (#match? @operator "^(!?\\=|-[a-zA-Z]+)$"))
[
  "not"
  "and"
  "or"
] @keyword.operator

; Conditionals
(if_statement
  [
    "if"
    "end"
  ] @conditional)

(switch_statement
  [
    "switch"
    "end"
  ] @conditional)

(case_clause
  "case" @conditional)

(else_clause
  "else" @conditional)

(else_if_clause
  [
    "else"
    "if"
  ] @conditional)

; Loops/Blocks
(while_statement
  [
    "while"
    "end"
  ] @repeat)

(for_statement
  [
    "for"
    "end"
  ] @repeat)

(begin_statement
  [
    "begin"
    "end"
  ] @repeat)

; Keywords
[
  "in"
  (break)
  (continue)
] @keyword

"return" @keyword.return

; Punctuation
[
  "["
  "]"
  "{"
  "}"
  "("
  ")"
] @punctuation.bracket

"," @punctuation.delimiter

; Commands
;(command
;  argument: [
;             (word) @parameter (.lua-match? @parameter "^[-]")
;            ]
;)
(command_substitution
  "$" @punctuation.bracket)

; non-builtin command names
(command
  name: (word) @function.call)

; derived from builtin -n (fish 3.2.2)
(command
  name: [
    (word) @function.builtin
    (#any-of? @function.builtin
      "." ":" "_" "alias" "argparse" "bg" "bind" "block" "breakpoint" "builtin" "cd" "command"
      "commandline" "complete" "contains" "count" "disown" "echo" "emit" "eval" "exec" "exit" "fg"
      "functions" "history" "isatty" "jobs" "math" "printf" "pwd" "random" "read" "realpath" "set"
      "set_color" "source" "status" "string" "test" "time" "type" "ulimit" "wait")
  ])

; Functions
(function_definition
  [
    "function"
    "end"
  ] @keyword.function)

(function_definition
  name: [
    (word)
    (concatenation)
  ] @function)

;(function_definition
;  option: [
;          (word)
;          (concatenation (word))
;          ] @parameter (.lua-match? @parameter "^[-]")
;)
; Strings
[
  (double_quote_string)
  (single_quote_string)
] @string

(escape_sequence) @string.escape

; Variables
(variable_name) @variable

(variable_expansion) @constant

; Nodes
[
  (integer)
  (float)
] @number

(comment) @comment

(comment) @spell

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

;((program . (comment) @preproc)
;  (.lua-match? @preproc "^#!/"))
; Error
(ERROR) @error
