fix: draw user cursors upon attaching to buffer

This commit is contained in:
əlemi 2025-01-18 15:35:24 +01:00
parent 48f1556035
commit 3390546457
Signed by: alemi
GPG key ID: A4895B84D311642C
3 changed files with 50 additions and 28 deletions

View file

@ -6,6 +6,8 @@ local id_buffer_map = {}
local buffer_id_map = {}
---@type table<string, string>
local user_buffer_name = {}
---@type table<string, Cursor>
local user_cursors = {}
local ticks = {}
---@param name string
@ -200,6 +202,13 @@ local function attach(name, opts)
vim.api.nvim_set_option_value('fileformat', 'unix', { buf = buffer })
print(" ++ attached to buffer " .. name)
require('codemp.window').update()
for user, cursor in pairs(user_cursors) do
if cursor.sel.buffer == name then
local user_hl = require('codemp.workspace').map[user]
require('codemp.workspace').map[user].mark = utils.cursor.draw(cursor, buffer, user_hl.ns, user_hl.mark, user_hl.hi)
end
end
end)
end)
end
@ -251,4 +260,5 @@ return {
map_rev = buffer_id_map,
ticks = ticks,
users = user_buffer_name,
cursors = user_cursors,
}

View file

@ -71,6 +71,42 @@ local function cursor_position()
end
end
---@param event Cursor
---@param buf integer
---@param ns integer
---@param mark integer
---@param hi HighlightPair
---@return integer extmark id
local function cursor_draw(event, buf, ns, mark, hi)
local event_finish_2 = event.sel.end_col -- TODO can't set the tuple field? need to copy out
if event.sel.start_row == event.sel.end_row and event.sel.start_col == event.sel.end_col then
-- vim can't draw 0-width cursors, so we always expand them to at least 1 width
event_finish_2 = event.sel.end_col + 1
end
return vim.api.nvim_buf_set_extmark(
buf,
ns,
event.sel.start_row,
event.sel.start_col,
{
id = mark,
end_row = event.sel.end_row,
end_col = event_finish_2,
hl_group = hi.bg,
virt_text_pos = "right_align",
sign_text = string.sub(event.user, 0, 1),
sign_hl_group = hi.bg,
virt_text_repeat_linebreak = true,
priority = 1000,
strict = false,
virt_text = {
{ " " .. event.user .. " ", hi.fg },
{ " ", hi.bg },
},
}
)
end
--
@ -194,6 +230,7 @@ end
return {
cursor = {
position = cursor_position,
draw = cursor_draw,
},
buffer = {
len = buffer_len,

View file

@ -112,35 +112,10 @@ local function register_cursor_handler(controller)
end
buffers.users[event.user] = event.sel.buffer
local buffer_id = buffers.map_rev[event.sel.buffer]
buffers.cursors[event.user] = event
if buffer_id ~= nil then
local hi = user_hl[event.user].hi
local event_finish_2 = event.sel.end_col -- TODO can't set the tuple field? need to copy out
if event.sel.start_row == event.sel.end_row and event.sel.start_col == event.sel.end_col then
-- vim can't draw 0-width cursors, so we always expand them to at least 1 width
event_finish_2 = event.sel.end_col + 1
end
user_hl[event.user].mark = vim.api.nvim_buf_set_extmark(
buffer_id,
user_hl[event.user].ns,
event.sel.start_row,
event.sel.start_col,
{
id = user_hl[event.user].mark,
end_row = event.sel.end_row,
end_col = event_finish_2,
hl_group = hi.bg,
virt_text_pos = "right_align",
sign_text = string.sub(event.user, 0, 1),
sign_hl_group = hi.bg,
virt_text_repeat_linebreak = true,
priority = 1000,
strict = false,
virt_text = {
{ " " .. event.user .. " ", hi.fg },
{ " ", hi.bg },
},
}
)
local hl = user_hl[event.user]
user_hl[event.user].mark = utils.cursor.draw(event, buffer_id, hl.ns, hl.mark, hl.hi)
end
if old_buffer ~= event.sel.buffer then
require('codemp.window').update() -- redraw user positions