diff --git a/Cargo.toml b/Cargo.toml index 694519b..0929874 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" crate-type = ["cdylib"] [dependencies] -codemp = { git = "ssh://git@github.com/codewithotherpeopleandchangenamelater/codemp.git", tag = "v0.4.5", features = ["global", "sync"] } +codemp = { git = "ssh://git@github.com/codewithotherpeopleandchangenamelater/codemp.git", branch = "woot", features = ["global", "sync"] } mlua = { version = "0.9.0", features = ["module", "luajit"] } thiserror = "1.0.47" derive_more = "0.99.17" diff --git a/src/codemp.lua b/src/codemp.lua index 3808865..989a30a 100644 --- a/src/codemp.lua +++ b/src/codemp.lua @@ -25,17 +25,6 @@ local function register_controller_handler(target, controller, handler) end, async, target) end --- local function byte2rowcol(buf, x) --- local row --- local row_start --- vim.api.nvim_buf_call(buf, function () --- row = vim.fn.byte2line(x) --- row_start = vim.fn.line2byte(row) --- end) --- local col = x - row_start --- return { row, col } --- end - local function split_without_trim(str, sep) local res = vim.fn.split(str, sep) if str:sub(1,1) == "\n" then @@ -114,11 +103,14 @@ end local buffer_mappings = {} local buffer_mappings_reverse = {} -- TODO maybe not??? local user_mappings = {} -local available_colors = { +local available_colors = { -- TODO these are definitely not portable! "ErrorMsg", "WarningMsg", "MatchParen", "SpecialMode", + "CmpItemKindFunction", + "CmpItemKindValue", + "CmpItemKindInterface", } vim.api.nvim_create_user_command( @@ -193,6 +185,8 @@ vim.api.nvim_create_user_command( function (args) local controller = codemp.attach(args.args) + -- TODO map name to uuid + local buffer = vim.api.nvim_get_current_buf() buffer_mappings[buffer] = args.args buffer_mappings_reverse[args.args] = buffer @@ -202,7 +196,8 @@ vim.api.nvim_create_user_command( -- hook serverbound callbacks vim.api.nvim_buf_attach(buffer, false, { on_lines = function (_, buf, tick, firstline, lastline, new_lastline, old_byte_size) - if tick == codemp_changed_tick then return end + local content = buffer_get_content(buf) + controller:send(0, #content - 1, content) -- print(string.format(">[%s] %s:%s|%s (%s)", tick, firstline, lastline, new_lastline, old_byte_size)) -- local start_index = firstline == 0 and 0 or vim.fn.line2byte(firstline + 1) - 1 -- local text = table.concat( @@ -214,8 +209,6 @@ vim.api.nvim_create_user_command( -- -- end -- print(string.format(">delta [%d,%s,%d]", start_index, text, start_index + old_byte_size - 1)) -- controller:delta(start_index, text, start_index + old_byte_size - 1) - local content = buffer_get_content(buf) - controller:replace(content) end }) @@ -232,7 +225,7 @@ vim.api.nvim_create_user_command( -- buffer, start.row, start.col, finish.row, finish.col, -- split_without_trim(event.content, "\n") -- ) - buffer_set_content(buffer, controller.content) + buffer_set_content(buffer, event) end) print(" ++ joined workspace " .. args.args) diff --git a/src/lib.rs b/src/lib.rs index 32fc27b..9aae7e7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ use std::io::Write; use std::sync::{Arc, Mutex, mpsc}; use codemp::prelude::*; +use codemp::woot::crdt::Op; use mlua::prelude::*; @@ -27,7 +28,9 @@ fn make_cursor(buffer: String, start_row: i32, start_col: i32, end_row: i32, end } } - +#[derive(Debug, derive_more::From)] +struct LuaOp(Op); +impl LuaUserData for LuaOp { } /// connect to remote server fn connect(_: &Lua, (host,): (Option,)) -> LuaResult<()> { @@ -66,7 +69,7 @@ fn join(_: &Lua, (session,): (String,)) -> LuaResult { struct LuaCursorController(Arc); impl LuaUserData for LuaCursorController { fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_meta_method(LuaMetaMethod::ToString, |_, this, ()| Ok(format!("{:?}", this))); + methods.add_meta_method(LuaMetaMethod::ToString, |_, this, ()| Ok(format!("{:?}", this.0))); 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)?) }); @@ -127,25 +130,22 @@ fn attach(_: &Lua, (path,): (String,)) -> LuaResult { struct LuaBufferController(Arc); impl LuaUserData for LuaBufferController { fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_meta_method(LuaMetaMethod::ToString, |_, this, ()| Ok(format!("{:?}", this))); - methods.add_method("delta", |_, this, (start, txt, end):(usize, String, usize)| { - match this.0.delta(start, &txt, end) { - Some(op) => Ok(this.0.send(op).map_err(LuaCodempError::from)?), - None => Err(LuaError::RuntimeError("wtf".into())), - } - }); - methods.add_method("replace", |_, this, txt:String| { - match this.0.replace(&txt) { - Some(op) => Ok(this.0.send(op).map_err(LuaCodempError::from)?), - None => Ok(()), - } - }); - methods.add_method("insert", |_, this, (txt, pos):(String, u64)| { - Ok(this.0.send(this.0.insert(&txt, pos)).map_err(LuaCodempError::from)?) + methods.add_meta_method(LuaMetaMethod::ToString, |_, this, ()| Ok(format!("{:?}", this.0))); + methods.add_method("send", |_, this, (start, end, text): (usize, usize, String)| { + Ok( + this.0.send( + CodempTextChange { + span: start..end, + content: text, + after: "".into(), + } + ) + .map_err(LuaCodempError::from)? + ) }); methods.add_method("try_recv", |_, this, ()| { match this.0.try_recv() .map_err(LuaCodempError::from)? { - Some(x) => Ok(Some(LuaTextChange(x))), + Some(x) => Ok(Some(x)), None => Ok(None), } }); @@ -157,7 +157,7 @@ impl LuaUserData for LuaBufferController { } fn add_fields<'lua, F: LuaUserDataFields<'lua, Self>>(fields: &mut F) { - fields.add_field_method_get("content", |_, this| Ok(this.0.content())); + fields.add_field_method_get("content", |_, this| Ok(this.0.try_recv().unwrap().unwrap())); } } @@ -166,14 +166,19 @@ struct LuaTextChange(CodempTextChange); impl LuaUserData for LuaTextChange { fn add_fields<'lua, F: LuaUserDataFields<'lua, Self>>(fields: &mut F) { fields.add_field_method_get("content", |_, this| Ok(this.0.content.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()))); - // fields.add_field_method_get("before", |_, this| Ok((*this.0.before).clone())); - // fields.add_field_method_get("after", |_, this| Ok((*this.0.after).clone())); + fields.add_field_method_get("start", |_, this| Ok(this.0.span.start)); + fields.add_field_method_get("finish", |_, this| Ok(this.0.span.end)); } fn add_methods<'lua, M: LuaUserDataMethods<'lua, Self>>(methods: &mut M) { - methods.add_meta_method(LuaMetaMethod::ToString, |_, this, ()| Ok(format!("{:?}", this))); + methods.add_meta_function(LuaMetaMethod::Call, |_, (start, end, txt): (usize, usize, String)| { + Ok(LuaTextChange(CodempTextChange { + span: start..end, + content: txt, + after: "".into(), + })) + }); + methods.add_meta_method(LuaMetaMethod::ToString, |_, this, ()| Ok(format!("{:?}", this.0))); } }