← 返回博客

Zed Weekly:#17

2023 年 8 月 22 日


新的一周,新的博客文章。我们决定将博客系列更名为“Zed Weekly”,以更好地反映文章的内容。

本周,我们主要致力于编辑器的 AI 部分、频道、改进语言服务器支持和性能。

Antonio

本周非常令人兴奋,因为我们开始实现一个新的内联助手功能,该功能可让您生成代码或转换您的选择。 我们非常接近此功能的第一个版本,最早可能在下周发布预览版。

一个有趣的技术挑战是逐个标记地获取 GPT 向我们流式传输的文本,并将其增量应用于所选内容。 在典型的 diff 中,您比较整个字符串并生成“最短编辑脚本”。 在这里,diff 的右侧是增量生成的,因此我们必须推出我们自己的 diff 算法版本,该算法能够随着 GPT 文本的到达而增量生成块。

Kyle

又一周几乎完全专注于我们的语义索引。 首先,我们本周发布了内部版本的搜索 UI,这让团队有机会亲自测试我们的语义引擎。 在引擎方面,我们实现了一个 Eager/Lazy 操作队列,允许我们将快速任务卸载到后台,从而简化了我们的索引过程并提高了吞吐量。 下周,我们希望通过嵌入缓存和令牌化优化来扩展这一点。 最终,我们对性能有很高的期望,这在 AI 领域尤其具有挑战性。 我对 Piotr 和我本周取得的进展感到非常满意,并且我们还有一些更高优先级的优化部分,这将推动我们达到我们对发布感到兴奋的地步。

除此之外,我还花了一些时间与 Antonio 配对,研究我们的内联助手功能。 我仍然对过去 5 年我们在人工智能领域取得的进展印象深刻,现在正是在这个领域工作的一个激动人心的时刻。

Conrad

Vim 模拟的工作进展顺利。 本周的主要变化是支持设置文件中的 "relative_line_numbers": true。 为了使这有意义,我们还必须修复一个长期存在的错误,即 jk 和相关操作在屏幕坐标而不是文件坐标中工作。 我们已经开始的下一个主要功能可能是我最喜欢的:. 重放上次操作。 模拟它是在 vim 引擎盖下如何工作的有趣学习体验:有很多细节需要正确处理,但这是值得的! 请继续关注更多...

Piotr

本周我继续与 Kyle 合作开发语义搜索。 我们在这里取得了很大的进展; 除此之外,我增加了我们的语言配置,允许指定自定义的单词字符。 这是我们对 PHP 和 Tailwind 等语言所需要的 - 在 PHP 的情况下 - 我们没有将前导“$”视为变量名称的一部分,因此导致我们放弃了来自 LSP 服务器的建议。 最后但并非最不重要的一点是,我终于完成了几个星期前与 Julia 启动的项目搜索更改; 结果现在已排序(如之前一样)并立即弹出。 端到端延迟仍然相同,但我有一些想法可以解决这个问题。 敬请关注!

Nathan

继续专注于新的样式和布局方法。 到目前为止,Taffy 进展顺利。 期待迭代下面的演示,开始构建更复杂的组件和界面。 您可以使用基于 Tailwind CSS 类的辅助方法进行样式设置,也可以直接设置属性。

This layout is produced by the code below
此布局由以下代码生成
.

fn example<V: 'static>() -> impl Element<V> {
    use div::div;
    let palette = RosePinePalette::dawn();
 
    div()
        .text_color(black())
        .h_full()
        .w_full()
        .fill(palette.rose)
        .child(
            div()
                .fill(palette.pine)
                .child(div().fill(palette.love).w_6().h_3()),
        )
        .child(
            div()
                .fill(palette.gold)
                .child(div().fill(palette.iris).w_3().h_3()),
        )
}

Julia

我们对 Tailwind 支持的最后一项任务是确保自动完成功能按预期工作,使用 kebab-case 类名。 为了知道自动完成应该从哪里开始,Zed 会在光标周围查找以识别单词边界。 以前这是一个硬编码的机制,所有语言都相同,Kirill 意识到当我们认为减号是边界但符号是 kebab-case 时,这会导致问题。 这会导致我们错误地在用户键入的每个破折号后截断自动完成查询,因此“bg-yellow”将变为“yellow”,从而导致不正确的自动完成排序和过滤。

