与 ChatGPT 和 Copilot 共同创作
在 Zed,我们和其他人一样,都被新的 AI 工具所吸引。因此,我们问自己,我们能以多快的速度将这些新工具带给我们的用户?经过几周的努力,我们很高兴地宣布 GitHub Copilot 现在可以在 Zed 中使用了! Copilot 是一种代码生成工具,它使用机器学习来帮助您更快地编写代码。您可以使用它来生成代码片段、函数和整个文件,从而轻松地将您的想法变为现实。
Copilot 应该可以通过屏幕右下角的状态栏图标立即使用(在 Zed v0.82 中)。单击该图标以使用您现有的 Copilot 订阅登录。
如果您完全不想使用 Copilot,您可以通过将 "features": {"copilot": false }
添加到您的设置文件中来禁用它。
这是 Copilot 在行动
继续阅读,了解我们如何将 Copilot 集成到 Zed 中!
首先,我们必须真正获得对 Copilot 的访问权限。在撰写本文时,没有官方的 GitHub API 与 Copilot 交互。但是,由于有了开源 Neovim 插件,我们可以访问一个未公开的、最小化的 LSP 服务器,该服务器处理与 GitHub 的交互。 Zed 已经内置了对 LSP 服务器的支持,因此访问 Copilot 就像从 Neovim 插件存储库下载 Copilot LSP 一样简单。特别感谢 Zed 社区成员 TerminalFi,感谢他们的 LSP-copilot Sublime Text 插件,它提供了可用自定义消息的规范。
获得 LSP 后,我们需要为身份验证过程添加 UI。我们在 Zed 中已经有获取 GitHub 授权令牌的机制。但是 Copilot LSP 是为 Neovim 的基于文本的界面构建的;它使用设备代码在内部管理自己的 OAuth 令牌。但是,这一挑战促使我们在 Zed 中引入了 Modal UI,它可以作为单独的窗口弹出 - 为未来的增强功能(例如发布独立的终端)打开了可能性!
最后,我们需要一种显示建议文本的方法。正如我们在 CRDT 博客文章 中提到的那样,我们将文档的整个编辑历史记录维护为一系列称为缓冲区的操作。但是,存储和编辑文本只是代码编辑器的最基本功能。我们还需要代码折叠、制表符展开、换行等。这些都由 DisplayMap
提供,它维护这些功能的每一种的编辑序列索引。对于 Copilot,我们添加了“建议”,它允许我们将具有自定义样式的多行文本拼接到缓冲区中。 DisplayMap 还接受广泛的随机测试,以确保这些功能的各种组合都能协同工作。
有了所有这些部分,我们花了几个星期的时间在内部预览版本上微调 Copilot 的行为。平衡其视觉和精神负担至关重要,因为过度热心的 Copilot 可能会适得其反,并导致与 LSP 自动完成等现有功能发生冲突。我们引入了按语言禁用 Copilot 的设置,添加了 75 毫秒的防抖动以防止建议文本,并在发生冲突时优先使用语言的真实 LSP 而不是 Copilot。
这就是我们成功将 Copilot 集成到 Zed 中的方式!我们很高兴看到这个新功能将如何增强我们用户的编码体验。试试看,让我们知道你的想法!