From 1b1755240db1ca01cbe1371a5b4ac58b68615382 Mon Sep 17 00:00:00 2001 From: Gabriel Dinner-David <82682503+gabydd@users.noreply.github.com> Date: Sat, 31 Dec 2022 07:23:55 -0700 Subject: [PATCH] fix(commands): extend_line to proper line when count and current line selected (#5288) --- helix-term/src/commands.rs | 19 ++++++-------- helix-term/tests/test/commands.rs | 43 +++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 7ee1d77c5..09c2e5df9 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -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())), + ), } }; diff --git a/helix-term/tests/test/commands.rs b/helix-term/tests/test/commands.rs index 95bd95b73..6e7275f5e 100644 --- a/helix-term/tests/test/commands.rs +++ b/helix-term/tests/test/commands.rs @@ -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(()) +}