From 520f4272d0f332f2a98a2a7486be1797feb86dcf Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Tue, 12 May 2026 00:24:13 +0300 Subject: feat: add agent cycling and tab wheel switching fixes #92 --- src/config/keybinds.rs | 65 ++++++++++++++++++++++++++++++++++++-------------- src/config/model.rs | 6 +++++ 2 files changed, 53 insertions(+), 18 deletions(-) (limited to 'src/config') diff --git a/src/config/keybinds.rs b/src/config/keybinds.rs index 90dc2283..a18dcbc3 100644 --- a/src/config/keybinds.rs +++ b/src/config/keybinds.rs @@ -73,6 +73,10 @@ pub struct Keybinds { pub previous_workspace_label: Option, pub next_workspace: Option<(KeyCode, KeyModifiers)>, pub next_workspace_label: Option, + pub previous_agent: Option<(KeyCode, KeyModifiers)>, + pub previous_agent_label: Option, + pub next_agent: Option<(KeyCode, KeyModifiers)>, + pub next_agent_label: Option, pub new_tab: (KeyCode, KeyModifiers), pub new_tab_label: String, pub rename_tab: Option<(KeyCode, KeyModifiers)>, @@ -365,6 +369,18 @@ impl Config { &self.keys.next_workspace, &mut diagnostics, ), + optional_binding( + BindingScope::Navigate, + "keys.previous_agent", + &self.keys.previous_agent, + &mut diagnostics, + ), + optional_binding( + BindingScope::Navigate, + "keys.next_agent", + &self.keys.next_agent, + &mut diagnostics, + ), optional_binding( BindingScope::Navigate, "keys.rename_tab", @@ -610,26 +626,30 @@ impl Config { previous_workspace_label: optional_bindings[3].label.clone(), next_workspace: optional_bindings[4].value, next_workspace_label: optional_bindings[4].label.clone(), + previous_agent: optional_bindings[5].value, + previous_agent_label: optional_bindings[5].label.clone(), + next_agent: optional_bindings[6].value, + next_agent_label: optional_bindings[6].label.clone(), new_tab: bindings[3].value, new_tab_label: bindings[3].label.clone(), - rename_tab: optional_bindings[5].value, - rename_tab_label: optional_bindings[5].label.clone(), - previous_tab: optional_bindings[6].value, - previous_tab_label: optional_bindings[6].label.clone(), - next_tab: optional_bindings[7].value, - next_tab_label: optional_bindings[7].label.clone(), - close_tab: optional_bindings[8].value, - close_tab_label: optional_bindings[8].label.clone(), - rename_pane: optional_bindings[9].value, - rename_pane_label: optional_bindings[9].label.clone(), - focus_pane_left: optional_bindings[10].value, - focus_pane_left_label: optional_bindings[10].label.clone(), - focus_pane_down: optional_bindings[11].value, - focus_pane_down_label: optional_bindings[11].label.clone(), - focus_pane_up: optional_bindings[12].value, - focus_pane_up_label: optional_bindings[12].label.clone(), - focus_pane_right: optional_bindings[13].value, - focus_pane_right_label: optional_bindings[13].label.clone(), + rename_tab: optional_bindings[7].value, + rename_tab_label: optional_bindings[7].label.clone(), + previous_tab: optional_bindings[8].value, + previous_tab_label: optional_bindings[8].label.clone(), + next_tab: optional_bindings[9].value, + next_tab_label: optional_bindings[9].label.clone(), + close_tab: optional_bindings[10].value, + close_tab_label: optional_bindings[10].label.clone(), + rename_pane: optional_bindings[11].value, + rename_pane_label: optional_bindings[11].label.clone(), + focus_pane_left: optional_bindings[12].value, + focus_pane_left_label: optional_bindings[12].label.clone(), + focus_pane_down: optional_bindings[13].value, + focus_pane_down_label: optional_bindings[13].label.clone(), + focus_pane_up: optional_bindings[14].value, + focus_pane_up_label: optional_bindings[14].label.clone(), + focus_pane_right: optional_bindings[15].value, + focus_pane_right_label: optional_bindings[15].label.clone(), split_vertical: bindings[4].value, split_vertical_label: bindings[4].label.clone(), split_horizontal: bindings[5].value, @@ -863,6 +883,8 @@ mod tests { (KeyCode::Char('d'), KeyModifiers::SHIFT) ); assert_eq!(kb.detach, None); + assert_eq!(kb.previous_agent, None); + assert_eq!(kb.next_agent, None); assert_eq!(kb.split_vertical.0, KeyCode::Char('v')); assert_eq!(kb.split_horizontal.0, KeyCode::Char('-')); assert_eq!(kb.close_pane.0, KeyCode::Char('x')); @@ -886,6 +908,8 @@ close_pane = "ctrl+w" fullscreen = "z" resize_mode = "ctrl+r" toggle_sidebar = "tab" +previous_agent = "alt+a" +next_agent = "alt+d" focus_pane_left = "alt+h" focus_pane_right = "alt+right" "#; @@ -916,6 +940,11 @@ focus_pane_right = "alt+right" assert_eq!(kb.fullscreen.0, KeyCode::Char('z')); assert_eq!(kb.resize_mode, (KeyCode::Char('r'), KeyModifiers::CONTROL)); assert_eq!(kb.toggle_sidebar, (KeyCode::Tab, KeyModifiers::empty())); + assert_eq!( + kb.previous_agent, + Some((KeyCode::Char('a'), KeyModifiers::ALT)) + ); + assert_eq!(kb.next_agent, Some((KeyCode::Char('d'), KeyModifiers::ALT))); assert_eq!( kb.focus_pane_left, Some((KeyCode::Char('h'), KeyModifiers::ALT)) diff --git a/src/config/model.rs b/src/config/model.rs index 166e3ffa..8d2b356f 100644 --- a/src/config/model.rs +++ b/src/config/model.rs @@ -85,6 +85,10 @@ pub struct KeysConfig { pub previous_workspace: String, /// Select the next workspace. Unset by default. pub next_workspace: String, + /// Focus the previous agent shown in the agent panel. Unset by default. + pub previous_agent: String, + /// Focus the next agent shown in the agent panel. Unset by default. + pub next_agent: String, /// Create a new tab in the active workspace. Default: "c" pub new_tab: String, /// Rename the active tab. Unset by default. @@ -162,6 +166,8 @@ impl Default for KeysConfig { open_notification_target: "".into(), previous_workspace: "".into(), next_workspace: "".into(), + previous_agent: "".into(), + next_agent: "".into(), new_tab: "c".into(), rename_tab: "".into(), previous_tab: "".into(), -- cgit v1.2.3