diff --git a/Cargo.toml b/Cargo.toml index 75e95d7..bb4c138 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ crate-type = ["cdylib"] path = "src/rust/lib.rs" [dependencies] -codemp = { git = "ssh://git@github.com/codewithotherpeopleandchangenamelater/codemp.git", rev = "7fc03e3fd936240fdbadd368bfce38832ce34767", features = ["global"] } +codemp = { git = "ssh://git@github.com/codewithotherpeopleandchangenamelater/codemp.git", tag="v0.5.1", features = ["global"] } #codemp = { git = "ssh://git@github.com/codewithotherpeopleandchangenamelater/codemp.git", features = ["global"] } tracing = "0.1" tracing-subscriber = "0.3.17" diff --git a/package.json b/package.json index 880918f..85a8bc8 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,10 @@ "command": "codempvscode.disconnectBuffer", "title": "disconnect from a codemp Buffer" }, + { + "command": "codempvscode.sync", + "title": "Sync the current buffer" + }, { "command": "codempvscode.helloWorld", "title": "Hello World (debug)" diff --git a/src/extension.ts b/src/extension.ts index 4a5708f..fadd676 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -8,6 +8,7 @@ import { JsTextChange } from '..'; const codemp = require("/home/***REMOVED***/projects/codemp/mine/codempvscode/codemp.node"); var CACHE : string = ""; +var BUFFERS : any = []; let smallNumberDecorationType = vscode.window.createTextEditorDecorationType({}); //import * as codemp from "/home/***REMOVED***/projects/codemp/mine/vscode/target/debug/libcodemp_vscode.node"; @@ -32,13 +33,16 @@ export function activate(context: vscode.ExtensionContext) { let attachCommand = vscode.commands.registerCommand('codempvscode.attach', attach); let createBufferCommand = vscode.commands.registerCommand('codempvscode.createBuffer', createBuffer); let disconnectBufferCommand = vscode.commands.registerCommand('codempvscode.disconnectBuffer', disconnectBuffer); + let syncBufferCommand = vscode.commands.registerCommand('codempvscode.sync', sync); context.subscriptions.push(connectCommand); context.subscriptions.push(joinCommand); context.subscriptions.push(attachCommand); context.subscriptions.push(createBufferCommand); - context.subscriptions.push(disconnectBufferCommand) + context.subscriptions.push(disconnectBufferCommand); + context.subscriptions.push(syncBufferCommand); context.subscriptions.push(disposable); + } @@ -61,7 +65,7 @@ async function join() { if (workspace.length == 0) workspace = "default" if (buffer === undefined) return // user cancelled with ESC - if (buffer.length == 0) {workspace = "test"; buffer="test"; } + if (buffer.length == 0) {workspace = "default"; buffer="fucl"; } let controller = await codemp.join(workspace) try{ @@ -147,18 +151,32 @@ async function createBuffer() { async function attach() { - let workspace="test"; - let buffer = await codemp.attach(workspace); + let buffer_name : any = (await vscode.window.showInputBox({prompt: "buffer to attach to"}))!; + let buffer = await codemp.attach(buffer_name); + console.log("attached to buffer", buffer_name); + console.log("buffer", buffer); let editor = vscode.window.activeTextEditor; + let fileUri = buffer_name; + const fileName = 'untitled-1'; + const newFileUri = vscode.Uri.file(fileName).with({ scheme: 'untitled', path: fileName }); + await vscode.workspace.openTextDocument(newFileUri); + vscode.commands.executeCommand('vscode.open', newFileUri); - if (editor === undefined) { return } // TODO say something!!!!!! - + if (editor === undefined) { + vscode.window.showInformationMessage(`Open a file first`); + return; + } + editor = vscode.window.activeTextEditor!; console.log("Buffer = ", buffer, "\n"); - vscode.window.showInformationMessage(`Connected to codemp workspace buffer @[${workspace}]`); + vscode.window.showInformationMessage(`Connected to codemp workspace buffer @[${buffer_name}]`); + + let file_uri = editor.document.uri; + BUFFERS.push([file_uri, buffer_name]); vscode.workspace.onDidChangeTextDocument((event:vscode.TextDocumentChangeEvent) => { console.log(event.reason); + if (event.document.uri != file_uri) return; // ? for (let change of event.contentChanges) { if (`${change.rangeOffset}${change.text}${change.rangeOffset+change.rangeLength}` === CACHE) continue; // LMAO buffer.send({ @@ -192,6 +210,30 @@ async function disconnectBuffer() { vscode.window.showInformationMessage(`Disconnected from codemp workspace buffer @[${buffer}]`); } +function sync() { + let editor = vscode.window.activeTextEditor; + if (editor === undefined) { return } + for (let tuple of BUFFERS) { + if (tuple[0] == editor?.document.uri) { + + let buffer = codemp.getBuffer(tuple[1]); + if (buffer==null) { + vscode.window.showErrorMessage("This buffer does not exist anymore"); + return; + } + let range = new vscode.Range( + editor.document.positionAt(0), + editor.document.positionAt(editor.document.getText().length) + ) + let content = buffer.content() + CACHE = `${range.start}${content}${range.end}`; + editor.edit(editBuilder => editBuilder.replace(range, content)) + return; + } + } + vscode.window.showErrorMessage("This buffer is not managed by codemp"); +} + diff --git a/src/rust/lib.rs b/src/rust/lib.rs index fa62dbc..e109a60 100644 --- a/src/rust/lib.rs +++ b/src/rust/lib.rs @@ -33,6 +33,13 @@ pub async fn connect(addr: String) -> napi::Result<()> { .map_err(|e| JsCodempError(e).into()) } +#[napi] +pub async fn get_buffer(path: String) -> Option { + let x = CODEMP_INSTANCE.get_buffer(&path) + .await + .ok()?; + Some(JsBufferController(x)) +} #[napi] pub async fn leave_workspace() -> Result<(), napi::Error> { @@ -237,6 +244,14 @@ impl JsBufferController { } + #[napi] + pub fn content(&self) -> napi::Result { + Ok(self.0.content()) + } + + + + #[napi] pub async fn recv(&self) -> napi::Result { Ok(