开发扩展

扩展功能

扩展可以为 Zed 添加以下功能

在本地开发扩展

在开始为 Zed 开发扩展之前,请确保通过 rustup 安装 Rust

必须通过 rustup 安装 Rust。如果您通过 homebrew 或其他方式安装了 Rust,则安装开发扩展将不起作用。

在开发扩展时,您可以在 Zed 中使用它,而无需通过将其安装为开发扩展来发布它。

在扩展页面中,单击“安装开发扩展”按钮,然后选择包含您的扩展的目录。

如果您已经安装了同名的已发布扩展,您的开发扩展将覆盖它。

Zed 扩展的目录结构

Zed 扩展是一个包含 extension.toml 的 Git 存储库。 此文件必须包含有关扩展的一些基本信息

id = "my-extension"
name = "My extension"
version = "0.0.1"
schema_version = 1
authors = ["Your Name <you@example.com>"]
description = "My cool extension"
repository = "https://github.com/your-name/my-zed-extension"

除此之外,还有其他几个可选的文件和目录可用于向 Zed 扩展添加功能。 提供所有功能的扩展的示例目录结构如下所示

my-extension/
  extension.toml
  Cargo.toml
  src/
    lib.rs
  languages/
    my-language/
      config.toml
      highlights.scm
  themes/
    my-theme.json

WebAssembly

扩展的过程部分是用 Rust 编写并编译为 WebAssembly。 要开发包含自定义代码的扩展,请包含如下所示的 Cargo.toml

[package]
name = "my-extension"
version = "0.0.1"
edition = "2021"

[lib]
crate-type = ["cdylib"]

[dependencies]
zed_extension_api = "0.1.0"

请确保使用 crates.io 上提供的最新版本的 zed_extension_api

在 Rust crate 的 src/lib.rs 文件中,您需要为您的扩展定义一个结构,并实现 Extension trait,以及使用 register_extension! 宏来注册您的扩展

use zed_extension_api as zed;

struct MyExtension {
    // ... state
}

impl zed::Extension for MyExtension {
    // ...
}

zed::register_extension!(MyExtension);

发布您的扩展

要发布扩展,请打开一个 PR 到 zed-industries/extensions repo

注意:如果您将 zed-industries/extensions repo 分叉到个人 GitHub 帐户而不是 GitHub 组织,这将非常有帮助,因为这允许 Zed 员工将任何需要的更改推送到您的 PR,以加快发布过程。

在您的 PR 中,执行以下操作

  1. 将您的扩展作为 Git 子模块添加到 extensions/ 目录中
git submodule add https://github.com/your-username/foobar-zed.git extensions/foobar
git add extensions/foobar
  1. 向顶级 extensions.toml 文件添加一个包含您的扩展的新条目
[my-extension]
submodule = "extensions/my-extension"
version = "0.0.1"

如果您的扩展位于子模块中的子目录中,您可以使用 path 字段来指向扩展所在的位置。

  1. 运行 pnpm sort-extensions 以确保 extensions.toml.gitmodules 已排序

一旦您的 PR 被合并,该扩展将被打包并发布到 Zed 扩展注册表。

扩展 ID 和名称不应包含 zedZed,因为它们都是 Zed 扩展。

更新扩展

要更新扩展,请打开一个 PR 到 zed-industries/extensions repo

在您的 PR 中,执行以下操作

  1. 将扩展的子模块更新到新版本的提交。
  2. 更新 extensions.toml 中扩展的 version 字段
    • 确保 version 与特定提交中 extension.toml 中设置的版本匹配。

如果您想自动化此过程,可以使用 社区 GitHub Action