-- Treesitter: Syntax highlighting, incremental selection, textobjects, autotag return { { "nvim-treesitter/nvim-treesitter", build = ":TSUpdate", event = { "BufReadPost", "BufNewFile" }, dependencies = { "nvim-treesitter/nvim-treesitter-textobjects", "windwp/nvim-ts-autotag", }, config = function() require("nvim-treesitter.configs").setup({ -- Install parsers for primary languages ensure_installed = { "lua", "vim", "vimdoc", "php", "html", "javascript", "typescript", "tsx", "css", "scss", "json", "markdown", "markdown_inline", "bash", "python", "regex", }, -- Auto-install missing parsers auto_install = true, -- Syntax highlighting highlight = { enable = true, -- Disable for very large files disable = function(lang, buf) local max_filesize = 100 * 1024 -- 100 KB local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) if ok and stats and stats.size > max_filesize then return true end end, additional_vim_regex_highlighting = false, }, -- Incremental selection incremental_selection = { enable = true, keymaps = { init_selection = "", node_incremental = "", scope_incremental = "", node_decremental = "", }, }, -- Indentation (experimental, disable if issues) indent = { enable = false, -- Start disabled; can enable per-filetype if stable }, -- Textobjects textobjects = { select = { enable = true, lookahead = true, -- Jump forward to next textobject keymaps = { -- Functions ["af"] = "@function.outer", ["if"] = "@function.inner", -- Classes ["ac"] = "@class.outer", ["ic"] = "@class.inner", -- Parameters/arguments ["aa"] = "@parameter.outer", ["ia"] = "@parameter.inner", -- Conditionals ["ai"] = "@conditional.outer", ["ii"] = "@conditional.inner", -- Loops ["al"] = "@loop.outer", ["il"] = "@loop.inner", -- Comments ["a/"] = "@comment.outer", }, }, move = { enable = true, set_jumps = true, -- Add to jumplist goto_next_start = { ["]f"] = "@function.outer", ["]c"] = "@class.outer", ["]a"] = "@parameter.inner", }, goto_next_end = { ["]F"] = "@function.outer", ["]C"] = "@class.outer", ["]A"] = "@parameter.inner", }, goto_previous_start = { ["[f"] = "@function.outer", ["[c"] = "@class.outer", ["[a"] = "@parameter.inner", }, goto_previous_end = { ["[F"] = "@function.outer", ["[C"] = "@class.outer", ["[A"] = "@parameter.inner", }, }, swap = { enable = true, swap_next = { ["a"] = "@parameter.inner", }, swap_previous = { ["A"] = "@parameter.inner", }, }, }, }) -- Setup autotag require("nvim-ts-autotag").setup({ opts = { enable_close = true, -- Auto close tags enable_rename = true, -- Auto rename pairs of tags enable_close_on_slash = true, -- Auto close on trailing