helix-mods/runtime/queries/just/injections.scm

83 lines
2.5 KiB
Scheme
Raw Normal View History

; Specify nested languages that live within a `justfile`
; ================ Always applicable ================
((comment) @injection.content
(#set! injection.language "comment"))
; Highlight the RHS of `=~` as regex
((regex
(_) @injection.content)
(#set! injection.language "regex"))
; ================ Global defaults ================
; Default everything to be bash
(recipe_body
!shebang
(#set! injection.language "bash")
(#set! injection.include-children)) @injection.content
(external_command
(content) @injection.content
(#set! injection.language "bash"))
; ================ Global language specified ================
; Global language is set with something like one of the following:
;
; set shell := ["bash", "-c", ...]
; set shell := ["pwsh.exe"]
;
; We can extract the first item of the array, but we can't extract the language
; name from the string with something like regex. So instead we special case
; two things: powershell, which is likely to come with a `.exe` attachment that
; we need to strip, and everything else which hopefully has no extension. We
; separate this with a `#match?`.
;
; Unfortunately, there also isn't a way to allow arbitrary nesting or
; alternatively set "global" capture variables. So we can set this for item-
; level external commands, but not for e.g. external commands within an
; expression without getting _really_ annoying. Should at least look fine since
; they default to bash. Limitations...
; See https://github.com/tree-sitter/tree-sitter/issues/880 for more on that.
(file
(setting "shell" ":=" "[" (string) @_langstr
(#match? @_langstr ".*(powershell|pwsh|cmd).*")
(#set! injection.language "powershell"))
[
(recipe
(recipe_body
!shebang
(#set! injection.include-children)) @injection.content)
(assignment
(expression
(value
(external_command
(content) @injection.content))))
])
(file
(setting "shell" ":=" "[" (string) @injection.language
(#not-match? @injection.language ".*(powershell|pwsh|cmd).*"))
[
(recipe
(recipe_body
!shebang
(#set! injection.include-children)) @injection.content)
(assignment
(expression
(value
(external_command
(content) @injection.content))))
])
; ================ Recipe language specified - Helix only ================
; Set highlighting for recipes that specify a language using builtin shebang matching
(recipe_body
(shebang_line) @injection.shebang
(#set! injection.include-children)) @injection.content