nvim/pack/acp/opt/coc.nvim/lua/coc/highlight.lua

86 lines
2.3 KiB
Lua
Raw Normal View History

2023-03-10 16:38:45 +00:00
local api = vim.api
local M = {}
-- Get single line extmarks
function M.getHighlights(bufnr, key, s, e)
if not api.nvim_buf_is_loaded(bufnr) then
return nil
end
s = s or 0
e = e or -1
local max = e == -1 and api.nvim_buf_line_count(bufnr) or e + 1
local ns = api.nvim_create_namespace('coc-' .. key)
local markers = api.nvim_buf_get_extmarks(bufnr, ns, {s, 0}, {e, -1}, {details = true})
local res = {}
for _, mark in ipairs(markers) do
local id = mark[1]
local line = mark[2]
local startCol = mark[3]
local details = mark[4]
local endCol = details.end_col
if line < max then
local delta = details.end_row - line
if delta <= 1 and (delta == 0 or endCol == 0) then
if startCol == endCol then
api.nvim_buf_del_extmark(bufnr, ns, id)
else
if delta == 1 then
local text = api.nvim_buf_get_lines(bufnr, line, line + 1, false)[1] or ''
endCol = #text
end
table.insert(res, {details.hl_group, line, startCol, endCol, id})
end
end
end
end
return res
end
local function addHighlights(bufnr, ns, highlights, priority)
for _, items in ipairs(highlights) do
local hlGroup = items[1]
local line = items[2]
local startCol = items[3]
local endCol = items[4]
local hlMode = items[5] and 'combine' or 'replace'
-- Error: col value outside range
pcall(api.nvim_buf_set_extmark, bufnr, ns, line, startCol, {
end_col = endCol,
hl_group = hlGroup,
hl_mode = hlMode,
right_gravity = true,
priority = type(priority) == 'number' and math.min(priority, 4096) or 4096
})
end
end
local function addHighlightTimer(bufnr, ns, highlights, priority, maxCount)
local hls = {}
local next = {}
for i, v in ipairs(highlights) do
if i < maxCount then
table.insert(hls, v)
else
table.insert(next, v)
end
end
addHighlights(bufnr, ns, hls, priority)
if #next > 0 then
vim.defer_fn(function()
addHighlightTimer(bufnr, ns, next, priority, maxCount)
end, 30)
end
end
function M.set(bufnr, ns, highlights, priority)
local maxCount = vim.g.coc_highlight_maximum_count
if #highlights > maxCount then
addHighlightTimer(bufnr, ns, highlights, priority, maxCount)
else
addHighlights(bufnr, ns, highlights, priority)
end
end
return M