Commit Graph
31406 Commits
Author SHA1 Message Date
Lukas Wirth 07a2108a1d Always pass --no-optional-lock to git (#52499)
Release Notes:

- N/A or Added/Fixed/Improved ...
2026-03-27 15:38:53 +01:00
Piotr Osiewicz 5bfedcb023 theme: Split out theme_settings crate (#52569)
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:

- N/A
2026-03-27 14:41:25 +01:00
Jakub Charvat 36b51a14ad Fix unformatted error contexts (#52568)
When debugging a remote SSH connection, I came across an unformatted
format string in the output log. I changed the raw `.context(fmt)` call
to a `.with_context(|| format!(fmt))`. I ran a quick sweep through the
codebase to identify and fix two other instances of the same issue.

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
2026-03-27 15:06:21 +02:00
Anthony Eid fe3a6e5802 git: Forbid deleting current git worktree or branch from picker (#52327)
## Context

This just makes the UI enforce some git cli rules more clearly and
prevents some unexpected behavior.

## 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)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
2026-03-27 09:01:01 -04:00
Ben Vollrathanddino e0872de219 editor: Autoscroll to initial selection on select all matches edit (#49232)
Fix the way selections are built in `Editor::select_all_matches` in
order to guarantee that the original selection, where the user's cursor
is located, is the last selection provided to
`MutableSelectionsCollection::select_ranges` as the editor will attempt
to scroll to the last selection when the user starts editing.

This way, we ensure that the user stays in the same location from which
the `editor: select all matches` action was triggered when they start
editing.

Closes #32894

Release Notes:

- Fixed an issue where editing selections after `editor: select all
matches` would scroll to the last match

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>
2026-03-27 10:44:46 +00:00
Neel a6ec0d9015 client: Persist last used organization (#52505)
## Context

Persists last used organization through restart. Opted to do this via
`kvp` instead of `settings.json` since the value could change often, and
we would have to persist an ID rather than a friendly name.

Closes CLO-568.

## 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: -->
- [ ] 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:

- N/A
2026-03-27 10:26:52 +00:00
0369904e23 Don't preallocate 600MB for GPUI profiler (#45197)
Previously, the GPUI profiler allocates one CircularBuffer per thread,
and `CircularBuffer<N>` always preallocates space for N entries. As a
result it allocates ~20MB/thread, and on my machine about 33 threads are
created at startup for a total of 600MB used.

In this PR I change it to use a VecDeque that can gradually grow up to
20MB as data is written. At least in my experiments it seems that this
caps overall usage at about 21MB perhaps because only one thread writes
very much usage data.

Since this is fixed overhead for everyone running Zed it seems like a
worthwhile gain.

This also folds duplicated code across platforms into the common gpui
profiler.

Before:

<img width="4804" height="2192" alt="Image"
src="https://github.com/user-attachments/assets/7060ee5b-ef80-49cb-b7be-de33e9a2e7a5"
/>

After:

<img width="5052" height="1858" alt="image"
src="https://github.com/user-attachments/assets/513494df-0974-4604-9796-15a12ef1c134"
/>

I got here from #35780 but I don't think this is tree-size related, it
seems to be fixed overhead.

Release Notes:

- Improved: Significantly less memory used to record internal profiling
information.

---------

Co-authored-by: MrSubidubi <finn@zed.dev>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-27 10:20:21 +00:00
Ben BrandtandBennet Bo Fenner eb4ce6c860 agent_ui: Delete metadata for empty released threads (#52563)
Keep sidebar metadata only for threads with entries. Important for ACP
agents especially that won't persist the thread.

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: Bennet Bo Fenner <bennetbo@gmx.de>
2026-03-27 10:11:50 +00:00
Finn Evers 0c27ea4a58 Restore language query watcher in dev builds (#52543)
The watcher had been broken for some time, but became even more broken
after the recent move of the queries.

This PR restores the reloading behavior for debug builds so that
languages are reloaded once a scheme file is changed.

Release Notes:

- N/A
2026-03-27 11:10:57 +01:00
Lukas Wirth c823c086be Cut fs dependency from theme (#52482)
Trying to clean up the deps here for potential use of the ui crate in
web

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-03-27 08:17:30 +00:00
Smit BarmaseandGlenn Miao 6320b2a2fc terminal: Fix terminal not closing after non-zero shell exit (#52520)
Closes https://github.com/zed-industries/zed/issues/38901

Supersedes https://github.com/zed-industries/zed/pull/39082

This PR fixes an issue where the terminal tab would stay open after the
user exits a shell that has a non-zero exit code (e.g. running `false`
then `exit`, or pressing Ctrl-C followed by Ctrl-D). We now track
whether any keyboard input was sent to distinguish user-initiated exits
from shell spawn failures.

Release Notes:

- Fixed terminal tab not closing when the shell exits with a non-zero
code.

Co-authored-by: Glenn Miao <one.lemorage@gmail.com>
2026-03-27 08:25:12 +01:00
Alan P JohnandSmit Barmase 4e5f57a61f gpui: Fix emoji rendering in SVG preview (#51569)
Closes #50483 

## Findings

As reported in the original issue, emojis in SVG preview were not
rendering consistently with the editor.

The SVG renderer uses `usvg`/`resvg` for parsing and rendering SVG
files. The first problem was that emoji fonts were not rendering at all,
which was fixed by enabling the `raster_images` on `resvg`.

Beyond that it was observed that the default font fallback mechanism in
`usvg` searches through the font database alphabetically without
prioritizing emoji fonts. This caused emojis to sometimes render in
non-emoji fonts that happened to contain glyph mappings for those
characters.

For example, on Linux systems with the default
`uvsg::FontResolver::default_fallback_selector()`:
- The character ✅ would fall back to `FreeSerif` (monochrome)
- Instead of `Noto Color Emoji` (full color)

Log output showed the inconsistent behavior:
```
WARN  [usvg::text] Fallback from FreeSans to Noto Color Emoji.
WARN  [usvg::text] Fallback from FreeSans to FreeSerif.
WARN  [usvg::text] Fallback from FreeSans to Noto Color Emoji.
```

<img width="480" height="480" alt="Image"
src="https://github.com/user-attachments/assets/e065608f-a98b-4e67-9429-4aed16810c2c"
/>


This created a jarring inconsistency where the same emoji character
would render differently in:
- The editor (correct, using platform emoji fonts)
- SVG preview (incorrect, using arbitrary fallback fonts)
## Solution

If the specified font in SVG is available on the system, we should show
that. If not, we should fallback to what editors show today for that
emoji.

This PR implements emoji-aware font fallback that:

1. **Enabled `raster_images` build feature** to render emojis in SVG.
2. **Detects emoji characters** using Unicode emoji properties (via
`\p{Emoji}` regex pattern), consistent with how we check for emoji in
the Editor as well.
3. **Preserves user-specified fonts** by only intervening when the
default font resolver would use a non-emoji font for emoji characters

### Font Family Selection

I avoided completely reusing/rebuilding the logic for emoji font
selection used by the editor as `uvsg` internally does quite a bit of
the job and it felt like overcomplicating the solution. Instead using
hard coded platform specific font family names.
The hardcoded emoji font families are sourced from Zed's existing
platform-specific text rendering systems:

- **macOS**: `Apple Color Emoji`, `.AppleColorEmojiUI`  
Source:
https://github.com/zed-industries/zed/blob/db622edc8b26bd138c91027a02792a84c083acbf/crates/gpui_macos/src/text_system.rs#L353-L359
- **Linux/FreeBSD**: `Noto Color Emoji`, `Emoji One`  
Source:
https://github.com/zed-industries/zed/blob/db622edc8b26bd138c91027a02792a84c083acbf/crates/gpui_wgpu/src/cosmic_text_system.rs#L642-L646
- **Windows**: `Segoe UI Emoji`, `Segoe UI Symbol`  
  Source: Standard Windows emoji font stack

These match the fonts the editor uses for emoji rendering on each
platform.
To break down further into the similarity and differences in the emoji
font resolution:
**Similarities:**
- Both now use the regex based emoji detection logic
- Both prioritize the same platform-specific emoji font families
- Both support color emoji rendering
**Differences:**
- **Editor**: Uses platform-native text shaping (CoreText on macOS,
DirectWrite on Windows, cosmic-text on Linux) which handles fallback
automatically
- **SVG**: Uses custom fallback selector that explicitly queries emoji
fonts first, then falls back to default usvg behavior
## Testing

- Added unit tests for `is_emoji_character` in `util` crate
- Tested emoji detection for various Unicode characters
- [ ] Verified platform-specific font lists compile correctly (Only
linux done)
- [ ] Manual testing with SVG files containing emojis on all platforms
(Only linux done)

Release Notes:

- Fixed SVG preview to render emojis consistently with the editor by
prioritizing platform-specific color emoji fonts

---------

Signed-off-by: Alan P John <alanpjohn@outlook.com>
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
2026-03-27 12:49:49 +05:30
Max Brunsfeld f4ae5c8be8 Avoid killing Zed when terminating terminal process before process group is set by shell (#52542)
Release Notes:

- Fixed a bug where killing a terminal process in the agent panel would
sometimes kill Zed itself.
2026-03-27 08:14:52 +01:00
João SoaresandDanilo Leal 5ae99cf766 agent_ui: Fix message editor not expanding after sending a message (#52545)
Context

Tracks the previous `v2_empty_state` so `set_mode()` only fires on
actual state transitions, not every render frame.

Closes #52424

## Demo
### Before:


https://github.com/user-attachments/assets/76b61861-cebc-44ce-b483-596eeed19bb1

### After:




https://github.com/user-attachments/assets/9da9f3bc-2fc0-4182-8712-4f42d108650b



<!-- Videos/screenshots showing before and after go here -->

## How to review

1. `crates/agent_ui/src/conversation_view/thread_view.rs` — adds a
`was_v2_empty_state` field to gate the `set_mode()` call in
`render_message_editor()` so it only runs on transitions
2. `crates/agent_ui/src/agent_panel.rs` — test verifying that manually
setting the editor to Full mode survives a render cycle without being
reset back to AutoHeight

## Self-review checklist

- [x] I've reviewed my own diff for quality, security, and reliability
- [ ] 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 agent chat input box not expanding after sending a message
(#52424)

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
2026-03-27 01:47:48 -03:00
Joseph T. Lyons 51f6b542d7 Improve wording in collab channels filter tooltip (#52531)
I heard a comment that `active` didn't really explain what this filter
was for, and I've had the same feeling. I think `occupied` makes it more
clear.

## Self-Review Checklist

<!-- Check before requesting review: -->
- [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:

- N/A
2026-03-27 00:29:10 -04:00
249dc26dd7 Group threads by canonical path lists (#52524)
## Context

With the new sidebar, we are having some bugs around multi-root projects
combined with git work trees that can cause threads to be visible in the
agent panel but not have an entry in the sidebar.

## How to Review

This PR takes a step towards resolving these issue by adding a
`ProjectGroupBuilder` which is responsible for gathering the set of
projects groups from the open workspaces and then helping to discover
threads and map them into this set.

## 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)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A

---------

Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Mikayla Maki <mikayla@zed.dev>
Co-authored-by: Max Brunsfeld <max@zed.dev>
2026-03-27 00:11:14 +00:00
Danilo Leal b1402aed45 collab_panel: Fix favorite channels not surviving startup (#52541)
Follow up to https://github.com/zed-industries/zed/pull/52378

This PR fixes a little race condition that was happening where we were
running the favorite channel pruning function faster than the channels
could load, leading to favorite channels not surviving the app
restarting. The fix is to make the pruning happen only when the number
of channels is bigger than 0, which means the list from the server has
already been loaded.
Release Notes:

- N/A _(No release notes yet because this feature hasn't reached the
wider public)_
2026-03-26 19:25:58 -03:00
Danilo Leal 9bbb313f9a agent_ui: Move fully complete plan to the thread view (#52462)
When a plan generate by the plan tool fully completes, there's no need
for that to be in the activity bar anymore. It's complete and in the
next turn, the agent may come up with another plan and the cycle
restarts. So, this PR moves a fully complete plan to the thread view, so
that it stays as part of a given turn:

<img width="600" height="1858" alt="image"
src="https://github.com/user-attachments/assets/43ad4eb0-49d0-488c-bbbf-ab7956c1dd5a"
/>

The way this PR does this is by adding a new entry to `AgentThreadEntry`
and snapshotting the completed plan so we can display it properly in the
thread.

Release Notes:

- N/A
2026-03-26 18:23:19 -03:00
Danilo Leal 6a2baed5ae agent_ui: Display an activity bar for subagents waiting for permission (#52460)
Closes https://github.com/zed-industries/zed/issues/52346

Given the parallel nature of subagents calls, it's possible that there
is a subagent way out of view that's waiting for the user to give
permissions. Right now, it's kind of hard to know this and you may think
something wrong is happening given the thread generation isn't making
any progress.

This PR adds an "activity bar" to the thread view that displays
subagents on a "waiting for confirmation" status. We display the
subagent's summary label as well as allow clicking on it to quickly
scrolling to that subagent.

<img width="500" height="1100" alt="Screenshot 2026-03-25 at 10  09@2x"
src="https://github.com/user-attachments/assets/17d2d398-25fc-4660-85c2-bf66ec98c1f1"
/>

Release Notes:

- Agent: Improved the experience of interacting with subagents waiting
for confirmation.
2026-03-26 18:23:03 -03:00
Max Brunsfeld 23fd2490ef Avoid flicker in flexible width agent panel's size when resizing workspace (#52519)
This improves the rendering of flexible-width panels so that they do not
lag behind by one frame when tracking workspace size changes. I've also
simplified the code for panel size management in the workspace.

Release Notes:

- N/A
2026-03-26 13:18:39 -07:00
Danilo Leal dabe8caa06 collab_panel: Add ability to favorite a channel (#52378)
This PR adds the ability to favorite a channel in the collab panel. Note
that favorited channels:
- appear at the very top of the panel
- also appear in their normal place in the tree
- are not stored in settings but rather in the local key-value store

<img width="500" height="618" alt="Screenshot 2026-03-25 at 1  11@2x"
src="https://github.com/user-attachments/assets/dda8d5ae-7b45-4846-acc9-4a940b487ac4"
/>

Release Notes:

- Collab: Added the ability to favorite channels in the collab panel.
2026-03-26 16:24:20 -03:00
Danilo Leal b637a4732e sidebar: Ensure the projects menu is dismissed (#52494) 2026-03-26 18:37:28 +00:00
Josh Robson Chaseanddino 4ec41b6b66 helix: Fix insert line above/below with selection (#46492)
Fix Helix `o`/`O` behavior when a selection is active.

This updates `InsertLineAbove` and `InsertLineBelow` to use the
selection bounds correctly for Helix selections, including line
selections whose end is represented at column 0 of the following line.

It also adds Helix select-mode keybindings for `o` and `O`, and adds
tests covering both line selections and selections created via `v`.

Closes #43210

Release Notes:

- helix: Fixed insert line above/below behavior when a full line is
selected

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>
2026-03-26 16:31:18 +00:00
Bennet Bo FennerandBen Brandt 718997a19a eval: Improve StreamingEditFileTool performance (#52428)
## Context

| Eval | Score |
|------|-------|
| eval_delete_function | 1.00 |
| eval_extract_handle_command_output | 0.96 |
| eval_translate_doc_comments | 0.96 |

Porting the rest of the evals is still a todo.

## 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)
- [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>
2026-03-26 14:53:49 +01:00
Erik Funder Carstensen 5cf28db371 zed_agent: Pick rules file in order described in docs (#52495)
## Context

This makes zed-agent prioritize rules files in the same order as is
described in the docs. My order of experience was
- saw in my zed agent thread `Using project "CLAUDE.md" file.
- went to settings to see if I can make it use `AGENTS.md` instead.
- went to [the docs](https://zed.dev/docs/ai/rules) where it specifies
that AGENTS.md is be picked over CLAUDE.md.
- went to source to see what went wrong

## How to Review

I'm changing the order of filenames in an array - the only two places
where the order matters is when picking which rules file to use. The
last place it's used with an `.iter().any()`.

## 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
- If you want the behavior tested I can, but I think it's equally hard
keeping docs and tests and docs and this codepath in sync.
- [x] Performance impact has been considered and is acceptable

Release Notes:

-Fixed agent rules files are prioritized as described in docs
2026-03-26 13:48:18 +00:00
Jose GarciaandDanilo Leal 8ef884bd1c collab_ui: Fix "lost session" visual bug in Collab Panel (#52486)
## Context

This PR fixes a UX issue ("visual bug") in the collaboration panel
documented in issue
[#51800](https://github.com/zed-industries/zed/issues/51800), where
users who had already signed in were still seeing the "Sign In" screen
after restarting the editor. As I mentioned in my response there ([Link
to comment
#4132366441](https://github.com/zed-industries/zed/issues/51800#issuecomment-4132366441)),
I have investigated the problem thoroughly and found that the session is
not actually lost.

What I discovered is that in Zed, only "staff" users automatically
connect to the collaboration servers when opening the editor (by design,
this logic is in `crates/client/src/client.rs` starting at line `962`).
Therefore, regular users keep their saved session and `Authenticated`
status, but since they don't automatically connect upon startup, the UI
didn't detect this correctly. It erroneously showed the GitHub account
request and the "Sign in to enable collaboration" text, giving the false
impression that the user had been logged out.

### Screenshots

Before (Bug)
<img width="1918" height="1031" alt="image"
src="https://github.com/user-attachments/assets/f8d2a018-14c3-41da-bd12-c5de06f0e453"
/>

After (Fix)
<img width="1918" height="511" alt="image"
src="https://github.com/user-attachments/assets/ac09f908-2ad6-44c2-8816-fd95a37db43b"
/>


**Note:** This PR specifically addresses the visual issue in the
**Collab Panel**. Similar behaviors might exist in other parts of the
editor, but this change focuses on correcting the collaboration
interface.

This current PR:
1. Improves the `render_signed_out` function in
`crates/collab_ui/src/collab_panel.rs`.
2. Simplifies the connection check using
`self.client.user_id().is_some()`, which is more robust against volatile
network states and perfectly covers connection transitions.
3. During rendering, it detects existing credentials and shows the
correct message "Connect" / "Connecting...", replacing the GitHub icon
with the appropriate network icon (`SignalHigh`).

## How to Review

- Review the cleaner and simplified code in
`crates/collab_ui/src/collab_panel.rs:render_signed_out`.
- Verify that instead of verbose validations on the `Status` enum,
simply checking the user ID correctly captures any subsequent subtype,
properly differentiating between account authorization and a simple
network reconnection.

## 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 an issue (#51800) in the Collab Panel where the UI appeared to
log users out. Implemented improvements to properly differentiate
between "Sign In" and "Connect," avoiding false authentication prompts
when users are already logged in but not automatically connected to the
servers.

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
2026-03-26 09:37:35 -03:00
Ted RobertsonandMrSubidubi 786181a6e7 docs: Update keybindings in webstorm.md (#49583)
- add Linux/Windows keybindings
- use consistent spacing around the `+` in key combos

Release Notes:

- I don't have access to a Mac, so I haven't verified any of the macOS
keybindings. I suspect some may be out of date. Please verify.
- All other migration guides should be updated with Linux/Windows
shortcuts, and should use consistent spacing around the `+`:
  - https://zed.dev/docs/migrate/vs-code#differences-in-keybindings
  - https://zed.dev/docs/migrate/intellij#differences-in-keybindings
  - https://zed.dev/docs/migrate/pycharm#differences-in-keybindings
  - https://zed.dev/docs/migrate/rustrover#differences-in-keybindings

---------

Co-authored-by: MrSubidubi <finn@zed.dev>
2026-03-26 12:37:18 +00:00
Cameron Mcloughlin 161c622ad0 workspace: Show file path in bottom bar (#52381)
Context: if the toolbar and tab bar are both disabled, the current
filename is not visible. This adds it to the bottom bar, similar to vim.
Behind a setting, disabled by default

Release Notes:

- N/A or Added/Fixed/Improved ...
2026-03-26 11:53:16 +00:00
Danilo LealandRichard Feldman 3618914994 agent_ui: Make thread generation top-down (#52440)
Ever since we introduced the agent panel the way it is right now back in
May 2025, we wanted to make the thread generation be top-down. Now, with
the changes we're planning to launch very soon revolving around parallel
agents, doing this become even more important for a better experience.
Particularly because in the agent panel's new empty state, the message
editor is full screen. We want to minimize as much as possible layout
shift between writing your first prompt and actually submitting it. So
this means that content will stream down from your first prompt and
auto-scroll you if it goes beyond the viewport.

To pull this off, we added a `follow_tail` feature directly to the GPUI
list so that we could only call it in the thread view layer as opposed
to doing it all there.


https://github.com/user-attachments/assets/99961819-6a79-40e0-b482-dca68c829161

Release Notes:

- Agent: Made the thread generation be top-down instead of bottom-up.
Agent content now streams from the top and auto-scroll as they go beyond
the viewport.

---------

Co-authored-by: Richard Feldman <oss@rtfeldman.com>
2026-03-26 08:52:26 -03:00
Kunall Banerjee c39c8e6f00 settings_content: Fix hover descriptions for newtype wrapper settings (#51705)
Happened to notice it when debugging some stuff. I initially only caught
`git_hosting_providers`, but AI found another instance.

| `disable_ai` | `git_hosting_providers` |
|--------|--------|
| <img width="596" height="125" alt="image"
src="https://github.com/user-attachments/assets/1f829a9f-9e6e-45c0-8fb1-585d3bb3cfc3"
/> | <img width="634" height="207" alt="image"
src="https://github.com/user-attachments/assets/be2504f4-0b52-45a5-a859-b7609a366d0e"
/> |

Release Notes:

- Fixed an issue where some settings used the wrong documentation in LSP hover documentation
2026-03-26 07:44:05 -04:00
Shuhei KadowakiandMrSubidubi 90dae1f042 editor: Fix fade_out styling for completion labels without highlights (#45936)
LSP's `CompletionItemKind` is defined by the protocol and may not have a
corresponding highlight name in a language's `highlights.scm`. For
example, Julia's grammar defines `@function.call` but not `@function`,
so completions with `Method` kind cannot resolve a highlight. Since the
mapping from `CompletionItemKind` to highlight names is an internal
implementation detail that is not guaranteed to be stable, the fallback
behavior should provide consistent styling regardless of grammar
definitions.

Bundled language extensions (e.g., Rust, TypeScript) apply `fade_out` or
muted styling to the description portion of completion labels, so the
fallback path and extension-provided labels should match this behavior.

Previously, the description portion could fail to receive the expected
`fade_out` styling in several independent cases:

1. When `runs` was empty (grammar lacks the highlight name), the
`flat_map` loop never executed
2. When theme lacked a style for the `highlight_id`, early return
skipped the `fade_out` logic
3. When extensions used `Literal` spans with `highlight_name: None`,
`HighlightId::default()` was still added to `runs`, preventing
`fade_out` from being applied

The fix ensures description portions consistently receive `fade_out`
styling regardless of whether the label portion can be highlighted, both
for fallback completions and extension-provided labels.

Closes #ISSUE

Release Notes:

- N/A *or* Added/Fixed/Improved ...

---------

Co-authored-by: MrSubidubi <finn@zed.dev>
2026-03-26 11:33:36 +01:00
Bennet Bo FennerandAntonio Scandurra 1cb739cfa0 Fix issue in StreamingEditFileTool with incomplete last line (#51747)
<img width="927" height="368" alt="image"
src="https://github.com/user-attachments/assets/05de37f7-3034-4060-96b6-49c426170f39"
/>

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)

Release Notes:

- N/A

---------

Co-authored-by: Antonio Scandurra <me@as-cii.com>
2026-03-26 09:53:49 +00:00
Smit Barmase 3fa71db2ff markdown_preview: Refactor to use shared markdown crate (#52008)
We now use the parser and renderer from the `markdown` crate for
Markdown Preview, instead of maintaining two separate code paths.

How it works:

`markdown_preview_view.rs` is now a consumer of `MarkdownElement`. It
acts as a thin wrapper, handling things like resolving URL clicks and
image URLs, which can vary between consumers. It also handles syncing
the editor selection with the active block in the preview. The APIs for
this are provided by `MarkdownElement`.

All the heavy lifting like parsing HTML, rendering block markers on
hover, handling the active block, etc. is done by `MarkdownElement`.
Everything is opt-in. For example, markdown in the Agent Panel can
choose not to enable block marker rendering or HTML parsing, while
Markdown Preview opts into those features.

Final outcome:

For Markdown Preview View:

- Added:
  - Selection support in the preview

- Stays:
  - Syncing between editor and preview
  - Autoscroll
  - Hover and active block markers
  - Checkbox toggling
  - Image rendering
  - Mermaid rendering

For the `markdown` crate:

- No changes for existing consumers like the Agent Panel
- Consumers can now opt into:
  - HTML rendering
  - Block marker rendering
  - Click event handling
  - Custom image resolvers
  - Mermaid rendering

Release Notes:

- N/A
2026-03-26 12:27:39 +05:30
Mikayla MakiandEric 29ab42c3d9 Add a setting for moving the sidebar to the right (#52457)
## Context

This adds a setting for controlling the sidebar side

## 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)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A

---------

Co-authored-by: Eric <eric@zed.dev>
2026-03-26 01:35:10 +00:00
16a546a342 agent_ui: Add agent connection restart controls (#52401)
Track agent connection status in the configuration UI, show a
restart action for connected custom agents, and only render the
External Agents menu section when entries exist.

<img width="505" height="218" alt="image"
src="https://github.com/user-attachments/assets/117edd94-dd06-4b1f-a530-308b7219404b"
/>


Release Notes:

- acp: Allow for restarting agent servers from the Agent Settings panel.

---------

Co-authored-by: MrSubidubi <dev@bahn.sh>
Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
2026-03-25 21:29:52 -03:00
ab3697f163 Extract language_core and grammars crates from language (#52238)
This extracts a `language_core` crate from the existing `language`
crate, and creates a `grammars` data crate. The goal is to separate
tree-sitter grammar infrastructure, language configuration, and LSP
adapter types from the heavier buffer/editor integration layer in
`language`.

## Motivation

The `language` crate pulls in `text`, `theme`, `settings`, `rpc`,
`task`, `fs`, `clock`, `sum_tree`, and `fuzzy` — all of which are needed
for buffer integration (`Buffer`, `SyntaxMap`, `Outline`,
`DiagnosticSet`) but not for grammar parsing or language configuration.
Extracting the core types lets downstream consumers depend on
`language_core` without pulling in the full integration stack.

## Dependency graph after extraction

```
language_core   ← gpui, lsp, tree-sitter, util, collections
grammars        ← language_core, rust_embed, tree-sitter-{rust,python,...}
language        ← language_core, text, theme, settings, rpc, task, fs, ...
languages       ← language, grammars
```

## What moved to `language_core`

- `Grammar`, `GrammarId`, and all query config/builder types
- `LanguageConfig`, `LanguageMatcher`, bracket/comment/indent config
types
- `HighlightMap`, `HighlightId` (theme-dependent free functions
`highlight_style` and `highlight_name` stay in `language`)
- `LanguageName`, `LanguageId`
- `LanguageQueries`, `QUERY_FILENAME_PREFIXES`
- `CodeLabel`, `CodeLabelBuilder`, `Symbol`
- `Diagnostic`, `DiagnosticSourceKind`
- `Toolchain`, `ToolchainScope`, `ToolchainList`, `ToolchainMetadata`
- `ManifestName`
- `SoftWrap`
- LSP data types: `BinaryStatus`, `ServerHealth`,
`LanguageServerStatusUpdate`, `PromptResponseContext`, `ToLspPosition`

## What stays in `language`

- `Buffer`, `BufferSnapshot`, `SyntaxMap`, `Outline`, `DiagnosticSet`,
`LanguageScope`
- `LspAdapter`, `CachedLspAdapter`, `LspAdapterDelegate` (reference
`Arc<Language>` and `WorktreeId`)
- `ToolchainLister`, `LanguageToolchainStore` (reference `task` and
`settings` types)
- `ManifestQuery`, `ManifestProvider`, `ManifestDelegate` (reference
`WorktreeId`)
- Parser/query cursor pools, `PLAIN_TEXT`, point conversion functions

## What the `grammars` crate provides

- Embedded `.scm` query files and `config.toml` files for all built-in
languages (via `rust_embed`)
- `load_queries(name)`, `load_config(name)`,
`load_config_for_feature(name, grammars_loaded)`, and `get_file(path)`
functions
- `native_grammars()` for tree-sitter grammar registration (behind
`load-grammars` feature)

## Pre-cleanup (also in this PR)

- Removed unused `Option<&Buffer>` from
`LspAdapter::process_diagnostics`
- Removed unused `&App` from `LspAdapter::retain_old_diagnostic`
- Removed `fs: &dyn Fs` from `ToolchainLister` trait methods
(`PythonToolchainProvider` captures `fs` at construction time instead)
- Moved `Diagnostic`/`DiagnosticSourceKind` out of `buffer.rs` into
their own module

## Backward compatibility

The `language` crate re-exports everything from `language_core`, so
existing `use language::Grammar` (etc.) continues to work unchanged. The
only downstream change required is importing `CodeLabelExt` where
`.fallback_for_completion()` is called on the now-foreign `CodeLabel`
type.

Release Notes:

- N/A

---------

Co-authored-by: Agus Zubiaga <agus@zed.dev>
Co-authored-by: Tom Houlé <tom@tomhoule.com>
2026-03-25 23:41:09 +00:00
Finn Eitreimanddino 1f5e3b80a6 vim/helix: Use grapheme count on replace (#51776)
Update vim and helix replace to repeat based on grapheme count instead of
byte length or Unicode scalar count.

This fixes cases where a single visible character is made up of multiple
bytes or scalars, such as decomposed characters like `e\u{301}` and emoji.

Closes #51772 

Release Notes:

- Fixed vim/helix's replace action to take into consideration grapheme
count

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>
2026-03-25 23:19:55 +00:00
Finn EitreimandMikayla Maki fdd310a0a2 gpui: Fix bottom-aligned scroll bar disappearing (#51223)
Closes #51198

This actually doesn't effect any of the scrollbars in Zed, as they have
a separate handler that prevents this issue from occurring
in `crates/ui/src/components/scrollbar.rs`, line 856
```rust
let current_offset = current_offset
      .along(axis)
      .clamp(-max_offset, Pixels::ZERO)
      .abs();
```

so it is gpui specific. I still added a test case and I have a manual
test script:
<details><summary>Details</summary>
<p>

```rust
//! Reproduction of the scrollbar-offset bug in bottom-aligned `ListState`.
//!
//! Run with: cargo run -p gpui --example list_bottom_scrollbar_bug
//!
//! The list starts pinned to the bottom. Before the fix, the red scrollbar
//! thumb was pushed off the bottom of the track (invisible).
use gpui::{
    App, Bounds, Context, ListAlignment, ListState, Window, WindowBounds, WindowOptions, div, list,
    prelude::*, px, rgb, size,
};
use gpui_platform::application;

const ITEM_COUNT: usize = 40;
const COLORS: [u32; 4] = [0xE8F0FE, 0xFCE8E6, 0xE6F4EA, 0xFEF7E0];

struct BugRepro {
    list_state: ListState,
}

impl BugRepro {
    fn new() -> Self {
        let list_state = ListState::new(ITEM_COUNT, ListAlignment::Bottom, px(5000.));
        Self { list_state }
    }
}

impl Render for BugRepro {
    fn render(&mut self, _window: &mut Window, _cx: &mut Context<Self>) -> impl IntoElement {
        let state = &self.list_state;

        let max_offset = state.max_offset_for_scrollbar().y;
        let raw_offset = -state.scroll_px_offset_for_scrollbar().y;
        let viewport_h = state.viewport_bounds().size.height;
        let content_h = max_offset + viewport_h;

        let thumb_h = if content_h > px(0.) {
            ((viewport_h / content_h) * viewport_h).max(px(20.))
        } else {
            viewport_h
        };

        let thumb_top = if max_offset > px(0.) {
            (raw_offset / max_offset) * (viewport_h - thumb_h)
        } else {
            px(0.)
        };

        div()
            .size_full()
            .flex()
            .flex_row()
            .bg(rgb(0xffffff))
            .text_color(rgb(0x333333))
            .text_xl()
            .child(
                div().flex_1().h_full().child(
                    list(state.clone(), |ix, _window, _cx| {
                        let height = if ix % 4 == 0 { px(70.) } else { px(40.) };
                        let bg = COLORS[ix % COLORS.len()];
                        div()
                            .h(height)
                            .w_full()
                            .bg(rgb(bg))
                            .border_b_1()
                            .border_color(rgb(0xcccccc))
                            .px_2()
                            .flex()
                            .items_center()
                            .child(format!("Item {ix}"))
                            .into_any()
                    })
                    .h_full()
                    .w_full(),
                ),
            )
            .child(
                div()
                    .w(px(14.))
                    .h_full()
                    .bg(rgb(0xe0e0e0))
                    .relative()
                    .child(
                        div()
                            .absolute()
                            .right(px(0.))
                            .top(thumb_top)
                            .h(thumb_h)
                            .w(px(14.))
                            .rounded_sm()
                            .bg(rgb(0xff3333)),
                    ),
            )
    }
}

fn main() {
    application().run(|cx: &mut App| {
        let bounds = Bounds::centered(None, size(px(400.), px(500.)), cx);
        cx.open_window(
            WindowOptions {
                window_bounds: Some(WindowBounds::Windowed(bounds)),
                ..Default::default()
            },
            |_, cx| cx.new(|_| BugRepro::new()),
        )
        .unwrap();
        cx.activate(true);
    });
}
```

</p>
</details> 

where I was able to test it out, here is a video of the new working
behavior.


https://github.com/user-attachments/assets/02e26308-da18-418b-97fc-dd52a3325dab

Release Notes:

- gpui: fixed a bug where the scollbar would disappear when using a
bottom aligned list.

---------

Co-authored-by: Mikayla Maki <mikayla.c.maki@gmail.com>
2026-03-25 22:29:40 +00:00
Danilo Leal 6c89a0cbba sidebar: Fix space not working in the search editor (#52444)
We were using space as an alternative to `enter` for selecting thread
items even while the search editor was focused. The solution here was to
create a dynamic key context based on the search editor focus state.

Release Notes:

- N/A
2026-03-25 19:23:45 -03:00
Danilo Leal 01b9f4711e sidebar: Use last used agent when creating a new thread from it (#52446)
The "new thread" buttons as well as the `cmd-n` keybinding were
resetting the agent to the Zed one instead of following the agent
panel's behavior to use whatever agent was recently selected, as per the
key-value store.

Release Notes:

- N/A
2026-03-25 19:19:41 -03:00
Anthony Eid 884774b029 call: Update call location when active multi workspace changes (#52441)
## Context

This fixes a participant location out of sync bug when the active
workspace changes in a multi workspace. It wouldn't update the project
id, which breaks following.

## 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)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
2026-03-25 21:46:46 +00:00
Finn Evers 97b33ecfed Remove some outdated comments (#52432)
These comments come from the scaffolding script for new crates, yet are
no longer relevant in the given files. Thus, just removing them here to
do some 🧹

Release Notes:

- N/A
2026-03-25 12:07:34 -06:00
Eric Holk edc8bafa3c Sidebar and git cleanups (#52431)
A few minor cleanups in sidebar.rs and some related areas.

Release notes:

- N/A
2026-03-25 17:16:51 +00:00
Finn Evers d434ac4446 extension_cli: Ensure extension that provide themes do not provide further features (#52272)
We generally enforce this policy already and also want this to be this
way, so better to be error than sorry here.

Release Notes:

- N/A
2026-03-25 17:42:00 +01:00
87cf3317e4 language: Improve highlight map resolution (#52183)
This PR refactors the highlight map capture name resolution to be faster
and more predictable. Speficically,
- it changes the capture name matching to explicit prefix matching
(e.g., `function.call.whatever.jsx` will now be matched by only
`function`, `function.call`, `function.call.whatever` and
`function.call.whatever.jsx`). This matches the behavior VSCode has
- resolving highlights is now much more efficient, as we now look up
captures in a BTreeMap as opposed to searching in a Vector for these.

This substantially improves the performance for resolving capture names
against themes. With the benchmark added here for creating the
HighlightMap, we see quite some improvements:
```
Running benches/highlight_map.rs (target/release/deps/highlight_map-f99da68650aac85b)
HighlightMap::new/small_captures/small_theme
                        time:   [161.90 ns 162.70 ns 163.55 ns]
                        change: [-39.027% -38.352% -37.742%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 3 outliers among 100 measurements (3.00%)
  3 (3.00%) high mild
HighlightMap::new/small_captures/large_theme
                        time:   [231.37 ns 233.02 ns 234.70 ns]
                        change: [-91.570% -91.516% -91.464%] (p = 0.00 < 0.05)
                        Performance has improved.
HighlightMap::new/large_captures/small_theme
                        time:   [991.82 ns 994.94 ns 998.50 ns]
                        change: [-50.670% -50.443% -50.220%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high mild
HighlightMap::new/large_captures/large_theme
                        time:   [1.6528 µs 1.6650 µs 1.6784 µs]
                        change: [-91.684% -91.637% -91.593%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) low mild
```

For large themes and many capture names, the revised approach is much
faster.

With that in place, we can also add better fallbacks whenever we change
tokens, since e.g. a change from `@variable` to `@preproc` would
previously cause tokens to not be highlighted at all, whereas now we can
add fallbacks for such cases more efficiently. I'll add this later on to
this PR.


## Self-Review Checklist

<!-- Check before requesting review: -->
- [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

Release Notes:

- Improved resolution speed of theme highlight capture names. This might
change highlighting in some rare edge cases, but should overall make
highlighting more predicatable. Theme captures will now follow a strict
prefix matching, so e.g. function.call.decorator.jsx` will now be
matched by only `function`, `function.call`, `function.call.decorator`
and `function.call.decorator.jsx` with the most specific capture always
taking precedence.

---------

Co-authored-by: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com>
Co-authored-by: Gaauwe Rombouts <mail@grombouts.nl>
2026-03-25 17:01:17 +01:00
Mikayla Maki 13b2ef0023 Add a button to remove the plan UI (#52360)
## Context

This PR adds a button to remove the plan UI, if the user wants.

## 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)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
2026-03-25 09:01:15 -07:00
Oleksiy Syvokon 3b0ae5f442 ep: Change beta in deltaChrF to favor precision over recall (#52422)
Also store and print more detailed information related to this metric
(precision, recall, tp/fp/fn counts)

Release Notes:

- N/A
2026-03-25 17:54:53 +02:00
Xiaobo Liu 0d716af592 acp_tools: Only toggle ACP log expansion from header clicks (#50981)
Release Notes:

- Added only toggle ACP log expansion from header clicks

This change limits expand/collapse in open acp logs to header clicks
only, instead of the entire message row. It prevents accidental
expand/zoom toggles when users click or drag inside log text, making it
easier to select and copy debug information.


before:



https://github.com/user-attachments/assets/ceea7a6c-9b6a-4a38-8926-3c43f2bfb74e




after:




https://github.com/user-attachments/assets/f07537b1-70f1-4537-b38a-4148a84b41c7

Signed-off-by: Xiaobo Liu <cppcoffee@gmail.com>
2026-03-25 15:44:02 +00:00
Mikayla Maki 1f0ef22a21 Fix flaky terminal kill test (#52370)
## Context

This test was bugging me, so I had claude take a look at it.


## 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)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable

Release Notes:

- N/A
2026-03-25 08:33:56 -07:00
Joseph T. Lyons 813ab65e92 Bump Zed to v0.231 (#52420)
Release Notes:

- N/A
2026-03-25 15:21:01 +00:00