Clone the Zed repository.
Install rustup
Install the necessary system libraries:
| 1 | script/linux |
If you prefer to install the system libraries manually, you can find the list of required packages in the script/linux file.
Once the dependencies are installed, you can build Zed using Cargo.
For a debug build of the editor:
| 1 | cargo run |
And to run the tests:
| 1 | cargo test --workspace |
In release mode, the primary user interface is the cli crate. You can run it in development with:
| 1 | cargo run -p cli |
You can install a local build on your machine with:
| 1 | ./script/install-linux |
This builds zed and the cli in release mode, installs the binary at ~/.local/bin/zed, and installs .desktop files to ~/.local/share.
Zed supports both X11 and Wayland. By default, we pick whichever we can find at runtime. If you're on Wayland and want to run in X11 mode, use the environment variable WAYLAND_DISPLAY=''.
This section is for distribution maintainers packaging Zed.
Zed has two main binaries:
crates/cli and make its binary available in $PATH with the name zed.crates/zed and put it at $PATH/to/cli/../../libexec/zed-editor. For example, if you are going to put the cli at ~/.local/bin/zed put zed at ~/.local/libexec/zed-editor. As some linux distributions (notably Arch) discourage the use of libexec, you can also put this binary at $PATH/to/cli/../../lib/zed/zed-editor (e.g. ~/.local/lib/zed/zed-editor) instead..desktop file you can find a template in crates/zed/resources/zed.desktop.in, and use envsubst to populate it with the values required. This file should also be renamed to $APP_ID.desktop so that the file follows the FreeDesktop standards. You should also make this desktop file executable (chmod 755).ZED_UPDATE_EXPLANATION. For example: ZED_UPDATE_EXPLANATION="Please use flatpak to update zed.".crates/zed/RELEASE_CHANNEL file to 'nightly', 'preview', or 'stable', with no newline. This will cause Zed to use the credentials manager to remember a user's login.Zed moves quickly, and distribution maintainers often have different constraints and priorities. The points below describe current trade-offs:
zed binaries that may be present on Linux systems (1, 2). If you want to rename our CLI binary because of these issues, we suggest zedit, zeditor, or zed-cli.Zed's current Flatpak integration exits the sandbox on startup. Workflows that rely on Flatpak's sandboxing may not work as expected.
To build & install the Flatpak package locally follow the steps below:
script/flatpak/deps script to install the required dependencies.script/flatpak/bundle-flatpak.target/release/{app-id}.flatpak.heaptrack is quite useful for diagnosing memory leaks. To install it:
| 1 | $ sudo apt install heaptrack heaptrack-gui |
| 2 | $ cargo install cargo-heaptrack |
Then, to build and run Zed with the profiler attached:
| 1 | $ cargo heaptrack -b zed |
When this zed instance is exited, terminal output will include a command to run heaptrack_interpret to convert the *.raw.zst profile to a *.zst file which can be passed to heaptrack_gui for viewing.
How to get a flamegraph with resolved symbols from a running Zed instance. Use this when Zed is using a lot of CPU. It is not useful for hangs.
Find the PID (process ID) using:
ps -eo size,pid,comm | grep zed | sort | head -n 1 | cut -d ' ' -f 2
Or find the PID of zed-editor with the highest RAM usage in something
like htop/btop/top.
Install perf:
On Ubuntu (derivatives) run sudo apt install linux-tools.
Perf record:
Run sudo perf record -g --call-graph dwarf -p <pid you just found>, wait a few seconds to gather data, then press Ctrl+C. You should now have a perf.data file.
The --call-graph dwarf option records callers of every sampled function and unwinds through the .eh_frame data kept in stripped release binaries; plain -g does not work without frame pointers.
Make the output file user owned:
run sudo chown $USER:$USER perf.data
Get build info: Run zed again and type {#action zed::About} in the command pallet to get the exact commit.
The perf.data file can be sent to Zed together with the exact commit.
This can be done by Zed staff.
Released Linux binaries are stripped, but the unstripped binary for every release is archived in Sentry (uploaded by script/bundle-linux).
Download it from the Sentry project's Debug Files page (search by the release version or the binary's build id), then continue with the perf buildid-cache step below.
Stripping preserves the build id, so the downloaded binary matches the user's perf.data.
Alternatively, rebuild the binary with symbols:
Cargo.toml.
Apply the following diff, then make a release build.| 1 | [profile.release] |
| 2 | -debug = "limited" |
| 3 | +debug = "full" |
Add the symbols to the perf database:
perf buildid-cache -v -a <path to release zed binary>
Resolve the symbols from the db:
perf inject -i perf.data -o perf_with_symbols.data
Install flamegraph:
cargo install cargo-flamegraph
Render the flamegraph:
flamegraph --perfdata perf_with_symbols.data
Try cargo clean and cargo build.