aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2023-02-24 09:49:16 +0000
committerLewis Russell <me@lewisr.dev>2023-02-24 10:09:43 +0000
commit801ef85f931e903192463c03d919a63b6d4023f9 (patch)
tree77a254159e994e16c15e39024622e7503439e4c2
parentfeat!: remove support for used_by in parser configs (diff)
downloadnvim-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.md7
-rw-r--r--lua/nvim-treesitter/install.lua8
-rw-r--r--lua/nvim-treesitter/parsers.lua43
3 files changed, 49 insertions, 9 deletions
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