vim: Fix cursor shape after deactivation (#42834)

Update the `Vim.deactivate` method to ensure that the cursor shape is
reset to the one available in the user's settings, in the `cursor_shape`
setting, instead of simply defaulting to `CursorShape::Bar`.

In order to test this behavior, the `Editor.cursor_shape` method was
also introduced.

Release Notes:

- Fixed the cursor shape reset in vim mode deactivation, ensuring that
the user's `cursor_shape` setting is used

---------

Co-authored-by: dino <dinojoaocosta@gmail.com>
This commit is contained in:
Lennart
2025-11-24 21:31:20 +00:00
committed by GitHub
co-authored by dino
parent 342eba6f22
commit 769464762a
3 changed files with 35 additions and 2 deletions
+4
View File
@@ -3025,6 +3025,10 @@ impl Editor {
cx.notify();
}
pub fn cursor_shape(&self) -> CursorShape {
self.cursor_shape
}
pub fn set_current_line_highlight(
&mut self,
current_line_highlight: Option<CurrentLineHighlight>,
+25 -1
View File
@@ -16,7 +16,7 @@ use editor::{
use futures::StreamExt;
use gpui::{KeyBinding, Modifiers, MouseButton, TestAppContext, px};
use itertools::Itertools;
use language::{Language, LanguageConfig, Point};
use language::{CursorShape, Language, LanguageConfig, Point};
pub use neovim_backed_test_context::*;
use settings::SettingsStore;
use ui::Pixels;
@@ -2404,3 +2404,27 @@ async fn test_repeat_grouping_41735(cx: &mut gpui::TestAppContext) {
cx.simulate_shared_keystrokes("u").await;
cx.shared_state().await.assert_eq("ˇaaa");
}
#[gpui::test]
async fn test_deactivate(cx: &mut gpui::TestAppContext) {
let mut cx = VimTestContext::new(cx, true).await;
cx.update_global(|store: &mut SettingsStore, cx| {
store.update_user_settings(cx, |settings| {
settings.editor.cursor_shape = Some(settings::CursorShape::Underline);
});
});
// Assert that, while in `Normal` mode, the cursor shape is `Block` but,
// after deactivating vim mode, it should revert to the one specified in the
// user's settings, if set.
cx.update_editor(|editor, _window, _cx| {
assert_eq!(editor.cursor_shape(), CursorShape::Block);
});
cx.disable_vim();
cx.update_editor(|editor, _window, _cx| {
assert_eq!(editor.cursor_shape(), CursorShape::Underline);
});
}
+6 -1
View File
@@ -954,7 +954,12 @@ impl Vim {
}
fn deactivate(editor: &mut Editor, cx: &mut Context<Editor>) {
editor.set_cursor_shape(CursorShape::Bar, cx);
editor.set_cursor_shape(
EditorSettings::get_global(cx)
.cursor_shape
.unwrap_or_default(),
cx,
);
editor.set_clip_at_line_ends(false, cx);
editor.set_collapse_matches(false);
editor.set_input_enabled(true);