From 1b36c62188884ae5fe5d5d3b07d36cb2ee730469 Mon Sep 17 00:00:00 2001 From: tepek2 Date: Fri, 13 Sep 2024 21:17:01 +0200 Subject: [PATCH] Add keybinding to swap pane items (#15583) - Rearrange tabs (left: `ctrl-shift-pageup`, right: `ctrl-shift-pagedown`) like Chrome Co-authored-by: Peter Tripp --- assets/keymaps/default-linux.json | 2 + assets/keymaps/default-macos.json | 2 + crates/workspace/src/pane.rs | 24 +++++++++ docs/src/key-bindings.md | 82 ++++++++++++++++--------------- 4 files changed, 70 insertions(+), 40 deletions(-) diff --git a/assets/keymaps/default-linux.json b/assets/keymaps/default-linux.json index 3c627d7803..bb5673dde6 100644 --- a/assets/keymaps/default-linux.json +++ b/assets/keymaps/default-linux.json @@ -245,6 +245,8 @@ "bindings": { "ctrl-pageup": "pane::ActivatePrevItem", "ctrl-pagedown": "pane::ActivateNextItem", + "ctrl-shift-pageup": "pane::SwapItemLeft", + "ctrl-shift-pagedown": "pane::SwapItemRight", "ctrl-w": "pane::CloseActiveItem", "ctrl-f4": "pane::CloseActiveItem", "alt-ctrl-t": "pane::CloseInactiveItems", diff --git a/assets/keymaps/default-macos.json b/assets/keymaps/default-macos.json index ed6ece0556..9a0c08c3dc 100644 --- a/assets/keymaps/default-macos.json +++ b/assets/keymaps/default-macos.json @@ -285,6 +285,8 @@ "cmd-}": "pane::ActivateNextItem", "alt-cmd-left": "pane::ActivatePrevItem", "alt-cmd-right": "pane::ActivateNextItem", + "ctrl-shift-pageup": "pane::SwapItemLeft", + "ctrl-shift-pagedown": "pane::SwapItemRight", "cmd-w": "pane::CloseActiveItem", "alt-cmd-t": "pane::CloseInactiveItems", "ctrl-alt-cmd-w": "workspace::CloseInactiveTabsAndPanes", diff --git a/crates/workspace/src/pane.rs b/crates/workspace/src/pane.rs index d0fa411381..09b4683c0c 100644 --- a/crates/workspace/src/pane.rs +++ b/crates/workspace/src/pane.rs @@ -158,6 +158,8 @@ actions!( SplitDown, SplitHorizontal, SplitVertical, + SwapItemLeft, + SwapItemRight, TogglePreviewTab, TogglePinTab, ] @@ -1054,6 +1056,26 @@ impl Pane { self.activate_item(index, activate_pane, activate_pane, cx); } + pub fn swap_item_left(&mut self, cx: &mut ViewContext) { + let index = self.active_item_index; + if index == 0 { + return; + } + + self.items.swap(index, index - 1); + self.activate_item(index - 1, true, true, cx); + } + + pub fn swap_item_right(&mut self, cx: &mut ViewContext) { + let index = self.active_item_index; + if index + 1 == self.items.len() { + return; + } + + self.items.swap(index, index + 1); + self.activate_item(index + 1, true, true, cx); + } + pub fn close_active_item( &mut self, action: &CloseActiveItem, @@ -2574,6 +2596,8 @@ impl Render for Pane { .on_action(cx.listener(|pane: &mut Pane, _: &ActivateNextItem, cx| { pane.activate_next_item(true, cx); })) + .on_action(cx.listener(|pane, _: &SwapItemLeft, cx| pane.swap_item_left(cx))) + .on_action(cx.listener(|pane, _: &SwapItemRight, cx| pane.swap_item_right(cx))) .on_action(cx.listener(|pane, action, cx| { pane.toggle_pin_tab(action, cx); })) diff --git a/docs/src/key-bindings.md b/docs/src/key-bindings.md index 2a97bc62a8..989e101e7d 100644 --- a/docs/src/key-bindings.md +++ b/docs/src/key-bindings.md @@ -405,46 +405,48 @@ TBD: Add Column with Linux shortcuts #### Pane -| **Command** | **Target** | **Default Shortcut** | -| ----------------------------- | -------------- | ----------------------- | -| Activate item 1 | Pane | `Control + 1` | -| Activate item 2 | Pane | `Control + 2` | -| Activate item 3 | Pane | `Control + 3` | -| Activate item 4 | Pane | `Control + 4` | -| Activate item 5 | Pane | `Control + 5` | -| Activate item 6 | Pane | `Control + 6` | -| Activate item 7 | Pane | `Control + 7` | -| Activate item 8 | Pane | `Control + 8` | -| Activate item 9 | Pane | `Control + 9` | -| Activate last item | Pane | `Control + 0` | -| Activate next item | Pane | `Alt + ⌘ + Right` | -| Activate next item | Pane | `⌘ + }` | -| Activate prev item | Pane | `Alt + ⌘ + Left` | -| Activate prev item | Pane | `⌘ + {` | -| Close active item | Pane | `⌘ + W` | -| Close all items | Pane | `⌘ + K, ⌘ + W` | -| Close clean items | Pane | `⌘ + K, U` | -| Close inactive items | Pane | `Alt + ⌘ + T` | -| Go back | Pane | `Control + -` | -| Go forward | Pane | `Control + Shift + _` | -| Reopen closed item | Pane | `⌘ + Shift + T` | -| Split down | Pane | `⌘ + K, Down` | -| Split left | Pane | `⌘ + K, Left` | -| Split right | Pane | `⌘ + K, Right` | -| Split up | Pane | `⌘ + K, Up` | -| Toggle filters | Project Search | `Alt + ⌘ + F` | -| Toggle focus | Project Search | `⌘ + F` | -| Toggle focus | Project Search | `⌘ + Shift + F` | -| Activate regex mode | Search | `Alt + ⌘ + G` | -| Activate text mode | Search | `Alt + ⌘ + X` | -| Cycle mode | Search | `Alt + Tab` | -| Select all matches | Search | `Alt + Enter` | -| Select next match | Search | `⌘ + G` | -| Select prev match | Search | `⌘ + Shift + G` | -| Toggle case sensitive | Search | `Alt + ⌘ + C` | -| Toggle replace | Search | `⌘ + Shift + H` | -| Toggle whole word | Search | `Alt + ⌘ + W` | -| Close inactive tabs and panes | Workspace | `Control + Alt + ⌘ + W` | +| **Command** | **Target** | **Default Shortcut** | +| ----------------------------- | -------------- | ----------------------------- | +| Activate item 1 | Pane | `Control + 1` | +| Activate item 2 | Pane | `Control + 2` | +| Activate item 3 | Pane | `Control + 3` | +| Activate item 4 | Pane | `Control + 4` | +| Activate item 5 | Pane | `Control + 5` | +| Activate item 6 | Pane | `Control + 6` | +| Activate item 7 | Pane | `Control + 7` | +| Activate item 8 | Pane | `Control + 8` | +| Activate item 9 | Pane | `Control + 9` | +| Activate last item | Pane | `Control + 0` | +| Activate next item | Pane | `Alt + ⌘ + Right` | +| Activate next item | Pane | `⌘ + }` | +| Activate prev item | Pane | `Alt + ⌘ + Left` | +| Activate prev item | Pane | `⌘ + {` | +| Swap item to left | Pane | `Control + Shift + Page Up` | +| Swap item to right | Pane | `Control + Shift + Page Down` | +| Close active item | Pane | `⌘ + W` | +| Close all items | Pane | `⌘ + K, ⌘ + W` | +| Close clean items | Pane | `⌘ + K, U` | +| Close inactive items | Pane | `Alt + ⌘ + T` | +| Go back | Pane | `Control + -` | +| Go forward | Pane | `Control + Shift + _` | +| Reopen closed item | Pane | `⌘ + Shift + T` | +| Split down | Pane | `⌘ + K, Down` | +| Split left | Pane | `⌘ + K, Left` | +| Split right | Pane | `⌘ + K, Right` | +| Split up | Pane | `⌘ + K, Up` | +| Toggle filters | Project Search | `Alt + ⌘ + F` | +| Toggle focus | Project Search | `⌘ + F` | +| Toggle focus | Project Search | `⌘ + Shift + F` | +| Activate regex mode | Search | `Alt + ⌘ + G` | +| Activate text mode | Search | `Alt + ⌘ + X` | +| Cycle mode | Search | `Alt + Tab` | +| Select all matches | Search | `Alt + Enter` | +| Select next match | Search | `⌘ + G` | +| Select prev match | Search | `⌘ + Shift + G` | +| Toggle case sensitive | Search | `Alt + ⌘ + C` | +| Toggle replace | Search | `⌘ + Shift + H` | +| Toggle whole word | Search | `Alt + ⌘ + W` | +| Close inactive tabs and panes | Workspace | `Control + Alt + ⌘ + W` | #### Buffer Search Bar