mirror of
https://github.com/zed-industries/zed.git
synced 2026-05-24 21:59:04 +00:00
Some checks are pending
Congratsbot / check-author (push) Waiting to run
Congratsbot / congrats (push) Blocked by required conditions
deploy_nightly_docs / deploy_docs (push) Waiting to run
run_tests / check_postgres_and_protobuf_migrations (push) Blocked by required conditions
run_tests / orchestrate (push) Waiting to run
run_tests / check_style (push) Waiting to run
run_tests / extension_tests (push) Blocked by required conditions
run_tests / clippy_windows (push) Blocked by required conditions
run_tests / clippy_linux (push) Blocked by required conditions
run_tests / clippy_mac (push) Blocked by required conditions
run_tests / clippy_mac_x86_64 (push) Blocked by required conditions
run_tests / run_tests_windows (push) Blocked by required conditions
run_tests / run_tests_linux (push) Blocked by required conditions
run_tests / run_tests_mac (push) Blocked by required conditions
run_tests / doctests (push) Blocked by required conditions
run_tests / check_workspace_binaries (push) Blocked by required conditions
run_tests / build_visual_tests_binary (push) Blocked by required conditions
run_tests / check_wasm (push) Blocked by required conditions
run_tests / check_dependencies (push) Blocked by required conditions
run_tests / check_docs (push) Blocked by required conditions
run_tests / check_licenses (push) Blocked by required conditions
run_tests / check_scripts (push) Blocked by required conditions
run_tests / tests_pass (push) Blocked by required conditions
Self-Review Checklist: - [ ] I've reviewed my own diff for quality, security, and reliability - [ ] Unsafe blocks (if any) have justifying comments - [ ] The content is consistent with the [UI/UX checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist) - [ ] Tests cover the new/changed behavior - [ ] Performance impact has been considered and is acceptable Change the actions in docs to adopt the right format. Release Notes: - N/A
159 lines
6.4 KiB
Markdown
159 lines
6.4 KiB
Markdown
# Zed Docs
|
|
|
|
Welcome to Zed's documentation.
|
|
|
|
This is built on push to `main` and published automatically to [https://zed.dev/docs](https://zed.dev/docs).
|
|
|
|
To preview the docs locally you will need to install [mdBook](https://rust-lang.github.io/mdBook/) (`cargo install mdbook@0.4.40`), generate the action metadata, and then serve:
|
|
|
|
```sh
|
|
script/generate-action-metadata
|
|
mdbook serve docs
|
|
```
|
|
|
|
The first command dumps an action manifest to `crates/docs_preprocessor/actions.json`. Without it, the preprocessor cannot validate keybinding and action references in the docs and will report errors. You only need to re-run it when actions change.
|
|
|
|
It's important to note the version number above. For an unknown reason, as of 2025-04-23, running 0.4.48 will cause odd URL behavior that breaks things.
|
|
|
|
Before committing, verify that the docs are formatted in the way Prettier expects with:
|
|
|
|
```
|
|
cd docs && pnpm dlx prettier@3.5.0 . --write && cd ..
|
|
```
|
|
|
|
## Preprocessor
|
|
|
|
We have a custom mdBook preprocessor for interfacing with our crates (`crates/docs_preprocessor`).
|
|
|
|
If for some reason you need to bypass the docs preprocessor, you can comment out `[preprocessor.zed_docs_preprocessor]` from the `book.toml`.
|
|
|
|
## Images and videos
|
|
|
|
To add images or videos to the docs, upload them to another location (e.g., zed.dev, GitHub's asset storage) and then link out to them from the docs.
|
|
|
|
Putting binary assets such as images in the Git repository will bloat the repository size over time.
|
|
|
|
## Internal notes:
|
|
|
|
- We have a Cloudflare router called `docs-proxy` that intercepts requests to `zed.dev/docs` and forwards them to the "docs" Cloudflare Pages project.
|
|
- The CI uploads a new version to the Cloudflare Pages project from `.github/workflows/deploy_docs.yml` on every push to `main`.
|
|
|
|
### Table of Contents
|
|
|
|
The table of contents files (`theme/page-toc.js` and `theme/page-doc.css`) were initially generated by [`mdbook-pagetoc`](https://crates.io/crates/mdbook-pagetoc).
|
|
|
|
Since all this preprocessor does is generate the static assets, we don't need to keep it around once they have been generated.
|
|
|
|
## Referencing Keybindings and Actions
|
|
|
|
When referencing keybindings or actions, use the following formats:
|
|
|
|
### Keybindings
|
|
|
|
{#kb scope::Action} - e.g., {#kb zed::OpenSettings}.
|
|
|
|
This will output a code element like: `<code>Cmd + , | Ctrl + ,</code>`. We then use a client-side plugin to show the actual keybinding based on the user's platform.
|
|
|
|
By using the action name, we can ensure that the keybinding is always up-to-date rather than hardcoding the keybinding.
|
|
|
|
#### Keymap Overlays
|
|
|
|
`{#kb:keymap_name scope::Action}` - e.g., `{#kb:jetbrains editor::GoToDefinition}`.
|
|
|
|
This resolves the keybinding from a keymap overlay (e.g., JetBrains) first, falling back to the default keymap if the overlay doesn't define a binding for that action. This is useful for sections where the documentation expects a special base keymap to be configured.
|
|
|
|
Supported overlays: `jetbrains`.
|
|
|
|
### Actions
|
|
|
|
{#action scope::Action} - e.g., {#action zed::OpenSettings}.
|
|
|
|
This will render a human-readable version of the action name, e.g., "zed: open settings", and will allow us to implement things like additional context on hover, etc.
|
|
|
|
### Creating New Templates
|
|
|
|
Templates are functions that modify the source of the docs pages (usually with a regex match and replace).
|
|
You can see how the actions and keybindings are templated in `crates/docs_preprocessor/src/main.rs` for reference on how to create new templates.
|
|
|
|
## Consent Banner
|
|
|
|
We pre-bundle the `c15t` package because the docs pipeline does not include a JS bundler. If you need to update `c15t` and rebuild the bundle, use:
|
|
|
|
```
|
|
mkdir c15t-bundle && cd c15t-bundle
|
|
npm init -y
|
|
npm install c15t@<version> esbuild
|
|
echo "import { getOrCreateConsentRuntime } from 'c15t'; window.c15t = { getOrCreateConsentRuntime };" > entry.js
|
|
npx esbuild entry.js --bundle --format=iife --minify --outfile=c15t@<version>.js
|
|
cp c15t@<version>.js ../theme/c15t@<version>.js
|
|
cd .. && rm -rf c15t-bundle
|
|
```
|
|
|
|
Replace `<version>` with the new version of `c15t` you are installing. Then update `book.toml` to reference the new bundle filename.
|
|
|
|
### References
|
|
|
|
- Template Trait: `crates/docs_preprocessor/src/templates.rs`
|
|
- Example template: `crates/docs_preprocessor/src/templates/keybinding.rs`
|
|
- Client-side plugins: `docs/theme/plugins.js`
|
|
|
|
## Postprocessor
|
|
|
|
A postprocessor is implemented as a sub-command of `docs_preprocessor` that wraps the built-in HTML renderer and applies post-processing to the HTML files, to add support for page-specific title and `meta` tag description values.
|
|
|
|
An example of the syntax can be found in `git.md`, as well as below:
|
|
|
|
```md
|
|
---
|
|
title: Some more detailed title for this page
|
|
description: A page-specific description
|
|
---
|
|
|
|
# Editor
|
|
```
|
|
|
|
The above code will be transformed into (with non-relevant tags removed):
|
|
|
|
```html
|
|
<head>
|
|
<title>Editor | Some more detailed title for this page</title>
|
|
<meta name="description" contents="A page-specific description" />
|
|
</head>
|
|
<body>
|
|
<h1>Editor</h1>
|
|
</body>
|
|
```
|
|
|
|
If no front matter is provided, or if one or both keys aren't provided, the `title` and `description` will be set based on the `default-title` and `default-description` keys in `book.toml` respectively.
|
|
|
|
### Implementation details
|
|
|
|
Unfortunately, mdBook does not support post-processing like it does pre-processing, and only supports defining one description to put in the `meta` tag per book rather than per file.
|
|
So in order to apply post-processing (necessary to modify the HTML `head` tags) the global book description is set to a marker value `#description#` and the HTML renderer is replaced with a sub-command of `docs_preprocessor` that wraps the built-in HTML renderer and applies post-processing to the HTML files, replacing the marker value and the `<title>(.*)</title>` with the contents of the front matter if there is one.
|
|
|
|
### Known limitations
|
|
|
|
The front matter parsing is extremely simple, which avoids needing to take on an additional dependency, or implement full YAML parsing.
|
|
|
|
- Double quotes and multi-line values are not supported, i.e. Keys and values must be entirely on the same line, with no double quotes around the value.
|
|
|
|
The following will not work:
|
|
|
|
```md
|
|
---
|
|
title: Some
|
|
Multi-line
|
|
Title
|
|
---
|
|
```
|
|
|
|
neither this:
|
|
|
|
```md
|
|
---
|
|
title: "Some title"
|
|
---
|
|
```
|
|
|
|
- The front matter must be at the top of the file, with only white-space preceding it.
|
|
- The contents of the `title` and `description` will not be HTML escaped. They should be simple ASCII text with no unicode or emoji characters.
|