From 2bb8aa2f73362e7ee1c36bcef01769cc43421d0e Mon Sep 17 00:00:00 2001 From: Piotr Osiewicz <24362066+osiewicz@users.noreply.github.com> Date: Tue, 3 Jun 2025 09:41:45 +0200 Subject: [PATCH] go_to_line: Show position relative to current excerpt in a multi-buffer (#31947) Closes #31515 This PR explicitly leaves the behavior of go to line unspecified with multi-buffer. Release Notes: - Fixed wrong line number being shown in the status bar when in multi-buffer. --- crates/go_to_line/src/cursor_position.rs | 31 ++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/crates/go_to_line/src/cursor_position.rs b/crates/go_to_line/src/cursor_position.rs index 179b817329..322a791b13 100644 --- a/crates/go_to_line/src/cursor_position.rs +++ b/crates/go_to_line/src/cursor_position.rs @@ -39,15 +39,32 @@ pub struct UserCaretPosition { } impl UserCaretPosition { - pub fn at_selection_end(selection: &Selection, snapshot: &MultiBufferSnapshot) -> Self { + pub(crate) fn at_selection_end( + selection: &Selection, + snapshot: &MultiBufferSnapshot, + ) -> Self { let selection_end = selection.head(); - let line_start = Point::new(selection_end.row, 0); - let chars_to_last_position = snapshot - .text_summary_for_range::(line_start..selection_end) - .chars as u32; + let (line, character) = if let Some((buffer_snapshot, point, _)) = + snapshot.point_to_buffer_point(selection_end) + { + let line_start = Point::new(point.row, 0); + + let chars_to_last_position = buffer_snapshot + .text_summary_for_range::(line_start..point) + .chars as u32; + (line_start.row, chars_to_last_position) + } else { + let line_start = Point::new(selection_end.row, 0); + + let chars_to_last_position = snapshot + .text_summary_for_range::(line_start..selection_end) + .chars as u32; + (selection_end.row, chars_to_last_position) + }; + Self { - line: NonZeroU32::new(selection_end.row + 1).expect("added 1"), - character: NonZeroU32::new(chars_to_last_position + 1).expect("added 1"), + line: NonZeroU32::new(line + 1).expect("added 1"), + character: NonZeroU32::new(character + 1).expect("added 1"), } } }