neovim codemp plugin -- code multiplexer
Find a file
2023-07-12 00:23:41 +02:00
client feat: updated nvim and vscode to new controller api 2023-07-09 03:44:39 +02:00
proto feat!: start+end in cursor, merged cursor structs 2023-07-05 00:09:09 +02:00
server feat!: start+end in cursor, merged cursor structs 2023-07-05 00:09:09 +02:00
src fix: better names for delta operation args 2023-07-12 00:23:41 +02:00
.editorconfig feat: initial rust bindings for vscode client 2023-07-02 23:58:25 +02:00
.gitignore build: improved buildscript and bundle, added cmds 2023-07-04 01:02:50 +02:00
.rustfmt.toml build: initial commit with tonic stubs 2022-07-10 19:01:56 +02:00
build.rs chore: dramatically simplified everything 2023-04-07 03:10:45 +02:00
Cargo.toml feat: initial rust bindings for vscode client 2023-07-02 23:58:25 +02:00
LICENSE chore: added AGPL license 2022-09-29 12:01:11 +02:00
README.md Added a very basic README 2022-09-14 12:13:48 +02:00

codemp

This project is heavily inspired by Microsoft Live Share plugin for Visual Studio (Code). While the functionality is incredibly good, I often find issues or glitches which slow me down, and being locked to only use Visual Studio products is limiting. I decided to write my own solution, and to make it open source, so that any editor can integrate it with a plugin.

Design

Client/Server

While initially a P2P system seemed interesting, I don't think it would easily scale with many users (due to having to integrate many changes on each client). I decided to build a client/server architecture, with a central "Workspace" managed by the server application and multiple clients connecting to it. Each client will only have to care about keeping itself in sync with the server (remembering local-only changes and acknowledged changes), leaving the task of keeping track of differences to the server.

Plugins

This software will probably be distribuited as a standalone binary that editors can use to connect to a "Workspace". A dynamic library object might also be a choice. Each editor plugin must be responsible of mapping codemp functionality to actual editor capabilities, bridging codemp client to the editor itself. The client should be able to handle a session autonomously.

Text Synchronization

A non destructive way to sync changes across clients is necessary. I initially explored CRDTs, but implementation seemed complex with little extra benefits from "more traditional" approaches (Operational Transforms). This has to be investigated more.

Roadmap

  • Initial design choices
  • Simple GRPC server with tonic
  • Simple neovim client with RPC/msgpack
  • Implementing core protocol routes
  • Simple neovim client capable of displaying other person cursor
  • Implement OTs / CRTDs for sharing file deltas
  • More clients (VSCode? JetBrains IDEs?)
  • LSP functionality bridged to guests from host?
  • Full remote development suite by keeping the project repo on a server?