wip

Nathan Sobo created

Change summary

assets/keymaps/default.json                     | 1037 +++++++++---------
crates/gpui/src/app.rs                          |    6 
crates/gpui/src/elements.rs                     |   14 
crates/gpui/src/elements/mouse_event_handler.rs |   21 
crates/theme/src/theme.rs                       |    2 
crates/workspace/src/pane.rs                    |   23 
crates/workspace/src/pane_group.rs              |    8 
crates/workspace/src/workspace.rs               |   39 
styles/src/styleTree/workspace.ts               |    9 
9 files changed, 634 insertions(+), 525 deletions(-)

Detailed changes

assets/keymaps/default.json 🔗

@@ -1,534 +1,535 @@
 [
-  // Standard macOS bindings
-  {
-    "bindings": {
-      "up": "menu::SelectPrev",
-      "pageup": "menu::SelectFirst",
-      "shift-pageup": "menu::SelectFirst",
-      "ctrl-p": "menu::SelectPrev",
-      "down": "menu::SelectNext",
-      "pagedown": "menu::SelectLast",
-      "shift-pagedown": "menu::SelectFirst",
-      "ctrl-n": "menu::SelectNext",
-      "cmd-up": "menu::SelectFirst",
-      "cmd-down": "menu::SelectLast",
-      "enter": "menu::Confirm",
-      "escape": "menu::Cancel",
-      "ctrl-c": "menu::Cancel",
-      "cmd-{": "pane::ActivatePrevItem",
-      "cmd-}": "pane::ActivateNextItem",
-      "alt-cmd-left": "pane::ActivatePrevItem",
-      "alt-cmd-right": "pane::ActivateNextItem",
-      "cmd-w": "pane::CloseActiveItem",
-      "alt-cmd-t": "pane::CloseInactiveItems",
-      "cmd-k u": "pane::CloseCleanItems",
-      "cmd-k cmd-w": "pane::CloseAllItems",
-      "cmd-shift-w": "workspace::CloseWindow",
-      "cmd-s": "workspace::Save",
-      "cmd-shift-s": "workspace::SaveAs",
-      "cmd-=": "zed::IncreaseBufferFontSize",
-      "cmd--": "zed::DecreaseBufferFontSize",
-      "cmd-0": "zed::ResetBufferFontSize",
-      "cmd-,": "zed::OpenSettings",
-      "cmd-q": "zed::Quit",
-      "cmd-h": "zed::Hide",
-      "alt-cmd-h": "zed::HideOthers",
-      "cmd-m": "zed::Minimize",
-      "ctrl-cmd-f": "zed::ToggleFullScreen",
-      "cmd-n": "workspace::NewFile",
-      "cmd-shift-n": "workspace::NewWindow",
-      "cmd-o": "workspace::Open",
-      "alt-cmd-o": "projects::OpenRecent",
-      "ctrl-`": "workspace::NewTerminal"
-    }
-  },
-  {
-    "context": "Editor",
-    "bindings": {
-      "escape": "editor::Cancel",
-      "backspace": "editor::Backspace",
-      "shift-backspace": "editor::Backspace",
-      "ctrl-h": "editor::Backspace",
-      "delete": "editor::Delete",
-      "ctrl-d": "editor::Delete",
-      "tab": "editor::Tab",
-      "shift-tab": "editor::TabPrev",
-      "ctrl-k": "editor::CutToEndOfLine",
-      "ctrl-t": "editor::Transpose",
-      "cmd-backspace": "editor::DeleteToBeginningOfLine",
-      "cmd-delete": "editor::DeleteToEndOfLine",
-      "alt-backspace": "editor::DeleteToPreviousWordStart",
-      "alt-delete": "editor::DeleteToNextWordEnd",
-      "alt-h": "editor::DeleteToPreviousWordStart",
-      "alt-d": "editor::DeleteToNextWordEnd",
-      "cmd-x": "editor::Cut",
-      "cmd-c": "editor::Copy",
-      "cmd-v": "editor::Paste",
-      "cmd-z": "editor::Undo",
-      "cmd-shift-z": "editor::Redo",
-      "up": "editor::MoveUp",
-      "pageup": "editor::PageUp",
-      "shift-pageup": "editor::MovePageUp",
-      "home": "editor::MoveToBeginningOfLine",
-      "down": "editor::MoveDown",
-      "pagedown": "editor::PageDown",
-      "shift-pagedown": "editor::MovePageDown",
-      "end": "editor::MoveToEndOfLine",
-      "left": "editor::MoveLeft",
-      "right": "editor::MoveRight",
-      "ctrl-p": "editor::MoveUp",
-      "ctrl-n": "editor::MoveDown",
-      "ctrl-b": "editor::MoveLeft",
-      "ctrl-f": "editor::MoveRight",
-      "ctrl-l": "editor::NextScreen",
-      "alt-left": "editor::MoveToPreviousWordStart",
-      "alt-b": "editor::MoveToPreviousWordStart",
-      "alt-right": "editor::MoveToNextWordEnd",
-      "alt-f": "editor::MoveToNextWordEnd",
-      "cmd-left": "editor::MoveToBeginningOfLine",
-      "ctrl-a": "editor::MoveToBeginningOfLine",
-      "cmd-right": "editor::MoveToEndOfLine",
-      "ctrl-e": "editor::MoveToEndOfLine",
-      "cmd-up": "editor::MoveToBeginning",
-      "cmd-down": "editor::MoveToEnd",
-      "shift-up": "editor::SelectUp",
-      "ctrl-shift-p": "editor::SelectUp",
-      "shift-down": "editor::SelectDown",
-      "ctrl-shift-n": "editor::SelectDown",
-      "shift-left": "editor::SelectLeft",
-      "ctrl-shift-b": "editor::SelectLeft",
-      "shift-right": "editor::SelectRight",
-      "ctrl-shift-f": "editor::SelectRight",
-      "alt-shift-left": "editor::SelectToPreviousWordStart",
-      "alt-shift-b": "editor::SelectToPreviousWordStart",
-      "alt-shift-right": "editor::SelectToNextWordEnd",
-      "alt-shift-f": "editor::SelectToNextWordEnd",
-      "cmd-shift-up": "editor::SelectToBeginning",
-      "cmd-shift-down": "editor::SelectToEnd",
-      "cmd-a": "editor::SelectAll",
-      "cmd-l": "editor::SelectLine",
-      "cmd-shift-i": "editor::Format",
-      "cmd-shift-left": [
-        "editor::SelectToBeginningOfLine",
-        {
-          "stop_at_soft_wraps": true
+    // Standard macOS bindings
+    {
+        "bindings": {
+            "up": "menu::SelectPrev",
+            "pageup": "menu::SelectFirst",
+            "shift-pageup": "menu::SelectFirst",
+            "ctrl-p": "menu::SelectPrev",
+            "down": "menu::SelectNext",
+            "pagedown": "menu::SelectLast",
+            "shift-pagedown": "menu::SelectFirst",
+            "ctrl-n": "menu::SelectNext",
+            "cmd-up": "menu::SelectFirst",
+            "cmd-down": "menu::SelectLast",
+            "enter": "menu::Confirm",
+            "escape": "menu::Cancel",
+            "ctrl-c": "menu::Cancel",
+            "cmd-{": "pane::ActivatePrevItem",
+            "cmd-}": "pane::ActivateNextItem",
+            "alt-cmd-left": "pane::ActivatePrevItem",
+            "alt-cmd-right": "pane::ActivateNextItem",
+            "cmd-w": "pane::CloseActiveItem",
+            "alt-cmd-t": "pane::CloseInactiveItems",
+            "cmd-k u": "pane::CloseCleanItems",
+            "cmd-k cmd-w": "pane::CloseAllItems",
+            "cmd-shift-w": "workspace::CloseWindow",
+            "cmd-s": "workspace::Save",
+            "cmd-shift-s": "workspace::SaveAs",
+            "cmd-=": "zed::IncreaseBufferFontSize",
+            "cmd--": "zed::DecreaseBufferFontSize",
+            "cmd-0": "zed::ResetBufferFontSize",
+            "cmd-,": "zed::OpenSettings",
+            "cmd-q": "zed::Quit",
+            "cmd-h": "zed::Hide",
+            "alt-cmd-h": "zed::HideOthers",
+            "cmd-m": "zed::Minimize",
+            "ctrl-cmd-f": "zed::ToggleFullScreen",
+            "cmd-n": "workspace::NewFile",
+            "cmd-shift-n": "workspace::NewWindow",
+            "cmd-o": "workspace::Open",
+            "alt-cmd-o": "projects::OpenRecent",
+            "ctrl-`": "workspace::NewTerminal"
         }
-      ],
-      "shift-home": [
-        "editor::SelectToBeginningOfLine",
-        {
-          "stop_at_soft_wraps": true
+    },
+    {
+        "context": "Editor",
+        "bindings": {
+            "escape": "editor::Cancel",
+            "backspace": "editor::Backspace",
+            "shift-backspace": "editor::Backspace",
+            "ctrl-h": "editor::Backspace",
+            "delete": "editor::Delete",
+            "ctrl-d": "editor::Delete",
+            "tab": "editor::Tab",
+            "shift-tab": "editor::TabPrev",
+            "ctrl-k": "editor::CutToEndOfLine",
+            "ctrl-t": "editor::Transpose",
+            "cmd-backspace": "editor::DeleteToBeginningOfLine",
+            "cmd-delete": "editor::DeleteToEndOfLine",
+            "alt-backspace": "editor::DeleteToPreviousWordStart",
+            "alt-delete": "editor::DeleteToNextWordEnd",
+            "alt-h": "editor::DeleteToPreviousWordStart",
+            "alt-d": "editor::DeleteToNextWordEnd",
+            "cmd-x": "editor::Cut",
+            "cmd-c": "editor::Copy",
+            "cmd-v": "editor::Paste",
+            "cmd-z": "editor::Undo",
+            "cmd-shift-z": "editor::Redo",
+            "up": "editor::MoveUp",
+            "pageup": "editor::PageUp",
+            "shift-pageup": "editor::MovePageUp",
+            "home": "editor::MoveToBeginningOfLine",
+            "down": "editor::MoveDown",
+            "pagedown": "editor::PageDown",
+            "shift-pagedown": "editor::MovePageDown",
+            "end": "editor::MoveToEndOfLine",
+            "left": "editor::MoveLeft",
+            "right": "editor::MoveRight",
+            "ctrl-p": "editor::MoveUp",
+            "ctrl-n": "editor::MoveDown",
+            "ctrl-b": "editor::MoveLeft",
+            "ctrl-f": "editor::MoveRight",
+            "ctrl-l": "editor::NextScreen",
+            "alt-left": "editor::MoveToPreviousWordStart",
+            "alt-b": "editor::MoveToPreviousWordStart",
+            "alt-right": "editor::MoveToNextWordEnd",
+            "alt-f": "editor::MoveToNextWordEnd",
+            "cmd-left": "editor::MoveToBeginningOfLine",
+            "ctrl-a": "editor::MoveToBeginningOfLine",
+            "cmd-right": "editor::MoveToEndOfLine",
+            "ctrl-e": "editor::MoveToEndOfLine",
+            "cmd-up": "editor::MoveToBeginning",
+            "cmd-down": "editor::MoveToEnd",
+            "shift-up": "editor::SelectUp",
+            "ctrl-shift-p": "editor::SelectUp",
+            "shift-down": "editor::SelectDown",
+            "ctrl-shift-n": "editor::SelectDown",
+            "shift-left": "editor::SelectLeft",
+            "ctrl-shift-b": "editor::SelectLeft",
+            "shift-right": "editor::SelectRight",
+            "ctrl-shift-f": "editor::SelectRight",
+            "alt-shift-left": "editor::SelectToPreviousWordStart",
+            "alt-shift-b": "editor::SelectToPreviousWordStart",
+            "alt-shift-right": "editor::SelectToNextWordEnd",
+            "alt-shift-f": "editor::SelectToNextWordEnd",
+            "cmd-shift-up": "editor::SelectToBeginning",
+            "cmd-shift-down": "editor::SelectToEnd",
+            "cmd-a": "editor::SelectAll",
+            "cmd-l": "editor::SelectLine",
+            "cmd-shift-i": "editor::Format",
+            "cmd-shift-left": [
+                "editor::SelectToBeginningOfLine",
+                {
+                    "stop_at_soft_wraps": true
+                }
+            ],
+            "shift-home": [
+                "editor::SelectToBeginningOfLine",
+                {
+                    "stop_at_soft_wraps": true
+                }
+            ],
+            "ctrl-shift-a": [
+                "editor::SelectToBeginningOfLine",
+                {
+                    "stop_at_soft_wraps": true
+                }
+            ],
+            "cmd-shift-right": [
+                "editor::SelectToEndOfLine",
+                {
+                    "stop_at_soft_wraps": true
+                }
+            ],
+            "shift-end": [
+                "editor::SelectToEndOfLine",
+                {
+                    "stop_at_soft_wraps": true
+                }
+            ],
+            "ctrl-shift-e": [
+                "editor::SelectToEndOfLine",
+                {
+                    "stop_at_soft_wraps": true
+                }
+            ],
+            "ctrl-v": [
+                "editor::MovePageDown",
+                {
+                    "center_cursor": true
+                }
+            ],
+            "alt-v": [
+                "editor::MovePageUp",
+                {
+                    "center_cursor": true
+                }
+            ],
+            "ctrl-cmd-space": "editor::ShowCharacterPalette"
         }
-      ],
-      "ctrl-shift-a": [
-        "editor::SelectToBeginningOfLine",
-        {
-          "stop_at_soft_wraps": true
+    },
+    {
+        "context": "Editor && mode == full",
+        "bindings": {
+            "enter": "editor::Newline",
+            "cmd-shift-enter": "editor::NewlineAbove",
+            "cmd-enter": "editor::NewlineBelow",
+            "alt-z": "editor::ToggleSoftWrap",
+            "cmd-f": [
+                "buffer_search::Deploy",
+                {
+                    "focus": true
+                }
+            ],
+            "cmd-e": [
+                "buffer_search::Deploy",
+                {
+                    "focus": false
+                }
+            ],
+            "alt-\\": "copilot::Suggest",
+            "alt-]": "copilot::NextSuggestion",
+            "alt-[": "copilot::PreviousSuggestion"
         }
-      ],
-      "cmd-shift-right": [
-        "editor::SelectToEndOfLine",
-        {
-          "stop_at_soft_wraps": true
+    },
+    {
+        "context": "Editor && mode == auto_height",
+        "bindings": {
+            "alt-enter": "editor::Newline",
+            "cmd-alt-enter": "editor::NewlineBelow"
         }
-      ],
-      "shift-end": [
-        "editor::SelectToEndOfLine",
-        {
-          "stop_at_soft_wraps": true
+    },
+    {
+        "context": "BufferSearchBar > Editor",
+        "bindings": {
+            "escape": "buffer_search::Dismiss",
+            "tab": "buffer_search::FocusEditor",
+            "enter": "search::SelectNextMatch",
+            "shift-enter": "search::SelectPrevMatch"
         }
-      ],
-      "ctrl-shift-e": [
-        "editor::SelectToEndOfLine",
-        {
-          "stop_at_soft_wraps": true
+    },
+    {
+        "context": "ProjectSearchBar > Editor",
+        "bindings": {
+            "escape": "project_search::ToggleFocus"
         }
-      ],
-      "ctrl-v": [
-        "editor::MovePageDown",
-        {
-          "center_cursor": true
+    },
+    {
+        "context": "ProjectSearchView > Editor",
+        "bindings": {
+            "escape": "project_search::ToggleFocus"
         }
-      ],
-      "alt-v": [
-        "editor::MovePageUp",
-        {
-          "center_cursor": true
+    },
+    {
+        "context": "Pane",
+        "bindings": {
+            "cmd-f": "project_search::ToggleFocus",
+            "cmd-g": "search::SelectNextMatch",
+            "cmd-shift-g": "search::SelectPrevMatch",
+            "alt-cmd-c": "search::ToggleCaseSensitive",
+            "alt-cmd-w": "search::ToggleWholeWord",
+            "alt-cmd-r": "search::ToggleRegex",
+            "shift-escape": "pane::ToggleZoom"
         }
-      ],
-      "ctrl-cmd-space": "editor::ShowCharacterPalette"
-    }
-  },
-  {
-    "context": "Editor && mode == full",
-    "bindings": {
-      "enter": "editor::Newline",
-      "cmd-shift-enter": "editor::NewlineAbove",
-      "cmd-enter": "editor::NewlineBelow",
-      "alt-z": "editor::ToggleSoftWrap",
-      "cmd-f": [
-        "buffer_search::Deploy",
-        {
-          "focus": true
+    },
+    // Bindings from VS Code
+    {
+        "context": "Editor",
+        "bindings": {
+            "cmd-[": "editor::Outdent",
+            "cmd-]": "editor::Indent",
+            "cmd-alt-up": "editor::AddSelectionAbove",
+            "cmd-ctrl-p": "editor::AddSelectionAbove",
+            "cmd-alt-down": "editor::AddSelectionBelow",
+            "cmd-ctrl-n": "editor::AddSelectionBelow",
+            "cmd-d": [
+                "editor::SelectNext",
+                {
+                    "replace_newest": false
+                }
+            ],
+            "cmd-k cmd-d": [
+                "editor::SelectNext",
+                {
+                    "replace_newest": true
+                }
+            ],
+            "cmd-k cmd-i": "editor::Hover",
+            "cmd-/": [
+                "editor::ToggleComments",
+                {
+                    "advance_downwards": false
+                }
+            ],
+            "alt-up": "editor::SelectLargerSyntaxNode",
+            "alt-down": "editor::SelectSmallerSyntaxNode",
+            "cmd-u": "editor::UndoSelection",
+            "cmd-shift-u": "editor::RedoSelection",
+            "f8": "editor::GoToDiagnostic",
+            "shift-f8": "editor::GoToPrevDiagnostic",
+            "f2": "editor::Rename",
+            "f12": "editor::GoToDefinition",
+            "cmd-f12": "editor::GoToTypeDefinition",
+            "alt-shift-f12": "editor::FindAllReferences",
+            "ctrl-m": "editor::MoveToEnclosingBracket",
+            "alt-cmd-[": "editor::Fold",
+            "alt-cmd-]": "editor::UnfoldLines",
+            "ctrl-space": "editor::ShowCompletions",
+            "cmd-.": "editor::ToggleCodeActions",
+            "alt-cmd-r": "editor::RevealInFinder"
         }
-      ],
-      "cmd-e": [
-        "buffer_search::Deploy",
-        {
-          "focus": false
+    },
+    {
+        "context": "Editor && mode == full",
+        "bindings": {
+            "cmd-shift-o": "outline::Toggle",
+            "ctrl-g": "go_to_line::Toggle"
         }
-      ],
-      "alt-\\": "copilot::Suggest",
-      "alt-]": "copilot::NextSuggestion",
-      "alt-[": "copilot::PreviousSuggestion"
-    }
-  },
-  {
-    "context": "Editor && mode == auto_height",
-    "bindings": {
-      "alt-enter": "editor::Newline",
-      "cmd-alt-enter": "editor::NewlineBelow"
-    }
-  },
-  {
-    "context": "BufferSearchBar > Editor",
-    "bindings": {
-      "escape": "buffer_search::Dismiss",
-      "tab": "buffer_search::FocusEditor",
-      "enter": "search::SelectNextMatch",
-      "shift-enter": "search::SelectPrevMatch"
-    }
-  },
-  {
-    "context": "ProjectSearchBar > Editor",
-    "bindings": {
-      "escape": "project_search::ToggleFocus"
-    }
-  },
-  {
-    "context": "ProjectSearchView > Editor",
-    "bindings": {
-      "escape": "project_search::ToggleFocus"
-    }
-  },
-  {
-    "context": "Pane",
-    "bindings": {
-      "cmd-f": "project_search::ToggleFocus",
-      "cmd-g": "search::SelectNextMatch",
-      "cmd-shift-g": "search::SelectPrevMatch",
-      "alt-cmd-c": "search::ToggleCaseSensitive",
-      "alt-cmd-w": "search::ToggleWholeWord",
-      "alt-cmd-r": "search::ToggleRegex"
-    }
-  },
-  // Bindings from VS Code
-  {
-    "context": "Editor",
-    "bindings": {
-      "cmd-[": "editor::Outdent",
-      "cmd-]": "editor::Indent",
-      "cmd-alt-up": "editor::AddSelectionAbove",
-      "cmd-ctrl-p": "editor::AddSelectionAbove",
-      "cmd-alt-down": "editor::AddSelectionBelow",
-      "cmd-ctrl-n": "editor::AddSelectionBelow",
-      "cmd-d": [
-        "editor::SelectNext",
-        {
-          "replace_newest": false
+    },
+    {
+        "context": "Pane",
+        "bindings": {
+            "ctrl-1": [
+                "pane::ActivateItem",
+                0
+            ],
+            "ctrl-2": [
+                "pane::ActivateItem",
+                1
+            ],
+            "ctrl-3": [
+                "pane::ActivateItem",
+                2
+            ],
+            "ctrl-4": [
+                "pane::ActivateItem",
+                3
+            ],
+            "ctrl-5": [
+                "pane::ActivateItem",
+                4
+            ],
+            "ctrl-6": [
+                "pane::ActivateItem",
+                5
+            ],
+            "ctrl-7": [
+                "pane::ActivateItem",
+                6
+            ],
+            "ctrl-8": [
+                "pane::ActivateItem",
+                7
+            ],
+            "ctrl-9": [
+                "pane::ActivateItem",
+                8
+            ],
+            "ctrl-0": "pane::ActivateLastItem",
+            "ctrl--": "pane::GoBack",
+            "ctrl-_": "pane::GoForward",
+            "cmd-shift-t": "pane::ReopenClosedItem",
+            "cmd-shift-f": "project_search::ToggleFocus"
         }
-      ],
-      "cmd-k cmd-d": [
-        "editor::SelectNext",
-        {
-          "replace_newest": true
+    },
+    {
+        "context": "Workspace",
+        "bindings": {
+            "cmd-1": [
+                "workspace::ActivatePane",
+                0
+            ],
+            "cmd-2": [
+                "workspace::ActivatePane",
+                1
+            ],
+            "cmd-3": [
+                "workspace::ActivatePane",
+                2
+            ],
+            "cmd-4": [
+                "workspace::ActivatePane",
+                3
+            ],
+            "cmd-5": [
+                "workspace::ActivatePane",
+                4
+            ],
+            "cmd-6": [
+                "workspace::ActivatePane",
+                5
+            ],
+            "cmd-7": [
+                "workspace::ActivatePane",
+                6
+            ],
+            "cmd-8": [
+                "workspace::ActivatePane",
+                7
+            ],
+            "cmd-9": [
+                "workspace::ActivatePane",
+                8
+            ],
+            "cmd-b": "workspace::ToggleLeftDock",
+            "cmd-shift-f": "workspace::NewSearch",
+            "cmd-k cmd-t": "theme_selector::Toggle",
+            "cmd-k cmd-s": "zed::OpenKeymap",
+            "cmd-t": "project_symbols::Toggle",
+            "cmd-p": "file_finder::Toggle",
+            "cmd-shift-p": "command_palette::Toggle",
+            "cmd-shift-m": "diagnostics::Deploy",
+            "cmd-shift-e": "project_panel::ToggleFocus",
+            "cmd-alt-s": "workspace::SaveAll",
+            "cmd-k m": "language_selector::Toggle"
         }
-      ],
-      "cmd-k cmd-i": "editor::Hover",
-      "cmd-/": [
-        "editor::ToggleComments",
-        {
-          "advance_downwards": false
+    },
+    // Bindings from Sublime Text
+    {
+        "context": "Editor",
+        "bindings": {
+            "ctrl-shift-k": "editor::DeleteLine",
+            "cmd-shift-d": "editor::DuplicateLine",
+            "cmd-shift-l": "editor::SplitSelectionIntoLines",
+            "ctrl-cmd-up": "editor::MoveLineUp",
+            "ctrl-cmd-down": "editor::MoveLineDown",
+            "ctrl-alt-backspace": "editor::DeleteToPreviousSubwordStart",
+            "ctrl-alt-h": "editor::DeleteToPreviousSubwordStart",
+            "ctrl-alt-delete": "editor::DeleteToNextSubwordEnd",
+            "ctrl-alt-d": "editor::DeleteToNextSubwordEnd",
+            "ctrl-alt-left": "editor::MoveToPreviousSubwordStart",
+            "ctrl-alt-b": "editor::MoveToPreviousSubwordStart",
+            "ctrl-alt-right": "editor::MoveToNextSubwordEnd",
+            "ctrl-alt-f": "editor::MoveToNextSubwordEnd",
+            "ctrl-alt-shift-left": "editor::SelectToPreviousSubwordStart",
+            "ctrl-alt-shift-b": "editor::SelectToPreviousSubwordStart",
+            "ctrl-alt-shift-right": "editor::SelectToNextSubwordEnd",
+            "ctrl-alt-shift-f": "editor::SelectToNextSubwordEnd"
+        }
+    },
+    {
+        "bindings": {
+            "cmd-k cmd-left": "workspace::ActivatePreviousPane",
+            "cmd-k cmd-right": "workspace::ActivateNextPane"
+        }
+    },
+    // Bindings from Atom
+    {
+        "context": "Pane",
+        "bindings": {
+            "cmd-k up": "pane::SplitUp",
+            "cmd-k down": "pane::SplitDown",
+            "cmd-k left": "pane::SplitLeft",
+            "cmd-k right": "pane::SplitRight"
+        }
+    },
+    // Bindings that should be unified with bindings for more general actions
+    {
+        "context": "Editor && renaming",
+        "bindings": {
+            "enter": "editor::ConfirmRename"
+        }
+    },
+    {
+        "context": "Editor && showing_completions",
+        "bindings": {
+            "enter": "editor::ConfirmCompletion",
+            "tab": "editor::ConfirmCompletion"
+        }
+    },
+    {
+        "context": "Editor && showing_code_actions",
+        "bindings": {
+            "enter": "editor::ConfirmCodeAction"
+        }
+    },
+    // Custom bindings
+    {
+        "bindings": {
+            "ctrl-alt-cmd-f": "workspace::FollowNextCollaborator",
+            "cmd-shift-c": "collab::ToggleContactsMenu",
+            "cmd-alt-i": "zed::DebugElements"
+        }
+    },
+    {
+        "context": "Editor",
+        "bindings": {
+            "alt-enter": "editor::OpenExcerpts",
+            "cmd-f8": "editor::GoToHunk",
+            "cmd-shift-f8": "editor::GoToPrevHunk"
+        }
+    },
+    {
+        "context": "ProjectSearchBar",
+        "bindings": {
+            "cmd-enter": "project_search::SearchInNew"
+        }
+    },
+    {
+        "context": "ProjectPanel",
+        "bindings": {
+            "left": "project_panel::CollapseSelectedEntry",
+            "right": "project_panel::ExpandSelectedEntry",
+            "cmd-x": "project_panel::Cut",
+            "cmd-c": "project_panel::Copy",
+            "cmd-v": "project_panel::Paste",
+            "cmd-alt-c": "project_panel::CopyPath",
+            "alt-cmd-shift-c": "project_panel::CopyRelativePath",
+            "f2": "project_panel::Rename",
+            "backspace": "project_panel::Delete",
+            "alt-cmd-r": "project_panel::RevealInFinder"
+        }
+    },
+    {
+        "context": "Terminal",
+        "bindings": {
+            "ctrl-cmd-space": "terminal::ShowCharacterPalette",
+            "cmd-c": "terminal::Copy",
+            "cmd-v": "terminal::Paste",
+            "cmd-k": "terminal::Clear",
+            // Some nice conveniences
+            "cmd-backspace": [
+                "terminal::SendText",
+                "\u0015"
+            ],
+            "cmd-right": [
+                "terminal::SendText",
+                "\u0005"
+            ],
+            "cmd-left": [
+                "terminal::SendText",
+                "\u0001"
+            ],
+            // Terminal.app compatability
+            "alt-left": [
+                "terminal::SendText",
+                "\u001bb"
+            ],
+            "alt-right": [
+                "terminal::SendText",
+                "\u001bf"
+            ],
+            // There are conflicting bindings for these keys in the global context.
+            // these bindings override them, remove at your own risk:
+            "up": [
+                "terminal::SendKeystroke",
+                "up"
+            ],
+            "pageup": [
+                "terminal::SendKeystroke",
+                "pageup"
+            ],
+            "down": [
+                "terminal::SendKeystroke",
+                "down"
+            ],
+            "pagedown": [
+                "terminal::SendKeystroke",
+                "pagedown"
+            ],
+            "escape": [
+                "terminal::SendKeystroke",
+                "escape"
+            ],
+            "enter": [
+                "terminal::SendKeystroke",
+                "enter"
+            ],
+            "ctrl-c": [
+                "terminal::SendKeystroke",
+                "ctrl-c"
+            ]
         }
-      ],
-      "alt-up": "editor::SelectLargerSyntaxNode",
-      "alt-down": "editor::SelectSmallerSyntaxNode",
-      "cmd-u": "editor::UndoSelection",
-      "cmd-shift-u": "editor::RedoSelection",
-      "f8": "editor::GoToDiagnostic",
-      "shift-f8": "editor::GoToPrevDiagnostic",
-      "f2": "editor::Rename",
-      "f12": "editor::GoToDefinition",
-      "cmd-f12": "editor::GoToTypeDefinition",
-      "alt-shift-f12": "editor::FindAllReferences",
-      "ctrl-m": "editor::MoveToEnclosingBracket",
-      "alt-cmd-[": "editor::Fold",
-      "alt-cmd-]": "editor::UnfoldLines",
-      "ctrl-space": "editor::ShowCompletions",
-      "cmd-.": "editor::ToggleCodeActions",
-      "alt-cmd-r": "editor::RevealInFinder"
-    }
-  },
-  {
-    "context": "Editor && mode == full",
-    "bindings": {
-      "cmd-shift-o": "outline::Toggle",
-      "ctrl-g": "go_to_line::Toggle"
-    }
-  },
-  {
-    "context": "Pane",
-    "bindings": {
-      "ctrl-1": [
-        "pane::ActivateItem",
-        0
-      ],
-      "ctrl-2": [
-        "pane::ActivateItem",
-        1
-      ],
-      "ctrl-3": [
-        "pane::ActivateItem",
-        2
-      ],
-      "ctrl-4": [
-        "pane::ActivateItem",
-        3
-      ],
-      "ctrl-5": [
-        "pane::ActivateItem",
-        4
-      ],
-      "ctrl-6": [
-        "pane::ActivateItem",
-        5
-      ],
-      "ctrl-7": [
-        "pane::ActivateItem",
-        6
-      ],
-      "ctrl-8": [
-        "pane::ActivateItem",
-        7
-      ],
-      "ctrl-9": [
-        "pane::ActivateItem",
-        8
-      ],
-      "ctrl-0": "pane::ActivateLastItem",
-      "ctrl--": "pane::GoBack",
-      "ctrl-_": "pane::GoForward",
-      "cmd-shift-t": "pane::ReopenClosedItem",
-      "cmd-shift-f": "project_search::ToggleFocus"
-    }
-  },
-  {
-    "context": "Workspace",
-    "bindings": {
-      "cmd-1": [
-        "workspace::ActivatePane",
-        0
-      ],
-      "cmd-2": [
-        "workspace::ActivatePane",
-        1
-      ],
-      "cmd-3": [
-        "workspace::ActivatePane",
-        2
-      ],
-      "cmd-4": [
-        "workspace::ActivatePane",
-        3
-      ],
-      "cmd-5": [
-        "workspace::ActivatePane",
-        4
-      ],
-      "cmd-6": [
-        "workspace::ActivatePane",
-        5
-      ],
-      "cmd-7": [
-        "workspace::ActivatePane",
-        6
-      ],
-      "cmd-8": [
-        "workspace::ActivatePane",
-        7
-      ],
-      "cmd-9": [
-        "workspace::ActivatePane",
-        8
-      ],
-      "cmd-b": "workspace::ToggleLeftDock",
-      "cmd-shift-f": "workspace::NewSearch",
-      "cmd-k cmd-t": "theme_selector::Toggle",
-      "cmd-k cmd-s": "zed::OpenKeymap",
-      "cmd-t": "project_symbols::Toggle",
-      "cmd-p": "file_finder::Toggle",
-      "cmd-shift-p": "command_palette::Toggle",
-      "cmd-shift-m": "diagnostics::Deploy",
-      "cmd-shift-e": "project_panel::ToggleFocus",
-      "cmd-alt-s": "workspace::SaveAll",
-      "cmd-k m": "language_selector::Toggle"
-    }
-  },
-  // Bindings from Sublime Text
-  {
-    "context": "Editor",
-    "bindings": {
-      "ctrl-shift-k": "editor::DeleteLine",
-      "cmd-shift-d": "editor::DuplicateLine",
-      "cmd-shift-l": "editor::SplitSelectionIntoLines",
-      "ctrl-cmd-up": "editor::MoveLineUp",
-      "ctrl-cmd-down": "editor::MoveLineDown",
-      "ctrl-alt-backspace": "editor::DeleteToPreviousSubwordStart",
-      "ctrl-alt-h": "editor::DeleteToPreviousSubwordStart",
-      "ctrl-alt-delete": "editor::DeleteToNextSubwordEnd",
-      "ctrl-alt-d": "editor::DeleteToNextSubwordEnd",
-      "ctrl-alt-left": "editor::MoveToPreviousSubwordStart",
-      "ctrl-alt-b": "editor::MoveToPreviousSubwordStart",
-      "ctrl-alt-right": "editor::MoveToNextSubwordEnd",
-      "ctrl-alt-f": "editor::MoveToNextSubwordEnd",
-      "ctrl-alt-shift-left": "editor::SelectToPreviousSubwordStart",
-      "ctrl-alt-shift-b": "editor::SelectToPreviousSubwordStart",
-      "ctrl-alt-shift-right": "editor::SelectToNextSubwordEnd",
-      "ctrl-alt-shift-f": "editor::SelectToNextSubwordEnd"
-    }
-  },
-  {
-    "bindings": {
-      "cmd-k cmd-left": "workspace::ActivatePreviousPane",
-      "cmd-k cmd-right": "workspace::ActivateNextPane"
-    }
-  },
-  // Bindings from Atom
-  {
-    "context": "Pane",
-    "bindings": {
-      "cmd-k up": "pane::SplitUp",
-      "cmd-k down": "pane::SplitDown",
-      "cmd-k left": "pane::SplitLeft",
-      "cmd-k right": "pane::SplitRight"
-    }
-  },
-  // Bindings that should be unified with bindings for more general actions
-  {
-    "context": "Editor && renaming",
-    "bindings": {
-      "enter": "editor::ConfirmRename"
-    }
-  },
-  {
-    "context": "Editor && showing_completions",
-    "bindings": {
-      "enter": "editor::ConfirmCompletion",
-      "tab": "editor::ConfirmCompletion"
-    }
-  },
-  {
-    "context": "Editor && showing_code_actions",
-    "bindings": {
-      "enter": "editor::ConfirmCodeAction"
-    }
-  },
-  // Custom bindings
-  {
-    "bindings": {
-      "ctrl-alt-cmd-f": "workspace::FollowNextCollaborator",
-      "cmd-shift-c": "collab::ToggleContactsMenu",
-      "cmd-alt-i": "zed::DebugElements"
-    }
-  },
-  {
-    "context": "Editor",
-    "bindings": {
-      "alt-enter": "editor::OpenExcerpts",
-      "cmd-f8": "editor::GoToHunk",
-      "cmd-shift-f8": "editor::GoToPrevHunk"
-    }
-  },
-  {
-    "context": "ProjectSearchBar",
-    "bindings": {
-      "cmd-enter": "project_search::SearchInNew"
-    }
-  },
-  {
-    "context": "ProjectPanel",
-    "bindings": {
-      "left": "project_panel::CollapseSelectedEntry",
-      "right": "project_panel::ExpandSelectedEntry",
-      "cmd-x": "project_panel::Cut",
-      "cmd-c": "project_panel::Copy",
-      "cmd-v": "project_panel::Paste",
-      "cmd-alt-c": "project_panel::CopyPath",
-      "alt-cmd-shift-c": "project_panel::CopyRelativePath",
-      "f2": "project_panel::Rename",
-      "backspace": "project_panel::Delete",
-      "alt-cmd-r": "project_panel::RevealInFinder"
-    }
-  },
-  {
-    "context": "Terminal",
-    "bindings": {
-      "ctrl-cmd-space": "terminal::ShowCharacterPalette",
-      "cmd-c": "terminal::Copy",
-      "cmd-v": "terminal::Paste",
-      "cmd-k": "terminal::Clear",
-      // Some nice conveniences
-      "cmd-backspace": [
-        "terminal::SendText",
-        "\u0015"
-      ],
-      "cmd-right": [
-        "terminal::SendText",
-        "\u0005"
-      ],
-      "cmd-left": [
-        "terminal::SendText",
-        "\u0001"
-      ],
-      // Terminal.app compatability
-      "alt-left": [
-        "terminal::SendText",
-        "\u001bb"
-      ],
-      "alt-right": [
-        "terminal::SendText",
-        "\u001bf"
-      ],
-      // There are conflicting bindings for these keys in the global context.
-      // these bindings override them, remove at your own risk:
-      "up": [
-        "terminal::SendKeystroke",
-        "up"
-      ],
-      "pageup": [
-        "terminal::SendKeystroke",
-        "pageup"
-      ],
-      "down": [
-        "terminal::SendKeystroke",
-        "down"
-      ],
-      "pagedown": [
-        "terminal::SendKeystroke",
-        "pagedown"
-      ],
-      "escape": [
-        "terminal::SendKeystroke",
-        "escape"
-      ],
-      "enter": [
-        "terminal::SendKeystroke",
-        "enter"
-      ],
-      "ctrl-c": [
-        "terminal::SendKeystroke",
-        "ctrl-c"
-      ]
     }
-  }
 ]

crates/gpui/src/app.rs 🔗

@@ -3816,6 +3816,12 @@ impl<T> PartialEq for ViewHandle<T> {
     }
 }
 
+impl<T> PartialEq<AnyViewHandle> for ViewHandle<T> {
+    fn eq(&self, other: &AnyViewHandle) -> bool {
+        self.window_id == other.window_id && self.view_id == other.view_id
+    }
+}
+
 impl<T> PartialEq<WeakViewHandle<T>> for ViewHandle<T> {
     fn eq(&self, other: &WeakViewHandle<T>) -> bool {
         self.window_id == other.window_id && self.view_id == other.view_id

crates/gpui/src/elements.rs 🔗

@@ -33,8 +33,11 @@ use crate::{
         rect::RectF,
         vector::{vec2f, Vector2F},
     },
-    json, Action, LayoutContext, SceneBuilder, SizeConstraint, View, ViewContext, WeakViewHandle,
-    WindowContext,
+    json,
+    platform::MouseButton,
+    scene::MouseDown,
+    Action, EventContext, LayoutContext, SceneBuilder, SizeConstraint, View, ViewContext,
+    WeakViewHandle, WindowContext,
 };
 use anyhow::{anyhow, Result};
 use collections::HashMap;
@@ -198,6 +201,13 @@ pub trait Element<V: View>: 'static {
     {
         Resizable::new(self.into_any(), side, size, on_resize)
     }
+
+    fn mouse<Tag>(self, region_id: usize) -> MouseEventHandler<Tag, V>
+    where
+        Self: Sized,
+    {
+        MouseEventHandler::for_child(self.into_any(), region_id)
+    }
 }
 
 trait AnyElementState<V: View> {

crates/gpui/src/elements/mouse_event_handler.rs 🔗

@@ -32,10 +32,25 @@ pub struct MouseEventHandler<Tag: 'static, V: View> {
 /// Element which provides a render_child callback with a MouseState and paints a mouse
 /// region under (or above) it for easy mouse event handling.
 impl<Tag, V: View> MouseEventHandler<Tag, V> {
-    pub fn new<D, F>(region_id: usize, cx: &mut ViewContext<V>, render_child: F) -> Self
+    pub fn for_child(child: impl Element<V>, region_id: usize) -> Self {
+        Self {
+            child: child.into_any(),
+            region_id,
+            cursor_style: None,
+            handlers: Default::default(),
+            notify_on_hover: false,
+            notify_on_click: false,
+            hoverable: false,
+            above: false,
+            padding: Default::default(),
+            _tag: PhantomData,
+        }
+    }
+
+    pub fn new<E, F>(region_id: usize, cx: &mut ViewContext<V>, render_child: F) -> Self
     where
-        D: Element<V>,
-        F: FnOnce(&mut MouseState, &mut ViewContext<V>) -> D,
+        E: Element<V>,
+        F: FnOnce(&mut MouseState, &mut ViewContext<V>) -> E,
     {
         let mut mouse_state = cx.mouse_state::<Tag>(region_id);
         let child = render_child(&mut mouse_state, cx).into_any();

crates/theme/src/theme.rs 🔗

@@ -68,6 +68,8 @@ pub struct Workspace {
     pub breadcrumbs: Interactive<ContainedText>,
     pub disconnected_overlay: ContainedText,
     pub modal: ContainerStyle,
+    pub zoomed_foreground: ContainerStyle,
+    pub zoomed_background: ContainerStyle,
     pub notification: ContainerStyle,
     pub notifications: Notifications,
     pub joining_project_avatar: ImageStyle,

crates/workspace/src/pane.rs 🔗

@@ -69,6 +69,7 @@ actions!(
         SplitUp,
         SplitRight,
         SplitDown,
+        ToggleZoom,
     ]
 );
 
@@ -91,6 +92,7 @@ const MAX_NAVIGATION_HISTORY_LEN: usize = 1024;
 pub type BackgroundActions = fn() -> &'static [(&'static str, &'static dyn Action)];
 
 pub fn init(cx: &mut AppContext) {
+    cx.add_action(Pane::toggle_zoom);
     cx.add_action(|pane: &mut Pane, action: &ActivateItem, cx| {
         pane.activate_item(action.0, true, true, cx);
     });
@@ -132,12 +134,15 @@ pub enum Event {
     Split(SplitDirection),
     ChangeItemTitle,
     Focus,
+    ZoomIn,
+    ZoomOut,
 }
 
 pub struct Pane {
     items: Vec<Box<dyn ItemHandle>>,
     activation_history: Vec<usize>,
     is_active: bool,
+    zoomed: bool,
     active_item_index: usize,
     last_focused_view_by_item: HashMap<usize, AnyWeakViewHandle>,
     autoscroll: bool,
@@ -236,6 +241,7 @@ impl Pane {
             items: Vec::new(),
             activation_history: Vec::new(),
             is_active: true,
+            zoomed: false,
             active_item_index: 0,
             last_focused_view_by_item: Default::default(),
             autoscroll: false,
@@ -655,6 +661,14 @@ impl Pane {
         self.items.iter().position(|i| i.id() == item.id())
     }
 
+    pub fn toggle_zoom(&mut self, _: &ToggleZoom, cx: &mut ViewContext<Self>) {
+        if self.zoomed {
+            cx.emit(Event::ZoomOut);
+        } else {
+            cx.emit(Event::ZoomIn);
+        }
+    }
+
     pub fn activate_item(
         &mut self,
         index: usize,
@@ -1546,6 +1560,15 @@ impl Pane {
             .with_background_color(background)
             .into_any()
     }
+
+    pub fn set_zoomed(&mut self, zoomed: bool, cx: &mut ViewContext<Self>) {
+        self.zoomed = zoomed;
+        cx.notify();
+    }
+
+    pub fn is_zoomed(&self) -> bool {
+        self.zoomed
+    }
 }
 
 impl Entity for Pane {

crates/workspace/src/pane_group.rs 🔗

@@ -142,6 +142,12 @@ impl Member {
 
         match self {
             Member::Pane(pane) => {
+                let pane_element = if pane.read(cx).is_zoomed() {
+                    Empty::new().into_any()
+                } else {
+                    ChildView::new(pane, cx).into_any()
+                };
+
                 let leader = follower_states
                     .iter()
                     .find_map(|(leader_id, follower_states)| {
@@ -258,7 +264,7 @@ impl Member {
                 };
 
                 Stack::new()
-                    .with_child(ChildView::new(pane, cx).contained().with_border(border))
+                    .with_child(pane_element.contained().with_border(border))
                     .with_children(leader_status_box)
                     .into_any()
             }

crates/workspace/src/workspace.rs 🔗

@@ -441,6 +441,7 @@ pub struct Workspace {
     weak_self: WeakViewHandle<Self>,
     remote_entity_subscription: Option<client::Subscription>,
     modal: Option<AnyViewHandle>,
+    zoomed: Option<AnyViewHandle>,
     center: PaneGroup,
     left_dock: ViewHandle<Dock>,
     bottom_dock: ViewHandle<Dock>,
@@ -627,8 +628,9 @@ impl Workspace {
         ];
 
         let mut this = Workspace {
-            modal: None,
             weak_self: weak_handle.clone(),
+            modal: None,
+            zoomed: None,
             center: PaneGroup::new(center_pane.clone()),
             panes: vec![center_pane.clone()],
             panes_by_item: Default::default(),
@@ -1303,6 +1305,16 @@ impl Workspace {
         }
     }
 
+    pub fn zoom_in(&mut self, view: AnyViewHandle, cx: &mut ViewContext<Self>) {
+        self.zoomed = Some(view);
+        cx.notify();
+    }
+
+    pub fn zoom_out(&mut self, cx: &mut ViewContext<Self>) {
+        self.zoomed.take();
+        cx.notify();
+    }
+
     pub fn items<'a>(
         &'a self,
         cx: &'a AppContext,
@@ -1685,6 +1697,16 @@ impl Workspace {
             pane::Event::Focus => {
                 self.handle_pane_focused(pane.clone(), cx);
             }
+            pane::Event::ZoomIn => {
+                pane.update(cx, |pane, cx| pane.set_zoomed(true, cx));
+                self.zoom_in(pane.into_any(), cx);
+            }
+            pane::Event::ZoomOut => {
+                if self.zoomed.as_ref().map_or(false, |zoomed| *zoomed == pane) {
+                    pane.update(cx, |pane, cx| pane.set_zoomed(false, cx));
+                    self.zoom_out(cx);
+                }
+            }
         }
 
         self.serialize_workspace(cx);
@@ -2735,6 +2757,21 @@ impl View for Workspace {
                             })
                             .with_child(Overlay::new(
                                 Stack::new()
+                                    .with_children(self.zoomed.as_ref().map(|zoomed| {
+                                        enum ZoomBackground {}
+
+                                        ChildView::new(zoomed, cx)
+                                            .contained()
+                                            .with_style(theme.workspace.zoomed_foreground)
+                                            .aligned()
+                                            .contained()
+                                            .with_style(theme.workspace.zoomed_background)
+                                            .mouse::<ZoomBackground>(0)
+                                            .capture_all()
+                                            .on_down(MouseButton::Left, |_, this: &mut Self, cx| {
+                                                this.zoom_out(cx);
+                                            })
+                                    }))
                                     .with_children(self.modal.as_ref().map(|modal| {
                                         ChildView::new(modal, cx)
                                             .contained()

styles/src/styleTree/workspace.ts 🔗

@@ -118,6 +118,15 @@ export default function workspace(colorScheme: ColorScheme) {
             },
             cursor: "Arrow",
         },
+        zoomedBackground: {
+            padding: 10,
+            cursor: "Arrow",
+            background: withOpacity(background(colorScheme.lowest), 0.5)
+        },
+        zoomedForeground: {
+            shadow: colorScheme.modalShadow,
+            border: border(colorScheme.highest, { overlay: true }),
+        },
         dock: {
             initialSize: 240,
             border: border(layer, { left: true, right: true }),