Neomacs:用 Rust 重写 Emacs ——目标 GPU 渲染引擎、多线程 Elisp、10 倍 Lisp 性能

大家好,我正在开发 Neomacs,一个基于 Emacs 的 fork,目标是用 Rust 从底层重写 Emacs。

目前已实现(alpha 阶段, 很多地方还没打磨好)

  • 底层窗口 —— 基于 Rust 的 winit
  • GPU 文本渲染 —— 基于 Rust 的 wgpu(Vulkan/Metal/DX12/OpenGL)
  • Buffer 内嵌 4K 图片 —— GPU 解码,零 CPU 开销,不阻塞 Emacs 主线程
  • Buffer 内嵌 4K 视频 —— GStreamer + VA-API 硬件解码 + DMA-BUF 零拷贝
  • Buffer 内嵌 WebKit 浏览器 —— WPE WebKit ,GPU 后端,DMA-BUF 零拷贝 (Emacs 上游用的 webkit2gtk 因为抛弃了 offscreen 支持不能用了, 而 WPE Webkit 就是为 embbed 环境而生,还不依赖 gtk,很适合集成到 emacs, 可以做到像将图片嵌入到 buffer 中一样,将 WPEWebkit 嵌入 emacs buffer 中)
  • Buffer 内嵌 GPU 终端 —— 基于 Alacritty 的终端模拟器
  • 光标动画 —— 8 种粒子模式、7 种运动风格(好多bug)
  • 滚动动画 —— 21 种滚动效果、5 种缓动函数(好多bug)
  • Buffer 切换动画 —— 10 种过渡效果(交叉淡入淡出、滑动、翻页等)
  • 圆角 box face —— :box face 属性支持圆角
  • 用 ~4,000 行 Rust 替换了显示引擎中 ~50,000 行 C 代码

长期目标

  • 用 Rust 逐步重写 Emacs C 核心
  • 真正的多线程 Elisp(真并发,不是协作式线程)
  • Rust 优化的 Lisp 机器,目标 10 倍 Elisp 执行速度提升
  • 跨平台:Linux(Vulkan)、macOS(Metal)、Windows(DX12)

现有的 Emacs 配置和插件包依然可以正常使用。

截图和视频演示

请查看 README 中的截图和视频。

仓库地址: GitHub - eval-exec/neomacs: 🚀 Neomacs — A GPU-powered Emacs written in 🦀Rust with a modern display engine. Effortlessly render tons of 🖼️4K images, 🎥4K videos, and 🌐WPEWebKit using GPU acceleration, DMA-BUF, ZERO-COPY and rich animation effects support for a super-level blazing-fast Emacs experience. 🎉

目前还是 alpha 阶段,完成了基本的 MVP, 很粗糙,欢迎反馈、建议和贡献!


如果你喜欢的话,帮忙给 neomacs 仓库一个 Star :star: 支持一下 neomacs,谢谢!Make Emacs Great Again!

49 个赞

演示动画非常流畅、很不错。

1 个赞

你对 neomacs 有什么期望吗?我想要收集一下大家的需求。:blue_heart:

好强,不过想起来之前有个很火的 remacs 也是类似的想法,而且项目星数也不少,不过好像是遇到了很多坑就被放弃了。请问您有什么避免类似问题嘛,非常好奇这个项目。

1 个赞

可以支持命令在弹出的子窗口运行,很多时候并不想因为临时要做一些搜索或者执行命令就打开额外的buffer,影响了原来的布局。虽然知道有些包可以恢复布局,但是本身还是折衷方案。

1 个赞

我对 Rust 和 Emacs 是热爱,我不会放弃的!

而且 Remacs 本身没有引入突破性的功能,只是在语言层做重构,难以吸引足够长期维护的贡献者。(而 Neomacs 至少外观会是花里胡哨的,会有各种动画,GPU 支持的 image/video/webcontent, 外观是极具吸引力的, 。

8 个赞

我也觉得 Rust 很爽,前几周改了一个 Rust todo TUI 项目 basilk,加了三个功能。直接给 Claude Code 需求,改完之后 cargo check, cargo run,AI 自己写自己 check,几轮下来直接就完成了,我用了几个礼拜一点问题没有。Neomacs 项目目前代码量看起来没有很多,用户想要一些微调,完成可以用 AI 做修改。所以很看好。

编译没过。能先release个版本出来吗?好像卡在了

./temacs(+0x4a26f) [0x55555559e26f]
/usr/lib/libc.so.6(+0x27635) [0x7fffeaec1635]
/usr/lib/libc.so.6(__libc_start_main+0x89) [0x7fffeaec16e9]
./temacs(+0x4a7d5) [0x55555559e7d5]
make[2]: *** [Makefile:675: emacs.pdmp] Segmentation fault (core dumped)

1 个赞

太炫酷了,打开 readme 第一眼就被炫酷的中国龙吸引了。

1 个赞

能否做到突破行编辑器的限制,让 buffer 行高支持设置为比基础行高还要小的高度?比如任意像素宽度的行高。这样的话在水平和垂直方向都能够设置精确的定位。还有就是不同字体的行高不一致导致的抖动问题,不知道在底层能否有好的优化方案?

牛👍不过目前没有什么欲望试试。感觉最能吸引 Emacser 的还是对 Emacs 的性能提升。用 Emacs 编辑大点的项目 LSP 感觉挺卡(我用的 eglot, 补全是手动显示的)

最近在看 Zed 编辑器代码,想什么时候把 Zed 改成我现在 Emacs 的样子hh

强烈支持!

有一些疑问:

  1. Emacs的buffer是基于行排版和渲染的,neo版本对这个是怎么处理的?
  2. elisp的真多线程是怎么实现的?我感觉需要一个和UI无关的elisp环境,纯后台,这样才能做到真多线程,以及高性能。可以有两套隔离的elisp环境,一个和ui有关,一个和ui无关,两者之间通过内部ipc通信。可以参考浏览器js的web worker,感觉挺不错。
3 个赞

已有的elisp包可以直接运行在neomacs上吗

2 个赞

有保留tui终端模式么?还是只有gui?

4 个赞

长期目标来看,最重要的还是和 elisp 的 code 和 package 的兼容性。再保证兼容性的情况下提升性能,同时支持真正的多线程(多线程可以用新的 API )以及 UI 的流畅性。UI 的炫酷特效都是次要的。

2 个赞

区别在于现在有ai了 :grin: 一个人开发大型项目变得可行了

2 个赞

听起来很屌的样子,虽然我看不懂,但是我很佩服行动力十足的道友

2 个赞

泼点冷水,因为 GNU Emacs 的开发周期特点,在特性冷静期的时候各种新出现 fork 能跟得上主线进度,在繁荣期的时候一旦引入各种不兼容,各种 fork 就会开始被拉爆了,一般这样的周期对应两个大版本。历史上这样的事情发生了不止一次,XEmacs 生命周期从 19 开始到 21 就结束了,Aquaemacs 从 22 开始,现在第四个大版本更新到 29 也有些力不从心了。

目前MPS特性还在合入,还算在冷静期。乐观一点看,撑过下一波繁荣期就能比 remacs 强。

8 个赞

我个人感觉单打独斗的 fork emacs,大概率会失败,不是人的能力不行,是随着时间的延长,人的精力跟不上了。

7 个赞

感觉最好是可以像nvim那样,前后端分离,后端逻辑和展示全完解耦,通过协议来进行,本机可以通过unixsocket或者其他的,远程可以通过socket远端通讯,这样前后端解耦后,可以分别开发和实现

4 个赞