From 2442c57b0b56abc239ad854a50319941b64bf143 Mon Sep 17 00:00:00 2001 From: Ori Perry Date: Sat, 11 Oct 2025 13:54:25 +0300 Subject: [PATCH] Automatically install treesitter parsers --- init.lua | 53 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/init.lua b/init.lua index 282803c6..79cddf7f 100644 --- a/init.lua +++ b/init.lua @@ -945,23 +945,54 @@ require('lazy').setup({ branch = 'main', -- [[ Configure Treesitter ]] See `:help nvim-treesitter-intro` config = function() - local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' } - require('nvim-treesitter').install(parsers) + ---@param buf integer + ---@param language string + ---@return boolean + local function treesitter_attach(buf, language) + -- check if parser exists before starting highlighter + if not vim.treesitter.language.add(language) then + return false + end + -- enables syntax highlighting and other treesitter features + vim.treesitter.start(buf, language) + -- enables treesitter based folds + -- for more info on folds see `:help folds` + -- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' + + -- enables treesitter based indentation + vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" + return true + end + + local available_parsers = require('nvim-treesitter.config').get_available() vim.api.nvim_create_autocmd('FileType', { - pattern = parsers, - callback = function() - -- enables syntax highlighting and other treesitter features - vim.treesitter.start() + callback = function(args) + local buf, filetype = args.buf, args.match + local language = vim.treesitter.language.get_lang(filetype) + if not language then + return + end - -- enables treesitter based folds - -- for more info on folds see `:help folds` - -- vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()' + if not (treesitter_attach(buf, language) or vim.tbl_contains(available_parsers, language)) then + return + end - -- enables treesitter based indentation - vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" + -- automaically install parser for missing languages + -- attempt to install even if it is available accoring to `vim.treesitter.langauge.add()`, + -- to ensure the latest version is installed using `nvim-treesitter`, instead of the outdated vendored parser + if not vim.tbl_contains(require('nvim-treesitter.config').get_installed 'parsers', language) then + -- attempt to start highlighter after installing missing language + require('nvim-treesitter.install').install(language):await(function() + treesitter_attach(buf, language) + end) + end end, }) + + -- ensure basic parser are installed + local parsers = { 'bash', 'c', 'diff', 'html', 'lua', 'luadoc', 'markdown', 'markdown_inline', 'query', 'vim', 'vimdoc' } + require('nvim-treesitter').install(parsers) end, -- There are additional nvim-treesitter modules that you can use to interact -- with nvim-treesitter. You should go explore a few and see what interests you: