Helix 编辑器插件系统 Scheme 方案锁定

每日随笔2023-09-18

Helix Editor Screenshot

Rust 实现的 TUI 编辑器 - Helix。插件系统讨论贴#3806 是 22 年 9 月 12 日开启的经过差不多一年收集了近 320 个回复和讨论。终于在 23 年 8 月 10 日初步锁定实现方案。

各种实现方案都有提出

  • wasm
  • scheme
  • deno
  • 纯 Rust 插件(云构建)
  • 解释型 rust(如 iRust)
  • lua
  • lisp 家族
  • rahi
  • js
  • python

等等,最终主开发者 archseer 冻结了此讨论贴, 基本上确认是采用了类 Scheme 的实现方案。 原回复贴内容链接

具体理由大体如下:

archseer 后面还会再出一个详细的文章,详述已经考虑过的替代方案(包括 WASM)和所选择的设计约束, 但目前倾向于类 scheme 的实现方式(并且 @mattwparas 在#3806 回复 中已经实现了一个基本的原型,甚至涵盖了类似 vim-dirvish 的文件树,这是目前插件系统实现比较完善的项目)。

Scheme 的优势

  • 从维护的角度来看,Scheme 是一种非常小的语言(您可以一次阅读完整的规范),可以很方便把编译器和 VM 嵌入编辑器内核。
  • 从长期维护 Helix 考虑,使用一个我们完全理解的实现会有非常多的好处(也不必担心语言会消亡)。
  • Scheme 语法或许不是每个人都会喜欢,但她非常容易解析,没有歧义,可以很容易地从更高级别的语言编译目标。
  • 宏系统非常灵活且富有表现力。Elisp 是 emacs 如此流行和可扩展的主要原因之一。

Helix 是一个实用的编辑器: 她应该像你期望的那样开箱即用,不期望用户编写大量的 Scheme, 除非他们是插件作者。事实上,编辑器核心已经有了足够的可扩展性,还没有真正需要一个插件系统。 但仍然希望有一个足够灵活的插件系统,以扩展编辑器以适应不太常见的用例。

为什么不使用 WASM

WebAssembly 很流行,但它并不是万能的解决方案。我们需要向该语言公开一个非常大的 ABI, 而且由于没有跨语言兼容的内存布局,我们最终还是会被锁定在运行在 WASM 之上的单一语言中 (或者承担支持其他语言的多个 sim 的维护负担)。我们只会得到 WASM 的 VM 的好处, 也不得不导入一个比编辑器本身还要大很多数量级的项目。暂时还不清楚这种权衡是否值得。

即使我们能够通过 WASM 支持多种语言,对我来说,专注于一种语言似乎更好,这样生态系统就不会分裂成更小的部分, 如果每个插件都可能使用不同的语言,会使插件贡献变得更加困难。

为什么不选择编译形式的插件

脚本语言也应该用于配置。虽然有软件可以做到这一点(例如 dwm), 但它给用户设置了一个障碍: Helix 需要 Rust 知识,切换配置也可能会导致几分钟的编译时间。