Skip to content

feat(tui): streamline tab navigation shortcuts - #40551

Merged
kitlangton merged 1 commit into
v2from
tab-shortcuts
Aug 5, 2026
Merged

feat(tui): streamline tab navigation shortcuts#40551
kitlangton merged 1 commit into
v2from
tab-shortcuts

Conversation

@kitlangton

Copy link
Copy Markdown
Contributor

What

Adopt the conversation-navigation shortcut convention used by Slack and Mattermost for open session tabs:

  • Option+Up / Option+Down switch to the previous / next open tab.
  • Option+Shift+Up / Option+Shift+Down switch to the previous / next unread tab.
  • Ctrl+Shift+Tab / Ctrl+Tab remain available as conventional tab-navigation aliases.

This removes the leader-arrow and Option-Shift-bracket tab aliases. The displaced message and user-message navigation commands remain configurable but are unbound by default.

Before / After

Before: Option-arrow shortcuts navigated messages within the current transcript. Unread tab navigation filtered the tab list before cycling, which discarded the active tab's position and made next unread choose the first unread tab while previous unread chose the last.

After: Option arrows navigate session tabs consistently. Unread navigation scans from the active tab through the full ordered tab list, skips tabs without unread activity or attention, and wraps at either end.

How

  • Update default bindings in packages/tui/src/config/v1/keybind.ts.
  • Extend cycleSessionTab with an optional predicate so filtered traversal retains the active tab as its origin.
  • Use that predicate for unread and attention traversal in the session tabs context.
  • Cover the new defaults and nearest-matching traversal behavior with regression tests.

Scope

  • Message-navigation commands are not removed; users can still assign custom bindings.
  • This does not change tab rendering or unread-state production.

Testing

  • bun run test from packages/tui: 593 passed, 5 skipped, 0 failed.
  • bun typecheck from packages/tui.
  • Push hook repository typecheck: 33 tasks passed.
  • git diff --check.

@kitlangton
kitlangton enabled auto-merge (squash) August 5, 2026 01:32
@kitlangton
kitlangton merged commit ab20a7b into v2 Aug 5, 2026
10 checks passed
@kitlangton
kitlangton deleted the tab-shortcuts branch August 5, 2026 01:36
github-actions Bot pushed a commit to ReStranger/opencode that referenced this pull request Aug 5, 2026
* upstream/v2: (28 commits)
  refactor(app): gate unsupported v2 capabilities (anomalyco#40381)
  fix(app): show active search details (anomalyco#40597)
  refactor(app): migrate supported v2 APIs (anomalyco#40378)
  fix(app): reconcile v2 session projections (anomalyco#40376)
  refactor(app): own rendering contracts (anomalyco#40375)
  fix(core): make xAI OAuth device-only (anomalyco#40538)
  test(app): migrate e2e fixtures to v2 (anomalyco#40374)
  fix(core): report missing shell workdir (anomalyco#40542)
  fix(ai): restore Responses tool input semantics (anomalyco#40553)
  fix(ai): classify malformed Responses tool calls (anomalyco#40549)
  feat(tui): streamline tab navigation shortcuts (anomalyco#40551)
  fix(ai): preserve Gemini tool finish semantics (anomalyco#40546)
  fix: retry empty incomplete streams (anomalyco#40535)
  fix(app): finish tool call ID rename (anomalyco#40539)
  refactor: rename tool call ID fields
  fix(client): wait for live service contenders (anomalyco#40515)
  chore(core): drop unreachable AI SDK provider packages (anomalyco#40504)
  fix(tui): update tab titles immediately (anomalyco#40318)
  fix(tui): show branch beside directory (anomalyco#40500)
  feat(vcs): publish branch updates (anomalyco#40371)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant