Files
dotfiles/nvim/files/lua/plugins/treesitter.lua
T
2026-03-13 12:21:18 +00:00

104 lines
2.2 KiB
Lua

return {
-- Highlight, edit, and navigate code
"nvim-treesitter/nvim-treesitter",
lazy = false,
build = ":TSUpdate",
config = function()
local ts = require("nvim-treesitter")
ts.setup({
install_dir = vim.fn.stdpath("data") .. "/site",
})
-- Install parsers (async, no-op if already installed)
ts.install({
"vimdoc",
"javascript",
"typescript",
"tsx",
"c",
"lua",
"rust",
"jsdoc",
"bash",
"svelte",
"astro",
"vue",
"css",
"scss",
"gdscript",
"nix",
})
vim.api.nvim_create_autocmd("FileType", {
pattern = {
"svelte",
"javascript",
"typescript",
"tsx",
"html",
"css",
"lua",
"nix",
},
callback = function()
pcall(vim.treesitter.start)
end,
})
-- Workaround: some svelte parser/query combos don't inject JS for <script>
-- blocks without an explicit lang attribute, which leaves raw_text as @none.
vim.treesitter.query.set("svelte", "injections", [=[
; inherits: html_tags
((style_element
(start_tag
(attribute
(attribute_name) @_attr
(quoted_attribute_value
(attribute_value) @_lang)))
(raw_text) @injection.content)
(#eq? @_attr "lang")
(#any-of? @_lang "scss" "postcss" "less")
(#set! injection.language "scss"))
; fallback for plain <script>...</script>
((script_element
(raw_text) @injection.content)
(#set! injection.language "javascript"))
((script_element
(start_tag
(attribute
(attribute_name) @_attr
(quoted_attribute_value
(attribute_value) @_lang)))
(raw_text) @injection.content)
(#eq? @_attr "lang")
(#any-of? @_lang "ts" "typescript")
(#set! injection.language "typescript"))
((script_element
(start_tag
(attribute
(attribute_name) @_attr
(quoted_attribute_value
(attribute_value) @_lang)))
(raw_text) @injection.content)
(#eq? @_attr "lang")
(#any-of? @_lang "js" "javascript")
(#set! injection.language "javascript"))
((element
(start_tag
(attribute
(attribute_name) @_attr
(quoted_attribute_value
(attribute_value) @injection.language)))
(text) @injection.content)
(#eq? @_attr "lang")
(#eq? @injection.language "pug"))
]=])
end,
}