aboutsummaryrefslogtreecommitdiff
path: root/src/app/input/navigate.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-05 21:59:10 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-05 22:06:02 +0300
commit556b16b2df7ea2c3e9b8ad13db4ad7370c1ad838 (patch)
tree0a6f61701f2c8992c6cd1ee6d61171ef92a92533 /src/app/input/navigate.rs
parentae3c88ab8c64931740d89623f688f7d3f408da5e (diff)
feat: add pane navigation controls
refs #421 refs #330 related discussions: https://github.com/ogulcancelik/herdr/discussions/422 https://github.com/ogulcancelik/herdr/discussions/438 https://github.com/ogulcancelik/herdr/discussions/442
Diffstat (limited to 'src/app/input/navigate.rs')
-rw-r--r--src/app/input/navigate.rs41
1 files changed, 39 insertions, 2 deletions
diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs
index 2ac86aeb..7f803825 100644
--- a/src/app/input/navigate.rs
+++ b/src/app/input/navigate.rs
@@ -499,6 +499,10 @@ pub(crate) enum NavigateAction {
FocusPaneDown,
FocusPaneUp,
FocusPaneRight,
+ SwapPaneLeft,
+ SwapPaneDown,
+ SwapPaneUp,
+ SwapPaneRight,
SplitVertical,
SplitHorizontal,
ClosePane,
@@ -601,6 +605,10 @@ fn action_for_key(
(&kb.focus_pane_down, NavigateAction::FocusPaneDown),
(&kb.focus_pane_up, NavigateAction::FocusPaneUp),
(&kb.focus_pane_right, NavigateAction::FocusPaneRight),
+ (&kb.swap_pane_left, NavigateAction::SwapPaneLeft),
+ (&kb.swap_pane_down, NavigateAction::SwapPaneDown),
+ (&kb.swap_pane_up, NavigateAction::SwapPaneUp),
+ (&kb.swap_pane_right, NavigateAction::SwapPaneRight),
(&kb.last_pane, NavigateAction::LastPane),
(&kb.cycle_pane_next, NavigateAction::CyclePaneNext),
(&kb.cycle_pane_previous, NavigateAction::CyclePanePrevious),
@@ -778,6 +786,22 @@ pub(super) fn execute_navigate_action_in_context(
NavigateAction::FocusPaneDown => state.navigate_pane(NavDirection::Down),
NavigateAction::FocusPaneUp => state.navigate_pane(NavDirection::Up),
NavigateAction::FocusPaneRight => state.navigate_pane(NavDirection::Right),
+ NavigateAction::SwapPaneLeft => {
+ state.swap_pane(NavDirection::Left);
+ leave_navigate_mode(state);
+ }
+ NavigateAction::SwapPaneDown => {
+ state.swap_pane(NavDirection::Down);
+ leave_navigate_mode(state);
+ }
+ NavigateAction::SwapPaneUp => {
+ state.swap_pane(NavDirection::Up);
+ leave_navigate_mode(state);
+ }
+ NavigateAction::SwapPaneRight => {
+ state.swap_pane(NavDirection::Right);
+ leave_navigate_mode(state);
+ }
NavigateAction::SplitVertical => {
state.split_pane(terminal_runtimes, Direction::Horizontal);
leave_navigate_mode(state);
@@ -1501,6 +1525,19 @@ navigate_pane_right = "ctrl+l"
}
#[test]
+ fn terminal_direct_swap_pane_shortcut_maps_to_navigation_action() {
+ let mut state = state_with_workspaces(&["test"]);
+ state.keybinds.swap_pane_right = crate::config::ActionKeybinds::direct("alt+shift+l");
+
+ let action = terminal_direct_navigation_action(
+ &state,
+ TerminalKey::new(KeyCode::Char('l'), KeyModifiers::ALT | KeyModifiers::SHIFT),
+ );
+
+ assert_eq!(action, Some(NavigateAction::SwapPaneRight));
+ }
+
+ #[test]
fn terminal_direct_last_pane_shortcut_maps_to_navigation_action() {
let mut state = state_with_workspaces(&["test"]);
state.keybinds.last_pane = crate::config::ActionKeybinds::direct("alt+l");
@@ -1788,11 +1825,11 @@ last_pane = "prefix+tab"
#[test]
fn modified_navigate_local_key_can_be_bound_as_prefix_rhs() {
let mut state = state_with_workspaces(&["test"]);
- state.keybinds.toggle_sidebar = crate::config::ActionKeybinds::prefix("shift+h");
+ state.keybinds.toggle_sidebar = crate::config::ActionKeybinds::prefix("shift+u");
handle_navigate_key(
&mut state,
- KeyEvent::new(KeyCode::Char('H'), KeyModifiers::SHIFT),
+ KeyEvent::new(KeyCode::Char('U'), KeyModifiers::SHIFT),
);
assert!(state.sidebar_collapsed);