diff options
author | Nathan Vegdahl | 2021-07-20 18:58:56 +0000 |
---|---|---|
committer | Nathan Vegdahl | 2021-07-20 18:58:56 +0000 |
commit | 1c6b5581f01371a00dc7f6f6e1720ad8af61ec7a (patch) | |
tree | c1758df277987266251500fc5c864f1def5c715c /helix-term/src | |
parent | e8a3980e464a9c98c3f76cada6c46a66498dc2bf (diff) |
Fix various bugs related to goto-end-of-line command.
This also fixes a bug with `Selection::normalize()`, that could
result in an out-of-bounds primary index.
Diffstat (limited to 'helix-term/src')
-rw-r--r-- | helix-term/src/commands.rs | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 61c5096d..a155e19e 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -396,11 +396,19 @@ fn goto_line_end(cx: &mut Context) { view.id, doc.selection(view.id).clone().transform(|range| { let text = doc.text().slice(..); - let line = text.char_to_line(range.head); - let pos = line_end_char_index(&text, line); - let pos = graphemes::nth_prev_grapheme_boundary(text, pos, 1); - let pos = range.head.max(pos).max(text.line_to_char(line)); + let head = if range.anchor < range.head { + graphemes::prev_grapheme_boundary(text, range.head) + } else { + range.head + }; + let line = text.char_to_line(head); + + let mut pos = line_end_char_index(&text, line); + if doc.mode != Mode::Select { + pos = graphemes::prev_grapheme_boundary(text, pos); + } + pos = head.max(pos).max(text.line_to_char(line)); range.put(text, pos, doc.mode == Mode::Select) }), @@ -414,9 +422,18 @@ fn goto_line_end_newline(cx: &mut Context) { view.id, doc.selection(view.id).clone().transform(|range| { let text = doc.text().slice(..); - let line = text.char_to_line(range.head); - let pos = line_end_char_index(&text, line); + let head = if range.anchor < range.head { + graphemes::prev_grapheme_boundary(text, range.head) + } else { + range.head + }; + let line = text.char_to_line(head); + + let mut pos = text.line_to_char((line + 1).min(text.len_lines())); + if doc.mode != Mode::Select { + pos = graphemes::prev_grapheme_boundary(text, pos); + } range.put(text, pos, doc.mode == Mode::Select) }), ); |