on master help sign in
respect line annotations in char_idx_at_visual_row_offset

char_idx_at_visual_row_offset asssumed that a single line/block break always corresponded to a vertical offset of 1. However conceal can hide the line break (in which case the certical offset would be 0) and line annotations (or softwrapped inlay hints at the end of the line) can insert addtional vertical lines. To correctly account for these cases we simply compute the visual offset of the start of the next block from the previous block instead of the visual offset of the block end. This means that the line breaks at the end of the block (however many there may be) are automatically included and we don't need to manually add 1 to the `row_offset` anymore.

commit2af14a24abbd8de510f69e6569c18601533dc912 authorPascal Kuthe <pascal.kuthe@semimod.de> dateWed 22 Mar 2023, 16:23 (4 years ago) parent9fac574
1 file changed+5−4
helix-core/src/position.rs+5−4
helix-core/src/position.rs+5−4
@@ -317,10 +317,11 @@ pub fn char_idx_at_visual_offset<'a>(
317317 text_fmt: &TextFormat,
318318 annotations: &TextAnnotations,
319319) -> (usize, usize) {
320+ let mut pos = anchor;
320321 // convert row relative to visual line containing anchor to row relative to a block containing anchor (anchor may change)
321322 loop {
322323 let (visual_pos_in_block, block_char_offset) =
323− visual_offset_from_block(text, anchor, anchor, text_fmt, annotations);
324+ visual_offset_from_block(text, anchor, pos, text_fmt, annotations);
324325 row_offset += visual_pos_in_block.row as isize;
325326 anchor = block_char_offset;
326327 if row_offset >= 0 {
@@ -332,10 +333,10 @@ pub fn char_idx_at_visual_offset<'a>(
332333 break;
333334 }
334335 // the row_offset is negative so we need to look at the previous block
335− // set the anchor to the last char before the current block
336− // this char index is also always a line earlier so increase the row_offset by 1
336+ // set the anchor to the last char before the current block so that we can compute
337+ // the distance of this block from the start of the previous block
338+ pos = anchor;
337339 anchor -= 1;
338− row_offset += 1;
339340 }
340341
341342 char_idx_at_visual_block_offset(