361801e527
This is an exploration of what it would take to remove the `V` generic from the element type. Answer: less than I expected. I added a new struct to GPUI2: `CallbackHandle<Event>`, and reworked the interactivity related APIs to take this type. I also added a `.callback()` function to `ViewContext` that can construct a `CallbackHandle` to wrap our current `|&mut View, &Evt, &mut ViewContext| {...}` based APIs. With these two changes, we can now capture the context of the callsite of a click handler, allowing us to capture all relevant types and data _before_ sending them into GPUI. This lets us achieve a similar programing style to the existing system, while also letting us remove all of the generics from the entire element system. For an example of what this looks like in practice, here's a side by side diff of the test in `interactive.rs` (which compiles and passes): <img width="1310" alt="Screenshot 2023-11-19 at 7 32 08 PM" src="https://github.com/zed-industries/zed/assets/2280405/596f2a9a-9c8e-4158-bf6d-0003cf973015"> Note how the new arrangement of types is more amenable to rust's type inference, allowing the code to be just as terse as before despite the extra function call in the middle. This approach also allows components to provide well typed APIs to views, without ever knowing that view's type. This PR includes an example rewrite of the button component in `ui2`, here's what it's struct could look like now: <img width="1105" alt="Screenshot 2023-11-19 at 7 24 28 PM" src="https://github.com/zed-industries/zed/assets/2280405/fc98d3c2-6831-4c0f-a324-ab0fae33b0bc"> However, I have not yet ported the derive macro for Component to this new structure, as I know @nathansobo is currently reworking that code. Once that macro has been rewritten, it should be relatively easy to rewrite the rest of Zed2 with this approach, the only major difference that I can foresee is that the editor element would need to wrap it's operations in an update callback. Though I can think of a few ways to fix this with a new `ViewElement` trait, that does the wrapping for you. |
||
---|---|---|
.cargo | ||
.config | ||
.github | ||
.vscode | ||
.zed | ||
assets | ||
crates | ||
docs | ||
plugins | ||
script | ||
styles | ||
.dockerignore | ||
.gitignore | ||
.gitmodules | ||
Cargo.lock | ||
Cargo.toml | ||
Dockerfile | ||
Procfile | ||
README.md | ||
rust-toolchain.toml | ||
test.rs |
Zed
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, thePostgREST
API server, and theforeman
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
- You need to install Xcode and then run:
xcode-select --switch /Applications/Xcode.app/Contents/Developer
- (see https://github.com/gfx-rs/gfx/issues/2309)
- You need to install Xcode and then run:
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, addpublish = 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 theaccepted
array inscript/licenses/zed-licenses.toml
. - Is
cargo-about
unable to find the license for a dependency? If so, add a clarification field at the end ofscript/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
.