@@ -396,11 +396,19 @@ fn goto_line_end(cx: &mut Context) {
396396 view.id,
397397 doc.selection(view.id).clone().transform(|range| {
398398 let text = doc.text().slice(..);
399− let line = text.char_to_line(range.head);
400399
401− let pos = line_end_char_index(&text, line);
402− let pos = graphemes::nth_prev_grapheme_boundary(text, pos, 1);
403− let pos = range.head.max(pos).max(text.line_to_char(line));
400+ let head = if range.anchor < range.head {
401+ graphemes::prev_grapheme_boundary(text, range.head)
402+ } else {
403+ range.head
404+ };
405+ let line = text.char_to_line(head);
406+
407+ let mut pos = line_end_char_index(&text, line);
408+ if doc.mode != Mode::Select {
409+ pos = graphemes::prev_grapheme_boundary(text, pos);
410+ }
411+ pos = head.max(pos).max(text.line_to_char(line));
404412
405413 range.put(text, pos, doc.mode == Mode::Select)
406414 }),
@@ -414,9 +422,18 @@ fn goto_line_end_newline(cx: &mut Context) {
414422 view.id,
415423 doc.selection(view.id).clone().transform(|range| {
416424 let text = doc.text().slice(..);
417− let line = text.char_to_line(range.head);
418425
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)
428+ } else {
429+ range.head
430+ };
431+ let line = text.char_to_line(head);
432+
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);
436+ }
420437 range.put(text, pos, doc.mode == Mode::Select)
421438 }),
422439 );