Release 24.03 Highlights

Helix 24.03 版本发布啦!首先,非常感谢所有为此次发布做出贡献的人。本次版本更新包含 了来自 125 位贡献者的改进。

初次接触 Helix? Helix 是一款模式文本编辑器,内置支持多重选择、语言服务器协议 (LSP)、tree-sitter, 并提供对调试适配器协议 (DAP) 的实验性支持。

让我们来看看本次版本更新的亮点。

类似 Amp 的跳转功能

跳转功能在 (Neo)Vim 插件领域非常流行,甚至还有一些插件可以将相同的功能添加到其他 工具(例如浏览器)中。它们允许您高效地在视图的各个部分之间移动光标,就像使用鼠标点 击一样,但不同之处在于您需要输入“标签”来完成跳转。24.03 版本引入了受 [Amp 编辑 器] 的 [跳转模式] 启发而设计的跳转命令。按下 gw 即可添加跳转标签,然后输入其中 一个标签即可跳转到该标签下的单词。在选择模式 (v) 下使用 gw 可以扩展选择范围。

块注释

过去,Helix 只能切换行注释,例如 //#,而像 OCaml 这样的语言只能使用一些 变通方法,例如使用 (* 作为“行”注释标记。在 24.03 版本中,Helix 现在也可以切换 块注释了。使用 C-c<space>c 可以根据语言的注释标记配置智能地添加或删除当 前选定内容周围的行注释或块注释,使用 <space>c 可以切换当前选定内容周围的块注释, 使用 <space><A-c> 则可以仅切换当前行的行注释。

Tree-sitter 注入功能改进

Helix 使用 tree-sitter 增量解析进行语法高亮、文本对象、缩进以及一些移动和命 令操作。24.03 版本改进了我们处理 [注入] 的方式——这是一项强大的 tree-sitter 功 能,用于解析包含多种语言的文档。例如,您可能在 HTML 文档的 <script><style> 标签中包含 JavaScript、CSS 或其他语言。HTML 解析器无需知道如何解析所有这些语言。相 反,它可以 注入 JavaScript 或 CSS 解析器来处理 <script><style> 标签 的内容。

其中一项改进是针对 :tree-sitter-subtree 命令的,该命令显示光标下方语法树的 S 表 达式。24.03 版本会显示选定内容下方的注入层,而不是仅显示根层。例如,在此 asciicast 演示中,我们现在显示文档中 JavaScript 部分的语法树,而以前我们只显示 HTML 部分的语法树。

另一个重大改进是针对 tree-sitter 移动操作的。A-o(Alt + o)将选择范围扩展到当前 选定内容所覆盖的语法树节点的父节点。A-i 缩小到子节点,A-nA-p 分别移动到 下一个和上一个节点。以前,这些命令仅在根层(例如 HTML)上有效。 (如 asciicast 所示),但 它们现在会找到包含所选内容的注入层,并沿着该层的语法树移动。我们在内部将注入层组织成 树状结构,以便这些操作可以在需要时切换层。

敬请期待未来改进注入功能的更新,例如在注入内容中查找文本对象。

内部改进

24.03 版本也带来了重大的内部改进。首先是全新的“事件系统”——一个基于 Tokio 通道和任务构建的系统, 允许 Helix 代码库的不同部分相互通信。该事件系统还添加了通用的方法来防抖和在后台线程中运行任务, 从而防止 UI 阻塞。代码库的某些部分已经迁移到事件系统,例如 LSP 补全和签名帮助。 在 24.03 版本中,您会注意到 LSP 补全不会在插入模式下仅通过导航(例如使用箭头键)后自动弹出。 它现在与文档更改挂钩,因此只有在您开始更改文档时才会智能弹出,而不是每次编辑器空闲时都弹出。

另一个值得期待的重大改进是用 regex-cursor 替换了 regex crate, regex-cursor 是一个流式正则表达式实现,与我们用于表示所有文档的 rope crate ropey 兼容。 regex-cursor 能够在_非连续字符串_上运行——这些输入可能不会在内存中连续存储。 在 rope 中,文档的不同部分可能在内部单独存储。为了使用 regex API,我们需要将文档的切片转换为常规的 Rust String, 这会复制该文档切片的内存占用。regex-cursor 则直接在 rope 的块上操作,这大大提高了效率。

总结

一如既往,这只是 24.03 版本的一些亮点。查看完整的更新日志了解更多详情。

欢迎在 Matrix 空间讨论使用和开发问题,并在 GitHub 仓库关注 Helix 的开发进展。