Clip anchors created on MultiBuffer's trailing newlines or headers

Antonio Scandurra created

Change summary

crates/editor/src/multi_buffer.rs | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)

Detailed changes

crates/editor/src/multi_buffer.rs 🔗

@@ -1080,9 +1080,14 @@ impl MultiBufferSnapshot {
         let mut cursor = self.excerpts.cursor::<(usize, Option<&ExcerptId>)>();
         cursor.seek(&offset, bias, &());
         if let Some(excerpt) = cursor.item() {
-            let overshoot =
-                (offset - cursor.start().0).saturating_sub(excerpt.header_height as usize);
+            let start_after_header = cursor.start().0 + excerpt.header_height as usize;
+            let mut end_before_newline = cursor.end(&()).0;
+            if excerpt.has_trailing_newline {
+                end_before_newline -= 1;
+            }
+
             let buffer_start = excerpt.range.start.to_offset(&excerpt.buffer);
+            let overshoot = cmp::min(offset, end_before_newline).saturating_sub(start_after_header);
             Anchor {
                 excerpt_id: excerpt.id.clone(),
                 text_anchor: excerpt.buffer.anchor_at(buffer_start + overshoot, bias),