2024-08-06 02:22:02 +02:00
|
|
|
local native = require('codemp.loader').load()
|
2024-08-06 01:11:09 +02:00
|
|
|
|
|
|
|
local utils = require('codemp.utils')
|
2024-08-06 18:46:22 +02:00
|
|
|
local buffers = require('codemp.buffers')
|
2024-08-06 01:11:09 +02:00
|
|
|
local async = require('codemp.async')
|
2024-08-08 04:34:23 +02:00
|
|
|
local state = require('codemp.state')
|
2024-08-06 01:11:09 +02:00
|
|
|
|
|
|
|
local user_hl = {}
|
2024-08-06 18:48:11 +02:00
|
|
|
local user_buffer = {}
|
2024-08-06 18:47:28 +02:00
|
|
|
local tree_buf = nil
|
2024-08-06 01:11:09 +02:00
|
|
|
local available_colors = { -- TODO these are definitely not portable!
|
|
|
|
"ErrorMsg",
|
|
|
|
"WarningMsg",
|
|
|
|
"MatchParen",
|
|
|
|
"SpecialMode",
|
|
|
|
"CmpItemKindFunction",
|
|
|
|
"CmpItemKindValue",
|
|
|
|
"CmpItemKindInterface",
|
|
|
|
}
|
|
|
|
|
2024-08-08 04:34:23 +02:00
|
|
|
local function register_cursor_callback(controller)
|
2024-08-06 01:11:09 +02:00
|
|
|
vim.api.nvim_create_autocmd({"CursorMoved", "CursorMovedI", "ModeChanged"}, {
|
2024-08-08 04:34:23 +02:00
|
|
|
group = vim.api.nvim_create_augroup("codemp-workspace-" .. state.workspace, { clear = true }),
|
2024-08-06 01:11:09 +02:00
|
|
|
callback = function (_)
|
|
|
|
local cur = utils.cursor.position()
|
2024-08-08 04:34:23 +02:00
|
|
|
local buf = vim.api.nvim_get_current_buf()
|
2024-08-06 01:11:09 +02:00
|
|
|
if buffers.map[buf] ~= nil then
|
|
|
|
controller:send(buffers.map[buf], cur[1][1], cur[1][2], cur[2][1], cur[2][2])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2024-08-08 04:34:23 +02:00
|
|
|
local function register_cursor_handler(controller)
|
|
|
|
async.handler(nil, controller, function(event)
|
2024-08-06 01:11:09 +02:00
|
|
|
if user_hl[event.user] == nil then
|
|
|
|
user_hl[event.user] = {
|
|
|
|
ns = vim.api.nvim_create_namespace("codemp-cursor-" .. event.user),
|
|
|
|
hi = available_colors[ math.random( #available_colors ) ],
|
|
|
|
}
|
|
|
|
end
|
2024-08-06 18:48:11 +02:00
|
|
|
user_buffer[event.user] = event.buffer
|
2024-08-14 17:37:19 +02:00
|
|
|
local buffer = buffers.map_rev[event.buffer]
|
2024-08-06 01:11:09 +02:00
|
|
|
if buffer ~= nil then
|
|
|
|
vim.api.nvim_buf_clear_namespace(buffer, user_hl[event.user].ns, 0, -1)
|
|
|
|
utils.multiline_highlight(
|
|
|
|
buffer,
|
|
|
|
user_hl[event.user].ns,
|
|
|
|
user_hl[event.user].hi,
|
2024-08-14 17:37:19 +02:00
|
|
|
event.start,
|
|
|
|
event.finish
|
2024-08-06 01:11:09 +02:00
|
|
|
)
|
|
|
|
end
|
|
|
|
end, 20)
|
|
|
|
end
|
|
|
|
|
|
|
|
local function join(workspace)
|
2024-08-08 04:34:23 +02:00
|
|
|
local controller = state.client:join_workspace(workspace)
|
|
|
|
register_cursor_callback(controller)
|
|
|
|
register_cursor_handler(controller)
|
2024-08-06 01:11:09 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local function leave()
|
|
|
|
native.leave_workspace()
|
|
|
|
print(" -- left workspace")
|
|
|
|
end
|
|
|
|
|
2024-08-08 04:34:23 +02:00
|
|
|
local function open_buffer_tree()
|
|
|
|
local tree = state.client:get_workspace(state.workspace).filetree
|
2024-08-06 18:47:28 +02:00
|
|
|
if tree_buf == nil then
|
|
|
|
tree_buf = vim.api.nvim_create_buf(false, true)
|
2024-08-08 04:34:23 +02:00
|
|
|
vim.api.nvim_buf_set_name(tree_buf, "codemp::" .. state.workspace)
|
2024-08-06 18:47:28 +02:00
|
|
|
vim.api.nvim_set_option_value('buftype', 'nofile', { buf = tree_buf })
|
2024-08-06 01:11:09 +02:00
|
|
|
end
|
2024-08-06 18:47:28 +02:00
|
|
|
vim.api.nvim_set_option_value('modifiable', true, { buf = tree_buf })
|
2024-08-08 04:34:23 +02:00
|
|
|
utils.buffer.set_content(tree_buf, "codemp::" .. state.workspace .. "\n\n- " .. vim.fn.join(tree, "\n- "))
|
2024-08-06 18:47:28 +02:00
|
|
|
vim.api.nvim_set_option_value('modifiable', false, { buf = tree_buf })
|
|
|
|
vim.api.nvim_open_win(tree_buf, true, {
|
|
|
|
win = 0,
|
|
|
|
split = 'left',
|
|
|
|
width = 20,
|
|
|
|
})
|
|
|
|
vim.api.nvim_set_option_value('relativenumber', false, {})
|
|
|
|
vim.api.nvim_set_option_value('number', false, {})
|
|
|
|
vim.api.nvim_set_option_value('cursorlineopt', 'line', {})
|
2024-08-06 01:11:09 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
return {
|
|
|
|
join = join,
|
|
|
|
leave = leave,
|
|
|
|
map = user_hl,
|
|
|
|
colors = available_colors,
|
2024-08-06 18:48:11 +02:00
|
|
|
positions = user_buffer,
|
2024-08-06 18:47:28 +02:00
|
|
|
open_buffer_tree = open_buffer_tree,
|
|
|
|
buffer_tree = tree_buf,
|
2024-08-06 01:11:09 +02:00
|
|
|
}
|