### Background
Zed extensions use WASI to access the file-system. They only have
read-write access to one specific folder called their work dir. But
extensions do need to be able to *refer* to other arbitrary files on the
user's machine. For instance, extensions need to be able to look up
existing binaries on the user's `PATH`, and request that Zed invoke them
as language servers. Similarly, extensions can create paths to files in
the user's project, and use them as arguments in commands that Zed
should run. For these reasons, we pass *real* paths back and forth
between the host and extensions; we don't try to abstract over the
file-system with some virtualization scheme.
On Windows, this results in a bit of mismatch, because `wasi-libc` uses
*unix-like* path conventions (and thus, so does the Rust standard
library when compiling to WASI).
### Change 1 - Fixing `current_dir`
In order to keep the extension API minimal, extensions use the standard
library function`env::current_dir()` to query the location of their
"work" directory. Previously, when initializing extensions, we used the
`env::set_current_dir` function to set their work directory, but on
Windows, where absolute paths typically begin with a drive letter, like
`C:`, the [`wasi-libc` implementation of
`chdir`](
|
||
|---|---|---|
| .. | ||
| glsl | ||
| html | ||
| proto | ||
| ruff | ||
| slash-commands-example | ||
| snippets | ||
| test-extension | ||
| .gitignore | ||
| EXTRACTION.md | ||
| README.md | ||
Zed Extensions
This directory contains extensions for Zed that are largely maintained by the Zed team. They currently live in the Zed repository for ease of maintenance.
If you are looking for the Zed extension registry, see the zed-industries/extensions repo.
Structure
Currently, Zed includes support for a number of languages without requiring installing an extension. Those languages can be found under crates/languages/src.
Support for all other languages is done via extensions. This directory (extensions/) contains a number of officially maintained extensions. These extensions use the same zed_extension_api available to all Zed Extensions for providing language servers, tree-sitter grammars and tree-sitter queries.
Dev Extensions
See the docs for Developing an Extension Locally for how to work with one of these extensions.
Updating
Note
This update process is usually handled by Zed staff. Community contributors should just submit a PR (step 1) and we'll take it from there.
The process for updating an extension in this directory has three parts.
-
Create a PR with your changes. (Merge it)
-
Bump the extension version in:
- extensions/{language_name}/extension.toml
- extensions/{language_name}/Cargo.toml
- Cargo.lock
You can do this manually, or with a script:
# Output the current version for a given language ./script/language-extension-version <langname> # Update the version in `extension.toml` and `Cargo.toml` and trigger a `cargo check` ./script/language-extension-version <langname> <new_version>Commit your changes to a branch, push a PR and merge it.
-
Open a PR to
zed-industries/extensionsrepo that updates the extension in question
Edit extensions.toml in the extensions repo to reflect the new version you set above and update the submodule latest Zed commit.
# Go into your clone of the extensions repo
cd ../extensions
# Update
git checkout main
git pull
just init-submodule extensions/zed
# Update the Zed submodule
cd extensions/zed
git checkout main
git pull
cd -
git add extensions.toml extensions/zed