diff --git a/codex-rs/tui/src/analytics/chrome.rs b/codex-rs/tui/src/analytics/chrome.rs index 243ac812bc..b30f8de245 100644 --- a/codex-rs/tui/src/analytics/chrome.rs +++ b/codex-rs/tui/src/analytics/chrome.rs @@ -97,7 +97,10 @@ impl AnalyticsView { pub(super) fn help_lines(&self, width: usize) -> Vec> { let mut controls = vec![ - "Tab / Shift+Tab · next / previous report".to_owned(), + format!( + "Tab / {} · next / previous report", + crate::key_hint::shift(crossterm::event::KeyCode::Tab).display_label() + ), format!( "1–{} · open a report directly", self.visible_sections().len() @@ -145,8 +148,9 @@ impl AnalyticsView { self.hint(ListAction::Accept) ), format!( - "{} · back; q / ctrl+c · close usage", - self.hint(ListAction::Cancel) + "{} · back; q / {} · close usage", + self.hint(ListAction::Cancel), + crate::key_hint::ctrl(crossterm::event::KeyCode::Char('c')).display_label() ), ]); if self.help_shortcut_available() { diff --git a/codex-rs/tui/src/analytics/snapshots/codex_tui__analytics__tests__redesign__narrow_help.snap b/codex-rs/tui/src/analytics/snapshots/codex_tui__analytics__tests__redesign__narrow_help.snap index 444e31682f..96743c2dfc 100644 --- a/codex-rs/tui/src/analytics/snapshots/codex_tui__analytics__tests__redesign__narrow_help.snap +++ b/codex-rs/tui/src/analytics/snapshots/codex_tui__analytics__tests__redesign__narrow_help.snap @@ -8,13 +8,13 @@ expression: help " Usage shortcuts " " " " " -" Tab / Shift+Tab · next / previous " -" report " +" Tab / ⇧tab · next / previous report " " 1–5 · open a report directly " " ← / → · select chart day or plan " " window " " ↑ / ↓ · select chat or plan period; " " scroll Overview " " enter · expand or collapse details " +" pgup / pgdn · scroll report " " esc back · pgup/pgdn scroll " " ? close help " diff --git a/codex-rs/tui/src/app/owned_transcript_browsing_tests.rs b/codex-rs/tui/src/app/owned_transcript_browsing_tests.rs index 0bcc70d6a5..a99d280cd8 100644 --- a/codex-rs/tui/src/app/owned_transcript_browsing_tests.rs +++ b/codex-rs/tui/src/app/owned_transcript_browsing_tests.rs @@ -260,7 +260,7 @@ async fn browsing_details_use_the_remapped_chord_without_cancelling_preview() -> .expect("footer") .text .to_string() - .contains("ctrl+x ctrl+t") + .contains("⌃x ⌃t") ); for (keys, expected_details) in [ ( diff --git a/codex-rs/tui/src/app/owned_transcript_tests.rs b/codex-rs/tui/src/app/owned_transcript_tests.rs index 46c0da6d9e..c367de1bad 100644 --- a/codex-rs/tui/src/app/owned_transcript_tests.rs +++ b/codex-rs/tui/src/app/owned_transcript_tests.rs @@ -998,7 +998,7 @@ async fn offline_find_closes_before_the_next_ctrl_c_quits() -> Result<()> { rendered.lines().nth(usize::from(cursor.y)).map(str::trim), Some("Find: needle") ); - assert!(!rendered.contains("ctrl+c quit")); + assert!(!rendered.contains("⌃c quit")); let close = TuiEvent::Key(KeyEvent::new(KeyCode::Char('c'), KeyModifiers::CONTROL)); assert!(matches!( app.handle_tui_event(&mut tui, &mut app_server, close) diff --git a/codex-rs/tui/src/app/resize_reflow_tests.rs b/codex-rs/tui/src/app/resize_reflow_tests.rs index c1c3994971..d1cf18a7de 100644 --- a/codex-rs/tui/src/app/resize_reflow_tests.rs +++ b/codex-rs/tui/src/app/resize_reflow_tests.rs @@ -164,8 +164,8 @@ async fn capped_resize_reflow_prepends_transcript_notice_without_changing_transc .map(rendered_line_text) .collect::>() .join("\n"), - @r" - Earlier messages are available — press ctrl+t to view the full transcript + @" + Earlier messages are available — press ⌃t to view the full transcript cell 8 cell 9 @@ -195,8 +195,8 @@ async fn capped_resize_reflow_counts_wrapped_notice_rows() { .join("\n"), @" Earlier messages are - available — press ctrl+t to - view the full transcript + available — press ⌃t to view + the full transcript cell 9 cell 10 @@ -243,8 +243,8 @@ async fn paginated_resize_reflow_prepends_transcript_notice_for_unloaded_history .map(rendered_line_text) .collect::>() .join("\n"), - @r" - Earlier messages are available — press ctrl+t to view the full transcript + @" + Earlier messages are available — press ⌃t to view the full transcript cell 0 cell 1 diff --git a/codex-rs/tui/src/app/side.rs b/codex-rs/tui/src/app/side.rs index da306d6ff0..bed8fe1d2a 100644 --- a/codex-rs/tui/src/app/side.rs +++ b/codex-rs/tui/src/app/side.rs @@ -281,7 +281,10 @@ impl App { ) { label_parts.push(format!("{} to switch", binding.display_label())); } - label_parts.push("ctrl+c to close".to_string()); + label_parts.push(format!( + "{} to close", + crate::key_hint::ctrl(KeyCode::Char('c')).display_label() + )); self.chat_widget .set_side_conversation_context_label(Some(format!("Side {}", label_parts.join(" · ")))); } diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown.snap index 51098bcf5c..f47e15c47b 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: normalize_agent_center_snapshot(&cached) --- " Agent command center Group: Project g " -" All 1 Needs you 0 Working 0 Ready 1 Inactive 0 tab/shift+tab filter " +" All 1 Needs you 0 Working 0 Ready 1 Inactive 0 tab/⇧tab filter " " ──────────────────────────────────────────────────────────────────────────────────────────── " " Tasks │ Task details " " /tmp/project 1 │ " diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_long_lines.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_long_lines.snap index 142e4dd573..bf829b8588 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_long_lines.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_long_lines.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: "normalize_agent_center_snapshot(render_bottom_popup(&app.chat_widget, 96))" --- Agent command center Group: Project g - All 1 Needs you 0 Working 0 Ready 1 Inactive 0 tab/shift+tab filter + All 1 Needs you 0 Working 0 Ready 1 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 1 │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_table.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_table.snap index 90434f3d7e..9237bb0614 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_table.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_markdown_table.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: "normalize_agent_center_snapshot(render_bottom_popup(&app.chat_widget, 96))" --- Agent command center Group: Project g - All 1 Needs you 0 Working 0 Ready 1 Inactive 0 tab/shift+tab filter + All 1 Needs you 0 Working 0 Ready 1 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 1 │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_model_grouping.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_model_grouping.snap index 7495578795..8d5ebbee44 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_model_grouping.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__agents_overview_model_grouping.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: "render_bottom_popup(&app.chat_widget,\n100).replace(&test_path_display(\"/tmp/project\"),\n\"/tmp/project\").replace(\"fwd del\", \"del\")" --- Agent command center Group: Model g - All 4 Needs you 0 Working 0 Ready 4 Inactive 0 tab/shift+tab filter + All 4 Needs you 0 Working 0 Ready 4 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details Unknown 1 │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_columns.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_columns.snap index b16cb94bb0..38606c71fb 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_columns.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_columns.snap @@ -3,7 +3,7 @@ source: tui/src/app/agent_center_tests.rs expression: "screen(&view, 160, 22)" --- Agent command center Group: Project g - All 6 Needs you 2 Working 1 Ready 2 Inactive 1 tab/shift+tab filter + All 6 Needs you 2 Working 1 Ready 2 Inactive 1 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Tasks Status Updated │ Task details /tmp/project 6 │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_footer.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_footer.snap index 47fe459793..064666dbc8 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_footer.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_footer.snap @@ -3,7 +3,7 @@ source: tui/src/app/agent_center_tests.rs expression: "screen(&view, 100, 12)" --- Agent command center Group: Project g - All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/shift+tab filter + All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────────── No tasks yet │ │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap index 6792b3390b..d9a12f8533 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_custom_help.snap @@ -1,20 +1,21 @@ --- source: tui/src/app/agent_center_tests.rs +assertion_line: 450 expression: "screen(&view, 100, 24)" --- Agent command center Group: Project g - All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/shift+tab filter + All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────────── Task shortcuts - Navigate Tasks View - k Up n New tab/shift+tab Filter - j Down o Resume f3 Search - enter Open f Fork g Group - pgdn Page down z r Rename - ctrl+c Quit x Stop - h Hide - backspace Delete + Navigate Tasks View + k Up n New tab/⇧tab Filter + j Down o Resume f3 Search + enter Open f Fork g Group + pgdn Page down z r Rename + ⌃c Quit x Stop + h Hide + backspace Delete diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap index b77c12819b..e93cc80c54 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_one_column.snap @@ -8,12 +8,12 @@ expression: "screen(&view, width, height)" Task shortcuts Navigate - ↑ Up - ↓ Down - enter Open - pgup Page up - pgdn Page down - ctrl+c Quit + ↑ Up + ↓ Down + enter Open + pgup Page up + pgdn Page down + ⌃c Quit Tasks n New @@ -27,9 +27,9 @@ expression: "screen(&view, width, height)" backspace Delete View - tab/shift+tab Filter - f3 Search - g Group + tab/⇧tab Filter + f3 Search + g Group diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap index 7a120b8f04..6adc83d65f 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_three_columns.snap @@ -1,22 +1,23 @@ --- source: tui/src/app/agent_center_tests.rs +assertion_line: 328 expression: "screen(&view, width, height)" --- Agent command center Group: Project g - All 3 Needs you 1 Working 0 Ready 1 Inactive 1 tab/shift+tab filter + All 3 Needs you 1 Working 0 Ready 1 Inactive 1 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────────── Task shortcuts - Navigate Tasks View - ↑ Up n New tab/shift+tab Filter - ↓ Down w New worktree f3 Search - enter Open o Resume g Group - pgup Page up f Fork - pgdn Page down r Rename - ctrl+c Quit x Stop - a Archive - h Hide - backspace Delete + Navigate Tasks View + ↑ Up n New tab/⇧tab Filter + ↓ Down w New worktree f3 Search + enter Open o Resume g Group + pgup Page up f Fork + pgdn Page down r Rename + ⌃c Quit x Stop + a Archive + h Hide + backspace Delete diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap index b748287723..416757503d 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_help_two_columns.snap @@ -7,21 +7,21 @@ expression: "screen(&view, width, height)" ──────────────────────────────────────────────────────── Task shortcuts - Navigate Tasks - ↑ Up n New - ↓ Down w New worktree - enter Open o Resume - pgup Page up f Fork - pgdn Page down r Rename - ctrl+c Quit x Stop - a Archive - h Hide - backspace Delete + Navigate Tasks + ↑ Up n New + ↓ Down w New worktree + enter Open o Resume + pgup Page up f Fork + pgdn Page down r Rename + ⌃c Quit x Stop + a Archive + h Hide + backspace Delete - View - tab/shift+tab Filter - f3 Search - g Group + View + tab/⇧tab Filter + f3 Search + g Group diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap index a51731cbb7..a29c98f2c0 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__command_center__live_center_navigation_and_complete_hints.snap @@ -8,12 +8,12 @@ expression: "screen(&view, width, height)" Task shortcuts Navigate - ↑ Up - ↓ Down - enter Open - pgup Page up - pgdn Page down - ctrl+c Quit + ↑ Up + ↓ Down + enter Open + pgup Page up + pgdn Page down + ⌃c Quit Tasks n New diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__usage__agents_overview_usage.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__usage__agents_overview_usage.snap index 192397606a..6690990eb2 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__usage__agents_overview_usage.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__agents_overview__tests__usage__agents_overview_usage.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_usage_tests.rs expression: "render_bottom_popup(&app.chat_widget,\n96).replace(&format!(\"{project} 2\"),\n&group).replace(&project, \"/tmp/project\").replace(\"fwd del\", \"del\")" --- Agent command center Group: Project g - All 2 Needs you 1 Working 0 Ready 1 Inactive 0 tab/shift+tab filter + All 2 Needs you 1 Working 0 Ready 1 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 2 │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__composer_hints__tests__composer_usage_notice.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__composer_hints__tests__composer_usage_notice.snap index deba777663..d598740ad4 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__composer_hints__tests__composer_usage_notice.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__composer_hints__tests__composer_usage_notice.snap @@ -63,7 +63,7 @@ Conversation row 19 • Queued follow-up inputs ↳ queued follow-up - shift+← edit last queued message + ⇧← edit last queued message ⚠ 5h limit: only 2% left · /status › draft stays @@ -77,7 +77,7 @@ Conversation row 19 • Queued follow-up inputs ↳ queued follow-up - shift+← edit last queued message + ⇧← edit last queued message › draft stays second line diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__browsing__browsing_footer.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__browsing__browsing_footer.snap index 83174e878c..d636eb2f1f 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__browsing__browsing_footer.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__browsing__browsing_footer.snap @@ -1,6 +1,5 @@ --- source: tui/src/app/owned_transcript_browsing_tests.rs -assertion_line: 169 expression: "snapshots.join(\"\\n\\n\")" --- 80 columns @@ -11,7 +10,7 @@ expression: "snapshots.join(\"\\n\\n\")" › second prompt -Browsing · ↑↓/jk scroll · ←→/hl prompts · ctrl+t details · ↵ rewind · esc back +Browsing · ↑↓/jk scroll · ←→/hl prompts · ⌃t details · ↵ rewind · esc back 32 columns / T R A N S C R I P T / / / / / diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_command_center.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_command_center.snap index 5d53e4c526..13b9d829d2 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_command_center.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_command_center.snap @@ -3,7 +3,7 @@ source: tui/src/app/owned_transcript_tests.rs expression: "crate::chatwidget::tests::helpers::normalize_agent_center_snapshot(crate::chatwidget::tests::helpers::render_bottom_popup(&app.chat_widget,\n96,))" --- Agent command center Group: Project g - All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/shift+tab filter + All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Loading tasks… │ │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_offline_command_center.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_offline_command_center.snap index dd363be954..ddecb64623 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_offline_command_center.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__external_writer_escape_offline_command_center.snap @@ -3,7 +3,7 @@ source: tui/src/app/owned_transcript_tests.rs expression: "crate::chatwidget::tests::helpers::normalize_agent_center_snapshot(crate::chatwidget::tests::helpers::render_bottom_popup(&app.chat_widget,\n96,))" --- Agent command center Group: Project g - All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/shift+tab filter + All 0 Needs you 0 Working 0 Ready 0 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Reconnecting… │ │ diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_find_pending_chord_footer.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_find_pending_chord_footer.snap index 32ccfda0b8..8b5f46ad2d 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_find_pending_chord_footer.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_find_pending_chord_footer.snap @@ -3,4 +3,4 @@ source: tui/src/app/owned_transcript_tests.rs expression: "rendered.lines().skip(usize::from(cursor.y)).take(2).map(str::trim).collect::>().join(\"\\n\")" --- Find: alpha betax -ctrl+x then · h move line start · esc cancel +⌃x then · h move line start · esc cancel diff --git a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_history_loading_footer.snap b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_history_loading_footer.snap index c1cfae6862..c72a35d24b 100644 --- a/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_history_loading_footer.snap +++ b/codex-rs/tui/src/app/snapshots/codex_tui__app__owned_transcript__tests__owned_history_loading_footer.snap @@ -9,7 +9,7 @@ expression: "snapshots.join(\"\\n\\n\")" ↑ Loading earlier messages… · esc latest 80 columns · Failed - Retry history: ⌥ Result<()> { ); assert_snapshot!( format!("{input_footer}\n{approval_footer}\n{cleared_footer}"), - @r" - Side from main thread · main needs input · ctrl+/ to switch · ctrl+c to close - Side from main thread · main needs approval · ctrl+/ to switch · ctrl+c to close - Side from main thread · ctrl+/ to switch · ctrl+c to close - " + @" + Side from main thread · main needs input · ⌃/ to switch · ⌃c to close + Side from main thread · main needs approval · ⌃/ to switch · ⌃c to close + Side from main thread · ⌃/ to switch · ⌃c to close + " ); Ok(()) @@ -6710,7 +6710,7 @@ async fn capped_resize_reflow_renders_recent_suffix_only() { .map(rendered_line_text) .collect::>(), vec![ - "Earlier messages are available — press ctrl+t to view the full transcript".to_string(), + "Earlier messages are available — press ⌃t to view the full transcript".to_string(), String::new(), "cell 18".to_string(), String::new(), diff --git a/codex-rs/tui/src/app/tests/key_chords.rs b/codex-rs/tui/src/app/tests/key_chords.rs index 95fcee0a52..35d8d52cf6 100644 --- a/codex-rs/tui/src/app/tests/key_chords.rs +++ b/codex-rs/tui/src/app/tests/key_chords.rs @@ -110,11 +110,11 @@ async fn global_chord_keeps_hints_and_completes_before_deadline() -> Result<()> insta::assert_snapshot!( render_bottom_popup(&app.chat_widget, /*width*/ 80) .replace(&test_path_display("/tmp/project"), "/tmp/project"), - @r" - › Ask Codex to do anything + @" + › Ask Codex to do anything - ctrl+x then · ctrl+t open transcript · ctrl+u interrupt turn · esc cancel - " + ⌃x then · ⌃t open transcript · ⌃u interrupt turn · esc cancel + " ); press(&mut app, &mut tui, &mut app_server, ctrl('t')).await?; @@ -693,7 +693,7 @@ async fn dashboard_chord_hint_survives_refresh_and_clears_on_cancel() -> Result< let _ = app.agents_overview_view(Vec::new(), /*selected_thread_id*/ None); insta::assert_snapshot!( render_bottom_popup(&app.chat_widget, /*width*/ 80).lines().last().unwrap(), - @" ctrl+x then n new task esc cancel" + @" ⌃x then n new task esc cancel" ); assert_eq!( app.route_key_chord_event(&mut tui, KeyCode::Esc.into()), diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__reconnect_failed.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__reconnect_failed.snap index f0ab661ff0..560a973eb7 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__reconnect_failed.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__reconnect_failed.snap @@ -7,4 +7,4 @@ expression: "render_bottom_popup(&app.chat_widget, 80)" › Ask Codex to do anything - ctrl+c quit + ⌃c quit diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__restored_conversation.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__restored_conversation.snap index d7b02a4d9b..df0ee6c0a1 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__restored_conversation.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__active_reconnect__restored_conversation.snap @@ -4,4 +4,4 @@ expression: "render_bottom_popup(&app.chat_widget, 80)" --- › kept draft - gpt-test default Plan mode (shift+tab to cycle) + gpt-test default Plan mode (⇧tab to cycle) diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_exit_tests__external_writer_view_respects_remapped_left.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_exit_tests__external_writer_view_respects_remapped_left.snap index 6b2ac7065a..c56f3be66d 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_exit_tests__external_writer_view_respects_remapped_left.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__background_exit_tests__external_writer_view_respects_remapped_left.snap @@ -5,4 +5,4 @@ expression: "render_bottom_popup(&app.chat_widget, 96)" 🔒 This conversation is open in another app r to retry Close it there and press R to continue here. - r retry f fork esc command center ctrl+c/q exit ← transcript + r retry f fork esc command center ⌃c/q exit ← transcript diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__buffered_replay__misalignment_replayed_input.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__buffered_replay__misalignment_replayed_input.snap index 0b0bc95459..be3966d992 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__buffered_replay__misalignment_replayed_input.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__buffered_replay__misalignment_replayed_input.snap @@ -4,7 +4,7 @@ expression: "normalize_snapshot_paths(render_bottom_popup(&app.chat_widget, 80)) --- • Queued follow-up inputs ↳ keep queued - shift+← edit last queued message + ⇧← edit last queued message › keep draft diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__disconnect__offline_draft.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__disconnect__offline_draft.snap index fcd2963fdb..139c4dd438 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__disconnect__offline_draft.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__disconnect__offline_draft.snap @@ -9,8 +9,8 @@ expression: "format!(\"{}\\n{}\",\nlines_to_single_string(&app.transcript_cells. • Queued follow-up inputs ↳ queued before disconnect - shift+← edit last queued message + ⇧← edit last queued message › keep this draft! - ctrl+c quit + ⌃c quit diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__navigation_reconnect__daemon_command_center_vanished_rename.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__navigation_reconnect__daemon_command_center_vanished_rename.snap index 9ccef21bab..6db11f50d8 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__navigation_reconnect__daemon_command_center_vanished_rename.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__navigation_reconnect__daemon_command_center_vanished_rename.snap @@ -3,7 +3,7 @@ source: tui/src/app/tests/navigation_reconnect_tests.rs expression: "render_bottom_popup(&app.chat_widget, 100)" --- Agent command center Group: Project g - All 2 Needs you 0 Working 1 Ready 1 Inactive 0 tab/shift+tab filter + All 2 Needs you 0 Working 1 Ready 1 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 2 │ diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__pagination_completion_tests__older_pagination_completion_footers_follow_answers_without_overlap_duplicates.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__pagination_completion_tests__older_pagination_completion_footers_follow_answers_without_overlap_duplicates.snap index 2328726bb2..3aa7024151 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__pagination_completion_tests__older_pagination_completion_footers_follow_answers_without_overlap_duplicates.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__pagination_completion_tests__older_pagination_completion_footers_follow_answers_without_overlap_duplicates.snap @@ -2,7 +2,7 @@ source: tui/src/app/tests/pagination_completion_tests.rs expression: "afternoon_clock.replace_all(&snapshots.join(\"\\n\\n--- next overlapping page ---\\n\\n\"),\n\"at 2:$1 PM\",)" --- -Earlier messages are available — press ctrl+t to view the full transcript +Earlier messages are available — press ⌃t to view the full transcript • Middle answer Worked for 2m 5s • Sep 6, 2000 at 2:33 PM diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__voice_partial_completed_after_thread_switch.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__voice_partial_completed_after_thread_switch.snap index 5c3a9d2bce..95d7bc67c5 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__voice_partial_completed_after_thread_switch.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__realtime_requests__voice_partial_completed_after_thread_switch.snap @@ -1,6 +1,5 @@ --- source: tui/src/app/tests/realtime_requests.rs -assertion_line: 479 expression: "normalize_voice_snapshot_directory(&format!(\"Other task:\\n{other_ui}\\nRestored owner:\\n{}\\n{rendered}\",\nrender_bottom_popup(&app.chat_widget, 80)), &app.config.cwd,)" --- Other task: @@ -8,7 +7,7 @@ Other task: gpt-test default · /tmp/project Restored owner: - voice ● listening ctrl+x mute /voice stop + voice ● listening ⌃x mute /voice stop mic ▁▁▁▁▁▁ codex ▁▁▁▁▁▁ › Ask Codex to do anything diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__startup_warnings_tests__deduplicated_deprecation_transcript.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__startup_warnings_tests__deduplicated_deprecation_transcript.snap index edd3e5f0c7..b72c6a90e3 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__startup_warnings_tests__deduplicated_deprecation_transcript.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__startup_warnings_tests__deduplicated_deprecation_transcript.snap @@ -13,7 +13,7 @@ Buffer { "› Hello ", " Please say hello. ", " ", - "Ctrl+Space select ", + "⌃space select ", " ↑/↓ to scroll · pgup/pgdn to page · home/end to jump ", " q close · f3 find · esc browse prompts ", " ", @@ -28,8 +28,8 @@ Buffer { x: 0, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD | DIM, x: 2, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 8, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 10, y: 8, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 17, y: 8, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 8, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 13, y: 8, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 0, y: 9, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 1, y: 9, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, x: 4, y: 9, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, diff --git a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__transcript_composer__transcript_flag_off_viewer.snap b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__transcript_composer__transcript_flag_off_viewer.snap index a5e84b95ea..dba00b21a7 100644 --- a/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__transcript_composer__transcript_flag_off_viewer.snap +++ b/codex-rs/tui/src/app/tests/snapshots/codex_tui__app__tests__transcript_composer__transcript_flag_off_viewer.snap @@ -1,6 +1,5 @@ --- source: tui/src/app/tests/transcript_composer.rs -assertion_line: 267 expression: buffer_text(&buffer) --- / T R A N S C R I P T / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / @@ -11,6 +10,6 @@ expression: buffer_text(&buffer) › second -Ctrl+Space select +⌃space select ↑/↓ to scroll · pgup/pgdn to page · home/end to jump q close · f3 find · esc browse prompts diff --git a/codex-rs/tui/src/bottom_pane/approval_overlay/clipping_tests.rs b/codex-rs/tui/src/bottom_pane/approval_overlay/clipping_tests.rs index 5413d50db6..6193ac9b0a 100644 --- a/codex-rs/tui/src/bottom_pane/approval_overlay/clipping_tests.rs +++ b/codex-rs/tui/src/bottom_pane/approval_overlay/clipping_tests.rs @@ -54,7 +54,7 @@ fn clipped_exec_approval_opens_the_complete_command() { }) .collect(); let elision = rows.iter().find(|row| row.contains("[…")).unwrap(); - assert_eq!(elision.contains("ctrl+g view all"), binding.is_some()); + assert_eq!(elision.contains("⌃g view all"), binding.is_some()); assert!(rows.last().unwrap().contains("cancel")); assert!(!rows.iter().any(|row| row.contains("destructive_suffix"))); assert!(!rows.iter().any(|row| row.contains("reason_suffix"))); diff --git a/codex-rs/tui/src/bottom_pane/approval_overlay/snapshots/codex_tui__bottom_pane__approval_overlay__clipping_tests__clipped_exec_approval_opens_the_complete_command.snap b/codex-rs/tui/src/bottom_pane/approval_overlay/snapshots/codex_tui__bottom_pane__approval_overlay__clipping_tests__clipped_exec_approval_opens_the_complete_command.snap index 4747b441fb..5756e844ca 100644 --- a/codex-rs/tui/src/bottom_pane/approval_overlay/snapshots/codex_tui__bottom_pane__approval_overlay__clipping_tests__clipped_exec_approval_opens_the_complete_command.snap +++ b/codex-rs/tui/src/bottom_pane/approval_overlay/snapshots/codex_tui__bottom_pane__approval_overlay__clipping_tests__clipped_exec_approval_opens_the_complete_command.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/approval_overlay/clipping_tests.rs -assertion_line: 100 expression: "snapshots.join(\"\\n\\n\")" --- bound=true 80x14 @@ -14,7 +13,7 @@ bound=true 80x14 reason requiring review.A reason requiring review.A reason requiring review.A reason requiring review.A reason requiring review.A reason requiring review.A reason requiring review.A reason requiring review.A - [… 34 lines] ctrl+g view all + [… 34 lines] ⌃g view all › 1. Yes, proceed (y) 2. No, and tell Codex what to do differently (esc) Press enter to confirm or esc to cancel @@ -24,7 +23,7 @@ bound=true 40x10 Would you like to run the following command? - [… 43 lines] ctrl+g view all + [… 43 lines] ⌃g view all › 1. Yes, proceed (y) 2. No, and tell Codex what to do differently (esc) @@ -34,7 +33,7 @@ bound=true 40x10 bound=true 40x8 Would you like to run the following - [… 43 lines] ctrl+g view all + [… 43 lines] ⌃g view all › 1. Yes, proceed (y) 2. No, and tell Codex what to do differently (esc) @@ -43,7 +42,7 @@ bound=true 40x8 bound=true 40x7 - [… 43 lines] ctrl+g view all + [… 43 lines] ⌃g view all › 1. Yes, proceed (y) 2. No, and tell Codex what to do differently (esc) diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_capped_other.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_capped_other.snap index 4ed880ac8b..d18873d730 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_capped_other.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_capped_other.snap @@ -16,5 +16,4 @@ expression: buffer_text(&buffer) long draft - enter submit ctrl+] skip - shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_inline_history_search.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_inline_history_search.snap index 6d2565db54..f14fff3c4d 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_inline_history_search.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_inline_history_search.snap @@ -11,5 +11,5 @@ expression: buffer_text(&buffer) › 13. earlier answer reverse-i-search: e enter accept · esc - enter submit ctrl+] skip option 13/13 - shift+→ prev question + enter submit ⌃] skip option 13/13 + ⇧→ prev question diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_named_other.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_named_other.snap index 6bf8f6aa91..609e2fe8f2 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_named_other.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_named_other.snap @@ -9,5 +9,4 @@ expression: buffer_text(&buffer) › 1. Other 2. Other (write an answer) - enter submit ctrl+] skip - shift+→ prev question + enter submit ⌃] skip ⇧→ prev question diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_narrow_other.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_narrow_other.snap index ea22bbc560..03046821d2 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_narrow_other.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_narrow_other.snap @@ -8,4 +8,4 @@ expression: buffer_text(&buffer) d › x ente… - ctrl… + ⌃]… diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_options_width_boundary.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_options_width_boundary.snap index e5de46ab14..0de7d9abf5 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_options_width_boundary.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_options_width_boundary.snap @@ -13,8 +13,8 @@ Full height: 3. Other enter submit - ctrl+] skip - shift+→ main prompt + ⌃] skip + ⇧→ main prompt Clipped: diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_remapped_choice_footer.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_remapped_choice_footer.snap index 8e143ef143..7372f85557 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_remapped_choice_footer.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_remapped_choice_footer.snap @@ -11,5 +11,5 @@ expression: buffer_text(&buffer) 2. Option 2 is long enough to wrap across rows - f9 submit ctrl+] skip option 1/13 - shift+→ prev question + f9 submit ⌃] skip option 1/13 + ⇧→ prev question diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_named_option.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_named_option.snap index 6216fcead5..bc318ba4ab 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_named_option.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_named_option.snap @@ -10,5 +10,5 @@ expression: buffer_text(&buffer) multiple rows 2. Other - enter submit ctrl+] skip - shift+→ main prompt + enter submit ⌃] skip + ⇧→ main prompt diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_other.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_other.snap index 4ab15014dd..d45f3cd78a 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_other.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_other.snap @@ -12,5 +12,5 @@ expression: buffer_text(&buffer) wraps across several option rows - enter submit ctrl+] skip - shift+→ main prompt + enter submit ⌃] skip + ⇧→ main prompt diff --git a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_selected_option.snap b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_selected_option.snap index d6786b87ed..af792ef379 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_selected_option.snap +++ b/codex-rs/tui/src/bottom_pane/async_questions/snapshots/codex_tui__bottom_pane__async_questions__tests__question_wrapped_selected_option.snap @@ -9,5 +9,5 @@ expression: buffer_text(&clipped) long enough to wrap across multiple rows - enter submit ctrl+] skip - option 2/3 shift+→ main prompt + enter submit ⌃] skip + option 2/3 ⇧→ main prompt diff --git a/codex-rs/tui/src/bottom_pane/async_questions/state_tests.rs b/codex-rs/tui/src/bottom_pane/async_questions/state_tests.rs index 55f15cb8de..9b4ada31f7 100644 --- a/codex-rs/tui/src/bottom_pane/async_questions/state_tests.rs +++ b/codex-rs/tui/src/bottom_pane/async_questions/state_tests.rs @@ -445,7 +445,7 @@ fn existing_cross_context_keymaps_load_without_misleading_submit_hints() { let mut editor = editor(); editor.navigate(/*forward*/ true); editor.set_keymap(&keymap); - insta::allow_duplicates! { insta::assert_snapshot!(editor.footer_lines(/*width*/ 100, /*option_tip*/ None)[0].to_string(), @"ctrl+] skip shift+→ prev question"); } + insta::allow_duplicates! { insta::assert_snapshot!(editor.footer_lines(/*width*/ 100, /*option_tip*/ None)[0].to_string(), @"⌃] skip ⇧→ prev question"); } editor.handle_key_event(KeyEvent::from(KeyCode::F(12))); assert!(editor.submission.is_none()); } diff --git a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_hides_visible_sparkles_without_restarting_their_deadline.snap b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_hides_visible_sparkles_without_restarting_their_deadline.snap index 79185244d1..8411b1ee54 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_hides_visible_sparkles_without_restarting_their_deadline.snap +++ b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_hides_visible_sparkles_without_restarting_their_deadline.snap @@ -12,19 +12,19 @@ shortcut help: Keyboard shortcuts Compose Session - / Commands tab Send message - @ Mention files ⌥, Less reasoning - ! Shell command ⌥. More reasoning - ctrl+j New line f4 Inspect activity - ctrl+v Paste image ctrl+c Quit - ctrl+g External editor - ctrl+r Search history Transcript (open first) - esc esc Edit last message ctrl+t Open transcript - f3 Find text - pgup / pgdn Scroll - ctrl+space Start selection - ctrl+home / ctrl+end Top / latest - shift+⌥, / shift+⌥. Top / latest + / Commands tab Send message + @ Mention files ⌥, Less reasoning + ! Shell command ⌥. More reasoning + ⌃j New line f4 Inspect activity + ⌃v Paste image ⌃c Quit + ⌃g External editor + ⌃r Search history Transcript (open first) + esc esc Edit last message ⌃t Open transcript + f3 Find text + pgup / pgdn Scroll + ⌃space Start selection + ⌃home / ⌃end Top / latest + ⇧⌥, / ⇧⌥. Top / latest /keymap customize @@ -47,19 +47,19 @@ shortcut help: Keyboard shortcuts Compose Session - / Commands tab Send message - @ Mention files ⌥, Less reasoning - ! Shell command ⌥. More reasoning - ctrl+j New line f4 Inspect activity - ctrl+v Paste image ctrl+c Quit - ctrl+g External editor - ctrl+r Search history Transcript (open first) - esc esc Edit last message ctrl+t Open transcript - f3 Find text - pgup / pgdn Scroll - ctrl+space Start selection - ctrl+home / ctrl+end Top / latest - shift+⌥, / shift+⌥. Top / latest + / Commands tab Send message + @ Mention files ⌥, Less reasoning + ! Shell command ⌥. More reasoning + ⌃j New line f4 Inspect activity + ⌃v Paste image ⌃c Quit + ⌃g External editor + ⌃r Search history Transcript (open first) + esc esc Edit last message ⌃t Open transcript + f3 Find text + pgup / pgdn Scroll + ⌃space Start selection + ⌃home / ⌃end Top / latest + ⇧⌥, / ⇧⌥. Top / latest /keymap customize diff --git a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_preserves_an_unused_sparkle_but_literal_question_marks_do_not.snap b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_preserves_an_unused_sparkle_but_literal_question_marks_do_not.snap index 0e43b92df4..e8d81f43f4 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_preserves_an_unused_sparkle_but_literal_question_marks_do_not.snap +++ b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__sparkle__tests__shortcut_help_preserves_an_unused_sparkle_but_literal_question_marks_do_not.snap @@ -6,19 +6,19 @@ shortcut help: Keyboard shortcuts Compose Session - / Commands tab Send message - @ Mention files ⌥, Less reasoning - ! Shell command ⌥. More reasoning - ctrl+j New line f4 Inspect activity - ctrl+v Paste image ctrl+c Quit - ctrl+g External editor - ctrl+r Search history Transcript (open first) - esc esc Edit last message ctrl+t Open transcript - f3 Find text - pgup / pgdn Scroll - ctrl+space Start selection - ctrl+home / ctrl+end Top / latest - shift+⌥, / shift+⌥. Top / latest + / Commands tab Send message + @ Mention files ⌥, Less reasoning + ! Shell command ⌥. More reasoning + ⌃j New line f4 Inspect activity + ⌃v Paste image ⌃c Quit + ⌃g External editor + ⌃r Search history Transcript (open first) + esc esc Edit last message ⌃t Open transcript + f3 Find text + pgup / pgdn Scroll + ⌃space Start selection + ⌃home / ⌃end Top / latest + ⇧⌥, / ⇧⌥. Top / latest /keymap customize diff --git a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__activity_shortcut_help_follows_runtime_binding.snap b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__activity_shortcut_help_follows_runtime_binding.snap index bdd1b21550..8818088ca8 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__activity_shortcut_help_follows_runtime_binding.snap +++ b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__activity_shortcut_help_follows_runtime_binding.snap @@ -13,14 +13,14 @@ expression: "snapshots.join(\"\\n---\\n\")" Keyboard shortcuts - Compose Session Transcript (open first) - / Commands tab Send message ctrl+t Open transcript - @ Mention files ⌥, Less reasoning f3 Find text - ! Shell command ⌥. More reasoning pgup / pgdn Scroll - ctrl+j New line f4 Inspect activity ctrl+space Start selection - ctrl+v Paste image ctrl+c Quit ctrl+home / ctrl+end Top / latest - ctrl+g External editor shift+⌥, / shift+⌥. Top / latest - ctrl+r Search history + Compose Session Transcript (open first) + / Commands tab Send message ⌃t Open transcript + @ Mention files ⌥, Less reasoning f3 Find text + ! Shell command ⌥. More reasoning pgup / pgdn Scroll + ⌃j New line f4 Inspect activity ⌃space Start selection + ⌃v Paste image ⌃c Quit ⌃home / ⌃end Top / latest + ⌃g External editor ⇧⌥, / ⇧⌥. Top / latest + ⌃r Search history esc esc Edit last message /keymap customize @@ -41,14 +41,14 @@ expression: "snapshots.join(\"\\n---\\n\")" Keyboard shortcuts - Compose Session Transcript (open first) - / Commands tab Send message ctrl+t Open transcript - @ Mention files ⌥, Less reasoning f3 Find text - ! Shell command ⌥. More reasoning pgup / pgdn Scroll - ctrl+j New line ctrl+x t Inspect activity ctrl+space Start selection - ctrl+v Paste image ctrl+c Quit ctrl+home / ctrl+end Top / latest - ctrl+g External editor shift+⌥, / shift+⌥. Top / latest - ctrl+r Search history + Compose Session Transcript (open first) + / Commands tab Send message ⌃t Open transcript + @ Mention files ⌥, Less reasoning f3 Find text + ! Shell command ⌥. More reasoning pgup / pgdn Scroll + ⌃j New line ⌃x t Inspect activity ⌃space Start selection + ⌃v Paste image ⌃c Quit ⌃home / ⌃end Top / latest + ⌃g External editor ⇧⌥, / ⇧⌥. Top / latest + ⌃r Search history esc esc Edit last message /keymap customize @@ -69,14 +69,14 @@ expression: "snapshots.join(\"\\n---\\n\")" Keyboard shortcuts - Compose Session Transcript (open first) - / Commands tab Send message ctrl+t Open transcript - @ Mention files ⌥, Less reasoning f3 Find text - ! Shell command ⌥. More reasoning pgup / pgdn Scroll - ctrl+j New line ctrl+c Quit ctrl+space Start selection - ctrl+v Paste image ctrl+home / ctrl+end Top / latest - ctrl+g External editor shift+⌥, / shift+⌥. Top / latest - ctrl+r Search history + Compose Session Transcript (open first) + / Commands tab Send message ⌃t Open transcript + @ Mention files ⌥, Less reasoning f3 Find text + ! Shell command ⌥. More reasoning pgup / pgdn Scroll + ⌃j New line ⌃c Quit ⌃space Start selection + ⌃v Paste image ⌃home / ⌃end Top / latest + ⌃g External editor ⇧⌥, / ⇧⌥. Top / latest + ⌃r Search history esc esc Edit last message /keymap customize diff --git a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__fullscreen_plan_cycle_hint.snap b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__fullscreen_plan_cycle_hint.snap index f083a97c97..833484264f 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__fullscreen_plan_cycle_hint.snap +++ b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__fullscreen_plan_cycle_hint.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/chat_composer/status_surface_tests.rs -assertion_line: 102 expression: wide --- @@ -14,5 +13,5 @@ expression: wide › Ask Codex - MODEL · ~/project · Context 20% used Plan mode (shift+tab to cycle) + MODEL · ~/project · Context 20% used Plan mode (⇧tab to cycle) ? for shortcuts diff --git a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_narrow.snap b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_narrow.snap index cb5cc69d5e..b0626189da 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_narrow.snap +++ b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_narrow.snap @@ -16,26 +16,26 @@ expression: text / Commands @ Mention files ! Shell command - ctrl+j New line - ctrl+v Paste image - ctrl+g External editor - ctrl+r Search history + ⌃j New line + ⌃v Paste image + ⌃g External editor + ⌃r Search history esc esc Edit last message Session - tab Send message - ⌥, Less reasoning - ⌥. More reasoning - f4 Inspect activity - ctrl+c Quit + tab Send message + ⌥, Less reasoning + ⌥. More reasoning + f4 Inspect activity + ⌃c Quit Transcript (open first) - ctrl+t Open transcript - f3 Find text - pgup / pgdn Scroll - ctrl+space Start selection - ctrl+home / ctrl+end Top / latest - shift+⌥, / shift+⌥. Top / latest + ⌃t Open transcript + f3 Find text + pgup / pgdn Scroll + ⌃space Start selection + ⌃home / ⌃end Top / latest + ⇧⌥, / ⇧⌥. Top / latest /keymap customize diff --git a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_wide.snap b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_wide.snap index e7493456d0..a1664ece77 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_wide.snap +++ b/codex-rs/tui/src/bottom_pane/chat_composer/snapshots/codex_tui__bottom_pane__chat_composer__status_surface__tests__shortcut_help_above_wide.snap @@ -12,14 +12,14 @@ expression: text Keyboard shortcuts - Compose Session Transcript (open first) - / Commands tab Send message ctrl+t Open transcript - @ Mention files ⌥, Less reasoning f3 Find text - ! Shell command ⌥. More reasoning pgup / pgdn Scroll - ctrl+j New line f4 Inspect activity ctrl+space Start selection - ctrl+v Paste image ctrl+c Quit ctrl+home / ctrl+end Top / latest - ctrl+g External editor shift+⌥, / shift+⌥. Top / latest - ctrl+r Search history + Compose Session Transcript (open first) + / Commands tab Send message ⌃t Open transcript + @ Mention files ⌥, Less reasoning f3 Find text + ! Shell command ⌥. More reasoning pgup / pgdn Scroll + ⌃j New line f4 Inspect activity ⌃space Start selection + ⌃v Paste image ⌃c Quit ⌃home / ⌃end Top / latest + ⌃g External editor ⇧⌥, / ⇧⌥. Top / latest + ⌃r Search history esc esc Edit last message /keymap customize diff --git a/codex-rs/tui/src/bottom_pane/chat_composer/status_surface_tests.rs b/codex-rs/tui/src/bottom_pane/chat_composer/status_surface_tests.rs index 369bca1726..03e761f4f0 100644 --- a/codex-rs/tui/src/bottom_pane/chat_composer/status_surface_tests.rs +++ b/codex-rs/tui/src/bottom_pane/chat_composer/status_surface_tests.rs @@ -96,19 +96,19 @@ fn fullscreen_plan_indicator_keeps_the_cycle_hint_when_it_fits() { composer.set_collaboration_mode_indicator(Some(CollaborationModeIndicator::Plan)); let (wide, _) = render(&composer, /*width*/ 100, /*footer*/ None); assert!( - wide.contains("Plan mode (shift+tab to cycle)"), + wide.contains("Plan mode (⇧tab to cycle)"), "idle fullscreen must explain how to leave Plan mode: {wide}" ); insta::assert_snapshot!("fullscreen_plan_cycle_hint", wide); let (narrow, _) = render(&composer, /*width*/ 44, /*footer*/ None); assert!(narrow.contains("Plan mode"), "{narrow}"); - assert!(!narrow.contains("shift+tab"), "{narrow}"); + assert!(!narrow.contains("⇧tab"), "{narrow}"); composer.set_task_running(/*running*/ true); let (running, _) = render(&composer, /*width*/ 100, /*footer*/ None); assert!(running.contains("Plan mode"), "{running}"); - assert!(!running.contains("shift+tab"), "{running}"); + assert!(!running.contains("⇧tab"), "{running}"); composer.set_task_running(/*running*/ false); let footer = TranscriptFooter { @@ -118,7 +118,7 @@ fn fullscreen_plan_indicator_keeps_the_cycle_hint_when_it_fits() { }; let (search, _) = render(&composer, /*width*/ 100, Some(&footer)); assert!(search.contains("Plan mode"), "{search}"); - assert!(!search.contains("shift+tab"), "{search}"); + assert!(!search.contains("⇧tab"), "{search}"); // Configured items such as git-branch can have no value outside a repository. composer.set_status_line(/*status_line*/ None); @@ -129,7 +129,7 @@ fn fullscreen_plan_indicator_keeps_the_cycle_hint_when_it_fits() { ); let (empty_wide, _) = render(&composer, /*width*/ 100, /*footer*/ None); assert!( - empty_wide.contains("Plan mode (shift+tab to cycle)"), + empty_wide.contains("Plan mode (⇧tab to cycle)"), "{empty_wide}" ); @@ -271,10 +271,13 @@ fn shortcut_help_keeps_input_and_close_hint_visible_when_height_is_tiny() { fn shortcut_help_close_row_uses_runtime_binding_and_narrow_fallback() { let chord = Some(key_hint::ShortcutHint::Chord { prefix: key_hint::ctrl(KeyCode::Char('x')), - completion: key_hint::ctrl(KeyCode::Char('h')), + completion: key_hint::KeyBinding::new( + KeyCode::F(12), + KeyModifiers::CONTROL | KeyModifiers::SHIFT | KeyModifiers::ALT, + ), }); for (width, binding, expected) in [ - (80, chord, "ctrl+x ctrl+h / esc close"), + (80, chord, "⌃x ⌃⇧⌥f12 / esc close"), (22, chord, "esc close"), (80, None, "esc close"), ] { diff --git a/codex-rs/tui/src/bottom_pane/footer.rs b/codex-rs/tui/src/bottom_pane/footer.rs index b81f2c3151..959c61fefb 100644 --- a/codex-rs/tui/src/bottom_pane/footer.rs +++ b/codex-rs/tui/src/bottom_pane/footer.rs @@ -107,7 +107,6 @@ pub(crate) enum GoalStatusIndicator { Complete { usage: Option }, } -const MODE_CYCLE_HINT: &str = "shift+tab to cycle"; const FOOTER_CONTEXT_GAP_COLS: u16 = 1; #[derive(Clone, Copy, Debug, Eq, PartialEq)] @@ -151,7 +150,10 @@ impl FooterKeyHints { impl CollaborationModeIndicator { fn label(self, show_cycle_hint: bool) -> String { let suffix = if show_cycle_hint { - format!(" ({MODE_CYCLE_HINT})") + format!( + " ({} to cycle)", + key_hint::shift(KeyCode::Tab).display_label() + ) } else { String::new() }; @@ -1502,7 +1504,7 @@ mod tests { snapshot_footer_with_mode_indicator( "footer_mode_indicator_narrow_overlap_hides", - /*width*/ 50, + /*width*/ 40, &props, Some(CollaborationModeIndicator::Plan), ); @@ -1739,7 +1741,7 @@ mod tests { "mode indicator should remain visible" ); assert!( - !collapsed.contains("shift+tab to cycle"), + !collapsed.contains("⇧tab to cycle"), "compact mode indicator should be used when space is tight" ); assert!( diff --git a/codex-rs/tui/src/bottom_pane/mcp_server_elicitation.rs b/codex-rs/tui/src/bottom_pane/mcp_server_elicitation.rs index b687cfe330..9ff33fb43c 100644 --- a/codex-rs/tui/src/bottom_pane/mcp_server_elicitation.rs +++ b/codex-rs/tui/src/bottom_pane/mcp_server_elicitation.rs @@ -989,7 +989,14 @@ impl McpServerElicitationOverlay { if self.current_field_is_select() { tips.push(shortcut("←/→", "to navigate fields")); } else { - tips.push(shortcut("ctrl+p / ctrl+n", "change field")); + tips.push(shortcut( + &format!( + "{} / {}", + crate::key_hint::ctrl(KeyCode::Char('p')).display_label(), + crate::key_hint::ctrl(KeyCode::Char('n')).display_label() + ), + "change field", + )); } } tips.push(shortcut("esc", "to cancel")); diff --git a/codex-rs/tui/src/bottom_pane/request_user_input/mod.rs b/codex-rs/tui/src/bottom_pane/request_user_input/mod.rs index c0e4633169..b84b3e5f05 100644 --- a/codex-rs/tui/src/bottom_pane/request_user_input/mod.rs +++ b/codex-rs/tui/src/bottom_pane/request_user_input/mod.rs @@ -612,7 +612,14 @@ impl RequestUserInputOverlay { if self.has_options() && !self.focus_is_notes() { tips.push(shortcut("←/→", "to navigate questions")); } else if !self.has_options() { - tips.push(shortcut("ctrl+p / ctrl+n", "change question")); + tips.push(shortcut( + &format!( + "{} / {}", + crate::key_hint::ctrl(KeyCode::Char('p')).display_label(), + crate::key_hint::ctrl(KeyCode::Char('n')).display_label() + ), + "change question", + )); } } if let Some(interrupt_key) = self.interrupt_turn_hint @@ -2477,7 +2484,7 @@ mod tests { tip_texts, vec![ "enter to submit all", - "ctrl+p / ctrl+n change question", + "⌃p / ⌃n change question", "esc to interrupt", ] ); @@ -2499,10 +2506,7 @@ mod tests { let tips = overlay.footer_tips(); let tip_texts = tips.iter().map(ToString::to_string).collect::>(); - assert_eq!( - tip_texts, - vec!["ctrl+j to submit answer", "esc to interrupt"] - ); + assert_eq!(tip_texts, vec!["⌃j to submit answer", "esc to interrupt"]); } #[test] @@ -2510,21 +2514,21 @@ mod tests { for (specs, expected_tips) in [ ( KeybindingsSpec::One(KeybindingSpec("ctrl-x enter".to_string())), - vec!["ctrl+x enter to submit answer", "esc to interrupt"], + vec!["⌃x enter to submit answer", "esc to interrupt"], ), ( KeybindingsSpec::Many(vec![ KeybindingSpec("ctrl-enter".to_string()), KeybindingSpec("ctrl-x enter".to_string()), ]), - vec!["ctrl+enter to submit answer", "esc to interrupt"], + vec!["⌃enter to submit answer", "esc to interrupt"], ), ( KeybindingsSpec::Many(vec![ KeybindingSpec("ctrl-x enter".to_string()), KeybindingSpec("ctrl-enter".to_string()), ]), - vec!["ctrl+x enter to submit answer", "esc to interrupt"], + vec!["⌃x enter to submit answer", "esc to interrupt"], ), ] { let (tx, _rx) = test_sender(); @@ -3747,16 +3751,16 @@ mod tests { .collect::>() .join("\n"); - insta::assert_snapshot!(snapshot, @r" + insta::assert_snapshot!(snapshot, @" - Question 1/1 (1 unanswered) - Share details. + Question 1/1 (1 unanswered) + Share details. - › Type your answer (optional) + › Type your answer (optional) - ctrl+x enter to submit answer | esc to interrupt + ⌃x enter to submit answer | esc to interrupt "); } diff --git a/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_freeform_remapped_submit.snap b/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_freeform_remapped_submit.snap index 0658942a7b..abd3d775bf 100644 --- a/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_freeform_remapped_submit.snap +++ b/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_freeform_remapped_submit.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/request_user_input/mod.rs -assertion_line: 3785 expression: "render_snapshot(&overlay, area)" --- @@ -11,4 +10,4 @@ expression: "render_snapshot(&overlay, area)" - ctrl+j to submit answer | esc to interrupt + ⌃j to submit answer | esc to interrupt diff --git a/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_multi_question_last.snap b/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_multi_question_last.snap index e3a74afa30..e352eb0599 100644 --- a/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_multi_question_last.snap +++ b/codex-rs/tui/src/bottom_pane/request_user_input/snapshots/codex_tui__bottom_pane__request_user_input__tests__request_user_input_multi_question_last.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/request_user_input/mod.rs -assertion_line: 3852 expression: "render_snapshot(&overlay, area)" --- @@ -13,4 +12,4 @@ expression: "render_snapshot(&overlay, area)" - enter to submit all | ctrl+p / ctrl+n change question | esc to interrupt + enter to submit all | ⌃p / ⌃n change question | esc to interrupt diff --git a/codex-rs/tui/src/bottom_pane/shortcut_overlay.rs b/codex-rs/tui/src/bottom_pane/shortcut_overlay.rs index d38b96790a..b77657323e 100644 --- a/codex-rs/tui/src/bottom_pane/shortcut_overlay.rs +++ b/codex-rs/tui/src/bottom_pane/shortcut_overlay.rs @@ -98,7 +98,11 @@ pub(super) fn lines(props: &FooterProps, width: u16) -> Vec> { }, Shortcut::new(key_hint::ctrl(KeyCode::Char(' ')), "Start selection"), Shortcut { - key: "ctrl+home / ctrl+end".into(), + key: format!( + "{} / {}", + key_hint::ctrl(KeyCode::Home).display_label(), + key_hint::ctrl(KeyCode::End).display_label() + ), action: "Top / latest", }, // Keep both jump alternatives: the terminal may be on another OS over SSH. diff --git a/codex-rs/tui/src/bottom_pane/skills_toggle_view.rs b/codex-rs/tui/src/bottom_pane/skills_toggle_view.rs index a6d6572599..4da553615c 100644 --- a/codex-rs/tui/src/bottom_pane/skills_toggle_view.rs +++ b/codex-rs/tui/src/bottom_pane/skills_toggle_view.rs @@ -568,8 +568,8 @@ mod tests { let view = SkillsToggleView::new(Vec::new(), tx, keymap); let rendered = render_lines(&view, /*width*/ 72); - assert!(rendered.contains("ctrl+t")); - assert!(rendered.contains("ctrl+x")); + assert!(rendered.contains("⌃t")); + assert!(rendered.contains("⌃x")); assert!(!rendered.contains("enter")); assert!(!rendered.contains("esc")); } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__agents_navigation_help.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__agents_navigation_help.snap index 5ebf53ced5..265148e59b 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__agents_navigation_help.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__agents_navigation_help.snap @@ -5,20 +5,20 @@ expression: terminal.backend() " Keyboard shortcuts " " " " Compose Session " -" / Commands tab Send message " -" @ Mention files ⌥, Less reasoning " -" ! Shell command ⌥. More reasoning " -" ctrl+j New line ← Agents (empty prompt) " -" ctrl+v Paste image f4 Inspect activity " -" ctrl+g External editor ctrl+c Quit " -" ctrl+r Search history " +" / Commands tab Send message " +" @ Mention files ⌥, Less reasoning " +" ! Shell command ⌥. More reasoning " +" ⌃j New line ← Agents (empty prompt) " +" ⌃v Paste image f4 Inspect activity " +" ⌃g External editor ⌃c Quit " +" ⌃r Search history " " esc esc Edit last message Transcript (open first) " -" ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" ⌃t Open transcript " +" f3 Find text " +" pgup / pgdn Scroll " +" ⌃space Start selection " +" ⌃home / ⌃end Top / latest " +" ⇧⌥, / ⇧⌥. Top / latest " " " " /keymap customize " " " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_full.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_full.snap index f39aefad64..ca2a96b3c1 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_full.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_full.snap @@ -10,4 +10,4 @@ expression: terminal.backend() " " " " " " -" ? for shortcuts · Plan mode (shift+tab to cycle) 100% context left " +" ? for shortcuts · Plan mode (⇧tab to cycle) 100% context left " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_with_context.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_with_context.snap index 347ba31648..dae98d4cab 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_with_context.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_with_context.snap @@ -10,4 +10,4 @@ expression: terminal.backend() " " " " " " -" Plan mode (shift+tab to cycle) 100% context left " +" Plan mode (⇧tab to cycle) 100% context left " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_without_context.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_without_context.snap index 006e2a1773..0dcd2872a3 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_without_context.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_collapse_plan_empty_mode_cycle_without_context.snap @@ -10,4 +10,4 @@ expression: terminal.backend() " " " " " " -" Plan mode (shift+tab to cycle) " +" Plan mode (⇧tab to cycle) " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_configured_key_chords.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_configured_key_chords.snap index bd11f949ed..11ddd31894 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_configured_key_chords.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_configured_key_chords.snap @@ -4,20 +4,15 @@ expression: terminal.backend() --- " Keyboard shortcuts " " " -" Compose Session " -" / Commands tab Send message " -" @ Mention files ⌥, Less reasoning " -" ! Shell command ⌥. More reasoning " -" ctrl+x enter New line f4 Inspect activity " -" ctrl+v Paste image ctrl+c Quit " -" ctrl+g ctrl+g External editor " -" ctrl+r Search history Transcript (open first) " -" esc esc Edit last message ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" Compose Session Transcript (open first) " +" / Commands tab Send message ⌃t Open transcript " +" @ Mention files ⌥, Less reasoning f3 Find text " +" ! Shell command ⌥. More reasoning pgup / pgdn Scroll " +" ⌃x enter New line f4 Inspect activity ⌃space Start selection " +" ⌃v Paste image ⌃c Quit ⌃home / ⌃end Top / latest " +" ⌃g ⌃g External editor ⇧⌥, / ⇧⌥. Top / latest " +" ⌃r Search history " +" esc esc Edit last message " " " " /keymap customize " " " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_interrupt.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_interrupt.snap index e64ff4ff62..20a62b41f8 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_interrupt.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_interrupt.snap @@ -10,4 +10,4 @@ expression: terminal.backend() " " " " " " -" ctrl+c again to quit " +" ⌃c again to quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_quit.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_quit.snap index e64ff4ff62..20a62b41f8 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_quit.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_ctrl_c_quit.snap @@ -10,4 +10,4 @@ expression: terminal.backend() " " " " " " -" ctrl+c again to quit " +" ⌃c again to quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay.snap index ad70ddb279..8492d7e390 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay.snap @@ -4,20 +4,15 @@ expression: terminal.backend() --- " Keyboard shortcuts " " " -" Compose Session " -" / Commands tab Send message " -" @ Mention files ⌥, Less reasoning " -" ! Shell command ⌥. More reasoning " -" shift+enter New line f4 Inspect activity " -" ctrl+v Paste image ctrl+c Quit " -" ctrl+g External editor " -" ctrl+r Search history Transcript (open first) " -" esc Edit last message ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" Compose Session Transcript (open first) " +" / Commands tab Send message ⌃t Open transcript " +" @ Mention files ⌥, Less reasoning f3 Find text " +" ! Shell command ⌥. More reasoning pgup / pgdn Scroll " +" ⇧enter New line f4 Inspect activity ⌃space Start selection " +" ⌃v Paste image ⌃c Quit ⌃home / ⌃end Top / latest " +" ⌃g External editor ⇧⌥, / ⇧⌥. Top / latest " +" ⌃r Search history " +" esc Edit last message " " " " /keymap customize " " " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay_queue_submissions.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay_queue_submissions.snap index 3729a7708f..8448b3618e 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay_queue_submissions.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__chat_composer__tests__footer_mode_shortcut_overlay_queue_submissions.snap @@ -4,20 +4,15 @@ expression: terminal.backend() --- " Keyboard shortcuts " " " -" Compose Session " -" / Commands tab Queue message " -" @ Mention files ⌥, Less reasoning " -" ! Shell command ⌥. More reasoning " -" shift+enter New line f4 Inspect activity " -" ctrl+v Paste image ctrl+c Quit " -" ctrl+g External editor " -" ctrl+r Search history Transcript (open first) " -" esc esc Edit last message ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" Compose Session Transcript (open first) " +" / Commands tab Queue message ⌃t Open transcript " +" @ Mention files ⌥, Less reasoning f3 Find text " +" ! Shell command ⌥. More reasoning pgup / pgdn Scroll " +" ⇧enter New line f4 Inspect activity ⌃space Start selection " +" ⌃v Paste image ⌃c Quit ⌃home / ⌃end Top / latest " +" ⌃g External editor ⇧⌥, / ⇧⌥. Top / latest " +" ⌃r Search history " +" esc esc Edit last message " " " " /keymap customize " " " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_idle.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_idle.snap index 72de9ee2ac..cba43dd725 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_idle.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_idle.snap @@ -2,4 +2,4 @@ source: tui/src/bottom_pane/footer.rs expression: terminal.backend() --- -" ctrl+c again to quit " +" ⌃c again to quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_running.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_running.snap index 72de9ee2ac..cba43dd725 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_running.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_ctrl_c_quit_running.snap @@ -2,4 +2,4 @@ source: tui/src/bottom_pane/footer.rs expression: terminal.backend() --- -" ctrl+c again to quit " +" ⌃c again to quit " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_narrow_overlap_hides.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_narrow_overlap_hides.snap index 6266f43d0b..2df60d950f 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_narrow_overlap_hides.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_narrow_overlap_hides.snap @@ -2,4 +2,4 @@ source: tui/src/bottom_pane/footer.rs expression: terminal.backend() --- -" Plan mode (shift+tab to cycle) " +" Plan mode (⇧tab to cycle) " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_wide.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_wide.snap index 8c32ee50dc..bc04d1675c 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_wide.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_mode_indicator_wide.snap @@ -2,4 +2,4 @@ source: tui/src/bottom_pane/footer.rs expression: terminal.backend() --- -" ? for shortcuts · Plan mode (shift+tab to cycle) 100% context left " +" ? for shortcuts · Plan mode (⇧tab to cycle) 100% context left " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_collaboration_modes_enabled.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_collaboration_modes_enabled.snap index 400c4dd0a4..b451bc3de2 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_collaboration_modes_enabled.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_collaboration_modes_enabled.snap @@ -5,20 +5,20 @@ expression: terminal.backend() " Keyboard shortcuts " " " " Compose Session " -" / Commands tab Send message " -" @ Mention files shift+tab Change mode " -" ! Shell command ⌥, Less reasoning " -" ctrl+j New line ⌥. More reasoning " -" ctrl+v Paste image f8 Voice " -" ctrl+g External editor f4 Inspect activity " -" ctrl+r Search history ctrl+c Quit " +" / Commands tab Send message " +" @ Mention files ⇧tab Change mode " +" ! Shell command ⌥, Less reasoning " +" ⌃j New line ⌥. More reasoning " +" ⌃v Paste image f8 Voice " +" ⌃g External editor f4 Inspect activity " +" ⌃r Search history ⌃c Quit " " esc esc Edit last message " " Transcript (open first) " -" ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" ⌃t Open transcript " +" f3 Find text " +" pgup / pgdn Scroll " +" ⌃space Start selection " +" ⌃home / ⌃end Top / latest " +" ⇧⌥, / ⇧⌥. Top / latest " " " " /keymap customize " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_running.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_running.snap index 24675e60be..147404e8ec 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_running.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_running.snap @@ -5,19 +5,19 @@ expression: terminal.backend() " Keyboard shortcuts " " " " Compose Session " -" / Commands tab Queue message " -" @ Mention files ⌥, Less reasoning " -" ! Shell command ⌥. More reasoning " -" ctrl+j New line f8 Voice " -" ctrl+v Paste image f4 Inspect activity " -" ctrl+g External editor ctrl+c Interrupt " -" ctrl+r Search history " +" / Commands tab Queue message " +" @ Mention files ⌥, Less reasoning " +" ! Shell command ⌥. More reasoning " +" ⌃j New line f8 Voice " +" ⌃v Paste image f4 Inspect activity " +" ⌃g External editor ⌃c Interrupt " +" ⌃r Search history " " esc esc Edit last message Transcript (open first) " -" ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" ⌃t Open transcript " +" f3 Find text " +" pgup / pgdn Scroll " +" ⌃space Start selection " +" ⌃home / ⌃end Top / latest " +" ⇧⌥, / ⇧⌥. Top / latest " " " " /keymap customize " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_shift_and_esc.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_shift_and_esc.snap index 8728b00f08..ce6ede9744 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_shift_and_esc.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_shortcuts_shift_and_esc.snap @@ -4,20 +4,20 @@ expression: terminal.backend() --- " Keyboard shortcuts " " " -" Compose Session " -" / Commands tab Send message " -" @ Mention files ⌥, Less reasoning " -" ! Shell command ⌥. More reasoning " -" shift+enter New line f8 Voice " -" ctrl+v Paste image f4 Inspect activity " -" ctrl+g External editor ctrl+c Quit " -" ctrl+r Search history " -" esc Edit last message Transcript (open first) " -" ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" Compose Session " +" / Commands tab Send message " +" @ Mention files ⌥, Less reasoning " +" ! Shell command ⌥. More reasoning " +" ⇧enter New line f8 Voice " +" ⌃v Paste image f4 Inspect activity " +" ⌃g External editor ⌃c Quit " +" ⌃r Search history " +" esc Edit last message Transcript (open first) " +" ⌃t Open transcript " +" f3 Find text " +" pgup / pgdn Scroll " +" ⌃space Start selection " +" ⌃home / ⌃end Top / latest " +" ⇧⌥, / ⇧⌥. Top / latest " " " " /keymap customize " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_disabled_context_right.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_disabled_context_right.snap index b86792ac77..df995888f9 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_disabled_context_right.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_disabled_context_right.snap @@ -2,4 +2,4 @@ source: tui/src/bottom_pane/footer.rs expression: terminal.backend() --- -" ? for shortcuts · Plan mode (shift+tab to cycle) 50% context left " +" ? for shortcuts · Plan mode (⇧tab to cycle) 50% context left " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_and_ide_context_right.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_and_ide_context_right.snap index 1e340ddc82..b0160e6e38 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_and_ide_context_right.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_and_ide_context_right.snap @@ -2,4 +2,4 @@ source: tui/src/bottom_pane/footer.rs expression: terminal.backend() --- -" Plan mode (shift+tab to cycle) · IDE context " +" Plan mode (⇧tab to cycle) · IDE context " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_right.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_right.snap index 2da49eeb64..957902993d 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_right.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__footer__tests__footer_status_line_enabled_mode_right.snap @@ -2,4 +2,4 @@ source: tui/src/bottom_pane/footer.rs expression: terminal.backend() --- -" Plan mode (shift+tab to cycle) " +" Plan mode (⇧tab to cycle) " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_text_configured_key_chords.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_text_configured_key_chords.snap index e0b35f4c42..4f04b30c1d 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_text_configured_key_chords.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__mcp_server_elicitation__tests__mcp_server_elicitation_text_configured_key_chords.snap @@ -10,4 +10,4 @@ expression: snapshot › Type your answer - ctrl+x enter to submit | esc to cancel + ⌃x enter to submit | esc to cancel diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap index 05e29dff55..4d9669913a 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_many_line_message.snap @@ -10,7 +10,7 @@ Buffer { " a message ", " with many ", " … ", - " shift+← edit last queued message ", + " ⇧← edit last queued message ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -25,7 +25,7 @@ Buffer { x: 0, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: DIM | ITALIC, x: 5, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 4, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 11, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 36, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 31, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap index 8b8bba6114..68f4b62f2f 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_more_than_three_messages.snap @@ -10,7 +10,7 @@ Buffer { " ↳ This is another message ", " ↳ This is a third message ", " ↳ This is a fourth message ", - " shift+← edit last queued message ", + " ⇧← edit last queued message ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -28,7 +28,7 @@ Buffer { x: 4, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: DIM | ITALIC, x: 28, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 4, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 11, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 36, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 31, y: 5, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap index 887f9d20a6..599254195e 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message.snap @@ -7,7 +7,7 @@ Buffer { content: [ "• Queued follow-up inputs ", " ↳ Hello, world! ", - " shift+← edit last queued message ", + " ⇧← edit last queued message ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -16,7 +16,7 @@ Buffer { x: 4, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM | ITALIC, x: 17, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 4, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 11, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 36, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 31, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message_with_shift_left_binding.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message_with_shift_left_binding.snap index 887f9d20a6..599254195e 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message_with_shift_left_binding.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_one_message_with_shift_left_binding.snap @@ -7,7 +7,7 @@ Buffer { content: [ "• Queued follow-up inputs ", " ↳ Hello, world! ", - " shift+← edit last queued message ", + " ⇧← edit last queued message ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -16,7 +16,7 @@ Buffer { x: 4, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM | ITALIC, x: 17, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 4, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 11, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 36, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 31, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap index 59ee6e1787..8cb9163030 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_pending_steers_above_queued_messages.snap @@ -15,7 +15,7 @@ Buffer { " ", "• Queued follow-up inputs ", " ↳ Queued follow-up question ", - " shift+← edit last queued message ", + " ⇧← edit last queued message ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -38,7 +38,7 @@ Buffer { x: 4, y: 9, fg: Reset, bg: Reset, underline: Reset, modifier: DIM | ITALIC, x: 29, y: 9, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 4, y: 10, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 11, y: 10, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 36, y: 10, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 10, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 31, y: 10, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap index 07a1a1e341..2b135564ed 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_two_messages.snap @@ -8,7 +8,7 @@ Buffer { "• Queued follow-up inputs ", " ↳ Hello, world! ", " ↳ This is another message ", - " shift+← edit last queued message ", + " ⇧← edit last queued message ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -20,7 +20,7 @@ Buffer { x: 4, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: DIM | ITALIC, x: 27, y: 2, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 4, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 11, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 36, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 31, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap index 3a88045764..bc2825a8fc 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__pending_input_preview__tests__render_wrapped_message.snap @@ -9,7 +9,7 @@ Buffer { " ↳ This is a longer message that should", " be wrapped ", " ↳ This is another message ", - " shift+← edit last queued message ", + " ⇧← edit last queued message ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -23,7 +23,7 @@ Buffer { x: 4, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: DIM | ITALIC, x: 27, y: 3, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, x: 4, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 11, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 36, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 6, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 31, y: 4, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__question_tests__question_collapsed_countdown.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__question_tests__question_collapsed_countdown.snap index 91cb130fdd..d42bff356b 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__question_tests__question_collapsed_countdown.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__question_tests__question_collapsed_countdown.snap @@ -3,4 +3,4 @@ source: tui/src/bottom_pane/questions_tests.rs expression: "pane.question_summary(now).unwrap().iter().map(ToString::to_string).collect::>().join(\"\\n\")" --- ? 2 questions · 15s - shift+← to answer + ⇧← to answer diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__shortcut_overlay__tests__shortcut_overlay_customized_wsl.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__shortcut_overlay__tests__shortcut_overlay_customized_wsl.snap index 9cf8743531..ee35909756 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__shortcut_overlay__tests__shortcut_overlay_customized_wsl.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__shortcut_overlay__tests__shortcut_overlay_customized_wsl.snap @@ -4,21 +4,21 @@ expression: terminal.backend() --- " Keyboard shortcuts " " " -" Compose Session " -" / Commands tab Send message " -" @ Mention files shift+tab Change mode " -" ! Shell command ⌥. More reasoning " -" shift+enter New line f8 Voice " -" ctrl+⌥v Paste image ← Agents (empty prompt) " -" ctrl+x ctrl+e External editor f4 Inspect activity " -" esc Edit last message ctrl+c Quit " +" Compose Session " +" / Commands tab Send message " +" @ Mention files ⇧tab Change mode " +" ! Shell command ⌥. More reasoning " +" ⇧enter New line f8 Voice " +" ⌃⌥v Paste image ← Agents (empty prompt) " +" ⌃x ⌃e External editor f4 Inspect activity " +" esc Edit last message ⌃c Quit " " " -" Transcript (open first) " -" ctrl+t Open transcript " -" f3 Find text " -" pgup / pgdn Scroll " -" ctrl+space Start selection " -" ctrl+home / ctrl+end Top / latest " -" shift+⌥, / shift+⌥. Top / latest " +" Transcript (open first) " +" ⌃t Open transcript " +" f3 Find text " +" pgup / pgdn Scroll " +" ⌃space Start selection " +" ⌃home / ⌃end Top / latest " +" ⇧⌥, / ⇧⌥. Top / latest " " " " /keymap customize " diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__queued_messages_visible_when_status_hidden_snapshot.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__queued_messages_visible_when_status_hidden_snapshot.snap index ad1ea121c6..e803ab1619 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__queued_messages_visible_when_status_hidden_snapshot.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__queued_messages_visible_when_status_hidden_snapshot.snap @@ -4,7 +4,7 @@ expression: "render_snapshot(&pane, area)" --- • Queued follow-up inputs ↳ Queued follow-up question - shift+← edit last queued message + ⇧← edit last queued message › Ask Codex to do anything diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_and_queued_messages_snapshot.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_and_queued_messages_snapshot.snap index 877ccd7b9f..cbc675a0a9 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_and_queued_messages_snapshot.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_and_queued_messages_snapshot.snap @@ -6,7 +6,7 @@ expression: "render_snapshot(&pane, area)" • Queued follow-up inputs ↳ Queued follow-up question - shift+← edit last queued message + ⇧← edit last queued message › Ask Codex to do anything diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_with_details_and_queued_messages_snapshot.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_with_details_and_queued_messages_snapshot.snap index fd6db64388..0b45f6d1c1 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_with_details_and_queued_messages_snapshot.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__tests__status_with_details_and_queued_messages_snapshot.snap @@ -8,7 +8,7 @@ expression: "render_snapshot(&pane, area)" • Queued follow-up inputs ↳ Queued follow-up question - shift+← edit last queued message + ⇧← edit last queued message › Ask Codex to do anything diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__user_verification__tests__user_verification_narrow.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__user_verification__tests__user_verification_narrow.snap index ca92bb2a24..5789ce70ee 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__user_verification__tests__user_verification_narrow.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__user_verification__tests__user_verification_narrow.snap @@ -5,7 +5,7 @@ expression: "render_view_lines(&view, 40, 8)" Production deployment needs your approval. - [… 7 lines] ctrl+a view all + [… 7 lines] ⌃a view all › 1. Verify and approve (y) 2. Cancel this request (c) Press enter to confirm or esc to diff --git a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__voice_strip__tests__voice_controls_follow_configured_mute_binding_and_unbinding.snap b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__voice_strip__tests__voice_controls_follow_configured_mute_binding_and_unbinding.snap index 5f1bfe8d19..aa30086c79 100644 --- a/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__voice_strip__tests__voice_controls_follow_configured_mute_binding_and_unbinding.snap +++ b/codex-rs/tui/src/bottom_pane/snapshots/codex_tui__bottom_pane__voice_strip__tests__voice_controls_follow_configured_mute_binding_and_unbinding.snap @@ -1,6 +1,5 @@ --- source: tui/src/bottom_pane/voice_strip_tests.rs -assertion_line: 165 expression: "layouts.join(\"\\n\\n\")" --- 'f8', muted=false, width=80: @@ -20,7 +19,7 @@ expression: "layouts.join(\"\\n\\n\")" mic ▁▁▁ codex ▅▆█ 'ctrl-x m', muted=false, width=80: - voice ● listening ctrl+x m mute /voice stop + voice ● listening ⌃x m mute /voice stop mic ▆▅▄▃▂▁ codex ▁▃▄▅▆█ 'ctrl-x m', muted=false, width=22: @@ -28,7 +27,7 @@ expression: "layouts.join(\"\\n\\n\")" mic ▃▂▁ codex ▅▆█ 'ctrl-x m', muted=true, width=80: - voice ◌ muted ctrl+x m unmute /voice stop + voice ◌ muted ⌃x m unmute /voice stop mic ▁▁▁▁▁▁ codex ▁▃▄▅▆█ 'ctrl-x m', muted=true, width=22: diff --git a/codex-rs/tui/src/bottom_pane/voice_strip_tests.rs b/codex-rs/tui/src/bottom_pane/voice_strip_tests.rs index c7429ddc0a..0eeaca7fb4 100644 --- a/codex-rs/tui/src/bottom_pane/voice_strip_tests.rs +++ b/codex-rs/tui/src/bottom_pane/voice_strip_tests.rs @@ -54,8 +54,8 @@ fn active_dashboard_preserves_live_colors_controls_and_width() { assert_eq!(buffer[(46, 0)].symbol(), " "); assert!(actual.starts_with(" voice ")); assert!(actual.lines().nth(1).unwrap().starts_with(" mic ")); - insta::assert_snapshot!(actual, @r" - voice ● listening ctrl+x mute /voice stop + insta::assert_snapshot!(actual, @" + voice ● listening ⌃x mute /voice stop mic ▆▅▄▃▂▁ codex ▁▃▄▅▆█ "); assert_eq!(buffer[(7, 0)].fg, Color::Red); @@ -63,7 +63,7 @@ fn active_dashboard_preserves_live_colors_controls_and_width() { assert_eq!(buffer[(22, 1)].fg, Color::Magenta); assert!(actual.contains("/voice stop")); let (compact, buffer) = rows(&strip, /*width*/ 37); - assert!(compact.contains("ctrl+x mute") && compact.contains("/voice stop")); + assert!(compact.contains("⌃x mute") && compact.contains("/voice stop")); assert_eq!(buffer[(36, 0)].symbol(), " "); let (narrow, buffer) = rows(&strip, /*width*/ 22); assert!(narrow.contains("/voice stop")); @@ -89,7 +89,7 @@ fn connecting_and_muted_indicators_follow_actual_capture() { strip.state.animations = false; let (connecting, buffer) = rows(&strip, /*width*/ 45); assert!(connecting.contains("voice ◌ connecting")); - assert!(!connecting.contains("ctrl+x mute")); + assert!(!connecting.contains("⌃x mute")); assert_ne!(buffer[(7, 0)].fg, Color::Red); strip.state.microphone_live = true; let (_, buffer) = rows(&strip, /*width*/ 45); @@ -143,7 +143,7 @@ fn voice_controls_follow_configured_mute_binding_and_unbinding() { let mut layouts = Vec::new(); for (binding, expected) in [ ("'f8'", "f8 mute"), - ("'ctrl-x m'", "ctrl+x m mute"), + ("'ctrl-x m'", "⌃x m mute"), ("[]", "/voice mute"), ] { let config = toml::from_str(&format!("[chat]\ntoggle_voice_mute = {binding}")).unwrap(); diff --git a/codex-rs/tui/src/bottom_pane/warnings_view_tests.rs b/codex-rs/tui/src/bottom_pane/warnings_view_tests.rs index d13e6da547..a2fb2581dc 100644 --- a/codex-rs/tui/src/bottom_pane/warnings_view_tests.rs +++ b/codex-rs/tui/src/bottom_pane/warnings_view_tests.rs @@ -153,7 +153,7 @@ fn warnings_keep_current_and_next_without_dismissing_unvisited_pages() { assert!(!key(&mut view, KeyCode::Char('k'))); let screen = draw(&view, /*width*/ 80, /*height*/ 12); assert!(screen.contains("2 of 3")); - assert!(screen.contains("ctrl+c dismiss & close")); + assert!(screen.contains("⌃c dismiss & close")); let repeat = KeyEvent::new_with_kind(KeyCode::Char('k'), KeyModifiers::NONE, KeyEventKind::Repeat); assert!(!view.handle_key(repeat)); diff --git a/codex-rs/tui/src/chatwidget/plugin_catalog.rs b/codex-rs/tui/src/chatwidget/plugin_catalog.rs index 34a739b2f4..241c9b244a 100644 --- a/codex-rs/tui/src/chatwidget/plugin_catalog.rs +++ b/codex-rs/tui/src/chatwidget/plugin_catalog.rs @@ -1278,16 +1278,18 @@ fn plugins_popup_hint_line( can_remove_marketplace: bool, can_upgrade_marketplace: bool, ) -> Line<'static> { + let upgrade = crate::key_hint::ctrl(KeyCode::Char('u')).display_label(); + let remove = crate::key_hint::ctrl(KeyCode::Char('r')).display_label(); match (can_remove_marketplace, can_upgrade_marketplace) { - (true, true) => Line::from( - "ctrl+u upgrade · ctrl+r remove · space toggle · ←/→ tabs · enter details · esc close", - ), - (true, false) => { - Line::from("ctrl+r remove · space toggle · ←/→ tabs · enter details · esc close") - } - (false, true) => { - Line::from("ctrl+u upgrade · space toggle · ←/→ tabs · enter details · esc close") - } + (true, true) => Line::from(format!( + "{upgrade} upgrade · {remove} remove · space toggle · ←/→ tabs · enter details · esc close", + )), + (true, false) => Line::from(format!( + "{remove} remove · space toggle · ←/→ tabs · enter details · esc close" + )), + (false, true) => Line::from(format!( + "{upgrade} upgrade · space toggle · ←/→ tabs · enter details · esc close" + )), (false, false) => Line::from("←/→ tabs · enter details · space toggle · esc close"), } } diff --git a/codex-rs/tui/src/chatwidget/realtime/recording_controls_tests.rs b/codex-rs/tui/src/chatwidget/realtime/recording_controls_tests.rs index 53ae2d41aa..cbe21174ae 100644 --- a/codex-rs/tui/src/chatwidget/realtime/recording_controls_tests.rs +++ b/codex-rs/tui/src/chatwidget/realtime/recording_controls_tests.rs @@ -70,9 +70,9 @@ async fn voice_composer_preserves_normal_colors_across_microphone_states() { }) .collect::>() .join("\n"); - insta::assert_snapshot!(rows, @r" + insta::assert_snapshot!(rows, @" 0: - 1: voice ● listening ctrl+x mute /voice stop + 1: voice ● listening ⌃x mute /voice stop 2: mic ▁▁▁▁▁▁ codex ▁▁▁▁▁▁ 3: 4: › typed @@ -357,7 +357,7 @@ async fn narrow_voice_footer_keeps_the_stop_control_before_meters() { let footer = render_bottom_popup(&chat, /*width*/ 46); assert!(footer.contains("voice ● speaking")); - assert!(footer.contains("ctrl+x mute")); + assert!(footer.contains("⌃x mute")); assert!(footer.contains("/voice stop")); chat.realtime_conversation.speaker_active_until = None; chat.realtime_conversation.speaker_level = 1; @@ -375,7 +375,7 @@ async fn narrow_voice_footer_keeps_the_stop_control_before_meters() { assert_eq!(chat.realtime_conversation.speaker_active_until, None); let interrupted = render_bottom_popup(&chat, /*width*/ 45); assert!(interrupted.contains("voice ● heard")); - assert!(interrupted.contains("ctrl+x mute")); + assert!(interrupted.contains("⌃x mute")); assert!(interrupted.contains("/voice stop")); chat.realtime_conversation.interruption_acknowledged_until = Some(std::time::Instant::now() - super::super::INTERRUPTION_ACKNOWLEDGMENT); @@ -603,17 +603,17 @@ async fn clipped_voice_composer_keeps_the_draft_and_cursor_visible() { layouts.push(format!("{height} rows:\n{rows}")); } - insta::assert_snapshot!(layouts.join("\n\n"), @r" + insta::assert_snapshot!(layouts.join("\n\n"), @" 5 rows: - voice ● listening ctrl+x mute /voice stop + voice ● listening ⌃x mute /voice stop › typed 6 rows: - voice ● listening ctrl+x mute /voice stop + voice ● listening ⌃x mute /voice stop › typed 8 rows: - voice ● listening ctrl+x mute /voice stop + voice ● listening ⌃x mute /voice stop › typed "); } diff --git a/codex-rs/tui/src/chatwidget/realtime/snapshots/codex_tui__chatwidget__realtime__tests__recording_controls_tests__voice_footer_renders_the_main_conversation_states.snap b/codex-rs/tui/src/chatwidget/realtime/snapshots/codex_tui__chatwidget__realtime__tests__recording_controls_tests__voice_footer_renders_the_main_conversation_states.snap index 3981e78082..b1b63f41ee 100644 --- a/codex-rs/tui/src/chatwidget/realtime/snapshots/codex_tui__chatwidget__realtime__tests__recording_controls_tests__voice_footer_renders_the_main_conversation_states.snap +++ b/codex-rs/tui/src/chatwidget/realtime/snapshots/codex_tui__chatwidget__realtime__tests__recording_controls_tests__voice_footer_renders_the_main_conversation_states.snap @@ -10,7 +10,7 @@ connecting: status line stays visible listening: - voice ● listening ctrl+x mute /voice stop + voice ● listening ⌃x mute /voice stop mic ▁▁▁▁▁▁ codex ▁▁▁▁▁▁ › Ask Codex to do anything @@ -18,7 +18,7 @@ listening: status line stays visible speaking: - voice ● speaking ctrl+x mute /voice stop + voice ● speaking ⌃x mute /voice stop mic ▁▁▇▇▇▇ codex ▁▁████ › Ask Codex to do anything @@ -26,7 +26,7 @@ speaking: status line stays visible muted: - voice ◌ muted ctrl+x unmute /voice stop + voice ◌ muted ⌃x unmute /voice stop mic ▁▁▁▁▁▁ codex ▁▁▇▇▇▇ › Ask Codex to do anything @@ -34,7 +34,7 @@ muted: status line stays visible transcript: - voice ● speaking ctrl+x mute /voice stop + voice ● speaking ⌃x mute /voice stop mic ▁▁▄▄▄▄ codex ▁▁▄▄▄▄ › Ask Codex to do anything @@ -42,7 +42,7 @@ transcript: status line stays visible interrupted: - voice ● heard ctrl+x mute /voice stop + voice ● heard ⌃x mute /voice stop mic ▁▁▄▄▄▄ codex ▁▁▄▄▄▄ › Ask Codex to do anything diff --git a/codex-rs/tui/src/chatwidget/reconnect.rs b/codex-rs/tui/src/chatwidget/reconnect.rs index 864922c31d..3caf832850 100644 --- a/codex-rs/tui/src/chatwidget/reconnect.rs +++ b/codex-rs/tui/src/chatwidget/reconnect.rs @@ -31,7 +31,10 @@ impl ChatWidget { self.bottom_pane .set_interrupt_hint_visible(/*visible*/ false); self.set_status_header("Reconnecting to server…".to_string()); - self.set_footer_hint_override(Some(vec![("ctrl+c".into(), "quit".into())])); + self.set_footer_hint_override(Some(vec![( + crate::key_hint::ctrl(KeyCode::Char('c')).display_label(), + "quit".into(), + )])); } /// Restore local input only after replay, which can otherwise move interrupted queues into the draft. diff --git a/codex-rs/tui/src/chatwidget/rendering_tests.rs b/codex-rs/tui/src/chatwidget/rendering_tests.rs index 624d58765f..f2e58846d4 100644 --- a/codex-rs/tui/src/chatwidget/rendering_tests.rs +++ b/codex-rs/tui/src/chatwidget/rendering_tests.rs @@ -305,7 +305,7 @@ async fn external_writer_notice_uses_current_transcript_shortcut() { assert!(contains_text( &render_frame(&widget, /*width*/ 80), - "ctrl+k transcript" + "⌃k transcript" )); } diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_100.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_100.snap index 96c7bc32bc..a27a87af05 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_100.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_100.snap @@ -5,4 +5,4 @@ expression: rendered 🔒 This conversation is open in another app r to retry Close it there and press R to continue here. - r retry f fork ←/esc command center ctrl+c/q exit ctrl+t transcript + r retry f fork ←/esc command center ⌃c/q exit ⌃t transcript diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_60.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_60.snap index 42905ae08e..df73cd71e9 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_60.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_command_center_60.snap @@ -5,5 +5,5 @@ expression: rendered 🔒 This conversation is open in another app r to retry Close it there and press R to continue here. - r retry f fork ←/esc command center ctrl+c/q exit - ctrl+t transcript + r retry f fork ←/esc command center ⌃c/q exit ⌃t + transcript diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_view_shows_notice_instead_of_composer.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_view_shows_notice_instead_of_composer.snap index e4ae3879f1..207bccc731 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_view_shows_notice_instead_of_composer.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__rendering__tests__external_writer_view_shows_notice_instead_of_composer.snap @@ -7,4 +7,4 @@ expression: "rows.iter().map(|row| row.trim_end()).collect::>().join(\"\\ 🔒 This conversation is open in another app r to retry Close it there and press R to continue here. - r retry f fork esc/ctrl+c/q exit ctrl+t transcript + r retry f fork esc/⌃c/q exit ⌃t transcript diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__experimental_features_popup_configured_key_chords.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__experimental_features_popup_configured_key_chords.snap index 5b8f4a6f8b..1ae34036a2 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__experimental_features_popup_configured_key_chords.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__experimental_features_popup_configured_key_chords.snap @@ -10,4 +10,4 @@ expression: popup › [x] Shell tool Allow the model to run shell commands. - space toggle · ctrl+x enter save · esc save/close + space toggle · ⌃x enter save · esc save/close diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hidden_shell_paste_queued_preview.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hidden_shell_paste_queued_preview.snap index 5eee3ce8c2..22e76c24c3 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hidden_shell_paste_queued_preview.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__hidden_shell_paste_queued_preview.snap @@ -6,7 +6,7 @@ expression: "normalize_snapshot_paths(render_bottom_popup(&chat, 80))" • Queued follow-up inputs ↳ [Pasted Content 1006 chars] - shift+← edit last queued message + ⇧← edit last queued message › Ask Codex to do anything diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_disconnected.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_disconnected.snap index b51aeb4daf..df97658c87 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_disconnected.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_disconnected.snap @@ -6,8 +6,8 @@ expression: "normalize_snapshot_paths(render_bottom_popup(&chat, 80)).replace(' • Queued follow-up inputs ↳ x - shift+← edit last queued message + ⇧← edit last queued message › describe - ctrl+c quit + ⌃c quit diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_in_progress.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_in_progress.snap index ff6ac12a4c..df0165e19b 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_in_progress.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__image_preparation_in_progress.snap @@ -4,7 +4,7 @@ expression: "normalize_snapshot_paths(render_bottom_popup(&chat, 80))" --- • Queued follow-up inputs ↳ Preparing images: describe - shift+← edit last queued message + ⇧← edit last queued message › x diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__plugins_popup_newly_installed_marketplace.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__plugins_popup_newly_installed_marketplace.snap index bece0e6e85..6076d59e37 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__plugins_popup_newly_installed_marketplace.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__plugins_popup_newly_installed_marketplace.snap @@ -19,4 +19,4 @@ expression: popup - ctrl+u upgrade · ctrl+r remove · space toggle · ←/→ tabs · enter details · esc close + ⌃u upgrade · ⌃r remove · space toggle · ←/→ tabs · enter details · esc close diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__reasoning_shortcut_max_plan_footer.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__reasoning_shortcut_max_plan_footer.snap index fc0d74f23b..fb661e522f 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__reasoning_shortcut_max_plan_footer.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__reasoning_shortcut_max_plan_footer.snap @@ -6,4 +6,4 @@ expression: snapshot " " "› Ask Codex to do anything " " " -" GPT-5.5 max Plan mode (shift+tab to cycle) " +" GPT-5.5 max Plan mode (⇧tab to cycle) " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_model_with_reasoning_plan_mode_footer.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_model_with_reasoning_plan_mode_footer.snap index c9d0e2e6c8..2bbd73de7b 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_model_with_reasoning_plan_mode_footer.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__status_line_model_with_reasoning_plan_mode_footer.snap @@ -6,4 +6,4 @@ expression: normalized_backend_snapshot(terminal.backend()) " " "› Ask Codex to do anything " " " -" gpt-5.2 medium Plan mode (shift+tab to cycle) " +" gpt-5.2 medium Plan mode (⇧tab to cycle) " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_live_transcript_and_stream.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_live_transcript_and_stream.snap index 3f55da857c..8f6b9f294c 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_live_transcript_and_stream.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_live_transcript_and_stream.snap @@ -10,7 +10,7 @@ expression: rendered " " " " " " -" voice ● listening ctrl+x mute /voice stop " +" voice ● listening ⌃x mute /voice stop " " " "› Ask Codex to do anything " " " diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_partial_transcript_hidden.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_partial_transcript_hidden.snap index 737440fde5..1fb5d6d6ad 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_partial_transcript_hidden.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__voice_partial_transcript_hidden.snap @@ -6,7 +6,7 @@ expression: normalized_backend_snapshot(terminal.backend()) "• Agent answer arriving " " " " " -" voice ● listening ctrl+x mute /voice stop " +" voice ● listening ⌃x mute /voice stop " " " "› Ask Codex to do anything " " " diff --git a/codex-rs/tui/src/chatwidget/tests/history_replay.rs b/codex-rs/tui/src/chatwidget/tests/history_replay.rs index ad26ff9479..a232b91524 100644 --- a/codex-rs/tui/src/chatwidget/tests/history_replay.rs +++ b/codex-rs/tui/src/chatwidget/tests/history_replay.rs @@ -1374,7 +1374,7 @@ async fn failed_repl_mcp_tool_call_preserves_status_and_result() { └ Script failed {"exit_code": 0, "output": "ready", "chunk_id": "chunk-1"} Script error: - +1 line (ctrl+t to view transcript) + +1 line (⌃t to view transcript) "#); } assert_eq!( diff --git a/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs b/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs index 6b1a40176a..4018a25396 100644 --- a/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs +++ b/codex-rs/tui/src/chatwidget/tests/popups_and_settings.rs @@ -379,8 +379,8 @@ async fn plugins_popup_upgrades_user_configured_git_marketplace_from_marketplace let popup = select_plugins_tab_containing(&mut chat, /*width*/ 100, "Repo Marketplace."); assert!( popup.contains("Repo Marketplace.") - && popup.contains("ctrl+u upgrade") - && popup.contains("ctrl+r remove") + && popup.contains("⌃u upgrade") + && popup.contains("⌃r remove") && popup.contains("Debug Plugin"), "expected upgradeable user-configured marketplace tab, got:\n{popup}" ); @@ -476,8 +476,8 @@ async fn marketplace_add_success_refreshes_to_new_marketplace_tab() { assert_chatwidget_snapshot!("plugins_popup_newly_installed_marketplace", popup); assert!( popup.contains("Debug Marketplace installed successfully.") - && popup.contains("ctrl+u upgrade") - && popup.contains("ctrl+r remove") + && popup.contains("⌃u upgrade") + && popup.contains("⌃r remove") && popup.contains("Debug Plugin"), "expected marketplace add refresh to switch to the new marketplace tab, got:\n{popup}" ); @@ -542,8 +542,8 @@ async fn plugins_popup_removes_user_configured_marketplace_flow() { select_plugins_tab_containing(&mut chat, /*width*/ 100, "Repo Marketplace."); assert!( repo_tab.contains("Repo Marketplace.") - && repo_tab.contains("ctrl+u upgrade") - && repo_tab.contains("ctrl+r remove") + && repo_tab.contains("⌃u upgrade") + && repo_tab.contains("⌃r remove") && repo_tab.contains("Debug Plugin"), "expected removable user-configured marketplace tab, got:\n{repo_tab}" ); @@ -611,7 +611,7 @@ async fn plugins_popup_removes_user_configured_marketplace_flow() { refreshed.contains("Browse plugins from available marketplaces.") && !refreshed.contains("Repo Marketplace") && !refreshed.contains("Debug Plugin") - && !refreshed.contains("ctrl+r remove"), + && !refreshed.contains("⌃r remove"), "expected refreshed plugin list without removed marketplace, got:\n{refreshed}" ); } diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__app_server__sqlite_log_write_warning.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__app_server__sqlite_log_write_warning.snap index ff167d5a0b..33f747f6aa 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__app_server__sqlite_log_write_warning.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__app_server__sqlite_log_write_warning.snap @@ -13,4 +13,4 @@ expression: "super::helpers::render_bottom_popup(&chat, 80)" - k keep & next · esc dismiss & close · ctrl+o copy · ←/→ warning · ↓ scroll + k keep & next · esc dismiss & close · ⌃o copy · ←/→ warning · ↓ scroll diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__computer_activity_tests__computer_activity_replayed.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__computer_activity_tests__computer_activity_replayed.snap index 91918a0f84..3dbe44199e 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__computer_activity_tests__computer_activity_replayed.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__computer_activity_tests__computer_activity_replayed.snap @@ -5,4 +5,4 @@ expression: "lines_to_single_string(&outputs[0].0)" • Used computer · 4 actions ├ Inspect page 3 ├ Inspect page 4 - └ 2 more · ctrl+t + └ 2 more · ⌃t diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__async_question_answered_on_another_client.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__async_question_answered_on_another_client.snap index dbff57f466..bc7e7f3214 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__async_question_answered_on_another_client.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__async_question_answered_on_another_client.snap @@ -8,4 +8,4 @@ expression: "render_bottom_popup(&chat, 80)" My draft for the second question - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__freeform_question.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__freeform_question.snap index d5152c26f4..c1689369d2 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__freeform_question.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__freeform_question.snap @@ -10,4 +10,4 @@ expression: "render_bottom_popup(&chat, 80)" Type your answer - enter submit ctrl+] skip shift+→ main prompt shift+← next question + enter submit ⌃] skip ⇧→ main prompt ⇧← next question diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__last_question_with_queue.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__last_question_with_queue.snap index 6d5f9e50fc..f9cec9037c 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__last_question_with_queue.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__last_question_with_queue.snap @@ -12,4 +12,4 @@ expression: "render_bottom_popup(&chat, 80)" › 1. Next 2. Other - enter submit ctrl+] skip shift+→ prev question shift+← queued messages + enter submit ⌃] skip ⇧→ prev question ⇧← queued messages diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__named_question.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__named_question.snap index 482c920dec..1ca313a400 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__named_question.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__named_question.snap @@ -14,4 +14,4 @@ expression: "render_bottom_popup(&chat, 80)" xxxxxxxxxxxxxxxx but do not deploy 2. Other - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__oversized_question.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__oversized_question.snap index caca3916c9..a2a08e710e 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__oversized_question.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__oversized_question.snap @@ -8,4 +8,4 @@ expression: "render_bottom_popup(&chat, 80)" Type your answer - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Left.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Left.snap index 886508e1aa..d0e1203d73 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Left.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Left.snap @@ -11,4 +11,4 @@ expression: "render_bottom_popup(&chat, 100)" Type your answer - enter submit ctrl+] skip shift+→ main prompt shift+← next question + enter submit ⌃] skip ⇧→ main prompt ⇧← next question diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Up.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Up.snap index 9e4b422a7a..0611ef2fdb 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Up.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_queue_hint_Up.snap @@ -11,4 +11,4 @@ expression: "render_bottom_popup(&chat, 100)" Type your answer - enter submit ctrl+] skip ⌥↓ main prompt ⌥↑ next question + enter submit ⌃] skip ⌥↓ main prompt ⌥↑ next question diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_other.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_other.snap index 308cf5b03a..8d8f71cea4 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_other.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_other.snap @@ -11,7 +11,7 @@ NORMAL › 2. alpha beta alpha gamma Vim: Normal - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt SEARCH • Queued follow-up inputs @@ -23,4 +23,4 @@ SEARCH alpha gamma /gamma Vim: Normal - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_single.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_single.snap index 9d4e9db68f..eed1778bc0 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_single.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__question_vim_single.snap @@ -10,7 +10,7 @@ NORMAL alpha beta alpha gamma Vim: Normal - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt SEARCH • Queued follow-up inputs @@ -21,4 +21,4 @@ SEARCH alpha gamma /gamma Vim: Normal - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__questions_with_status_and_queue.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__questions_with_status_and_queue.snap index 825487980e..7289f9dc6d 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__questions_with_status_and_queue.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__questions_with_status_and_queue.snap @@ -11,4 +11,4 @@ OPEN ONLY QUESTIONS • Queued follow-up inputs ? 2 questions - shift+← to answer + ⇧← to answer diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__queued_async_question_reply.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__queued_async_question_reply.snap index 349dfffaa7..052a7613b6 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__queued_async_question_reply.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__queued_async_question_reply.snap @@ -11,4 +11,4 @@ expression: "render_bottom_popup(&chat, 80)" Type your answer - enter submit ctrl+] skip shift+→ main prompt shift+← queued messages + enter submit ⌃] skip ⇧→ main prompt ⇧← queued messages diff --git a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__single_question_working_spacing.snap b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__single_question_working_spacing.snap index 0944e4e969..4b0da883f0 100644 --- a/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__single_question_working_spacing.snap +++ b/codex-rs/tui/src/chatwidget/tests/snapshots/codex_tui__chatwidget__tests__questions_tests__single_question_working_spacing.snap @@ -10,4 +10,4 @@ expression: rendered A typed answer - enter submit ctrl+] skip shift+→ main prompt + enter submit ⌃] skip ⇧→ main prompt diff --git a/codex-rs/tui/src/exec_cell/render.rs b/codex-rs/tui/src/exec_cell/render.rs index d8b326d15b..bae014ea15 100644 --- a/codex-rs/tui/src/exec_cell/render.rs +++ b/codex-rs/tui/src/exec_cell/render.rs @@ -24,7 +24,7 @@ use crate::terminal_hyperlinks::prefix_hyperlink_lines; use crate::terminal_hyperlinks::remap_source_wrapped_line; use crate::terminal_hyperlinks::visible_lines; use crate::tool_output::tool_output_hyperlink_preview; -use crate::ui_consts::TRANSCRIPT_HINT; +use crate::ui_consts::transcript_hint; use crate::wrapping::RtOptions; use crate::wrapping::adaptive_wrap_line_with_source; use codex_ansi_escape::ansi_escape_line; @@ -303,7 +303,7 @@ impl HistoryCell for ExecCell { impl ExecCell { fn output_ellipsis_text(omitted: usize) -> String { let noun = if omitted == 1 { "line" } else { "lines" }; - format!("… +{omitted} {noun} ({TRANSCRIPT_HINT})") + format!("… +{omitted} {noun} ({})", transcript_hint()) } fn output_ellipsis_line(omitted: usize) -> Line<'static> { @@ -947,7 +947,7 @@ mod tests { .split_whitespace() .join(" "); assert!( - normalized.contains(TRANSCRIPT_HINT), + normalized.contains(&transcript_hint()), "expected truncated output to advertise transcript shortcut, got {normalized}" ); } @@ -979,7 +979,7 @@ mod tests { assert!( rendered .iter() - .any(|line| line.contains("… +6 lines (ctrl+t to view transcript)")), + .any(|line| line.contains("… +6 lines (⌃t to view transcript)")), "expected omitted hint to count hidden lines (not wrapped rows), got: {rendered:?}" ); } @@ -1007,7 +1007,7 @@ mod tests { assert_eq!( rendered, - vec!["1", "2", "… +3 lines (ctrl+t to view transcript)", "6", "7",] + vec!["1", "2", "… +3 lines (⌃t to view transcript)", "6", "7",] ); } diff --git a/codex-rs/tui/src/history_cell/computer_activity.rs b/codex-rs/tui/src/history_cell/computer_activity.rs index e25d57b982..7ef3342ecf 100644 --- a/codex-rs/tui/src/history_cell/computer_activity.rs +++ b/codex-rs/tui/src/history_cell/computer_activity.rs @@ -241,7 +241,10 @@ impl HistoryCell for ComputerActivityCell { } if hidden > 0 && active.is_none() { let summary = preview( - &format!("{hidden} more · ctrl+t"), + &format!( + "{hidden} more · {}", + crate::key_hint::ctrl(crossterm::event::KeyCode::Char('t')).display_label() + ), usize::from(width).saturating_sub(4), ); lines.push(vec![" └ ".dim(), summary.dim()].into()); diff --git a/codex-rs/tui/src/history_cell/mcp_tests.rs b/codex-rs/tui/src/history_cell/mcp_tests.rs index 7a35659f17..23f1e1c9f5 100644 --- a/codex-rs/tui/src/history_cell/mcp_tests.rs +++ b/codex-rs/tui/src/history_cell/mcp_tests.rs @@ -215,12 +215,12 @@ fn code_mode_output_shares_a_row_budget_across_blocks() { .map(ToString::to_string) .collect::>() .join("\n"); - insta::assert_snapshot!(display, @r" + insta::assert_snapshot!(display, @" • Inspect page └ Page title Navigation Main content - +3 lines (ctrl+t to view transcript) + +3 lines (⌃t to view transcript) "); let transcript = cell .transcript_lines(/*width*/ 100) @@ -260,12 +260,12 @@ fn code_mode_output_preserves_trailing_failure_diagnostics_in_transcript() { .map(ToString::to_string) .collect::>() .join("\n"); - insta::assert_snapshot!(display, @r" + insta::assert_snapshot!(display, @" • Inspect page └ Script failed Page title Navigation - +6 lines (ctrl+t to view transcript) + +6 lines (⌃t to view transcript) "); let transcript = cell .transcript_lines(/*width*/ 80) diff --git a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_mixed.snap b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_mixed.snap index 85a82bf55a..e8b093f786 100644 --- a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_mixed.snap +++ b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_mixed.snap @@ -5,4 +5,4 @@ expression: "render(&cell, 90)" • Used computer · 5 actions · 1 failed ├ Failed: Open browser — No browser is available ├ Captured screenshot · Capture the reproduced bug - └ 3 more · ctrl+t + └ 3 more · ⌃t diff --git a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_narrow.snap b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_narrow.snap index 71463deb93..6d847af72f 100644 --- a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_narrow.snap +++ b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__computer_activity__tests__computer_activity_narrow.snap @@ -6,4 +6,4 @@ expression: "render(&cell, 24)" actions · 1 failed ├ Failed: No browser … ├ Captured screenshot… - └ 3 more · ctrl+t + └ 3 more · ⌃t diff --git a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__tests__mcp_preview_shares_one_limit_across_blocks_and_preserves_transcript.snap b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__tests__mcp_preview_shares_one_limit_across_blocks_and_preserves_transcript.snap index f8b0771f61..b1717c5964 100644 --- a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__tests__mcp_preview_shares_one_limit_across_blocks_and_preserves_transcript.snap +++ b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__mcp__tests__mcp_preview_shares_one_limit_across_blocks_and_preserves_transcript.snap @@ -13,7 +13,7 @@ history: └ first second third - +2 lines (ctrl+t to view transcript) + +2 lines (⌃t to view transcript) transcript: • Called search.lookup({"title":"Search query"}) diff --git a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_wrapped_outputs_snapshot.snap b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_wrapped_outputs_snapshot.snap index 59b8117288..9367920f8c 100644 --- a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_wrapped_outputs_snapshot.snap +++ b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__completed_mcp_tool_call_wrapped_outputs_snapshot.snap @@ -10,4 +10,4 @@ expression: rendered Line one of the response, which is quite long and needs wrapping. Line two continues the response with - +1 line (ctrl+t to view transcript) + +1 line (⌃t to view transcript) diff --git a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__ran_cell_multiline_with_stderr_snapshot.snap b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__ran_cell_multiline_with_stderr_snapshot.snap index 133401247c..c5256df182 100644 --- a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__ran_cell_multiline_with_stderr_snapshot.snap +++ b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__ran_cell_multiline_with_stderr_snapshot.snap @@ -9,4 +9,4 @@ expression: rendered └ error: first line on stderr error: second line on - +1 line (ctrl+t to view… + +1 line (⌃t to view tra… diff --git a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__stderr_tail_more_than_five_lines_snapshot.snap b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__stderr_tail_more_than_five_lines_snapshot.snap index e083ff5e95..a2a9ba10a3 100644 --- a/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__stderr_tail_more_than_five_lines_snapshot.snap +++ b/codex-rs/tui/src/history_cell/snapshots/codex_tui__history_cell__tests__stderr_tail_more_than_five_lines_snapshot.snap @@ -6,4 +6,4 @@ expression: rendered └ 1 2 3 - +7 lines (ctrl+t to view transcript) + +7 lines (⌃t to view transcript) diff --git a/codex-rs/tui/src/history_cell/tests.rs b/codex-rs/tui/src/history_cell/tests.rs index 9b0dc6034b..57a6642799 100644 --- a/codex-rs/tui/src/history_cell/tests.rs +++ b/codex-rs/tui/src/history_cell/tests.rs @@ -1521,7 +1521,7 @@ fn code_mode_tool_call_uses_title_and_preserves_full_transcript() { └ 012345678901234567890123456789012345 678901234567890123456789012345678901 234567890123456789012345678901234567 - +1 line (ctrl+t to view transcript) + +1 line (⌃t to view transcript) transcript: • Called node_repl.js({"title":"Inspect Spotify workspace","code":"await tools.exec_command({ cmd: 'git status' })"}) diff --git a/codex-rs/tui/src/key_hint.rs b/codex-rs/tui/src/key_hint.rs index 1a46573714..4460b50a8b 100644 --- a/codex-rs/tui/src/key_hint.rs +++ b/codex-rs/tui/src/key_hint.rs @@ -22,12 +22,21 @@ use ratatui::style::Color; use ratatui::style::Style; use ratatui::text::Span; -#[cfg(test)] -const ALT_LABEL: &str = "⌥"; -#[cfg(all(not(test), target_os = "macos"))] -const ALT_LABEL: &str = "⌥"; -#[cfg(all(not(test), not(target_os = "macos")))] -const ALT_LABEL: &str = "alt"; +#[cfg(any(test, target_os = "macos"))] +const MODIFIER_LABELS: [(KeyModifiers, &str); 3] = [ + (KeyModifiers::CONTROL, "⌃"), + (KeyModifiers::SHIFT, "⇧"), + (KeyModifiers::ALT, "⌥"), +]; +#[cfg(not(any(test, target_os = "macos")))] +const MODIFIER_LABELS: [(KeyModifiers, &str); 3] = [ + #[cfg(target_os = "linux")] + (KeyModifiers::CONTROL, "^"), + #[cfg(not(target_os = "linux"))] + (KeyModifiers::CONTROL, "ctrl"), + (KeyModifiers::SHIFT, "shift"), + (KeyModifiers::ALT, "alt"), +]; /// One concrete key event that can trigger a TUI action. /// @@ -82,14 +91,10 @@ impl From for ShortcutHint { impl KeyBinding { pub(crate) fn display_label(&self) -> String { let mut label = String::new(); - for (modifier, name) in [ - (KeyModifiers::CONTROL, "ctrl"), - (KeyModifiers::SHIFT, "shift"), - (KeyModifiers::ALT, ALT_LABEL), - ] { + for (modifier, name) in MODIFIER_LABELS { if self.modifiers.contains(modifier) { label.push_str(name); - if !matches!(name, "⌥" | "⌘" | "^") { + if !matches!(name, "⌃" | "⇧" | "⌥" | "⌘" | "^") { label.push('+'); } } diff --git a/codex-rs/tui/src/key_hint_label_tests.rs b/codex-rs/tui/src/key_hint_label_tests.rs index d717f8b387..d42aa07e15 100644 --- a/codex-rs/tui/src/key_hint_label_tests.rs +++ b/codex-rs/tui/src/key_hint_label_tests.rs @@ -10,10 +10,10 @@ use ratatui::widgets::Paragraph; #[test] fn modifier_combinations_stay_compact_inside_chords() { let cases = [ - (KeyModifiers::CONTROL, "ctrl+t"), + (KeyModifiers::CONTROL, "⌃t"), (KeyModifiers::ALT, "⌥t"), - (KeyModifiers::CONTROL | KeyModifiers::SHIFT, "ctrl+shift+t"), - (KeyModifiers::CONTROL | KeyModifiers::ALT, "ctrl+⌥t"), + (KeyModifiers::CONTROL | KeyModifiers::SHIFT, "⌃⇧t"), + (KeyModifiers::CONTROL | KeyModifiers::ALT, "⌃⌥t"), ]; for (modifiers, expected) in cases { let prefix = KeyBinding::new(KeyCode::Char('t'), modifiers); diff --git a/codex-rs/tui/src/keymap/chords_tests.rs b/codex-rs/tui/src/keymap/chords_tests.rs index 451faa5778..a83149a8f8 100644 --- a/codex-rs/tui/src/keymap/chords_tests.rs +++ b/codex-rs/tui/src/keymap/chords_tests.rs @@ -551,7 +551,7 @@ fn activity_context_preserves_list_chords_and_its_remapped_focus_toggle() { assert_eq!( matcher.pending_hint_items(&runtime.chords, /*width*/ 80), Some(vec![ - ("ctrl+x".to_string(), "then".to_string()), + ("⌃x".to_string(), "then".to_string()), ("c".to_string(), "jump top".to_string()), ("esc".to_string(), "cancel".to_string()), ]), @@ -580,7 +580,7 @@ fn pending_hint_skips_whole_oversized_configured_completions() { KeymapContextSet::new(KeymapContext::Global), ); let mut scenes = Vec::new(); - for width in [80, 32, 12] { + for width in [80, 32, 10] { let hints = matcher.pending_hint_items(&runtime.chords, width).unwrap(); let line = crate::bottom_pane::footer_hint_items_line(&hints); assert!(line.width() <= usize::from(width)); @@ -589,9 +589,9 @@ fn pending_hint_skips_whole_oversized_configured_completions() { assert_eq!( scenes, [ - "80: ctrl+x then · shift+⌥f11 activity · ctrl+shift+⌥f12 copy · esc cancel", - "32: shift+⌥f11 inspect · esc cancel", - "12: esc cancel", + "80: ⌃x then · ⇧⌥f11 activity · ⌃⇧⌥f12 copy · esc cancel", + "32: ⇧⌥f11 inspect · ⌃⇧⌥f12 copy", + "10: esc cancel", ] ); } @@ -611,7 +611,7 @@ fn warning_context_keeps_local_chords_ahead_of_copy_and_hides_unreachable_hints( assert_eq!( matcher.pending_hint_items(&runtime.chords, /*width*/ 80), Some(vec![ - ("ctrl+x".into(), "then".into()), + ("⌃x".into(), "then".into()), ("c".into(), "jump bottom".into()), ("esc".into(), "cancel".into()), ]) diff --git a/codex-rs/tui/src/keymap/conflict_tests.rs b/codex-rs/tui/src/keymap/conflict_tests.rs index c927337523..e543a919e9 100644 --- a/codex-rs/tui/src/keymap/conflict_tests.rs +++ b/codex-rs/tui/src/keymap/conflict_tests.rs @@ -127,7 +127,7 @@ fn explicit_activity_remapping_and_unbinding_replace_all_defaults() { Some("pgup"), ), (json!([]), Vec::new(), None), - (json!("ctrl-x t"), Vec::new(), Some("ctrl+x t")), + (json!("ctrl-x t"), Vec::new(), Some("⌃x t")), ] { let keymap: TuiKeymap = serde_json::from_value(json!({"global": {"focus_activity": configured}})).unwrap(); diff --git a/codex-rs/tui/src/keymap/global_find_tests.rs b/codex-rs/tui/src/keymap/global_find_tests.rs index 14494e1322..8888e5fa81 100644 --- a/codex-rs/tui/src/keymap/global_find_tests.rs +++ b/codex-rs/tui/src/keymap/global_find_tests.rs @@ -9,7 +9,7 @@ fn global_find_resolves_remaps_unbinding_and_dispatch_in_main_and_activity_conte for (configured, label) in [ (json!("f12"), Some("f12")), (json!([]), None), - (json!(["ctrl-x f", "f12"]), Some("ctrl+x f")), + (json!(["ctrl-x f", "f12"]), Some("⌃x f")), ] { let config = serde_json::from_value(json!({"global":{"find_transcript":configured}})).unwrap(); diff --git a/codex-rs/tui/src/keymap/voice_tests.rs b/codex-rs/tui/src/keymap/voice_tests.rs index 1a19ccfaef..4bbea95eb7 100644 --- a/codex-rs/tui/src/keymap/voice_tests.rs +++ b/codex-rs/tui/src/keymap/voice_tests.rs @@ -8,10 +8,10 @@ use pretty_assertions::assert_eq; #[test] fn voice_mute_resolves_custom_bindings_unbinding_and_visible_hints() { for (config, expected) in [ - ("", Some("ctrl+x")), + ("", Some("⌃x")), ("[chat]\ntoggle_voice_mute = 'f8'", Some("f8")), ("[chat]\ntoggle_voice_mute = []", None), - ("[chat]\ntoggle_voice_mute = 'ctrl-x m'", Some("ctrl+x m")), + ("[chat]\ntoggle_voice_mute = 'ctrl-x m'", Some("⌃x m")), ] { let config = toml::from_str::(config).expect("valid voice keymap config"); let runtime = RuntimeKeymap::from_config(&config).expect("valid voice bindings"); diff --git a/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_completed_stream.snap b/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_completed_stream.snap index 1e1ecdbcf2..224b89187b 100644 --- a/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_completed_stream.snap +++ b/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_completed_stream.snap @@ -1,6 +1,5 @@ --- source: tui/src/pager_overlay/transcript_tests.rs -assertion_line: 664 expression: "buffer_to_text(&actual, area)" --- / T R A N S C R I P T / / / / / / / / / @@ -9,6 +8,6 @@ last -Ctrl+Space select +⌃space select ↑/↓ to scroll · pgup/pgdn to page · hom q close · f3 find · esc browse prompts diff --git a/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_paginated_history_states.snap b/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_paginated_history_states.snap index 2fcab53e1a..e9a984ffa7 100644 --- a/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_paginated_history_states.snap +++ b/codex-rs/tui/src/pager_overlay/snapshots/codex_tui__pager_overlay__transcript_tests__transcript_overlay_paginated_history_states.snap @@ -20,7 +20,7 @@ recent transcript -Earlier messages available. Ctrl+Space select +Earlier messages available. ⌃space select ↑/↓ to scroll · pgup/pgdn to page · home/end to jump q close · f3 find · esc browse prompts @@ -31,7 +31,7 @@ recent transcript -Retry history: ⌥ Vec> { priority: 0, }, PickerFooterHint { - key: "ctrl+c".to_string(), + key: crate::key_hint::ctrl(KeyCode::Char('c')).display_label(), wide_label: String::from("quit"), compact_label: String::from("quit"), priority: 1, @@ -2463,7 +2463,7 @@ fn footer_hint_lines(state: &PickerState, width: u16) -> Vec> { } if !state.filtered_rows.is_empty() && state.archive_shortcut_available() { first_row_hints.push(PickerFooterHint { - key: "ctrl+a".to_string(), + key: crate::key_hint::ctrl(KeyCode::Char('a')).display_label(), wide_label: String::from("archive"), compact_label: String::from("archive"), priority: 2, @@ -2479,7 +2479,7 @@ fn footer_hint_lines(state: &PickerState, width: u16) -> Vec> { } first_row_hints.extend([ PickerFooterHint { - key: "ctrl+c".to_string(), + key: crate::key_hint::ctrl(KeyCode::Char('c')).display_label(), wide_label: ctrl_c_label.to_string(), compact_label: ctrl_c_label.to_string(), priority: 2, @@ -2507,19 +2507,19 @@ fn footer_hint_lines(state: &PickerState, width: u16) -> Vec> { } let mut second_row_hints = vec![ PickerFooterHint { - key: "ctrl+o".to_string(), + key: crate::key_hint::ctrl(KeyCode::Char('o')).display_label(), wide_label: density_label.to_string(), compact_label: density_compact_label.to_string(), priority: 3, }, PickerFooterHint { - key: "ctrl+t".to_string(), + key: crate::key_hint::ctrl(KeyCode::Char('t')).display_label(), wide_label: String::from("transcript"), compact_label: String::from("preview"), priority: 4, }, PickerFooterHint { - key: "ctrl+e".to_string(), + key: crate::key_hint::ctrl(KeyCode::Char('e')).display_label(), wide_label: String::from("expand"), compact_label: String::from("exp"), priority: 6, @@ -4575,11 +4575,11 @@ mod tests { let wide = footer_lines_text(&state, /*width*/ 220); assert!(wide.contains("esc exit")); - assert!(wide.contains("ctrl+c exit")); + assert!(wide.contains("⌃c exit")); let compact = footer_lines_text(&state, /*width*/ 119); assert!(compact.contains("esc exit")); - assert!(compact.contains("ctrl+c exit")); + assert!(compact.contains("⌃c exit")); state.query = String::from("picker"); @@ -4598,14 +4598,14 @@ mod tests { SessionPickerAction::Resume, ); - assert!(footer_lines_text(&state, /*width*/ 220).contains("ctrl+o dense view")); - assert!(footer_lines_text(&state, /*width*/ 220).contains("ctrl+t transcript")); - assert!(footer_lines_text(&state, /*width*/ 220).contains("ctrl+e expand")); + assert!(footer_lines_text(&state, /*width*/ 220).contains("⌃o dense view")); + assert!(footer_lines_text(&state, /*width*/ 220).contains("⌃t transcript")); + assert!(footer_lines_text(&state, /*width*/ 220).contains("⌃e expand")); state.keymap.list.move_left = vec![crate::key_hint::ctrl(KeyCode::Char('h'))]; state.keymap.list.move_right = vec![crate::key_hint::ctrl(KeyCode::Char('l'))]; let remapped_footer = footer_lines_text(&state, /*width*/ 220); assert!( - remapped_footer.contains("ctrl+h/ctrl+l change option"), + remapped_footer.contains("⌃h/⌃l change option"), "{remapped_footer}" ); state.keymap.list.move_left.clear(); @@ -4614,7 +4614,7 @@ mod tests { state.density = SessionListDensity::Dense; - assert!(footer_lines_text(&state, /*width*/ 220).contains("ctrl+o comfortable view")); + assert!(footer_lines_text(&state, /*width*/ 220).contains("⌃o comfortable view")); } #[test] @@ -4634,9 +4634,9 @@ mod tests { assert!(rendered.contains("esc new")); assert!(rendered.contains("tab focus")); assert!(rendered.contains("←/→ option")); - assert!(rendered.contains("ctrl+o dense")); - assert!(rendered.contains("ctrl+t preview")); - assert!(rendered.contains("ctrl+e exp")); + assert!(rendered.contains("⌃o dense")); + assert!(rendered.contains("⌃t preview")); + assert!(rendered.contains("⌃e exp")); assert!(!rendered.contains("focus sort/filter")); } @@ -4702,7 +4702,7 @@ mod tests { assert!(lines.iter().all(|line| line.width() <= width as usize)); assert_eq!( rendered, - " enter resume esc new ctrl+c quit\n ctrl+o comfy ctrl+t preview" + " enter resume esc new ⌃c quit\n ⌃o comfy ⌃t preview ↑/↓ browse" ); } @@ -4722,7 +4722,7 @@ mod tests { let rendered = footer_lines_text(&state, /*width*/ 80); assert!(rendered.contains("loading transcript")); - assert!(rendered.contains("ctrl+c quit")); + assert!(rendered.contains("⌃c quit")); assert!(!rendered.contains("enter")); } diff --git a/codex-rs/tui/src/resume_picker/archive_tests.rs b/codex-rs/tui/src/resume_picker/archive_tests.rs index 5593cb3db7..8fa0699762 100644 --- a/codex-rs/tui/src/resume_picker/archive_tests.rs +++ b/codex-rs/tui/src/resume_picker/archive_tests.rs @@ -157,9 +157,9 @@ fn archive_footer_shows_shortcut_for_resume_sessions() { .collect::>() .join("\n"); - insta::assert_snapshot!(footer, @r" - enter resume ctrl+a archive esc start new ctrl+c quit tab focus sort/filter ←/→ change option - ctrl+o dense view ctrl+t transcript ctrl+e expand ↑/↓ browse + insta::assert_snapshot!(footer, @" + enter resume ⌃a archive esc start new ⌃c quit tab focus sort/filter ←/→ change option + ⌃o dense view ⌃t transcript ⌃e expand ↑/↓ browse "); } @@ -207,9 +207,9 @@ fn archived_status_preserves_directory_filter_and_hides_archive_shortcut() { .map(|line| line.to_string()) .collect::>() .join("\n"); - insta::assert_snapshot!(footer, @r" - enter restore esc start new ctrl+c quit tab focus sort/filter ←/→ change option - ctrl+o dense view ctrl+t transcript ctrl+e expand ↑/↓ browse + insta::assert_snapshot!(footer, @" + enter restore esc start new ⌃c quit tab focus sort/filter ←/→ change option + ⌃o dense view ⌃t transcript ⌃e expand ↑/↓ browse "); insta::assert_snapshot!( super::super::toolbar_line(&state, /*compact*/ true).to_string(), diff --git a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview.snap b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview.snap index cd4051449c..af4d80b3be 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: "render_bottom_popup(&app.chat_widget,\n96).replace(&format!(\"{project} 3\"),\n&normalized_project_group).replace(&project, \"/tmp/project\")" --- Agent command center Group: Project g - All 3 Needs you 1 Working 1 Ready 0 Inactive 1 tab/shift+tab filter + All 3 Needs you 1 Working 1 Ready 0 Inactive 1 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 3 │ diff --git a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attach_conflict.snap b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attach_conflict.snap index a48df0cb2a..019648bef5 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attach_conflict.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attach_conflict.snap @@ -5,4 +5,4 @@ expression: "render_bottom_popup(&app.chat_widget, 96)" 🔒 This conversation is open in another app r to retry Close it there and press R to continue here. - r retry f fork ←/esc command center ctrl+c/q exit ctrl+t transcript + r retry f fork ←/esc command center ⌃c/q exit ⌃t transcript diff --git a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attention.snap b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attention.snap index 8a80693e38..d9f5f53b77 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attention.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_attention.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: "render_bottom_popup(&app.chat_widget,\n96).replace(&format!(\"{project} 2\"),\n&normalized_group).replace(&project, \"/tmp/project\")" --- Agent command center Group: Project g - All 2 Needs you 1 Working 0 Ready 0 Inactive 1 tab/shift+tab filter + All 2 Needs you 1 Working 0 Ready 0 Inactive 1 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 2 │ diff --git a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_last_message.snap b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_last_message.snap index 730b74660b..7ba246f004 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_last_message.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_last_message.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: "render_bottom_popup(&app.chat_widget,\n96).replace(&format!(\"{project} 2\"),\n&normalized_group).replace(&project, \"/tmp/project\")" --- Agent command center Group: Project g - All 2 Needs you 1 Working 0 Ready 0 Inactive 1 tab/shift+tab filter + All 2 Needs you 1 Working 0 Ready 0 Inactive 1 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 2 │ diff --git a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_live_activity.snap b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_live_activity.snap index 941739f228..f8bf2735c8 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_live_activity.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_live_activity.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: "render_bottom_popup(&app.chat_widget,\n96).replace(&format!(\"{project} 1\"),\n&normalized_group).replace(&project, \"/tmp/project\")" --- Agent command center Group: Project g - All 1 Needs you 0 Working 1 Ready 0 Inactive 0 tab/shift+tab filter + All 1 Needs you 0 Working 1 Ready 0 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────── Tasks │ Task details /tmp/project 1 │ diff --git a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_worktree_grouping.snap b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_worktree_grouping.snap index 8396204dc3..9d1556acec 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_worktree_grouping.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__app__agents_overview__tests__agents_overview_worktree_grouping.snap @@ -3,7 +3,7 @@ source: tui/src/app/agents_overview_tests.rs expression: normalize_agent_center_snapshot(grouping) --- Agent command center Group: Project g - All 4 Needs you 0 Working 0 Ready 4 Inactive 0 tab/shift+tab filter + All 4 Needs you 0 Working 0 Ready 4 Inactive 0 tab/⇧tab filter ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Tasks Status Updated /tmp/worktree-root/primary 2 diff --git a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_picker_selected_40x16.snap b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_picker_selected_40x16.snap index 8d45b7cec0..97e9d4b8c9 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_picker_selected_40x16.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_picker_selected_40x16.snap @@ -16,4 +16,4 @@ expression: rendered enter continue · esc use session · - ctrl+c quit + ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_fork_modal.snap b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_fork_modal.snap index 18d49f8eed..ab95f289ef 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_fork_modal.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_fork_modal.snap @@ -12,4 +12,4 @@ expression: terminal.backend() 3. Always use session directory 4. Always use current directory - enter continue · esc use session · ctrl+c quit + enter continue · esc use session · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_modal.snap b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_modal.snap index 38c0191164..149cb6665b 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_modal.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_modal.snap @@ -12,4 +12,4 @@ expression: terminal.backend() 3. Always use session directory 4. Always use current directory - enter continue · esc use session · ctrl+c quit + enter continue · esc use session · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remembered_current_modal.snap b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remembered_current_modal.snap index f28ff1f928..cf0662eaee 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remembered_current_modal.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remembered_current_modal.snap @@ -12,4 +12,4 @@ expression: rendered 3. Always use session directory 4. Always use current directory (/Users/example/launched) - enter continue · esc use session · ctrl+c quit + enter continue · esc use session · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remote_exec_modal.snap b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remote_exec_modal.snap index def0e8f01c..1d2d703c62 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remote_exec_modal.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__cwd_prompt__tests__cwd_prompt_remote_exec_modal.snap @@ -11,4 +11,4 @@ expression: rendered 2. Use current directory (/Users/example/current) 3. Always use session directory - enter continue · esc use session · ctrl+c quit + enter continue · esc use session · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__inline_visualization__tests__transcript_overlay_visualization_becomes_available.snap b/codex-rs/tui/src/snapshots/codex_tui__inline_visualization__tests__transcript_overlay_visualization_becomes_available.snap index 63a6ebcadc..2eb5a78cb3 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__inline_visualization__tests__transcript_overlay_visualization_becomes_available.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__inline_visualization__tests__transcript_overlay_visualization_becomes_available.snap @@ -1,6 +1,5 @@ --- source: tui/src/inline_visualization_tests.rs -assertion_line: 412 expression: "format!(\"before:\\n{unavailable}\\n\\nafter:\\n{available}\")" --- before: @@ -12,7 +11,7 @@ before: -Ctrl+Space select +⌃space select ↑/↓ to scroll · pgup/pgdn to page · home/end to jump q close · f3 find · esc browse prompts @@ -26,6 +25,6 @@ after: -Ctrl+Space select +⌃space select ↑/↓ to scroll · pgup/pgdn to page · home/end to jump q close · f3 find · esc browse prompts diff --git a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt.snap b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt.snap index 412939b5a0..e2eb201394 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt.snap @@ -14,4 +14,4 @@ expression: terminal.backend() › 1. Try new model 2. Use existing model - enter/esc confirm · ctrl+c quit + enter/esc confirm · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex.snap b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex.snap index d8e6e583a2..41e9401771 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex.snap @@ -13,4 +13,4 @@ expression: terminal.backend() Learn more about gpt-5.1-codex-max at https://www.codex.com/models/gpt-5.1-codex-max - enter/esc continue · ctrl+c quit + enter/esc continue · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex_mini.snap b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex_mini.snap index d15cff935e..076e344fc1 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex_mini.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_codex_mini.snap @@ -13,4 +13,4 @@ expression: terminal.backend() Learn more about gpt-5.1-codex-mini at https://www.codex.com/models/gpt-5.1-codex-mini - enter/esc continue · ctrl+c quit + enter/esc continue · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_family.snap b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_family.snap index 7faa32c716..2cf7a2cc03 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_family.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_migration_prompt_gpt5_family.snap @@ -10,4 +10,4 @@ expression: terminal.backend() Broad world knowledge with strong general reasoning. Learn more about gpt-5.1 at https://www.codex.com/models/gpt-5.1 - enter/esc continue · ctrl+c quit + enter/esc continue · ⌃c quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_picker_selected_28x12.snap b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_picker_selected_28x12.snap index 177b63fa71..dc0fe1fad1 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_picker_selected_28x12.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__model_migration__tests__model_picker_selected_28x12.snap @@ -11,5 +11,5 @@ expression: rendered 1. Try new model › 2. Use existing model - enter/esc confirm · - ctrl+c quit + enter/esc confirm · ⌃c + quit diff --git a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_mixed_short.snap b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_mixed_short.snap index 085d2e111b..4e6c006bed 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_mixed_short.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_mixed_short.snap @@ -11,4 +11,4 @@ expression: terminal.backend() ↑/↓ choose · enter select · esc LM Studio · - ctrl+c exit + ⌃c exit diff --git a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_running.snap b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_running.snap index 3c5d97f2d1..b8a2141e55 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_running.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_running.snap @@ -11,4 +11,4 @@ expression: terminal.backend() Local Ollama server (Responses API, default port 11434) - ↑/↓ choose · enter select · esc LM Studio · ctrl+c exit + ↑/↓ choose · enter select · esc LM Studio · ⌃c exit diff --git a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_stopped.snap b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_stopped.snap index f85404cec2..d3522756cf 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_stopped.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_stopped.snap @@ -11,4 +11,4 @@ expression: terminal.backend() Local LM Studio server (default port 1234) - ↑/↓ choose · enter select · esc LM Studio · ctrl+c exit + ↑/↓ choose · enter select · esc LM Studio · ⌃c exit diff --git a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_unknown_narrow.snap b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_unknown_narrow.snap index 855046c9e9..e0e3b92bbf 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_unknown_narrow.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__oss_selection__presentation_tests__oss_providers_unknown_narrow.snap @@ -14,4 +14,4 @@ expression: terminal.backend() 1234) ↑/↓ choose · enter select · esc LM - Studio · ctrl+c exit + Studio · ⌃c exit diff --git a/codex-rs/tui/src/snapshots/codex_tui__resume_picker__color_tests__compact_picker_keeps_metadata_and_labeled_primary_actions.snap b/codex-rs/tui/src/snapshots/codex_tui__resume_picker__color_tests__compact_picker_keeps_metadata_and_labeled_primary_actions.snap index 8e384a2567..0e8897595d 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__resume_picker__color_tests__compact_picker_keeps_metadata_and_labeled_primary_actions.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__resume_picker__color_tests__compact_picker_keeps_metadata_and_labeled_primary_actions.snap @@ -30,8 +30,8 @@ Resume 118x30 ─────────────────────────────────────────────────────────────────────────────────────────────────────── 1 / 6 · 100% ─ - enter resume ctrl+a archive esc new ctrl+c quit tab focus ←/→ option - ctrl+o dense ctrl+t preview ctrl+e exp ↑/↓ browse + enter resume ⌃a archive esc new ⌃c quit tab focus ←/→ option + ⌃o dense ⌃t preview ⌃e exp ↑/↓ browse Resume 70x12 Resume a previous session Filter: Cwd Active Sort: Updated @@ -42,8 +42,8 @@ Resume 70x12 Session 2 ↓ more ───────────────────────────────────────────────────────── 1 / 6 · 0% ─ - enter resume ctrl+a archive esc new ctrl+c quit tab focus - ctrl+o dense ctrl+t preview ctrl+e exp ↑/↓ browse + enter resume ⌃a archive esc new ⌃c quit tab focus + ⌃o dense ⌃t preview ⌃e exp ↑/↓ browse Resume 38x12 Resume a previous session Filter: Cwd Active Sort: Updated @@ -54,8 +54,8 @@ Resume 38x12 Session 2 ↓ more ───────────────────────── 1 / 6 · 0% ─ - enter resume esc new - ctrl+o dense ctrl+t preview + enter resume ⌃a archive esc new + ⌃o dense ⌃t preview ↑/↓ browse Fork 38x12 Fork a previous session Filter: Cwd Sort: Updated @@ -66,5 +66,5 @@ Fork 38x12 Session 2 ↓ more ───────────────────────── 1 / 6 · 0% ─ - enter fork esc new ctrl+c quit - ctrl+o dense ctrl+t preview + enter fork esc new ⌃c quit + ⌃o dense ⌃t preview ↑/↓ browse diff --git a/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_compact.snap b/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_compact.snap index 65fb6f7857..23003a0a6f 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_compact.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_compact.snap @@ -3,5 +3,5 @@ source: tui/src/resume_picker.rs expression: "footer_snapshot(&state, 96, 20)" --- ───────────────────────────────────────────────────────────────────────────────── 0 / 0 · 100% ─ - enter resume esc clear ctrl+c quit tab focus ←/→ option - ctrl+o comfy ctrl+t preview ctrl+e exp ↑/↓ browse + enter resume esc clear ⌃c quit tab focus ←/→ option + ⌃o comfy ⌃t preview ⌃e exp ↑/↓ browse diff --git a/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_wide.snap b/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_wide.snap index 13c111dc1d..56e733c24f 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_wide.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__resume_picker__tests__resume_picker_footer_wide.snap @@ -3,5 +3,5 @@ source: tui/src/resume_picker.rs expression: "footer_snapshot(&state, 220, 20)" --- ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 0 / 0 · 100% ─ - enter resume esc start new ctrl+c quit tab focus sort/filter ←/→ change option - ctrl+o dense view ctrl+t transcript ctrl+e expand ↑/↓ browse + enter resume esc start new ⌃c quit tab focus sort/filter ←/→ change option + ⌃o dense view ⌃t transcript ⌃e expand ↑/↓ browse diff --git a/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__command_preview_matches_streamed_and_completed_output.snap b/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__command_preview_matches_streamed_and_completed_output.snap index 6a1ad38d55..15897590d1 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__command_preview_matches_streamed_and_completed_output.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__command_preview_matches_streamed_and_completed_output.snap @@ -1,6 +1,5 @@ --- source: tui/src/tool_output_tests.rs -assertion_line: 190 expression: "format!(\"history:\\n{}\\n\\ncompact:\\n{}\\n\\ntranscript:\\n{}\",\ncompleted.iter().map(ToString::to_string).collect::>().join(\"\\n\"),\nvisible_lines(cell.compact_hyperlink_lines(80)).iter().map(ToString::to_string).collect::>().join(\"\\n\"),\ncell.transcript_lines(80).iter().map(ToString::to_string).collect::>().join(\"\\n\"),)" --- history: @@ -8,7 +7,7 @@ history: └ first second third - +2 lines (ctrl+t to view transcript) + +2 lines (⌃t to view transcript) compact: • Ran echo output diff --git a/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__preview_caps_wrapped_output_and_counts_hidden_logical_lines.snap b/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__preview_caps_wrapped_output_and_counts_hidden_logical_lines.snap index 60ffce1e84..f773fcefec 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__preview_caps_wrapped_output_and_counts_hidden_logical_lines.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__tool_output__tests__preview_caps_wrapped_output_and_counts_hidden_logical_lines.snap @@ -1,9 +1,8 @@ --- source: tui/src/tool_output_tests.rs -assertion_line: 22 expression: "preview.iter().map(ToString::to_string).collect::>().join(\"\\n\")" --- first https:// example.test/a/ -+9 lines (ctrl+… ++9 lines (⌃t to… diff --git a/codex-rs/tui/src/snapshots/codex_tui__transcript_view__tests__terminal_output_disclosure_counts_only_revealable_lines.snap b/codex-rs/tui/src/snapshots/codex_tui__transcript_view__tests__terminal_output_disclosure_counts_only_revealable_lines.snap index 44e5532a60..6a52f4decd 100644 --- a/codex-rs/tui/src/snapshots/codex_tui__transcript_view__tests__terminal_output_disclosure_counts_only_revealable_lines.snap +++ b/codex-rs/tui/src/snapshots/codex_tui__transcript_view__tests__terminal_output_disclosure_counts_only_revealable_lines.snap @@ -13,7 +13,7 @@ one hidden └ b c d - + 1 line (ctrl+t to expand) + + 1 line (⌃t to expand) clipped line • Ran echo @@ -30,4 +30,4 @@ storage truncated └ x x x - + 97 lines (ctrl+t to expand) + + 97 lines (⌃t to expand) diff --git a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__transcript_overlay_status_rate_limit_refresh.snap b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__transcript_overlay_status_rate_limit_refresh.snap index f7871d8a38..6c4592a0f4 100644 --- a/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__transcript_overlay_status_rate_limit_refresh.snap +++ b/codex-rs/tui/src/status/snapshots/codex_tui__status__tests__transcript_overlay_status_rate_limit_refresh.snap @@ -29,7 +29,7 @@ before: -Ctrl+Space select +⌃space select ↑/↓ to scroll · pgup/pgdn to page · home/end to jump q close · f3 find · esc browse prompts @@ -61,6 +61,6 @@ next message -Ctrl+Space select +⌃space select ↑/↓ to scroll · pgup/pgdn to page · home/end to jump q close · f3 find · esc browse prompts diff --git a/codex-rs/tui/src/thread_transcript/snapshots/codex_tui__thread_transcript__tools__tests__completed_tool_presentations.snap b/codex-rs/tui/src/thread_transcript/snapshots/codex_tui__thread_transcript__tools__tests__completed_tool_presentations.snap index 2814c8b216..2bca7ec633 100644 --- a/codex-rs/tui/src/thread_transcript/snapshots/codex_tui__thread_transcript__tools__tests__completed_tool_presentations.snap +++ b/codex-rs/tui/src/thread_transcript/snapshots/codex_tui__thread_transcript__tools__tests__completed_tool_presentations.snap @@ -7,7 +7,7 @@ Command: compact └ output line 1 output line 2 output line 3 - +9 lines (ctrl+t to view transcript) + +9 lines (⌃t to view transcript) Command: detailed $ cargo check diff --git a/codex-rs/tui/src/tool_output.rs b/codex-rs/tui/src/tool_output.rs index 018d010e9a..4cdfe816bc 100644 --- a/codex-rs/tui/src/tool_output.rs +++ b/codex-rs/tui/src/tool_output.rs @@ -8,7 +8,7 @@ use crate::terminal_hyperlinks::HyperlinkLine; use crate::terminal_hyperlinks::LogicalLineSource; use crate::terminal_hyperlinks::TerminalHyperlink; use crate::terminal_hyperlinks::remap_source_wrapped_line; -use crate::ui_consts::TRANSCRIPT_HINT; +use crate::ui_consts::transcript_hint; use crate::wrapping::RtOptions; use crate::wrapping::word_wrap_line_with_source; use ratatui::style::Stylize; @@ -116,7 +116,7 @@ impl ToolOutputPreview { let unit = if omitted == 1 { "line" } else { "lines" }; self.lines.push( truncate_line_with_ellipsis_if_overflow( - format!("+{omitted} {unit} ({TRANSCRIPT_HINT})") + format!("+{omitted} {unit} ({})", transcript_hint()) .dim() .into(), self.width, diff --git a/codex-rs/tui/src/tool_output_tests.rs b/codex-rs/tui/src/tool_output_tests.rs index 15d1b470ef..47ffd76ad5 100644 --- a/codex-rs/tui/src/tool_output_tests.rs +++ b/codex-rs/tui/src/tool_output_tests.rs @@ -99,7 +99,7 @@ fn preview_counts_newline_dense_output() { assert_eq!(rendered, PREVIEW_LINES); assert_eq!( preview.iter().map(ToString::to_string).collect::>(), - ["", "", "", "+99997 lines (ctrl+t to view transcript)"], + ["", "", "", "+99997 lines (⌃t to view transcript)"], ); } @@ -127,7 +127,7 @@ fn preview_caps_combining_text_across_styled_spans() { visible_lines(preview), vec![ expected_line, - "+2 lines (ctrl+t to view transcript)".dim().into() + "+2 lines (⌃t to view transcript)".dim().into() ], ); } diff --git a/codex-rs/tui/src/tooltips/keybinding_tests.rs b/codex-rs/tui/src/tooltips/keybinding_tests.rs index 1ff8be56f2..7811f83a9d 100644 --- a/codex-rs/tui/src/tooltips/keybinding_tests.rs +++ b/codex-rs/tui/src/tooltips/keybinding_tests.rs @@ -89,7 +89,7 @@ fn reasoning_tip_requires_both_bindings() { fn subsequent_tips_reflect_remapped_bindings() { for (configured, label) in [ (json!("f12"), Some("f12")), - (json!(["ctrl-x t", "f12"]), Some("ctrl+x t")), + (json!(["ctrl-x t", "f12"]), Some("⌃x t")), (json!([]), None), ] { let config = diff --git a/codex-rs/tui/src/tooltips/snapshots/codex_tui__tooltips__keybinding_tests__configured_shortcut_tips_render_at_narrow_width.snap b/codex-rs/tui/src/tooltips/snapshots/codex_tui__tooltips__keybinding_tests__configured_shortcut_tips_render_at_narrow_width.snap index f90948016d..d91e302745 100644 --- a/codex-rs/tui/src/tooltips/snapshots/codex_tui__tooltips__keybinding_tests__configured_shortcut_tips_render_at_narrow_width.snap +++ b/codex-rs/tui/src/tooltips/snapshots/codex_tui__tooltips__keybinding_tests__configured_shortcut_tips_render_at_narrow_width.snap @@ -7,19 +7,19 @@ Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("t Line::from("task is running; otherwise it sends") Line::from_iter([Span::from("immediately (except "), Span::from("!").fg(Color::Rgb(166, 227, 161)), Span::from(").")]) Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Use "), Span::from("/copy").bold(), Span::from(" or press "), Span::from("ctrl+o").fg(Color::Rgb(166, 227, 161)), Span::from(" to copy")]) -Line::from("the latest agent response as Markdown.") +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Use "), Span::from("/copy").bold(), Span::from(" or press "), Span::from("⌃o").fg(Color::Rgb(166, 227, 161)), Span::from(" to copy the")]) +Line::from("latest agent response as Markdown.") Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+t").fg(Color::Rgb(166, 227, 161)), Span::from(" to open the full")]) +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃t").fg(Color::Rgb(166, 227, 161)), Span::from(" to open the full")]) Line::from("transcript.") Line::default() Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("f3").fg(Color::Rgb(166, 227, 161)), Span::from(" to search this")]) Line::from("conversation.") Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+g").fg(Color::Rgb(166, 227, 161)), Span::from(" to edit your current")]) -Line::from("draft in an external editor.") +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃g").fg(Color::Rgb(166, 227, 161)), Span::from(" to edit your current draft")]) +Line::from("in an external editor.") Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+r").fg(Color::Rgb(166, 227, 161)), Span::from(" to search previously")]) +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃r").fg(Color::Rgb(166, 227, 161)), Span::from(" to search previously")]) Line::from("entered prompts.") Line::default() Line::from_iter([Span::from("Tip:").bold(), Span::from(" For models with adjustable")]) @@ -27,27 +27,26 @@ Line::from_iter([Span::from("reasoning, press "), Span::from("⌥.").fg(Color::R Line::from_iter([Span::from("reasoning effort or "), Span::from("⌥,").fg(Color::Rgb(166, 227, 161)), Span::from(" to decrease it.")]) Line::default() Line::from("Remapped") -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+x q").fg(Color::Rgb(166, 227, 161)), Span::from(" to queue a message")]) -Line::from("when a task is running; otherwise it") -Line::from_iter([Span::from("sends immediately (except "), Span::from("!").fg(Color::Rgb(166, 227, 161)), Span::from(").")]) +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃x q").fg(Color::Rgb(166, 227, 161)), Span::from(" to queue a message when")]) +Line::from("a task is running; otherwise it sends") +Line::from_iter([Span::from("immediately (except "), Span::from("!").fg(Color::Rgb(166, 227, 161)), Span::from(").")]) Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Use "), Span::from("/copy").bold(), Span::from(" or press "), Span::from("ctrl+x `").fg(Color::Rgb(166, 227, 161)), Span::from(" to copy")]) -Line::from("the latest agent response as Markdown.") +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Use "), Span::from("/copy").bold(), Span::from(" or press "), Span::from("⌃x `").fg(Color::Rgb(166, 227, 161)), Span::from(" to copy the")]) +Line::from("latest agent response as Markdown.") Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+x t").fg(Color::Rgb(166, 227, 161)), Span::from(" to open the full")]) +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃x t").fg(Color::Rgb(166, 227, 161)), Span::from(" to open the full")]) Line::from("transcript.") Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+x f").fg(Color::Rgb(166, 227, 161)), Span::from(" to search this")]) +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃x f").fg(Color::Rgb(166, 227, 161)), Span::from(" to search this")]) Line::from("conversation.") Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+x e").fg(Color::Rgb(166, 227, 161)), Span::from(" to edit your current")]) +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃x e").fg(Color::Rgb(166, 227, 161)), Span::from(" to edit your current")]) Line::from("draft in an external editor.") Line::default() -Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("ctrl+x r").fg(Color::Rgb(166, 227, 161)), Span::from(" to search previously")]) +Line::from_iter([Span::from("Tip:").bold(), Span::from(" Press "), Span::from("⌃x r").fg(Color::Rgb(166, 227, 161)), Span::from(" to search previously")]) Line::from("entered prompts.") Line::default() Line::from_iter([Span::from("Tip:").bold(), Span::from(" For models with adjustable")]) -Line::from_iter([Span::from("reasoning, press "), Span::from("ctrl+x +").fg(Color::Rgb(166, 227, 161)), Span::from(" to increase")]) -Line::from_iter([Span::from("reasoning effort or "), Span::from("ctrl+x -").fg(Color::Rgb(166, 227, 161)), Span::from(" to decrease")]) -Line::from("it.") +Line::from_iter([Span::from("reasoning, press "), Span::from("⌃x +").fg(Color::Rgb(166, 227, 161)), Span::from(" to increase")]) +Line::from_iter([Span::from("reasoning effort or "), Span::from("⌃x -").fg(Color::Rgb(166, 227, 161)), Span::from(" to decrease it.")]) Line::default() diff --git a/codex-rs/tui/src/transcript_view/footer.rs b/codex-rs/tui/src/transcript_view/footer.rs index 9de9090061..c7d777407f 100644 --- a/codex-rs/tui/src/transcript_view/footer.rs +++ b/codex-rs/tui/src/transcript_view/footer.rs @@ -50,7 +50,10 @@ impl TranscriptView { first_fitting_line( [ self.status_line_with_navigation( - "ctrl+c copy · enter copy & follow · esc clear", + &format!( + "{} copy · enter copy & follow · esc clear", + crate::key_hint::ctrl(KeyCode::Char('c')).display_label() + ), motion, ), selection_hint(width), @@ -192,7 +195,10 @@ impl TranscriptView { fn selection_hint(width: u16) -> Line<'static> { first_fitting_line( [ - "ctrl+c copy · enter copy & follow · esc clear", + &format!( + "{} copy · enter copy & follow · esc clear", + crate::key_hint::ctrl(KeyCode::Char('c')).display_label() + ), "enter copy & follow · esc clear", "enter copy+↓ · esc", "esc clear", diff --git a/codex-rs/tui/src/transcript_view/footer_tests.rs b/codex-rs/tui/src/transcript_view/footer_tests.rs index db8e030d4a..61fb2ca412 100644 --- a/codex-rs/tui/src/transcript_view/footer_tests.rs +++ b/codex-rs/tui/src/transcript_view/footer_tests.rs @@ -102,14 +102,14 @@ fn selection_at_bottom_restores_footer_without_resuming_following() { )); } insta::assert_snapshot!(observations.join("\n"), @" - Partial, selected at bottom: ctrl+c copy · enter copy & follow · esc clear + Partial, selected at bottom: ⌃c copy · enter copy & follow · esc clear Partial, clicked away: Partial, scrolled down at bottom: - Partial, selected above bottom: Earlier messages available. ctrl+c copy · enter copy & follow · esc clear - Complete, selected at bottom: ctrl+c copy · enter copy & follow · esc clear + Partial, selected above bottom: Earlier messages available. ⌃c copy · enter copy & follow · esc clear + Complete, selected at bottom: ⌃c copy · enter copy & follow · esc clear Complete, clicked away: Complete, scrolled down at bottom: - Complete, selected above bottom: ctrl+c copy · enter copy & follow · esc clear + Complete, selected above bottom: ⌃c copy · enter copy & follow · esc clear "); } @@ -191,7 +191,7 @@ fn loading_preserves_selected_content_and_copy_action() { .expect("loading selection footer"); assert_eq!((footer.cursor_column, footer.is_interactive), (None, true)); insta::allow_duplicates! { - insta::assert_snapshot!(footer.text.to_string(), @"↑ Loading earlier messages… · ctrl+c copy · enter copy & follow · esc clear"); + insta::assert_snapshot!(footer.text.to_string(), @"↑ Loading earlier messages… · ⌃c copy · enter copy & follow · esc clear"); } let Some(ViewAction::Copy(copied)) = view.handle_key( KeyEvent::new(KeyCode::Char('c'), KeyModifiers::CONTROL), @@ -209,7 +209,7 @@ fn loading_preserves_selected_content_and_copy_action() { let footer = view .footer(/*width*/ 80, MotionMode::Reduced) .expect("selection footer after loading"); - insta::assert_snapshot!(footer.text.to_string(), @"ctrl+c copy · enter copy & follow · esc clear"); + insta::assert_snapshot!(footer.text.to_string(), @"⌃c copy · enter copy & follow · esc clear"); assert_eq!( view.selected_text(&cells), Some("selected words".to_string()) @@ -221,7 +221,7 @@ fn loading_preserves_selected_content_and_copy_action() { .text .to_string(), format!( - "ctrl+c copy · enter copy & follow · esc clear · Retry: {}", + "⌃c copy · enter copy & follow · esc clear · Retry: {}", JumpTarget::Beginning.hint_label(), ), ); @@ -301,7 +301,7 @@ fn loading_completion_restores_unseen_activity_and_failure_stops_motion() { let failed = view .footer(/*width*/ 80, MotionMode::Reduced) .expect("failed history footer"); - insta::assert_snapshot!(failed.text.to_string(), @"New activity · Retry history: ⌥ Line<'static> { + let previous = crate::key_hint::ctrl(crossterm::event::KeyCode::Char('p')).display_label(); + let retry_hint = format!("{previous} retry"); + let unavailable_hint = format!("History unavailable · {retry_hint}"); + let next_hint = format!("enter next · {previous} previous"); + let exhausted_hint = format!("No more matches · {next_hint}"); let (status, compact) = match self.progress { Progress::Idle => ("Type to find", "Type to find"), Progress::Restart | Progress::Scanning(_) => ("Searching…", "Searching…"), Progress::AwaitingHistory if history == TranscriptHistoryState::Failed => { - ("History unavailable · ctrl+p retry", "ctrl+p retry") + (unavailable_hint.as_str(), retry_hint.as_str()) } Progress::AwaitingHistory => ("Searching earlier history…", "Loading…"), - Progress::Found => ("enter next · ctrl+p previous", "enter next"), - Progress::Exhausted if self.current.is_some() => ( - "No more matches · enter next · ctrl+p previous", - "enter next", - ), + Progress::Found => (next_hint.as_str(), "enter next"), + Progress::Exhausted if self.current.is_some() => { + (exhausted_hint.as_str(), "enter next") + } Progress::Exhausted => ("No matches", "No matches"), }; let limit = if self.query_truncated { diff --git a/codex-rs/tui/src/transcript_view/search_tests.rs b/codex-rs/tui/src/transcript_view/search_tests.rs index 2eaac634e2..051a93c594 100644 --- a/codex-rs/tui/src/transcript_view/search_tests.rs +++ b/codex-rs/tui/src/transcript_view/search_tests.rs @@ -574,7 +574,7 @@ fn next_previous_highlight_and_cancel_share_the_transcript_position() { true, true, true, true, true, true, false, false, false, false ] ); - insta::assert_snapshot!(view.search.status_line(/*width*/ 80, view.history).to_string(), @"enter next · ctrl+p previous · full transcript · esc close"); + insta::assert_snapshot!(view.search.status_line(/*width*/ 80, view.history).to_string(), @"enter next · ⌃p previous · full transcript · esc close"); view.handle_search_key(KeyEvent::new(KeyCode::Left, KeyModifiers::NONE), &cells); assert!(matches!(view.search.progress, Progress::Found)); view.handle_search_key(KeyEvent::new(KeyCode::Esc, KeyModifiers::NONE), &cells); @@ -618,7 +618,7 @@ fn legacy_search_shortcuts_navigate_in_both_directions_without_wrapping() { (2, true) ], ); - insta::assert_snapshot!(view.search.status_line(/*width*/ 80, view.history).to_string(), @"No more matches · enter next · ctrl+p previous · full transcript · esc close"); + insta::assert_snapshot!(view.search.status_line(/*width*/ 80, view.history).to_string(), @"No more matches · enter next · ⌃p previous · full transcript · esc close"); } #[test] @@ -751,7 +751,7 @@ fn failed_history_waits_for_explicit_retry_and_empty_query_cancels_loading() { view.search .status_line(/*width*/ 32, view.history) .to_string(), - "ctrl+p retry · esc close", + "⌃p retry · esc close", ); view.handle_search_key(KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), &cells); assert_eq!(view.history, TranscriptHistoryState::Failed); diff --git a/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__compact_navigation_hints.snap b/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__compact_navigation_hints.snap index b74a9cff6f..5bb7d5bcad 100644 --- a/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__compact_navigation_hints.snap +++ b/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__compact_navigation_hints.snap @@ -4,13 +4,13 @@ expression: "snapshots.join(\"\\n\")" --- 26 columns, LoadingOlder: ↑ Loading… · esc latest 26 columns, LoadingBeginning: ↑ Loading… · esc latest -26 columns, Failed: Retry: ⌥ searching=false · one character -ctrl+c copy · enter copy & follow · esc clear +⌃c copy · enter copy & follow · esc clear searching=false · back to anchor @@ -20,7 +20,7 @@ Searching… · full transcript · esc close searching=true · one character Find: -ctrl+c copy · enter copy & follow · esc clear +⌃c copy · enter copy & follow · esc clear searching=true · back to anchor Find: diff --git a/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__transcript_footer_keys_remain_distinct_from_prose_and_query_text.snap b/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__transcript_footer_keys_remain_distinct_from_prose_and_query_text.snap index 857fde54bd..55b7d8ad63 100644 --- a/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__transcript_footer_keys_remain_distinct_from_prose_and_query_text.snap +++ b/codex-rs/tui/src/transcript_view/snapshots/codex_tui__transcript_view__footer__tests__transcript_footer_keys_remain_distinct_from_prose_and_query_text.snap @@ -1,12 +1,12 @@ --- source: tui/src/transcript_view/footer_tests.rs -expression: 'format!("{buffer:?}")' +expression: "format!(\"{buffer:?}\")" --- Buffer { area: Rect { x: 0, y: 0, width: 80, height: 2 }, content: [ "Find: Activity ", - "enter next · ctrl+p previous · full transcript · esc close ", + "enter next · ⌃p previous · full transcript · esc close ", ], styles: [ x: 0, y: 0, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, @@ -14,9 +14,9 @@ Buffer { x: 0, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, x: 5, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, x: 13, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 19, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 49, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, - x: 52, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, - x: 58, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, + x: 15, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 45, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: BOLD, + x: 48, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: DIM, + x: 54, y: 1, fg: Reset, bg: Reset, underline: Reset, modifier: NONE, ] } diff --git a/codex-rs/tui/src/transcript_view_tests.rs b/codex-rs/tui/src/transcript_view_tests.rs index 8492e227b0..54dbe15e25 100644 --- a/codex-rs/tui/src/transcript_view_tests.rs +++ b/codex-rs/tui/src/transcript_view_tests.rs @@ -111,7 +111,7 @@ fn terminal_output_disclosure_follows_live_history_and_keymap() { &mut view, &cells, /*width*/ 72, /*height*/ 6, )); assert_eq!(live, committed); - let hint = " (ctrl+t to expand)"; + let hint = " (⌃t to expand)"; assert!(live.contains(&format!("+ 5 lines{hint}"))); // Check where the hint is visible, so the copy/search exclusion cannot pass vacuously. assert!( @@ -124,7 +124,7 @@ fn terminal_output_disclosure_follows_live_history_and_keymap() { // Warm layouts must follow config changes, including chords and disabling the action. for (configured, expected) in [ (serde_json::json!("f12"), " (f12 to expand)"), - (serde_json::json!("ctrl-x t"), " (ctrl+x t to expand)"), + (serde_json::json!("ctrl-x t"), " (⌃x t to expand)"), (serde_json::json!([]), ""), ] { let config = serde_json::from_value(serde_json::json!({ diff --git a/codex-rs/tui/src/ui_consts.rs b/codex-rs/tui/src/ui_consts.rs index 0aa4d6557f..bedc899852 100644 --- a/codex-rs/tui/src/ui_consts.rs +++ b/codex-rs/tui/src/ui_consts.rs @@ -1,4 +1,4 @@ -//! Shared UI constants for layout and alignment within the TUI. +//! Shared layout constants and transcript navigation text for the TUI. /// Width (in terminal columns) reserved for the left gutter/prefix used by /// live cells and aligned widgets. @@ -9,4 +9,9 @@ /// - User history lines account for this many columns (e.g., "▌ ") when wrapping. pub(crate) const LIVE_PREFIX_COLS: u16 = 2; pub(crate) const FOOTER_INDENT_COLS: usize = LIVE_PREFIX_COLS as usize; -pub(crate) const TRANSCRIPT_HINT: &str = "ctrl+t to view transcript"; +pub(crate) fn transcript_hint() -> String { + format!( + "{} to view transcript", + crate::key_hint::ctrl(crossterm::event::KeyCode::Char('t')).display_label() + ) +}