diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 1e91a8718139d08a95edc0d192fd25a7c75adbbf..3b78bff39142bcf5e7f5011599d50925e632ff4a 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -13272,13 +13272,14 @@ impl Editor { trimmed_selections.push(start..end); } + let is_multiline_trim = trimmed_selections.len() > 1; for trimmed_range in trimmed_selections { if is_first { is_first = false; - } else if !prev_selection_was_entire_line { + } else if is_multiline_trim || !prev_selection_was_entire_line { text += "\n"; } - prev_selection_was_entire_line = is_entire_line; + prev_selection_was_entire_line = is_entire_line && !is_multiline_trim; let mut len = 0; for chunk in buffer.text_for_range(trimmed_range.start..trimmed_range.end) { text.push_str(chunk); diff --git a/crates/editor/src/editor_tests.rs b/crates/editor/src/editor_tests.rs index 99572e2b5f77af7fa2f061051c0e5c3d6f0d539a..fe0169cabf0ebdc1246c23c0e2cff2b79feb9bf1 100644 --- a/crates/editor/src/editor_tests.rs +++ b/crates/editor/src/editor_tests.rs @@ -7612,6 +7612,25 @@ if is_entire_line { ); } +#[gpui::test] +async fn test_copy_trim_line_mode(cx: &mut TestAppContext) { + init_test(cx, |_| {}); + + let mut cx = EditorTestContext::new(cx).await; + + cx.set_state(indoc! {" + « a + bˇ» + "}); + cx.update_editor(|editor, _window, _cx| editor.selections.set_line_mode(true)); + cx.update_editor(|editor, window, cx| editor.copy_and_trim(&CopyAndTrim, window, cx)); + + assert_eq!( + cx.read_from_clipboard().and_then(|item| item.text()), + Some("a\nb\n".to_string()) + ); +} + #[gpui::test] async fn test_paste_multiline(cx: &mut TestAppContext) { init_test(cx, |_| {});