Fix the infinite loop when copying the cursor to the top of the file (#5888)
Example: ``` test testitem ``` Select line 2 with x, then type Alt-C; Helix will go into an infinite loop. The saturating_sub keeps the head_row and anchor_row pinned at 0, and a selection is never made since the first line is too short.
This commit is contained in:
parent
7ebcf4e919
commit
9d73a0d112
@ -1617,6 +1617,10 @@ fn copy_selection_on_line(cx: &mut Context, direction: Direction) {
|
||||
sels += 1;
|
||||
}
|
||||
|
||||
if anchor_row == 0 && head_row == 0 {
|
||||
break;
|
||||
}
|
||||
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
|
@ -132,6 +132,70 @@ async fn test_selection_duplication() -> anyhow::Result<()> {
|
||||
.as_str(),
|
||||
))
|
||||
.await?;
|
||||
|
||||
// Copy the selection to previous line, skipping the first line in the file
|
||||
test((
|
||||
platform_line(indoc! {"\
|
||||
test
|
||||
#[testitem|]#
|
||||
"})
|
||||
.as_str(),
|
||||
"<A-C>",
|
||||
platform_line(indoc! {"\
|
||||
test
|
||||
#[testitem|]#
|
||||
"})
|
||||
.as_str(),
|
||||
))
|
||||
.await?;
|
||||
|
||||
// Copy the selection to previous line, including the first line in the file
|
||||
test((
|
||||
platform_line(indoc! {"\
|
||||
test
|
||||
#[test|]#
|
||||
"})
|
||||
.as_str(),
|
||||
"<A-C>",
|
||||
platform_line(indoc! {"\
|
||||
#[test|]#
|
||||
#(test|)#
|
||||
"})
|
||||
.as_str(),
|
||||
))
|
||||
.await?;
|
||||
|
||||
// Copy the selection to next line, skipping the last line in the file
|
||||
test((
|
||||
platform_line(indoc! {"\
|
||||
#[testitem|]#
|
||||
test
|
||||
"})
|
||||
.as_str(),
|
||||
"C",
|
||||
platform_line(indoc! {"\
|
||||
#[testitem|]#
|
||||
test
|
||||
"})
|
||||
.as_str(),
|
||||
))
|
||||
.await?;
|
||||
|
||||
// Copy the selection to next line, including the last line in the file
|
||||
test((
|
||||
platform_line(indoc! {"\
|
||||
#[test|]#
|
||||
test
|
||||
"})
|
||||
.as_str(),
|
||||
"C",
|
||||
platform_line(indoc! {"\
|
||||
#(test|)#
|
||||
#[test|]#
|
||||
"})
|
||||
.as_str(),
|
||||
))
|
||||
.await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user