summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNovus Nota2024-03-24 22:30:59 +0000
committerGitHub2024-03-24 22:30:59 +0000
commit2d9e336f640cccdd347e35289c3e4c0371777a3f (patch)
tree4c0459834ad0796de350b169aa9e6d1da4996e27
parent47995bfb0cf3b0bc232a87340c7a01ff26d45bbc (diff)
feat: Add `Ohm` language support (#9991)
* feat: Add `Ohm` language support Hope this commit makes it into release :) * Update runtime/queries/ohm/highlights.scm Co-authored-by: Michael Davis <mcarsondavis@gmail.com> * chore: final newline --------- Co-authored-by: Michael Davis <mcarsondavis@gmail.com>
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml22
-rw-r--r--runtime/queries/ohm/highlights.scm122
-rw-r--r--runtime/queries/ohm/indents.scm37
-rw-r--r--runtime/queries/ohm/injections.scm7
-rw-r--r--runtime/queries/ohm/textobjects.scm40
6 files changed, 229 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index b74a8cdb..2030949e 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -128,6 +128,7 @@
| ocaml | ✓ | | ✓ | `ocamllsp` |
| ocaml-interface | ✓ | | | `ocamllsp` |
| odin | ✓ | | ✓ | `ols` |
+| ohm | ✓ | ✓ | ✓ | |
| opencl | ✓ | ✓ | ✓ | `clangd` |
| openscad | ✓ | | | `openscad-lsp` |
| org | ✓ | | | |
diff --git a/languages.toml b/languages.toml
index cbbfc5a9..9eb80414 100644
--- a/languages.toml
+++ b/languages.toml
@@ -3408,3 +3408,25 @@ formatter = { command = "prettier", args = ['--parser', 'glimmer'] }
[[grammar]]
name = "glimmer"
source = { git = "https://github.com/ember-tooling/tree-sitter-glimmer", rev = "5dc6d1040e8ff8978ff3680e818d85447bbc10aa" }
+
+[[language]]
+name = "ohm"
+scope = "source.ohm"
+injection-regex = "ohm"
+file-types = ["ohm"]
+comment-token = "//"
+block-comment-tokens = [
+ { start = "/*", end = "*/" },
+ { start = "/**", end = "*/" },
+]
+indent = { tab-width = 2, unit = " " }
+
+[language.auto-pairs]
+'"' = '"'
+'{' = '}'
+'(' = ')'
+'<' = '>'
+
+[[grammar]]
+name = "ohm"
+source = { git = "https://github.com/novusnota/tree-sitter-ohm", rev = "80f14f0e477ddacc1e137d5ed8e830329e3fb7a3" }
diff --git a/runtime/queries/ohm/highlights.scm b/runtime/queries/ohm/highlights.scm
new file mode 100644
index 00000000..68477aac
--- /dev/null
+++ b/runtime/queries/ohm/highlights.scm
@@ -0,0 +1,122 @@
+; See: https://docs.helix-editor.com/master/themes.html#syntax-highlighting
+
+; attribute
+; ---------
+
+(case_name) @attribute
+
+; comment.line
+; ------------
+
+[
+ (singleline_comment)
+ (rule_descr)
+] @comment.line
+
+; comment.block
+; -------------
+
+(multiline_comment) @comment.block
+
+; function.method
+; ---------------
+
+(rule
+ name: (identifier) @function.method)
+
+; function.builtin
+; ----------------
+
+; Lexical
+((identifier) @function.builtin
+ (#any-of? @function.builtin
+ "any"
+ "alnum"
+ "end"
+ "digit" "hexDigit"
+ "letter"
+ "space"
+ "lower" "upper" "caseInsensitive"
+ "listOf" "nonemptyListOf" "emptyListOf"
+ "applySyntactic")
+ (#is-not? local))
+
+; Syntactic
+((identifier) @function.builtin
+ (#any-of? @function.builtin "ListOf" "NonemptyListOf" "EmptyListOf")
+ (#is-not? local))
+
+; function.method (continuing)
+; ---------------
+
+(term
+ base: (identifier) @function.method)
+
+; string.special
+; --------------
+
+(escape_char) @constant.character.escape
+
+; string
+; ------
+
+[
+ (terminal_string)
+ (one_char_terminal)
+] @string
+
+; type
+; ----
+
+(super_grammar
+ name: (identifier) @type)
+
+(grammar
+ name: (identifier) @type)
+
+; operator
+; --------
+
+[
+ ; "=" ":=" "+="
+ (define) (override) (extend)
+
+ ; "&" "~"
+ (lookahead) (negative_lookahead)
+
+ ; "#"
+ (lexification)
+
+ ; "*" "+" "?"
+ (zero_or_more) (one_or_more) (zero_or_one)
+
+ ; "..."
+ (super_splice)
+
+ "<:" ".." "|"
+] @operator
+
+; punctuation.bracket
+; -------------------
+
+[
+ "<"
+ ">"
+ "{"
+ "}"
+] @punctuation.bracket
+
+(alt
+ "(" @punctuation.bracket
+ ")" @punctuation.bracket)
+
+; punctuation.delimiter
+; ---------------------
+
+"," @punctuation.delimiter
+
+; variable.parameter
+; ------------------
+
+(formals
+ (identifier) @variable.parameter)
diff --git a/runtime/queries/ohm/indents.scm b/runtime/queries/ohm/indents.scm
new file mode 100644
index 00000000..f56119ae
--- /dev/null
+++ b/runtime/queries/ohm/indents.scm
@@ -0,0 +1,37 @@
+; See: https://docs.helix-editor.com/guides/indent.html
+
+; indent
+; ------
+
+[
+ ; <..., ...>
+ (formals)
+ (params)
+
+ ; (...| ...)
+ (alt)
+] @indent
+
+; outdent
+; -------
+
+[
+ "}"
+ ")"
+ ">"
+] @outdent
+
+; align
+; -----
+
+; | ... | ...
+(rule_body
+ . (top_level_term) @anchor
+ (#set! "scope" "tail")) @align
+
+; N/A or unused:
+; --------------
+; indent.always
+; outdent.always
+; extend
+; extend.prevent-once
diff --git a/runtime/queries/ohm/injections.scm b/runtime/queries/ohm/injections.scm
new file mode 100644
index 00000000..dc50a765
--- /dev/null
+++ b/runtime/queries/ohm/injections.scm
@@ -0,0 +1,7 @@
+; See: https://docs.helix-editor.com/guides/injection.html
+
+((singleline_comment) @injection.content
+ (#set! injection.language "comment"))
+
+((multiline_comment) @injection.content
+ (#set! injection.language "comment"))
diff --git a/runtime/queries/ohm/textobjects.scm b/runtime/queries/ohm/textobjects.scm
new file mode 100644
index 00000000..855ad8de
--- /dev/null
+++ b/runtime/queries/ohm/textobjects.scm
@@ -0,0 +1,40 @@
+; See: https://docs.helix-editor.com/guides/textobject.html
+
+; function.inside & around
+; ------------------------
+
+(rule
+ body: (_) @function.inside) @function.around
+
+; class.inside & around
+; ---------------------
+
+(grammar
+ body: (_) @class.inside) @class.around
+
+; parameter.inside & around
+; -------------------------
+
+(formals
+ ((_) @parameter.inside . ","? @parameter.around) @parameter.around)
+
+(rule_body
+ ((_) @parameter.inside . "|"? @parameter.around) @parameter.around)
+
+(params
+ ((_) @parameter.inside . ","? @parameter.around) @parameter.around)
+
+(alt
+ ((_) @parameter.inside . "|"? @parameter.around) @parameter.around)
+
+; comment.inside
+; --------------
+
+(multiline_comment)+ @comment.inside
+(singleline_comment)+ @comment.inside
+
+; comment.around
+; --------------
+
+(multiline_comment)+ @comment.around
+(singleline_comment)+ @comment.around