diff --git a/src/codemp.lua b/src/codemp.lua index 33dbae3..7633925 100644 --- a/src/codemp.lua +++ b/src/codemp.lua @@ -132,7 +132,6 @@ vim.api.nvim_create_user_command( "Join", function (args) local controller = codemp.join(args.args) - local buffer = vim.api.nvim_get_current_buf() -- hook serverbound callbacks vim.api.nvim_create_autocmd({"CursorMoved", "CursorMovedI", "ModeChanged"}, { @@ -154,14 +153,17 @@ vim.api.nvim_create_user_command( hi = available_colors[ math.random( #available_colors ) ], } end - vim.api.nvim_buf_clear_namespace(buffer, user_mappings[event.user].ns, 0, -1) - multiline_highlight( - buffer, - user_mappings[event.user].ns, - user_mappings[event.user].hi, - event.start, - event.finish - ) + local buffer = buffer_mappings[event.position.buffer] + if buffer ~= nil then + vim.api.nvim_buf_clear_namespace(buffer, user_mappings[event.user].ns, 0, -1) + multiline_highlight( + buffer, + user_mappings[event.user].ns, + user_mappings[event.user].hi, + event.position.start, + event.position.finish + ) + end end) print(" ++ joined workspace " .. args.args) diff --git a/src/lib.rs b/src/lib.rs index 8919e3c..4b76345 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,22 +13,7 @@ impl From:: for LuaError { } } -fn cursor_to_table(lua: &Lua, cur: CodempCursorEvent) -> LuaResult { - let pos = cur.position.unwrap_or_default(); - let start = lua.create_table()?; - start.set(1, pos.start().row)?; - start.set(2, pos.start().col)?; - let end = lua.create_table()?; - end.set(1, pos.end().row)?; - end.set(2, pos.end().col)?; - let out = lua.create_table()?; - out.set("user", cur.user)?; - out.set("buffer", pos.buffer)?; - out.set("start", start)?; - out.set("finish", end)?; - Ok(out) -} - +// TODO put friendlier constructor directly in lib? fn make_cursor(buffer: String, start_row: i32, start_col: i32, end_row: i32, end_col: i32) -> CodempCursorPosition { CodempCursorPosition { buffer, @@ -67,6 +52,8 @@ fn get_buffer(_: &Lua, (path,): (String,)) -> LuaResult { ) } + + /// join a remote workspace and start processing cursor events fn join(_: &Lua, (session,): (String,)) -> LuaResult { let controller = CODEMP_INSTANCE.join(&session) @@ -82,9 +69,9 @@ impl LuaUserData for LuaCursorController { methods.add_method("send", |_, this, (usr, sr, sc, er, ec):(String, i32, i32, i32, i32)| { Ok(this.0.send(make_cursor(usr, sr, sc, er, ec)).map_err(LuaCodempError::from)?) }); - methods.add_method("try_recv", |lua, this, ()| { + methods.add_method("try_recv", |_, this, ()| { match this.0.try_recv() .map_err(LuaCodempError::from)? { - Some(x) => Ok(Some(cursor_to_table(lua, x)?)), + Some(x) => Ok(Some(LuaCursorEvent(x))), None => Ok(None), } }); @@ -96,6 +83,27 @@ impl LuaUserData for LuaCursorController { } } +#[derive(Debug, derive_more::From)] +struct LuaCursorEvent(CodempCursorEvent); +impl LuaUserData for LuaCursorEvent { + fn add_fields<'lua, F: LuaUserDataFields<'lua, Self>>(fields: &mut F) { + fields.add_field_method_get("user", |_, this| Ok(this.0.user.clone())); + fields.add_field_method_get("position", |_, this| + Ok(this.0.position.as_ref().map(|x| LuaCursorPosition(x.clone()))) + ); + } +} + +#[derive(Debug, derive_more::From)] +struct LuaCursorPosition(CodempCursorPosition); +impl LuaUserData for LuaCursorPosition { + fn add_fields<'lua, F: LuaUserDataFields<'lua, Self>>(fields: &mut F) { + fields.add_field_method_get("buffer", |_, this| Ok(this.0.buffer.clone())); + fields.add_field_method_get("start", |_, this| Ok(LuaRowCol(this.0.start()))); + fields.add_field_method_get("finish", |_, this| Ok(LuaRowCol(this.0.end()))); + } +} + /// create a new buffer in current workspace