mirror of https://github.com/helix-editor/helix
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
parent
7ebcf4e919
commit
9d73a0d112
|
@ -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…
Reference in New Issue