The current state of Zed2
Zed2 的现状

团队正在全力以赴地推进 Zed2 计划。除了偶尔抽调开发人员修复 Zed1 中的关键问题外,每个人都专注于完成这次过渡。我们将工作分解为三个阶段:

第一阶段:“让 Zed2 能够运行”

此阶段包括完成绝对核心的基础功能——能够编辑文件、自动补全、拥有标签页和分屏等。我们即将完成此阶段。事实上,Mikayla 和 Max 都致力于让 Zed 夜间构建系统运行起来,我们计划在未来一周左右使用 Zed2 构建 Zed2。

第二阶段:“让 Zed 具有生产力”

此阶段包括完成编辑器中重要的功能,但这些功能并非文本编辑的最底层。例如协作、终端、Vim 模式等。此阶段的工作已经开始。

第三阶段:“功能齐全”

此阶段包括完成编辑器的更大旗舰功能:Assistant、Copilot、Chat 等。一旦第二阶段接近完成,我们将更专注于此。

我们当前的目标是大胆的:“在 2023 年底之前发布一个可用的 Zed2 预览版。” 我们认为这是可能的,但我们必须看看未来几周剩余的未知因素如何发展。我们计划在 Zed2 取代 Zed1 后不久开源。

约瑟夫

我写上一篇 Zed 周报已经几周了。从那时起,我将时间分配在完善我们的遥测功能和关注社区上。在 Zed2 的过渡期间,我主要关注阅读所有社区反馈,尽我所能找到的每一个地方,以便我们在完成移植时知道要优先处理什么。我正在尽力根据我的直觉来判断哪些是需要提交给团队的严重问题,哪些是可以稍后解决的问题。除了缺失的功能之外,如果您遇到任何重大崩溃或错误,请 (告诉我们)。

另外,团队将在某个时候进行办公时间,他们将与社区合作,进行编程会话,并回答问题。对我来说,我不确定我如何融入这个计划,因为我本身不怎么从事编辑器的工作,但我认为我可以在那段时间里与用户进行一对一的会话,通过 Zed,用户可以主导,我可以找出出现什么样的摩擦点。

内特

我这周一直在移植大量的核心 UI——比如弹出菜单、自动补全菜单、对我们按钮的改进(参见 Marshall 下面更详细的深入探讨!)以及一些协作 UI。

我们正在努力争取下周在 Zed2 中召开我们的每周会议,所以大家都在埋头苦干,为之做准备。

我们很高兴很快就能向大家展示!

茱莉亚 (Julia)

我这周做的一件事是将编辑器面包屑移植到 Zed2。虽然实际的面包屑只是一小部分,但能直接与 Nate 合作,确定我需要正确实现它所需的按钮 API 类型,这真是太酷了。我对我们现在新的 UI 构建方法所能达到的更高一致性感到非常兴奋。

马歇尔

本周我专注于完善我们在 Zed2 中使用的一些 UI 组件。

第一个是 ListItem,我们 Zed 中许多地方都使用了它,比如项目面板、命令面板以及各种上下文菜单。虽然这些 UI 部分都相当独特,但渲染列表项的基础需求是相同的。

在这些不同的上下文中使用 ListItem 需要重新设计 API,使其更开放,使其更像一个容器,而不是对它显示的子元素过于主观。这种方法的改变使 ListItem 足够灵活,可以在各种不同的上下文中使用,同时仍然允许我们实现一致的样式。

完成 ListItem 后,我开始重新设计 Nate 一直在探索的按钮。在 Zed2 中,我们目前有两种不同类型的按钮:ButtonIconButton。在这次重新设计之前,这两种按钮都是独立实现的,这使得很难确保它们的样式相似且 API 一致。

我们引入了一个新的 ButtonLike 组件,为任何行为像按钮的组件提供基本功能。虽然这主要作为我们具体按钮的基础,但它也可以用于构建具有类似按钮行为的不同 UI 组件。ButtonLike 为我们提供了一个集中处理按钮样式的地方,这将有助于保持按钮的视觉一致性。

为了保持按钮和其他组件的 API 一致,我们开始引入一些 trait 来定义通用行为。例如,我们有一个 Selectable trait,它定义了可选择组件的接口。

/// A trait for elements that can be selected.
pub trait Selectable {
    /// Sets whether the element is selected.
    fn selected(self, selected: bool) -> Self;
}

然后我们可以为 ButtonLike 实现这个 trait。

impl Selectable for ButtonLike {
    fn selected(mut self, selected: bool) -> Self {
        self.selected = selected;
        self
    }
}

selected 字段然后用于 ButtonLikeRenderOnce 实现中,以在渲染时改变按钮的视觉效果。

由于我们的 Button 组件是基于 ButtonLike 构建的,为了为 Button 实现 Selectable,我们可以简单地将 trait 委托给 ButtonLike 的实现。

#[derive(IntoElement)]
pub struct Button {
    base: ButtonLike,
    // ...
}
 
impl Selectable for Button {
    fn selected(mut self, selected: bool) -> Self {
        self.base = self.base.selected(selected);
        self
    }
}

另外,Advent of Code 今天开始(技术上是昨晚)。我今年再次使用 Rust 解决谜题,并期待尝试在 Zed2 中解决其中一些谜题!

基里尔

我这周一直在修复与前端相关的错误:typescript-language-server 开始需要更多功能才能发送诊断信息,长期存在的 eslint 解析错误以及其他一些小错误。此外,prettier 也得到了很好的改进,在离线环境中变得更加健壮。接下来,我计划使 eslint 更具可配置性,并完成修复一个关于被排除文件有时被 Zed 错误打开的错误。

与此同时,我一直在考虑文件查找器能够在更多 gitignore 目录中搜索的选项:我认为我们可以通过将我们的输入不仅仅是一个文本编辑器来做到这一点。如果它开始接受并突出显示查询到 ${ignored_directory_root}/${fuzzy_query_part} 部分,我们可以将减少的表面限制在更可接受的范围内,特别是如果我们对模糊部分更聪明,并更好地匹配较低的目录。虽然这也是一个有趣的任务,但将其适应 gpui1 本身也是一个挑战,所以感觉我可能会在 gpui2 发布之前暂停——它进展非常顺利,所以希望我们能在这之上落地越来越多的与 UI 相关的功能,包括搜索功能。


正在寻找更好的编辑器吗?

您今天就可以在 macOS、Windows 或 Linux 上试用 Zed。立即下载


我们正在招聘!

如果您对我们博客中涵盖的主题充满热情,请考虑加入我们的团队,帮助我们实现软件开发的未来。