mirror of
https://github.com/hexedtech/codemp-nvim.git
synced 2025-04-09 03:51:32 +02:00
fix: draw user cursors upon attaching to buffer
This commit is contained in:
parent
48f1556035
commit
3390546457
3 changed files with 50 additions and 28 deletions
lua/codemp
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue