e747cfc
terminal_view: Fix formatting in `TerminalElement::paint` (#46775)
Click to expand commit body
Release Notes: - N/A
Finn Evers created
e747cfc
terminal_view: Fix formatting in `TerminalElement::paint` (#46775)
Release Notes: - N/A
Finn Evers created
b1da735
languages(rust): Highlight enum variant labels (#46772)
Release Notes: - N/A *or* Added/Fixed/Improved ...
Lukas Wirth created
acfc71a
editor: Fix clipboard line numbers when copying from multibuffer (#46743)
Release Notes:
- When copying and pasting from a multibuffer view (e.g. into the agent
panel), the line numbers from the selection corresponded to the line
numbers in the multibuffer view (incorrect), instead of the actual line
numbers from the file itself.
- I also handled the case in which the selection spans multiple excerpts
(different files in the multibuffer) by just returning None for that
case, but maybe it should instead be split into two selections?
Left is before (bugged, should be lines 8:16, instead it is 38:46),
right is after (fixed).
<div style="display:flex; gap:12px;">
<img
src="https://github.com/user-attachments/assets/b1bfce1d-8b6a-41c0-ac7e-51f7bd7b284e"
width="48%" />
<img
src="https://github.com/user-attachments/assets/2a4c33a0-a969-4a3e-9aa5-d2c2fefba3b2"
width="48%" />
</div>
Kavi Bidlack created
4aa3cd0
Revert "Revert scheduler update (#46659)" (#46671)
Reland the new scheduler Release Notes: - N/A --------- Co-authored-by: Antonio Scandurra <me@as-cii.com> Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Conrad Irwin , Antonio Scandurra , and Zed Zippy created
a126383
terminal: Fix last character of IME marked text not being deleted (#46224)
ᴀᴍᴛᴏᴀᴇʀ created
22415e5
Fix copying from agent panel including extra backtick (#46763)
Closes #ISSUE Release Notes: - Fixed cmd-c in the agent panel to not include spurious trailing `'s.
Conrad Irwin created
b8fd09e
Add actions to move to start and end of larger syntax node (#45331)
Release Notes:
- Added two actions `move_to_start_of_larger_syntax_node` and
`move_to_end_of_larger_syntax_node` that move cursors to the start or
end of the parent tree-sitter node
Following up on my PR #41321, this PR only adds the actions that are
used to enable code navigation across syntax nodes, without binding them
to any keys (such as tab) by default. Both actions use the tree-sitter
syntax tree to find parent nodes of the nodes the cursors are currently
in. `move_to_start_of_larger_syntax_node` will then move each cursor to
the first position of the parent nodes while
`move_to_end_of_larger_syntax_node` to a position right after the parent
nodes.
Related issues and discussions: #22349, #14803, #42828, #13736.
This PR doesn't achieve "tab out" functionality in the exact sense as is
requested in these issues as it does not bind the actions to the tab
key. I hope this PR can start some discussion on what the best way
forward for these issues is. In the meantime, users can configure keys
to use these actions as they see fit to emulate "tab out" behavior. For
example,
```
"context": "Editor && vim_mode == insert && !in_snippet && !showing_completions",
"bindings": {
"tab": "editor::MoveToEndOfLargerSyntaxNode",
"shift-tab": "editor::Tab"
}
```
This will enable tab to skip past code structures like brackets when the
cursor is not in a snippet or the autocomplete menu is not open. At the
same time, shift tab will act as a backup tab.
Vamsi Raman Deeduvanu created
d92f477
linux: Fix duplicate IME input on Wayland and Sunshine remotes (#46560)
## Summary This PR fixes a issue where Chinese characters (and other IME-based inputs) would duplicate in the editor on Linux Wayland after remote desktop connected (e.g., via Sunshine) . ## Steps to Reproduce requirement: linux with wayland, and Sunshine(this is remote desktop server) installed 1. opening zed 2. using other device connect to Sunshine 3. input Chinese characters such as "的" ### Expected Result "的" ### Actual Result "的的" ### bug recording https://github.com/user-attachments/assets/d18961ec-48cb-4c06-a396-9fc604591769
Bo He created
20284e4
Introduce zeta2 format with cursor content in original order (#46732)
This one does `fim_prefix`, `fim_middle`, and `fim_suffix` in that order, in the prompt, instead of putting the current middle last. Release Notes: - N/A --------- Co-authored-by: Agus Zubiaga <agus@zed.dev> Co-authored-by: Ben Kunkle <ben@zed.dev>
Max Brunsfeld , Agus Zubiaga , and Ben Kunkle created
c9003e1
workspace: Improve the multi-project UX (#46641)
This PR introduces a project dropdown when working with multiple folders/projects in one workspace. Here are some interaction details that I hope improves the UX of working on this scenario significantly: - The dropdown shows the currently "active" project, which is determined by: - Either the file you're currently editing - Or the file you have just recently switched to - Some example cases: - If you are focused on file from project A but switch to project B in the titlebar, nothing happens. However, as soon as you type on the file from project A, the title bar will update and your active project will return to being project A. - If you're focused on file from project A and change tabs to a file from project B, the title bar will update, showing project B as the active one. - The content you'll see in the branch picker will correspond to the currently active project - It's still possible to reach the "Recent Projects" picker through the project dropdown - It's possible to do all interactions (trigger dropdown, select active project, and remove project from workspace) with the keyboard https://github.com/user-attachments/assets/e2346757-74df-47c5-bf4d-6354623b6f47 Note that this entire UX is valid only for a multiple folder workspace scenario; nothing changes for the single project case. Release Notes: - Workspace: Improved the UX of working with multiple projects in the same workspace through introducing a project dropdown that more clearly shows the currently active project as well as allowing you to change it.
Danilo Leal created
fd829cd
agent_ui: Discard button for interrupted changes (#46735)
Release Notes: - N/A
Michael Benfield created
5be4b60
Customizable vim mode text color (#46639)
Release Notes: - Added ability to customize vim mode foreground --- <video src="https://github.com/user-attachments/assets/776ecfcd-9600-4a04-b3cf-e78af439aab2" />
everdrone created
d67c8f2
Prevent stale related excerpts by avoiding storing their contents as strings (#46666)
This fixes an issue that we noticed in particular with Mercury edit predictions. * [x] fix storage to not go stale * [x] exclude excerpts that intersect the cursor excerpt * [x] see if string representation of excerpts can be cached, to avoid rebuilding it on every prediction Release Notes: - N/A --------- Co-authored-by: Ben Kunkle <ben@zed.dev>
Max Brunsfeld and Ben Kunkle created
1b416c7
agent_ui: Make rust-analyzer paths work with symbol completions (#46739)
Release Notes: - N/A *or* Added/Fixed/Improved ...
Lukas Wirth created
eed80aa
settings_ui: Add vim settings (#46634)
Closes #ISSUE Release Notes: - N/A *or* Added/Fixed/Improved ...
Ben Kunkle created
f301611
danger: Use Danger Proxy running on Cloud (#46731)
This PR updates Danger to use the new Danger Proxy that is running on Cloud. Release Notes: - N/A
Marshall Bowers created
5a8a7d8
vim: Change logic in subword motion subword_start calculation (#45341)
- Update subword boundary detection to stop at semantic punctuation (quotes, brackets, parens) - Treat `.`, `-`, and `_` as subword separators for consistent behavior - Extract `is_subword_start` and `is_subword_end` helpers for reuse in motion and object handling - Add comprehensive tests for all subword motions matching vim's CamelCaseMotion behavior Closes #23344 Release Notes: - Fixed bug in Vim mode's subword motion punctuation handling --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
Will Garrison and dino created
6b1b5fa
project search: Fix alignment in the filter inputs (#46726)
This is a small PR to fix an alignment bug I just noticed in the filter inputs within the project search page. Release Notes: - N/A
Danilo Leal created
bffee3f
agent_ui: Fix reject all and keep all keybinding conflict (#46725)
This PR changes the keybinding for the `agent::RejectAll` and `agent::KeepAll` actions. My initial goal was to free up `cmd-shift-n` to open a new fresh window again, but that was being used for the reject all action. Given I had to change the reject all, I figured I had to change the keep all action, too, to keep them consistent. Release Notes: - Agent: Removed keybinding conflict (`cmd-shift-n`) between rejecting all changes in the agent panel vs. opening a new fresh window.
Danilo Leal created
2a83c69
agent_ui: No agent diff view with Agent V2 (#46710)
Release Notes: - N/A
Michael Benfield created
f931704
Improve design for the diff review button (#46723)
Follow up to https://github.com/zed-industries/zed/pull/46326. Release Notes: - N/A
Danilo Leal created
782ca51
debugger_ui: Make view in the new session picker keyboard navigable (#46662)
This makes the new session picker in the Debugger panel consistent with the new unified Git picker (https://github.com/zed-industries/zed/pull/46621): https://github.com/user-attachments/assets/e94662da-31cc-48d8-b633-a6f0a2812569 Release Notes: - Debugger: Make possible to navigate with the keyboard between the views in the new session picker.
Danilo Leal created
d7bce54
remote: Support local terminals in remote projects (#46532)
This PR adds the ability to open local terminals when working in remote
projects. When working in a remote (often actually remoting into a local
container) I always need to run separate terminals outside Zed so I can
run local build tools, scripts, agents, etc. for the related project.
I'd like to be able to run all of these in the same Zed window and this
adds that ability via one-off local terminals.
## Changes
Adds an optional `local` parameter to terminal commands. When set to
`true`, creates a local shell on your machine instead of connecting to
the remote.
### Implementation
- Added `force_local` parameter to terminal creation logic
- Created `create_local_terminal()` method that bypasses remote client
- Updated terminal actions (`NewTerminal`, `NewCenterTerminal`) to
accept optional `local: bool` field (defaults to `false`)
### Usage
**Via keybinding:**
```json
{
"bindings": {
"cmd-t": "workspace::NewCenterTerminal",
"cmd-T": ["workspace::NewCenterTerminal", { "local": true }]
}
},
{
"context": "Terminal",
"bindings": {
"cmd-n": "workspace::NewTerminal",
"cmd-N": ["workspace::NewTerminal", { "local": true }],
},
},
```
**Behavior:**
- Default terminal commands continue to work as before (remote in remote
projects, local in local projects)
- The `local` parameter is optional and defaults to `false`
Release Notes:
- Added support for opening local terminals in remote projects via
`local` parameter on terminal commands.
David Baldwin created
72f6d39
Add option to show pinned tabs in a separate row (#46573)
## Problem:
When working with many `pinned tabs`, they consume significant
horizontal space in the tab bar, leaving less room for unpinned (active
working) tabs, especially on small screens. This creates a poor user
experience as users must constantly scroll to find their working tabs,
or the tabs become too narrow to read file names.

## Solution:
Added a new opt-in setting `tab_bar.show_pinned_tabs_in_separate_row`
that displays pinned and unpinned tabs in two separate rows:
- Top row: Pinned tabs with navigation buttons and tab bar controls
- Bottom row: Unpinned (working) tabs with full horizontal space
- when pinned and not pinned tabs we show 2 rows:
<img width="1512" height="159" alt="2_rows"
src="https://github.com/user-attachments/assets/62a85fcc-8073-40d2-a8e4-270efd0d0f21"
/>
This is a well-established UX pattern used in many popular IDEs
including JetBrains products (IntelliJ IDEA, WebStorm, PyCharm,
RubyMine), Visual Studio, and Eclipse.
The two-row layout only appears when both pinned AND unpinned tabs
exist. If only one type is present, a single row is displayed:
- when only not pinned tabs we show one row:
<img width="1510" height="111" alt="when only not pinned"
src="https://github.com/user-attachments/assets/048df4fc-4b17-4ea2-9c5b-b4db91cdfc78"
/>
- when only pinned tabs we show one row:
<img width="1510" height="111" alt="when only pinned tabs"
src="https://github.com/user-attachments/assets/7ccf2517-8711-4114-815d-6cbb1e89d7e2"
/>
**Important** - Default Behavior Preserved:
- The setting defaults to false - existing users will see no change
whatsoever
- Original tab bar logic is preserved in a dedicated
`render_single_row_tab_bar` method, while the new two-row layout lives
in `render_two_row_tab_bar`. Both methods share common components
(`configure_tab_bar_start`, `configure_tab_bar_end`,
`render_unpinned_tabs_container`, `render_tab_bar_drop_target`) ensuring
DRY code and consistent behavior.
- Purely opt-in - users must explicitly enable this feature via Settings
UI or settings.json
- No impact on default UX - Zed's default tab bar appearance and
behavior remains identical
This implementation ensures zero risk to the existing user experience
while providing an optional enhancement for users who prefer separated
tab rows.
Configuration
Via Settings UI:
- Open Settings (Cmd+,) → Editor section → "Pinned Tabs Layout" toggle

Via settings.json:
```json
{
"tab_bar": {
"show_pinned_tabs_in_separate_row": true
}
}
```
<img width="468" height="67" alt="manual_settings"
src="https://github.com/user-attachments/assets/d21f6dde-7683-47b3-8dca-d190049d32fb"
/>
## Video of implemented feature:
https://github.com/user-attachments/assets/b1e52074-a5a1-4c4e-ad59-e55e2213509d
## Tested:
- Verify default behavior unchanged (single row with pinned + unpinned
tabs inline)
- Enable setting → verify two rows appear when both pinned and unpinned
tabs exist
- Enable setting → verify single row when only pinned tabs exist
- Enable setting → verify single row when only unpinned tabs exist
- Verify drag & drop works in both layouts
- Verify navigation buttons and tab bar buttons render correctly
- Verify setting toggle works in Settings UI
- Verify setting works via settings.json
Tested on: MacBook Pro M4, macOS 26.2
## Release Notes:
- Added `tab_bar.show_pinned_tabs_in_separate_row` setting to display
pinned and unpinned tabs in separate rows, giving unpinned tabs full
horizontal space
---------
Co-authored-by: Matt Miller <mattrx@gmail.com>
Yaroslav Yenkala and Matt Miller created
79c69dc
ep: Fix raw request shape (#46711)
Release Notes: - N/A
Agus Zubiaga created
d2b31b4
vim: Allow trailing whitespace for `:norm` command (#46403)
Fix a bug with `:norm` that disallowed trailing whitespace. Commands that accept generic args (defined with `args()`) now preserve trailing whitespace, while commands that accept filenames (defined with `filename()`) have whitespace pre-trimmed. This allows, for example, `:norm I ` to correctly insert spaces, matching NeoVim's behavior. Release Notes: - vim: Fixed `:norm` command to preserve trailing whitespace in arguments (e.g., `:norm I ` now correctly inserts two spaces) --------- Co-authored-by: dino <dinojoaocosta@gmail.com>
AidanV and dino created
4e368d4
remote: Add remote timeout debugging commands (#46695)
Release Notes: - N/A *or* Added/Fixed/Improved ...
Lukas Wirth created
6865d80
Trust settings sync as a collab project client (#46700)
Collab projects are considered trusted and remote clients use the editor-related settings only. A better fix would be sync "not trusted" indicator with the project host, and disallow clients' iteraction with that indicator. Release Notes: - Fixed collab settings sync causing "not trusted" pop ups for client
Kirill Bulatov created
0ecefe0
editor: Fix crash when pasting after copy and trim in visual line mode (#46640)
When using the `editor::actions::CopyAndTrim` action with a multi-line selection in vim's Visual Line mode, pasting would crash Zed. The bug occurred because trimming splits a selection into per-line ranges, creating multiple `editor::ClipboardSelection` entries. However, when `is_entire_line` was true (Visual Line mode), no newline separators were added between these entries in the clipboard text. The paste code then assumed separators existed and read past the end of the text. The fix ensures newline separators are always added between trimmed line ranges, regardless of whether the original selection was in line mode. Closes #46616 Release Notes: - Fixed a crash when pasting after using `editor: copy and trim` in vim's Visual Line mode
Dino created
70da176
agent_ui: Make stopping a running terminal cancel thread generation (#46663)
This makes stopping a terminal tool call in the agent panel also cancel the thread generation: https://github.com/user-attachments/assets/702ba078-53a8-4816-80f3-b6215e764365 Release Notes: - Agent: Made the act of stopping a terminal tool call in the agent panel also cancel the thread generation.
Danilo Leal created
6b1eb25
Fix a missing newline in the zeta prompt (#46677)
Release Notes: - N/A
Max Brunsfeld created
d76258d
terminal_view: Fix terminal opening in / when no project is open (#46582)
Closes #46574
The `default_working_directory()` function in
`crates/terminal_view/src/terminal_view.rs:1585` returned `None` when no
project directory was available. The code comment (now removed)
incorrectly claimed "None implies `~` on whichever machine we end up
on". However, when `None` is passed to `alacritty_terminal`, it uses the
process CWD, not the home directory. On macOS when Zed is launched from
a .`app` bundle, the CWD is `/`.
Added a fallback at the end of` default_working_directory()` that
explicitly returns the home directory when no project directory is
found: `directory.or_else(dirs::home_dir)`
This ensures:
1. `CurrentProjectDirectory` with no project open → home directory
2. `FirstProjectDirectory `with no project open → home directory
3. `AlwaysHome `→ home directory (explicitly, not relying on shell
behavior)
4. Always `{ directory }` with invalid directory → home directory
Release Notes:
- Fixed terminal opening in `/` instead of home directory when no
project is open.
Max Malkin created
271bcf6
Fix `Failed to load environment variables` error message after self-update on Linux (#46367)
Closes #46365 The behavior I'm trying to handle here is documented in https://man7.org/linux/man-pages/man5/proc_pid_exe.5.html. [@merlinz01 ](https://github.com/zed-industries/zed/issues/46365#issuecomment-3723996684) points to some other alternatives but they don't seem necessary or justified here. # Testing I've manually replaced the binary of a process running this build, to simulate an update, and then opened a new tree and I don't see the error message. I don't know if there's a reasonable way to unit-test this? Let me know. It seems like it would require using something like rusty-fork to spawn a specific binary for the test, which I don't think I see already in the Zed tree and perhaps it would be overkill to add just for this? Release Notes: - Fixed "Failed to load environment variables" after applying an update
Martin Pool created
d35fee1
agent_ui: Remove Keep/Reject only with feature flag (#46656)
Release Notes: - N/A
Michael Benfield created
4c494fe
Remove -q from .rules (#46670)
I like to be able to see what's happening with rust builds so I can kill rust analyzer, see the output, etc. Closes #ISSUE Release Notes: - N/A
Conrad Irwin created
0244851
Avoid expensive re-computation of sticky header lines (#46653)
Fixes a performance regression introduced in https://github.com/zed-industries/zed/pull/45377 Release Notes: - Fixed a performance regression that caused lag in large documents
Max Brunsfeld created
1c1ab65
ollama: Save API URL and key upon confirmation (#46665)
Closes #46626 Release Notes: - Improved the settings configuration page for Ollama to store the current URL value if changed when clicking on "Connect"
Finn Evers created
90ec588
ep: Use FIM-like prompt for zeta2 (#46657)
Release Notes: - N/A --------- Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com>
Agus Zubiaga and Max Brunsfeld created
8ab49c3
editor: Fix regression with folds and relative counting (#46658)
Closes #46516 Release Notes: - Fixed a regression with relative line numbering that would occur with folds present (preview only)
Finn Evers created
8b4ab26
Revert scheduler update (#46659)
Reverts the new scheduler; it's destroyed our CI Release Notes: - N/A
Conrad Irwin created
6d3ea10
git: Annotate more functions and blocks with tracing spans (#46642)
Release Notes: - N/A
Jakub Konka created
291611e
agent: Move thread history access behind AgentConnection trait (#46631)
This should move almost all access of the threadstore behind the trait, which unlocks external agents supplying the list Release Notes: - N/A --------- Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
Ben Brandt and Zed Zippy created
f651c4c
gpui: Remove unused `flume` dependency (#46647)
Only the scheduler crate uses this currently, so we can remove this from the long list of GPUI dependencies. Release Notes: - N/A
Finn Evers created
1148773
project_symbols: Display line numbers in symbol picker (#46507)
Some language servers return local symbols in `workspace/symbol` responses, and languages like Julia can have multiple overloads for the same generic function name. In these cases, symbols may appear identical in the symbol picker, making it hard to distinguish between them. Adding line numbers helps users identify the correct symbol. In the future, we may also want to consider using `containerName` from the LSP response for additional context. > Before <img width="671" height="573" alt="Screenshot 2026-01-10 at 19 21 08" src="https://github.com/user-attachments/assets/838c3eb7-0e1d-46ba-9076-286e971afc2c" /> > After <img width="671" height="573" alt="Screenshot 2026-01-10 at 19 43 19" src="https://github.com/user-attachments/assets/31979d79-0169-4202-afc2-24fc7492dd47" /> Closes #ISSUE Release Notes: - Added line numbers to the project symbols picker to help distinguish between symbols with the same name --------- Co-authored-by: Matt Miller <mattrx@gmail.com>
Shuhei Kadowaki and Matt Miller created
3b67868
Add diff review button in git diff views (#46326)
Adds a very simple diff review button behind a feature flag, which appears in the gutter of people who have the flag (currently just me; it's not even enabled for staff, since it doesn't do anything yet). Mostly this PR just adds the feature flag, the button, and tests. Release Notes: - N/A
Richard Feldman created
756637f
Subagents PR 2: Thread spawning + execution (#46187)
This PR implements the behind-the-scenes subagent execution logic: ### Core subagent execution - Add `Thread::new_subagent()` constructor for creating subagent threads - Implement `SubagentTool::run()` to spawn and manage subagent lifecycle - Add `SubagentContext` for parent-child thread relationship - Implement `submit_user_message()`, `interrupt_for_summary()`, `request_final_summary()` - Add timeout support and context-low detection (25% threshold) - Propagate cancellation from parent to child threads ### Thread management - Add `MAX_SUBAGENT_DEPTH` (4) and `MAX_PARALLEL_SUBAGENTS` (8) limits - Add `register/unregister_running_subagent()` for tracking - Add `restrict_tools()` for allowed_tools filtering - Add `is_subagent()`, `depth()`, `is_turn_complete()` accessors ### Thread changes - Add `ToolCallContent::SubagentThread` variant - Add `ToolCallUpdateSubagentThread` for UI updates - Add `tool_name` field for subagent detection - Add `is_subagent()` method on `ToolCall` - Add image support in `ContentBlock` Release Notes: - N/A --------- Co-authored-by: Amp <amp@ampcode.com>
Richard Feldman and Amp created
816e5f5
Fix panic when using RealtimeAudio priority (#46635)
The scheduler integration (#44810) removed the special handling for realtime audio tasks that spawn them on a dedicated thread. This caused a panic in the Mac dispatcher when RealtimeAudio priority was passed to the regular dispatch path. This restores the original behavior: RealtimeAudio tasks are spawned on a dedicated thread via dispatcher.spawn_realtime(), using a bounded channel to send runnables to it. Release Notes: - N/A
Antonio Scandurra created
7853589
ep: Use non-chat completions for /predict/raw (#46633)
Release Notes: - N/A --------- Co-authored-by: Max Brunsfeld <maxbrunsfeld@gmail.com> Co-authored-by: Oleksiy Syvokon <oleksiy.syvokon@gmail.com>
Agus Zubiaga , Max Brunsfeld , and Oleksiy Syvokon created
c9e6238
agent_ui: Remove Keep/Reject buttons (#46456)
Release Notes: - N/A
Michael Benfield created
2b6e935
Add remaining tool permissions (#46164)
Add permission checking to the remaining 7 tools that require granular permissions: - `edit_file`: Checks path against permission rules - `delete_path`: Checks path against permission rules - `move_path`: Checks both source and destination paths - `create_directory`: Checks path against permission rules - `save_file`: Checks all paths, denies if any are blocked - `fetch`: Checks URL against permission rules - `web_search`: Checks query against permission rules Each tool follows the pattern established in PR #46155 (terminal tool): - `Allow` = proceed without prompting - `Deny` = return error immediately - `Confirm` = prompt user for confirmation The deny > confirm > allow precedence is enforced by the `decide_permission_from_settings()` function. Release Notes: - N/A --------- Co-authored-by: Amp <amp@ampcode.com>
Richard Feldman and Amp created