diff --git a/README.md b/README.md index c5a36c4e2..2a6ebf5e5 100644 --- a/README.md +++ b/README.md @@ -481,13 +481,14 @@ parser_config.zimbu = { } ``` -If you wish to set a specific parser for a filetype, you should extend the `filetype_to_parsername` table: +If you wish to set a specific parser for a filetype, you should use `vim.treesitter.language.register()`: ```lua -local ft_to_parser = require"nvim-treesitter.parsers".filetype_to_parsername -ft_to_parser.someft = "python" -- the someft filetype will use the python parser and queries. +vim.treesitter.language.register('python', 'someft') -- the someft filetype will use the python parser and queries. ``` +Note this requires Nvim v0.9. + 4. Start `nvim` and `:TSInstall zimbu`. You can also skip step 2 and use `:TSInstallFromGrammar zimbu` to install directly from a `grammar.js` in the top-level directory specified by `url`. diff --git a/lua/nvim-treesitter/install.lua b/lua/nvim-treesitter/install.lua index 6a72c6cef..a82da7885 100644 --- a/lua/nvim-treesitter/install.lua +++ b/lua/nvim-treesitter/install.lua @@ -54,7 +54,13 @@ local function reattach_if_possible_fn(lang, error_on_fail) for _, buf in ipairs(vim.api.nvim_list_bufs()) do if parsers.get_buf_lang(buf) == lang then vim._ts_remove_language(lang) - local ok, err = pcall(vim.treesitter.language.require_language, lang) + local ok, err + if vim.treesitter.language.add then + local ft = vim.bo[buf].filetype + ok, err = pcall(vim.treesitter.language.add, lang, { filetype = ft }) + else + ok, err = pcall(vim.treesitter.language.require_language, lang) + end if not ok and error_on_fail then vim.notify("Could not load parser for " .. lang .. ": " .. vim.inspect(err)) end diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua index 9881e12a9..4769c95f0 100644 --- a/lua/nvim-treesitter/parsers.lua +++ b/lua/nvim-treesitter/parsers.lua @@ -1,7 +1,31 @@ local api = vim.api local ts = vim.treesitter -local filetype_to_parsername = { +local new_lang_api = ts.language.register ~= nil + +local filetype_to_parsername = {} + +if new_lang_api then + filetype_to_parsername = setmetatable({}, { + __newindex = function(_, k, v) + require("nvim-treesitter.utils").notify( + "filetype_to_parsername is deprecated, please use 'vim.treesitter.language.register'", + vim.log.levels.WARN + ) + ts.language.register(v, k) + end, + }) +end + +local function register_lang(lang, ft) + if new_lang_api then + ts.language.register(lang, ft) + return + end + filetype_to_parsername[ft] = lang +end + +for ft, lang in pairs { javascriptreact = "javascript", ecma = "javascript", jsx = "javascript", @@ -20,7 +44,9 @@ local filetype_to_parsername = { tape = "vhs", dosini = "ini", confini = "ini", -} +} do + register_lang(lang, ft) +end ---@class InstallInfo ---@field url string @@ -42,7 +68,7 @@ local filetype_to_parsername = { local list = setmetatable({}, { __newindex = function(table, parsername, parserconfig) rawset(table, parsername, parserconfig) - filetype_to_parsername[parserconfig.filetype or parsername] = parsername + register_lang(parsername, parserconfig.filetype or parsername) end, }) @@ -1524,13 +1550,20 @@ local M = { filetype_to_parsername = filetype_to_parsername, } +local function get_lang(ft) + if new_lang_api then + return ts.language.get_lang(ft) + end + return filetype_to_parsername[ft] +end + function M.ft_to_lang(ft) - local result = filetype_to_parsername[ft] + local result = get_lang(ft) if result then return result else ft = vim.split(ft, ".", { plain = true })[1] - return filetype_to_parsername[ft] or ft + return get_lang(ft) or ft end end