Keep OSC 8 hyperlink targets in the pane, so `^a u` can label and open them
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 30/100
Research direction
Start in crates/spyc-vt-sys/src/bindings.rs to see the OSC 8 hyperlink constants and cell and grid-ref accessors, then read how engine_ghostty reads cell content and width. Next, read src/pane/quick_select.rs, since ^a u matches plain text only. Done means the printf example in the acceptance list labels link, yanks the target, opens only http, https and mailto, and yanks other schemes. The re-emit spike is open and needs a decision first.
Written by the indexing model from the issue text.
Description
Problem
With OSC 8 a program prints a link whose text differs from its target, as ls --hyperlink, delta, gh and agent CLIs do. In a spyc pane only the text survives. A row reading PR #12 can't be followed to the URL behind it, ^a u labels only URLs in plain sight, and the host terminal's own link click never sees the target, since spyc redraws the pane itself.
Where spyc stands
- Nothing under
src/reads or writes OSC 8. - libghostty-vt at the pin parses it (
GHOSTTY_OSC_COMMAND_HYPERLINK_START/…_ENDincrates/spyc-vt-sys/src/bindings.rs) and exposes it per cell:GHOSTTY_CELL_DATA_HAS_HYPERLINKthroughghostty_cell_get, on the raw cellengine_ghosttyalready reads for content and width;GHOSTTY_ROW_DATA_HYPERLINK, a per-row hint that may report a false positive; and the target throughghostty_grid_ref_hyperlink_uri, on the grid refs the engine already builds for its scrollback fill. scan(src/pane/quick_select.rs) matches regexes over plain text only.- ratatui's
Cellhas no hyperlink field.
Proposal
- Carry the target through the engine seam. The frame records a link id per cell, and
TerminalScreenreads a cell's target on demand, skipping rows the per-row hint clears. ^a ulabels links by target. A run of cells sharing one target is one match, labelled where the run starts. Yank copies the target. Open hands anhttp,httpsormailtotarget to the system opener, and yanks any other scheme with a note saying why.- Open question: re-emit OSC 8 to the host, so the host terminal's click opens the real target. With no hyperlink in ratatui's
Cell, the sequence would ride inside a cell's symbol, which the frame diff and width pass must tolerate. Worth a spike first.
Acceptance
-
printf '\e]8;;https://example.com/a\e\\link\e]8;;\e\\\n'in a shell tab, then^a u, labelslink, and its label yankshttps://example.com/a. - Uppercase on that label opens it; a
javascript:target is yanked, never opened. - A row without links costs no extra FFI call per cell.
-
docs/features/pane.md("Quick Select") describes link targets.
Prior art: tuios — https://tuios.dev/docs/links
- Dominant language
- Rust
- Stars
- 17
- Forks
- 2
- Avg merge
- 39m
- Merged PRs (30d)
- 413
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Tripstack-Corp/spyc
-
area:agent type:fix
Difficulty 4/5 3-5 days Newbie friendliness 45/100
Tripstack-Corp/spyc#1000 ·
Maintainers usually reply within 1 day
-
area:fs area:ui type:feat
Difficulty 3/5 1-2 days Newbie friendliness 68/100
Tripstack-Corp/spyc#970 ·
Maintainers usually reply within 1 day
-
area:build-ci type:chore
Difficulty 3/5 1-2 days Newbie friendliness 45/100
Tripstack-Corp/spyc#933 ·
Maintainers usually reply within 1 day
-
area:ui type:feat
Difficulty 4/5 3-5 days Newbie friendliness 42/100
Tripstack-Corp/spyc#932 ·
Maintainers usually reply within 1 day
-
area:build-ci type:chore
Difficulty 4/5 3-5 days Newbie friendliness 35/100
Tripstack-Corp/spyc#930 ·
Maintainers usually reply within 1 day
All issues in Tripstack-Corp/spyc
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
pop-os/cosmic-applets#1619 ·
Maintainers usually reply within 3 days
-
binding:python bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
coollabsio/orbit#72 ·
Maintainers usually reply within 1 day
-
swc_common: Mark::least_ancestor never returns when the answer is the root mark (ANT-2026-JYDQGGRT)Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
swc-project/swc-ai-issues#137 ·
-
Synth suite fails unless run from the repo root: signal_flow's default machine path is cwd-relativeOpenbug
Difficulty 2/5 1-3 hours Newbie friendliness 80/100
Nimblesite/osprey#370 ·
Maintainers usually reply within 1 day