diff --git a/src/config.rs b/src/config.rs index 4f74ba7..53b0927 100644 --- a/src/config.rs +++ b/src/config.rs @@ -30,6 +30,7 @@ pub enum Action { Redo, Save, SelectAll, + TabJump(usize), ToggleGitManagement, ToggleProjectSearch, ToggleSettingsPage, @@ -57,6 +58,7 @@ impl Action { Self::Redo => Message::Redo, Self::Save => Message::Save, Self::SelectAll => Message::SelectAll, + Self::TabJump(n) => Message::TabActivateJump(*n), Self::TabNext => Message::TabNext, Self::TabPrev => Message::TabPrev, Self::ToggleGitManagement => Message::ToggleContextPage(ContextPage::GitManagement), @@ -114,6 +116,17 @@ impl KeyBind { Action::$action, ); }}; + + // Match enums with a payload + ([$($modifier:ident),+ $(,)?], $key_code:ident, $action:ident($($arg:expr)*)) => {{ + keybinds.insert( + KeyBind { + modifiers: vec![$(Modifier::$modifier),+], + key_code: KeyCode::$key_code, + }, + Action::$action($($arg)*), + ); + }}; } bind!([Ctrl], W, CloseFile); @@ -130,13 +143,22 @@ impl KeyBind { bind!([Ctrl, Shift], Z, Redo); bind!([Ctrl], S, Save); bind!([Ctrl], A, SelectAll); + bind!([Ctrl], Key1, TabJump(0)); + bind!([Ctrl], Key2, TabJump(1)); + bind!([Ctrl], Key3, TabJump(2)); + bind!([Ctrl], Key4, TabJump(3)); + bind!([Ctrl], Key5, TabJump(4)); + bind!([Ctrl], Key6, TabJump(5)); + bind!([Ctrl], Key7, TabJump(6)); + bind!([Ctrl], Key8, TabJump(7)); + bind!([Ctrl], Key9, TabJump(8)); + bind!([Ctrl], PageUp, TabNext); + bind!([Ctrl], PageDown, TabPrev); bind!([Ctrl, Shift], G, ToggleGitManagement); bind!([Ctrl, Shift], F, ToggleProjectSearch); bind!([Ctrl], Comma, ToggleSettingsPage); bind!([Alt], Z, ToggleWordWrap); bind!([Ctrl], Z, Undo); - bind!([Ctrl], PageUp, TabNext); - bind!([Ctrl], PageDown, TabPrev); keybinds } diff --git a/src/main.rs b/src/main.rs index f03327b..dd4a604 100644 --- a/src/main.rs +++ b/src/main.rs @@ -212,6 +212,7 @@ pub enum Message { SystemThemeModeChange(cosmic_theme::ThemeMode), SyntaxTheme(usize, bool), TabActivate(segmented_button::Entity), + TabActivateJump(usize), TabChanged(segmented_button::Entity), TabClose(segmented_button::Entity), TabContextAction(segmented_button::Entity, Action), @@ -1599,6 +1600,21 @@ impl Application for App { self.tab_model.activate(entity); return self.update_tab(); } + Message::TabActivateJump(pos) => { + // Length is always at least one, so there shouldn't be a division by zero + let len = self.tab_model.iter().count(); + // + let pos = if pos >= 8 || pos > len - 1 { + len - 1 + } else { + pos % len + }; + + let entity = self.tab_model.iter().nth(pos); + if let Some(entity) = entity { + return self.update(Message::TabActivate(entity)); + } + } Message::TabChanged(entity) => { if let Some(Tab::Editor(tab)) = self.tab_model.data::(entity) { let mut title = tab.title();