Code at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.
Find a file
Mikayla Maki c27dd57a48
Make more performance improvements to GPUI 2 (#3664)
In the 3 charts below, "window draw" has 3 major subroutines. Request
layout, where we walk over the tree and have everything talk to the
layout engine initially. Compute layout, where we have the layout engine
actually do the layout, and then paint, where we use the computed bounds
to populate the scene.


![image_720](https://github.com/zed-industries/zed/assets/1789/d2225389-865f-4c8a-9452-9f611da64dcf)

Things are moving quickly so before/after comparisons are tough. In the
graph above, green bars are from a commit actually pre-dates a merge of
master which increased the complexity of layout. The red bars represent
the state of the world after this PR. Note how we improve the
performance of `paint`.

Improvements:

- Not moving `self` in `Element::paint`. This was moving from the heap
to the stack and imposing a big cost. This is the biggest win in this
PR.
- We got some minor wins by making the stacking order a bigger smallvec
of u8 instead of u32.
- A big win that doesn't show up in this chart is avoiding a double
render of the editor when autoscrolling by never pushing notification
effects or marking the window dirty when notifying during a window draw.

Release Notes:

- N/A
2023-12-14 16:45:58 -08:00
.cargo ci: Add ci-config.toml in .cargo folder. 2023-11-22 22:25:26 +01:00
.config tests: Test 'db' package sequentially (#2654) 2023-06-28 15:00:43 +02:00
.github Adjust nightly to build twice a day 2023-12-11 13:05:16 -05:00
.vscode
.zed Ensure json uses a tab size of 4 2023-07-31 13:08:40 -04:00
assets Rework the way project panel auto reveals entries 2023-12-12 11:38:51 +02:00
crates Make more performance improvements to GPUI 2 (#3664) 2023-12-14 16:45:58 -08:00
docs Add note 2023-12-13 12:53:41 -08:00
plugins
script Improve storybook story selection (#3653) 2023-12-14 12:13:02 -05:00
styles MODAL 2023-11-07 13:23:27 -07:00
.dockerignore
.gitignore Ignore .idea directory 2023-09-15 11:17:02 -04:00
.gitmodules
Cargo.lock Use bitflags to hold error states 2023-12-14 17:22:13 -05:00
Cargo.toml Vcs menu2 (#3648) 2023-12-14 12:36:53 +01:00
debug.plist WIP 2023-12-14 09:25:14 -07:00
docker-compose.sql Add config files for running Postgres inside Docker Compose (#3637) 2023-12-13 17:25:07 -05:00
docker-compose.yml Add config files for running Postgres inside Docker Compose (#3637) 2023-12-13 17:25:07 -05:00
Dockerfile chore: Upgrade to Rust 1.73 (#3096) 2023-10-06 14:50:29 +02:00
Procfile show warnings by default 2023-10-13 15:07:49 -06:00
Procfile.zed2 Add scripts for running Zed2 collab environment 2023-11-23 14:19:06 +01:00
README.md Update docs to refer to new zed-local script 2023-10-09 12:49:12 -07:00
rust-toolchain.toml chore: Upgrade to Rust 1.73 (#3096) 2023-10-06 14:50:29 +02:00

Zed

CI

Welcome to Zed, a lightning-fast, collaborative code editor that makes your dreams come true.

Development tips

Dependencies

  • Install Xcode from https://apps.apple.com/us/app/xcode/id497799835?mt=12, and accept the license:

    sudo xcodebuild -license
    
  • Install homebrew, node and rustup-init (rustup, rust, cargo, etc.)

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    brew install node rustup-init
    rustup-init # follow the installation steps
    
  • Install postgres and configure the database

    brew install postgresql@15
    brew services start postgresql@15
    psql -c "CREATE ROLE postgres SUPERUSER LOGIN" postgres
    psql -U postgres -c "CREATE DATABASE zed"
    
  • Install the LiveKit server, the PostgREST API server, and the foreman process supervisor:

    brew install livekit
    brew install postgrest
    brew install foreman
    
  • Ensure the Zed.dev website is checked out in a sibling directory and install its dependencies:

    cd ..
    git clone https://github.com/zed-industries/zed.dev
    cd zed.dev && npm install
    npm install -g vercel
    
  • Return to Zed project directory and Initialize submodules

    cd zed
    git submodule update --init --recursive
    
  • Set up a local zed database and seed it with some initial users:

    Create a personal GitHub token to run script/bootstrap once successfully: the token needs to have an access to private repositories for the script to work (repo OAuth scope). Then delete that token.

    GITHUB_TOKEN=<$token> script/bootstrap
    
  • Now try running zed with collaboration disabled:

    cargo run
    

Common errors

  • xcrun: error: unable to find utility "metal", not a developer tool or in PATH

Testing against locally-running servers

Start the web and collab servers:

foreman start

If you want to run Zed pointed at the local servers, you can run:

script/zed-local

Dump element JSON

If you trigger cmd-alt-i, Zed will copy a JSON representation of the current window contents to the clipboard. You can paste this in a tool like DJSON to navigate the state of on-screen elements in a structured way.

Licensing

We use cargo-about to automatically comply with open source licenses. If CI is failing, check the following:

  • Is it showing a no license specified error for a crate you've created? If so, add publish = false under [package] in your crate's Cargo.toml.
  • Is the error failed to satisfy license requirements for a dependency? If so, first determine what license the project has and whether this system is sufficient to comply with this license's requirements. If you're unsure, ask a lawyer. Once you've verified that this system is acceptable add the license's SPDX identifier to the accepted array in script/licenses/zed-licenses.toml.
  • Is cargo-about unable to find the license for a dependency? If so, add a clarification field at the end of script/licenses/zed-licenses.toml, as specified in the cargo-about book.

Wasm Plugins

Zed has a Wasm-based plugin runtime which it currently uses to embed plugins. To compile Zed, you'll need to have the wasm32-wasi toolchain installed on your system. To install this toolchain, run:

rustup target add wasm32-wasi

Plugins can be found in the plugins folder in the root. For more information about how plugins work, check the Plugin Guide in crates/plugin_runtime/README.md.