diff --git a/CHANGELOG.md b/CHANGELOG.md index ee6fb8e..f47a013 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Completions for `--class` and `-t` (short title) - Change the mouse cursor when hovering over the message bar and its close button - Support combined bold and italic text (with `font.bold_italic` to customize it) +- Extra bindings for F13-F20 +- Terminal escape bindings with combined modifiers +- Bindings for ScrollToTop and ScrollToBottom actions ### Changed @@ -44,6 +47,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Use text mouse cursor when mouse mode is temporarily disabled with shift - Wayland primary selection clipboard not storing text when selection is stopped outside of the window - Block URL highlight while a selection is active +- Bindings for Alt + F1-F12 + +### Removed + +- Bindings for Super/Command + F1-F12 ## 0.3.3 diff --git a/alacritty.yml b/alacritty.yml index 35c0553..546a15f 100644 --- a/alacritty.yml +++ b/alacritty.yml @@ -452,7 +452,7 @@ mouse_bindings: # - `key`: Identifier of the key pressed # # - A-Z -# - F1-F12 +# - F1-F24 # - Key0-Key9 # # A full list with available key codes can be found here: @@ -563,109 +563,11 @@ key_bindings: #- { key: W, mods: Command, action: Quit } #- { key: F, mods: Command|Control, action: ToggleFullscreen } - - { key: Paste, action: Paste } - - { key: Copy, action: Copy } - - { key: L, mods: Control, action: ClearLogNotice } - - { key: L, mods: Control, chars: "\x0c" } - - { key: Home, mods: Alt, chars: "\x1b[1;3H" } - - { key: Home, chars: "\x1bOH", mode: AppCursor } - - { key: Home, chars: "\x1b[H", mode: ~AppCursor } - - { key: End, mods: Alt, chars: "\x1b[1;3F" } - - { key: End, chars: "\x1bOF", mode: AppCursor } - - { key: End, chars: "\x1b[F", mode: ~AppCursor } - - { key: PageUp, mods: Shift, action: ScrollPageUp, mode: ~Alt } - - { key: PageUp, mods: Shift, chars: "\x1b[5;2~", mode: Alt } - - { key: PageUp, mods: Control, chars: "\x1b[5;5~" } - - { key: PageUp, mods: Alt, chars: "\x1b[5;3~" } - - { key: PageUp, chars: "\x1b[5~" } - - { key: PageDown, mods: Shift, action: ScrollPageDown, mode: ~Alt } - - { key: PageDown, mods: Shift, chars: "\x1b[6;2~", mode: Alt } - - { key: PageDown, mods: Control, chars: "\x1b[6;5~" } - - { key: PageDown, mods: Alt, chars: "\x1b[6;3~" } - - { key: PageDown, chars: "\x1b[6~" } - - { key: Tab, mods: Shift, chars: "\x1b[Z" } - - { key: Back, chars: "\x7f" } - - { key: Back, mods: Alt, chars: "\x1b\x7f" } - - { key: Insert, chars: "\x1b[2~" } - - { key: Delete, chars: "\x1b[3~" } - - { key: Left, mods: Shift, chars: "\x1b[1;2D" } - - { key: Left, mods: Control, chars: "\x1b[1;5D" } - - { key: Left, mods: Alt, chars: "\x1b[1;3D" } - - { key: Left, chars: "\x1b[D", mode: ~AppCursor } - - { key: Left, chars: "\x1bOD", mode: AppCursor } - - { key: Right, mods: Shift, chars: "\x1b[1;2C" } - - { key: Right, mods: Control, chars: "\x1b[1;5C" } - - { key: Right, mods: Alt, chars: "\x1b[1;3C" } - - { key: Right, chars: "\x1b[C", mode: ~AppCursor } - - { key: Right, chars: "\x1bOC", mode: AppCursor } - - { key: Up, mods: Shift, chars: "\x1b[1;2A" } - - { key: Up, mods: Control, chars: "\x1b[1;5A" } - - { key: Up, mods: Alt, chars: "\x1b[1;3A" } - - { key: Up, chars: "\x1b[A", mode: ~AppCursor } - - { key: Up, chars: "\x1bOA", mode: AppCursor } - - { key: Down, mods: Shift, chars: "\x1b[1;2B" } - - { key: Down, mods: Control, chars: "\x1b[1;5B" } - - { key: Down, mods: Alt, chars: "\x1b[1;3B" } - - { key: Down, chars: "\x1b[B", mode: ~AppCursor } - - { key: Down, chars: "\x1bOB", mode: AppCursor } - - { key: F1, chars: "\x1bOP" } - - { key: F2, chars: "\x1bOQ" } - - { key: F3, chars: "\x1bOR" } - - { key: F4, chars: "\x1bOS" } - - { key: F5, chars: "\x1b[15~" } - - { key: F6, chars: "\x1b[17~" } - - { key: F7, chars: "\x1b[18~" } - - { key: F8, chars: "\x1b[19~" } - - { key: F9, chars: "\x1b[20~" } - - { key: F10, chars: "\x1b[21~" } - - { key: F11, chars: "\x1b[23~" } - - { key: F12, chars: "\x1b[24~" } - - { key: F1, mods: Shift, chars: "\x1b[1;2P" } - - { key: F2, mods: Shift, chars: "\x1b[1;2Q" } - - { key: F3, mods: Shift, chars: "\x1b[1;2R" } - - { key: F4, mods: Shift, chars: "\x1b[1;2S" } - - { key: F5, mods: Shift, chars: "\x1b[15;2~" } - - { key: F6, mods: Shift, chars: "\x1b[17;2~" } - - { key: F7, mods: Shift, chars: "\x1b[18;2~" } - - { key: F8, mods: Shift, chars: "\x1b[19;2~" } - - { key: F9, mods: Shift, chars: "\x1b[20;2~" } - - { key: F10, mods: Shift, chars: "\x1b[21;2~" } - - { key: F11, mods: Shift, chars: "\x1b[23;2~" } - - { key: F12, mods: Shift, chars: "\x1b[24;2~" } - - { key: F1, mods: Control, chars: "\x1b[1;5P" } - - { key: F2, mods: Control, chars: "\x1b[1;5Q" } - - { key: F3, mods: Control, chars: "\x1b[1;5R" } - - { key: F4, mods: Control, chars: "\x1b[1;5S" } - - { key: F5, mods: Control, chars: "\x1b[15;5~" } - - { key: F6, mods: Control, chars: "\x1b[17;5~" } - - { key: F7, mods: Control, chars: "\x1b[18;5~" } - - { key: F8, mods: Control, chars: "\x1b[19;5~" } - - { key: F9, mods: Control, chars: "\x1b[20;5~" } - - { key: F10, mods: Control, chars: "\x1b[21;5~" } - - { key: F11, mods: Control, chars: "\x1b[23;5~" } - - { key: F12, mods: Control, chars: "\x1b[24;5~" } - - { key: F1, mods: Alt, chars: "\x1b[1;6P" } - - { key: F2, mods: Alt, chars: "\x1b[1;6Q" } - - { key: F3, mods: Alt, chars: "\x1b[1;6R" } - - { key: F4, mods: Alt, chars: "\x1b[1;6S" } - - { key: F5, mods: Alt, chars: "\x1b[15;6~" } - - { key: F6, mods: Alt, chars: "\x1b[17;6~" } - - { key: F7, mods: Alt, chars: "\x1b[18;6~" } - - { key: F8, mods: Alt, chars: "\x1b[19;6~" } - - { key: F9, mods: Alt, chars: "\x1b[20;6~" } - - { key: F10, mods: Alt, chars: "\x1b[21;6~" } - - { key: F11, mods: Alt, chars: "\x1b[23;6~" } - - { key: F12, mods: Alt, chars: "\x1b[24;6~" } - - { key: F1, mods: Super, chars: "\x1b[1;3P" } - - { key: F2, mods: Super, chars: "\x1b[1;3Q" } - - { key: F3, mods: Super, chars: "\x1b[1;3R" } - - { key: F4, mods: Super, chars: "\x1b[1;3S" } - - { key: F5, mods: Super, chars: "\x1b[15;3~" } - - { key: F6, mods: Super, chars: "\x1b[17;3~" } - - { key: F7, mods: Super, chars: "\x1b[18;3~" } - - { key: F8, mods: Super, chars: "\x1b[19;3~" } - - { key: F9, mods: Super, chars: "\x1b[20;3~" } - - { key: F10, mods: Super, chars: "\x1b[21;3~" } - - { key: F11, mods: Super, chars: "\x1b[23;3~" } - - { key: F12, mods: Super, chars: "\x1b[24;3~" } - - { key: NumpadEnter, chars: "\n" } + - { key: Paste, action: Paste } + - { key: Copy, action: Copy } + - { key: L, mods: Control, action: ClearLogNotice } + - { key: L, mods: Control, chars: "\x0c" } + - { key: PageUp, mods: Shift, action: ScrollPageUp, mode: ~Alt } + - { key: PageDown, mods: Shift, action: ScrollPageDown, mode: ~Alt } + - { key: Home, mods: Shift, action: ScrollToTop, mode: ~Alt } + - { key: End, mods: Shift, action: ScrollToBottom, mode: ~Alt } diff --git a/alacritty_terminal/src/config/bindings.rs b/alacritty_terminal/src/config/bindings.rs index df68a39..00090bb 100644 --- a/alacritty_terminal/src/config/bindings.rs +++ b/alacritty_terminal/src/config/bindings.rs @@ -71,113 +71,152 @@ pub fn default_key_bindings() -> Vec { let mut bindings = bindings!( KeyBinding; Key::Paste; Action::Paste; - Key::Copy; Action::Copy; + Key::Copy; Action::Copy; Key::L, [ctrl: true]; Action::ClearLogNotice; Key::L, [ctrl: true]; Action::Esc("\x0c".into()); - Key::Home, [alt: true]; Action::Esc("\x1b[1;3H".into()); + Key::PageUp, [shift: true], ~TermMode::ALT_SCREEN; Action::ScrollPageUp; + Key::PageDown, [shift: true], ~TermMode::ALT_SCREEN; Action::ScrollPageDown; + Key::Home, [shift: true], ~TermMode::ALT_SCREEN; Action::ScrollToTop; + Key::End, [shift: true], ~TermMode::ALT_SCREEN; Action::ScrollToBottom; Key::Home, +TermMode::APP_CURSOR; Action::Esc("\x1bOH".into()); Key::Home, ~TermMode::APP_CURSOR; Action::Esc("\x1b[H".into()); - Key::End, [alt: true]; Action::Esc("\x1b[1;3F".into()); - Key::End, +TermMode::APP_CURSOR; Action::Esc("\x1bOF".into()); - Key::End, ~TermMode::APP_CURSOR; Action::Esc("\x1b[F".into()); - Key::PageUp, [shift: true], ~TermMode::ALT_SCREEN; Action::ScrollPageUp; - Key::PageUp, [shift: true], +TermMode::ALT_SCREEN; Action::Esc("\x1b[5;2~".into()); - Key::PageUp, [ctrl: true]; Action::Esc("\x1b[5;5~".into()); - Key::PageUp, [alt: true]; Action::Esc("\x1b[5;3~".into()); - Key::PageUp; Action::Esc("\x1b[5~".into()); - Key::PageDown, [shift: true], ~TermMode::ALT_SCREEN; Action::ScrollPageDown; - Key::PageDown, [shift: true], +TermMode::ALT_SCREEN; Action::Esc("\x1b[6;2~".into()); - Key::PageDown, [ctrl: true]; Action::Esc("\x1b[6;5~".into()); - Key::PageDown, [alt: true]; Action::Esc("\x1b[6;3~".into()); + Key::Home, [shift: true], +TermMode::ALT_SCREEN; Action::Esc("\x1b[1;2H".into()); + Key::End, +TermMode::APP_CURSOR; Action::Esc("\x1bOF".into()); + Key::End, ~TermMode::APP_CURSOR; Action::Esc("\x1b[F".into()); + Key::End, [shift: true], +TermMode::ALT_SCREEN; Action::Esc("\x1b[1;2F".into()); + Key::PageUp; Action::Esc("\x1b[5~".into()); + Key::PageUp, [shift: true], +TermMode::ALT_SCREEN; Action::Esc("\x1b[5;2~".into()); Key::PageDown; Action::Esc("\x1b[6~".into()); - Key::Tab, [shift: true]; Action::Esc("\x1b[Z".into()); + Key::PageDown, [shift: true], +TermMode::ALT_SCREEN; Action::Esc("\x1b[6;2~".into()); + Key::Tab, [shift: true]; Action::Esc("\x1b[Z".into()); Key::Back; Action::Esc("\x7f".into()); Key::Back, [alt: true]; Action::Esc("\x1b\x7f".into()); Key::Insert; Action::Esc("\x1b[2~".into()); Key::Delete; Action::Esc("\x1b[3~".into()); - Key::Left, [shift: true]; Action::Esc("\x1b[1;2D".into()); - Key::Left, [ctrl: true]; Action::Esc("\x1b[1;5D".into()); - Key::Left, [alt: true]; Action::Esc("\x1b[1;3D".into()); - Key::Left, ~TermMode::APP_CURSOR; Action::Esc("\x1b[D".into()); - Key::Left, +TermMode::APP_CURSOR; Action::Esc("\x1bOD".into()); - Key::Right, [shift: true]; Action::Esc("\x1b[1;2C".into()); - Key::Right, [ctrl: true]; Action::Esc("\x1b[1;5C".into()); - Key::Right, [alt: true]; Action::Esc("\x1b[1;3C".into()); - Key::Right, ~TermMode::APP_CURSOR; Action::Esc("\x1b[C".into()); + Key::Up, +TermMode::APP_CURSOR; Action::Esc("\x1bOA".into()); + Key::Up, ~TermMode::APP_CURSOR; Action::Esc("\x1b[A".into()); + Key::Down, +TermMode::APP_CURSOR; Action::Esc("\x1bOB".into()); + Key::Down, ~TermMode::APP_CURSOR; Action::Esc("\x1b[B".into()); Key::Right, +TermMode::APP_CURSOR; Action::Esc("\x1bOC".into()); - Key::Up, [shift: true]; Action::Esc("\x1b[1;2A".into()); - Key::Up, [ctrl: true]; Action::Esc("\x1b[1;5A".into()); - Key::Up, [alt: true]; Action::Esc("\x1b[1;3A".into()); - Key::Up, ~TermMode::APP_CURSOR; Action::Esc("\x1b[A".into()); - Key::Up, +TermMode::APP_CURSOR; Action::Esc("\x1bOA".into()); - Key::Down, [shift: true]; Action::Esc("\x1b[1;2B".into()); - Key::Down, [ctrl: true]; Action::Esc("\x1b[1;5B".into()); - Key::Down, [alt: true]; Action::Esc("\x1b[1;3B".into()); - Key::Down, ~TermMode::APP_CURSOR; Action::Esc("\x1b[B".into()); - Key::Down, +TermMode::APP_CURSOR; Action::Esc("\x1bOB".into()); - Key::F1; Action::Esc("\x1bOP".into()); - Key::F2; Action::Esc("\x1bOQ".into()); - Key::F3; Action::Esc("\x1bOR".into()); - Key::F4; Action::Esc("\x1bOS".into()); - Key::F5; Action::Esc("\x1b[15~".into()); - Key::F6; Action::Esc("\x1b[17~".into()); - Key::F7; Action::Esc("\x1b[18~".into()); - Key::F8; Action::Esc("\x1b[19~".into()); - Key::F9; Action::Esc("\x1b[20~".into()); + Key::Right, ~TermMode::APP_CURSOR; Action::Esc("\x1b[C".into()); + Key::Left, +TermMode::APP_CURSOR; Action::Esc("\x1bOD".into()); + Key::Left, ~TermMode::APP_CURSOR; Action::Esc("\x1b[D".into()); + Key::F1; Action::Esc("\x1bOP".into()); + Key::F2; Action::Esc("\x1bOQ".into()); + Key::F3; Action::Esc("\x1bOR".into()); + Key::F4; Action::Esc("\x1bOS".into()); + Key::F5; Action::Esc("\x1b[15~".into()); + Key::F6; Action::Esc("\x1b[17~".into()); + Key::F7; Action::Esc("\x1b[18~".into()); + Key::F8; Action::Esc("\x1b[19~".into()); + Key::F9; Action::Esc("\x1b[20~".into()); Key::F10; Action::Esc("\x1b[21~".into()); Key::F11; Action::Esc("\x1b[23~".into()); Key::F12; Action::Esc("\x1b[24~".into()); - Key::F1, [shift: true]; Action::Esc("\x1b[1;2P".into()); - Key::F2, [shift: true]; Action::Esc("\x1b[1;2Q".into()); - Key::F3, [shift: true]; Action::Esc("\x1b[1;2R".into()); - Key::F4, [shift: true]; Action::Esc("\x1b[1;2S".into()); - Key::F5, [shift: true]; Action::Esc("\x1b[15;2~".into()); - Key::F6, [shift: true]; Action::Esc("\x1b[17;2~".into()); - Key::F7, [shift: true]; Action::Esc("\x1b[18;2~".into()); - Key::F8, [shift: true]; Action::Esc("\x1b[19;2~".into()); - Key::F9, [shift: true]; Action::Esc("\x1b[20;2~".into()); - Key::F10, [shift: true]; Action::Esc("\x1b[21;2~".into()); - Key::F11, [shift: true]; Action::Esc("\x1b[23;2~".into()); - Key::F12, [shift: true]; Action::Esc("\x1b[24;2~".into()); - Key::F1, [ctrl: true]; Action::Esc("\x1b[1;5P".into()); - Key::F2, [ctrl: true]; Action::Esc("\x1b[1;5Q".into()); - Key::F3, [ctrl: true]; Action::Esc("\x1b[1;5R".into()); - Key::F4, [ctrl: true]; Action::Esc("\x1b[1;5S".into()); - Key::F5, [ctrl: true]; Action::Esc("\x1b[15;5~".into()); - Key::F6, [ctrl: true]; Action::Esc("\x1b[17;5~".into()); - Key::F7, [ctrl: true]; Action::Esc("\x1b[18;5~".into()); - Key::F8, [ctrl: true]; Action::Esc("\x1b[19;5~".into()); - Key::F9, [ctrl: true]; Action::Esc("\x1b[20;5~".into()); - Key::F10, [ctrl: true]; Action::Esc("\x1b[21;5~".into()); - Key::F11, [ctrl: true]; Action::Esc("\x1b[23;5~".into()); - Key::F12, [ctrl: true]; Action::Esc("\x1b[24;5~".into()); - Key::F1, [alt: true]; Action::Esc("\x1b[1;6P".into()); - Key::F2, [alt: true]; Action::Esc("\x1b[1;6Q".into()); - Key::F3, [alt: true]; Action::Esc("\x1b[1;6R".into()); - Key::F4, [alt: true]; Action::Esc("\x1b[1;6S".into()); - Key::F5, [alt: true]; Action::Esc("\x1b[15;6~".into()); - Key::F6, [alt: true]; Action::Esc("\x1b[17;6~".into()); - Key::F7, [alt: true]; Action::Esc("\x1b[18;6~".into()); - Key::F8, [alt: true]; Action::Esc("\x1b[19;6~".into()); - Key::F9, [alt: true]; Action::Esc("\x1b[20;6~".into()); - Key::F10, [alt: true]; Action::Esc("\x1b[21;6~".into()); - Key::F11, [alt: true]; Action::Esc("\x1b[23;6~".into()); - Key::F12, [alt: true]; Action::Esc("\x1b[24;6~".into()); - Key::F1, [logo: true]; Action::Esc("\x1b[1;3P".into()); - Key::F2, [logo: true]; Action::Esc("\x1b[1;3Q".into()); - Key::F3, [logo: true]; Action::Esc("\x1b[1;3R".into()); - Key::F4, [logo: true]; Action::Esc("\x1b[1;3S".into()); - Key::F5, [logo: true]; Action::Esc("\x1b[15;3~".into()); - Key::F6, [logo: true]; Action::Esc("\x1b[17;3~".into()); - Key::F7, [logo: true]; Action::Esc("\x1b[18;3~".into()); - Key::F8, [logo: true]; Action::Esc("\x1b[19;3~".into()); - Key::F9, [logo: true]; Action::Esc("\x1b[20;3~".into()); - Key::F10, [logo: true]; Action::Esc("\x1b[21;3~".into()); - Key::F11, [logo: true]; Action::Esc("\x1b[23;3~".into()); - Key::F12, [logo: true]; Action::Esc("\x1b[24;3~".into()); + Key::F13; Action::Esc("\x1b[25~".into()); + Key::F14; Action::Esc("\x1b[26~".into()); + Key::F15; Action::Esc("\x1b[28~".into()); + Key::F16; Action::Esc("\x1b[29~".into()); + Key::F17; Action::Esc("\x1b[31~".into()); + Key::F18; Action::Esc("\x1b[32~".into()); + Key::F19; Action::Esc("\x1b[33~".into()); + Key::F20; Action::Esc("\x1b[34~".into()); Key::NumpadEnter; Action::Esc("\n".into()); ); + // Code Modifiers + // ---------+--------------------------- + // 2 | Shift + // 3 | Alt + // 4 | Shift + Alt + // 5 | Control + // 6 | Shift + Control + // 7 | Alt + Control + // 8 | Shift + Alt + Control + // ---------+--------------------------- + // + // from: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-PC-Style-Function-Keys + let modifiers = vec![ + ModifiersState { shift: true, ..ModifiersState::default() }, + ModifiersState { alt: true, ..ModifiersState::default() }, + ModifiersState { shift: true, alt: true, ..ModifiersState::default() }, + ModifiersState { ctrl: true, ..ModifiersState::default() }, + ModifiersState { shift: true, ctrl: true, ..ModifiersState::default() }, + ModifiersState { alt: true, ctrl: true, ..ModifiersState::default() }, + ModifiersState { shift: true, alt: true, ctrl: true, ..ModifiersState::default() }, + ]; + + for (index, mods) in modifiers.iter().enumerate() { + let modifiers_code = index + 2; + bindings.extend(bindings!( + KeyBinding; + Key::Up, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}A", modifiers_code)); + Key::Down, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}B", modifiers_code)); + Key::Right, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}C", modifiers_code)); + Key::Left, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}D", modifiers_code)); + Key::F1, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}P", modifiers_code)); + Key::F2, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}Q", modifiers_code)); + Key::F3, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}R", modifiers_code)); + Key::F4, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}S", modifiers_code)); + Key::F5, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[15;{}~", modifiers_code)); + Key::F6, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[17;{}~", modifiers_code)); + Key::F7, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[18;{}~", modifiers_code)); + Key::F8, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[19;{}~", modifiers_code)); + Key::F9, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[20;{}~", modifiers_code)); + Key::F10, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[21;{}~", modifiers_code)); + Key::F11, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[23;{}~", modifiers_code)); + Key::F12, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[24;{}~", modifiers_code)); + Key::F13, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[25;{}~", modifiers_code)); + Key::F14, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[26;{}~", modifiers_code)); + Key::F15, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[28;{}~", modifiers_code)); + Key::F16, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[29;{}~", modifiers_code)); + Key::F17, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[31;{}~", modifiers_code)); + Key::F18, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[32;{}~", modifiers_code)); + Key::F19, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[33;{}~", modifiers_code)); + Key::F20, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[34;{}~", modifiers_code)); + )); + + // We're adding the following bindings with `Shift` manually above, so skipping them here + // modifiers_code != Shift + if modifiers_code != 2 { + bindings.extend(bindings!( + KeyBinding; + Key::PageUp, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[5;{}~", modifiers_code)); + Key::PageDown, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[6;{}~", modifiers_code)); + Key::End, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}F", modifiers_code)); + Key::Home, [shift: mods.shift, alt: mods.alt, ctrl: mods.ctrl]; + Action::Esc(format!("\x1b[1;{}H", modifiers_code)); + )); + } + } + bindings.extend(platform_key_bindings()); bindings