@@ -1,8 +1,9 @@
1use crate::{
3use crate::{
2 chars::char_is_line_ending,
4 chars::char_is_line_ending,
3− graphemes::{ensure_grapheme_boundary_prev, RopeGraphemes},
5+ graphemes::{ensure_grapheme_boundary_prev, grapheme_width, RopeGraphemes},
4 line_ending::line_end_char_index,
6 line_ending::line_end_char_index,
5− unicode::width::UnicodeWidthChar,
@@ -77,14 +78,17 @@ pub fn visual_coords_at_pos(text: RopeSlice, pos: usize, tab_width: usize) -> Po
78 let line_start = text.line_to_char(line);
79 let line_start = text.line_to_char(line);
79 let pos = ensure_grapheme_boundary_prev(text, pos);
80 let pos = ensure_grapheme_boundary_prev(text, pos);
80− let col = text
82+ let mut col = 0;
81− .slice(line_start..pos)
84+ for grapheme in RopeGraphemes::new(text.slice(line_start..pos)) {
82− .chars()
85+ if grapheme == "\t" {
83− .flat_map(|c| match c {
84− '\t' => Some(tab_width),
86+ col += tab_width;
85− c => UnicodeWidthChar::width(c),
87+ } else {
86− })
88+ let grapheme = Cow::from(grapheme);
87− .sum();
89+ col += grapheme_width(&grapheme);
89 Position::new(line, col)
93 Position::new(line, col)