vim: Fix relative line motion
Before this change up and down were in display co-ordinates, after this change they are in fold coordinates (which matches the vim behaviour). To make this work without causing usabliity problems, a bunch of extra keyboard shortcuts now work: - vim: `z {o,c}` to open,close a fold - vim: `z f` to fold current visual selection - vim: `g {j,k,up,down}` to move up/down a display line - vim: `g {0,^,$,home,end}` to get to start/end of a display line Fixes: zed-industries/community#1562
This commit is contained in:
parent
0280d5d010
commit
20aa2a4c54
13 changed files with 580 additions and 67 deletions
|
@ -285,3 +285,145 @@ async fn test_word_characters(cx: &mut gpui::TestAppContext) {
|
|||
Mode::Visual,
|
||||
)
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
async fn test_wrapped_lines(cx: &mut gpui::TestAppContext) {
|
||||
let mut cx = NeovimBackedTestContext::new(cx).await;
|
||||
|
||||
cx.set_shared_wrap(12).await;
|
||||
// tests line wrap as follows:
|
||||
// 1: twelve char
|
||||
// twelve char
|
||||
// 2: twelve char
|
||||
cx.set_shared_state(indoc! { "
|
||||
tˇwelve char twelve char
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
cx.simulate_shared_keystrokes(["j"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
twelve char twelve char
|
||||
tˇwelve char
|
||||
"})
|
||||
.await;
|
||||
cx.simulate_shared_keystrokes(["k"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
tˇwelve char twelve char
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
cx.simulate_shared_keystrokes(["g", "j"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
twelve char tˇwelve char
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
cx.simulate_shared_keystrokes(["g", "j"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
twelve char twelve char
|
||||
tˇwelve char
|
||||
"})
|
||||
.await;
|
||||
|
||||
cx.simulate_shared_keystrokes(["g", "k"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
twelve char tˇwelve char
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
|
||||
cx.simulate_shared_keystrokes(["g", "^"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
twelve char ˇtwelve char
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
|
||||
cx.simulate_shared_keystrokes(["^"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
ˇtwelve char twelve char
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
|
||||
cx.simulate_shared_keystrokes(["g", "$"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
twelve charˇ twelve char
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
cx.simulate_shared_keystrokes(["$"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
twelve char twelve chaˇr
|
||||
twelve char
|
||||
"})
|
||||
.await;
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
async fn test_folds(cx: &mut gpui::TestAppContext) {
|
||||
let mut cx = NeovimBackedTestContext::new(cx).await;
|
||||
cx.set_neovim_option("foldmethod=manual").await;
|
||||
|
||||
cx.set_shared_state(indoc! { "
|
||||
fn boop() {
|
||||
ˇbarp()
|
||||
bazp()
|
||||
}
|
||||
"})
|
||||
.await;
|
||||
cx.simulate_shared_keystrokes(["shift-v", "j", "z", "f"])
|
||||
.await;
|
||||
|
||||
// visual display is now:
|
||||
// fn boop () {
|
||||
// [FOLDED]
|
||||
// }
|
||||
|
||||
// TODO: this should not be needed but currently zf does not
|
||||
// return to normal mode.
|
||||
cx.simulate_shared_keystrokes(["escape"]).await;
|
||||
|
||||
// skip over fold downward
|
||||
cx.simulate_shared_keystrokes(["g", "g"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
ˇfn boop() {
|
||||
barp()
|
||||
bazp()
|
||||
}
|
||||
"})
|
||||
.await;
|
||||
|
||||
cx.simulate_shared_keystrokes(["j", "j"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
fn boop() {
|
||||
barp()
|
||||
bazp()
|
||||
ˇ}
|
||||
"})
|
||||
.await;
|
||||
|
||||
// skip over fold upward
|
||||
cx.simulate_shared_keystrokes(["2", "k"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
ˇfn boop() {
|
||||
barp()
|
||||
bazp()
|
||||
}
|
||||
"})
|
||||
.await;
|
||||
|
||||
// yank the fold
|
||||
cx.simulate_shared_keystrokes(["down", "y", "y"]).await;
|
||||
cx.assert_shared_clipboard(" barp()\n bazp()\n").await;
|
||||
|
||||
// re-open
|
||||
cx.simulate_shared_keystrokes(["z", "o"]).await;
|
||||
cx.assert_shared_state(indoc! { "
|
||||
fn boop() {
|
||||
ˇ barp()
|
||||
bazp()
|
||||
}
|
||||
"})
|
||||
.await;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue