; Fish highlighting
; Operators
[
  "&&"
  "||"
  "|"
  "&|"
  "2>|"
  "&"
  ".."
  "!"
  (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"
  ] @keyword.conditional)

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

(case_clause
  "case" @keyword.conditional)

(else_clause
  "else" @keyword.conditional)

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

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

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

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

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

"return" @keyword.return

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

"," @punctuation.delimiter

; Commands
(command
  argument: [
    (word) @variable.parameter
    (#lua-match? @variable.parameter "^[-]")
  ])

(command_substitution
  "$" @punctuation.special)

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

; derived from builtin -n (fish 4.3.3)
(command
  name: [
    (word) @function.builtin
    (#any-of? @function.builtin
      "." ":" "_" "abbr" "alias" "argparse" "bg" "bind" "block" "breakpoint" "builtin" "cd"
      "command" "commandline" "complete" "contains" "count" "disown" "echo" "emit" "eval" "exec"
      "exit" "fg" "fish_indent" "fish_key_reader" "functions" "history" "isatty" "jobs" "math"
      "path" "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))
  ] @variable.parameter
  (#lua-match? @variable.parameter "^[-]"))

; Strings
[
  (double_quote_string)
  (single_quote_string)
] @string

(escape_sequence) @string.escape

; Variables
(variable_name) @variable

(variable_expansion) @constant

(variable_expansion
  "$" @punctuation.special) @none

; Reference: https://fishshell.com/docs/current/language.html#special-variables
((variable_name) @variable.builtin
  (#any-of? @variable.builtin
    "PATH" "CDPATH" "LANG" "LANGUAGE" "LC_ALL" "LC_COLLATE" "LC_CTYPE" "LC_MESSAGES" "LC_MONETARY"
    "LC_NUMERIC" "LC_TIME" "fish_color_normal" "fish_color_command" "fish_color_keyword"
    "fish_color_keyword" "fish_color_redirection" "fish_color_end" "fish_color_error"
    "fish_color_param" "fish_color_valid_path" "fish_color_option" "fish_color_comment"
    "fish_color_selection" "fish_color_operator" "fish_color_escape" "fish_color_autosuggestion"
    "fish_color_cwd" "fish_color_cwd_root" "fish_color_user" "fish_color_host"
    "fish_color_host_remote" "fish_color_status" "fish_color_cancel" "fish_color_search_match"
    "fish_color_history_current" "fish_pager_color_progress" "fish_pager_color_background"
    "fish_pager_color_prefix" "fish_pager_color_completion" "fish_pager_color_description"
    "fish_pager_color_selected_background" "fish_pager_color_selected_prefix"
    "fish_pager_color_selected_completion" "fish_pager_color_selected_description"
    "fish_pager_color_secondary_background" "fish_pager_color_secondary_prefix"
    "fish_pager_color_secondary_completion" "fish_pager_color_secondary_description"
    "fish_term24bit" "fish_term256" "fish_ambiguous_width" "fish_emoji_width"
    "fish_autosuggestion_enabled" "fish_handle_reflow" "fish_key_bindings" "fish_escape_delay_ms"
    "fish_sequence_key_delay_ms" "fish_complete_path" "fish_cursor_selection_mode"
    "fish_cursor_default" "fish_cursor_insert" "fish_cursor_replace" "fish_cursor_replace_one"
    "fish_cursor_visual" "fish_cursor_external" "fish_function_path" "fish_greeting" "fish_history"
    "fish_trace" "FISH_DEBUG" "FISH_DEBUG_OUTPUT" "fish_user_paths" "umask" "BROWSER" "_" "argv"
    "CMD_DURATION" "COLUMNS" "LINES" "fish_kill_signal" "fish_killring" "fish_read_limit" "fish_pid"
    "fish_terminal_color_theme" "history" "HOME" "hostname" "IFS" "last_pid" "PWD" "pipestatus"
    "SHLVL" "status" "status_generation" "TERM" "USER" "EUID" "version" "FISH_VERSION"))

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

(comment) @comment

(comment) @spell

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

((program
  .
  (comment) @keyword.directive @nospell)
  (#lua-match? @keyword.directive "^#!/"))
