When the running app had mouse reporting on, moving the pointer over a
link with ctrl/cmd held never underlined it, while pressing the modifier
with the pointer already on the link did. `mouse_move` only scheduled
the hyperlink lookup outside of mouse mode, but the modifier change and
grid refresh paths don't check it, and ctrl/cmd-click already opens
links in mouse mode through `open_links_in_mouse_mode`.
Also look up the hovered link in mouse mode when that setting is on,
after the motion has been reported to the app.
Closes#64102
Go to next/previous diagnostic skipped every diagnostic tagged as
unnecessary, while the editor only drops the underline for unnecessary
diagnostics below warning severity. An error that is also tagged as
unnecessary, like an unused variable in Go, was shown with a red
squiggle but F8 jumped right past it.
Only skip unnecessary diagnostics that are faded out without an
underline, matching how they are rendered.
Closes#64790
`PathWithPosition::parse_str` stripped the position suffix by searching
the whole path for the captured file name, so `foo/foo:10:2` was cut at
the first `foo` and parsed as `foo`. The same happened for
`main.rs-backup/src/main.rs:10:2`.
The captured file name is a slice of the last path component, so cut the
path right after it instead. Switching to `rsplit_once` would not work
either, since the last occurrence lands inside the position suffix for
numeric names like `1/1:1:1`.
Closes#64174
With several cursors and nothing selected, the per-selection text joined
into a string of newlines, which passed the `!text.is_empty()` check and
replaced the primary selection on every keystroke and cursor move.
Only write to the primary selection when at least one selection is
non-empty.
Closes#64446
Delete with a modifier produced no input at all. Since the alt handling
was limited to single characters, alt-delete stopped sending the bogus
`ESC delete` and fell through to nothing, because delete was missing from
the modified special keys table next to insert, pageup and pagedown.
Modified delete now goes out as `CSI 3 ; <modifier> ~`, the same
encoding xterm and alacritty use.
Closes#64721
## Summary
The authenticated ChatGPT model catalog (`/backend-api/codex/models`)
can take ~30s to respond for some accounts. Zed aborted the request
after 5s, fell back to the built-in model list, and account-specific
models disappeared from the model selector.
Just raising the timeout would make credential loading and sign-in block
for that long, since both await model discovery. Instead, they still
wait at most 5s, but the request keeps running in the background for up
to 60s and replaces the available models once it completes.
Closes#64173
## Testing
- Added `test_slow_model_catalog_does_not_block_initial_load`: the
initial load finishes after 5s with the built-in models, and a catalog
response arriving 30s later replaces them.
- `cargo test -p openai_subscribed`, `./script/clippy -p
openai_subscribed`
- Not tested against the live endpoint.
## Self-review
- [x] I've reviewed my diff for quality, security, reliability, and
performance.
- [ ] UI changes follow the
[checklist](https://zed.dev/docs/development/ui-checklist). (N/A, no UI
changes)
- [x] Tests cover the new or changed behavior.
Release Notes:
- Fixed ChatGPT Subscription models disappearing when the model catalog
takes longer than 5 seconds to load.