fix(ui): include extmark signs in signcolumn. Fixes #1596
This commit is contained in:
@ -1,15 +1,44 @@
|
|||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
---@alias Sign {name:string, text:string, texthl:string}
|
---@alias Sign {name:string, text:string, texthl:string, priority:number}
|
||||||
|
|
||||||
|
-- Returns a list of regular and extmark signs sorted by priority (low to high)
|
||||||
---@return Sign[]
|
---@return Sign[]
|
||||||
---@param buf number
|
---@param buf number
|
||||||
---@param lnum number
|
---@param lnum number
|
||||||
function M.get_signs(buf, lnum)
|
function M.get_signs(buf, lnum)
|
||||||
---@diagnostic disable-next-line: no-unknown
|
-- Get regular signs
|
||||||
return vim.tbl_map(function(sign)
|
---@type Sign[]
|
||||||
return vim.fn.sign_getdefined(sign.name)[1]
|
local signs = vim.tbl_map(function(sign)
|
||||||
|
---@type Sign
|
||||||
|
local ret = vim.fn.sign_getdefined(sign.name)[1]
|
||||||
|
ret.priority = sign.priority
|
||||||
|
return ret
|
||||||
end, vim.fn.sign_getplaced(buf, { group = "*", lnum = lnum })[1].signs)
|
end, vim.fn.sign_getplaced(buf, { group = "*", lnum = lnum })[1].signs)
|
||||||
|
|
||||||
|
-- Get extmark signs
|
||||||
|
local extmarks = vim.api.nvim_buf_get_extmarks(
|
||||||
|
buf,
|
||||||
|
-1,
|
||||||
|
{ lnum - 1, 0 },
|
||||||
|
{ lnum - 1, -1 },
|
||||||
|
{ details = true, type = "sign" }
|
||||||
|
)
|
||||||
|
for _, extmark in pairs(extmarks) do
|
||||||
|
signs[#signs + 1] = {
|
||||||
|
name = extmark[4].sign_hl_group,
|
||||||
|
text = extmark[4].sign_text,
|
||||||
|
texthl = extmark[4].sign_hl_group,
|
||||||
|
priority = extmark[4].priority,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Sort by priority
|
||||||
|
table.sort(signs, function(a, b)
|
||||||
|
return (a.priority or 0) < (b.priority or 0)
|
||||||
|
end)
|
||||||
|
|
||||||
|
return signs
|
||||||
end
|
end
|
||||||
|
|
||||||
---@return Sign?
|
---@return Sign?
|
||||||
@ -66,7 +95,7 @@ function M.statuscolumn()
|
|||||||
for _, s in ipairs(M.get_signs(buf, vim.v.lnum)) do
|
for _, s in ipairs(M.get_signs(buf, vim.v.lnum)) do
|
||||||
if s.name:find("GitSign") then
|
if s.name:find("GitSign") then
|
||||||
right = s
|
right = s
|
||||||
elseif not left then
|
else
|
||||||
left = s
|
left = s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user