return { { "nvim-treesitter/nvim-treesitter", branch = "main", build = ":TSUpdate", config = function() require("nvim-treesitter").setup({}) require("nvim-treesitter").install({ "bash", "blade", "c", "comment", "css", "diff", "dockerfile", "fish", "gitcommit", "gitignore", "go", "gomod", "gosum", "gowork", "html", "ini", "javascript", "jsdoc", "json", "lua", "luadoc", "luap", "make", "markdown", "markdown_inline", "nginx", "nix", "proto", "python", "query", "regex", "rust", "scss", "sql", "terraform", "toml", "tsx", "typescript", "vim", "vimdoc", "xml", "yaml", "zig", }) vim.wo.foldexpr = "v:lua.vim.treesitter.foldexpr()" vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" vim.api.nvim_create_autocmd("FileType", { pattern = { "*" }, callback = function() local filetype = vim.bo.filetype if filetype and filetype ~= "" then pcall(vim.treesitter.start) end end, }) end, }, { "nvim-treesitter/nvim-treesitter-textobjects", branch = "main", dependencies = { "nvim-treesitter/nvim-treesitter" }, config = function() require("nvim-treesitter-textobjects").setup({ select = { enable = true, lookahead = true, selection_modes = { ["@parameter.outer"] = "v", ["@function.outer"] = "V", ["@class.outer"] = "", }, include_surrounding_whitespace = false, }, move = { enable = true, set_jumps = true, }, }) -- SELECT keymaps local sel = require("nvim-treesitter-textobjects.select") for _, map in ipairs({ { { "x", "o" }, "af", "@function.outer" }, { { "x", "o" }, "if", "@function.inner" }, { { "x", "o" }, "ac", "@class.outer" }, { { "x", "o" }, "ic", "@class.inner" }, { { "x", "o" }, "aa", "@parameter.outer" }, { { "x", "o" }, "ia", "@parameter.inner" }, { { "x", "o" }, "ad", "@comment.outer" }, { { "x", "o" }, "as", "@statement.outer" }, }) do vim.keymap.set(map[1], map[2], function() sel.select_textobject(map[3], "textobjects") end, { desc = "Select " .. map[3] }) end -- MOVE keymaps local mv = require("nvim-treesitter-textobjects.move") for _, map in ipairs({ { { "n", "x", "o" }, "]m", mv.goto_next_start, "@function.outer" }, { { "n", "x", "o" }, "[m", mv.goto_previous_start, "@function.outer" }, { { "n", "x", "o" }, "]]", mv.goto_next_start, "@class.outer" }, { { "n", "x", "o" }, "[[", mv.goto_previous_start, "@class.outer" }, { { "n", "x", "o" }, "]M", mv.goto_next_end, "@function.outer" }, { { "n", "x", "o" }, "[M", mv.goto_previous_end, "@function.outer" }, { { "n", "x", "o" }, "]o", mv.goto_next_start, { "@loop.inner", "@loop.outer" } }, { { "n", "x", "o" }, "[o", mv.goto_previous_start, { "@loop.inner", "@loop.outer" } }, }) do local modes, lhs, fn, query = map[1], map[2], map[3], map[4] local qstr = (type(query) == "table") and table.concat(query, ",") or query vim.keymap.set(modes, lhs, function() fn(query, "textobjects") end, { desc = "Move to " .. qstr }) end end, }, }