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-n 和 A-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 版本的一些亮点。查看完整的更新日志了解更多详情。