aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/treesitter/languagetree.lua
diff options
context:
space:
mode:
authorChristian Clason <c.clason@uni-graz.at>2024-04-02 10:54:40 +0200
committerChristian Clason <c.clason@uni-graz.at>2024-04-02 11:13:16 +0200
commit6cfca21bac6bb39b50cba1c23ffb2b69e2d94df8 (patch)
treefdc50912d6e1a84afecb4e8c9b7e0d0104ad8114 /runtime/lua/vim/treesitter/languagetree.lua
parentb3f9da9524b0b1bb992d3dd84eaa92980923cb3e (diff)
downloadrneovim-6cfca21bac6bb39b50cba1c23ffb2b69e2d94df8.tar.gz
rneovim-6cfca21bac6bb39b50cba1c23ffb2b69e2d94df8.tar.bz2
rneovim-6cfca21bac6bb39b50cba1c23ffb2b69e2d94df8.zip
feat(treesitter): add `@injection.filename`
Problem: Injecting languages for file redirects (e.g., in bash) is not possible. Solution: Add `@injection.filename` capture that is piped through `vim.filetype.match({ filename = node_text })`; the resulting filetype (if not `nil`) is then resolved as a language (either directly or through the list maintained via `vim.treesitter.language.register()`). Note: `@injection.filename` is a non-standard capture introduced by Helix; having two editors implement it makes it likely to be upstreamed.
Diffstat (limited to 'runtime/lua/vim/treesitter/languagetree.lua')
-rw-r--r--runtime/lua/vim/treesitter/languagetree.lua4
1 files changed, 4 insertions, 0 deletions
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua
index 3b5d8953c9..8f65cb57c3 100644
--- a/runtime/lua/vim/treesitter/languagetree.lua
+++ b/runtime/lua/vim/treesitter/languagetree.lua
@@ -809,6 +809,10 @@ function LanguageTree:_get_injection(match, metadata)
if name == 'injection.language' then
local text = vim.treesitter.get_node_text(node, self._source, { metadata = metadata[id] })
lang = resolve_lang(text)
+ elseif name == 'injection.filename' then
+ local text = vim.treesitter.get_node_text(node, self._source, { metadata = metadata[id] })
+ local ft = vim.filetype.match({ filename = text })
+ lang = ft and resolve_lang(ft)
elseif name == 'injection.content' then
ranges = get_node_ranges(node, self._source, metadata[id], include_children)
end