From 62786ec7c60ea29cbbd48ae658cde7042dba4bb3 Mon Sep 17 00:00:00 2001 From: kiyan42 Date: Wed, 22 Apr 2020 11:13:05 +0200 Subject: feat/refacto: improve configurations - You should now get the configs through functions - Configs for languages are now inside a local object called parsers - You can get the parser installation configurations with `get_parser_configs` - A new object has been initialized inside configs to specify module config (called config). - Provide functions to enable/disable a module on one buffer - Provide functions to enable/disable a module on all buffers, and if filetype is specified, for specific filetype - Provide function to determine if module is activated for a specified filetype --- lua/nvim-treesitter/configs.lua | 337 +++++++++++++++++++++++++++++++++++----- 1 file changed, 296 insertions(+), 41 deletions(-) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index fd3b41d2..c9450ed6 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -1,88 +1,343 @@ -local M = {} +local api = vim.api +local queries = require'nvim-treesitter.query' +local parser_utils = require'nvim-treesitter.parsers' +local parsers = {} -M.repositories = { - javascript = { +parsers.javascript = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-javascript", files = { "src/parser.c", "src/scanner.c" }, - }, - c = { + } +} + +parsers.c = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-c", files = { "src/parser.c" } - }, - cpp = { + } +} + +parsers.cpp = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-cpp", files = { "src/parser.c", "src/scanner.cc" } - }, - rust = { + } +} + +parsers.rust = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-rust", files = { "src/parser.c", "src/scanner.c" }, - }, - lua = { + } +} + +parsers.lua = { + install_info = { url = "https://github.com/nvim-treesitter/tree-sitter-lua", files = { "src/parser.c", "src/scanner.cc" } - }, - python = { + } +} + +parsers.python = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-python", files = { "src/parser.c", "src/scanner.cc" }, - }, - go = { + } +} + +parsers.go = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-go", files = { "src/parser.c" }, - }, - ruby = { + } +} + +parsers.ruby = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-ruby", files = { "src/parser.c", "src/scanner.cc" }, - }, - bash = { + } +} + +parsers.bash = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-bash", files = { "src/parser.c", "src/scanner.cc" }, - }, - php = { + } +} + +parsers.php = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-php", files = { "src/parser.c", "src/scanner.cc" }, - }, - java = { + } +} + +parsers.java = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-java", files = { "src/parser.c" }, - }, - html = { + } +} + +parsers.html = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-html", files = { "src/parser.c", "src/scanner.cc" }, - }, - julia = { + } +} + +parsers.julia = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-julia", files = { "src/parser.c", "src/scanner.c" }, - }, - json = { + } +} + +parsers.json = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-json", files = { "src/parser.c" }, - }, - css = { + } +} + +parsers.css = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-css", files = { "src/parser.c", "src/scanner.c" }, - }, - ocaml = { + } +} + +parsers.ocaml = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-ocaml", files = { "src/parser.c", "src/scanner.cc" }, - }, - swift = { + } +} + +parsers.swift = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-swift", files = { "src/parser.c" }, - }, - csharp = { + } +} + +parsers.csharp = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-c-sharp", files = { "src/parser.c", "src/scanner.c" }, - }, - typescript = { + } +} + +parsers.typescript = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-typescript", files = { "src/parser.c", "src/scanner.c" }, location = "tree-sitter-typescript/typescript" - }, - tsx = { + } +} + +parsers.tsx = { + install_info = { url = "https://github.com/tree-sitter/tree-sitter-typescript", files = { "src/parser.c", "src/scanner.c" }, location = "tree-sitter-tsx/tsx" } } +-- @enable can be true or false +-- @disable is a list of languages, only relevant if enable is true +-- @keymaps list of user mappings for a given module if relevant +-- @is_supported function which, given a ft, will return true if the ft works on the module +local config = { + highlight = { + enable = false, + disable = {}, + is_supported = function(ft) + return queries.get_query(ft, 'highlights') ~= nil + end + }, + -- selection = { + -- enable = false, + -- disable = {}, + -- keymaps = {}, + -- is_supported = function() return false end + -- }, + -- folding = { + -- enable = false, + -- disable = {}, + -- keymaps = {}, + -- is_supported = function() return false end + -- } +} + +local M = {} + +local function enable_module(mod, bufnr, ft) + local bufnr = bufnr or api.nvim_get_current_buf() + local ft = ft or api.nvim_buf_get_option(bufnr, 'ft') + if not parsers[ft] or not config[mod] then + return + end + + local loaded_mod = require(string.format("nvim-treesitter.%s", mod)) + loaded_mod.attach(bufnr, ft) +end + +local function enable_mod_conf_autocmd(mod, ft) + if not config[mod] or M.is_enabled(mod, ft) then return end + + local cmd = string.format("lua require'nvim-treesitter.%s'.attach()", mod) + api.nvim_command(string.format("autocmd FileType %s %s", ft, cmd)) + for i, parser in pairs(config[mod].disable) do + if parser == ft then + table.remove(config[mod].disable, i) + break + end + end +end + +local function enable_all(mod, ft) + if not config[mod] then return end + + for _, bufnr in pairs(api.nvim_list_bufs()) do + if not ft or api.nvim_buf_get_option(bufnr, 'ft') == ft then + enable_module(mod, bufnr, ft) + end + end + if ft then + enable_mod_conf_autocmd(mod, ft) + else + for _, ft in pairs(M.available_parsers()) do + if parser_utils.has_parser(ft) then + enable_mod_conf_autocmd(mod, ft) + end + end + end + config[mod].enable = true +end + +local function disable_module(mod, bufnr, ft) + local bufnr = bufnr or api.nvim_get_current_buf() + local ft = ft or api.nvim_buf_get_option(bufnr, 'ft') + if not parsers[ft] or not config[mod] then + return + end + + local loaded_mod = require(string.format("nvim-treesitter.%s", mod)) + loaded_mod.detach(bufnr, ft) +end + +local function disable_mod_conf_autocmd(mod, ft) + if not config[mod] or not M.is_enabled(mod, ft) then return end + + api.nvim_command(string.format("autocmd! FileType %s", ft)) + table.insert(config[mod].disable, ft) +end + +local function disable_all(mod, ft) + for _, bufnr in pairs(api.nvim_list_bufs()) do + if not ft or api.nvim_buf_get_option(bufnr, 'ft') == ft then + disable_module(mod, bufnr, ft) + end + end + if ft then + disable_mod_conf_autocmd(mod, ft) + else + for _, ft in pairs(M.available_parsers()) do + if parser_utils.has_parser(ft) then + disable_mod_conf_autocmd(mod, ft) + end + end + config[mod].enable = false + end +end + +M.commands = { + TSBufEnable = { + run = enable_module, + args = { + "-nargs=1", + "-complete=custom,v:lua.ts_available_modules" + }, + description = '`:TSBufEnable module_name` enable a specified module on the current buffer' + }, + TSBufDisable = { + run = disable_module, + args = { + "-nargs=1", + "-complete=custom,v:lua.ts_available_modules" + }, + description = '`:TSBufDisable module_name` disable a specified module on the current buffer' + }, + TSEnableAll = { + run = enable_all, + args = { + "-nargs=+", + "-complete=custom,v:lua.ts_available_modules" + }, + description = '`:TSEnableAll module_name (filetype)` enables a specified module on all buffers. If filetype is specified, enable only for specified filetype' + }, + TSDisableAll = { + run = disable_all, + args = { + "-nargs=+", + "-complete=custom,v:lua.ts_available_modules" + }, + description = '`:TSDisableAll module_name (filetype)` disables a specified module on all buffers. If filetype is specified, disable only for specified filetype' + }, +} + +-- @param mod: module (string) +-- @param ft: filetype (string) +function M.is_enabled(mod, ft) + if not M.get_parser_configs()[ft] then return false end + + local module_config = M.get_config()[mod] + if not module_config then return false end + + if not module_config.enable or not module_config.is_supported(ft) then + return false + end + + for _, parser in pairs(module_config.disable) do + if ft == parser then return false end + end + return true +end + +function M.setup(user_data) + if not user_data then return end + + for mod, data in pairs(user_data) do + if config[mod] then + if type(data.enable) == 'boolean' then + config[mod].enable = data.enable + end + if type(data.disable) == 'table' then + config[mod].disable = data.disable + end + if config[mod].keymaps and type(data.keymaps) == 'table' then + config[mod].keymaps = data.keymaps + end + end + end +end + +function M.get_config() + return config +end + +function M.get_parser_configs() + return parsers +end + +function M.available_parsers() + return vim.tbl_keys(parsers) +end + +function M.available_modules() + return vim.tbl_keys(config) +end + return M -- cgit v1.2.3 From f489b4b0a337379973d6801805aa9b7800d2e6e8 Mon Sep 17 00:00:00 2001 From: kiyan42 Date: Sat, 25 Apr 2020 16:11:53 +0200 Subject: fix: config is enabled also checks parser existence --- lua/nvim-treesitter/configs.lua | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index c9450ed6..64d4170e 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -206,7 +206,9 @@ local function enable_all(mod, ft) end end if ft then - enable_mod_conf_autocmd(mod, ft) + if parser_utils.has_parser(ft) then + enable_mod_conf_autocmd(mod, ft) + end else for _, ft in pairs(M.available_parsers()) do if parser_utils.has_parser(ft) then @@ -245,9 +247,7 @@ local function disable_all(mod, ft) disable_mod_conf_autocmd(mod, ft) else for _, ft in pairs(M.available_parsers()) do - if parser_utils.has_parser(ft) then - disable_mod_conf_autocmd(mod, ft) - end + disable_mod_conf_autocmd(mod, ft) end config[mod].enable = false end @@ -291,7 +291,9 @@ M.commands = { -- @param mod: module (string) -- @param ft: filetype (string) function M.is_enabled(mod, ft) - if not M.get_parser_configs()[ft] then return false end + if not M.get_parser_configs()[ft] or not parser_utils.has_parser(ft) then + return false + end local module_config = M.get_config()[mod] if not module_config then return false end -- cgit v1.2.3 From cadb3ee1ff0f20a8d26b91502c410e56be90fd46 Mon Sep 17 00:00:00 2001 From: Thomas Vigouroux Date: Sat, 25 Apr 2020 16:35:10 +0200 Subject: refactor(textobj): use configs and don't use VimL --- lua/nvim-treesitter/configs.lua | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index 64d4170e..2761f0be 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -157,12 +157,15 @@ local config = { return queries.get_query(ft, 'highlights') ~= nil end }, - -- selection = { - -- enable = false, - -- disable = {}, - -- keymaps = {}, - -- is_supported = function() return false end - -- }, + textobj = { + enable = false, + disable = {}, + keymaps = { + node_incremental="grn", + scope_incremental="grc" + }, + is_supported = function() return true end + }, -- folding = { -- enable = false, -- disable = {}, -- cgit v1.2.3 From fc88339832e61d7ed0c7604057cb02bb0ceec153 Mon Sep 17 00:00:00 2001 From: Stephan Seitz Date: Fri, 1 May 2020 10:20:19 +0200 Subject: Add `ensure_installed` option to config --- lua/nvim-treesitter/configs.lua | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index 2761f0be..eabe3e3b 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -325,6 +325,9 @@ function M.setup(user_data) if config[mod].keymaps and type(data.keymaps) == 'table' then config[mod].keymaps = data.keymaps end + if mod == 'ensure_installed' then + require'nvim-treesitter/install'.ensure_installed(data) + end end end end -- cgit v1.2.3 From dc06f9ea8147da2b6aed60ce2eb657470e4e99a7 Mon Sep 17 00:00:00 2001 From: kiyan42 Date: Fri, 1 May 2020 12:26:57 +0200 Subject: update docs for ensure installed, move modules config in config.modules --- lua/nvim-treesitter/configs.lua | 87 ++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 44 deletions(-) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index eabe3e3b..90ab92c4 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -150,28 +150,31 @@ parsers.tsx = { -- @keymaps list of user mappings for a given module if relevant -- @is_supported function which, given a ft, will return true if the ft works on the module local config = { - highlight = { - enable = false, - disable = {}, - is_supported = function(ft) - return queries.get_query(ft, 'highlights') ~= nil - end - }, - textobj = { - enable = false, - disable = {}, - keymaps = { - node_incremental="grn", - scope_incremental="grc" + modules = { + highlight = { + enable = false, + disable = {}, + is_supported = function(ft) + return queries.get_query(ft, 'highlights') ~= nil + end + }, + textobj = { + enable = false, + disable = {}, + keymaps = { + node_incremental="grn", + scope_incremental="grc" + }, + is_supported = function() return true end }, - is_supported = function() return true end + -- folding = { + -- enable = false, + -- disable = {}, + -- keymaps = {}, + -- is_supported = function() return false end + -- } }, - -- folding = { - -- enable = false, - -- disable = {}, - -- keymaps = {}, - -- is_supported = function() return false end - -- } + ensure_installed = nil } local M = {} @@ -179,7 +182,7 @@ local M = {} local function enable_module(mod, bufnr, ft) local bufnr = bufnr or api.nvim_get_current_buf() local ft = ft or api.nvim_buf_get_option(bufnr, 'ft') - if not parsers[ft] or not config[mod] then + if not parsers[ft] or not config.modules[mod] then return end @@ -188,20 +191,20 @@ local function enable_module(mod, bufnr, ft) end local function enable_mod_conf_autocmd(mod, ft) - if not config[mod] or M.is_enabled(mod, ft) then return end + if not config.modules[mod] or M.is_enabled(mod, ft) then return end local cmd = string.format("lua require'nvim-treesitter.%s'.attach()", mod) api.nvim_command(string.format("autocmd FileType %s %s", ft, cmd)) - for i, parser in pairs(config[mod].disable) do + for i, parser in pairs(config.modules[mod].disable) do if parser == ft then - table.remove(config[mod].disable, i) + table.remove(config.modules[mod].disable, i) break end end end local function enable_all(mod, ft) - if not config[mod] then return end + if not config.modules[mod] then return end for _, bufnr in pairs(api.nvim_list_bufs()) do if not ft or api.nvim_buf_get_option(bufnr, 'ft') == ft then @@ -219,13 +222,13 @@ local function enable_all(mod, ft) end end end - config[mod].enable = true + config.modules[mod].enable = true end local function disable_module(mod, bufnr, ft) local bufnr = bufnr or api.nvim_get_current_buf() local ft = ft or api.nvim_buf_get_option(bufnr, 'ft') - if not parsers[ft] or not config[mod] then + if not parsers[ft] or not config.modules[mod] then return end @@ -234,10 +237,10 @@ local function disable_module(mod, bufnr, ft) end local function disable_mod_conf_autocmd(mod, ft) - if not config[mod] or not M.is_enabled(mod, ft) then return end + if not config.modules[mod] or not M.is_enabled(mod, ft) then return end api.nvim_command(string.format("autocmd! FileType %s", ft)) - table.insert(config[mod].disable, ft) + table.insert(config.modules[mod].disable, ft) end local function disable_all(mod, ft) @@ -252,7 +255,7 @@ local function disable_all(mod, ft) for _, ft in pairs(M.available_parsers()) do disable_mod_conf_autocmd(mod, ft) end - config[mod].enable = false + config.modules[mod].enable = false end end @@ -298,7 +301,7 @@ function M.is_enabled(mod, ft) return false end - local module_config = M.get_config()[mod] + local module_config = config.modules[mod] if not module_config then return false end if not module_config.enable or not module_config.is_supported(ft) then @@ -315,27 +318,23 @@ function M.setup(user_data) if not user_data then return end for mod, data in pairs(user_data) do - if config[mod] then + if config.modules[mod] then if type(data.enable) == 'boolean' then - config[mod].enable = data.enable + config.modules[mod].enable = data.enable end if type(data.disable) == 'table' then - config[mod].disable = data.disable + config.modules[mod].disable = data.disable end - if config[mod].keymaps and type(data.keymaps) == 'table' then - config[mod].keymaps = data.keymaps - end - if mod == 'ensure_installed' then - require'nvim-treesitter/install'.ensure_installed(data) + if config.modules[mod].keymaps and type(data.keymaps) == 'table' then + config.modules[mod].keymaps = data.keymaps end + elseif mod == 'ensure_installed' then + config.ensure_installed = data + require'nvim-treesitter/install'.ensure_installed(data) end end end -function M.get_config() - return config -end - function M.get_parser_configs() return parsers end @@ -345,7 +344,7 @@ function M.available_parsers() end function M.available_modules() - return vim.tbl_keys(config) + return vim.tbl_keys(config.modules) end return M -- cgit v1.2.3 From 56f4aef198d07940c901b2bce9bab6484e7ab38a Mon Sep 17 00:00:00 2001 From: Stephan Seitz Date: Fri, 1 May 2020 13:31:05 +0200 Subject: Add some more community parsers The haskell one really takes long to compile --- lua/nvim-treesitter/configs.lua | 56 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index eabe3e3b..fc5a5575 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -145,6 +145,62 @@ parsers.tsx = { } } +parsers.scala = { + install_info = { + url = "https://github.com/tree-sitter/tree-sitter-scala", + files = { "src/parser.c", "src/scanner.c" }, + } +} + +parsers.haskell = { + install_info = { + url = "https://github.com/tree-sitter/tree-sitter-haskell", + files = { "src/parser.c", "src/scanner.cc" }, + } +} + +parsers.markdown = { + install_info = { + url = "https://github.com/ikatyang/tree-sitter-markdown", + files = { "src/parser.c", "src/scanner.cc" }, + } +} + +parsers.toml = { + install_info = { + url = "https://github.com/ikatyang/tree-sitter-toml", + files = { "src/parser.c", "src/scanner.c" }, + } +} + +parsers.vue = { + install_info = { + url = "https://github.com/ikatyang/tree-sitter-vue", + files = { "src/parser.c", "src/scanner.cc" }, + } +} + +parsers.elm = { + install_info = { + url = "https://github.com//razzeee/tree-sitter-elm", + files = { "src/parser.c", "src/scanner.cc" }, + } +} + +parsers.yaml = { + install_info = { + url = "https://github.com/ikatyang/tree-sitter-yaml", + files = { "src/parser.c", "src/scanner.cc" }, + } +} + +parsers.nix = { + install_info = { + url = "https://github.com/cstrahan/tree-sitter-nix", + files = { "src/parser.c", "src/scanner.cc" }, + } +} + -- @enable can be true or false -- @disable is a list of languages, only relevant if enable is true -- @keymaps list of user mappings for a given module if relevant -- cgit v1.2.3 From 39da51bbd12b8cda64226f905dba6556cc9d9b75 Mon Sep 17 00:00:00 2001 From: Thomas Vigouroux Date: Sat, 2 May 2020 11:33:32 +0200 Subject: modules: move textobj to incremental_selection As suggested in #37, rename the textobj module to incremental_selection. Also adds a utility function to get the config of a module. --- lua/nvim-treesitter/configs.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index 9363c9e6..10dcc960 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -214,7 +214,7 @@ local config = { return queries.get_query(ft, 'highlights') ~= nil end }, - textobj = { + incremental_selection = { enable = false, disable = {}, keymaps = { @@ -403,4 +403,8 @@ function M.available_modules() return vim.tbl_keys(config.modules) end +function M.get_module(mod) + return config.modules[mod] +end + return M -- cgit v1.2.3 From d0b84dd89fb1cb4fc637cd3deec427745ba3145b Mon Sep 17 00:00:00 2001 From: Stephan Seitz Date: Fri, 1 May 2020 16:25:06 +0200 Subject: Add 'nvim-treesitter/node-movement' --- lua/nvim-treesitter/configs.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'lua/nvim-treesitter/configs.lua') diff --git a/lua/nvim-treesitter/configs.lua b/lua/nvim-treesitter/configs.lua index 10dcc960..9695da5a 100644 --- a/lua/nvim-treesitter/configs.lua +++ b/lua/nvim-treesitter/configs.lua @@ -223,6 +223,17 @@ local config = { }, is_supported = function() return true end }, + node_movement = { + enable = false, + disable = {}, + is_supported = function() return true end, + keymaps = { + move_up = "", + move_down = "", + move_left = "", + move_right = "", + }, + }, -- folding = { -- enable = false, -- disable = {}, -- cgit v1.2.3