local function gh(repo) return 'https://github.com/' .. repo end do vim.pack.add { { src = gh 'nvim-treesitter/nvim-treesitter', version = 'main' } } local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc', 'go', 'typescript', 'javascript', 'kotlin', 'yaml', 'html', 'json', 'markdown', 'markdown_inline', 'python', 'rust', 'toml', 'yaml', } require('nvim-treesitter').install(parsers) ---@param buf integer ---@param language string local function treesitter_try_attach(buf, language) -- Check if a parser exists and load it if not vim.treesitter.language.add(language) then return end -- Enable syntax highlighting and other treesitter features vim.treesitter.start(buf, language) -- Enable treesitter based folds -- For more info on folds see `:help folds` -- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' -- vim.wo.foldmethod = 'expr' -- Check if treesitter indentation is available for this language, and if so enable it -- in case there is no indent query, the indentexpr will fallback to the vim's built in one local has_indent_query = vim.treesitter.query.get(language, 'indents') ~= nil -- Enable treesitter based indentation if has_indent_query then vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" end end local available_parsers = require('nvim-treesitter').get_available() vim.api.nvim_create_autocmd('FileType', { callback = function(args) local buf, filetype = args.buf, args.match local language = vim.treesitter.language.get_lang(filetype) if not language then return end local installed_parsers = require('nvim-treesitter').get_installed 'parsers' if vim.tbl_contains(installed_parsers, language) then -- Enable the parser if it is already installed treesitter_try_attach(buf, language) elseif vim.tbl_contains(available_parsers, language) then -- If a parser is available in `nvim-treesitter`, auto-install it and enable it after the installation is done require('nvim-treesitter').install(language):await(function() treesitter_try_attach(buf, language) end) else -- Try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter` treesitter_try_attach(buf, language) end end, }) -- [[ Configure Treesitter ]] See `:help nvim-treesitter` require('nvim-treesitter').setup { ensure_installed = {}, -- Autoinstall languages that are not installed auto_install = true, highlight = { enable = true, disable = {}, -- list of language that will be disabled -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. -- If you are experiencing weird indenting issues, add the language to -- the list of additional_vim_regex_highlighting and disabled languages for indent. additional_vim_regex_highlighting = { 'ruby' }, }, indent = { enable = true, disable = { 'ruby' } }, textobjects = { select = { enable = true, lookahead = true, keymaps = { ['af'] = '@function.outer', ['if'] = '@function.inner', ['ac'] = '@class.outer', ['ic'] = '@class.inner', }, }, }, } end