e4ebd3a
Fix crash in WgpuAtlas when viewing a screen share (#53088)
Click to expand commit body
When atlas tiles are rapidly allocated and freed (e.g. watching a shared
screen in Collab), a texture can become unreferenced and be removed
while GPU uploads for it are still pending. On the next frame,
`flush_uploads` indexes into the now-empty texture slot and panics:
```
thread 'main' panicked at crates/gpui_wgpu/src/wgpu_atlas.rs:231:40:
texture must exist...
#11 core::option::expect_failed
#12 gpui_wgpu::wgpu_atlas::WgpuAtlas::before_frame
#13 gpui_wgpu::wgpu_renderer::WgpuRenderer::draw
```
This change drains pending uploads for a texture when it becomes
unreferenced in `remove`, and skips uploads for missing textures in
`flush_uploads` as a safety net.
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Fixed occasional crashes when viewing a screen share
Oleksiy Syvokon
created
5edb40c
Use an object for docker compose ports rather than raw string (#53090)
Click to expand commit body
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #53048
Release Notes:
- Fixed serialization error with Docker Compose for dev containers
KyleBarton
created
d1e84f9
Document generate-action-metadata step for local docs preview (#53038)
Click to expand commit body
I needed to run the docs locally and ran into this error when following
the [docs
README.md](https://github.com/zed-industries/zed/blob/main/docs/README.md).
```
Error: Found 27 errors in docs
2026-04-01 10:15:39 [ERROR] (mdbook::utils): Error: The "zed_docs_preprocessor" preprocessor exited unsuccessfully with exit status: 1 status
```
It turns out I needed to run `script/generate-action-metadata` first.
This PR adds that step to the doc.
Self-Review Checklist:
- [X] I've reviewed my own diff for quality, security, and reliability
- [X] Unsafe blocks (if any) have justifying comments
- [X] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [X] Tests cover the new/changed behavior
- [X] Performance impact has been considered and is acceptable
Closes #ISSUE
Release Notes:
- N/A
Joseph T. Lyons
created
e93beb0
git_graph: Remove horizontal scrolling from canvas (#53082)
Click to expand commit body
I also added a keybinding to focus the search bar.
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #ISSUE
Release Notes:
- N/A or Added/Fixed/Improved ...
Self-Review Checklist:
- [x] 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)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #53042
Release Notes:
- Fixed dev container failing to open when Docker Compose file contains
`labels`
---------
Co-authored-by: KyleBarton <kjb@initialcapacity.io>
Om Chillure
and
KyleBarton
created
45d6a95
Track project groups in MultiWorkspace (#53032)
Click to expand commit body
This PR adds tracking of project groups to the MultiWorkspace and
serialization/restoration of them. This will later be used by the
sidebar to provide reliable reloading of threads across Zed reloads.
Release Notes:
- N/A
---------
Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
Eric Holk
,
Max Brunsfeld
, and
Mikayla Maki
created
0b984b5
Ignore user config when checking remote git URL for dev extensions (#52538)
Click to expand commit body
## Context
Fixes #48163
Also update the logic from `git remote -v` + manually parse => `git
remote get-url origin`
Not sure the best way to test this
## How to Review
<!-- Help reviewers focus their attention:
- For small PRs: note what to focus on (e.g., "error handling in
foo.rs")
- For large PRs (>400 LOC): provide a guided tour — numbered list of
files/commits to read in order. (The `large-pr` label is applied
automatically.)
- See the review process guidelines for comment conventions -->
## Self-Review Checklist
<!-- Check before requesting review: -->
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] 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
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Fixed rebuilding dev extensions when user git config contains url
rewriting rules
Brandon Chinn
created
90fcf85
fuzzy: Fix crash with Unicode chars whose lowercase expands to multiple codepoints (#52989)
Click to expand commit body
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #52973
## Problem
The file picker crashes with `highlight index N is not a valid UTF-8
boundary` when file paths contain Unicode characters whose lowercase
form expands to multiple codepoints. Turkish `İ` (U+0130) is the trigger
here: Rust's `char::to_lowercase()` turns it into `i` + combining dot
above (two codepoints). That expansion breaks the fuzzy matcher in two
ways:
1. The `j_regular` index mapping mixes the expanded lowercase index
space with the original character index space, so highlight positions
land on invalid byte boundaries.
2. The scoring matrices are allocated with the expanded length but
indexed with the original length as stride, so rows alias each other and
corrupt stored values.
Users with Turkish locale filenames were hitting this on v0.229.0 and
v0.230.0 stable.
## Fix
I went with simple 1:1 case mapping: a `simple_lowercase` helper in
`char_bag.rs` that takes only the first codepoint from `to_lowercase()`
and drops any trailing combining characters. For `İ` this gives `i`,
which is what anyone would actually type in a search query. The same
function is used in the matcher, the char bag pre-filter, and both
query-lowercasing call sites (`paths.rs` and `strings.rs`).
This gets rid of the `extra_lowercase_chars` BTreeMap, the `j_regular`
adjustment, and the matrix sizing discrepancy. The matcher now works
with a flat character array where `lowercase_candidate_chars.len() ==
candidate_chars.len()`, so there's no expanded-vs-original index space
to get wrong.
I also fixed `CharBag::insert`, which used `to_ascii_lowercase()` and
silently ignored non-ASCII characters. A file like `aİbİcdef.txt`
wouldn't show up when searching `ai` because `İ` was never registered as
`i` in the bag. It now goes through `simple_lowercase` too.
The alternative was keeping full case folding and fixing the index
tracking with a `Vec<usize>` mapping expanded positions back to
originals. That would work but keeps the dual-index-space complexity
that caused these bugs, plus adds a per-candidate allocation for the
mapping vector.
## Prior art
fzf uses Go's `unicode.To(unicode.LowerCase, r)`, which is simple case
mapping -- always one rune in, one rune out. `İ` maps to `i`, no
expansion.
VS Code's `String.toLowerCase()` does produce the expanded form, but the
scorer compares UTF-16 code units independently and sidesteps the
problem in practice.
Neither tool maintains a mapping between expanded and original index
spaces.
## Trade-off
Searching for the combining dot above (U+0307) won't match `İ` in a path
anymore. Nobody types combining characters in a file picker, and fzf
doesn't support it either.
## Screenshot
<img width="1282" height="458" alt="Screenshot 2026-04-02 at 09 56 34"
src="https://github.com/user-attachments/assets/720d327a-4855-4d4d-989e-cbd1c0657f97"
/>
Release Notes:
- Fixed a crash and improved matching and highlighting in the file
picker for paths with non-ASCII
characters (e.g., Turkish İ, ß, fi).
---------
Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>
David Alecrim
and
Oleksiy Syvokon
created
843615c
markdown: Fix visible escape characters in LSP diagnostics (#51766)
Click to expand commit body
Closes #51622
Before you mark this PR as ready for review, make sure that you have:
- [x] Added a solid test coverage and/or screenshots from doing manual
testing
- [x] Done a self-review taking into account security and performance
aspects
- [ ] Aligned any UI changes with the [UI
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
Release Notes:
- Fixed markdown escape characters being visible in LSP diagnostic
messages when leading whitespace caused indented code blocks
---------
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
João Soares
and
Smit Barmase
created
20f7308
Maintain root repo common dir path as a field on Worktree (#53023)
Click to expand commit body
This enables us to always different git worktrees of the same repo
together.
Depends on https://github.com/zed-industries/cloud/pull/2220
Release Notes:
- N/A
---------
Co-authored-by: Eric Holk <eric@zed.dev>
Max Brunsfeld
and
Eric Holk
created
134dec8
Add persistence to the `Show Occupied Channels` collab toggle (#53029)
Click to expand commit body
This PR adds persistence to the toggle state for the `Show Occupied
Channels` filter.
Also, while driving by, I:
- renamed a few variables to use `occupied` over `active`, which
should've happened in https://github.com/zed-industries/zed/pull/52531.
- extracted `"favorite_channels"` into a global
Self-Review Checklist:
- [X] I've reviewed my own diff for quality, security, and reliability
- [X] Unsafe blocks (if any) have justifying comments
- [X] 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
- [X] Performance impact has been considered and is acceptable
Closes #ISSUE
Release Notes:
- Added persistence to the `Show Occupied Channels` collab toggle.
- Make notification icons show up even for threads of the currently
active workspace
- When with a notification/any other status, replace thread item's agent
icon a status icon for higher visbility
- Remove hover state from currently active project/workspace's header
- Make project/workspace label brighter if I'm inside of it
- Adjust colors all around a bit (sidebar background and border, and
icons within the project header)
Release Notes:
- N/A
Follow-up to https://github.com/zed-industries/zed/pull/52781, adding
some different icons to better express the state in which the split diff
_is selected_ but _isn't active_, which happens when the editor is
smaller than a given amount of defined columns.
https://github.com/user-attachments/assets/2e7aaf6c-077f-4be5-9439-ce6c2050e63d
Release Notes:
- N/A
Danilo Leal
created
29609d3
language_model: Decouple from Zed-specific implementation details (#52913)
Click to expand commit body
This PR decouples `language_model`'s dependence on Zed-specific
implementation details. In particular
* `credentials_provider` is split into a generic `credentials_provider`
crate that provides a trait, and `zed_credentials_provider` that
implements the said trait for Zed-specific providers and has functions
that can populate a global state with them
* `zed_env_vars` is split into a generic `env_var` crate that provides
generic tooling for managing env vars, and `zed_env_vars` that contains
Zed-specific statics
* `client` is now dependent on `language_model` and not vice versa
Release Notes:
- N/A
Jakub Konka
created
34c77a0
collab_panel: Add small design adjustments (#52994)
Click to expand commit body
Some tiny tweaks so that things look just a bit tidier in the collab
panel.
| Before | After |
|--------|--------|
| <img width="594" height="276" alt="Screenshot 2026-04-02 at 11 39@2x"
src="https://github.com/user-attachments/assets/f542d131-dbc5-41eb-bc13-0ebce3cf19a6"
/> | <img width="592" height="260" alt="Screenshot 2026-04-02 at 11
34@2x"
src="https://github.com/user-attachments/assets/1198bc49-f780-433e-bb5d-6304f13703d6"
/> |
Release Notes:
- N/A
Danilo Leal
created
cb99ab4
Add PageUp/PageDown scrolling in agent view (#52657)
Click to expand commit body
Fixes #52656
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #52656
Release Notes:
- Added keybindings for scrolling in agent view
---------
Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>
Aleksei Gusev
and
Oleksiy Syvokon
created
34f51c1
agent_ui: Remeasure changed entries in the thread view list (#53017)
Click to expand commit body
This PR fixes an issue where, sometimes, you couldn't scroll all the way
to the bottom of the thread's content. The scrollbar would show up at
the bottom of the scrollable container but the content was visibly cut
off. Turns out that's a consequence of the top-down thread generation
introduced in https://github.com/zed-industries/zed/pull/52440, where
changing the list alignment to `Top` made it visible that sometimes, the
maximum scroll area would get underestimated because the items in the
thread view's list would have a stale height measurement. So, the way
this PR fixes the issue is by calling `splice_focusable` in the
`EntryUpdated` event, too, so that the height of the items in the
overdraw area get marked as unmeasured, triggering a list re-render and
re-measuring.
We started by writing a test at the list level that would reproduce the
regression but then later figured out that this is not an inherent list
problem; it was rather a problem with its use within the thread view
layer. Then, we explored writing a test that documented the regression,
but it turned out to be very hard to simulate this sort of set up in
which certain elements would have its height changed during streaming,
which would be how you'd get to a mismatched height situation.
Therefore, given `AcpThreadEvent::NewEntry` already called
`splice_focusable` and don't have a test for it, we figure it'd be safe
to move forward without one, too. We then introduced a helper that's now
shared between `AcpThreadEvent::NewEntry` and
`AcpThreadEvent::EntryUpdated`.
Release Notes:
- Agent: Fixed an issue where sometimes you couldn't scroll all the way
to the bottom of the thread even though there's visibly more content
below the fold.
Co-authored-by: Eric Holk <eric@zed.dev>
Danilo Leal
and
Eric Holk
created
05c749c
settings_ui: Make all number fields editable (#52986)
Click to expand commit body
Taking advantage that we do have this capability now within the number
field component. I initially thought that some wouldn't make sense to be
editable but upon further reflection, why not? The buttons continue to
work, but if you want to type a more precise value, it should be
possible, too!
Release Notes:
- N/A
Danilo Leal
created
dc3f5b9
cli: Add --dev-container flag to open project in dev container (#51175)
Click to expand commit body
## Before you mark this PR as ready for review, make sure that you have:
- [x] Added a solid test coverage and/or screenshots from doing manual
testing
- [x] Done a self-review taking into account security and performance
aspects
- [x] Aligned any UI changes with the [UI
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
## Summary
Adds a `--dev-container` CLI flag that automatically triggers "Reopen in
Dev Container" when a `.devcontainer/` configuration is found in the
project directory.
```sh
zed --dev-container /path/to/project
```
## Motivation
This enables fully scripted dev container workflows — for example,
creating a git worktree and immediately opening it in a dev container
without any manual UI interaction:
```sh
git worktree add ../feature-branch
zed --dev-container ../feature-branch
```
The dev container modal fires automatically once the workspace finishes
initializing, so the environment is ready by the time you look at the
window. This is useful for automation scripts that prepare environments
and kick off agent runs for tasks like bug report triage.
Here's an [example
script](https://github.com/antont/todo-rs-ts/blob/main/scripts/devcontainer-new.sh)
that creates a worktree and opens it as a dev container in one step.
Related: #48682 requests a `devcontainer://` protocol for connecting to
already-running dev containers — a complementary but different use case.
This PR covers the "open project and trigger dev container setup" path.
## How it works
- The `--dev-container` flag flows through the CLI IPC protocol to the
workspace as an `open_in_dev_container` option.
- On the first worktree scan completion, if devcontainer configs are
detected, the dev container modal opens automatically.
- If no `.devcontainer/` config is found, the flag is cleared and a
warning is logged.
## Notable changes
- **`Workspace::worktree_scans_complete`** promoted from `#[cfg(test)]`
to production. It was only test-gated because it had no production
callers — it's a pure read-only future with no side effects.
- **`suggest_on_worktree_updated`** now takes `&mut Workspace` to read
and clear the CLI flag.
- Extracted **`open_dev_container_modal`** helper shared between the CLI
code path and the suggest notification.
## Test plan
- [x] `cargo test -p zed open_listener` — includes
`test_dev_container_flag_opens_modal` and
`test_dev_container_flag_cleared_without_config`
- [x] `cargo test -p recent_projects` — existing suggest tests still
pass
- [x] Manual: `cargo run -- --dev-container
/path/to/project-with-devcontainer` opens the modal
Release Notes:
- Added `--dev-container` CLI flag to automatically open a project in a
dev container when `.devcontainer/` configuration is present.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Toni Alatalo
and
Claude Opus 4.6
created
fbdeb93
devcontainer: Implement remote support for git checkpoint operations (#48896)
Click to expand commit body
Closes #47907
Implements the four git checkpoint operations (`create`, `restore`,
`compare`, `diff`) that had been stubbed out for remote repositories,
and related test infrastructure.
Testing steps:
1. Open a project with a `.devcontainer` configuration and connect to
the Dev Container
2. Open an Agent thread and ask the agent to make a code change
3. After the agent completes, verify the "Restore from checkpoint"
button appears (previously missing in Dev Container sessions)
4. Click "Restore from checkpoint" and confirm the file reverts to its
prior state
Release Notes:
- Added support for git checkpoint operations in remote/Dev Container
sessions, restoring the "Restore from checkpoint" button in Agent
threads.
---------
Co-authored-by: KyleBarton <kjb@initialcapacity.io>
Oliver Azevedo Barnes
and
KyleBarton
created
bd6dada
languages: Change syntax highlighting for JSX elements (#49881)
Click to expand commit body
Syntax highlighting and its customization are very important to many
developers, including me. I've looked through a number of issues and
discussions on this topic and haven't found any active PRs. Currently,
there's no way to customize highlighting for custom JSX tags, as they
use `@type`. Since TSX has a particularly complex syntax and can often
contain types/aliases/generics/tags in a dense sequence, they all blends
into a single color and makes it difficult to "parse" by eyes.
To avoid proposing something arbitrary, I looked into how this is done
elsewhere.
- VS Code `support.class.component.tsx`
[TypeScriptReact.tmLanguage.json](https://github.com/microsoft/vscode/blob/724656efa2c26ab6e7eb2023426dcf2658dc3203/extensions/typescript-basics/syntaxes/TypeScriptReact.tmLanguage.json#L5802)
But it relies on both legacy [tmLanguage naming
conventions](https://macromates.com/manual/en/language_grammars#:~:text=rarely%20be%20used\).-,support,-%E2%80%94%20things%20provided%20by)
and the outdated assumption that React components are always classes.
- ReScript `@tag`
[rescript-zed](https://github.com/rescript-lang/rescript-zed/blob/b3930c1754ab2762938244546ea2c7fb97d01cb3/languages/rescript/highlights.scm#L277)
It's not entirely correct to just use a `@tag` - it's better to
distinguish JSX Intrinsic Elements from custom ones.
- Vue `@tag @tag.component.type.constructor`
[zed-extensions/vue](https://github.com/zed-extensions/vue/blob/2697588c5cde11375d47f53f9449af8e32600d81/languages/vue/highlights.scm#L9C21-L9C52)
- Svelte `@tag @tag.component.type.constructor`
[zed-extensions/svelte](https://github.com/zed-extensions/svelte/blob/ae381a1217d14c26cbedfaf84b0a2f5ae508f40c/languages/svelte/highlights.scm#L46C21-L46C52)
The similarity between Vue and Svelte implementations (perhaps one
borrowed from the other) didn't seem coincidental and the approach felt
appropriate.
**I decided to adopt the same one to maintain consistency for theme
creators.**
So, how it looks:
**Release (0.224.9) version**
<img width="440" height="220" alt="zed-one-release"
src="https://github.com/user-attachments/assets/6f8726c5-a17e-4387-941c-69e5c1569049"
/>
**Local version with changes** - no breaking changes for builtin themes
- uses `type` color as before and can be changed in themes separately if
needed
<img width="440" height="220" alt="zed-one-local"
src="https://github.com/user-attachments/assets/a11cc5ed-20fc-45d2-8ebd-a908503999c3"
/>
**Local version with changes and theme overrides**
<img width="440" height="220" alt="zed-one-with-overrides"
src="https://github.com/user-attachments/assets/1997bd5b-7fa4-4346-8338-b5d61e9e832b"
/>
With these changes in the config:
```jsonc
"theme_overrides": {
"One Light": {
"syntax": {
// "tag.component" also matches
"type.component": {
"color": "#d3604fff",
},
},
},
},
```
I'm pretty sure this will help many developers enjoy Zed even more.
Release Notes:
- Improved syntax highlighting for custom jsx elements in TSX and
JavaScript languages. Theme authors and users can now highlight these in
their theme/theme overrides using `tag.component.jsx`
finico
created
efc53c2
docs: Center and re-flow perf images (#53004)
Click to expand commit body
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #ISSUE
Release Notes:
- N/A or Added/Fixed/Improved ...
Co-authored-by: Joseph T. Lyons <JosephTLyons@gmail.com>
Miguel Raz Guzmán Macedo
and
Joseph T. Lyons
created
After #52953 gets merged the git graph will be ready for it's preview
release, so we can finally remove the feature flag! AKA this PR releases
the git graph
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
Closes #ISSUE
Release Notes:
- Add Git Graph. Can be accessed through the button on the bottom of the
git panel or the `git graph: Open` action
Anthony Eid
created
06f939d
Expose flexible panel settings in settings UI (#52946)
Click to expand commit body
Release Notes:
- Added controls to the settings UI for whether the terminal and agent
panels use flexible width.
Max Brunsfeld
created
c02ea54
docs: Update typefaces and some other styles (#52992)
Click to expand commit body
Update the heading typeface to use IBM Plex Serif, the code typeface to
use Lilex (IBM Plex Mono), and pull them from the zed.dev CDN. Also
added some stray design adjustments here and there.
Release Notes:
- N/A
Danilo Leal
created
73cd7ec
git_graph: Make the graph canvas resizable (#52953)
Click to expand commit body
### Summary
This PR integrates the git graph canvas with the `Table` component’s
`RedistributableColumnsState`, making the graph column resizable while
preserving the table’s existing resize behavior. In particular, column
resizing continues to use the same cascading redistribution behavior as
the table. This is also the last PR needed to remove the feature flag on
the git graph!
### Table API changes
I pulled the redistributable column logic out of `Table` into reusable
UI helpers so layouts outside of `Table` can participate in the same
column resizing behavior. This adds a shared
`RedistributableColumnsState` API, along with helpers for binding
drag/drop behavior, rendering resize handles, and constructing header
resize metadata. I also added `ColumnWidthConfig::explicit` and
`TableRenderContext::for_column_widths` so callers can render table like
headers and content with externally managed column widths.
The reason for this change is that the git graph now renders a custom
split layout: a graph canvas on the left and table content on the right.
By reusing the same column state and resize machinery, the graph column
can resize together with the table columns while preserving the existing
table behavior, including cascading column redistribution and double
click reset to default sizing.
I also adjusted the resize handle interaction styling so the divider
stays in its hovered/highlighted state while a drag is active, which
makes the drag target feel more stable and visually consistent during
resizing.
### Preview
https://github.com/user-attachments/assets/347eed71-0cc1-4db4-9dee-a86ee5ab6f91
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] 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
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A or Added/Fixed/Improved ...
Anthony Eid
created
d3435b1
Update links to troubleshooting images (#52851)
Click to expand commit body
Now that I've started migrating blog content into the `zeddotdev-images`
bucket, I've added a bit of structure.
`/blog`
`/docs`
This PR just updates the links so we can stay organized going forward.
Shouldn't be seeing much thrash like this after this PR.
Release Notes:
- N/A
Joseph T. Lyons
created
66ea4b8
ep: Move pure diffing functions to zeta_prompt:udiff (#52959)
Click to expand commit body
This PR mostly moves some code around. It also adds a high-level
`format_expected_output` function that routes patch formatting to
specific prompt formats. This was `zeta_prompt` can format
`expected_output` for training.
Keeping everything prompt-related in a "pure" module (with no heavy
dependencies) makes it easier to write bindings.
Release Notes:
- N/A
Oleksiy Syvokon
created
f8d6467
Fixup and test edit prediction mocks (#52991)
Click to expand commit body
Follow-up of https://github.com/zed-industries/zed/pull/40185
Release Notes:
- N/A
## Summary
- PR #48109 changed the capture name for C/C++ preprocessor directives
from `@keyword.directive` to `@preproc`. While semantically correct, the
builtin themes had `preproc` defined with colors nearly
indistinguishable from plain text (e.g. One Dark `#dce0e5ff`, Ayu Dark
`#bfbdb6ff`), making `#include`, `#define`, etc. appear unhighlighted.
- This PR updates the `preproc` color in all builtin themes (and the
fallback theme) to match their respective `keyword` color, restoring
visible highlighting for preprocessor directives.
Fixes #49024
## Side effects
- Go uses `@preproc` for `//go:` and `// +build` compiler directives.
These will also change from the previous muted gray to the keyword
color. This is arguably an improvement — compiler directives are special
constructs that benefit from visible highlighting, consistent with how
other editors (CLion, VS Code) handle them.
## Test plan
- [x] `cargo test -p language highlight_map` passes
- [x] Open a C/C++ file and verify `#include`, `#define`, `#ifdef`, etc.
are highlighted with the keyword color
- [x] Verify across multiple builtin themes (One Dark, Ayu Dark, Gruvbox
Dark, etc.)
- [x] Open a Go file and verify `//go:` directives are highlighted
reasonably
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Release Notes:
- Fixed C/C++ preprocessor directives (`#include`, `#define`, etc.)
appearing unhighlighted in builtin themes.
---------
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: MrSubidubi <finn@zed.dev>
Wuji Chen
,
Claude
, and
MrSubidubi
created
e0b9c3a
Add support for `diff.plus` and `diff.minus` highlight captures (#45459)
Click to expand commit body
- Update diff in highlights.scm to use semantic @diff.plus and
@diff.minus tokens
- Add diff.plus, diff.minus tokens to fallback theme
- Add diff syntax tokens to all official themes (One, Gruvbox, Ayu)
This fixes the issue where diff files showed inverted colors (additions
in purple/blue, deletions in green) by using proper semantic tokens
instead of @string and @keyword.
Related discussion in https://github.com/zed-industries/zed/issues/34057
(thought there might be second issue in that issue)
Release Notes:
- Added support for diff.plus, diff.minus and diff.deleta theme
selectors in the diff syntax grammar. Previously diff.plus was mapped to
@string and diff.minus was mapped to @keyword.
*Before:*
<img width="689" height="566" alt="Screenshot 2025-12-20 at 10 58 34 AM"
src="https://github.com/user-attachments/assets/b7ae4428-2011-4ec2-a803-7e30599e1715"
/>
*After:*
<img width="659" height="548" alt="Screenshot 2025-12-20 at 10 58 30 AM"
src="https://github.com/user-attachments/assets/02df31b5-1f1a-40af-adf0-1ac34457cdd4"
/>
*Before:*
<img width="650" height="545" alt="Screenshot 2025-12-20 at 10 58 16 AM"
src="https://github.com/user-attachments/assets/78b348bd-1b91-478b-a850-8e526adcfb3c"
/>
*After:*
<img width="627" height="563" alt="Screenshot 2025-12-20 at 10 58 21 AM"
src="https://github.com/user-attachments/assets/1176d626-563f-455a-9902-137f646eb8f2"
/>
*Before:*
<img width="628" height="550" alt="Screenshot 2025-12-20 at 10 58 06 AM"
src="https://github.com/user-attachments/assets/d819f478-bb2d-4afd-8013-c4e1a2f64dfe"
/>
*After:*
<img width="643" height="642" alt="Screenshot 2025-12-20 at 10 56 00 AM"
src="https://github.com/user-attachments/assets/e0f03549-77ed-4a47-b1da-239b519b90f4"
/>
---------
Co-authored-by: Finn Evers <finn.evers@outlook.de>
Co-authored-by: MrSubidubi <finn@zed.dev>
Bret Comnes
,
Finn Evers
, and
MrSubidubi
created
a7248e8
Don't save buffers by default when running tasks (#52976)
Click to expand commit body
Self-Review Checklist:
- [x] 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
Closes #52926
Follow-up to #48861
cc @SomeoneToIgnore
Release Notes:
- Edited buffers are no longer saved by default before running a task,
but you can still configure this using the "save" field in `tasks.json`.
---------
Co-authored-by: Kirill Bulatov <mail4score@gmail.com>
Self-Review Checklist:
- [X] 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
Release Notes:
- Added the option for highlights from languages to specify fallbacks.
That means that if you have a pattern with the captures `@second.capture
@first.capture`, Zed will first try resolving a highlight from your
theme for the code fragment using the first capture, then look for the
second capture if no match for the first capture could be found.
---------
Co-authored-by: Kirill Bulatov <kirill@zed.dev>
Finn Evers
and
Kirill Bulatov
created
f92b498
docs: Remove incomplete section in extension publishing steps (#52980)
Click to expand commit body
Release Notes:
- N/A
Finn Evers
created
63b0791
agent_ui: Skip restoring external threads without metadata (#52978)
Click to expand commit body
Make sure we don't try and load a thread we don't have metadata for and
therefore is unlikely to exist
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
Ben Brandt
created
29955a0
sidebar: Fix draft threads showing up in the sidebar in some cases (#52974)
Click to expand commit body
We were inserting threads with no entries into the sidebar, when you
clicked on New Thread, typed a message and then added a new project to
the current workspace.
We now skip persisting threads when they are empty.
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
---------
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
This was missing from the previous permissions changes.
Self-Review Checklist:
- [X] 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
- [X] Performance impact has been considered and is acceptable
Release Notes:
- N/A
Finn Evers
created
de28867
editor: Support disabling semantic token highlighting via empty rules (#52963)
Click to expand commit body
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #52882, should help #52723
According to the [Zed
documentation](https://zed.dev/docs/semantic-tokens#example-disabling-a-token-type),
users should be able to disable semantic highlighting for a specific
token type by adding an empty rule in `settings.json`.
However, the current implementation fails to respect this because its
merging logic allows lower-priority default styles to "leak through"
even when a matching high-priority rule is empty. This makes it
impossible to selectively disable semantic tokens to reveal the
underlying Tree-sitter highlighting when using "semantic_tokens":
"combined". This is particularly problematic for extensions that provide
specialized Tree-sitter queries which are currently being obscured by
less desirable semantic tokens(#52723).
This PR fixes the logic to ensure that a completely empty high-priority
rule acts as an opaque override, correctly disabling semantic styling
for that token type and allowing Tree-sitter highlighting to show
through as intended.
Release Notes:
- Fixed a bug where semantic token highlighting could not be disabled
via empty rules in `settings.json`.
Xin Zhao
created
65e7550
helix: Fix crash while moving through selections (#52922)
Click to expand commit body
Closes #51573
Closes #52852 * I believe, looking for verification of that.
A very similar issue was belived to be fixed with #51642 , however it
seems like there is still some edge cases that were causing crashes.
These issues appeared to me to be caused by the dedup method failing to
catch sub-ranges (created by entering SelectMode after the search) as
duplicates.
two new tests that isolate the case in 51573 and 52852 respectively.
fixed vid:
https://github.com/user-attachments/assets/f62d5210-6cb3-4bdf-a061-efc265eb2804
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- helix: Fix search selection range deduplication logic
Finn Eitreim
created
4eb7ae8
util: Fix `failed to load env variables` on Windows when users have custom terminal shell args (#51787)
Click to expand commit body
Closes #46933
Before you mark this PR as ready for review, make sure that you have:
- [x] Added a solid test coverage and/or screenshots from doing manual
testing
- [x] Done a self-review taking into account security and performance
aspects
- [x] NO UI CHANGES
Release Notes:
- Fixed `Failed to load shell environment` errors on Windows when users
have custom terminal shell arguments configured (e.g., cmd.exe with `/k
echo Hello` or similar startup commands)
This fixes three pre-existing issues in the visual test runner that were
never caught because visual tests aren't run in CI.
## Fixes
**1. Re-entrant read panic in sidebar creation (3 places)**
`Sidebar::new` reads the `MultiWorkspace` entity, so creating it inside
a `multi_workspace.update()` closure causes a `cannot read while being
updated` panic. Fixed by using `update_window` with
`root_view.downcast()` to get the handle without holding a mutable
borrow.
**2. Tooltip entity leak in breakpoint_hover test**
The tooltip system has an Rc cycle (`ActiveTooltip::Visible` holds a
`check_visible_and_update` closure that captures the
`Rc<RefCell<Option<ActiveTooltip>>>`). This cycle is normally broken
when the tooltip is dismissed, but the test closed the window while the
tooltip was still visible, causing a panic from the leak detector. Fixed
by simulating a click before cleanup to dismiss the tooltip.
**3. Visual tests not in CI**
Added a `cargo_run_visual_tests` step to the macOS test job via xtask so
these tests run on every PR and regressions are caught early.
Release Notes:
- N/A
Richard Feldman
created
3bc55a4
agent_ui: Improve auto-scroll when editing previous messages (#52876)
Click to expand commit body
This PR improves the unreliability of the new top-down flow when editing
previous user messages. Previously, sometimes the thread wouldn't
auto-scroll as you're editing older messages and re-submitting them. It
turns out, the culprit seems to be a bit of a race condition where the
Stopped event (which sets the follow_tail method to false) could still
be emitted a while after a generation has been stopped. So depending on
time, one given possibility could happen. But now, this is what we do:
- If it is still generating, that means the stop/error event is stale
relative to a newer turn, so we do not run the cleanup that disables
follow-tail.
- If it is not generating, then it’s a real completion for the active
turn, and we do the normal cleanup.
---
Release Notes:
- N/A
Danilo Leal
created
20368ba
Collect main worktree paths on threads, and query them in the sidebar (#52945)
Click to expand commit body
This PR has us collecting the main worktree path metadata for the
sidebar, allows us to query by that path, and in the interim adds in
logic for querying the main worktree paths. This means that, as this
change percolates, there shouldn't be much difference between opening a
workspace to a linked worktree, and opening a workspace to the main
worktree.
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
## Context
This PR introduces a `base` field for settings profiles to allow
profiles to either overlay `user` settings or to overlay `default`,
which is simply zed's defaults (user settings are skipped). I'm not
entirely sure I love `default` because it's a bit confusing (there's a
setting called `default` but the default is `user`). Another idea I had
was `factory` (`user` (default) or `factory`) - curious to hear from the
reviewers. This will be useful for those of us who need to quickly flip
to a default state, or a default state with some customizations on top.
Additionally, from what I can tell, VS Code's profile system is more in
line with what this PR is offering in Zed - profiles overlay the default
settings, not the user's customization layer. So this will be familiar
for those users.
I've had no issue with the migrator, code is pretty simple there, but
would love for @smitbarmase to review the migration to make sure I'm not
missing something.
## Self-Review Checklist
<!-- Check before requesting review: -->
- [X] I've reviewed my own diff for quality, security, and reliability
- [x] 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)
- [X] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Improved the flexibility of settings profiles by offering a way for
profiles to lay atop of zed defaults, skipping user settings all
together. Settings Profiles now take the following form.
```json5
"Your Profile": {
"base": "user" // or "default"
"settings": {
// ...
},
},
```
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #ISSUE
Release Notes:
- N/A
Max Brunsfeld
,
Eric Holk
, and
Mikayla Maki
created
b05a240
ep: Add the predicted kept characters metric [WIP] (#50566)
Click to expand commit body
Release Notes:
- N/A
---------
Co-authored-by: Ben Kunkle <ben@zed.dev>
Oleksiy Syvokon
and
Ben Kunkle
created
bbde01a
Fix a bug where the draft thread was being spuriously dropped from the sidebar (#52936)
Click to expand commit body
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
Mikayla Maki
created
94ea487
Fix stale buffer snapshot used in diagnostics multibuffer (#52937)
Click to expand commit body
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] 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
- [x] Performance impact has been considered and is acceptable
Release Notes:
- N/A
Co-authored-by: Conrad <conrad@zed.dev>
Cole Miller
and
Conrad
created
34b8d58
sidebar: Add button to open the remote projects modal in projects picker (#52932)
Click to expand commit body
This PR adds a button in the sidebar's recent projects picker to open
the remote projects modal, matching how the recent project modal itself
is. Here's the result:
<img width="400" height="428" alt="Screenshot 2026-04-01 at 7 12@2x"
src="https://github.com/user-attachments/assets/b23ff896-6d42-4ea7-92ba-9d3d092c5f03"
/>
Release Notes:
- N/A