Commit Graph
34840 Commits
Author SHA1 Message Date
Lukas Wirth 5ccd64f89f editor: Put more syntax walking features on the background (#48450)
Currently we always compute breadcrumbs and sticky headers on every
editor paint which is not cheap to do especially in bigger files, moving
this off to be computed on event handling where they change and then
caching them can save serveral milliseconds per render in bigger files.

This also puts matching brackets refreshing and document highlights on a
background task, as this tends to block the main task for prolonged time
as well.

Release Notes:

- N/A *or* Added/Fixed/Improved ...
2026-02-05 09:31:11 +00:00
Zachiah SawyerandAnthony Eid 0357a4a95d Make middle click not mousedown close tabs (#44916)
Closes #44856

This PR also adds an `on_aux_click` interface to the div element that follows MDM standard https://developer.mozilla.org/en-US/docs/Web/API/Element/auxclick_event

Release Notes:

- fix bug where mouse down middle click would close tab instead of full middle click

---------

Co-authored-by: Anthony Eid <anthony@zed.dev>
2026-02-05 09:21:47 +00:00
Matthew ChisolmandAnthony Eid bb4327e1e6 Handle soft wrap modes when computing wrap width (#46422)
Partially closes #44748 

Release Notes:

- Fixed the git side panel to respect soft wrap settings

---------

Co-authored-by: Anthony Eid <anthony@zed.dev>
2026-02-05 08:22:43 +00:00
Lukas Wirth 46b073186d languages: Remove unnecessary unresolvedReference semantic token rule (#48448)
This prevents ast based highlighting in unconfigured code

Release Notes:

- N/A *or* Added/Fixed/Improved ...
2026-02-05 08:19:36 +00:00
271ab3ef72 project panel: Collapse All improvements (#47328)
Thanks to @jackTabsCode for the original commit that I based my work off
of.

See: #27703

Release Notes:

- Fixed clicking "Collapse All" from context menu on a project root
collapsing all project roots instead of that one.
- Added new `project panel: collapse selected entry and children` action
that collapses the selected directory and all its subdirectories.
- Added "Collapse All" option to the context menu for all directories,
not just project roots.

---------

Co-authored-by: Jack T <jack@jackt.space>
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
2026-02-05 13:14:05 +05:30
Smit Barmase 14c1094c19 project_panel: Fix collapse_all_entries collapsing single worktree root completely (#48443)
For: https://github.com/zed-industries/zed/pull/47328

Release Notes:

- Fixed an issue where selecting "Collapse All" on the root directory or
triggering the collapse all action would sometimes collapse the entire
root instead of keeping it expanded when there's a single worktree.
2026-02-05 11:43:08 +05:30
Smit Barmase 66af89dd33 agent_ui: Fix missing TerminalSelection match arm in mention_set (#48445)
Fix broken main.

Release Notes:

- N/A
2026-02-05 11:34:58 +05:30
Rocky Shi 4225921201 Parse and render markdown mention links from pasted text (#45426)
Closes [#ISSUE](https://github.com/zed-industries/zed/issues/45408)

Release Notes:

- Fixed mention links from pasted text.

Recording:


https://github.com/user-attachments/assets/e0d55562-c9a4-4798-be41-af8b8cd1f5d7
2026-02-05 05:16:44 +00:00
Cole Miller 0706237576 git: Add toolbar buttons for SplittableEditor (#48323)
Release Notes:

- N/A
2026-02-05 04:15:41 +00:00
Richard Feldman c2eb5f442e Fix shell quote bypass in terminal permission system (#48436)
## Problem

Zed's terminal permission system validates commands using regex patterns
against string representations of parsed commands. The
`SimpleCommand::to_string()` method in brush-parser preserves the raw
lexical form including shell quotes, causing pattern matching to fail on
obfuscated commands.

For example, all of these are semantically equivalent to `rm -rf /` in
POSIX shells, but produced different strings from `to_string()` that
bypassed the hardcoded deny pattern `rm\s+(-[rf]+\s+)*/\s*$`:

| Input | `extract_commands()` returned | Matched deny pattern? |
|---|---|---|
| `rm -rf /` | `"rm -rf /"` | ✅ Yes |
| `rm -rf '/'` | `"rm -rf '/'"` | ❌ No |
| `'rm' -rf /` | `"'rm' -rf /"` | ❌ No |
| `r'm' -rf /` | `"r'm' -rf /"` | ❌ No |
| `rm -r'f' /` | `"rm -r'f' /"` | ❌ No |
| `rm -rf \/` | `"rm -rf \\/"` | ❌ No |

Both hardcoded deny patterns (Phase 2, which operates on extracted
sub-commands) and user-configured `always_deny` patterns were affected.

## Fix

Replace the `simple_command.to_string()` call in
`extract_commands_from_simple_command` with manual construction that:

1. Iterates the command name (`word_or_name`) and word arguments from
the suffix
2. Normalizes each word by parsing it into `WordPiece`s via
`brush_parser::word::parse`
3. Reconstructs the semantic (unquoted) value from each piece:
   - `Text` — used as-is
- `SingleQuotedText` — used as-is (brush-parser already strips the
wrapping quotes)
- `EscapeSequence` — leading `\` stripped to produce the unescaped
character
- `AnsiCQuotedText` — used as-is (brush-parser already evaluates
`$'...'`)
- `DoubleQuotedSequence` / `GettextDoubleQuotedSequence` — inner pieces
recursively normalized
   - `TildePrefix` — preserved as `~` + suffix
- `ParameterExpansion` / `CommandSubstitution` /
`BackquotedCommandSubstitution` / `ArithmeticExpression` — original
source text preserved so patterns like `\$HOME` and `\${HOME}` continue
to match
4. Joins normalized words with spaces

Falls back to the raw `word.value` if word parsing fails.

## Cross-shell safety

The normalization operates on POSIX-parsed ASTs (brush-parser uses POSIX
grammar), so it applies POSIX quoting rules. For non-POSIX shells
(Nushell, PowerShell, Xonsh, Elvish, etc.) where quoting semantics
differ, any mismatch results in false positives (overly cautious
denials), never false negatives. This is the correct error direction for
a security feature. When brush-parser fails to parse a non-POSIX
command, `extract_commands` returns `None` and the existing fallback
(raw-string matching with `allow_enabled=false`) handles it.

(No release notes because granular tool permissions are still
feautre-flagged.)

Release Notes:

- N/A
2026-02-05 04:13:58 +00:00
Cole Miller d7a5e3e267 git: Render hunk gutter highlights for the side-by-side diff (#48433)
Relanding #48321 

Release Notes:

- N/A
2026-02-05 03:08:26 +00:00
Matt Miller b63e38b204 Add stacked and split diff icons (#48427)
N/A
2026-02-05 00:57:21 +00:00
bee1edcc4e Fix vim increment/decrement on Markdown list markers (#47978)
`find_target()` failed to match numbers followed by a dot and a
non-digit (e.g. `1. item`), because the dot unconditionally reset
the scan state, discarding the number. Additionally, numbers at the
start of non-first lines were missed because the backward scan
stopped on the preceding newline and the forward scan immediately
broke on it.

Closes #47761

Release Notes:

- Fixed vim increment (`ctrl-a`) and decrement (`ctrl-x`) not working on Markdown ordered list markers like `1.`, `2.`, etc.

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: dino <dinojoaocosta@gmail.com>
2026-02-04 23:52:43 +00:00
Katie GeerandClaude Opus 4.5 8c944f4337 docs: Add missing AI features (Dec. 2025) (#48418)
- Update AI docs with missing features we shipped in December 2025
- Apply new brand voice to new docs

Release Notes:

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

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 15:50:59 -08:00
Dino f2a3a9b365 vim: Add $ and = as subword motion boundaries (#48276)
These changes update subword motions in order to also take `$` and `=`
into consideration as stopping punctuation, improving the subword
motions for certain languages where `$` and `=` are commonly used, like
PHP, for variables and assignments.

Closes #48267 

Release Notes:

- Improved Vim's subword motions to stop at `$` and `=` characters
2026-02-04 23:38:00 +00:00
Conrad Irwin 33ae3bbd53 Reduce rewrapping when agent diffs are present (#48423)
Before this change any agent diff caused us to recompute the entire
buffer's wraps, because we didn't handle the base text of diffs
changing.

Now, thanks to anchors, we can do that.

Release Notes:

- Fixed the editor rewrapping like crazy when agent edits were present
2026-02-04 23:36:23 +00:00
Conrad IrwinandCole Miller aca4f97551 Fix multibuffer to not mark everything as edited when buffer diffs don't change (#48424)
Co-authored-by: Cole Miller <cole@zed.dev>

Release Notes:

- N/A

Co-authored-by: Cole Miller <cole@zed.dev>
2026-02-04 23:35:41 +00:00
Danilo Leal 471bdeb98b docs: Fix rules description in AI overview (#48420)
Release Notes:

- N/A
2026-02-04 23:04:27 +00:00
Cameron McloughlinandCole Miller 3772f8b781 git: Shader for checkerboard pattern for side-by-side diff (#48417)
Adds `checkerboard` to `Background`, and use it for the side-by-side
diff.
Note that, since the blockmap can contain multiple `Spacer`s without any
gaps
in between, we ensure that the checkerboard pattern always shows an even
integer number of squares per line, so there are no obvious
discontinuities
in the pattern when this happens.

<img width="590" height="300" alt="image"
src="https://github.com/user-attachments/assets/e8f75f90-b230-4078-bce0-cb3c15613fe7"
/>


Release Notes:

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

---------

Co-authored-by: Cole Miller <cole@zed.dev>
2026-02-04 23:00:56 +00:00
Kenan Hasanaliyev f7133c0e57 Remove cmpl- prefix validation from Mercury feedback (#48410)
Release Notes:

- Removes unnecessary prefix validation from Inception API's returned
request ID.
2026-02-04 17:56:26 -05:00
Ben Kunkle d9959fb5cf Differentiate between explicit rejection and ignored in ep acceptance tracking (#48409)
Closes #ISSUE

Release Notes:

- N/A *or* Added/Fixed/Improved ...
2026-02-04 17:54:11 -05:00
Shuhei KadowakiandClaude Opus 4.5 70f302cffa lsp: Add schema support for LSP settings field (#48332)
This extends the LSP settings schema system to also provide autocomplete
for the `settings` field (used for `workspace/configuration` responses),
in addition to the existing `initialization_options` support (#).

Changes:
- Add `settings_schema` method to `LspAdapter` trait and
`CachedLspAdapter`
- Update schema URL paths to be more explicit:
  - `lsp/{adapter}/initialization_options` for init options schema
  - `lsp/{adapter}/settings` for settings schema
- Add schema resolution logic for the new settings path
- Update tests to verify both schema references

Release Notes:

- Added autocomplete support for the `settings` field in LSP
configuration, complementing the existing `initialization_options`
autocomplete.

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 23:45:52 +01:00
Cole Miller 4b2dcf1c68 Revert "git: Render hunk gutter highlights for side-by-side diff (#48321)" (#48416)
This reverts commit 7f947801f2.

Release Notes:

- N/A
2026-02-04 22:44:05 +00:00
Piotr Osiewicz dd077cb31c ci: Trigger tests on Cargo.toml and Cargo.lock changes (#48412)
Finn found out the hard way that the new cool tech does not quite work
at times. Back to the drawing board we go (at least partially).

Closes #ISSUE

Release Notes:

- N/A
2026-02-04 22:33:24 +00:00
Marco Mihai Condrache 267fa5a230 editor: Use tabs bitmask when syncing (#48366)
Release Notes:

- N/A
2026-02-04 22:21:57 +00:00
morgankreyandClaude Opus 4.5 7b95995e6f docs: Apply brand voice standards to AI documentation (#48401)
## Summary

Reviewed and updated all 18 files in `docs/src/ai/` to meet Zed's brand
voice standards. Each file was scored against the 8-criterion rubric and
rewritten where needed to achieve 4+ on all criteria.

**Changes include:**
- Remove "Learn how to/about" patterns (8 instances)
- Replace vague phrases ("various types of tasks", "and more") with
specific examples
- Remove taboo words ("seamless", "naturally extends")
- Remove emotional language ("We're excited/thrilled/happy")
- Remove marketing patterns ("Stay tuned!", exclamation points)
- Remove unverifiable claims ("world's fastest")
- Replace hedging with direct statements
- Remove promotional emphasis (`_free_`, `**_for free_**`)
- Fix typo in external-agents.md ("servers" → "serves")
- Fix broken link syntax for Ollama Turbo

## Test plan

- [x] `mdbook build` succeeds
- [x] Grep for remaining taboo phrases (only one "seamless" in MCP
official quote, preserved intentionally)
- [x] All facts preserved (URLs, keybindings, settings keys, prices,
model names)

Fixes AI-8

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 14:11:55 -08:00
Shuhei KadowakiandMrSubidubi c9f65764a1 lsp: Add container_name to lsp::Symbol (#46822)
Some language servers include local symbols (e.g., local variables,
parameters) in workspace symbol results. Without the `containerName`
information, these symbols lack context information, making it difficult
to distinguish them from top-level definitions and hindering efficient
symbol lookup.

This change exposes the `container_name` field from LSP
[`SymbolInformation`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#symbolInformation)
to the extension API, allowing language server extensions to access
`symbol.container_name` in `label_for_symbol` and provide meaningful
context when rendering symbol labels.

Note: The `container_name `field is added to all extension API versions
because they seem to share the same underlying Rust types via wasmtime
bindgen. The field is optional, so existing extensions would remain
compatible as far as I understand.

Closes #ISSUE

Release Notes:

- Added `container_name` field to `lsp::Symbol`, accessible via the
extension API's `label_for_symbol` function

---------

Co-authored-by: MrSubidubi <finn@zed.dev>
2026-02-04 23:03:15 +01:00
Katie GeerandBen Kunkle 916b86c8a2 Add telemetry for EP Menu Actions (#48229)
Closes #ISSUE

Release Notes:

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

---------

Co-authored-by: Ben Kunkle <ben@zed.dev>
2026-02-04 16:39:41 -05:00
3adf79c536 Add telemetry for toolbar menu open events (#48225)
Closes #ISSUE

Release Notes:

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

---------

Co-authored-by: Ben Kunkle <ben@zed.dev>
Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
2026-02-04 16:26:13 -05:00
Kenan HasanaliyevandBen Kunkle b5765efcff edit_prediction: Add Mercury accept/reject tracking (#48306)
### Summary
Adds accept/reject tracking for Mercury edit predictions.

### Changes
Sends events to https://api-feedback.inceptionlabs.ai/feedback when:

Accept — user presses Tab
Reject — user presses Escape
Ignore — prediction dismissed implicitly (typing, cursor move, etc.)

Added `discard_explicit` method to the delegate trait to distinguish
explicit vs implicit dismissal. Updated `reject_prediction` and
`reject_current_prediction` methods with an `explicit` bool parameter to
thread this through to the Mercury feedback logic. Other providers are
unaffected—they use the default implementation.

Feedback is fire-and-forget in a background thread, only sent for
predictions that were shown.

### Data Collected
- Request ID (returned from Inception API)
- User action (either accept/reject/ignore)
- Client Zed version (to track updates made to Zed client which could
potentially affect nextedit implementation)


Release Notes:

- N/A

---------

Co-authored-by: Ben Kunkle <ben@zed.dev>
2026-02-04 16:19:33 -05:00
Richard Feldman 7b6057de46 Expand hardcoded agent terminal security rules (#48399)
Expands the hardcoded security rules that block dangerous `rm` commands
in the agent terminal tool.

### New blocked patterns

- `rm -rf $HOME` / `rm -rf $HOME/` / `rm -rf ${HOME}` / `rm -rf
${HOME}/`
- `rm -rf .` / `rm -rf ./`
- `rm -rf ..` / `rm -rf ../`
- `rm -rf ~/` (previously only `rm -rf ~` was blocked)

### Flag handling improvements

- Simplified the flag character class from `[rRfF]` to `[rf]` since the
regex is already compiled with case-insensitive mode — less confusing,
same behavior.
- Added tests verifying that reversed flags (`-fr`), uppercase (`RM
-RF`), split flags (`-r -f`), and chained commands all get caught.

### Safe commands still allowed

Paths like `rm -rf ./build`, `rm -rf ~/Documents`, `rm -rf
$HOME/Documents`, `rm -rf ../some_dir`, and `rm -rf .hidden_dir` are
**not** blocked.

Release Notes:

- Auto-block a wider range of agent terminal commands, e.g. `rm -rf
$HOME` in addition to `rm -rf ~`
2026-02-04 20:52:14 +00:00
Richard Feldman 8f67296991 Allow always_allow for nushell, elvish, and rc (#48395)
`brush-parser` handles `;` (sequential execution) and `|` (piping) which
all these shells use, so we can safely parse their commands for
`always_allow` pattern matching.

(No release notes because granular tool permissions haven't been
released yet.)

Release Notes:

- N/A
2026-02-04 19:49:56 +00:00
Piotr Osiewicz 31f8249b38 ci: Parse Cargo.toml and Cargo.lock with Python script to determine affected packages (#48389)
Closes #ISSUE

Release Notes:

- N/A
2026-02-04 19:31:25 +00:00
Cole Miller 9ec35ae904 git: Fix branch diff not updating when committing or changing branches (#48388)
This regressed in #47619 -- previously we would throw away and reopen
the diffs used to construct the branch diff pretty eagerly, and as a
result the branch diff would update itself when you committed or
switched branches. We inadvertently lost that when we switched to
retaining those diffs in the git store.

Release Notes:

- N/A
2026-02-04 14:29:30 -05:00
Xiaobo Liu ef94395614 project_search: Guard replace_next match lookup (#48327)
Release Notes:

- N/A

Signed-off-by: Xiaobo Liu <cppcoffee@gmail.com>
2026-02-04 20:08:24 +01:00
KyleBarton 2c8bbfe182 Refer to devcontainer.js rather than devcontainer.cmd.js (#48387)
Closes #46947

When installed with `npm install -g`, devcontainer gets created as
`devcontainer.cmd`. However, when invoked as a script from node, it's
still `devcontainer.js`. This addresses that difference so that we don't
accidentally invoke `devcontainer.cmd.js`.

Release Notes:

- Fixed devcontainer operation on Windows for when the devcontainer cli
is not installed globally
2026-02-04 10:48:40 -08:00
Piotr Osiewicz 8d162a00fc ci: Run tests only for the changed packages and their dependants (#48380)
We're still gonna run a full test suite on main and in non-PR workflows
exercising tests


Release Notes:

- N/A
2026-02-04 19:39:33 +01:00
Cole Miller 7f947801f2 git: Render hunk gutter highlights for side-by-side diff (#48321)
Release Notes:

- N/A
2026-02-04 18:25:25 +00:00
Katie GeerandDanilo Leal 5664212555 docs: Update edit prediction providers (#48055)
Closes #ISSUE

Release Notes:

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

---------

Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
2026-02-04 15:19:33 -03:00
07e8e95c9c agent_ui: Refactor AcpThreadView (#48339)
Release Notes:

- N/A

---------

Co-authored-by: cameron <cameron.studdstreet@gmail.com>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
Co-authored-by: Smit Barmase <heysmitbarmase@gmail.com>
2026-02-04 18:51:57 +01:00
elf-alchemist a8f417cbcc Do not treat binary Doom WAD files as text (#48349)
I primarily contribute to Doom source ports and related utilities. When
working with Doom WADs, the primary archive format for the game, Zed
will sometimes incorrectly assume that such files are plain text, due to
the nature of said container format not being compressed, some common
text files included in them will trigger a false positive in Zed's text
detection mode.

Considering some of these files can go from a couple dozen to a few
hundred megabytes, this usually makes Zed hang on my lower end machine,
until I manually terminate it :/ and has happened when I accidentally
clicked on one via the file explorer, or when viewing Git diffs.

Release Notes:

- Fixed Doom WAD files being erroneously treated as text
2026-02-04 19:51:00 +02:00
051754a5d4 editor: Implement semantic highlighting (#46356)
Part of #7450

Big thanks to @macmv for pushing this forwards so much!

Rebased version of https://github.com/zed-industries/zed/pull/39539 as
working on an in-org branch simplifies a lot of things for us)

Release Notes:

- Added LSP semantic tokens highlighting support

---------

Co-authored-by: Neil Macneale V <neil.macneale.v@gmail.com>
Co-authored-by: Kirill Bulatov <kirill@zed.dev>
Co-authored-by: Zed Zippy <234243425+zed-zippy[bot]@users.noreply.github.com>
2026-02-04 17:37:13 +00:00
Fredrik Enestad e6bc8edfd8 project: Make individual DAP settings optional (#43647)
Currently, when overriding e.g a `binary` in dap settings, one have to
override all settings, including `args` as it otherwise set it to empty
string.

E.g this config will set `args` and `env` to their empty states, like
empty string and empty map:
```json
{
  "dap": {
    "Delve": {
      "binary": "/path/to/binary"
    }
  }
}
```

This PR changes so that it is instead possible to only override a single
field. This is useful e.g on nixos where you don't want (or cant let)
zed download binaries for you, but you want to use the default args,
such as in Delve, you want zed to configure it with a random listening
port.

Release Notes:

- Improved dap settings so that it is possible to override individual
fields, such as `binary`
2026-02-04 18:20:50 +01:00
Cole Miller 2747d4a113 git: Ensure the sides of the side-by-side diff use the same hunk controls (#48376)
Fixes hunk controls appearing on the LHS of the branch diff when they
should be disabled

Release Notes:

- N/A
2026-02-04 17:07:46 +00:00
Joseph T. Lyons f92654cb4f Bump Zed to v0.224 (#48375)
Release Notes:

- N/A
2026-02-04 16:54:54 +00:00
Ben Kunkle 475b7469ec Fix scroll in EP provider sub page when setting migration banner is showing (#48372)
Closes #ISSUE

Release Notes:

- N/A *or* Added/Fixed/Improved ...
2026-02-04 16:23:41 +00:00
Oleksiy SyvokonandBen Kunkle 7c3499cc84 ep: Lower max_output_tokens default for Ollama (#48370)
Zeta 1 should not be configurable, not by this setting.

Release Notes:

- N/A

---------

Co-authored-by: Ben Kunkle <ben@zed.dev>
2026-02-04 16:07:23 +00:00
Lukas Wirth d888775824 gpui(windows): Reduce timer resolution to 1ms (#48364)
Otherwise block_with_timeout is effectively useless on windows as we
would block a minimum of 15ms which is our entire frame budget

Release Notes:

- N/A *or* Added/Fixed/Improved ...
2026-02-04 14:49:02 +00:00
Danilo Leal fe794c262f agent_ui: Fix regression that made edited files unclickable (#48362)
There was a `when()` condition here looking at
`hovered_edited_file_buttons`, which is never turned to true when
hovering over the edited file button, and given we started to pass the
hover styles, tooltip, and on_click handler inside the condition, they
would never work. The solution here is to make these three things
unconditional, so edited files are always clickable.

Release Notes:

- N/A
2026-02-04 11:04:28 -03:00
Finn Evers e2943a78ae docs: Add BSD 2-Clause as accepted extension license (#48363)
Release Notes:

- N/A
2026-02-04 13:52:35 +00:00