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.
pull/5933/head
Mike Trinkala 2 years ago committed by GitHub
parent 7ebcf4e919
commit 9d73a0d112
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -1617,6 +1617,10 @@ fn copy_selection_on_line(cx: &mut Context, direction: Direction) {
sels += 1; sels += 1;
} }
if anchor_row == 0 && head_row == 0 {
break;
}
i += 1; i += 1;
} }
} }

@ -132,6 +132,70 @@ async fn test_selection_duplication() -> anyhow::Result<()> {
.as_str(), .as_str(),
)) ))
.await?; .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(()) Ok(())
} }

Loading…
Cancel
Save