diff --git a/spikes/gpui-shell/src/main.rs b/spikes/gpui-shell/src/main.rs index 9dfa0c5..b522cd1 100644 --- a/spikes/gpui-shell/src/main.rs +++ b/spikes/gpui-shell/src/main.rs @@ -1484,7 +1484,11 @@ fn terminal_key_from_parts( "delete" => TerminalKey::Delete, "pageup" => TerminalKey::PageUp, "pagedown" => TerminalKey::PageDown, - function if function.starts_with('f') => { + function + if function.strip_prefix('f').is_some_and(|suffix| { + !suffix.is_empty() && suffix.bytes().all(|byte| byte.is_ascii_digit()) + }) => + { let number = function.strip_prefix('f')?.parse::().ok()?; TerminalKey::Function(number) } @@ -1557,6 +1561,12 @@ mod tests { let enter = terminal_key_from_parts("enter", None, KeyModifiers::default()).unwrap(); assert_eq!(enter.key, TerminalKey::Enter); + let literal_f = terminal_key_from_parts("f", Some("f"), KeyModifiers::default()).unwrap(); + assert_eq!(literal_f.key, TerminalKey::Text("f".into())); + + let function = terminal_key_from_parts("f12", None, KeyModifiers::default()).unwrap(); + assert_eq!(function.key, TerminalKey::Function(12)); + let composed = terminal_key_from_parts("é", Some("é"), KeyModifiers::default()).unwrap(); assert_eq!(composed.key, TerminalKey::Text("é".into())); }