in codex-rs/tui/src/bottom_pane/request_user_input/mod.rs [473:522]
fn footer_tips(&self) -> Vec<FooterTip> {
let mut tips = Vec::new();
let notes_visible = self.notes_ui_visible();
if self.has_options() {
if self.selected_option_index().is_some() && !notes_visible {
tips.push(FooterTip::highlighted("tab to add notes"));
}
if self.selected_option_index().is_some() && notes_visible {
tips.push(FooterTip::new("tab or esc to clear notes"));
}
}
let question_count = self.question_count();
let is_last_question = self.current_index().saturating_add(1) >= question_count;
let submit_key = if self.focus_is_notes() || !self.has_options() {
self.composer_submit_keys
.first()
.map(KeyBinding::display_label)
} else {
Some("enter".to_string())
};
if let Some(submit_key) = submit_key {
let submit_tip = if question_count == 1 {
FooterTip::highlighted(format!("{submit_key} to submit answer"))
} else if is_last_question {
FooterTip::highlighted(format!("{submit_key} to submit all"))
} else {
FooterTip::new(format!("{submit_key} to submit answer"))
};
tips.push(submit_tip);
}
if question_count > 1 {
if self.has_options() && !self.focus_is_notes() {
tips.push(FooterTip::new("←/→ to navigate questions"));
} else if !self.has_options() {
tips.push(FooterTip::new("ctrl + p / ctrl + n change question"));
}
}
if let Some(interrupt_key) = self.interrupt_turn_keys.first()
&& !(self.has_options()
&& notes_visible
&& *interrupt_key == crate::key_hint::plain(KeyCode::Esc))
{
tips.push(FooterTip::new(format!(
"{} to interrupt",
interrupt_key.display_label()
)));
}
tips
}