From a quick look at your project, it brings a number of welcome
simplifications, but there are also a few design decisions that seem
insufficiently thought out, which are (in my opinion) likely to haunt
you later.
> Migrate to a cmake-based build
Except CMake is a mess in its own right, that adds an otherwise
pointless dependency of the build process to C++. Probably not a huge
problem if you only care about gcc and Linux, but a gratuitous pain
nonetheless. What's wrong with just editing the existing Makefile? You
only have to do it once.
> Most of the platform-specific code will be removed and libuv will be
> used to handle system differences.
Except libuv is mainly intended for dealing with multiple _network_
connections. Sure, this might come in handy at some (much later) point,
but Vim is not I/O-bound. Saying that libuv will handle most of the
platform differences seems a little naive.
> Plugins are long-running programs/jobs (coprocesses) that communicate
> with vim through stdin/stdout using msgpack-rpc or json-rpc.
As somebody else put it, this is a terrible idea (but for different
reasons from the ones mentioned there). JSON-RPC over stdio, really?
Can you tell the difference between network concurrency and IPC
concurrency? I'd suggest taking a look at how, say, Postfix handles the
latter, then re-thinking all this approach.
> GUIs are separate programs, possibly written in different programming
> languages. Neovim will use its own stdin/stdout to receive input and
> send updates, again using json-rpc or msgpack-rpc.
Again, this seems backwards. The reason why Gvim can't do most of
the tricks Sublime Text does isn't too much integration with the GUI,
but not enough integration. You might want to spend some more time
pondering about this approach, too.
/lcd