85 lines
2.3 KiB
Lua
85 lines
2.3 KiB
Lua
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
|