最近,我特意在日常编码中使用 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