Files
nvim-cmp/lua/cmp/config/context.lua
AF 0ad2450ff6 fix(context): in_treesitter_capture (#1211)
* fix(context): `in_treesitter_capture`

`in_treesitter_capture` used to compare a node:type() with what should
be a capture, returning always a falsy value.
The example https://github.com/hrsh7th/nvim-cmp/wiki/Advanced-techniques#disabling-completion-in-certain-contexts-such-as-comments
did not work as expected, being in_treesitter_capture("comment") always
not true.
Now it works as expected.

* feat(context): `in...capture`, `in...group` table

`in_treesitter_capture` and `in_syntax_group` can take a list of string
as argument.

* refactor(context): in...capture use vim.treesitter

Use vim.treesitter.get_captures_at_cursor()

* fix(context): get_captures_at_cursor -> ..._at_pos

get_captures_at_cursor() sometimes fails. Do it explicitly with
get_captures_at_pos(buf, row, col)

* refactor(context): vim.fn -> vim.api

Get row and col using vim.api and not vim.fn in in_syntax_group, as done
in in_treesitter_capture
2022-10-10 17:06:41 +09:00

56 lines
1.5 KiB
Lua

local context = {}
---Check if cursor is in syntax group
---@param group string | []string
---@return boolean
context.in_syntax_group = function(group)
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
if not vim.api.nvim_get_mode().mode == 'i' then
col = col + 1
end
for _, syn_id in ipairs(vim.fn.synstack(row, col)) do
syn_id = vim.fn.synIDtrans(syn_id) -- Resolve :highlight links
local g = vim.fn.synIDattr(syn_id, 'name')
if type(group) == 'string' and g == group then
return true
elseif type(group) == 'table' and vim.tbl_contains(group, g) then
return true
end
end
return false
end
---Check if cursor is in treesitter capture
---@param capture string | []string
---@return boolean
context.in_treesitter_capture = function(capture)
local buf = vim.api.nvim_get_current_buf()
local row, col = unpack(vim.api.nvim_win_get_cursor(0))
row = row - 1
if vim.api.nvim_get_mode().mode == 'i' then
col = col - 1
end
local captures_at_cursor = vim.tbl_map(function(x)
return x.capture
end, require('vim.treesitter').get_captures_at_pos(buf, row, col))
if vim.tbl_isempty(captures_at_cursor) then
return false
elseif type(capture) == 'string' and vim.tbl_contains(captures_at_cursor, capture) then
return true
elseif type(capture) == 'table' then
for _, v in ipairs(capture) do
if vim.tbl_contains(captures_at_cursor, v) then
return true
end
end
end
return false
end
return context