Don't manipulate selections when syncing options if vim-mode is disabled

Antonio Scandurra created

Previously, we were always mutating selections when `sync_editor_options`
was called. This seems to happen every time vim is enabled/disabled, but also
when vim is disabled and editors are simply focused/blurred.

This commit changes it so that we only manipulate selections when vim-mode is active.

Change summary

crates/vim/src/vim.rs | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)

Detailed changes

crates/vim/src/vim.rs 🔗

@@ -143,6 +143,17 @@ impl Vim {
                             matches!(state.mode, Mode::Visual { line: true });
                         let context_layer = state.keymap_context_layer();
                         editor.set_keymap_context_layer::<Self>(context_layer);
+                        editor.change_selections(None, cx, |s| {
+                            s.move_with(|map, selection| {
+                                selection.set_head(
+                                    map.clip_point(selection.head(), Bias::Left),
+                                    selection.goal,
+                                );
+                                if state.empty_selections_only() {
+                                    selection.collapse_to(selection.head(), selection.goal)
+                                }
+                            });
+                        })
                     } else {
                         editor.set_cursor_shape(CursorShape::Bar, cx);
                         editor.set_clip_at_line_ends(false, cx);
@@ -150,18 +161,6 @@ impl Vim {
                         editor.selections.line_mode = false;
                         editor.remove_keymap_context_layer::<Self>();
                     }
-
-                    editor.change_selections(None, cx, |s| {
-                        s.move_with(|map, selection| {
-                            selection.set_head(
-                                map.clip_point(selection.head(), Bias::Left),
-                                selection.goal,
-                            );
-                            if self.enabled && state.empty_selections_only() {
-                                selection.collapse_to(selection.head(), selection.goal)
-                            }
-                        });
-                    })
                 });
             }
         }
@@ -191,6 +190,14 @@ mod test {
         cx.simulate_keystrokes(["h", "j", "k", "l"]);
         cx.assert_editor_state("hjkl|");
 
+        // Selections aren't changed if editor is blurred but vim-mode is still disabled.
+        cx.set_state("[hjkl}", Mode::Normal);
+        cx.assert_editor_state("[hjkl}");
+        cx.update_editor(|_, cx| cx.blur());
+        cx.assert_editor_state("[hjkl}");
+        cx.update_editor(|_, cx| cx.focus_self());
+        cx.assert_editor_state("[hjkl}");
+
         // Enabling dynamically sets vim mode again and restores normal mode
         cx.enable_vim();
         assert_eq!(cx.mode(), Mode::Normal);