@@ -503,7 +503,10 @@ fn goto_window_bottom(cx: &mut Context) {
503503 goto_window(cx, Align::Bottom)
504504}
505505
506−fn move_next_word_start(cx: &mut Context) {
506+fn move_word_impl<F>(cx: &mut Context, move_fn: F)
507+where
508+ F: Fn(RopeSlice, Range, usize) -> Range,
509+{
507510 let count = cx.count();
508511 let (view, doc) = current!(cx.editor);
509512 let text = doc.text().slice(..);
@@ -511,68 +514,32 @@ fn move_next_word_start(cx: &mut Context) {
511514 let selection = doc
512515 .selection(view.id)
513516 .clone()
514− .transform(|range| movement::move_next_word_start(text, range, count));
517+ .transform(|range| move_fn(text, range, count));
515518 doc.set_selection(view.id, selection);
516519}
517520
518−fn move_prev_word_start(cx: &mut Context) {
519− let count = cx.count();
520− let (view, doc) = current!(cx.editor);
521− let text = doc.text().slice(..);
521+fn move_next_word_start(cx: &mut Context) {
522+ move_word_impl(cx, movement::move_next_word_start)
523+}
522524
523− let selection = doc
524− .selection(view.id)
525− .clone()
526− .transform(|range| movement::move_prev_word_start(text, range, count));
527− doc.set_selection(view.id, selection);
525+fn move_prev_word_start(cx: &mut Context) {
526+ move_word_impl(cx, movement::move_prev_word_start)
528527}
529528
530529fn move_next_word_end(cx: &mut Context) {
531− let count = cx.count();
532− let (view, doc) = current!(cx.editor);
533− let text = doc.text().slice(..);
534−
535− let selection = doc
536− .selection(view.id)
537− .clone()
538− .transform(|range| movement::move_next_word_end(text, range, count));
539− doc.set_selection(view.id, selection);
530+ move_word_impl(cx, movement::move_next_word_end)
540531}
541532
542533fn move_next_long_word_start(cx: &mut Context) {
543− let count = cx.count();
544− let (view, doc) = current!(cx.editor);
545− let text = doc.text().slice(..);
546−
547− let selection = doc
548− .selection(view.id)
549− .clone()
550− .transform(|range| movement::move_next_long_word_start(text, range, count));
551− doc.set_selection(view.id, selection);
534+ move_word_impl(cx, movement::move_next_long_word_start)
552535}
553536
554537fn move_prev_long_word_start(cx: &mut Context) {
555− let count = cx.count();
556− let (view, doc) = current!(cx.editor);
557− let text = doc.text().slice(..);
558−
559− let selection = doc
560− .selection(view.id)
561− .clone()
562− .transform(|range| movement::move_prev_long_word_start(text, range, count));
563− doc.set_selection(view.id, selection);
538+ move_word_impl(cx, movement::move_prev_long_word_start)
564539}
565540
566541fn move_next_long_word_end(cx: &mut Context) {
567− let count = cx.count();
568− let (view, doc) = current!(cx.editor);
569− let text = doc.text().slice(..);
570−
571− let selection = doc
572− .selection(view.id)
573− .clone()
574− .transform(|range| movement::move_next_long_word_end(text, range, count));
575− doc.set_selection(view.id, selection);
542+ move_word_impl(cx, movement::move_next_long_word_end)
576543}
577544
578545fn goto_file_start(cx: &mut Context) {
@@ -591,82 +558,44 @@ fn goto_file_end(cx: &mut Context) {
591558 doc.set_selection(view.id, Selection::point(doc.text().len_chars()));
592559}
593560
594−fn extend_next_word_start(cx: &mut Context) {
561+fn extend_word_impl<F>(cx: &mut Context, extend_fn: F)
562+where
563+ F: Fn(RopeSlice, Range, usize) -> Range,
564+{
595565 let count = cx.count();
596566 let (view, doc) = current!(cx.editor);
597567 let text = doc.text().slice(..);
598568
599569 let selection = doc.selection(view.id).clone().transform(|range| {
600− let word = movement::move_next_word_start(text, range, count);
570+ let word = extend_fn(text, range, count);
601571 let pos = word.cursor(text);
602572 range.put_cursor(text, pos, true)
603573 });
604574 doc.set_selection(view.id, selection);
605575}
606576
607−fn extend_prev_word_start(cx: &mut Context) {
608− let count = cx.count();
609− let (view, doc) = current!(cx.editor);
610− let text = doc.text().slice(..);
577+fn extend_next_word_start(cx: &mut Context) {
578+ extend_word_impl(cx, movement::move_next_word_start)
579+}
611580
612− let selection = doc.selection(view.id).clone().transform(|range| {
613− let word = movement::move_prev_word_start(text, range, count);
614− let pos = word.cursor(text);
615− range.put_cursor(text, pos, true)
616− });
617− doc.set_selection(view.id, selection);
581+fn extend_prev_word_start(cx: &mut Context) {
582+ extend_word_impl(cx, movement::move_prev_word_start)
618583}
619584
620585fn extend_next_word_end(cx: &mut Context) {
621− let count = cx.count();
622− let (view, doc) = current!(cx.editor);
623− let text = doc.text().slice(..);
624−
625− let selection = doc.selection(view.id).clone().transform(|range| {
626− let word = movement::move_next_word_end(text, range, count);
627− let pos = word.cursor(text);
628− range.put_cursor(text, pos, true)
629− });
630− doc.set_selection(view.id, selection);
586+ extend_word_impl(cx, movement::move_next_word_end)
631587}
632588
633589fn extend_next_long_word_start(cx: &mut Context) {
634− let count = cx.count();
635− let (view, doc) = current!(cx.editor);
636− let text = doc.text().slice(..);
637−
638− let selection = doc.selection(view.id).clone().transform(|range| {
639− let word = movement::move_next_long_word_start(text, range, count);
640− let pos = word.cursor(text);
641− range.put_cursor(text, pos, true)
642− });
643− doc.set_selection(view.id, selection);
590+ extend_word_impl(cx, movement::move_next_long_word_start)
644591}
645592
646593fn extend_prev_long_word_start(cx: &mut Context) {
647− let count = cx.count();
648− let (view, doc) = current!(cx.editor);
649− let text = doc.text().slice(..);
650−
651− let selection = doc.selection(view.id).clone().transform(|range| {
652− let word = movement::move_prev_long_word_start(text, range, count);
653− let pos = word.cursor(text);
654− range.put_cursor(text, pos, true)
655− });
656− doc.set_selection(view.id, selection);
594+ extend_word_impl(cx, movement::move_prev_long_word_start)
657595}
658596
659597fn extend_next_long_word_end(cx: &mut Context) {
660− let count = cx.count();
661− let (view, doc) = current!(cx.editor);
662− let text = doc.text().slice(..);
663−
664− let selection = doc.selection(view.id).clone().transform(|range| {
665− let word = movement::move_next_long_word_end(text, range, count);
666− let pos = word.cursor(text);
667− range.put_cursor(text, pos, true)
668− });
669− doc.set_selection(view.id, selection);
598+ extend_word_impl(cx, movement::move_next_long_word_end)
670599}
671600
672601#[inline]