@@ -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(