dot/.config/nvim/lua/plugins/treesitter.lua
2026-04-14 15:46:03 +02:00

130 lines
4.7 KiB
Lua

return {
{
"nvim-treesitter/nvim-treesitter",
-- Load on these events for a snappier startup
event = { "BufReadPost", "BufNewFile" },
-- Keep the build command to update parsers automatically
build = ":TSUpdate",
config = function()
local configs = require("nvim-treesitter.configs")
configs.setup({
-- Automatically install missing parsers
ensure_installed = {
"bash", "c", "comment", "css", "diff", "dockerfile", "git_config",
"gitcommit", "gitignore", "go", "html", "http", "java", "javascript",
"jsdoc", "json", "json5", "kotlin", "lua", "luadoc", "luap", "make",
"markdown", "markdown_inline", "python", "query", "regex", "rst",
"sql", "ssh_config", "svelte", "terraform", "toml", "tsx",
"typescript", "typst", "vim", "vimdoc", "yaml", "groovy"
},
-- Enable syntax highlighting
highlight = {
enable = true,
-- Setting this to true will run `:h syntax` and Tree-sitter at the same time.
-- Set to `false` if you want Treesitter to handle everything.
additional_vim_regex_highlighting = false,
},
-- Enable indentation based on treesitter
indent = {
enable = true
},
})
-- Register custom filetypes for Treesitter
vim.treesitter.language.register("groovy", "Jenkinsfile")
-- Treesitter-based folding
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
vim.opt.foldlevel = 99 -- Prevents files from being folded by default
end,
},
{
"nvim-treesitter/nvim-treesitter-context",
dependencies = { "nvim-treesitter/nvim-treesitter" },
-- Context is only useful once you're actually inside a buffer
event = "BufReadPost",
opts = {
enable = true,
max_lines = 0,
min_window_height = 0,
line_numbers = true,
multiline_threshold = 10,
trim_scope = "outer",
mode = "cursor",
zindex = 20,
},
config = function(_, opts)
-- If the window is small, limit context to 1 line to save screen real estate
if vim.api.nvim_win_get_height(0) < 50 then
opts.multiline_threshold = 1
end
require("treesitter-context").setup(opts)
end,
},
{
"nvim-treesitter/nvim-treesitter-textobjects",
lazy = true,
config = function()
require("nvim-treesitter.configs").setup({
textobjects = {
select = {
enable = true,
lookahead = true,
keymaps = {
["af"] = "@function.outer",
["if"] = "@function.inner",
["ac"] = "@class.outer",
["ic"] = "@class.inner",
["as"] = { query = "@local.scope", query_group = "locals" },
},
selection_modes = {
['@parameter.outer'] = 'v',
['@function.outer'] = 'V',
['@class.outer'] = '<c-v>',
},
},
move = {
enable = true,
set_jumps = true,
goto_next_start = {
["]m"] = "@function.outer",
["]]"] = "@class.outer",
["]o"] = { query = { "@loop.inner", "@loop.outer" } },
["]s"] = { query = "@local.scope", query_group = "locals" },
["]z"] = { query = "@fold", query_group = "folds" },
},
goto_next_end = {
["]M"] = "@function.outer",
["]["] = "@class.outer",
},
goto_previous_start = {
["[m"] = "@function.outer",
["[["] = "@class.outer",
},
goto_previous_end = {
["[M"] = "@function.outer",
["[]"] = "@class.outer",
},
},
swap = {
enable = true,
swap_next = { ["<leader>a"] = "@parameter.inner" },
swap_previous = { ["<leader>A"] = "@parameter.inner" },
},
},
})
-- Repeatable moves logic (keeps ; and , functionality)
local ts_repeat_move = require("nvim-treesitter-textobjects.repeatable_move")
vim.keymap.set({ "n", "x", "o" }, ";", ts_repeat_move.repeat_last_move_next)
vim.keymap.set({ "n", "x", "o" }, ",", ts_repeat_move.repeat_last_move_previous)
vim.keymap.set({ "n", "x", "o" }, "f", ts_repeat_move.builtin_f_expr, { expr = true })
vim.keymap.set({ "n", "x", "o" }, "F", ts_repeat_move.builtin_F_expr, { expr = true })
vim.keymap.set({ "n", "x", "o" }, "t", ts_repeat_move.builtin_t_expr, { expr = true })
vim.keymap.set({ "n", "x", "o" }, "T", ts_repeat_move.builtin_T_expr, { expr = true })
end,
}
}