From 8dc91973249c2ebb761ed5fb42fb08ddd4adc6e4 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Mon, 3 Jan 2022 16:06:35 +0100 Subject: [PATCH] Position cursors correctly in `Editor::delete_line` in a multi-buffer --- crates/editor/src/editor.rs | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index d626f28e7cd974aa0800d452c1549650b830fc5a..16334f3016f368bd42e6c456d3c17aba0a251c38 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -1564,7 +1564,6 @@ impl Editor { let display_map = self.display_map.update(cx, |map, cx| map.snapshot(cx)); let buffer = self.buffer.read(cx).snapshot(cx); - let mut row_delta = 0; let mut new_cursors = Vec::new(); let mut edit_ranges = Vec::new(); let mut selections = selections.iter().peekable(); @@ -1590,7 +1589,7 @@ impl Editor { // If there's a line after the range, delete the \n from the end of the row range // and position the cursor on the next line. edit_end = Point::new(rows.end, 0).to_offset(&buffer); - cursor_buffer_row = rows.start; + cursor_buffer_row = rows.end; } else { // If there isn't a line after the range, delete the \n from the line before the // start of the row range and position the cursor there. @@ -1599,29 +1598,35 @@ impl Editor { cursor_buffer_row = rows.start.saturating_sub(1); } - let mut cursor = - Point::new(cursor_buffer_row - row_delta, 0).to_display_point(&display_map); + let mut cursor = Point::new(cursor_buffer_row, 0).to_display_point(&display_map); *cursor.column_mut() = cmp::min(goal_display_column, display_map.line_len(cursor.row())); - row_delta += rows.len() as u32; - new_cursors.push((selection.id, cursor.to_point(&display_map))); + new_cursors.push(( + selection.id, + buffer.anchor_after(cursor.to_point(&display_map)), + )); edit_ranges.push(edit_start..edit_end); } - new_cursors.sort_unstable_by_key(|(_, point)| point.clone()); + new_cursors.sort_unstable_by(|a, b| a.1.cmp(&b.1, &buffer).unwrap()); + let buffer = self.buffer.update(cx, |buffer, cx| { + buffer.edit(edit_ranges, "", cx); + buffer.snapshot(cx) + }); let new_selections = new_cursors .into_iter() - .map(|(id, cursor)| Selection { - id, - start: cursor, - end: cursor, - reversed: false, - goal: SelectionGoal::None, + .map(|(id, cursor)| { + let cursor = cursor.to_point(&buffer); + Selection { + id, + start: cursor, + end: cursor, + reversed: false, + goal: SelectionGoal::None, + } }) .collect(); - self.buffer - .update(cx, |buffer, cx| buffer.edit(edit_ranges, "", cx)); self.update_selections(new_selections, Some(Autoscroll::Fit), cx); self.end_transaction(cx); }