in codex-rs/tui/src/bottom_pane/list_selection_view.rs [910:1018]
fn handle_key_event(&mut self, key_event: KeyEvent) {
// Searchable lists reserve printable characters for query input. This
// keeps vim-style plain j/k/h/l useful in non-search lists without
// making those letters impossible to type into a filter.
let allow_plain_char_navigation =
!self.is_searchable || !is_plain_text_key_event(key_event);
match key_event {
_ if allow_plain_char_navigation && self.keymap.move_up.is_pressed(key_event) => {
self.move_up()
}
_ if allow_plain_char_navigation && self.keymap.move_down.is_pressed(key_event) => {
self.move_down()
}
_ if allow_plain_char_navigation && self.keymap.page_up.is_pressed(key_event) => {
self.page_up()
}
_ if allow_plain_char_navigation && self.keymap.page_down.is_pressed(key_event) => {
self.page_down()
}
_ if allow_plain_char_navigation && self.keymap.jump_top.is_pressed(key_event) => {
self.jump_top()
}
_ if allow_plain_char_navigation && self.keymap.jump_bottom.is_pressed(key_event) => {
self.jump_bottom()
}
_ if allow_plain_char_navigation
&& self.tabs_enabled()
&& self.keymap.move_left.is_pressed(key_event) =>
{
self.switch_tab(/*step*/ -1)
}
_ if allow_plain_char_navigation
&& self.tabs_enabled()
&& self.keymap.move_right.is_pressed(key_event) =>
{
self.switch_tab(/*step*/ 1)
}
KeyEvent {
code: KeyCode::Backspace,
..
} if self.is_searchable => {
self.search_query.pop();
self.apply_filter();
}
KeyEvent {
code: KeyCode::Char(' '),
modifiers: KeyModifiers::NONE,
..
} if self.selected_item_has_toggle()
&& (!self.is_searchable || self.search_query.is_empty()) =>
{
self.toggle_selected()
}
KeyEvent {
code: KeyCode::Char(' '),
modifiers: KeyModifiers::NONE,
..
} if self.is_searchable
&& self.search_query.is_empty()
&& self.selected_item_has_toggle_placeholder() => {}
_ if self.keymap.cancel.is_pressed(key_event) => {
self.on_ctrl_c();
}
_ if self.keymap.accept.is_pressed(key_event) => self.accept(),
KeyEvent {
code: KeyCode::Char(c),
..
} if c.is_ascii_control() => {}
KeyEvent {
code: KeyCode::Char(c),
modifiers,
..
} if self.is_searchable
&& !modifiers.contains(KeyModifiers::CONTROL)
&& !modifiers.contains(KeyModifiers::ALT) =>
{
self.search_query.push(c);
self.apply_filter();
}
KeyEvent {
code: KeyCode::Char(c),
modifiers,
..
} if !self.is_searchable
&& !modifiers.contains(KeyModifiers::CONTROL)
&& !modifiers.contains(KeyModifiers::ALT) =>
{
if let Some(idx) = self.items.iter().position(|item| {
item.display_shortcut
.is_some_and(|shortcut| shortcut.is_press(key_event))
&& Self::item_is_enabled(item)
}) {
self.state.selected_idx = Some(idx);
self.accept();
return;
}
if let Some(idx) = c
.to_digit(10)
.map(|d| d as usize)
.and_then(|number| self.actual_idx_for_enabled_number(number))
{
self.state.selected_idx = Some(idx);
self.accept();
}
}
_ => {}
}
}