summaryrefslogtreecommitdiff
path: root/lua/nvim-treesitter/configs.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/nvim-treesitter/configs.lua')
-rw-r--r--lua/nvim-treesitter/configs.lua337
1 files changed, 296 insertions, 41 deletions
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