diff options
| author | Lewis Russell <lewis6991@gmail.com> | 2023-02-24 09:49:16 +0000 |
|---|---|---|
| committer | Lewis Russell <me@lewisr.dev> | 2023-02-24 10:09:43 +0000 |
| commit | 801ef85f931e903192463c03d919a63b6d4023f9 (patch) | |
| tree | 77a254159e994e16c15e39024622e7503439e4c2 | |
| parent | feat!: remove support for used_by in parser configs (diff) | |
| download | nvim-treesitter-801ef85f931e903192463c03d919a63b6d4023f9.tar nvim-treesitter-801ef85f931e903192463c03d919a63b6d4023f9.tar.gz nvim-treesitter-801ef85f931e903192463c03d919a63b6d4023f9.tar.bz2 nvim-treesitter-801ef85f931e903192463c03d919a63b6d4023f9.tar.lz nvim-treesitter-801ef85f931e903192463c03d919a63b6d4023f9.tar.xz nvim-treesitter-801ef85f931e903192463c03d919a63b6d4023f9.tar.zst nvim-treesitter-801ef85f931e903192463c03d919a63b6d4023f9.zip | |
feat: use vim.treesitter.language.get_lang/add/register()
| -rw-r--r-- | README.md | 7 | ||||
| -rw-r--r-- | lua/nvim-treesitter/install.lua | 8 | ||||
| -rw-r--r-- | lua/nvim-treesitter/parsers.lua | 43 |
3 files changed, 49 insertions, 9 deletions
@@ -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 |
