mirror of
https://github.com/nvim-treesitter/nvim-treesitter.git
synced 2026-07-01 19:17:02 -04:00
feat: use vim.treesitter.language.get_lang/add/register()
This commit is contained in:
parent
f15d3b0322
commit
801ef85f93
3 changed files with 49 additions and 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
|
```lua
|
||||||
local ft_to_parser = require"nvim-treesitter.parsers".filetype_to_parsername
|
vim.treesitter.language.register('python', 'someft') -- the someft filetype will use the python parser and queries.
|
||||||
ft_to_parser.someft = "python" -- the someft filetype will use the python parser and queries.
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Note this requires Nvim v0.9.
|
||||||
|
|
||||||
4. Start `nvim` and `:TSInstall zimbu`.
|
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`.
|
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`.
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,13 @@ local function reattach_if_possible_fn(lang, error_on_fail)
|
||||||
for _, buf in ipairs(vim.api.nvim_list_bufs()) do
|
for _, buf in ipairs(vim.api.nvim_list_bufs()) do
|
||||||
if parsers.get_buf_lang(buf) == lang then
|
if parsers.get_buf_lang(buf) == lang then
|
||||||
vim._ts_remove_language(lang)
|
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
|
if not ok and error_on_fail then
|
||||||
vim.notify("Could not load parser for " .. lang .. ": " .. vim.inspect(err))
|
vim.notify("Could not load parser for " .. lang .. ": " .. vim.inspect(err))
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,31 @@
|
||||||
local api = vim.api
|
local api = vim.api
|
||||||
local ts = vim.treesitter
|
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",
|
javascriptreact = "javascript",
|
||||||
ecma = "javascript",
|
ecma = "javascript",
|
||||||
jsx = "javascript",
|
jsx = "javascript",
|
||||||
|
|
@ -20,7 +44,9 @@ local filetype_to_parsername = {
|
||||||
tape = "vhs",
|
tape = "vhs",
|
||||||
dosini = "ini",
|
dosini = "ini",
|
||||||
confini = "ini",
|
confini = "ini",
|
||||||
}
|
} do
|
||||||
|
register_lang(lang, ft)
|
||||||
|
end
|
||||||
|
|
||||||
---@class InstallInfo
|
---@class InstallInfo
|
||||||
---@field url string
|
---@field url string
|
||||||
|
|
@ -42,7 +68,7 @@ local filetype_to_parsername = {
|
||||||
local list = setmetatable({}, {
|
local list = setmetatable({}, {
|
||||||
__newindex = function(table, parsername, parserconfig)
|
__newindex = function(table, parsername, parserconfig)
|
||||||
rawset(table, parsername, parserconfig)
|
rawset(table, parsername, parserconfig)
|
||||||
filetype_to_parsername[parserconfig.filetype or parsername] = parsername
|
register_lang(parsername, parserconfig.filetype or parsername)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
@ -1524,13 +1550,20 @@ local M = {
|
||||||
filetype_to_parsername = filetype_to_parsername,
|
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)
|
function M.ft_to_lang(ft)
|
||||||
local result = filetype_to_parsername[ft]
|
local result = get_lang(ft)
|
||||||
if result then
|
if result then
|
||||||
return result
|
return result
|
||||||
else
|
else
|
||||||
ft = vim.split(ft, ".", { plain = true })[1]
|
ft = vim.split(ft, ".", { plain = true })[1]
|
||||||
return filetype_to_parsername[ft] or ft
|
return get_lang(ft) or ft
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue