diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 77560c484b..fb95563eef 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -10155,11 +10155,19 @@ impl Editor { ..Point::new(row.0, buffer.line_len(row)), ); for row in start.row + 1..=end.row { + let mut line_len = buffer.line_len(MultiBufferRow(row)); + if row == end.row { + line_len = end.column; + } + if line_len == 0 { + trimmed_selections + .push(Point::new(row, 0)..Point::new(row, line_len)); + continue; + } let row_indent_size = buffer.indent_size_for_line(MultiBufferRow(row)); if row_indent_size.len >= first_indent.len { trimmed_selections.push( - Point::new(row, first_indent.len) - ..Point::new(row, buffer.line_len(MultiBufferRow(row))), + Point::new(row, first_indent.len)..Point::new(row, line_len), ); } else { trimmed_selections.clear(); diff --git a/crates/editor/src/editor_tests.rs b/crates/editor/src/editor_tests.rs index e67b7cc539..2696cb406e 100644 --- a/crates/editor/src/editor_tests.rs +++ b/crates/editor/src/editor_tests.rs @@ -5121,6 +5121,36 @@ if is_entire_line { ), "When selecting past the indent, nothing is trimmed" ); + + cx.set_state( + r#" «for selection in selections.iter() { + let mut start = selection.start; + + let mut end = selection.end; + let is_entire_line = selection.is_empty(); + if is_entire_line { + start = Point::new(start.row, 0); +ˇ» end = cmp::min(max_point, Point::new(end.row + 1, 0)); + } + "#, + ); + cx.update_editor(|e, window, cx| e.copy_and_trim(&CopyAndTrim, window, cx)); + assert_eq!( + cx.read_from_clipboard() + .and_then(|item| item.text().as_deref().map(str::to_string)), + Some( + "for selection in selections.iter() { +let mut start = selection.start; + +let mut end = selection.end; +let is_entire_line = selection.is_empty(); +if is_entire_line { + start = Point::new(start.row, 0); +" + .to_string() + ), + "Copying with stripping should ignore empty lines" + ); } #[gpui::test]