diff options
| author | Stephan Seitz <stephan.seitz@fau.de> | 2020-10-13 19:24:07 +0200 |
|---|---|---|
| committer | Stephan Seitz <stephan.lauf@yahoo.de> | 2020-10-31 23:13:04 +0100 |
| commit | 9327b113c2360d503ab183718c57e3e1b0819887 (patch) | |
| tree | b1751f743c066dbb0dd4d669de2424a7515334a3 /lua | |
| parent | 62551bca4e7c817b4dde6d1a38893f3c8a733d89 (diff) | |
feat(install): Enable installation of parser with repo.url as a local path
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/nvim-treesitter/install.lua | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua index 39df1168..2a91c07c 100644 --- a/lua/nvim-treesitter/install.lua +++ b/lua/nvim-treesitter/install.lua @@ -101,16 +101,31 @@ local function iter_cmd_sync(cmd_list) return true end -local function run_install(cache_folder, install_folder, lang, repo, with_sync) +local function run_install(cache_folder, install_folder, lang, repo, with_sync, generate_from_grammar) parsers.reset_cache() local path_sep = utils.get_path_sep() local project_name = 'tree-sitter-'..lang + local maybe_local_path = vim.fn.expand(repo.url) + local from_local_path = vim.fn.isdirectory(maybe_local_path) == 1 + if from_local_path then + repo.url = maybe_local_path + end + -- compile_location only needed for typescript installs. - local compile_location = cache_folder..path_sep..(repo.location or project_name) + local compile_location + if from_local_path then + compile_location = repo.url + else + compile_location = cache_folder..path_sep..(repo.location or project_name) + end local parser_lib_name = install_folder..path_sep..lang..".so" + if generate_from_grammar and vim.fn.executable('tree-sitter') ~= 1 then + api.nvim_err_writeln('tree-sitter CLI not found: `tree-sitter` is not executable!') + return + end local cc = shell.select_executable(M.compilers) if not cc then api.nvim_err_writeln('No C compiler found! "' @@ -121,8 +136,23 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync) local revision = configs.get_update_strategy() == 'lockfile' and get_revision(lang) local command_list = {} - vim.list_extend(command_list, { shell.select_install_rm_cmd(cache_folder, project_name) }) - vim.list_extend(command_list, shell.select_download_commands(repo, project_name, cache_folder, revision)) + if not from_local_path then + vim.list_extend(command_list, { shell.select_install_rm_cmd(cache_folder, project_name) }) + vim.list_extend(command_list, shell.select_download_commands(repo, project_name, cache_folder, revision)) + end + if generate_from_grammar then + vim.list_extend(command_list, { + { + cmd = 'tree-sitter', + info = 'Generating source files from grammar.js...', + err = 'Error during "tree-sitter generate"', + opts = { + args = {'generate'}, + cwd = compile_location + } + } + }) + end vim.list_extend(command_list, { { cmd = cc, @@ -134,8 +164,10 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync) } }, shell.select_mv_cmd('parser.so', parser_lib_name, compile_location), - shell.select_install_rm_cmd(cache_folder, project_name) }) + if not from_local_path then + vim.list_extend(command_list, {shell.select_install_rm_cmd(cache_folder, project_name)}) + end if with_sync then if iter_cmd_sync(command_list) == true then @@ -146,7 +178,7 @@ local function run_install(cache_folder, install_folder, lang, repo, with_sync) end end -local function install_lang(lang, ask_reinstall, cache_folder, install_folder, with_sync) +local function install_lang(lang, ask_reinstall, cache_folder, install_folder, with_sync, generate_from_grammar) if #api.nvim_get_runtime_file('parser/'..lang..'.so', false) > 0 then if ask_reinstall ~= 'force' then if not ask_reinstall then return end @@ -168,10 +200,10 @@ local function install_lang(lang, ask_reinstall, cache_folder, install_folder, w files={ install_info.files, 'table' } } - run_install(cache_folder, install_folder, lang, install_info, with_sync) + run_install(cache_folder, install_folder, lang, install_info, with_sync, generate_from_grammar) end -local function install(with_sync, ask_reinstall) +local function install(with_sync, ask_reinstall, generate_from_grammar) return function (...) if fn.executable('git') == 0 then return api.nvim_err_writeln('Git is required on your system to run this command') @@ -201,7 +233,7 @@ local function install(with_sync, ask_reinstall) end for _, lang in ipairs(languages) do - install_lang(lang, ask, cache_folder, install_folder, with_sync) + install_lang(lang, ask, cache_folder, install_folder, with_sync, generate_from_grammar) end end end @@ -282,6 +314,13 @@ M.commands = { "-complete=custom,nvim_treesitter#installable_parsers", }, }, + TSInstallFromGrammar = { + run = install(false, true, true), + args = { + "-nargs=+", + "-complete=custom,nvim_treesitter#installable_parsers", + }, + }, TSInstallSync = { run = install(true, true), args = { |
