diff --git a/crates/vim/src/vim.rs b/crates/vim/src/vim.rs index a767f87d8dc161123b6ed3d215516fa766c43a56..b653f4198f937738f5f6e3bb9585b20918c13db7 100644 --- a/crates/vim/src/vim.rs +++ b/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::(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::(); } - - 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) - } - }); - }) }); } } @@ -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);