@@ -396,11 +396,19 @@ fn goto_line_end(cx: &mut Context) {
397 doc.selection(view.id).clone().transform(|range| {
397 doc.selection(view.id).clone().transform(|range| {
398 let text = doc.text().slice(..);
398 let text = doc.text().slice(..);
399− let line = text.char_to_line(range.head);
400+ let head = if range.anchor < range.head {
401+ graphemes::prev_grapheme_boundary(text, range.head)
405+ let line = text.char_to_line(head);
401− let pos = line_end_char_index(&text, line);
407+ let mut pos = line_end_char_index(&text, line);
408+ if doc.mode != Mode::Select {
402− let pos = graphemes::nth_prev_grapheme_boundary(text, pos, 1);
409+ pos = graphemes::prev_grapheme_boundary(text, pos);
403− let pos = range.head.max(pos).max(text.line_to_char(line));
411+ pos = head.max(pos).max(text.line_to_char(line));
405 range.put(text, pos, doc.mode == Mode::Select)
413 range.put(text, pos, doc.mode == Mode::Select)
@@ -414,9 +422,18 @@ fn goto_line_end_newline(cx: &mut Context) {
415 doc.selection(view.id).clone().transform(|range| {
423 doc.selection(view.id).clone().transform(|range| {
416 let text = doc.text().slice(..);
424 let text = doc.text().slice(..);
417− let line = text.char_to_line(range.head);
419− let pos = line_end_char_index(&text, line);
426+ let head = if range.anchor < range.head {
427+ graphemes::prev_grapheme_boundary(text, range.head)
431+ let line = text.char_to_line(head);
433+ let mut pos = text.line_to_char((line + 1).min(text.len_lines()));
434+ if doc.mode != Mode::Select {
435+ pos = graphemes::prev_grapheme_boundary(text, pos);
420 range.put(text, pos, doc.mode == Mode::Select)
437 range.put(text, pos, doc.mode == Mode::Select)