on master help sign in
Fix various bugs related to goto-end-of-line command.
1c6b558Nathan Vegdahl
helix-core/src/selection.rs+3−3
@@ -357,14 +357,14 @@ impl Selection {
357 let mut prev_i = 0;
357 let mut prev_i = 0;
358 for i in 1..self.ranges.len() {
358 for i in 1..self.ranges.len() {
359 if self.ranges[prev_i].overlaps(&self.ranges[i]) {
359 if self.ranges[prev_i].overlaps(&self.ranges[i]) {
360− if i == self.primary_index {
361− self.primary_index = prev_i;
362− }
363 self.ranges[prev_i] = self.ranges[prev_i].merge(self.ranges[i]);
360 self.ranges[prev_i] = self.ranges[prev_i].merge(self.ranges[i]);
364 } else {
361 } else {
365 prev_i += 1;
362 prev_i += 1;
366 self.ranges[prev_i] = self.ranges[i];
363 self.ranges[prev_i] = self.ranges[i];
367 }
364 }
365+ if i == self.primary_index {
366+ self.primary_index = prev_i;
367+ }
368 }
368 }
369
369
370 self.ranges.truncate(prev_i + 1);
370 self.ranges.truncate(prev_i + 1);
helix-term/src/commands.rs+23−6
@@ -396,11 +396,19 @@ fn goto_line_end(cx: &mut Context) {
396 view.id,
396 view.id,
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
399
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+
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);
410+ }
403− let pos = range.head.max(pos).max(text.line_to_char(line));
411+ pos = head.max(pos).max(text.line_to_char(line));
404
412
405 range.put(text, pos, doc.mode == Mode::Select)
413 range.put(text, pos, doc.mode == Mode::Select)
406 }),
414 }),
@@ -414,9 +422,18 @@ fn goto_line_end_newline(cx: &mut Context) {
414 view.id,
422 view.id,
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);
418
425
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+ }
420 range.put(text, pos, doc.mode == Mode::Select)
437 range.put(text, pos, doc.mode == Mode::Select)
421 }),
438 }),
422 );
439 );