Add support for `editor::SwapSelectionEnds` everywhere (emacs exchange-point-and-mark) (#23428)

Peter Tripp created

Add `editor:: SwapSelectionEnds ` action which swaps the cursor location from the beginning/end of a given selection.
Renamed from `editor::ExchangeMark` to `editor::SwapSelectionEnds`.
Unbound by default, bound to `ctrl-x ctrl-x` in Emacs keymap.

Change summary

assets/keymaps/linux/emacs.json |  2 +-
assets/keymaps/macos/emacs.json |  2 +-
crates/editor/src/actions.rs    |  2 +-
crates/editor/src/editor.rs     | 23 ++++++++++++-----------
crates/editor/src/element.rs    |  2 +-
5 files changed, 16 insertions(+), 15 deletions(-)

Detailed changes

assets/keymaps/linux/emacs.json 🔗

@@ -17,7 +17,7 @@
       "alt-g alt-g": "go_to_line::Toggle", // goto-line
       "ctrl-space": "editor::SetMark", // set-mark
       "ctrl-@": "editor::SetMark", // set-mark
-      "ctrl-x ctrl-x": "editor::ExchangeMark", // exchange-point-and-mark
+      "ctrl-x ctrl-x": "editor::SwapSelectionEnds", // exchange-point-and-mark
       "ctrl-f": "editor::MoveRight", // forward-char
       "ctrl-b": "editor::MoveLeft", // backward-char
       "ctrl-n": "editor::MoveDown", // next-line

assets/keymaps/macos/emacs.json 🔗

@@ -17,7 +17,7 @@
       "alt-g alt-g": "go_to_line::Toggle", // goto-line
       "ctrl-space": "editor::SetMark", // set-mark
       "ctrl-@": "editor::SetMark", // set-mark
-      "ctrl-x ctrl-x": "editor::ExchangeMark", // exchange-point-and-mark
+      "ctrl-x ctrl-x": "editor::SwapSelectionEnds", // exchange-point-and-mark
       "ctrl-f": "editor::MoveRight", // forward-char
       "ctrl-b": "editor::MoveLeft", // backward-char
       "ctrl-n": "editor::MoveDown", // next-line

crates/editor/src/actions.rs 🔗

@@ -377,7 +377,7 @@ gpui::actions!(
         ToggleInlayHints,
         ToggleInlineCompletions,
         ToggleLineNumbers,
-        ExchangeMark,
+        SwapSelectionEnds,
         SetMark,
         ToggleRelativeLineNumbers,
         ToggleSelectionMenu,

crates/editor/src/editor.rs 🔗

@@ -10633,17 +10633,18 @@ impl Editor {
         cx.notify();
     }
 
-    pub fn exchange_mark(&mut self, _: &actions::ExchangeMark, cx: &mut ViewContext<Self>) {
-        if self.selection_mark_mode {
-            self.change_selections(None, cx, |s| {
-                s.move_with(|_, sel| {
-                    if sel.start != sel.end {
-                        sel.reversed = !sel.reversed
-                    }
-                });
-            })
-        }
-        self.selection_mark_mode = true;
+    pub fn swap_selection_ends(
+        &mut self,
+        _: &actions::SwapSelectionEnds,
+        cx: &mut ViewContext<Self>,
+    ) {
+        self.change_selections(None, cx, |s| {
+            s.move_with(|_, sel| {
+                if sel.start != sel.end {
+                    sel.reversed = !sel.reversed
+                }
+            });
+        });
         cx.notify();
     }
 

crates/editor/src/element.rs 🔗

@@ -357,7 +357,7 @@ impl EditorElement {
         register_action(view, cx, Editor::unfold_at);
         register_action(view, cx, Editor::fold_selected_ranges);
         register_action(view, cx, Editor::set_mark);
-        register_action(view, cx, Editor::exchange_mark);
+        register_action(view, cx, Editor::swap_selection_ends);
         register_action(view, cx, Editor::show_completions);
         register_action(view, cx, Editor::toggle_code_actions);
         register_action(view, cx, Editor::open_excerpts);