fix(commands): extend_line to proper line when count and current line selected (#5288)
This commit is contained in:
parent
c9ed42cdec
commit
1b1755240d
2 changed files with 51 additions and 11 deletions
|
@ -2053,16 +2053,10 @@ fn extend_line_impl(cx: &mut Context, extend: Extend) {
|
|||
let selection = doc.selection(view.id).clone().transform(|range| {
|
||||
let (start_line, end_line) = range.line_range(text.slice(..));
|
||||
|
||||
let start = text.line_to_char(match extend {
|
||||
Extend::Above => start_line.saturating_sub(count - 1),
|
||||
Extend::Below => start_line,
|
||||
});
|
||||
let start = text.line_to_char(start_line);
|
||||
let end = text.line_to_char(
|
||||
match extend {
|
||||
Extend::Above => end_line + 1, // the start of next line
|
||||
Extend::Below => end_line + count,
|
||||
}
|
||||
.min(text.len_lines()),
|
||||
(end_line + 1) // newline of end_line
|
||||
.min(text.len_lines()),
|
||||
);
|
||||
|
||||
// extend to previous/next line if current line is selected
|
||||
|
@ -2076,8 +2070,11 @@ fn extend_line_impl(cx: &mut Context, extend: Extend) {
|
|||
}
|
||||
} else {
|
||||
match extend {
|
||||
Extend::Above => (end, start),
|
||||
Extend::Below => (start, end),
|
||||
Extend::Above => (end, text.line_to_char(start_line.saturating_sub(count - 1))),
|
||||
Extend::Below => (
|
||||
start,
|
||||
text.line_to_char((end_line + count).min(text.len_lines())),
|
||||
),
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -311,3 +311,46 @@ async fn test_undo_redo() -> anyhow::Result<()> {
|
|||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "multi_thread")]
|
||||
async fn test_extend_line() -> anyhow::Result<()> {
|
||||
// extend with line selected then count
|
||||
test((
|
||||
platform_line(indoc! {"\
|
||||
#[l|]#orem
|
||||
ipsum
|
||||
dolor
|
||||
|
||||
"})
|
||||
.as_str(),
|
||||
"x2x",
|
||||
platform_line(indoc! {"\
|
||||
#[lorem
|
||||
ipsum
|
||||
dolor
|
||||
|]#
|
||||
"})
|
||||
.as_str(),
|
||||
))
|
||||
.await?;
|
||||
|
||||
// extend with count on partial selection
|
||||
test((
|
||||
platform_line(indoc! {"\
|
||||
#[l|]#orem
|
||||
ipsum
|
||||
|
||||
"})
|
||||
.as_str(),
|
||||
"2x",
|
||||
platform_line(indoc! {"\
|
||||
#[lorem
|
||||
ipsum
|
||||
|]#
|
||||
"})
|
||||
.as_str(),
|
||||
))
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue