This PR bumps the extension CLI version used in the extension workflows
to `bac8897c06495c3d89dae664539317b295ca94fe`.
Release Notes:
- N/A
Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
This migrates the `Workspace::show_error` method to take a generic type
that implements `WorkspaceError` instead. That trait containts methods
to show a proper error message but most importantly means to help with
providing actions given certain errors.
The intention for this is rather easy: Whenever we show an error to the
user on the workspace level, that error should be
- actionable to a degree, even if that is only opening logs or whatnot
- show a message that is understandable to the user
- for not-too-critical errors, should hide after a certain delay and not
force the user to dismiss it using their mouse.
For now, there exist trait implementations for string error types and
anyhow errors. The long term goal here is to get rid of these altogether
and migrate everything to be strongly typed and especially actionable
instead.
Self-Review Checklist:
- [ ] I've reviewed my own diff for quality, security, and reliability
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [X] Performance impact has been considered and is acceptable
Release Notes:
- N/A
---------
Co-authored-by: Kirill Bulatov <kirill@zed.dev>
Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
This will improve local dev installation times as well as CI times by a
lot (I measured it once and for some extensions, it might save us up to
60% of CI time. It will similarly help locally).
I also moved the debug adapter schema validation to the other
validations, as it felt it makes more sense to check there as opposed to
doing this during the compilation step.
Release Notes:
- Improved dev extension installation times for language extensions with
multiple grammars or language servers.
Parse git blame stdout incrementally while the process is still running
instead of waiting for child output to buffer the entire command result.
Release Notes:
- N/A or Added/Fixed/Improved ...
Self-Review Checklist:
- [X] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable
Fix an issue introduced by PR #58237 where IME could not be enabled when
multiple windows were open.
The fix ensures that `update_ime_enabled` only updates IME state for the
active window.
Release Notes:
- N/A
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable
Please check
https://github.com/zed-industries/zed/issues/56277#issuecomment-4417185748
for more context.
Release Notes:
- N/A or Added/Fixed/Improved ...
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #ISSUE
Release Notes:
- N/A or Added/Fixed/Improved ...
We had a nested spawn that was disguising the fact that the actual
`git_config` task was being dropped immediately instead of detached.
This only seems to cause problems in release builds due to timing
issues.
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 a bug where clicking the button to trust a git repository would
do nothing.
This PR bumps the version of the GLSL extension to v0.2.4.
Release Notes:
- N/A
Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
Add C-Style indentation rules for GLSL. By adding an indents.scm file
for GLSL we get the same automatic indentation as we have for other
languages.
Release Notes:
- N/A
In the current Python Tree-sitter `highlights.scm`, exception
(https://docs.python.org/3/library/exceptions.html) are highlighted
under `@type.class` which is inconsistent compared to other editors (VS
Code, Neovim, Helix).
This PR adds `#any-of?` with a list of python's exceptions and highlight
them under `@type.builtin`.
| Before | After |
|
:---------------------------------------------------------------------------------------------------------------------------------:
|
:--------------------------------------------------------------------------------------------------------------------------------:
|
| <img width="1237" height="1160" alt="image"
src="https://github.com/user-attachments/assets/05e1ae34-7637-413a-9785-ad696c2bf751"
/> | <img width="1237" height="1154" alt="image"
src="https://github.com/user-attachments/assets/105c61ca-b6a7-4c26-acc8-3e300f044510"
/> |
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Release Notes:
- Added the ability to stylize builtin python exceptions and warnings
using the `type.class.builtin` syntax capture.
Closes AI-358
This PR hides the chevron and removes hover styles from the project
header when there is an active search, given groups can't be collapsed
while that's happening. We could allow it, but I think it's not super
worth it; this feels like like a pragmatic move.
Release Notes:
- Sidebar: Fixed a bug where affordances to collapse the project header
would appear when searching.
The settings UI previously required selecting a settings scope (User /
project) before entering a sub-page; the scope picker disappeared once
inside. This makes the scope switchable from within sub-pages.
- The scope segment of the sub-page breadcrumb (e.g. "User / AI / Agent
Configuration / Skills") is now a dropdown listing all scopes the
sub-page supports (filtered by the sub-page's file mask, intersected
across the sub-page stack). Selecting a scope re-renders the sub-page in
place — e.g. the Skills page swaps between global and project-local
skills.
- The sub-page stack is preserved across scope changes when every
sub-page in it is valid in the new scope; otherwise it falls back to the
regular navigation behavior.
- Sub-pages that only support one scope (Tool Permissions, Configure
Providers, Feature Flags) keep the static label.
- Entering a sub-page now clears the settings search bar so sub-pages
show all their items (settings deep links that prefill the search are
unaffected).
Closes AI-343
Release Notes:
- Improved the settings window: sub-pages such as Skills and
per-language settings now have a scope picker in the breadcrumb, so you
can switch between User and project settings without leaving the page.
---------
Co-authored-by: Danilo Leal <daniloleal09@gmail.com>
For the longest time, we've had a labeled "Share" button on the title
bar whenever you're in a call. However, it was extremely easy to click
that button thinking you'd be sharing _your screen_ instead of your
project. At the end of the day, there wasn't any specific cue that'd
allow you to know what you'd be sharing. This is why people just assumed
you'd share the screen, which is arguably way more common than sharing
the project. We've seen users bump into this confusion countless times,
and this also even happens to us (the whole Zed staff) weekly whenever
we're in meetings.
So, this PR changes that button to be an icon button instead, using a
folder icon to better communicate it means sharing the project. I also
took advantage of the opportunity to change the approach we use for
adding these buttons, using `when` instead of `children.push`; I think
the former is just easier to understand, allowing to more easily picture
the UI in your (my) head. Lastly, also improved what we display in the
tooltip for the project share button, by showing the names of all
projects you'll be sharing, as well as the tooltip that displayed call
diagnostics.
| Before | After |
|--------|--------|
| <img width="778" height="360" alt="Screenshot 2026-06-05 at 3 48
2@2x"
src="https://github.com/user-attachments/assets/363593fb-79f8-42e9-83b9-345bc731846f"
/> | <img width="778" height="360" alt="Screenshot 2026-06-05 at 3 48
3@2x"
src="https://github.com/user-attachments/assets/32afc412-a1fb-45a4-a19e-74e4923c0c8b"
/> |
Release Notes:
- Improved call controls design, making it clearer what button shares
_the project_ vs. _the screen_.
## Context
`apply_remote_edit` and `apply_local_edit` rebuild the fragment
`SumTree` through `FragmentBuilder`. Since #51941, the builder collapsed
the entire tree into a flat `Vec<Fragment>` (cloning every fragment) and
rebuilt a fresh tree from scratch on every call. The new tree shared no
nodes with the previous one, so each edit cost O(N) in the *total*
number of fragments: clone all fragments, allocate an entirely new tree,
and then free the whole previous tree on assignment — the last part
showing up as a large amount of time spent dropping `SumTree`s.
That batching was a deliberate win for the bulk `replace_all` path
(#51941, one `edit()` carrying millions of ranges), but it penalizes
every other caller — most notably `apply_remote_edit`, which runs once
per op in a loop in `apply_ops` and so rebuilt the whole tree per remote
operation.
## This change
Make `FragmentBuilder` chunk-based. Appended slices are kept as intact
`SumTree` subtrees, so they keep sharing nodes with the previous tree;
only individually pushed fragments are batched into `Vec`s.
`to_sum_tree` appends the shared subtrees (touching just the right
spine) and builds the loose runs in one pass, parallelizing the large
ones.
Net effect:
- Small edits on large/heavily-fragmented buffers (the
`apply_remote_edit` collaborative path) go back to O(edited + log N)
with a cheap drop, instead of O(total fragments).
- The bulk `replace_all` path keeps its batched build and is not
regressed.
## Benchmarks
Using the file from #38927 (619 MB CSV, 10,325,246 matches of `"` →
`""`), `release-fast`:
| Case | flatten (#51941) | this PR |
|---|---|---|
| `replace_all` (all matches) | 50.70 s | 45.16 s |
| replace 1 match (`--single`) | 16.0 ms | 16.0 ms |
`replace_all` is ~11% faster and not regressed. The
single-match-on-a-freshly-loaded-file case is unchanged, because a fresh
`Buffer::local` is barely fragmented, so even the from-scratch rebuild
is cheap there; the structural-sharing win is on heavily-fragmented
buffers receiving small edits.
The `--single` flag added to `editor_benchmarks` makes the latter case
measurable.
Release Notes:
- Improved the performance of applying edits to large buffers
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
In a multi-workspace window several workspaces share one platform
window. Switching the active workspace did not update the window title
or edited indicator, and background workspaces could clobber the active
workspace's title via their still-live project/item event subscriptions.
Track the active workspace id in a shared Rc<Cell<EntityId>> owned by
the MultiWorkspace and read by each member workspace, so a workspace
only writes the shared window's title/edited state when it is the active
one. The newly active workspace re-applies its title and edited
indicator on activation. We use a Rc-cell here to avoid double lease
issues as we cannot tell whether we are inside a running MultiWorkspace
lease or not in the given codepaths.
Release Notes:
- Fixed the window title not updating when switching between workspaces
in a multi-workspace window
---------
Co-authored-by: Eric Holk <eric@theincredibleholk.org>
When a pending tool call awaiting permission contains tall content (e.g.
a full plan in Claude Code plan mode) and the inline prompt is scrolled
out of view, the floating awaiting-permission row embeds that content
and can grow to consume the entire panel, squeezing the conversation
list to zero height. `ListState::item_is_above_viewport` /
`item_is_below_viewport` returned `None` for a zero-height viewport, so
the row's visibility decision oscillated from frame to frame, flickering
between the conversation and the permission prompt and making the thread
unusable.
This PR fixes the root cause and hardens the UI:
- `gpui`: `item_is_above_viewport` / `item_is_below_viewport` now answer
definitively from the last layout bounds even when the viewport is
zero-height, so callers that size sibling UI based on these queries
can't oscillate. Adds a regression test.
- `agent_ui`: adds a `Floating` tool call layout used by the
awaiting-permission row that caps the embedded tool call content with a
scrollable max height, so the row can never crowd the conversation list
out of view while keeping the permission buttons visible. Adds an
integration test that drives real window draws and asserts the row's
visibility is stable across frames.
Closes AI-372
Closes https://github.com/zed-industries/zed/issues/58564
Release Notes:
- Fixed the agent panel flickering and becoming unusable when a
permission prompt with tall content (such as a plan awaiting approval)
was scrolled out of view.
This crash occurred when the left hand side (LHS) editor in the split
diff retained a stale shared scroll handler after the split editor
unsplits. I added an invariant check to our randomized companion display
map tests to prevent regressions here and explicitly make LHS editor set
a native scroll anchor when unsplitting.
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:
- Fix crash that could occur when unsplitting a side by side diff view
Stabilizes context windows + persistent session/delete for acp agents
that support them
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:
- acp: Show context window usage and cost metrics for external agents
that support it.
- acp: Persist session deletion from history for external agents that
support it.
Closes#55170
Fixes Helix mode undo selection history after `d` deletes the character
under an empty cursor. Previously, `d` temporarily expanded the cursor
to a one-character selection before deleting, and undo restored that
temporary selection. When the deleted character was a newline, pressing
`x` after undo selected additional line which was wrong.
This preserves the original Helix selection as the undo-restored
selection while keeping the existing delete behavior unchanged.
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 Helix mode selecting one extra line after undoing a newline
delete
Co-authored-by: Tom Houlé <13155277+tomhoule@users.noreply.github.com>
Opening a symlinked file showed the whole file as changed in the git
gutter/diff. Git stores only the symlink's target path as that entry's
blob, while the buffer holds the resolved target's contents, so diffing
the two is meaningless.
We now skip loading a git diff base whenever a buffer's worktree entry
is a symlink i.e. its `canonical_path` is set.
Release Notes:
- Fixed symlinked files showing the entire file as changed in the git
diff/gutter.
Self-Review Checklist:
- [X] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable
This PR follows the approach from #51041 and currently includes only the
Wayland implementation.
[录屏 2026-06-01
23-11-17.webm](https://github.com/user-attachments/assets/c9f87503-4d64-4868-b9d8-5b832ade3e5a)
Release Notes:
- On Linux wayland, the IME is disabled in Vim normal and visual modes.
Fixes#57916.
`append_system_fallbacks` used `.map(...)` for the `CFArrayAppendValue`
side effect, but the iterator was never consumed.
This changes it to a `for` loop so the fallback descriptors are actually
appended.
- Improve icon colors and gradient overlay
- Fix a bug where the plus icon button as visible in the sticky header
despite the menu being closed
- Made menu positining consistent between the plus/ellipsis menu
- Other small spacing/wording tweaks
Release Notes:
- N/A
Word diffs are stored per-hunk for the entire hunk range, but
layout_word_diff_highlights converted every word diff of every hunk
touching the viewport to display points each frame, even for the
off-screen portion of a large, partially-visible hunk. Each conversion
walks the inlay/fold/tab/wrap/block trees, so scrolling through a large
modified hunk (especially in split diff mode, where both editors lay out
every frame) caused frame drops proportional to the hunk's total size
rather than its visible portion.
Filter word diffs by the visible buffer-offset window before converting.
Buffer offset to display point is order-preserving, so this is
equivalent to the existing per-row filtering applied to the converted
ranges.
Release Notes:
- Improved scrolling performance in diff views containing large hunks
with many computed word diffs
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [x] Unsafe blocks (if any) have justifying comments
- [x] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [x] Tests cover the new/changed behavior
- [x] Performance impact has been considered and is acceptable
Closes #ISSUE
Release Notes:
- N/A or Added/Fixed/Improved ...
Noticed that when you had an empty draft and created a worktree we
weren't respecting agent selection. It was because of an early ? return
on an option, and should be fixed now.
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:
- agent: Fix for current agent not being selected when creating a new
git worktree
Before we would render the icon of the active project for all of them
instead of the appropriate project per entry
Release Notes:
- Fixed a bug that caused the project icons to render in the recent
projects picker
Closes https://github.com/zed-industries/zed/issues/54840
There are likely more places we can use this new workspace function in,
but these are the known ones to me right now
Release Notes:
- Fixed file hyperlinks in the agent panel not opening files when
clicked
Co-authored-by: saberoueslati <saberoueslati12@gmail.com>
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)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable
Closes#58612
Release Notes:
- Agent: Improved auto scroll location when using read-file tool.
On quit, the handler activates every workspace in each window to surface
save prompts. Activating re-serializes the multi-workspace state, so the
persisted active_workspace_id ended up pointing at whichever workspace
was iterated last rather than the one the user had focused. On the next
launch the wrong (or empty) workspace was restored as active, even
though all projects still appeared in Open Recent.
Re-activate the originally-focused workspace after the close-prompt loop
(and on the cancel-quit path) so it is the one serialized as active.
Also harden read_serialized_multi_workspaces to prefer a workspace with
paths over a scratch/empty one when the persisted active workspace can't
be matched.
Release Notes:
- Fixed a workspace restoration issue where zed would restore a window
with none of its projects opened by default
Release Notes:
- When stopping all language servers, Zed will now no longer restart
language servers when language files change until the user restarts all
language servers explicitly
TypeId is effectively already a hash, so re-hashing it with fxhash is
unnecessary.
Release Notes:
- N/A or Added/Fixed/Improved ...
---------
Co-authored-by: zed-zippy[bot] <234243425+zed-zippy[bot]@users.noreply.github.com>
For the ease of finding something that fits the time that reviewers have
and for making it mechanically easier to prioritize the PRs from the
community champions, surface some meta information on the PR board (and
make it updatable). Meta information here means things like size and
whether there's an issue linked to the PR (and what is its type if there
is).
Release Notes:
- N/A
It is valid to have raw binary paths in the registry but we didn't
handle them.
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:
- acp: Fix for certain ACP Registry agent downloads not starting
direnv's .envrc files are just Bash scripts.
---
Self-Review Checklist:
- [x] I've reviewed my own diff for quality, security, and reliability
- [ ] Unsafe blocks (if any) have justifying comments
- [ ] The content is consistent with the [UI/UX
checklist](https://github.com/zed-industries/zed/blob/main/CONTRIBUTING.md#uiux-checklist)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable
Release Notes:
- Detect .envrc files as Shell Script
Co-authored-by: Yara 🏳️⚧️ <git@yara.blue>
When handling click events on entries in project panel, we were
returning early if the click was the one that brought the Zed window
into focus. This effectively ignored the click action on the item. This
leads to two clicks being required to act on an item in the project
panel if the Zed window is out of focus. The existing behaviour is also
inconsistent with other UI controls, where clicking on them when the
window is out of focus actually acts upon them.
This behaviour was introduced in
https://github.com/zed-industries/zed/pull/9553.
This PR fixes the click handler on the entries so that events with
`first_focus() == true` are no longer ignored.
Before:
https://github.com/user-attachments/assets/d51ec11d-c47a-4ea3-af6d-63bf6daf3c44
After:
https://github.com/user-attachments/assets/87b9e6a8-9ef0-463f-8557-e15d25b519ca
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)
- [ ] Tests cover the new/changed behavior
- [ ] Performance impact has been considered and is acceptable
Closes#58261
Release Notes:
- Fixed project panel needing a second click to change the file if the
window is not in focus
`go_to_diagnostic_impl` was calling `refresh_edit_prediction(false,
true)` with `user_requested = true`, which skips the
`should_show_edit_predictions` check inside `refresh_edit_prediction`
(`crates/editor/src/editor.rs`).
As a result, navigating between diagnostics in a buffer where the user
has set `show_edit_predictions: false` would still trigger
`EditPredictionProvider::refresh`. With the Zed provider this fans out
into many `textDocument/definition` and `textDocument/typeDefinition`
LSP requests for every identifier near the cursor
(`RelatedExcerptStore::fetch_excerpts`), which is surprising for users
who have explicitly disabled edit predictions for that language.
Jumping to a diagnostic is a navigation action, not a request for an
edit prediction, so pass `user_requested = false` and enable debouncing
here.
Release Notes:
- Fixed diagnostic navigation triggering unnecessary LSP requests when
edit predictions are disabled.
Co-authored-by: Oleksiy Syvokon <oleksiy@zed.dev>
Fixes#58619.
When a worktree is opened through a symlinked root, filesystem events
can arrive rooted at either the opened symlink path or the canonical
target path. The worktree event processing path already handled
canonical target paths, but dropped events reported under the opened
symlink root because it only derived relative paths from the canonical
root.
This PR adds a regression test that opens `/link -> /target`, renames
`/link/subdir-a` to `/link/subdir-aa`, and verifies
`subdir-aa/config.ini` remains visible in the worktree. The production
fix accepts event paths under the opened worktree root as a fallback
when deriving relative paths.
Testing:
- Verified the new regression test fails with only the test commit
applied.
- `cargo test -p worktree --test integration
test_renaming_subdir_under_symlinked_root_keeps_children`
- `cargo test -p worktree --test integration
test_symlinks_pointing_outside`
These changes are a follow-up to #58244. That PR changed how Zed sends
`textDocument/definition` requests so that, once the language server has
answered for a given position, Zed doesn't re-query that same position
as the mouse jiggles within the same character, avoiding spamming the
server on every tiny mouse movement.
This PR adds two more cases on top of that:
**1. Preserve the deduplication state when the server returns an empty
response**
* Previously, an empty response called `Editor::hide_hovered_link`,
which sets `Editor::hovered_link_state` to `None`, discarding the
recorded `HoveredLinkState::last_trigger_point`.
* We now clear `HoveredLinkState::links` instead, resetting the links
while keeping `last_trigger_point`, so we don't re-query the same
position when the response was empty.
**2. Fall back to the surrounding word as the symbol range for no-origin
servers**
* The `editor::hover_links::show_link_definition` function already used
`surrounding_word` to pick the highlight range when the server returned
no symbol range.
* For servers that return a link (or links) but no
`originSelectionRange`, we now also treat that `surrounding_word` range
as the symbol range, so moving across characters of the same symbol will
not re-query the language server.
* There's caveat to this approach, for a language where something like
`run_function` is not a single symbol/node, if the server returns a
response for one character, we won't re-query for the others in
`run_function`, even if the server would have returned something
different for `_` or `function`. I believe this should be rare, can't
think of a language where this would be an issue, but I'm happy to
revisit or drop this part if we decide it's not worth it.
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:
- Improve go to definition in order to avoid repeatedly querying the
language server while moving the mouse over the same symbol or an
unresolved position