Piotr 在我们的 PHP 支持中发现了美元符号的相同问题,因此他添加了一个新系统,用于在每个语言的基础上配置此机制。 这来得正是时候,可以帮助我们处理 Tailwind,一切都很好,至少在我们遇到 JSX 之前是这样。

JSX 的问题是我们需要能够完成 kebab-case Tailwind 类名,但外部语言语法需要继续将减号作为单词边界。 值得庆幸的是,在年初,Max 和我构建了一个机制,可以按句法范围覆盖这种类型的任何内容。 这种机制允许我们在普通的 JS/TS 中使用普通的单词边界,但是在键入类名时,我们可以将其识别为 JSX 元素中的一个属性,并允许破折号成为单词的一部分,从而使自动完成功能按预期工作!

Mikayla

上周,我们为频道构建了一个新功能:频道笔记! 现在,每个频道都有一个与其关联的 Markdown 文档,您可以使用该文档来帮助管理您用于频道的任何内容。 对我们来说,我们发现它们对于组织我们的项目和跟踪人们正在做的事情很有用。 从头开始构建新的协作机制真是令人兴奋:D

Joseph

我本周花了很大一部分时间在我们的分析仪表板中,纠正同时出现的一系列问题。 比较包含数字字符的字符串并不真正有效是众所周知的,但它完全从我身边溜走了,因为在我们的版本从 0.99.0 滚动到 0.100.0 (😂) 之前,事情一直正常工作; 每个按版本分组或排序的图表都完全崩溃了。 从理论上讲,更新这项任务很简单,但实际上有点痛苦——我已经接近终点了!

除了仪表盘之外,我一直在考虑 Zed Industries 如何提高我们计划发布的核心语言的支持质量。我认为让团队成员成为他们在日常编码中广泛使用的语言的“语言倡导者”可能是一个好主意。这些倡导者将负责标记问题并敦促团队修复它们,或者自己解决它们。我还认为,引入社区成员来涵盖团队中没有人专门研究的语言可能很有用。我不确定这个想法是否会实现,因为团队的任务安排非常繁忙,但理论上,这是有道理的。虽然我打算以同等的重要性对待所有问题和社区反馈,但我计划倡导 Python - 我有一些关于可以打开的 PR 的想法,希望能改善开发体验。

Nate

我们一直在探索频道的一些其他功能,包括频道笔记和聊天。这周我一直在为这些东西设计,以及做一些设计更新,使频道更容易浏览和使用。

Exploring a more distinct Current Call section in channels.
探索频道中一个更明显的“当前通话”部分。

除此之外,我一直在探索一些更长远的设计和主题想法,我将在之后的几周里讨论这些想法!

Max

这周,Mikayla和我继续开发 Zed 即将推出的频道功能。我们已经在内部使用了一周,我们发现我们的团队倾向于为每个项目创建一个频道的模式。

这周,我们添加了一个我们称之为“频道笔记”的功能,每个频道都有一个 markdown 缓冲区,该缓冲区存储在服务器上,并且可以像共享项目中的文件一样进行协作编辑。我们在周四完成了这个功能的初始实现,我们计划开始使用这些频道笔记来跟踪我们在项目中的进展。

Kirill

我和 Julia 以及 Piotr 共同合作开发 Tailwind 支持,我参与了他们的工作。我们很好地协调了这些更改,因此我只需要在别人的工作之上添加几行代码,就可以在 CSS 和 HTML 中启用良好的 Tailwind 补全功能。JSX 补全仍然不够好,因此还有更多工作要做。

除此之外,我完全沉浸在内联提示中:我已经设法实现了提示解析逻辑、动态提示(你现在可以悬停并单击它们!)并且在此基础上做了一些优化,以便尽可能少地查询提示。我花了很长时间才找到悬停相关的错误,我认为目前的结果看起来不错,但只有长时间的使用才能说明问题。这个任务中最有价值的部分之一是再次为 rust-analyzer 做出贡献,希望能够进一步改善开发人员的工作流程。有了更好的客户端对内联提示解析的看法,我们似乎可以显著缩小 rust-analyzer 的基本 inlayHint 响应,有时可以减少超过 50% 的先前大小。