@@ -503,7 +503,10 @@ fn goto_window_bottom(cx: &mut Context) {
503 goto_window(cx, Align::Bottom)
503 goto_window(cx, Align::Bottom)
506−fn move_next_word_start(cx: &mut Context) {
506+fn move_word_impl<F>(cx: &mut Context, move_fn: F)
508+ F: Fn(RopeSlice, Range, usize) -> Range,
507 let count = cx.count();
510 let count = cx.count();
508 let (view, doc) = current!(cx.editor);
511 let (view, doc) = current!(cx.editor);
509 let text = doc.text().slice(..);
512 let text = doc.text().slice(..);
@@ -511,68 +514,32 @@ fn move_next_word_start(cx: &mut Context) {
511 let selection = doc
514 let selection = doc
512 .selection(view.id)
515 .selection(view.id)
514− .transform(|range| movement::move_next_word_start(text, range, count));
517+ .transform(|range| move_fn(text, range, count));
515 doc.set_selection(view.id, selection);
518 doc.set_selection(view.id, selection);
518−fn move_prev_word_start(cx: &mut Context) {
521+fn move_next_word_start(cx: &mut Context) {
519− let count = cx.count();
522+ move_word_impl(cx, movement::move_next_word_start)
520− let (view, doc) = current!(cx.editor);
523+}
521− let text = doc.text().slice(..);
523− let selection = doc
525+fn move_prev_word_start(cx: &mut Context) {
526− .transform(|range| movement::move_prev_word_start(text, range, count));
526+ move_word_impl(cx, movement::move_prev_word_start)
527− doc.set_selection(view.id, selection);
530fn move_next_word_end(cx: &mut Context) {
529fn 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(..);
538− .transform(|range| movement::move_next_word_end(text, range, count));
530+ move_word_impl(cx, movement::move_next_word_end)
539− doc.set_selection(view.id, selection);
542fn move_next_long_word_start(cx: &mut Context) {
533fn 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(..);
550− .transform(|range| movement::move_next_long_word_start(text, range, count));
534+ move_word_impl(cx, movement::move_next_long_word_start)
551− doc.set_selection(view.id, selection);
554fn move_prev_long_word_start(cx: &mut Context) {
537fn 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(..);
562− .transform(|range| movement::move_prev_long_word_start(text, range, count));
538+ move_word_impl(cx, movement::move_prev_long_word_start)
563− doc.set_selection(view.id, selection);
566fn move_next_long_word_end(cx: &mut Context) {
541fn 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(..);
574− .transform(|range| movement::move_next_long_word_end(text, range, count));
542+ move_word_impl(cx, movement::move_next_long_word_end)
575− doc.set_selection(view.id, selection);
578fn goto_file_start(cx: &mut Context) {
545fn goto_file_start(cx: &mut Context) {
@@ -591,82 +558,44 @@ fn goto_file_end(cx: &mut Context) {
591 doc.set_selection(view.id, Selection::point(doc.text().len_chars()));
558 doc.set_selection(view.id, Selection::point(doc.text().len_chars()));
594−fn extend_next_word_start(cx: &mut Context) {
561+fn extend_word_impl<F>(cx: &mut Context, extend_fn: F)
563+ F: Fn(RopeSlice, Range, usize) -> Range,
595 let count = cx.count();
565 let count = cx.count();
596 let (view, doc) = current!(cx.editor);
566 let (view, doc) = current!(cx.editor);
597 let text = doc.text().slice(..);
567 let text = doc.text().slice(..);
599 let selection = doc.selection(view.id).clone().transform(|range| {
569 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);
601 let pos = word.cursor(text);
571 let pos = word.cursor(text);
602 range.put_cursor(text, pos, true)
572 range.put_cursor(text, pos, true)
604 doc.set_selection(view.id, selection);
574 doc.set_selection(view.id, selection);
607−fn extend_prev_word_start(cx: &mut Context) {
577+fn extend_next_word_start(cx: &mut Context) {
608− let count = cx.count();
578+ extend_word_impl(cx, movement::move_next_word_start)
609− let (view, doc) = current!(cx.editor);
579+}
610− let text = doc.text().slice(..);
612− let selection = doc.selection(view.id).clone().transform(|range| {
581+fn extend_prev_word_start(cx: &mut Context) {
613− let word = movement::move_prev_word_start(text, range, count);
582+ extend_word_impl(cx, movement::move_prev_word_start)
614− let pos = word.cursor(text);
615− range.put_cursor(text, pos, true)
617− doc.set_selection(view.id, selection);
620fn extend_next_word_end(cx: &mut Context) {
585fn 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(..);
625− let selection = doc.selection(view.id).clone().transform(|range| {
626− let word = movement::move_next_word_end(text, range, count);
586+ extend_word_impl(cx, movement::move_next_word_end)
627− let pos = word.cursor(text);
628− range.put_cursor(text, pos, true)
630− doc.set_selection(view.id, selection);
633fn extend_next_long_word_start(cx: &mut Context) {
589fn 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(..);
638− let selection = doc.selection(view.id).clone().transform(|range| {
639− let word = movement::move_next_long_word_start(text, range, count);
590+ extend_word_impl(cx, movement::move_next_long_word_start)
640− let pos = word.cursor(text);
641− range.put_cursor(text, pos, true)
643− doc.set_selection(view.id, selection);
646fn extend_prev_long_word_start(cx: &mut Context) {
593fn 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(..);
651− let selection = doc.selection(view.id).clone().transform(|range| {
652− let word = movement::move_prev_long_word_start(text, range, count);
594+ extend_word_impl(cx, movement::move_prev_long_word_start)
653− let pos = word.cursor(text);
654− range.put_cursor(text, pos, true)
656− doc.set_selection(view.id, selection);
659fn extend_next_long_word_end(cx: &mut Context) {
597fn 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(..);
664− let selection = doc.selection(view.id).clone().transform(|range| {
665− let word = movement::move_next_long_word_end(text, range, count);
598+ extend_word_impl(cx, movement::move_next_long_word_end)
666− let pos = word.cursor(text);
667− range.put_cursor(text, pos, true)
669− doc.set_selection(view.id, selection);