diff options
| -rw-r--r-- | doc/nvim-treesitter.txt | 21 | ||||
| -rw-r--r-- | lua/nvim-treesitter/configs.lua | 2 | ||||
| -rw-r--r-- | lua/nvim-treesitter/install.lua | 173 | ||||
| -rw-r--r-- | lua/nvim-treesitter/utils.lua | 2 |
4 files changed, 118 insertions, 80 deletions
diff --git a/doc/nvim-treesitter.txt b/doc/nvim-treesitter.txt index 1d480cdb6..6a0a7629b 100644 --- a/doc/nvim-treesitter.txt +++ b/doc/nvim-treesitter.txt @@ -184,10 +184,15 @@ Supported options: COMMANDS *nvim-treesitter-commands* *:TSInstall* -:TSInstall| {language} ...~ +:TSInstall {language} ...~ Install one or more treesitter parsers. -You can use |:TSInstall| `all` to install all parsers. +You can use |:TSInstall| `all` to install all parsers. Use |:TSInstall!| to +force the reinstallation of already installed parsers. + *:TSInstallSync* +:TSInstallSync {language} ...~ + +Perform the |:TSInstall| operation synchronously. *:TSInstallInfo* :TSInstallInfo~ @@ -195,10 +200,16 @@ You can use |:TSInstall| `all` to install all parsers. List informations about currently installed parsers *:TSUpdate* -:TSUpdate {language}~ +:TSUpdate {language} ...~ + +Update the installed parser for one more {language} or all installed parsers +if {language} is omitted. The specified parser is installed if it is not already +installed. + + *:TSUpdateSync* +:TSUpdateSync {language} ...~ -Update the installed parser of {language} or all installed parsers -if {language} is omitted. +Perform the |:TSUpdate| operation synchronously. *:TSUninstall* :TSUninstall {language}~ diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index f6815a80f..2428b826b 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -332,7 +332,7 @@ function M.setup(user_data) local ensure_installed = user_data.ensure_installed or {} if #ensure_installed > 0 then - require'nvim-treesitter.install'.ensure_installed(ensure_installed) + require'nvim-treesitter.install'.ensure_installed('',ensure_installed) end config.modules.ensure_installed = nil diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua index 44506606e..46d0bc7fe 100644 --- a/lua/nvim-treesitter/install.lua +++ b/lua/nvim-treesitter/install.lua @@ -50,6 +50,10 @@ local function get_installed_revision(lang) end end +local function is_installed(lang) + return #api.nvim_get_runtime_file('parser/'..lang..'.so', false) > 0 +end + local function needs_update(lang) return not get_revision(lang) or get_revision(lang) ~= get_installed_revision(lang) end @@ -280,9 +284,7 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync, end local function install_lang(bang, lang, cache_folder, install_folder, with_sync, generate_from_grammar) - if #api.nvim_get_runtime_file('parser/'..lang..'.so', false) > 0 then - if bang ~= '!' then return 1 end - end + if is_installed(lang) and bang ~= '!' then return 1 end local parser_config = parsers.get_parser_configs()[lang] if not parser_config then @@ -305,90 +307,110 @@ local function install(options) local generate_from_grammar = options.generate_from_grammar local exclude_configured_parsers = options.exclude_configured_parsers - return function (bang, ...) - if fn.executable('git') == 0 then - return api.nvim_err_writeln('Git is required on your system to run this command') - end + return function (bang) + return function (...) + if fn.executable('git') == 0 then + return api.nvim_err_writeln('Git is required on your system to run this command') + end - local cache_folder, err = utils.get_cache_dir() - if err then return api.nvim_err_writeln(err) end + local cache_folder, err = utils.get_cache_dir() + if err then return api.nvim_err_writeln(err) end - local install_folder, err = utils.get_parser_install_dir() - if err then return api.nvim_err_writeln(err) end + local install_folder, err = utils.get_parser_install_dir() + if err then return api.nvim_err_writeln(err) end - local languages - if ... == 'all' then - languages = parsers.available_parsers() - elseif ... == 'maintained' then - languages = parsers.maintained_parsers() - else - languages = vim.tbl_flatten({...}) - end + local languages + if ... == 'all' then + languages = parsers.available_parsers() + elseif ... == 'maintained' then + languages = parsers.maintained_parsers() + else + languages = vim.tbl_flatten({...}) + end - if exclude_configured_parsers then - languages = utils.difference(languages, configs.get_ignored_parser_installs()) - end + if exclude_configured_parsers then + languages = utils.difference(languages, configs.get_ignored_parser_installs()) + end - if #languages > 1 then - reset_progress_counter() - end + if #languages > 1 then + reset_progress_counter() + end - local skipped = 0 - for _, lang in ipairs(languages) do - skipped = skipped + install_lang(bang, lang, cache_folder, install_folder, with_sync, generate_from_grammar) - end - if skipped > 0 then - print('Parsers already installed. Use :TSInstall! to force reinstallation.') + local skipped = 0 + for _, lang in ipairs(languages) do + skipped = skipped + install_lang(bang, lang, cache_folder, install_folder, with_sync, generate_from_grammar) + end + if skipped > 0 then + print('Parsers already installed. Use :TSInstall! to force reinstallation.') + end end end end -function M.update(bang, lang) - M.lockfile = {} - reset_progress_counter() - if lang and lang ~= 'all' then - install({})('!', lang) - else - local parsers_to_update = configs.get_update_strategy() == 'lockfile' - and outdated_parsers() - or info.installed_parsers() - if #parsers_to_update == 0 then - print('All parsers are up-to-date!') - end - for _, lang in pairs(parsers_to_update) do - install({ - exclude_configured_parsers = true - })('!', lang) +function M.update(options) + options = options or {} + return function(bang) + return function (...) + M.lockfile = {} + reset_progress_counter() + if ... and ... ~= 'all' then + local languages = vim.tbl_flatten({...}) + local installed = 0 + for _, lang in ipairs(languages) do + if (not is_installed(lang)) or (needs_update(lang)) then + installed = installed + 1 + install({ with_sync = options.with_sync })('!')(lang) + end + end + if installed == 0 then + print('Parsers are up-to-date!') + end + else + local parsers_to_update = configs.get_update_strategy() == 'lockfile' + and outdated_parsers() + or info.installed_parsers() + if #parsers_to_update == 0 then + print('All parsers are up-to-date!') + end + for _, lang in pairs(parsers_to_update) do + install({ + exclude_configured_parsers = true, + with_sync = options.with_sync + })('!')(lang) + end + end end end end -function M.uninstall(bang,lang) - local path_sep = '/' - if fn.has('win32') == 1 then - path_sep = '\\' - end - - if vim.tbl_contains({'all', 'maintained'}, lang) then - reset_progress_counter() - local installed = info.installed_parsers() - if lang == "maintained" then - local maintained = parsers.maintained_parsers() - installed = vim.tbl_filter(function(l) return vim.tbl_contains(maintained, l) end, installed) - end - for _, lang in pairs(installed) do - M.uninstall(lang) +function M.uninstall(bang) + return function (lang) + local path_sep = '/' + if fn.has('win32') == 1 then + path_sep = '\\' end - elseif lang then - local install_dir, err = utils.get_parser_install_dir() - if err then return api.nvim_err_writeln(err) end - local parser_lib = install_dir..path_sep..lang..".so" + if vim.tbl_contains({'all', 'maintained'}, lang) then + reset_progress_counter() + local installed = info.installed_parsers() + if lang == "maintained" then + local maintained = parsers.maintained_parsers() + installed = vim.tbl_filter(function(l) return vim.tbl_contains(maintained, l) end, installed) + end + for _, langitem in pairs(installed) do + M.uninstall(langitem) + end + elseif lang then + local install_dir, err = utils.get_parser_install_dir() + if err then return api.nvim_err_writeln(err) end + + local parser_lib = install_dir..path_sep..lang..".so" - local command_list = { - shell.select_rm_file_cmd(parser_lib, "Uninstalling parser for "..lang) - } - M.iter_cmd(command_list, 1, lang, 'Treesitter parser for '..lang..' has been uninstalled') + local command_list = { + shell.select_rm_file_cmd(parser_lib, "Uninstalling parser for "..lang) + } + M.iter_cmd(command_list, 1, lang, 'Treesitter parser for '..lang..' has been uninstalled') + end end end @@ -453,10 +475,16 @@ M.commands = { }, }, TSUpdate = { - run = M.update, + run = M.update({}), + args = { + "-nargs=*", + "-complete=custom,nvim_treesitter#installed_parsers", + }, + }, + TSUpdateSync = { + run = M.update({ with_sync = true }), args = { "-nargs=*", - "-bang", "-complete=custom,nvim_treesitter#installed_parsers", }, }, @@ -464,7 +492,6 @@ M.commands = { run = M.uninstall, args = { "-nargs=+", - "-bang", "-complete=custom,nvim_treesitter#installed_parsers", }, }, diff --git a/lua/nvim-treesitter/utils.lua b/lua/nvim-treesitter/utils.lua index 8a73a66b5..fff04bcfb 100644 --- a/lua/nvim-treesitter/utils.lua +++ b/lua/nvim-treesitter/utils.lua @@ -6,7 +6,7 @@ local M = {} function M.setup_commands(mod, commands) for command_name, def in pairs(commands) do - local call_fn = string.format("lua require'nvim-treesitter.%s'.commands.%s.run('<bang>',<f-args>)", mod, command_name) + local call_fn = string.format("lua require'nvim-treesitter.%s'.commands.%s.run('<bang>')(<f-args>)", mod, command_name) local parts = vim.tbl_flatten({ "command!", def.args, |
