on master help sign in
Put selection in separate variable in commands code.
427ae6aNathan Vegdahl
helix-term/src/commands.rs+252−319
@@ -325,140 +325,111 @@ impl PartialEq for Command {
325fn move_char_left(cx: &mut Context) {
325fn move_char_left(cx: &mut Context) {
326 let count = cx.count();
326 let count = cx.count();
327 let (view, doc) = current!(cx.editor);
327 let (view, doc) = current!(cx.editor);
328− doc.set_selection(
328+ let text = doc.text().slice(..);
329− view.id,
329+
330− doc.selection(view.id).clone().transform(|range| {
330+ let selection = doc.selection(view.id).clone().transform(|range| {
331− movement::move_horizontally(
331+ movement::move_horizontally(text, range, Direction::Backward, count, Movement::Move)
332− doc.text().slice(..),
333− range,
334− Direction::Backward,
335− count,
336− Movement::Move,
337− )
338− }),
332+ });
339− );
333+ doc.set_selection(view.id, selection);
340}
334}
341
335
342fn move_char_right(cx: &mut Context) {
336fn move_char_right(cx: &mut Context) {
343 let count = cx.count();
337 let count = cx.count();
344 let (view, doc) = current!(cx.editor);
338 let (view, doc) = current!(cx.editor);
345− doc.set_selection(
339+ let text = doc.text().slice(..);
346− view.id,
340+
347− doc.selection(view.id).clone().transform(|range| {
341+ let selection = doc.selection(view.id).clone().transform(|range| {
348− movement::move_horizontally(
342+ movement::move_horizontally(text, range, Direction::Forward, count, Movement::Move)
349− doc.text().slice(..),
350− range,
351− Direction::Forward,
352− count,
353− Movement::Move,
354− )
355− }),
343+ });
356− );
344+ doc.set_selection(view.id, selection);
357}
345}
358
346
359fn move_line_up(cx: &mut Context) {
347fn move_line_up(cx: &mut Context) {
360 let count = cx.count();
348 let count = cx.count();
361 let (view, doc) = current!(cx.editor);
349 let (view, doc) = current!(cx.editor);
362− doc.set_selection(
350+ let text = doc.text().slice(..);
363− view.id,
351+
364− doc.selection(view.id).clone().transform(|range| {
352+ let selection = doc.selection(view.id).clone().transform(|range| {
365− movement::move_vertically(
353+ movement::move_vertically(text, range, Direction::Backward, count, Movement::Move)
366− doc.text().slice(..),
367− range,
368− Direction::Backward,
369− count,
370− Movement::Move,
371− )
372− }),
354+ });
373− );
355+ doc.set_selection(view.id, selection);
374}
356}
375
357
376fn move_line_down(cx: &mut Context) {
358fn move_line_down(cx: &mut Context) {
377 let count = cx.count();
359 let count = cx.count();
378 let (view, doc) = current!(cx.editor);
360 let (view, doc) = current!(cx.editor);
379− doc.set_selection(
361+ let text = doc.text().slice(..);
380− view.id,
362+
381− doc.selection(view.id).clone().transform(|range| {
363+ let selection = doc.selection(view.id).clone().transform(|range| {
382− movement::move_vertically(
364+ movement::move_vertically(text, range, Direction::Forward, count, Movement::Move)
383− doc.text().slice(..),
384− range,
385− Direction::Forward,
386− count,
387− Movement::Move,
388− )
389− }),
365+ });
390− );
366+ doc.set_selection(view.id, selection);
391}
367}
392
368
393fn goto_line_end(cx: &mut Context) {
369fn goto_line_end(cx: &mut Context) {
394 let (view, doc) = current!(cx.editor);
370 let (view, doc) = current!(cx.editor);
395− doc.set_selection(
396− view.id,
397− doc.selection(view.id).clone().transform(|range| {
398− let text = doc.text().slice(..);
371+ let text = doc.text().slice(..);
399− let line = range.head_line(text);
400
372
401− let mut pos = line_end_char_index(&text, line);
373+ let selection = doc.selection(view.id).clone().transform(|range| {
402− if doc.mode != Mode::Select {
374+ let line = range.head_line(text);
403− pos = graphemes::prev_grapheme_boundary(text, pos);
404− }
405
375
406− pos = range.head.max(pos).max(text.line_to_char(line));
376+ let mut pos = line_end_char_index(&text, line);
377+ if doc.mode != Mode::Select {
378+ pos = graphemes::prev_grapheme_boundary(text, pos);
379+ }
407
380
381+ pos = range.head.max(pos).max(text.line_to_char(line));
382+
408− range.put(text, pos, doc.mode == Mode::Select)
383+ range.put(text, pos, doc.mode == Mode::Select)
409− }),
384+ });
410− );
385+ doc.set_selection(view.id, selection);
411}
386}
412
387
413fn goto_line_end_newline(cx: &mut Context) {
388fn goto_line_end_newline(cx: &mut Context) {
414 let (view, doc) = current!(cx.editor);
389 let (view, doc) = current!(cx.editor);
390+ let text = doc.text().slice(..);
415
391
416− doc.set_selection(
417− view.id,
418− doc.selection(view.id).clone().transform(|range| {
392+ let selection = doc.selection(view.id).clone().transform(|range| {
419− let text = doc.text().slice(..);
420− let line = range.head_line(text);
393+ let line = range.head_line(text);
421
394
422− let mut pos = text.line_to_char((line + 1).min(text.len_lines()));
395+ let mut pos = text.line_to_char((line + 1).min(text.len_lines()));
423− if doc.mode != Mode::Select {
396+ if doc.mode != Mode::Select {
424− pos = graphemes::prev_grapheme_boundary(text, pos);
397+ pos = graphemes::prev_grapheme_boundary(text, pos);
425− }
398+ }
426− range.put(text, pos, doc.mode == Mode::Select)
399+ range.put(text, pos, doc.mode == Mode::Select)
427− }),
400+ });
428− );
401+ doc.set_selection(view.id, selection);
429}
402}
430
403
431fn goto_line_start(cx: &mut Context) {
404fn goto_line_start(cx: &mut Context) {
432 let (view, doc) = current!(cx.editor);
405 let (view, doc) = current!(cx.editor);
433− doc.set_selection(
434− view.id,
435− doc.selection(view.id).clone().transform(|range| {
436− let text = doc.text().slice(..);
406+ let text = doc.text().slice(..);
437− let line = range.head_line(text);
438
407
408+ let selection = doc.selection(view.id).clone().transform(|range| {
409+ let line = range.head_line(text);
410+
439− // adjust to start of the line
411+ // adjust to start of the line
440− let pos = text.line_to_char(line);
412+ let pos = text.line_to_char(line);
441− range.put(text, pos, doc.mode == Mode::Select)
413+ range.put(text, pos, doc.mode == Mode::Select)
442− }),
414+ });
443− );
415+ doc.set_selection(view.id, selection);
444}
416}
445
417
446fn goto_first_nonwhitespace(cx: &mut Context) {
418fn goto_first_nonwhitespace(cx: &mut Context) {
447 let (view, doc) = current!(cx.editor);
419 let (view, doc) = current!(cx.editor);
448− doc.set_selection(
449− view.id,
450− doc.selection(view.id).clone().transform(|range| {
451− let text = doc.text().slice(..);
420+ let text = doc.text().slice(..);
452− let line = range.head_line(text);
453
421
422+ let selection = doc.selection(view.id).clone().transform(|range| {
423+ let line = range.head_line(text);
424+
454− if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
425+ if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
455− let pos = pos + text.line_to_char(line);
426+ let pos = pos + text.line_to_char(line);
456− range.put(text, pos, doc.mode == Mode::Select)
427+ range.put(text, pos, doc.mode == Mode::Select)
457− } else {
428+ } else {
458− range
429+ range
459− }
430+ }
460− }),
431+ });
461− );
432+ doc.set_selection(view.id, selection);
462}
433}
463
434
464fn goto_window(cx: &mut Context, align: Align) {
435fn goto_window(cx: &mut Context, align: Align) {
@@ -499,80 +470,79 @@ fn goto_window_bottom(cx: &mut Context) {
499fn move_next_word_start(cx: &mut Context) {
470fn move_next_word_start(cx: &mut Context) {
500 let count = cx.count();
471 let count = cx.count();
501 let (view, doc) = current!(cx.editor);
472 let (view, doc) = current!(cx.editor);
473+ let text = doc.text().slice(..);
502
474
503− doc.set_selection(
475+ let selection = doc
504− view.id,
505− doc.selection(view.id)
476+ .selection(view.id)
506− .clone()
477+ .clone()
507− .min_width_1(doc.text().slice(..))
478+ .min_width_1(text)
508− .transform(|range| movement::move_next_word_start(doc.text().slice(..), range, count)),
479+ .transform(|range| movement::move_next_word_start(text, range, count));
509− );
480+ doc.set_selection(view.id, selection);
510}
481}
511
482
512fn move_prev_word_start(cx: &mut Context) {
483fn move_prev_word_start(cx: &mut Context) {
513 let count = cx.count();
484 let count = cx.count();
514 let (view, doc) = current!(cx.editor);
485 let (view, doc) = current!(cx.editor);
515− doc.set_selection(
486+ let text = doc.text().slice(..);
516− view.id,
487+
488+ let selection = doc
517− doc.selection(view.id)
489+ .selection(view.id)
518− .clone()
490+ .clone()
519− .min_width_1(doc.text().slice(..))
491+ .min_width_1(text)
520− .transform(|range| movement::move_prev_word_start(doc.text().slice(..), range, count)),
492+ .transform(|range| movement::move_prev_word_start(text, range, count));
521− );
493+ doc.set_selection(view.id, selection);
522}
494}
523
495
524fn move_next_word_end(cx: &mut Context) {
496fn move_next_word_end(cx: &mut Context) {
525 let count = cx.count();
497 let count = cx.count();
526 let (view, doc) = current!(cx.editor);
498 let (view, doc) = current!(cx.editor);
527− doc.set_selection(
499+ let text = doc.text().slice(..);
528− view.id,
500+
501+ let selection = doc
529− doc.selection(view.id)
502+ .selection(view.id)
530− .clone()
503+ .clone()
531− .min_width_1(doc.text().slice(..))
504+ .min_width_1(text)
532− .transform(|range| movement::move_next_word_end(doc.text().slice(..), range, count)),
505+ .transform(|range| movement::move_next_word_end(text, range, count));
533− );
506+ doc.set_selection(view.id, selection);
534}
507}
535
508
536fn move_next_long_word_start(cx: &mut Context) {
509fn move_next_long_word_start(cx: &mut Context) {
537 let count = cx.count();
510 let count = cx.count();
538 let (view, doc) = current!(cx.editor);
511 let (view, doc) = current!(cx.editor);
539− doc.set_selection(
512+ let text = doc.text().slice(..);
540− view.id,
513+
514+ let selection = doc
541− doc.selection(view.id)
515+ .selection(view.id)
542− .clone()
516+ .clone()
543− .min_width_1(doc.text().slice(..))
517+ .min_width_1(text)
544− .transform(|range| {
545− movement::move_next_long_word_start(doc.text().slice(..), range, count)
518+ .transform(|range| movement::move_next_long_word_start(text, range, count));
546− }),
519+ doc.set_selection(view.id, selection);
547− );
548}
520}
549
521
550fn move_prev_long_word_start(cx: &mut Context) {
522fn move_prev_long_word_start(cx: &mut Context) {
551 let count = cx.count();
523 let count = cx.count();
552 let (view, doc) = current!(cx.editor);
524 let (view, doc) = current!(cx.editor);
553− doc.set_selection(
525+ let text = doc.text().slice(..);
554− view.id,
526+
527+ let selection = doc
555− doc.selection(view.id)
528+ .selection(view.id)
556− .clone()
529+ .clone()
557− .min_width_1(doc.text().slice(..))
530+ .min_width_1(text)
558− .transform(|range| {
559− movement::move_prev_long_word_start(doc.text().slice(..), range, count)
531+ .transform(|range| movement::move_prev_long_word_start(text, range, count));
560− }),
532+ doc.set_selection(view.id, selection);
561− );
562}
533}
563
534
564fn move_next_long_word_end(cx: &mut Context) {
535fn move_next_long_word_end(cx: &mut Context) {
565 let count = cx.count();
536 let count = cx.count();
566 let (view, doc) = current!(cx.editor);
537 let (view, doc) = current!(cx.editor);
567− doc.set_selection(
538+ let text = doc.text().slice(..);
568− view.id,
539+
540+ let selection = doc
569− doc.selection(view.id)
541+ .selection(view.id)
570− .clone()
542+ .clone()
571− .min_width_1(doc.text().slice(..))
543+ .min_width_1(text)
572− .transform(|range| {
573− movement::move_next_long_word_end(doc.text().slice(..), range, count)
544+ .transform(|range| movement::move_next_long_word_end(text, range, count));
574− }),
545+ doc.set_selection(view.id, selection);
575− );
576}
546}
577
547
578fn goto_file_start(cx: &mut Context) {
548fn goto_file_start(cx: &mut Context) {
@@ -590,52 +560,52 @@ fn goto_file_end(cx: &mut Context) {
590fn extend_next_word_start(cx: &mut Context) {
560fn extend_next_word_start(cx: &mut Context) {
591 let count = cx.count();
561 let count = cx.count();
592 let (view, doc) = current!(cx.editor);
562 let (view, doc) = current!(cx.editor);
593− doc.set_selection(
563+ let text = doc.text().slice(..);
594− view.id,
564+
565+ let selection = doc
595− doc.selection(view.id)
566+ .selection(view.id)
596− .clone()
567+ .clone()
597− .min_width_1(doc.text().slice(..))
568+ .min_width_1(text)
598− .transform(|range| {
569+ .transform(|range| {
599− let text = doc.text().slice(..);
600− let word = movement::move_next_word_start(text, range, count);
570+ let word = movement::move_next_word_start(text, range, count);
601− let pos = word.head;
571+ let pos = word.head;
602− range.put(text, pos, true)
572+ range.put(text, pos, true)
603− }),
573+ });
604− );
574+ doc.set_selection(view.id, selection);
605}
575}
606
576
607fn extend_prev_word_start(cx: &mut Context) {
577fn extend_prev_word_start(cx: &mut Context) {
608 let count = cx.count();
578 let count = cx.count();
609 let (view, doc) = current!(cx.editor);
579 let (view, doc) = current!(cx.editor);
610− doc.set_selection(
580+ let text = doc.text().slice(..);
611− view.id,
581+
582+ let selection = doc
612− doc.selection(view.id)
583+ .selection(view.id)
613− .clone()
584+ .clone()
614− .min_width_1(doc.text().slice(..))
585+ .min_width_1(text)
615− .transform(|range| {
586+ .transform(|range| {
616− let text = doc.text().slice(..);
617− let word = movement::move_prev_word_start(text, range, count);
587+ let word = movement::move_prev_word_start(text, range, count);
618− let pos = word.head;
588+ let pos = word.head;
619− range.put(text, pos, true)
589+ range.put(text, pos, true)
620− }),
590+ });
621− );
591+ doc.set_selection(view.id, selection);
622}
592}
623
593
624fn extend_next_word_end(cx: &mut Context) {
594fn extend_next_word_end(cx: &mut Context) {
625 let count = cx.count();
595 let count = cx.count();
626 let (view, doc) = current!(cx.editor);
596 let (view, doc) = current!(cx.editor);
627− doc.set_selection(
597+ let text = doc.text().slice(..);
628− view.id,
598+
599+ let selection = doc
629− doc.selection(view.id)
600+ .selection(view.id)
630− .clone()
601+ .clone()
631− .min_width_1(doc.text().slice(..))
602+ .min_width_1(text)
632− .transform(|range| {
603+ .transform(|range| {
633− let text = doc.text().slice(..);
634− let word = movement::move_next_word_end(text, range, count);
604+ let word = movement::move_next_word_end(text, range, count);
635− let pos = word.head;
605+ let pos = word.head;
636− range.put(text, pos, true)
606+ range.put(text, pos, true)
637− }),
607+ });
638− );
608+ doc.set_selection(view.id, selection);
639}
609}
640
610
641#[inline]
611#[inline]
@@ -678,15 +648,13 @@ where
678 };
648 };
679
649
680 let (view, doc) = current!(cx.editor);
650 let (view, doc) = current!(cx.editor);
651+ let text = doc.text().slice(..);
681
652
682− doc.set_selection(
683− view.id,
684− doc.selection(view.id).clone().transform(|range| {
653+ let selection = doc.selection(view.id).clone().transform(|range| {
685− let text = doc.text().slice(..);
686− search_fn(text, ch, range.head, count, inclusive)
654+ search_fn(text, ch, range.head, count, inclusive)
687− .map_or(range, |pos| range.put(text, pos, extend))
655+ .map_or(range, |pos| range.put(text, pos, extend))
688− }),
656+ });
689− );
657+ doc.set_selection(view.id, selection);
690 })
658 })
691}
659}
692
660
@@ -939,69 +907,45 @@ fn half_page_down(cx: &mut Context) {
939fn extend_char_left(cx: &mut Context) {
907fn extend_char_left(cx: &mut Context) {
940 let count = cx.count();
908 let count = cx.count();
941 let (view, doc) = current!(cx.editor);
909 let (view, doc) = current!(cx.editor);
942− doc.set_selection(
910+ let text = doc.text().slice(..);
943− view.id,
911+
944− doc.selection(view.id).clone().transform(|range| {
912+ let selection = doc.selection(view.id).clone().transform(|range| {
945− movement::move_horizontally(
913+ movement::move_horizontally(text, range, Direction::Backward, count, Movement::Extend)
946− doc.text().slice(..),
947− range,
948− Direction::Backward,
949− count,
950− Movement::Extend,
951− )
952− }),
914+ });
953− );
915+ doc.set_selection(view.id, selection);
954}
916}
955
917
956fn extend_char_right(cx: &mut Context) {
918fn extend_char_right(cx: &mut Context) {
957 let count = cx.count();
919 let count = cx.count();
958 let (view, doc) = current!(cx.editor);
920 let (view, doc) = current!(cx.editor);
959− doc.set_selection(
921+ let text = doc.text().slice(..);
960− view.id,
922+
961− doc.selection(view.id).clone().transform(|range| {
923+ let selection = doc.selection(view.id).clone().transform(|range| {
962− movement::move_horizontally(
924+ movement::move_horizontally(text, range, Direction::Forward, count, Movement::Extend)
963− doc.text().slice(..),
964− range,
965− Direction::Forward,
966− count,
967− Movement::Extend,
968− )
969− }),
925+ });
970− );
926+ doc.set_selection(view.id, selection);
971}
927}
972
928
973fn extend_line_up(cx: &mut Context) {
929fn extend_line_up(cx: &mut Context) {
974 let count = cx.count();
930 let count = cx.count();
975 let (view, doc) = current!(cx.editor);
931 let (view, doc) = current!(cx.editor);
976− doc.set_selection(
932+ let text = doc.text().slice(..);
977− view.id,
933+
978− doc.selection(view.id).clone().transform(|range| {
934+ let selection = doc.selection(view.id).clone().transform(|range| {
979− movement::move_vertically(
935+ movement::move_vertically(text, range, Direction::Backward, count, Movement::Extend)
980− doc.text().slice(..),
981− range,
982− Direction::Backward,
983− count,
984− Movement::Extend,
985− )
986− }),
936+ });
987− );
937+ doc.set_selection(view.id, selection);
988}
938}
989
939
990fn extend_line_down(cx: &mut Context) {
940fn extend_line_down(cx: &mut Context) {
991 let count = cx.count();
941 let count = cx.count();
992 let (view, doc) = current!(cx.editor);
942 let (view, doc) = current!(cx.editor);
993− doc.set_selection(
943+ let text = doc.text().slice(..);
994− view.id,
944+
995− doc.selection(view.id).clone().transform(|range| {
945+ let selection = doc.selection(view.id).clone().transform(|range| {
996− movement::move_vertically(
946+ movement::move_vertically(text, range, Direction::Forward, count, Movement::Extend)
997− doc.text().slice(..),
998− range,
999− Direction::Forward,
1000− count,
1001− Movement::Extend,
1002− )
1003− }),
947+ });
1004− );
948+ doc.set_selection(view.id, selection);
1005}
949}
1006
950
1007fn select_all(cx: &mut Context) {
951fn select_all(cx: &mut Context) {
@@ -1222,30 +1166,28 @@ fn change_selection(cx: &mut Context) {
1222
1166
1223fn collapse_selection(cx: &mut Context) {
1167fn collapse_selection(cx: &mut Context) {
1224 let (view, doc) = current!(cx.editor);
1168 let (view, doc) = current!(cx.editor);
1169+ let text = doc.text().slice(..);
1225
1170
1226− doc.set_selection(
1227− view.id,
1228− doc.selection(view.id).clone().transform(|range| {
1171+ let selection = doc.selection(view.id).clone().transform(|range| {
1229− let pos = if range.head > range.anchor {
1172+ let pos = if range.head > range.anchor {
1230− // For 1-width cursor semantics.
1173+ // For 1-width cursor semantics.
1231− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.head)
1174+ graphemes::prev_grapheme_boundary(text, range.head)
1232− } else {
1175+ } else {
1233− range.head
1176+ range.head
1234− };
1177+ };
1235− Range::new(pos, pos)
1178+ Range::new(pos, pos)
1236− }),
1179+ });
1237− );
1180+ doc.set_selection(view.id, selection);
1238}
1181}
1239
1182
1240fn flip_selections(cx: &mut Context) {
1183fn flip_selections(cx: &mut Context) {
1241 let (view, doc) = current!(cx.editor);
1184 let (view, doc) = current!(cx.editor);
1242
1185
1243− doc.set_selection(
1186+ let selection = doc
1244− view.id,
1245− doc.selection(view.id)
1187+ .selection(view.id)
1246− .clone()
1188+ .clone()
1247− .transform(|range| Range::new(range.head, range.anchor)),
1189+ .transform(|range| Range::new(range.head, range.anchor));
1248− );
1190+ doc.set_selection(view.id, selection);
1249}
1191}
1250
1192
1251fn enter_insert_mode(doc: &mut Document) {
1193fn enter_insert_mode(doc: &mut Document) {
@@ -1257,12 +1199,11 @@ fn insert_mode(cx: &mut Context) {
1257 let (view, doc) = current!(cx.editor);
1199 let (view, doc) = current!(cx.editor);
1258 enter_insert_mode(doc);
1200 enter_insert_mode(doc);
1259
1201
1260− doc.set_selection(
1202+ let selection = doc
1261− view.id,
1262− doc.selection(view.id)
1203+ .selection(view.id)
1263− .clone()
1204+ .clone()
1264− .transform(|range| Range::new(range.to(), range.from())),
1205+ .transform(|range| Range::new(range.to(), range.from()));
1265− );
1206+ doc.set_selection(view.id, selection);
1266}
1207}
1267
1208
1268// inserts at the end of each selection
1209// inserts at the end of each selection
@@ -1286,15 +1227,13 @@ fn append_mode(cx: &mut Context) {
1286 doc.apply(&transaction, view.id);
1227 doc.apply(&transaction, view.id);
1287 }
1228 }
1288
1229
1289− doc.set_selection(
1290− view.id,
1291− selection.clone().transform(|range| {
1230+ let selection = selection.transform(|range| {
1292− Range::new(
1231+ Range::new(
1293− range.from(),
1232+ range.from(),
1294− graphemes::next_grapheme_boundary(doc.text().slice(..), range.to()),
1233+ graphemes::next_grapheme_boundary(doc.text().slice(..), range.to()),
1295− )
1234+ )
1296− }),
1235+ });
1297− );
1236+ doc.set_selection(view.id, selection);
1298}
1237}
1299
1238
1300mod cmd {
1239mod cmd {
@@ -2200,15 +2139,13 @@ fn append_to_line(cx: &mut Context) {
2200 let (view, doc) = current!(cx.editor);
2139 let (view, doc) = current!(cx.editor);
2201 enter_insert_mode(doc);
2140 enter_insert_mode(doc);
2202
2141
2203− doc.set_selection(
2204− view.id,
2205− doc.selection(view.id).clone().transform(|range| {
2142+ let selection = doc.selection(view.id).clone().transform(|range| {
2206− let text = doc.text().slice(..);
2143+ let text = doc.text().slice(..);
2207− let line = range.head_line(text);
2144+ let line = range.head_line(text);
2208− let pos = line_end_char_index(&text, line);
2145+ let pos = line_end_char_index(&text, line);
2209− Range::new(pos, pos)
2146+ Range::new(pos, pos)
2210− }),
2147+ });
2211− );
2148+ doc.set_selection(view.id, selection);
2212}
2149}
2213
2150
2214/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
2151/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
@@ -2338,15 +2275,14 @@ fn normal_mode(cx: &mut Context) {
2338
2275
2339 // if leaving append mode, move cursor back by 1
2276 // if leaving append mode, move cursor back by 1
2340 if doc.restore_cursor {
2277 if doc.restore_cursor {
2341− doc.set_selection(
2278+ let text = doc.text().slice(..);
2342− view.id,
2343− doc.selection(view.id).clone().transform(|range| {
2279+ let selection = doc.selection(view.id).clone().transform(|range| {
2344− Range::new(
2280+ Range::new(
2345− range.from(),
2281+ range.from(),
2346− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.to()),
2282+ graphemes::prev_grapheme_boundary(text, range.to()),
2347− )
2283+ )
2348− }),
2284+ });
2349− );
2285+ doc.set_selection(view.id, selection);
2350
2286
2351 doc.restore_cursor = false;
2287 doc.restore_cursor = false;
2352 }
2288 }
@@ -2370,22 +2306,21 @@ fn goto_last_accessed_file(cx: &mut Context) {
2370
2306
2371fn select_mode(cx: &mut Context) {
2307fn select_mode(cx: &mut Context) {
2372 let (view, doc) = current!(cx.editor);
2308 let (view, doc) = current!(cx.editor);
2309+ let text = doc.text().slice(..);
2373
2310
2374 // Make sure all selections are at least 1-wide.
2311 // Make sure all selections are at least 1-wide.
2375 // (With the exception of being in an empty document, of course.)
2312 // (With the exception of being in an empty document, of course.)
2376− doc.set_selection(
2377− view.id,
2378− doc.selection(view.id).clone().transform(|range| {
2313+ let selection = doc.selection(view.id).clone().transform(|range| {
2379− if range.is_empty() && range.head == doc.text().len_chars() {
2314+ if range.is_empty() && range.head == text.len_chars() {
2380− Range::new(
2315+ Range::new(
2381− graphemes::prev_grapheme_boundary(doc.text().slice(..), range.anchor),
2316+ graphemes::prev_grapheme_boundary(text, range.anchor),
2382− range.head,
2317+ range.head,
2383− )
2318+ )
2384− } else {
2319+ } else {
2385− range.min_width_1(doc.text().slice(..))
2320+ range.min_width_1(text)
2386− }
2321+ }
2387− }),
2322+ });
2388− );
2323+ doc.set_selection(view.id, selection);
2389
2324
2390 doc_mut!(cx.editor).mode = Mode::Select;
2325 doc_mut!(cx.editor).mode = Mode::Select;
2391}
2326}
@@ -2964,13 +2899,13 @@ pub mod insert {
2964 pub fn delete_word_backward(cx: &mut Context) {
2899 pub fn delete_word_backward(cx: &mut Context) {
2965 let count = cx.count();
2900 let count = cx.count();
2966 let (view, doc) = current!(cx.editor);
2901 let (view, doc) = current!(cx.editor);
2902+ let text = doc.text().slice(..);
2967
2903
2968− doc.set_selection(
2904+ let selection = doc
2969− view.id,
2970− doc.selection(view.id).clone().transform(|range| {
2905+ .selection(view.id)
2906+ .clone()
2971− movement::move_prev_word_start(doc.text().slice(..), range, count)
2907+ .transform(|range| movement::move_prev_word_start(text, range, count));
2972− }),
2908+ doc.set_selection(view.id, selection);
2973− );
2974 delete_selection(cx)
2909 delete_selection(cx)
2975 }
2910 }
2976}
2911}
@@ -3721,21 +3656,19 @@ fn select_textobject(cx: &mut Context, objtype: textobject::TextObject) {
3721 } = event
3656 } = event
3722 {
3657 {
3723 let (view, doc) = current!(cx.editor);
3658 let (view, doc) = current!(cx.editor);
3659+ let text = doc.text().slice(..);
3724
3660
3725− doc.set_selection(
3726− view.id,
3727− doc.selection(view.id).clone().transform(|range| {
3661+ let selection = doc.selection(view.id).clone().transform(|range| {
3728− let text = doc.text().slice(..);
3729− match ch {
3662+ match ch {
3730− 'w' => textobject::textobject_word(text, range, objtype, count),
3663+ 'w' => textobject::textobject_word(text, range, objtype, count),
3731− // TODO: cancel new ranges if inconsistent surround matches across lines
3664+ // TODO: cancel new ranges if inconsistent surround matches across lines
3732− ch if !ch.is_ascii_alphanumeric() => {
3665+ ch if !ch.is_ascii_alphanumeric() => {
3733− textobject::textobject_surround(text, range, objtype, ch, count)
3666+ textobject::textobject_surround(text, range, objtype, ch, count)
3734− }
3735− _ => range,
3736 }
3667 }
3668+ _ => range,
3737− }),
3669+ }
3738− );
3670+ });
3671+ doc.set_selection(view.id, selection);
3739 }
3672 }
3740 })
3673 })
3741}
3674}