From aa12eb6b5567031f5ac2b19ab15ea5daf2607a45 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 4 Feb 2022 09:21:13 -0700 Subject: [PATCH] Span across soft-wraps when triple clicking a line Co-Authored-By: Antonio Scandurra --- crates/editor/src/editor.rs | 52 +++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index da6ea878acb61b8411d6ef8fffc6c52f9d5fca7e..8916b8ab52f42d7d2b2c625ef855ab0f8f4f572f 100644 --- a/crates/editor/src/editor.rs +++ b/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 => {