Release 23.10 Highlights

Helix 23.10 版本终于发布了!23.10 版本引入了一些非常重要的内部改进,从而实现了许多强大的功能。非常感谢所有为此次发布做出贡献的人!

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

让我们来看看此版本的亮点。

多语言服务器支持

23.10 版本对我们处理语言服务器的方式进行了重大改进。 以前,每种语言一次只能支持一个语言服务器, 但现在您可以配置多个语言服务器协同工作。例如,您可以将 TypeScript 语言服务器用于 JavaScript/TypeScript 开发,同时 配置 efm-langserver 用于 Prettier 格式化和 ESLint 诊断。借助新的多语言服务器支持, 您可以指定从每个语言服务器使用哪些功能。

这使得语言配置 (languages.toml) 中语言服务器的配置方式发生了重大变化。 现在,所有语言服务器都与语言分开指定,然后每种语言选择要使用的语言服务器。 以上述示例为例,您可以像这样配置 efm-langserver 和 typescript-language-server:

[language-server.efm]
command = "efm-langserver"
config.documentFormatting = true

[language-server.typescript-language-server]
command = "typescript-language-server"
args = ["--stdio"]
config.hostInfo = "helix"

[[language]]
name = "typescript"
auto-format = true
language-servers = [
  { name = "efm", only-features = ["format", "diagnostics"] },
  { name = "typescript-language-server", except-features = ["format", "diagnostics"] },
]

更多详情请参阅语言配置文档.

使用 Nucleo 进行模糊匹配

Helix 使用“模糊”匹配功能在文件选择器等组件中实现实时输入过滤。之前我们使用的是流行 的 skim/fuzzy-matcher 库,但在 23.10 版本中,我们切换到了新 的 nucleo 库。Nucleo 的 速度比 skim 和 fzf 快得多,能够正确处理 Unicode 字符,并且使用了一种更直观的评分系统。

Nucleo 还使我们能够以惰性方式加载新项目,这极大地提升了文件选择器的用户体验。在上面 的 asciicast 演示中,我正在扫描计算机的 /nix/store 目录,这是一个包含超过两千 万个文件的巨大目录。现在,文件选择器会随着目录扫描的进行逐步工作,并在找到匹配文件时立即显示结果。

Nucleo 也为未来的文件选择器升级奠定了基础。敬请关注即将发布的版本说明,了解我们将如何改进文件选择器。

智能制表符

智能制表符是默认键位映射中与 Tab 键关联的一项新功能。当您按下 Tab 键且光标左侧的行不全是空格时,光标将跳转到语法树父节点的末尾。例如:

{
  key = "value";
  nested = {
    key2 = "value2"; # When the cursor is at the end of the line here, <tab>
                     # jumps right after the closing brace on the next line.
  };
}

这在像 Nix 这样的语言中非常有用,例如可以在属性集的末尾添加分号,或者在类似 C 语言的语言中跳转到代码块的末尾:

扩展了对 registers 的支持

registers 允许您保存和粘贴值。例如,您可以选择一个段落,使用 "ay 将其复制到 a registers,然后使用 "ap 粘贴该段落。但是,某些 registers 在读取或写入时具有特殊效果,例如 _“黑洞” registers:写入的任何值都会被丢弃,并且无法从中读取任何内容。特殊 registers 已扩展,包含了一些来自 Kakoune 和剪贴板的实用 registers:

此外,还可以查看新的 registers 状态栏元素。当您使用 " 选择 registers 时,它会显示出来。请注意,在 asciicast 演示中,当我们选择 # registers 时,状态栏右下角会显示 reg=#,而当我们粘贴该 registers (p) 或增加选区 (C-a) 时,它就会消失。

初步支持 LSP DidChangeWatchedFiles 功能

一些语言服务器使用 DidChangeWatchedFiles 通知来检测其他语言相关文件的更改。 例如,rust-analyzer 会在你将新的依赖项添加到 Cargo.toml 文件时获取并 索引这些新的依赖项。Helix 现在会在文件被 Helix 本身修改时发送文件更改通知。 完全支持 DidChangeWatchedFiles 需要文件监视器,但目前我们能够支 持 DidChangeWatchedFiles 最常见的用例。

语法高亮显示正则表达式提示

现在,使用 sS| 创建的正则表达式提示符可以通过 tree-sitter-regex 进行语法高亮显示。 高亮显示使特殊字符更加醒目,并且可以捕获诸如末尾反斜杠之类的语法错误。

总结

一如既往,这只是 23.10 版本更新的冰山一角。查看更新日志了解完整详情。

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