cosmic-terminal/src/key_bind.rs

85 lines
3.7 KiB
Rust
Raw Normal View History

use cosmic::widget::menu::key_bind::{KeyBind, Modifier};
use cosmic::{iced::keyboard::Key, iced_core::keyboard::key::Named};
use std::collections::HashMap;
2024-01-19 10:45:35 -07:00
use crate::Action;
2024-01-19 11:44:59 -07:00
//TODO: load from config
2024-01-19 10:45:35 -07:00
pub fn key_binds() -> HashMap<KeyBind, Action> {
let mut key_binds = HashMap::new();
macro_rules! bind {
([$($modifier:ident),* $(,)?], $key:expr, $action:ident) => {{
2024-01-19 10:45:35 -07:00
key_binds.insert(
KeyBind {
modifiers: vec![$(Modifier::$modifier),*],
key: $key,
2024-01-19 10:45:35 -07:00
},
Action::$action,
);
}};
}
// Standard key bindings
bind!([Ctrl, Shift], Key::Character("A".into()), SelectAll);
bind!([Ctrl, Shift], Key::Character("C".into()), Copy);
bind!([], Key::Named(Named::Copy), Copy);
2024-05-03 14:37:01 -07:00
bind!([Ctrl], Key::Character("c".into()), CopyOrSigint);
bind!([Ctrl, Shift], Key::Character("F".into()), Find);
bind!([Ctrl, Shift], Key::Character("N".into()), WindowNew);
bind!([Ctrl, Shift], Key::Character("Q".into()), WindowClose);
bind!([Ctrl, Shift], Key::Character("T".into()), TabNew);
bind!([Ctrl, Shift], Key::Character("V".into()), Paste);
bind!([], Key::Named(Named::Paste), Paste);
2024-02-21 09:26:09 +01:00
bind!([Shift], Key::Named(Named::Insert), PastePrimary);
bind!([Ctrl, Shift], Key::Character("W".into()), TabClose);
2024-02-22 11:25:39 -07:00
bind!([Ctrl], Key::Character(",".into()), Settings);
2024-01-19 10:45:35 -07:00
// Ctrl+Alt+D splits horizontally, Ctrl+Alt+R splits vertically, Ctrl+Shift+X maximizes split
//TODO: Adjust bindings as desired by UX
bind!([Ctrl, Alt], Key::Character("d".into()), PaneSplitHorizontal);
bind!([Ctrl, Alt], Key::Character("r".into()), PaneSplitVertical);
bind!(
[Ctrl, Shift],
Key::Character("X".into()),
PaneToggleMaximized
);
2024-01-19 10:45:35 -07:00
// Ctrl+Tab and Ctrl+Shift+Tab cycle through tabs
// Ctrl+Tab is not a special key for terminals and is free to use
bind!([Ctrl], Key::Named(Named::Tab), TabNext);
bind!([Ctrl, Shift], Key::Named(Named::Tab), TabPrev);
2024-01-19 10:45:35 -07:00
// Ctrl+Shift+# activates tabs by index
bind!([Ctrl, Shift], Key::Character("1".into()), TabActivate0);
bind!([Ctrl, Shift], Key::Character("2".into()), TabActivate1);
bind!([Ctrl, Shift], Key::Character("3".into()), TabActivate2);
bind!([Ctrl, Shift], Key::Character("4".into()), TabActivate3);
bind!([Ctrl, Shift], Key::Character("5".into()), TabActivate4);
bind!([Ctrl, Shift], Key::Character("6".into()), TabActivate5);
bind!([Ctrl, Shift], Key::Character("7".into()), TabActivate6);
bind!([Ctrl, Shift], Key::Character("8".into()), TabActivate7);
bind!([Ctrl, Shift], Key::Character("9".into()), TabActivate8);
2024-01-19 10:45:35 -07:00
// Ctrl+0, Ctrl+-, and Ctrl+= are not special keys for terminals and are free to use
bind!([Ctrl], Key::Character("0".into()), ZoomReset);
bind!([Ctrl], Key::Character("-".into()), ZoomOut);
bind!([Ctrl], Key::Character("=".into()), ZoomIn);
2024-07-06 12:02:31 +02:00
bind!([Ctrl], Key::Character("+".into()), ZoomIn);
2024-01-19 10:45:35 -07:00
// Ctrl+Arrows and Ctrl+HJKL move between splits
bind!([Ctrl, Shift], Key::Named(Named::ArrowLeft), PaneFocusLeft);
bind!([Ctrl, Shift], Key::Character("H".into()), PaneFocusLeft);
bind!([Ctrl, Shift], Key::Named(Named::ArrowDown), PaneFocusDown);
bind!([Ctrl, Shift], Key::Character("J".into()), PaneFocusDown);
bind!([Ctrl, Shift], Key::Named(Named::ArrowUp), PaneFocusUp);
bind!([Ctrl, Shift], Key::Character("K".into()), PaneFocusUp);
bind!([Ctrl, Shift], Key::Named(Named::ArrowRight), PaneFocusRight);
bind!([Ctrl, Shift], Key::Character("L".into()), PaneFocusRight);
2024-01-19 10:45:35 -07:00
2024-09-15 23:53:13 +02:00
// CTRL+Alt+L clears the scrollback.
bind!([Ctrl, Alt], Key::Character("L".into()), ClearScrollback);
2024-01-19 10:45:35 -07:00
key_binds
}