vim: Fix LineUp (#27754)
Closes #27423 Release Notes: - vim: Fixed cursor scrolling off screen with `ctrl-y`. --------- Co-authored-by: Ben Kunkle <ben@zed.dev>
This commit is contained in:
parent
bb0b2a5b7b
commit
2b277123be
3 changed files with 67 additions and 5 deletions
|
@ -132,7 +132,15 @@ fn scroll_editor(
|
||||||
let max_visible_row = top.row().0.saturating_add(
|
let max_visible_row = top.row().0.saturating_add(
|
||||||
(visible_line_count as u32).saturating_sub(1 + vertical_scroll_margin),
|
(visible_line_count as u32).saturating_sub(1 + vertical_scroll_margin),
|
||||||
);
|
);
|
||||||
let max_row = DisplayRow(map.max_point().row().0.max(max_visible_row));
|
// scroll off the end.
|
||||||
|
let max_row = if top.row().0 + visible_line_count as u32 >= map.max_point().row().0 {
|
||||||
|
map.max_point().row()
|
||||||
|
} else {
|
||||||
|
DisplayRow(
|
||||||
|
(top.row().0 + visible_line_count as u32)
|
||||||
|
.saturating_sub(1 + vertical_scroll_margin),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
let new_row = if full_page_up {
|
let new_row = if full_page_up {
|
||||||
// Special-casing ctrl-b/page-up, which is special-cased by Vim, it seems
|
// Special-casing ctrl-b/page-up, which is special-cased by Vim, it seems
|
||||||
|
@ -372,14 +380,14 @@ mod test {
|
||||||
let mut cx = NeovimBackedTestContext::new(cx).await;
|
let mut cx = NeovimBackedTestContext::new(cx).await;
|
||||||
|
|
||||||
cx.set_scroll_height(10).await;
|
cx.set_scroll_height(10).await;
|
||||||
cx.neovim.set_option(&format!("scrolloff={}", 0)).await;
|
|
||||||
|
|
||||||
let content = "ˇ".to_owned() + &sample_text(26, 2, 'a');
|
let content = "ˇ".to_owned() + &sample_text(26, 2, 'a');
|
||||||
cx.set_shared_state(&content).await;
|
cx.set_shared_state(&content).await;
|
||||||
|
|
||||||
cx.update_global(|store: &mut SettingsStore, cx| {
|
cx.update_global(|store: &mut SettingsStore, cx| {
|
||||||
store.update_user_settings::<EditorSettings>(cx, |s| {
|
store.update_user_settings::<EditorSettings>(cx, |s| {
|
||||||
s.scroll_beyond_last_line = Some(ScrollBeyondLastLine::Off)
|
s.scroll_beyond_last_line = Some(ScrollBeyondLastLine::Off);
|
||||||
|
// s.vertical_scroll_margin = Some(0.);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -395,4 +403,24 @@ mod test {
|
||||||
cx.simulate_shared_keystrokes("ctrl-u").await;
|
cx.simulate_shared_keystrokes("ctrl-u").await;
|
||||||
cx.shared_state().await.assert_matches();
|
cx.shared_state().await.assert_matches();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
async fn test_ctrl_y_e(cx: &mut gpui::TestAppContext) {
|
||||||
|
let mut cx = NeovimBackedTestContext::new(cx).await;
|
||||||
|
|
||||||
|
cx.set_scroll_height(10).await;
|
||||||
|
|
||||||
|
let content = "ˇ".to_owned() + &sample_text(26, 2, 'a');
|
||||||
|
cx.set_shared_state(&content).await;
|
||||||
|
|
||||||
|
for _ in 0..8 {
|
||||||
|
cx.simulate_shared_keystrokes("ctrl-e").await;
|
||||||
|
cx.shared_state().await.assert_matches();
|
||||||
|
}
|
||||||
|
|
||||||
|
for _ in 0..8 {
|
||||||
|
cx.simulate_shared_keystrokes("ctrl-y").await;
|
||||||
|
cx.shared_state().await.assert_matches();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
35
crates/vim/test_data/test_ctrl_y_e.json
Normal file
35
crates/vim/test_data/test_ctrl_y_e.json
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{"SetOption":{"value":"scrolloff=3"}}
|
||||||
|
{"SetOption":{"value":"lines=12"}}
|
||||||
|
{"Put":{"state":"ˇaa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nˇee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nˇff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\nˇgg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nˇhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nˇii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\nˇjj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nˇkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-e"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nˇll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nˇll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nˇll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nˇll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nˇkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\nˇjj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nˇii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nˇhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
{"Key":"ctrl-y"}
|
||||||
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\nˇgg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
|
@ -1,6 +1,5 @@
|
||||||
{"SetOption":{"value":"scrolloff=3"}}
|
{"SetOption":{"value":"scrolloff=3"}}
|
||||||
{"SetOption":{"value":"lines=12"}}
|
{"SetOption":{"value":"lines=12"}}
|
||||||
{"SetOption":{"value":"scrolloff=0"}}
|
|
||||||
{"Put":{"state":"ˇaa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz"}}
|
{"Put":{"state":"ˇaa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz"}}
|
||||||
{"Key":"shift-g"}
|
{"Key":"shift-g"}
|
||||||
{"Key":"k"}
|
{"Key":"k"}
|
||||||
|
@ -10,4 +9,4 @@
|
||||||
{"Key":"shift-g"}
|
{"Key":"shift-g"}
|
||||||
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nˇzz","mode":"Normal"}}
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nˇzz","mode":"Normal"}}
|
||||||
{"Key":"ctrl-u"}
|
{"Key":"ctrl-u"}
|
||||||
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nrr\nss\ntt\nˇuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
{"Get":{"state":"aa\nbb\ncc\ndd\nee\nff\ngg\nhh\nii\njj\nkk\nll\nmm\nnn\noo\npp\nqq\nˇrr\nss\ntt\nuu\nvv\nww\nxx\nyy\nzz","mode":"Normal"}}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue