diff options
author | Riley Bruins <ribru17@hotmail.com> | 2024-12-11 04:34:24 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-11 04:34:24 -0800 |
commit | 3dfb9e6f60d9ca27ff140a9300cc1a43e38aa2ee (patch) | |
tree | b789154529f853cd9cd0b5cb8c5d7f11b1bf286f /runtime/lua/vim | |
parent | 492ae57aa6f8973e939e9b0ade24c44b29fffcbe (diff) | |
download | rneovim-3dfb9e6f60d9ca27ff140a9300cc1a43e38aa2ee.tar.gz rneovim-3dfb9e6f60d9ca27ff140a9300cc1a43e38aa2ee.tar.bz2 rneovim-3dfb9e6f60d9ca27ff140a9300cc1a43e38aa2ee.zip |
feat(treesitter): include capture id in return value of `get_captures_at_pos()` #30559
**Problem:** Currently, it is difficult to get node(s)-level metadata
for a capture returned by `get_captures_at_pos()`. This is because it is
stored in `metadata[id]` and we do not have access to the value of `id`,
so to get this value we have to iterate over the keys of `metadata`. See
[this commit](https://github.com/neovim/neovim/commit/d63622930001b39b12f14112fc3abb55b760c447#diff-8bd4742121c2f359d0345f3c6c253a58220f1a28670cc4e1c957992232059a6cR16).
Things would be much simpler if we were given the `id` of the capture so
we could use it to just index `metadata` directly.
**Solution:** Include `id` in the data returned by
`get_captures_at_pos()`
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r-- | runtime/lua/vim/treesitter.lua | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 5f4e796413..89dc4e289a 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -245,14 +245,15 @@ end --- Returns a list of highlight captures at the given position --- ---- Each capture is represented by a table containing the capture name as a string as ---- well as a table of metadata (`priority`, `conceal`, ...; empty if none are defined). +--- Each capture is represented by a table containing the capture name as a string, the capture's +--- language, a table of metadata (`priority`, `conceal`, ...; empty if none are defined), and the +--- id of the capture. --- ---@param bufnr integer Buffer number (0 for current buffer) ---@param row integer Position row ---@param col integer Position column --- ----@return {capture: string, lang: string, metadata: vim.treesitter.query.TSMetadata}[] +---@return {capture: string, lang: string, metadata: vim.treesitter.query.TSMetadata, id: integer}[] function M.get_captures_at_pos(bufnr, row, col) bufnr = vim._resolve_bufnr(bufnr) local buf_highlighter = M.highlighter.active[bufnr] @@ -285,12 +286,15 @@ function M.get_captures_at_pos(bufnr, row, col) local iter = q:query():iter_captures(root, buf_highlighter.bufnr, row, row + 1) - for capture, node, metadata in iter do + for id, node, metadata in iter do if M.is_in_node_range(node, row, col) then ---@diagnostic disable-next-line: invisible - local c = q._query.captures[capture] -- name of the capture in the query - if c ~= nil then - table.insert(matches, { capture = c, metadata = metadata, lang = tree:lang() }) + local capture = q._query.captures[id] -- name of the capture in the query + if capture ~= nil then + table.insert( + matches, + { capture = capture, metadata = metadata, lang = tree:lang(), id = id } + ) end end end |