Skip to content

[FEATURE]: tui: session tab title marquee is too fast to read — make it configurable #58054

Open

Description

@xzyangha

What I'd like

Expose the session tab title marquee in cli.json so it can be slowed down or turned off.

When a tab title is wider than the tab, hovering the tab starts a scrolling marquee. The timing is hardcoded in 2.1.2: a 600 ms hover delay, then one cell every 80 ms (~12.5 chars/s), looping forever by repeating title + " · ". At that speed long titles are hard to read, and it triggers easily just by moving the mouse across the tab strip.

The text never pauses, so each part has already scrolled out of view before it can be read. The marquee is meant to help identify a long title, but at 80 ms per character it is effectively unreadable — I have to hover the tab several times just to piece the title together.

Proposed config

{
  "tabs": {
    "marquee": {
      "enabled": true,  // false = always truncate, never scroll
      "delay": 600,     // ms before scrolling starts
      "speed": 80       // ms per character
    }
  }
}

Fewer knobs would also be fine, e.g. tabs.marquee: "off" | "slow" | "normal".

Current behavior

  • tabs only accepts mode, enabled, scope, layout, indicators — nothing for the marquee.
  • animations: false does not stop it (it only disables the fade).
  • scroll.speed is unrelated (wheel/keyboard scroll distance).
  • The only workarounds are renaming sessions, widening the terminal, or tabs.mode: "off".

Environment

  • opencode 2.1.2 (release), Linux x86_64
  • Terminal: xterm-256color, COLORTERM=truecolor
  • Shell: bash
  • Plugins: none

Activity

  1. opencode-agent commented on Oct 22, 2026

    @opencode-agent
    Contributor

    Thanks for the detailed request! To sum it up: you'd like the session tab title marquee to be configurable in cli.json. That means being able to turn it off, set the hover delay and set the scroll speed, or pick a simple preset like off / slow / normal. In 2.1.2 the timing is fixed (600 ms delay, then 80 ms per character), and animations: false only turns off the fade, so there's no way to change it today.

    One small correction: since #43936 the marquee scrolls through the title once and then resets, rather than looping forever. It still never pauses, though, so your point about readability stands.

    Related issues:

    This can't be done with a plugin right now, because plugins can't reach the tab bar's rendering. Maintainers will consider the request.

  2. Dante-dan commented on Oct 22, 2026

    @Dante-dan
    Contributor

    I’d take the preset option for a small first change:

    { "tabs": { "marquee": "slow" } }
    • normal (default): retain the current 600 ms hover delay and 80 ms per cell.
    • slow: propose 1200 ms before starting and 160 ms per cell, reducing accidental starts and halving the movement rate.
    • off: keep titles truncated without starting marquee timers; retain normal tab hover/click behavior.

    In current dev, both horizontal and vertical tabs use the same createTabMarquee / createMarquee helpers. I’d pass the resolved preset through those helpers, retain the existing one-pass-and-reset behavior, and leave animations controlling the fade. A config reload would cancel any pending/running scroll and reset its offset before applying the new preset.

    The change would cover the tabs schema/default resolution and CLI config docs. Validation would extend the existing marquee fake-timer tests for default/slow timing, no scrolling with off, reload/leave/disposal cleanup, and the existing overflow/one-pass behavior, plus check both tab layouts and wide-character titles.

    This is a source-based proposal; I haven’t changed code or run these checks. Could a maintainer approve this preset interface and the proposed slow timing before I implement it?

  3. xzyangha commented on Oct 22, 2026

    @xzyangha
    Author

    Implemented and opened a PR: #58061.

    It follows the preset interface discussed above — tabs.marquee in cli.json, with normal (600 ms before the first cell, 80 ms per cell; unchanged default), slow (1200 ms / 160 ms) and off (titles stay truncated and no marquee timers start).

    Both the horizontal strip and the vertical rail pass the resolved preset into the existing createMarquee / createTabMarquee helpers, so the one-pass-and-reset motion is unchanged and animations still only controls the fade. The preset is read reactively, so a config reload cancels a pending or running scroll and resets the offset before the new preset applies.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions