diff --git a/src/script/parser.rs b/src/script/parser.rs index 4a5337e..158563e 100644 --- a/src/script/parser.rs +++ b/src/script/parser.rs @@ -468,46 +468,63 @@ fn parse_key_spec(s: &str) -> Result { }; return Ok(KeySpec { key, mods }); } - let key = if last.eq_ignore_ascii_case("enter") || last.eq_ignore_ascii_case("return") { - NamedKey::Enter + let key = if let Some(named_key) = parse_named_key(last) { + named_key + } else { + // Single character (e.g. `C` in `Ctrl+C`). We keep the character + // verbatim – translation to the right libghostty `Key` happens in + // the `keys` module. + let mut chars = last.chars(); + let c = chars.next().ok_or_else(|| anyhow!("empty key in `{s}`"))?; + if chars.next().is_some() { + bail!("unknown key name `{last}`"); + } + NamedKey::Char(c) + }; + Ok(KeySpec { key, mods }) +} + +fn parse_named_key(last: &str) -> Option { + if last.eq_ignore_ascii_case("enter") || last.eq_ignore_ascii_case("return") { + Some(NamedKey::Enter) } else if last.eq_ignore_ascii_case("escape") || last.eq_ignore_ascii_case("esc") { - NamedKey::Escape + Some(NamedKey::Escape) } else if last.eq_ignore_ascii_case("tab") { - NamedKey::Tab + Some(NamedKey::Tab) } else if last.eq_ignore_ascii_case("backspace") { - NamedKey::Backspace + Some(NamedKey::Backspace) } else if last.eq_ignore_ascii_case("delete") { - NamedKey::Delete + Some(NamedKey::Delete) } else if last.eq_ignore_ascii_case("insert") { - NamedKey::Insert + Some(NamedKey::Insert) } else if last.eq_ignore_ascii_case("space") { - NamedKey::Space + Some(NamedKey::Space) } else if last.eq_ignore_ascii_case("up") { - NamedKey::Up + Some(NamedKey::Up) } else if last.eq_ignore_ascii_case("down") { - NamedKey::Down + Some(NamedKey::Down) } else if last.eq_ignore_ascii_case("left") { - NamedKey::Left + Some(NamedKey::Left) } else if last.eq_ignore_ascii_case("right") { - NamedKey::Right + Some(NamedKey::Right) } else if last.eq_ignore_ascii_case("pageup") { - NamedKey::PageUp + Some(NamedKey::PageUp) } else if last.eq_ignore_ascii_case("pagedown") { - NamedKey::PageDown + Some(NamedKey::PageDown) } else if last.eq_ignore_ascii_case("home") { - NamedKey::Home + Some(NamedKey::Home) } else if last.eq_ignore_ascii_case("end") { - NamedKey::End + Some(NamedKey::End) } else if last.eq_ignore_ascii_case("scrollup") { - NamedKey::ScrollUp + Some(NamedKey::ScrollUp) } else if last.eq_ignore_ascii_case("scrolldown") { - NamedKey::ScrollDown + Some(NamedKey::ScrollDown) } else if last.eq_ignore_ascii_case("ctrl") || last.eq_ignore_ascii_case("control") { - NamedKey::Control + Some(NamedKey::Control) } else if last.eq_ignore_ascii_case("alt") || last.eq_ignore_ascii_case("option") { - NamedKey::Alt + Some(NamedKey::Alt) } else if last.eq_ignore_ascii_case("shift") { - NamedKey::Shift + Some(NamedKey::Shift) } else if last.eq_ignore_ascii_case("super") || last.eq_ignore_ascii_case("command") || last.eq_ignore_ascii_case("gui") @@ -516,19 +533,10 @@ fn parse_key_spec(s: &str) -> Result { || last.eq_ignore_ascii_case("meta") || last.eq_ignore_ascii_case("hyper") { - NamedKey::Super + Some(NamedKey::Super) } else { - // Single character (e.g. `C` in `Ctrl+C`). We keep the character - // verbatim – translation to the right libghostty `Key` happens in - // the `keys` module. - let mut chars = last.chars(); - let c = chars.next().ok_or_else(|| anyhow!("empty key in `{s}`"))?; - if chars.next().is_some() { - bail!("unknown key name `{last}`"); - } - NamedKey::Char(c) - }; - Ok(KeySpec { key, mods }) + None + } } fn parse_explicit_key_action(tokens: &[String], action: KeyAction) -> Result {