mirror of
https://github.com/nvim-treesitter/nvim-treesitter.git
synced 2026-07-01 11:06:54 -04:00
feat!: drop modules, general refactor and cleanup
This commit is contained in:
parent
310f0925ec
commit
692b051b09
1247 changed files with 6096 additions and 9074 deletions
66
plugin/filetypes.lua
Normal file
66
plugin/filetypes.lua
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
local filetypes = {
|
||||
angular = { 'htmlangular' },
|
||||
bash = { 'sh' },
|
||||
bibtex = { 'bib' },
|
||||
c_sharp = { 'cs', 'csharp', 'c-sharp' },
|
||||
commonlisp = { 'lisp' },
|
||||
cooklang = { 'cook' },
|
||||
devicetree = { 'dts' },
|
||||
diff = { 'gitdiff' },
|
||||
eex = { 'eelixir' },
|
||||
elixir = { 'ex' },
|
||||
embedded_template = { 'eruby' },
|
||||
erlang = { 'erl' },
|
||||
facility = { 'fsd' },
|
||||
faust = { 'dsp' },
|
||||
gdshader = { 'gdshaderinc' },
|
||||
git_config = { 'gitconfig' },
|
||||
git_rebase = { 'gitrebase' },
|
||||
glimmer = { 'handlebars', 'html.handlebars' },
|
||||
godot_resource = { 'gdresource' },
|
||||
haskell = { 'hs' },
|
||||
haskell_persistent = { 'haskellpersistent' },
|
||||
idris = { 'idris2' },
|
||||
janet_simple = { 'janet' },
|
||||
javascript = { 'javascriptreact', 'ecma', 'jsx', 'js' },
|
||||
javascript_glimmer = { 'javascript.glimmer' },
|
||||
linkerscript = { 'ld' },
|
||||
latex = { 'tex' },
|
||||
m68k = { 'asm68k' },
|
||||
make = { 'automake' },
|
||||
markdown = { 'pandoc', 'quarto', 'rmd' },
|
||||
muttrc = { 'neomuttrc' },
|
||||
ocaml_interface = { 'ocamlinterface' },
|
||||
perl = { 'pl' },
|
||||
poe_filter = { 'poefilter' },
|
||||
properties = { 'jproperties' },
|
||||
python = { 'py', 'gyp' },
|
||||
qmljs = { 'qml' },
|
||||
runescript = { 'clientscript' },
|
||||
scala = { 'sbt' },
|
||||
slang = { 'shaderslang' },
|
||||
sqp = { 'mysqp' },
|
||||
ssh_config = { 'sshconfig' },
|
||||
starlark = { 'bzl' },
|
||||
surface = { 'sface' },
|
||||
t32 = { 'trace32' },
|
||||
tcl = { 'expect' },
|
||||
terraform = { 'terraform-vars' },
|
||||
textproto = { 'pbtxt' },
|
||||
tlaplus = { 'tla' },
|
||||
tsx = { 'typescriptreact', 'typescript.tsx' },
|
||||
typescript = { 'ts' },
|
||||
typescript_glimmer = { 'typescript.glimmer' },
|
||||
typst = { 'typ' },
|
||||
udev = { 'udevrules' },
|
||||
uxntal = { 'tal', 'uxn' },
|
||||
v = { 'vlang' },
|
||||
verilog = { 'systemverilog' },
|
||||
vhs = { 'tape' },
|
||||
xml = { 'xsd', 'xslt', 'svg' },
|
||||
xresources = { 'xdefaults' },
|
||||
}
|
||||
|
||||
for lang, ft in pairs(filetypes) do
|
||||
vim.treesitter.language.register(lang, ft)
|
||||
end
|
||||
|
|
@ -1,34 +1,86 @@
|
|||
-- Last Change: 2022 Apr 16
|
||||
|
||||
if vim.g.loaded_nvim_treesitter then
|
||||
return
|
||||
end
|
||||
vim.g.loaded_nvim_treesitter = true
|
||||
|
||||
-- setup modules
|
||||
require("nvim-treesitter").setup()
|
||||
|
||||
local api = vim.api
|
||||
|
||||
-- define autocommands
|
||||
local augroup = api.nvim_create_augroup("NvimTreesitter", {})
|
||||
local function complete_available_parsers(arglead)
|
||||
return vim.iter.filter(function(v)
|
||||
return v:find(arglead)
|
||||
end, require('nvim-treesitter.parsers').get_available())
|
||||
end
|
||||
|
||||
api.nvim_create_autocmd("Filetype", {
|
||||
pattern = "query",
|
||||
group = augroup,
|
||||
callback = function()
|
||||
api.nvim_clear_autocmds {
|
||||
group = augroup,
|
||||
event = "BufWritePost",
|
||||
}
|
||||
api.nvim_create_autocmd("BufWritePost", {
|
||||
group = augroup,
|
||||
buffer = 0,
|
||||
callback = function(opts)
|
||||
require("nvim-treesitter.query").invalidate_query_file(opts.file)
|
||||
end,
|
||||
desc = "Invalidate query file",
|
||||
})
|
||||
end,
|
||||
desc = "Reload query",
|
||||
local function complete_installed_parsers(arglead)
|
||||
return vim.iter.filter(function(v)
|
||||
return v:find(arglead)
|
||||
end, require('nvim-treesitter.config').installed_parsers())
|
||||
end
|
||||
|
||||
-- create user commands
|
||||
api.nvim_create_user_command('TSInstallInfo', function()
|
||||
require('nvim-treesitter.install').info()
|
||||
end, { nargs = 0, desc = 'List available treesitter parsers' })
|
||||
|
||||
api.nvim_create_user_command('TSInstall', function(args)
|
||||
require('nvim-treesitter.install').install(args.fargs, { force = args.bang })
|
||||
end, {
|
||||
nargs = '+',
|
||||
bang = true,
|
||||
bar = true,
|
||||
complete = complete_available_parsers,
|
||||
desc = 'Install treesitter parsers',
|
||||
})
|
||||
|
||||
api.nvim_create_user_command('TSInstallFromGrammar', function(args)
|
||||
require('nvim-treesitter.install').install(args.fargs, {
|
||||
generate_from_grammar = true,
|
||||
force = args.bang,
|
||||
})
|
||||
end, {
|
||||
nargs = '+',
|
||||
bang = true,
|
||||
bar = true,
|
||||
complete = complete_available_parsers,
|
||||
desc = 'Install treesitter parsers from grammar',
|
||||
})
|
||||
|
||||
api.nvim_create_user_command('TSInstallSync', function(args)
|
||||
require('nvim-treesitter.install').install(args.fargs, {
|
||||
with_sync = true,
|
||||
force = args.bang,
|
||||
})
|
||||
end, {
|
||||
nargs = '+',
|
||||
bang = true,
|
||||
bar = true,
|
||||
complete = complete_available_parsers,
|
||||
desc = 'Install treesitter parsers synchronously',
|
||||
})
|
||||
|
||||
api.nvim_create_user_command('TSUpdate', function(args)
|
||||
require('nvim-treesitter.install').update(args.fargs)
|
||||
end, {
|
||||
nargs = '*',
|
||||
bar = true,
|
||||
complete = complete_installed_parsers,
|
||||
desc = 'Update installed treesitter parsers',
|
||||
})
|
||||
|
||||
api.nvim_create_user_command('TSUpdateSync', function(args)
|
||||
require('nvim-treesitter.install').update(args.fargs, { with_sync = true })
|
||||
end, {
|
||||
nargs = '*',
|
||||
bar = true,
|
||||
complete = complete_installed_parsers,
|
||||
desc = 'Update installed treesitter parsers synchronously',
|
||||
})
|
||||
|
||||
api.nvim_create_user_command('TSUninstall', function(args)
|
||||
require('nvim-treesitter.install').uninstall(args.fargs)
|
||||
end, {
|
||||
nargs = '+',
|
||||
bar = true,
|
||||
complete = complete_installed_parsers,
|
||||
desc = 'Uninstall treesitter parsers',
|
||||
})
|
||||
|
|
|
|||
141
plugin/query_predicates.lua
Normal file
141
plugin/query_predicates.lua
Normal file
|
|
@ -0,0 +1,141 @@
|
|||
local query = vim.treesitter.query
|
||||
|
||||
-- register custom predicates
|
||||
|
||||
---@param match (TSNode|nil)[]
|
||||
---@param pred string[]
|
||||
---@return boolean|nil
|
||||
query.add_predicate('kind-eq?', function(match, _, _, pred)
|
||||
local node = match[pred[2]]
|
||||
if not node then
|
||||
return true
|
||||
end
|
||||
|
||||
local types = { unpack(pred, 3) }
|
||||
return vim.list_contains(types, node:type())
|
||||
end)
|
||||
|
||||
-- register custom directives
|
||||
|
||||
local mimetype_aliases = {
|
||||
['importmap'] = 'json',
|
||||
['module'] = 'javascript',
|
||||
['application/ecmascript'] = 'javascript',
|
||||
['text/ecmascript'] = 'javascript',
|
||||
}
|
||||
|
||||
---@param match (TSNode|nil)[]
|
||||
---@param _ string
|
||||
---@param bufnr integer
|
||||
---@param pred string[]
|
||||
---@return boolean|nil
|
||||
query.add_directive('set-lang-from-mimetype!', function(match, _, bufnr, pred, metadata)
|
||||
local capture_id = pred[2]
|
||||
local node = match[capture_id]
|
||||
if not node then
|
||||
return
|
||||
end
|
||||
local type_attr_value = vim.treesitter.get_node_text(node, bufnr)
|
||||
local configured = mimetype_aliases[type_attr_value]
|
||||
if configured then
|
||||
metadata['injection.language'] = configured
|
||||
else
|
||||
local parts = vim.split(type_attr_value, '/', {})
|
||||
metadata['injection.language'] = parts[#parts]
|
||||
end
|
||||
end)
|
||||
|
||||
local injection_aliases = {
|
||||
ex = 'elixir',
|
||||
pl = 'perl',
|
||||
sh = 'bash',
|
||||
uxn = 'uxntal',
|
||||
ts = 'typescript',
|
||||
}
|
||||
|
||||
---@param match (TSNode|nil)[]
|
||||
---@param _ string
|
||||
---@param bufnr integer
|
||||
---@param pred string[]
|
||||
---@return boolean|nil
|
||||
query.add_directive('set-lang-from-info-string!', function(match, _, bufnr, pred, metadata)
|
||||
local capture_id = pred[2]
|
||||
local node = match[capture_id]
|
||||
if not node then
|
||||
return
|
||||
end
|
||||
|
||||
local injection_alias = vim.treesitter.get_node_text(node, bufnr)
|
||||
local filetype = vim.filetype.match({ filename = 'a.' .. injection_alias })
|
||||
metadata['injection.language'] = filetype or injection_aliases[injection_alias] or injection_alias
|
||||
end)
|
||||
|
||||
query.add_directive('downcase!', function(match, _, bufnr, pred, metadata)
|
||||
local text, key, value ---@type string|string[], string, string|integer
|
||||
|
||||
if #pred == 3 then
|
||||
-- (#downcase! @capture "key")
|
||||
key = pred[3]
|
||||
value = metadata[pred[2]][key]
|
||||
else
|
||||
-- (#downcase! "key")
|
||||
key = pred[2]
|
||||
value = metadata[key]
|
||||
end
|
||||
|
||||
if type(value) == 'string' then
|
||||
text = value
|
||||
else
|
||||
local node = match[value]
|
||||
text = vim.treesitter.get_node_text(node, bufnr) or ''
|
||||
end
|
||||
|
||||
if #pred == 3 then
|
||||
metadata[pred[2]][key] = string.lower(text)
|
||||
else
|
||||
metadata[key] = string.lower(text)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Trim blank lines from end of the region
|
||||
-- Arguments are the captures to trim.
|
||||
---@param match (TSNode|nil)[]
|
||||
---@param _ string
|
||||
---@param bufnr integer
|
||||
---@param pred string[]
|
||||
---@param metadata table
|
||||
---TODO(clason): upstream
|
||||
query.add_directive('trim!', function(match, _, bufnr, pred, metadata)
|
||||
for _, id in ipairs({ select(2, unpack(pred)) }) do
|
||||
local node = match[id]
|
||||
if not node then
|
||||
return
|
||||
end
|
||||
|
||||
local start_row, start_col, end_row, end_col = node:range()
|
||||
|
||||
-- Don't trim if region ends in middle of a line
|
||||
if end_col ~= 0 then
|
||||
return
|
||||
end
|
||||
|
||||
while true do
|
||||
-- As we only care when end_col == 0, always inspect one line above end_row.
|
||||
local end_line = vim.api.nvim_buf_get_lines(bufnr, end_row - 1, end_row, true)[1]
|
||||
|
||||
if end_line ~= '' then
|
||||
break
|
||||
end
|
||||
|
||||
end_row = end_row - 1
|
||||
end
|
||||
|
||||
-- If this produces an invalid range, we just skip it.
|
||||
if start_row < end_row or (start_row == end_row and start_col <= end_col) then
|
||||
if not metadata[id] then
|
||||
metadata[id] = {}
|
||||
end
|
||||
metadata[id].range = { start_row, start_col, end_row, end_col }
|
||||
end
|
||||
end
|
||||
end)
|
||||
Loading…
Add table
Add a link
Reference in a new issue