diff --git a/.gitmodules b/.gitmodules index 6655e8e8..653f4cb4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -490,3 +490,9 @@ branch = main update = none ignore = dirty +[submodule "repos/fish"] + path = repos/fish + url = https://github.com/ram02z/tree-sitter-fish + branch = master + update = none + ignore = dirty diff --git a/CHANGELOG.md b/CHANGELOG.md index cfde77d8..41a467c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- Add `Fish` support ## 0.12.69 - 2023-10-12 - Add `Tcl` support diff --git a/queries/fish/highlights.scm b/queries/fish/highlights.scm new file mode 100644 index 00000000..4e24e128 --- /dev/null +++ b/queries/fish/highlights.scm @@ -0,0 +1,167 @@ +;; 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 diff --git a/repos/fish b/repos/fish new file mode 160000 index 00000000..f9176908 --- /dev/null +++ b/repos/fish @@ -0,0 +1 @@ +Subproject commit f9176908c9eb2e11eb684d79e1d00f3b29bd65c9 diff --git a/tree-sitter-langs.el b/tree-sitter-langs.el index 449648a0..d6fd8c08 100644 --- a/tree-sitter-langs.el +++ b/tree-sitter-langs.el @@ -104,6 +104,7 @@ See `tree-sitter-langs-repos'." (arduino-mode . arduino) (astro-mode . astro) (fasm-mode . asm) + (fish-mode . fish) (masm-mode . asm) (nasm-mode . asm) (sh-mode . bash)