1
1
mirror of https://github.com/wez/wezterm.git synced 2024-12-24 13:52:55 +03:00
wezterm/src/keyassignment.rs

160 lines
6.0 KiB
Rust

use crate::config::configuration;
use crate::mux::domain::DomainId;
use std::collections::HashMap;
use term::{KeyCode, KeyModifiers};
/// When spawning a tab, specify which domain should be used to
/// host/spawn that tab.
#[derive(Debug, Clone)]
pub enum SpawnTabDomain {
/// Use the default domain
DefaultDomain,
/// Use the domain from the current tab in the associated window
CurrentTabDomain,
/// Use a specific domain by id
Domain(DomainId),
/// Use a specific domain by name
DomainName(String),
}
#[derive(Debug, Clone)]
pub enum KeyAssignment {
SpawnTab(SpawnTabDomain),
SpawnWindow,
ToggleFullScreen,
Copy,
Paste,
ActivateTabRelative(isize),
IncreaseFontSize,
DecreaseFontSize,
ResetFontSize,
ActivateTab(usize),
SendString(String),
Nop,
Hide,
Show,
CloseCurrentTab,
ReloadConfiguration,
MoveTabRelative(isize),
MoveTab(usize),
ScrollByPage(isize),
}
pub struct KeyMap(HashMap<(KeyCode, KeyModifiers), KeyAssignment>);
impl KeyMap {
pub fn new() -> Self {
let mut map = configuration()
.key_bindings()
.expect("keys section of config to be valid");
macro_rules! m {
($([$mod:expr, $code:expr, $action:expr]),* $(,)?) => {
$(
map.entry(($code, $mod)).or_insert($action);
)*
};
};
use KeyAssignment::*;
let ctrl_shift = KeyModifiers::CTRL | KeyModifiers::SHIFT;
// Apply the default bindings; if the user has already mapped
// a given entry then that will take precedence.
m!(
// Clipboard
[KeyModifiers::SHIFT, KeyCode::Insert, Paste],
[KeyModifiers::SUPER, KeyCode::Char('c'), Copy],
[KeyModifiers::SUPER, KeyCode::Char('v'), Paste],
[ctrl_shift, KeyCode::Char('C'), Copy],
[ctrl_shift, KeyCode::Char('V'), Paste],
// Window management
[KeyModifiers::ALT, KeyCode::Char('\n'), ToggleFullScreen],
[KeyModifiers::ALT, KeyCode::Char('\r'), ToggleFullScreen],
[KeyModifiers::ALT, KeyCode::Enter, ToggleFullScreen],
[KeyModifiers::SUPER, KeyCode::Char('m'), Hide],
[KeyModifiers::SUPER, KeyCode::Char('n'), SpawnWindow],
[ctrl_shift, KeyCode::Char('M'), Hide],
[ctrl_shift, KeyCode::Char('N'), SpawnWindow],
// Font size manipulation
[KeyModifiers::CTRL, KeyCode::Char('-'), DecreaseFontSize],
[KeyModifiers::CTRL, KeyCode::Char('0'), ResetFontSize],
[KeyModifiers::CTRL, KeyCode::Char('='), IncreaseFontSize],
[KeyModifiers::SUPER, KeyCode::Char('-'), DecreaseFontSize],
[KeyModifiers::SUPER, KeyCode::Char('0'), ResetFontSize],
[KeyModifiers::SUPER, KeyCode::Char('='), IncreaseFontSize],
// Tab navigation and management
[
KeyModifiers::SUPER,
KeyCode::Char('t'),
SpawnTab(SpawnTabDomain::DefaultDomain)
],
[
ctrl_shift,
KeyCode::Char('T'),
SpawnTab(SpawnTabDomain::DefaultDomain)
],
[
KeyModifiers::SUPER | KeyModifiers::SHIFT,
KeyCode::Char('T'),
SpawnTab(SpawnTabDomain::CurrentTabDomain)
],
[KeyModifiers::SUPER, KeyCode::Char('1'), ActivateTab(0)],
[KeyModifiers::SUPER, KeyCode::Char('2'), ActivateTab(1)],
[KeyModifiers::SUPER, KeyCode::Char('3'), ActivateTab(2)],
[KeyModifiers::SUPER, KeyCode::Char('4'), ActivateTab(3)],
[KeyModifiers::SUPER, KeyCode::Char('5'), ActivateTab(4)],
[KeyModifiers::SUPER, KeyCode::Char('6'), ActivateTab(5)],
[KeyModifiers::SUPER, KeyCode::Char('7'), ActivateTab(6)],
[KeyModifiers::SUPER, KeyCode::Char('8'), ActivateTab(7)],
[KeyModifiers::SUPER, KeyCode::Char('9'), ActivateTab(8)],
[KeyModifiers::SUPER, KeyCode::Char('w'), CloseCurrentTab],
[ctrl_shift, KeyCode::Char('1'), ActivateTab(0)],
[ctrl_shift, KeyCode::Char('2'), ActivateTab(1)],
[ctrl_shift, KeyCode::Char('3'), ActivateTab(2)],
[ctrl_shift, KeyCode::Char('4'), ActivateTab(3)],
[ctrl_shift, KeyCode::Char('5'), ActivateTab(4)],
[ctrl_shift, KeyCode::Char('6'), ActivateTab(5)],
[ctrl_shift, KeyCode::Char('7'), ActivateTab(6)],
[ctrl_shift, KeyCode::Char('8'), ActivateTab(7)],
[ctrl_shift, KeyCode::Char('9'), ActivateTab(8)],
[ctrl_shift, KeyCode::Char('W'), CloseCurrentTab],
[
KeyModifiers::SUPER | KeyModifiers::SHIFT,
KeyCode::Char('['),
ActivateTabRelative(-1)
],
[
KeyModifiers::SUPER | KeyModifiers::SHIFT,
KeyCode::Char('{'),
ActivateTabRelative(-1)
],
[
KeyModifiers::SUPER | KeyModifiers::SHIFT,
KeyCode::Char(']'),
ActivateTabRelative(1)
],
[
KeyModifiers::SUPER | KeyModifiers::SHIFT,
KeyCode::Char('}'),
ActivateTabRelative(1)
],
[KeyModifiers::SUPER, KeyCode::Char('r'), ReloadConfiguration],
[ctrl_shift, KeyCode::Char('R'), ReloadConfiguration],
[ctrl_shift, KeyCode::PageUp, MoveTabRelative(-1)],
[ctrl_shift, KeyCode::PageDown, MoveTabRelative(1)],
[KeyModifiers::SHIFT, KeyCode::PageUp, ScrollByPage(-1)],
[KeyModifiers::SHIFT, KeyCode::PageDown, ScrollByPage(1)],
);
Self(map)
}
pub fn lookup(&self, key: KeyCode, mods: KeyModifiers) -> Option<KeyAssignment> {
self.0
.get(&(key.normalize_shift_to_upper_case(mods), mods))
.cloned()
}
}