Span across soft-wraps when triple clicking a line

Nathan Sobo and Antonio Scandurra created

Co-Authored-By: Antonio Scandurra <me@as-cii.com>

Change summary

crates/editor/src/editor.rs | 52 ++++++++++++++++++++------------------
1 file changed, 27 insertions(+), 25 deletions(-)

Detailed changes

crates/editor/src/editor.rs 🔗

@@ -968,15 +968,16 @@ impl Editor {
                 mode = SelectMode::Word(start.clone()..end.clone());
             }
             3 => {
-                let position = display_map.clip_point(position, Bias::Left);
-                let line_start = movement::line_beginning(&display_map, position, false);
-                let mut next_line_start = line_start.clone();
-                *next_line_start.row_mut() += 1;
-                *next_line_start.column_mut() = 0;
-                next_line_start = display_map.clip_point(next_line_start, Bias::Right);
-
-                start = buffer.anchor_before(line_start.to_point(&display_map));
-                end = buffer.anchor_before(next_line_start.to_point(&display_map));
+                let position = display_map
+                    .clip_point(position, Bias::Left)
+                    .to_point(&display_map);
+                let line_start = display_map.prev_line_boundary(position).0;
+                let next_line_start = buffer.clip_point(
+                    display_map.next_line_boundary(position).0 + Point::new(1, 0),
+                    Bias::Left,
+                );
+                start = buffer.anchor_before(line_start);
+                end = buffer.anchor_before(next_line_start);
                 mode = SelectMode::Line(start.clone()..end.clone());
             }
             _ => {
@@ -1082,26 +1083,27 @@ impl Editor {
                     }
                 }
                 SelectMode::Line(original_range) => {
-                    let original_display_range = original_range.start.to_display_point(&display_map)
-                        ..original_range.end.to_display_point(&display_map);
-                    let original_buffer_range = original_display_range.start.to_point(&display_map)
-                        ..original_display_range.end.to_point(&display_map);
-                    let line_start = movement::line_beginning(&display_map, position, false);
-                    let mut next_line_start = line_start.clone();
-                    *next_line_start.row_mut() += 1;
-                    *next_line_start.column_mut() = 0;
-                    next_line_start = display_map.clip_point(next_line_start, Bias::Right);
-
-                    if line_start < original_display_range.start {
-                        head = line_start.to_point(&display_map);
+                    let original_range = original_range.to_point(&display_map.buffer_snapshot);
+
+                    let position = display_map
+                        .clip_point(position, Bias::Left)
+                        .to_point(&display_map);
+                    let line_start = display_map.prev_line_boundary(position).0;
+                    let next_line_start = buffer.clip_point(
+                        display_map.next_line_boundary(position).0 + Point::new(1, 0),
+                        Bias::Left,
+                    );
+
+                    if line_start < original_range.start {
+                        head = line_start
                     } else {
-                        head = next_line_start.to_point(&display_map);
+                        head = next_line_start
                     }
 
-                    if head <= original_buffer_range.start {
-                        tail = original_buffer_range.end;
+                    if head <= original_range.start {
+                        tail = original_range.end;
                     } else {
-                        tail = original_buffer_range.start;
+                        tail = original_range.start;
                     }
                 }
                 SelectMode::All => {