aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim
diff options
context:
space:
mode:
authorfigsoda <figsoda@pm.me>2022-07-21 12:08:37 +0100
committerfigsoda <figsoda@pm.me>2023-02-04 21:04:45 -0500
commitbb8845340b1b9c2180fb19f049ff9deff5857d99 (patch)
tree27d0c9887021bdfcc4960ad7871ba8e16ee2096f /runtime/lua/vim
parent5c4b503d3cb4a48d083bcf50d4932927e6eb749d (diff)
downloadrneovim-bb8845340b1b9c2180fb19f049ff9deff5857d99.tar.gz
rneovim-bb8845340b1b9c2180fb19f049ff9deff5857d99.tar.bz2
rneovim-bb8845340b1b9c2180fb19f049ff9deff5857d99.zip
feat(treesitter): allow capture text to be transformed
Co-authored-by: Lewis Russell <lewis6991@gmail.com>
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r--runtime/lua/vim/treesitter/languagetree.lua10
-rw-r--r--runtime/lua/vim/treesitter/query.lua15
2 files changed, 24 insertions, 1 deletions
diff --git a/runtime/lua/vim/treesitter/languagetree.lua b/runtime/lua/vim/treesitter/languagetree.lua
index 89aac3ae26..3e1bc5d1cb 100644
--- a/runtime/lua/vim/treesitter/languagetree.lua
+++ b/runtime/lua/vim/treesitter/languagetree.lua
@@ -354,6 +354,14 @@ local function get_range_from_metadata(node, id, metadata)
return { node:range() }
end
+---@private
+local function get_node_text(node, id, metadata, source)
+ if metadata[id] and metadata[id].text then
+ return metadata[id].text
+ end
+ return query.get_node_text(node, source)
+end
+
--- Gets language injection points by language.
---
--- This is where most of the injection processing occurs.
@@ -408,7 +416,7 @@ function LanguageTree:_get_injections()
-- Lang should override any other language tag
if name == 'language' and not lang then
- lang = query.get_node_text(node, self._source) --[[@as string]]
+ lang = get_node_text(node, id, metadata, self._source) --[[@as string]]
elseif name == 'combined' then
combined = true
elseif name == 'content' and #ranges == 0 then
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua
index 84ed2667b9..5ec8c67462 100644
--- a/runtime/lua/vim/treesitter/query.lua
+++ b/runtime/lua/vim/treesitter/query.lua
@@ -452,6 +452,21 @@ local directive_handlers = {
metadata[capture_id].range = range
end
end,
+
+ -- Transform the content of the node
+ -- Example: (#gsub! @_node ".*%.(.*)" "%1")
+ ['gsub!'] = function(match, _, bufnr, pred, metadata)
+ assert(#pred == 4)
+
+ local id = pred[2]
+ local node = match[id]
+ local text = M.get_node_text(node, bufnr, { metadata = metadata[id] }) or ''
+
+ if not metadata[id] then
+ metadata[id] = {}
+ end
+ metadata[id].text = text:gsub(pred[3], pred[4])
+ end,
}
--- Adds a new predicate to be used in queries