diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 7ee1d77c..09c2e5df 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 95bd95b7..6e7275f5 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(()) +}