return { { "nvim-treesitter/nvim-treesitter", dependencies = { "nvim-treesitter/nvim-treesitter-textobjects", { "nvim-treesitter/nvim-treesitter-context", enabled = false, config = function() require("treesitter-context").setup({ mode = "cursor", max_lines = 5, multiline_threshold = 5, }) end, }, }, build = ":TSUpdate", config = function() require("nvim-treesitter.configs").setup({ ensure_installed = { "asm", "arduino", "bash", "c", "css", "diff", "dot", "gitcommit", "html", "http", "javascript", "json", "latex", "lua", "make", "markdown", "markdown_inline", "muttrc", "nginx", "odin", "pascal", "query", "regex", "ruby", "sql", "tmux", "vala", "vim", "vimdoc", "xml", "yaml", "zig", }, auto_install = false, indent = { enable = true }, highlight = { enable = true, disable = function(_, 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, }, textobjects = { select = { enable = true, lookahead = true, keymaps = { ["aa"] = "@parameter.outer", ["ia"] = "@parameter.inner", ["af"] = "@function.outer", ["if"] = "@function.inner", ["ac"] = "@class.outer", ["ic"] = "@class.inner", ["ai"] = "@conditional.outer", ["ii"] = "@conditional.inner", ["al"] = "@loop.outer", ["il"] = "@loop.inner", ["ab"] = "@block.outer", ["ib"] = "@loop.inner", ["at"] = "@comment.outer", }, }, move = { enable = true, set_jumps = true, goto_next_start = { ["]p"] = "@parameter.inner", ["]m"] = "@function.outer", ["]]"] = "@class.outer", ["]l"] = "@loop.outer", ["]i"] = "@conditional.outer", ["]b"] = "@block.outer", ["]t"] = "@comment.outer", }, goto_next_end = { ["]P"] = "@parameter.inner", ["]M"] = "@function.outer", ["]["] = "@class.outer", ["]L"] = "@loop.outer", ["]B"] = "@block.outer", }, goto_previous_start = { ["[p"] = "@parameter.inner", ["[m"] = "@function.outer", ["[["] = "@class.outer", ["[l"] = "@loop.outer", ["[i"] = "@conditional.outer", ["[b"] = "@block.outer", ["[t"] = "@comment.outer", }, goto_previous_end = { ["[P"] = "@parameter.inner", ["[M"] = "@function.outer", ["[]"] = "@class.outer", ["[L"] = "@loop.outer", ["[B"] = "@block.outer", }, }, swap = { enable = true, swap_next = { ["a"] = "@parameter.inner", }, swap_previous = { ["A"] = "@parameter.inner", }, }, lsp_interop = { enable = true, border = "single", floating_preview_opts = {}, peek_definition_code = { ["df"] = "@function.outer", ["dF"] = "@class.outer", }, }, }, }) -- Crystal parser local parsers = require("nvim-treesitter.parsers") local parser_config = parsers.get_parser_configs() parser_config.crystal = { install_info = { url = "~/Downloads/src/tree-sitter-crystal", files = { "src/parser.c", "src/scanner.c" }, branch = "main", }, filetype = "cr", } parser_config.haml = { install_info = { url = "https://github.com/vitallium/tree-sitter-haml", files = { "src/parser.c", "src/scanner.c" }, branch = "main", }, filetype = "haml", } -- Code folding vim.opt.foldlevel = 99 vim.opt.foldlevelstart = 1 vim.opt.foldnestmax = 4 vim.opt.foldcolumn = "1" vim.opt.foldenable = false vim.api.nvim_create_autocmd("FileType", { callback = function() if parsers.has_parser() then vim.opt.foldmethod = "expr" vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()" vim.opt.foldtext = "" else vim.opt.foldmethod = "indent" vim.opt.foldtext = "" end end, desc = "Set foldmethod", }) end, }, }