← 返回博客

AI 持续带来惊喜

2024年1月22日

最近,我特意在日常编码中使用 Zed 内置的 AI 助手。我有点 AI 怀疑论者,这并不是什么秘密,但我想保持开放的心态,给 AI 一个给我留下深刻印象的机会。

以下是最近 Zed 的 AI 集成给我留下深刻印象的一些例子。

用 AI 编写文档

在过去的两个星期里,团队一直在举办我们亲切地称之为“文档派对”的活动,我们都会花一两个小时来文档化 Zed 代码库的各个部分。

在其中一个派对上,我发现自己需要为两个具有相同字段的结构体编写文档:一个内部设置结构体和一个用于序列化的单独结构体。其中一个结构体已为其字段编写了文档,而另一个没有。

#[derive(Debug, Clone, Deserialize)]
pub struct LanguageSettings {
    pub tab_size: NonZeroU32,
    pub hard_tabs: bool,
    pub soft_wrap: SoftWrap,
    // ...
}
 
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
pub struct LanguageSettingsContent {
    /// How many columns a tab should occupy.
    ///
    /// Default: 4
    #[serde(default)]
    pub tab_size: Option<NonZeroU32>,
    /// Whether to indent lines using tab characters, as opposed to multiple
    /// spaces.
    ///
    /// Default: false
    #[serde(default)]
    pub hard_tabs: Option<bool>,
    /// How to soft-wrap long lines of text.
    ///
    /// Default: none
    #[serde(default)]
    pub soft_wrap: Option<SoftWrap>,
    // ...
}

虽然我可以手动复制文档注释,但这个结构体有 16 个字段,并且每个文档注释中的行不平衡,这将使多光标操作变得有点棘手。

我决定在内联助手中输入以下提示,看看会发生什么

LanguageSettingsContent 中字段的文档注释复制到 LanguageSettings 中的字段。忽略有关默认值的注释。只需复制文档注释。

AI 逐字复制了文档注释——除了我要求它忽略的有关默认值的注释——并将它们放在相应的字段上。

#[derive(Debug, Clone, Deserialize)]
pub struct LanguageSettings {
    /// How many columns a tab should occupy.
    pub tab_size: NonZeroU32,
    /// Whether to indent lines using tab characters, as opposed to multiple
    /// spaces.
    pub hard_tabs: bool,
    /// How to soft-wrap long lines of text.
    pub soft_wrap: SoftWrap,
    // ...

用 AI 翻译代码

在业余时间,我一直在重建我的个人网站。作为其中的一部分,我需要将我的模板从 Tera 转换为我正在基于 auk 构建的新模板系统。

我需要将我编写的这个小组件移植到 Auk 的 DSL。

<div class="pv2 flex items-end">
  <div class="pv1 w-20"> {{ label }} </div>
  <div class="pv1 w-80">
    <progress class="language-bar flex" value="{{ value }}" max="10"></progress>
  </div>
</div>

我又一次想到看看 Zed 助手能做些什么会很有趣。我用以下内容提示它:

使用 auk 的 DSL 重写这个 HTML,就像上面的 post_link 函数一样。

助手吐出的最终结果与我手动生成的结果完全相同。

pub fn language_stat(label: &str, value: u32) -> HtmlElement {
    div()
        .class("pv2 flex items-end")
        .child(div().class("pv1 w-20").text_content(label))
        .child(
            div().class("pv1 w-80").child(
                progress()
                    .class("flex language-bar")
                    .value(value.to_string())
                    .max("10"),
            ),
        )
}

助手能够如此轻松地适应我创建的这个全新的 DSL,这让我尤其震惊。通过简单地在与一些其他示例相同的缓冲区中进行组合,AI 能够拼凑出足够的上下文来正确地形成。

自从发现 Zed 助手非常擅长在 Tera 和 Auk 之间进行转换后,我继续在迁移过程中使用它,以减少手动繁琐的工作。在撰写本文时, Auk 模板代码有近 1,300 行,其中大部分是在 AI 助手的帮助下编写的。

λ nix-shell -p cloc --command "cloc --vcs=git crates/site/src/{components,templates}"
 
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Rust                            16            130              2           1293
-------------------------------------------------------------------------------
SUM:                            16            130              2           1293
-------------------------------------------------------------------------------

虽然我仍然不相信 AI 会让软件开发人员过时,但这些经验让我相信,将 AI 恰当地集成到我们的开发工具和工作流程中绝对有空间。

在 Zed,我们正在探索如何利用 AI 的力量来赋能开发人员编写软件,我们才刚刚开始。

这篇文章最初发表在 maxdeviant.com


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

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


我们正在招聘!

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