fix(help): handle Ctrl+H as delete on some systems

Summary:
- Treat Ctrl+H as Backspace in the help overlay filter.
- Document the terminal erase behavior inline.
- Add regression coverage for the help filter widening after Ctrl+H.

Maintainer verification on current origin/main:
- cargo test -p deepseek-tui ctrl_h_widens_match_set --locked
- cargo fmt --all -- --check
- git diff --check origin/main...HEAD

Fixes #958
This commit is contained in:
jiaren wang
2026-05-07 17:18:22 +09:00
committed by GitHub
parent 630398288a
commit 82b9e46254
+23 -1
View File
@@ -6,7 +6,8 @@
//! keybinding list from [`crate::tui::keybindings::KEYBINDINGS`] so neither
//! can drift from the wired-up handlers.
//!
//! Keys: any printable character extends the filter, `Backspace` shrinks it,
//! Keys: any printable character extends the filter, `Backspace` (or `Ctrl+H`)
//! shrinks it,
//! `↑`/`↓` (or `Ctrl+P`/`Ctrl+N`) move the selection, `PgUp`/`PgDn` jump by
//! ten rows, `Home`/`End` jump to ends, and `Esc` closes. Pressing `?` again
//! at the call-site (`tui::ui`) also toggles the overlay closed.
@@ -284,6 +285,14 @@ impl ModalView for HelpView {
self.refilter();
ViewAction::None
}
// Terminals where stty erase == ^H send Ctrl+H instead of
// Backspace (DEL). Treat it identically so the filter input
// works across all platforms (#958).
KeyCode::Char('h') if key.modifiers.contains(KeyModifiers::CONTROL) => {
self.query.pop();
self.refilter();
ViewAction::None
}
KeyCode::Char(c)
if !c.is_control()
&& (key.modifiers.is_empty() || key.modifiers == KeyModifiers::SHIFT) =>
@@ -547,6 +556,19 @@ mod tests {
);
}
#[test]
fn ctrl_h_widens_match_set() {
let mut view = HelpView::new();
type_filter(&mut view, "yolox");
let narrow = view.filtered.len();
view.handle_key(KeyEvent::new(KeyCode::Char('h'), KeyModifiers::CONTROL));
let wider = view.filtered.len();
assert!(
wider > narrow,
"Ctrl+H must behave as Backspace, broadening the matching set (was {narrow}, now {wider})"
);
}
#[test]
fn esc_closes_overlay() {
let mut view = HelpView::new();