on master help sign in
Make `Selection`'s normalize and transform methods self-consuming only.
commit7c7be6d58326725954be7bd16fa3ff5e84610c17 authorNathan Vegdahl <cessen@cessen.com> dateWed 30 Jun 2021, 07:45 (5 years ago) parent0ae522f
4 files changed+295−203
helix-core/src/object.rs+1−1 helix-core/src/selection.rs+4−21 helix-term/src/commands.rs+288−163 helix-view/src/document.rs+2−18
helix-core/src/object.rs+1−1
@@ -6,7 +6,7 @@ use smallvec::smallvec;
66pub fn expand_selection(syntax: &Syntax, text: RopeSlice, selection: &Selection) -> Selection {
77 let tree = syntax.tree();
88
9− selection.clone().transformed(|range| {
9+ selection.clone().transform(|range| {
1010 let from = text.char_to_byte(range.from());
1111 let to = text.char_to_byte(range.to());
1212
helix-core/src/selection.rs+4−21
@@ -261,7 +261,7 @@ impl Selection {
261261
262262 pub fn push(mut self, range: Range) -> Self {
263263 self.ranges.push(range);
264− self.normalized()
264+ self.normalize()
265265 }
266266 // replace_range
267267
@@ -308,7 +308,7 @@ impl Selection {
308308 }
309309
310310 /// Normalizes a `Selection`.
311− pub fn normalize(&mut self) -> &mut Self {
311+ pub fn normalize(mut self) -> Self {
312312 let primary = self.ranges[self.primary_index];
313313 self.ranges.sort_unstable_by_key(Range::from);
314314 self.primary_index = self
@@ -335,13 +335,6 @@ impl Selection {
335335 self
336336 }
337337
338− /// Normalizes a `Selection`.
339− #[must_use]
340− pub fn normalized(mut self) -> Self {
341− self.normalize();
342− self
343− }
344−
345338 // TODO: consume an iterator or a vec to reduce allocations?
346339 #[must_use]
347340 pub fn new(ranges: SmallVec<[Range; 1]>, primary_index: usize) -> Self {
@@ -355,14 +348,14 @@ impl Selection {
355348
356349 if selection.ranges.len() > 1 {
357350 // TODO: only normalize if needed (any ranges out of order)
358− selection.normalize();
351+ selection = selection.normalize();
359352 }
360353
361354 selection
362355 }
363356
364357 /// Takes a closure and maps each `Range` over the closure.
365− pub fn transform<F>(&mut self, f: F) -> &mut Self
358+ pub fn transform<F>(mut self, f: F) -> Self
366359 where
367360 F: Fn(Range) -> Range,
368361 {
@@ -373,16 +366,6 @@ impl Selection {
373366 self
374367 }
375368
376− /// Takes a closure and maps each `Range` over the closure.
377− #[must_use]
378− pub fn transformed<F>(mut self, f: F) -> Self
379− where
380− F: Fn(Range) -> Range,
381− {
382− self.transform(f);
383− self
384− }
385−
386369 pub fn fragments<'a>(&'a self, text: RopeSlice<'a>) -> impl Iterator<Item = Cow<str>> + 'a {
387370 self.ranges.iter().map(move |range| range.fragment(text))
388371 }
helix-term/src/commands.rs+288−163
@@ -310,81 +310,119 @@ impl PartialEq for Command {
310310fn move_char_left(cx: &mut Context) {
311311 let count = cx.count();
312312 let (view, doc) = current!(cx.editor);
313− let (text, selection) = doc.text_and_mut_selection(view.id);
314− selection.transform(|range| {
315− movement::move_horizontally(text, range, Direction::Backward, count, Movement::Move)
316− });
313+ doc.set_selection(
314+ view.id,
315+ doc.selection(view.id).clone().transform(|range| {
316+ movement::move_horizontally(
317+ doc.text().slice(..),
318+ range,
319+ Direction::Backward,
320+ count,
321+ Movement::Move,
322+ )
323+ }),
324+ );
317325}
318326
319327fn move_char_right(cx: &mut Context) {
320328 let count = cx.count();
321329 let (view, doc) = current!(cx.editor);
322− let (text, selection) = doc.text_and_mut_selection(view.id);
323− selection.transform(|range| {
324− movement::move_horizontally(text, range, Direction::Forward, count, Movement::Move)
325− });
330+ doc.set_selection(
331+ view.id,
332+ doc.selection(view.id).clone().transform(|range| {
333+ movement::move_horizontally(
334+ doc.text().slice(..),
335+ range,
336+ Direction::Forward,
337+ count,
338+ Movement::Move,
339+ )
340+ }),
341+ );
326342}
327343
328344fn move_line_up(cx: &mut Context) {
329345 let count = cx.count();
330346 let (view, doc) = current!(cx.editor);
331− let (text, selection) = doc.text_and_mut_selection(view.id);
332− selection.transform(|range| {
333− movement::move_vertically(text, range, Direction::Backward, count, Movement::Move)
334− });
347+ doc.set_selection(
348+ view.id,
349+ doc.selection(view.id).clone().transform(|range| {
350+ movement::move_vertically(
351+ doc.text().slice(..),
352+ range,
353+ Direction::Backward,
354+ count,
355+ Movement::Move,
356+ )
357+ }),
358+ );
335359}
336360
337361fn move_line_down(cx: &mut Context) {
338362 let count = cx.count();
339363 let (view, doc) = current!(cx.editor);
340− let (text, selection) = doc.text_and_mut_selection(view.id);
341− selection.transform(|range| {
342− movement::move_vertically(text, range, Direction::Forward, count, Movement::Move)
343− });
364+ doc.set_selection(
365+ view.id,
366+ doc.selection(view.id).clone().transform(|range| {
367+ movement::move_vertically(
368+ doc.text().slice(..),
369+ range,
370+ Direction::Forward,
371+ count,
372+ Movement::Move,
373+ )
374+ }),
375+ );
344376}
345377
346378fn move_line_end(cx: &mut Context) {
347379 let (view, doc) = current!(cx.editor);
380+ doc.set_selection(
381+ view.id,
382+ doc.selection(view.id).clone().transform(|range| {
383+ let text = doc.text();
384+ let line = text.char_to_line(range.head);
348385
349− let (text, selection) = doc.text_and_mut_selection(view.id);
350− selection.transform(|range| {
351− let line = text.char_to_line(range.head);
352−
353− let pos = line_end_char_index(&text.slice(..), line);
354− let pos = graphemes::nth_prev_grapheme_boundary(text.slice(..), pos, 1);
355− let pos = range.head.max(pos).max(text.line_to_char(line));
386+ let pos = line_end_char_index(&text.slice(..), line);
387+ let pos = graphemes::nth_prev_grapheme_boundary(text.slice(..), pos, 1);
388+ let pos = range.head.max(pos).max(text.line_to_char(line));
356389
357− Range::new(pos, pos)
358− });
390+ Range::new(pos, pos)
391+ }),
392+ );
359393}
360394
361395fn move_line_start(cx: &mut Context) {
362396 let (view, doc) = current!(cx.editor);
397+ doc.set_selection(
398+ view.id,
399+ doc.selection(view.id).clone().transform(|range| {
400+ let text = doc.text();
401+ let line = text.char_to_line(range.head);
363402
364− let (text, selection) = doc.text_and_mut_selection(view.id);
365− selection.transform(|range| {
366− let line = text.char_to_line(range.head);
367−
368− // adjust to start of the line
369− let pos = text.line_to_char(line);
370− Range::new(pos, pos)
371− });
403+ // adjust to start of the line
404+ let pos = text.line_to_char(line);
405+ Range::new(pos, pos)
406+ }),
407+ );
372408}
373409
374410fn move_first_nonwhitespace(cx: &mut Context) {
375411 let (view, doc) = current!(cx.editor);
412+ doc.set_selection(
413+ view.id,
414+ doc.selection(view.id).clone().transform(|range| {
415+ let text = doc.text();
416+ let line_idx = text.char_to_line(range.head);
376417
377− let (text, selection) = doc.text_and_mut_selection(view.id);
378− selection.transform(|range| {
379− let line_idx = text.char_to_line(range.head);
380−
381− if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
382− let pos = pos + text.line_to_char(line_idx);
383− Range::new(pos, pos)
384− } else {
385− range
386− }
387− });
418+ if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
419+ let pos = pos + text.line_to_char(line_idx);
420+ Range::new(pos, pos)
421+ } else {
422+ range
423+ }
424+ }),
425+ );
388426}
389427
390428// TODO: move vs extend could take an extra type Extend/Move that would
@@ -395,48 +433,67 @@ fn move_next_word_start(cx: &mut Context) {
395433 let count = cx.count();
396434 let (view, doc) = current!(cx.editor);
397435
398− let (text, selection) = doc.text_and_mut_selection(view.id);
399− selection.transform(|range| movement::move_next_word_start(text, range, count));
436+ doc.set_selection(
437+ view.id,
438+ doc.selection(view.id)
439+ .clone()
440+ .transform(|range| movement::move_next_word_start(doc.text().slice(..), range, count)),
441+ );
400442}
401443
402444fn move_prev_word_start(cx: &mut Context) {
403445 let count = cx.count();
404446 let (view, doc) = current!(cx.editor);
405−
406− let (text, selection) = doc.text_and_mut_selection(view.id);
407− selection.transform(|range| movement::move_prev_word_start(text, range, count));
447+ doc.set_selection(
448+ view.id,
449+ doc.selection(view.id)
450+ .clone()
451+ .transform(|range| movement::move_prev_word_start(doc.text().slice(..), range, count)),
452+ );
408453}
409454
410455fn move_next_word_end(cx: &mut Context) {
411456 let count = cx.count();
412457 let (view, doc) = current!(cx.editor);
413−
414− let (text, selection) = doc.text_and_mut_selection(view.id);
415− selection.transform(|range| movement::move_next_word_end(text, range, count));
458+ doc.set_selection(
459+ view.id,
460+ doc.selection(view.id)
461+ .clone()
462+ .transform(|range| movement::move_next_word_end(doc.text().slice(..), range, count)),
463+ );
416464}
417465
418466fn move_next_long_word_start(cx: &mut Context) {
419467 let count = cx.count();
420468 let (view, doc) = current!(cx.editor);
421−
422− let (text, selection) = doc.text_and_mut_selection(view.id);
423− selection.transform(|range| movement::move_next_long_word_start(text, range, count));
469+ doc.set_selection(
470+ view.id,
471+ doc.selection(view.id).clone().transform(|range| {
472+ movement::move_next_long_word_start(doc.text().slice(..), range, count)
473+ }),
474+ );
424475}
425476
426477fn move_prev_long_word_start(cx: &mut Context) {
427478 let count = cx.count();
428479 let (view, doc) = current!(cx.editor);
429−
430− let (text, selection) = doc.text_and_mut_selection(view.id);
431− selection.transform(|range| movement::move_prev_long_word_start(text, range, count));
480+ doc.set_selection(
481+ view.id,
482+ doc.selection(view.id).clone().transform(|range| {
483+ movement::move_prev_long_word_start(doc.text().slice(..), range, count)
484+ }),
485+ );
432486}
433487
434488fn move_next_long_word_end(cx: &mut Context) {
435489 let count = cx.count();
436490 let (view, doc) = current!(cx.editor);
437−
438− let (text, selection) = doc.text_and_mut_selection(view.id);
439− selection.transform(|range| movement::move_next_long_word_end(text, range, count));
491+ doc.set_selection(
492+ view.id,
493+ doc.selection(view.id).clone().transform(|range| {
494+ movement::move_next_long_word_end(doc.text().slice(..), range, count)
495+ }),
496+ );
440497}
441498
442499fn move_file_start(cx: &mut Context) {
@@ -456,37 +513,40 @@ fn move_file_end(cx: &mut Context) {
456513fn extend_next_word_start(cx: &mut Context) {
457514 let count = cx.count();
458515 let (view, doc) = current!(cx.editor);
459−
460− let (text, selection) = doc.text_and_mut_selection(view.id);
461− selection.transform(|mut range| {
462− let word = movement::move_next_word_start(text, range, count);
463− let pos = word.head;
464− Range::new(range.anchor, pos)
465− });
516+ doc.set_selection(
517+ view.id,
518+ doc.selection(view.id).clone().transform(|mut range| {
519+ let word = movement::move_next_word_start(doc.text().slice(..), range, count);
520+ let pos = word.head;
521+ Range::new(range.anchor, pos)
522+ }),
523+ );
466524}
467525
468526fn extend_prev_word_start(cx: &mut Context) {
469527 let count = cx.count();
470528 let (view, doc) = current!(cx.editor);
471−
472− let (text, selection) = doc.text_and_mut_selection(view.id);
473− selection.transform(|mut range| {
474− let word = movement::move_prev_word_start(text, range, count);
475− let pos = word.head;
476− Range::new(range.anchor, pos)
477− });
529+ doc.set_selection(
530+ view.id,
531+ doc.selection(view.id).clone().transform(|mut range| {
532+ let word = movement::move_prev_word_start(doc.text().slice(..), range, count);
533+ let pos = word.head;
534+ Range::new(range.anchor, pos)
535+ }),
536+ );
478537}
479538
480539fn extend_next_word_end(cx: &mut Context) {
481540 let count = cx.count();
482541 let (view, doc) = current!(cx.editor);
483−
484− let (text, selection) = doc.text_and_mut_selection(view.id);
485− selection.transform(|mut range| {
486− let word = movement::move_next_word_end(text, range, count);
487− let pos = word.head;
488− Range::new(range.anchor, pos)
489− });
542+ doc.set_selection(
543+ view.id,
544+ doc.selection(view.id).clone().transform(|mut range| {
545+ let word = movement::move_next_word_end(doc.text().slice(..), range, count);
546+ let pos = word.head;
547+ Range::new(range.anchor, pos)
548+ }),
549+ );
490550}
491551
492552#[inline]
@@ -530,18 +590,23 @@ where
530590
531591 let (view, doc) = current!(cx.editor);
532592
533− let (text, selection) = doc.text_and_mut_selection(view.id);
534− selection.transform(|mut range| {
535− search_fn(text, ch, range.head, count, inclusive).map_or(range, |pos| {
536− if extend {
537− Range::new(range.anchor, pos)
538− } else {
539− // select
540− Range::new(range.head, pos)
541− }
542− // or (pos, pos) to move to found val
543− })
544− });
593+ doc.set_selection(
594+ view.id,
595+ doc.selection(view.id).clone().transform(|mut range| {
596+ search_fn(doc.text().slice(..), ch, range.head, count, inclusive).map_or(
597+ range,
598+ |pos| {
599+ if extend {
600+ Range::new(range.anchor, pos)
601+ } else {
602+ // select
603+ Range::new(range.head, pos)
604+ }
605+ // or (pos, pos) to move to found val
606+ },
607+ )
608+ }),
609+ );
545610 })
546611}
547612
@@ -619,18 +684,20 @@ fn extend_prev_char(cx: &mut Context) {
619684
620685fn extend_first_nonwhitespace(cx: &mut Context) {
621686 let (view, doc) = current!(cx.editor);
687+ doc.set_selection(
688+ view.id,
689+ doc.selection(view.id).clone().transform(|range| {
690+ let text = doc.text();
691+ let line_idx = text.char_to_line(range.head);
622692
623− let (text, selection) = doc.text_and_mut_selection(view.id);
624− selection.transform(|range| {
625− let line_idx = text.char_to_line(range.head);
626−
627− if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
628− let pos = pos + text.line_to_char(line_idx);
629− Range::new(range.anchor, pos)
630− } else {
631− range
632− }
633− });
693+ if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
694+ let pos = pos + text.line_to_char(line_idx);
695+ Range::new(range.anchor, pos)
696+ } else {
697+ range
698+ }
699+ }),
700+ );
634701}
635702
636703fn replace(cx: &mut Context) {
@@ -741,65 +808,101 @@ fn half_page_down(cx: &mut Context) {
741808fn extend_char_left(cx: &mut Context) {
742809 let count = cx.count();
743810 let (view, doc) = current!(cx.editor);
744− let (text, selection) = doc.text_and_mut_selection(view.id);
745− selection.transform(|range| {
746− movement::move_horizontally(text, range, Direction::Backward, count, Movement::Extend)
747− });
811+ doc.set_selection(
812+ view.id,
813+ doc.selection(view.id).clone().transform(|range| {
814+ movement::move_horizontally(
815+ doc.text().slice(..),
816+ range,
817+ Direction::Backward,
818+ count,
819+ Movement::Extend,
820+ )
821+ }),
822+ );
748823}
749824
750825fn extend_char_right(cx: &mut Context) {
751826 let count = cx.count();
752827 let (view, doc) = current!(cx.editor);
753− let (text, selection) = doc.text_and_mut_selection(view.id);
754− selection.transform(|range| {
755− movement::move_horizontally(text, range, Direction::Forward, count, Movement::Extend)
756− });
828+ doc.set_selection(
829+ view.id,
830+ doc.selection(view.id).clone().transform(|range| {
831+ movement::move_horizontally(
832+ doc.text().slice(..),
833+ range,
834+ Direction::Forward,
835+ count,
836+ Movement::Extend,
837+ )
838+ }),
839+ );
757840}
758841
759842fn extend_line_up(cx: &mut Context) {
760843 let count = cx.count();
761844 let (view, doc) = current!(cx.editor);
762− let (text, selection) = doc.text_and_mut_selection(view.id);
763− selection.transform(|range| {
764− movement::move_vertically(text, range, Direction::Backward, count, Movement::Extend)
765− });
845+ doc.set_selection(
846+ view.id,
847+ doc.selection(view.id).clone().transform(|range| {
848+ movement::move_vertically(
849+ doc.text().slice(..),
850+ range,
851+ Direction::Backward,
852+ count,
853+ Movement::Extend,
854+ )
855+ }),
856+ );
766857}
767858
768859fn extend_line_down(cx: &mut Context) {
769860 let count = cx.count();
770861 let (view, doc) = current!(cx.editor);
771− let (text, selection) = doc.text_and_mut_selection(view.id);
772− selection.transform(|range| {
773− movement::move_vertically(text, range, Direction::Forward, count, Movement::Extend)
774− });
862+ doc.set_selection(
863+ view.id,
864+ doc.selection(view.id).clone().transform(|range| {
865+ movement::move_vertically(
866+ doc.text().slice(..),
867+ range,
868+ Direction::Forward,
869+ count,
870+ Movement::Extend,
871+ )
872+ }),
873+ );
775874}
776875
777876fn extend_line_end(cx: &mut Context) {
778877 let (view, doc) = current!(cx.editor);
878+ doc.set_selection(
879+ view.id,
880+ doc.selection(view.id).clone().transform(|range| {
881+ let text = doc.text().slice(..);
882+ let line = text.char_to_line(range.head);
779883
780− let (text, selection) = doc.text_and_mut_selection(view.id);
781− selection.transform(|range| {
782− let line = text.char_to_line(range.head);
783−
784− let pos = line_end_char_index(&text.slice(..), line);
785− let pos = graphemes::nth_prev_grapheme_boundary(text.slice(..), pos, 1);
786− let pos = range.head.max(pos).max(text.line_to_char(line));
884+ let pos = line_end_char_index(&text, line);
885+ let pos = graphemes::nth_prev_grapheme_boundary(text, pos, 1);
886+ let pos = range.head.max(pos).max(text.line_to_char(line));
787887
788− Range::new(range.anchor, pos)
789− });
888+ Range::new(range.anchor, pos)
889+ }),
890+ );
790891}
791892
792893fn extend_line_start(cx: &mut Context) {
793894 let (view, doc) = current!(cx.editor);
895+ doc.set_selection(
896+ view.id,
897+ doc.selection(view.id).clone().transform(|range| {
898+ let text = doc.text();
899+ let line = text.char_to_line(range.head);
794900
795− let (text, selection) = doc.text_and_mut_selection(view.id);
796− selection.transform(|range| {
797− let line = text.char_to_line(range.head);
798−
799− // adjust to start of the line
800− let pos = text.line_to_char(line);
801− Range::new(range.anchor, pos)
802− });
901+ // adjust to start of the line
902+ let pos = text.line_to_char(line);
903+ Range::new(range.anchor, pos)
904+ }),
905+ );
803906}
804907
805908fn select_all(cx: &mut Context) {
@@ -993,15 +1096,23 @@ fn change_selection(cx: &mut Context) {
9931096fn collapse_selection(cx: &mut Context) {
9941097 let (view, doc) = current!(cx.editor);
9951098
996− doc.selection_mut(view.id)
997− .transform(|range| Range::new(range.head, range.head));
1099+ doc.set_selection(
1100+ view.id,
1101+ doc.selection(view.id)
1102+ .clone()
1103+ .transform(|range| Range::new(range.head, range.head)),
1104+ );
9981105}
9991106
10001107fn flip_selections(cx: &mut Context) {
10011108 let (view, doc) = current!(cx.editor);
10021109
1003− doc.selection_mut(view.id)
1004− .transform(|range| Range::new(range.head, range.anchor));
1110+ doc.set_selection(
1111+ view.id,
1112+ doc.selection(view.id)
1113+ .clone()
1114+ .transform(|range| Range::new(range.head, range.anchor)),
1115+ );
10051116}
10061117
10071118fn enter_insert_mode(doc: &mut Document) {
@@ -1013,8 +1124,12 @@ fn insert_mode(cx: &mut Context) {
10131124 let (view, doc) = current!(cx.editor);
10141125 enter_insert_mode(doc);
10151126
1016− doc.selection_mut(view.id)
1017− .transform(|range| Range::new(range.to(), range.from()));
1127+ doc.set_selection(
1128+ view.id,
1129+ doc.selection(view.id)
1130+ .clone()
1131+ .transform(|range| Range::new(range.to(), range.from())),
1132+ );
10181133}
10191134
10201135// inserts at the end of each selection
@@ -1023,15 +1138,14 @@ fn append_mode(cx: &mut Context) {
10231138 enter_insert_mode(doc);
10241139 doc.restore_cursor = true;
10251140
1026− let (text, selection) = doc.text_and_mut_selection(view.id);
1027− selection.transform(|range| {
1141+ let selection = doc.selection(view.id).clone().transform(|range| {
10281142 Range::new(
10291143 range.from(),
1030− graphemes::next_grapheme_boundary(text, range.to()), // to() + next char
1144+ graphemes::next_grapheme_boundary(doc.text().slice(..), range.to()), // to() + next char
10311145 )
10321146 });
10331147
1034− let end = text.len_chars();
1148+ let end = doc.text().len_chars();
10351149
10361150 if selection.iter().any(|range| range.head == end) {
10371151 let transaction = Transaction::change(
@@ -1040,6 +1154,8 @@ fn append_mode(cx: &mut Context) {
10401154 );
10411155 doc.apply(&transaction, view.id);
10421156 }
1157+
1158+ doc.set_selection(view.id, selection);
10431159}
10441160
10451161mod cmd {
@@ -1845,12 +1961,15 @@ fn append_to_line(cx: &mut Context) {
18451961 let (view, doc) = current!(cx.editor);
18461962 enter_insert_mode(doc);
18471963
1848− let (text, selection) = doc.text_and_mut_selection(view.id);
1849− selection.transform(|range| {
1850− let line = text.char_to_line(range.head);
1851− let pos = line_end_char_index(&text.slice(..), line);
1852− Range::new(pos, pos)
1853− });
1964+ doc.set_selection(
1965+ view.id,
1966+ doc.selection(view.id).clone().transform(|range| {
1967+ let text = &doc.text().slice(..);
1968+ let line = text.char_to_line(range.head);
1969+ let pos = line_end_char_index(text, line);
1970+ Range::new(pos, pos)
1971+ }),
1972+ );
18541973}
18551974
18561975/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
@@ -1980,13 +2099,15 @@ fn normal_mode(cx: &mut Context) {
19802099
19812100 // if leaving append mode, move cursor back by 1
19822101 if doc.restore_cursor {
1983− let (text, selection) = doc.text_and_mut_selection(view.id);
1984− selection.transform(|range| {
1985− Range::new(
1986− range.from(),
1987− graphemes::prev_grapheme_boundary(text, range.to()),
1988− )
1989− });
2102+ doc.set_selection(
2103+ view.id,
2104+ doc.selection(view.id).clone().transform(|range| {
2105+ Range::new(
2106+ range.from(),
2107+ graphemes::prev_grapheme_boundary(doc.text().slice(..), range.to()),
2108+ )
2109+ }),
2110+ );
19902111
19912112 doc.restore_cursor = false;
19922113 }
@@ -2619,8 +2740,12 @@ pub mod insert {
26192740 let count = cx.count();
26202741 let (view, doc) = current!(cx.editor);
26212742
2622− let (text, selection) = doc.text_and_mut_selection(view.id);
2623− selection.transform(|range| movement::move_prev_word_start(text, range, count));
2743+ doc.set_selection(
2744+ view.id,
2745+ doc.selection(view.id).clone().transform(|range| {
2746+ movement::move_prev_word_start(doc.text().slice(..), range, count)
2747+ }),
2748+ );
26242749 delete_selection(cx)
26252750 }
26262751}
helix-view/src/document.rs+2−18
@@ -13,8 +13,8 @@ use helix_core::{
1313 history::History,
1414 line_ending::auto_detect_line_ending,
1515 syntax::{self, LanguageConfiguration},
16− ChangeSet, Diagnostic, LineEnding, Rope, RopeBuilder, RopeSlice, Selection, State, Syntax,
17− Transaction, DEFAULT_LINE_ENDING,
16+ ChangeSet, Diagnostic, LineEnding, Rope, RopeBuilder, Selection, State, Syntax, Transaction,
17+ DEFAULT_LINE_ENDING,
1818};
1919use helix_lsp::util::LspFormatting;
2020
@@ -1000,22 +1000,6 @@ impl Document {
10001000 &self.selections[&view_id]
10011001 }
10021002
1003− #[inline]
1004− pub fn selection_mut(&mut self, view_id: ViewId) -> &mut Selection {
1005− self.selections
1006− .get_mut(&view_id)
1007− .expect("No selection set with the given ViewId")
1008− }
1009−
1010− pub fn text_and_mut_selection(&mut self, view_id: ViewId) -> (RopeSlice, &mut Selection) {
1011− (
1012− self.text.slice(..),
1013− self.selections
1014− .get_mut(&view_id)
1015− .expect("No selection set with the given ViewId"),
1016− )
1017− }
1018−
10191003 pub fn relative_path(&self) -> Option<PathBuf> {
10201004 let cwdir = std::env::current_dir().expect("couldn't determine current directory");
10211005