← 返回博客

Zed Weekly: #28

2023 年 12 月 4 日


The current state of Zed2
Zed2 的当前状态

团队正在努力进行 Zed2 项目。除了偶尔抽调一些开发者来修复 Zed1 中的关键问题外,每个人都专注于完成这个过渡。我们将工作分解为 3 个阶段:

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

这个阶段包括完成绝对基本的核心功能 - 能够编辑文件、自动完成、拥有选项卡和拆分等。我们几乎完成了这个阶段。事实上,Mikayla 和 Max 都在努力运行 Zed 的 nightly 构建系统,我们计划在下周左右使用 Zed2 构建 Zed2。

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

此阶段包括完成编辑器中重要的功能,但这些功能并不完全处于文本编辑的最低级别。这些功能包括协作、终端、Vim 模式等。此阶段的工作已经开始。

第三阶段:“功能齐全”

此阶段包括完成编辑器的更大的旗舰功能:助手、Copilot、聊天等。一旦第二阶段接近完成,我们将更多地关注这一点。

我们目前的目标是大胆的:“在 2023 年底之前发布 Zed2 的工作版本供预览。” 我们认为这是可能的,但我们必须看看未来几周内未知的领域将如何发展。我们计划在 Zed2 取代 Zed1 后不久开源。

Joseph

我已经有几周没有写 Zed Weekly 条目了。 从那时起,我把时间分配在理顺我们遥测中的一些粗糙边缘,并关注社区。 在过渡到 Zed2 的这段时间里,我主要专注于阅读所有社区反馈,尽我所能找到它,这样我们就可以知道在完成端口时应该优先考虑什么。 我正在尽我所能使用我的直觉来判断哪些应该作为严重问题提交给团队,哪些可以稍后解决。 除了缺少的功能外,如果您遇到任何重大崩溃或错误,请(告诉我们)。

作为旁注,在某个时候,团队将举行办公时间,他们将在其中与社区合作,进行编程会议并回答问题。 对我来说,我不确定我如何才能适应这个计划,因为我不太参与编辑器的开发,但我认为我可以在这段时间内做的是也许与用户进行一对一的会话,通过 Zed,用户可以发挥主导作用,我可以识别出出现的摩擦点。

Nate

本周我一直在移植很多核心 UI – 诸如 Popover、自动完成菜单、对我们按钮的改进(请参阅 Marshall 在下面的更详细的深入探讨!)以及一些协作 UI。

我们正在努力能够在下周的 Zed2 中运行我们的每周会议,因此正在努力做好准备。

我们很高兴很快向大家展示这一点!

Julia

本周我做的一件事是将编辑器面包屑移植到 Zed2。虽然实际的面包屑只是一个小部分,但与 Nate 直接合作完成我正确执行它所需的按钮 API 类型非常酷。 我对我们现在通过新的 UI 构建方法能够实现的更高水平的一致性感到非常兴奋。

Marshall

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

第一个候选是 ListItem,我们在 Zed 的许多地方都使用它,例如项目面板、命令调色板和各种上下文菜单。 虽然这些 UI 片段都非常独特,但渲染项目列表的基本需求是相同的。

在这些不同的上下文中使用 ListItem 涉及重新设计 API 以使其更加开放,允许它充当更多容器,并且对它显示的子项的种类不要那么固执。 这种方法的变化使 ListItem 足够灵活,可以在各种不同的上下文中使用,同时仍然允许我们实现一致的风格。

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

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

为了保持我们按钮和其他组件的 API 一致,我们已经开始引入一些 traits 来定义常见的行为。 例如,我们有一个 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 中解决其中的一些难题!

Kirill

这周我一直在修复与前端相关的错误:typescript-language-server 开始需要更多功能来发送诊断信息,长期存在的 eslint 解析错误和其他较小的错误。 此外,prettier 已经过了一轮良好的处理,可以在离线环境中更加稳定。 接下来,我计划使 eslint 更加可配置,并完成修复一个错误,该错误会导致 Zed 错误地打开被排除的文件。

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