Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 41 additions & 33 deletions src/script/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -468,46 +468,63 @@ fn parse_key_spec(s: &str) -> Result<KeySpec> {
};
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<NamedKey> {
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")
Expand All @@ -516,19 +533,10 @@ fn parse_key_spec(s: &str) -> Result<KeySpec> {
|| 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<Event> {
Expand Down
Loading