@@ -310,48 +310,44 @@ impl PartialEq for Command {
310fn move_char_left(cx: &mut Context) {
310fn move_char_left(cx: &mut Context) {
311 let count = cx.count();
311 let count = cx.count();
312 let (view, doc) = current!(cx.editor);
312 let (view, doc) = current!(cx.editor);
313− let text = doc.text().slice(..);
313+ let (text, selection) = doc.text_and_mut_selection(view.id);
314− let selection = doc.selection(view.id).transform(|range| {
314+ selection.transform(|range| {
315 movement::move_horizontally(text, range, Direction::Backward, count, Movement::Move)
315 movement::move_horizontally(text, range, Direction::Backward, count, Movement::Move)
317− doc.set_selection(view.id, selection);
320fn move_char_right(cx: &mut Context) {
319fn move_char_right(cx: &mut Context) {
321 let count = cx.count();
320 let count = cx.count();
322 let (view, doc) = current!(cx.editor);
321 let (view, doc) = current!(cx.editor);
323− let text = doc.text().slice(..);
322+ let (text, selection) = doc.text_and_mut_selection(view.id);
324− let selection = doc.selection(view.id).transform(|range| {
323+ selection.transform(|range| {
325 movement::move_horizontally(text, range, Direction::Forward, count, Movement::Move)
324 movement::move_horizontally(text, range, Direction::Forward, count, Movement::Move)
327− doc.set_selection(view.id, selection);
330fn move_line_up(cx: &mut Context) {
328fn move_line_up(cx: &mut Context) {
331 let count = cx.count();
329 let count = cx.count();
332 let (view, doc) = current!(cx.editor);
330 let (view, doc) = current!(cx.editor);
333− let text = doc.text().slice(..);
331+ let (text, selection) = doc.text_and_mut_selection(view.id);
334− let selection = doc.selection(view.id).transform(|range| {
332+ selection.transform(|range| {
335 movement::move_vertically(text, range, Direction::Backward, count, Movement::Move)
333 movement::move_vertically(text, range, Direction::Backward, count, Movement::Move)
337− doc.set_selection(view.id, selection);
340fn move_line_down(cx: &mut Context) {
337fn move_line_down(cx: &mut Context) {
341 let count = cx.count();
338 let count = cx.count();
342 let (view, doc) = current!(cx.editor);
339 let (view, doc) = current!(cx.editor);
343− let text = doc.text().slice(..);
340+ let (text, selection) = doc.text_and_mut_selection(view.id);
344− let selection = doc.selection(view.id).transform(|range| {
341+ selection.transform(|range| {
345 movement::move_vertically(text, range, Direction::Forward, count, Movement::Move)
342 movement::move_vertically(text, range, Direction::Forward, count, Movement::Move)
347− doc.set_selection(view.id, selection);
350fn move_line_end(cx: &mut Context) {
346fn move_line_end(cx: &mut Context) {
351 let (view, doc) = current!(cx.editor);
347 let (view, doc) = current!(cx.editor);
353− let selection = doc.selection(view.id).transform(|range| {
349+ let (text, selection) = doc.text_and_mut_selection(view.id);
354− let text = doc.text();
350+ selection.transform(|range| {
355 let line = text.char_to_line(range.head);
351 let line = text.char_to_line(range.head);
357 let pos = line_end_char_index(&text.slice(..), line);
353 let pos = line_end_char_index(&text.slice(..), line);
@@ -360,30 +356,26 @@ fn move_line_end(cx: &mut Context) {
361 Range::new(pos, pos)
357 Range::new(pos, pos)
364− doc.set_selection(view.id, selection);
367fn move_line_start(cx: &mut Context) {
361fn move_line_start(cx: &mut Context) {
368 let (view, doc) = current!(cx.editor);
362 let (view, doc) = current!(cx.editor);
370− let selection = doc.selection(view.id).transform(|range| {
364+ let (text, selection) = doc.text_and_mut_selection(view.id);
371− let text = doc.text();
365+ selection.transform(|range| {
372 let line = text.char_to_line(range.head);
366 let line = text.char_to_line(range.head);
374 // adjust to start of the line
368 // adjust to start of the line
375 let pos = text.line_to_char(line);
369 let pos = text.line_to_char(line);
376 Range::new(pos, pos)
370 Range::new(pos, pos)
379− doc.set_selection(view.id, selection);
382fn move_first_nonwhitespace(cx: &mut Context) {
374fn move_first_nonwhitespace(cx: &mut Context) {
383 let (view, doc) = current!(cx.editor);
375 let (view, doc) = current!(cx.editor);
385− let selection = doc.selection(view.id).transform(|range| {
377+ let (text, selection) = doc.text_and_mut_selection(view.id);
386− let text = doc.text();
378+ selection.transform(|range| {
387 let line_idx = text.char_to_line(range.head);
379 let line_idx = text.char_to_line(range.head);
389 if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
381 if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
@@ -393,8 +385,6 @@ fn move_first_nonwhitespace(cx: &mut Context) {
397− doc.set_selection(view.id, selection);
400// TODO: move vs extend could take an extra type Extend/Move that would
390// TODO: move vs extend could take an extra type Extend/Move that would
@@ -404,73 +394,49 @@ fn move_first_nonwhitespace(cx: &mut Context) {
404fn move_next_word_start(cx: &mut Context) {
394fn move_next_word_start(cx: &mut Context) {
405 let count = cx.count();
395 let count = cx.count();
406 let (view, doc) = current!(cx.editor);
396 let (view, doc) = current!(cx.editor);
407− let text = doc.text().slice(..);
409− let selection = doc
398+ let (text, selection) = doc.text_and_mut_selection(view.id);
411− .transform(|range| movement::move_next_word_start(text, range, count));
399+ selection.transform(|range| movement::move_next_word_start(text, range, count));
413− doc.set_selection(view.id, selection);
416fn move_prev_word_start(cx: &mut Context) {
402fn move_prev_word_start(cx: &mut Context) {
417 let count = cx.count();
403 let count = cx.count();
418 let (view, doc) = current!(cx.editor);
404 let (view, doc) = current!(cx.editor);
419− let text = doc.text().slice(..);
421− let selection = doc
406+ let (text, selection) = doc.text_and_mut_selection(view.id);
423− .transform(|range| movement::move_prev_word_start(text, range, count));
407+ selection.transform(|range| movement::move_prev_word_start(text, range, count));
425− doc.set_selection(view.id, selection);
428fn move_next_word_end(cx: &mut Context) {
410fn move_next_word_end(cx: &mut Context) {
429 let count = cx.count();
411 let count = cx.count();
430 let (view, doc) = current!(cx.editor);
412 let (view, doc) = current!(cx.editor);
431− let text = doc.text().slice(..);
433− let selection = doc
414+ let (text, selection) = doc.text_and_mut_selection(view.id);
435− .transform(|range| movement::move_next_word_end(text, range, count));
415+ selection.transform(|range| movement::move_next_word_end(text, range, count));
437− doc.set_selection(view.id, selection);
440fn move_next_long_word_start(cx: &mut Context) {
418fn move_next_long_word_start(cx: &mut Context) {
441 let count = cx.count();
419 let count = cx.count();
442 let (view, doc) = current!(cx.editor);
420 let (view, doc) = current!(cx.editor);
443− let text = doc.text().slice(..);
447− .transform(|range| movement::move_next_long_word_start(text, range, count));
449− doc.set_selection(view.id, selection);
422+ let (text, selection) = doc.text_and_mut_selection(view.id);
423+ selection.transform(|range| movement::move_next_long_word_start(text, range, count));
452fn move_prev_long_word_start(cx: &mut Context) {
426fn move_prev_long_word_start(cx: &mut Context) {
453 let count = cx.count();
427 let count = cx.count();
454 let (view, doc) = current!(cx.editor);
428 let (view, doc) = current!(cx.editor);
455− let text = doc.text().slice(..);
457− let selection = doc
430+ let (text, selection) = doc.text_and_mut_selection(view.id);
459− .transform(|range| movement::move_prev_long_word_start(text, range, count));
431+ selection.transform(|range| movement::move_prev_long_word_start(text, range, count));
461− doc.set_selection(view.id, selection);
464fn move_next_long_word_end(cx: &mut Context) {
434fn move_next_long_word_end(cx: &mut Context) {
465 let count = cx.count();
435 let count = cx.count();
466 let (view, doc) = current!(cx.editor);
436 let (view, doc) = current!(cx.editor);
467− let text = doc.text().slice(..);
471− .transform(|range| movement::move_next_long_word_end(text, range, count));
473− doc.set_selection(view.id, selection);
438+ let (text, selection) = doc.text_and_mut_selection(view.id);
439+ selection.transform(|range| movement::move_next_long_word_end(text, range, count));
476fn move_file_start(cx: &mut Context) {
442fn move_file_start(cx: &mut Context) {
@@ -490,42 +456,37 @@ fn move_file_end(cx: &mut Context) {
490fn extend_next_word_start(cx: &mut Context) {
456fn extend_next_word_start(cx: &mut Context) {
491 let count = cx.count();
457 let count = cx.count();
492 let (view, doc) = current!(cx.editor);
458 let (view, doc) = current!(cx.editor);
493− let text = doc.text().slice(..);
460+ let (text, selection) = doc.text_and_mut_selection(view.id);
495− let selection = doc.selection(view.id).transform(|mut range| {
461+ selection.transform(|mut range| {
496 let word = movement::move_next_word_start(text, range, count);
462 let word = movement::move_next_word_start(text, range, count);
497 let pos = word.head;
463 let pos = word.head;
498 Range::new(range.anchor, pos)
464 Range::new(range.anchor, pos)
501− doc.set_selection(view.id, selection);
504fn extend_prev_word_start(cx: &mut Context) {
468fn extend_prev_word_start(cx: &mut Context) {
505 let count = cx.count();
469 let count = cx.count();
506 let (view, doc) = current!(cx.editor);
470 let (view, doc) = current!(cx.editor);
507− let text = doc.text().slice(..);
472+ let (text, selection) = doc.text_and_mut_selection(view.id);
509− let selection = doc.selection(view.id).transform(|mut range| {
473+ selection.transform(|mut range| {
510 let word = movement::move_prev_word_start(text, range, count);
474 let word = movement::move_prev_word_start(text, range, count);
511 let pos = word.head;
475 let pos = word.head;
512 Range::new(range.anchor, pos)
476 Range::new(range.anchor, pos)
514− doc.set_selection(view.id, selection);
517fn extend_next_word_end(cx: &mut Context) {
480fn extend_next_word_end(cx: &mut Context) {
518 let count = cx.count();
481 let count = cx.count();
519 let (view, doc) = current!(cx.editor);
482 let (view, doc) = current!(cx.editor);
520− let text = doc.text().slice(..);
484+ let (text, selection) = doc.text_and_mut_selection(view.id);
522− let selection = doc.selection(view.id).transform(|mut range| {
485+ selection.transform(|mut range| {
523 let word = movement::move_next_word_end(text, range, count);
486 let word = movement::move_next_word_end(text, range, count);
524 let pos = word.head;
487 let pos = word.head;
525 Range::new(range.anchor, pos)
488 Range::new(range.anchor, pos)
528− doc.set_selection(view.id, selection);
@@ -568,9 +529,9 @@ where
570 let (view, doc) = current!(cx.editor);
531 let (view, doc) = current!(cx.editor);
571− let text = doc.text().slice(..);
533+ let (text, selection) = doc.text_and_mut_selection(view.id);
573− let selection = doc.selection(view.id).transform(|mut range| {
534+ selection.transform(|mut range| {
574 search_fn(text, ch, range.head, count, inclusive).map_or(range, |pos| {
535 search_fn(text, ch, range.head, count, inclusive).map_or(range, |pos| {
575 if extend {
536 if extend {
576 Range::new(range.anchor, pos)
537 Range::new(range.anchor, pos)
@@ -581,8 +542,6 @@ where
581 // or (pos, pos) to move to found val
542 // or (pos, pos) to move to found val
585− doc.set_selection(view.id, selection);
@@ -661,8 +620,8 @@ fn extend_prev_char(cx: &mut Context) {
661fn extend_first_nonwhitespace(cx: &mut Context) {
620fn extend_first_nonwhitespace(cx: &mut Context) {
662 let (view, doc) = current!(cx.editor);
621 let (view, doc) = current!(cx.editor);
664− let selection = doc.selection(view.id).transform(|range| {
623+ let (text, selection) = doc.text_and_mut_selection(view.id);
665− let text = doc.text();
624+ selection.transform(|range| {
666 let line_idx = text.char_to_line(range.head);
625 let line_idx = text.char_to_line(range.head);
668 if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
627 if let Some(pos) = find_first_non_whitespace_char(text.line(line_idx)) {
@@ -672,8 +631,6 @@ fn extend_first_nonwhitespace(cx: &mut Context) {
676− doc.set_selection(view.id, selection);
679fn replace(cx: &mut Context) {
636fn replace(cx: &mut Context) {
@@ -784,48 +741,44 @@ fn half_page_down(cx: &mut Context) {
784fn extend_char_left(cx: &mut Context) {
741fn extend_char_left(cx: &mut Context) {
785 let count = cx.count();
742 let count = cx.count();
786 let (view, doc) = current!(cx.editor);
743 let (view, doc) = current!(cx.editor);
787− let text = doc.text().slice(..);
744+ let (text, selection) = doc.text_and_mut_selection(view.id);
788− let selection = doc.selection(view.id).transform(|range| {
745+ selection.transform(|range| {
789 movement::move_horizontally(text, range, Direction::Backward, count, Movement::Extend)
746 movement::move_horizontally(text, range, Direction::Backward, count, Movement::Extend)
791− doc.set_selection(view.id, selection);
794fn extend_char_right(cx: &mut Context) {
750fn extend_char_right(cx: &mut Context) {
795 let count = cx.count();
751 let count = cx.count();
796 let (view, doc) = current!(cx.editor);
752 let (view, doc) = current!(cx.editor);
797− let text = doc.text().slice(..);
753+ let (text, selection) = doc.text_and_mut_selection(view.id);
798− let selection = doc.selection(view.id).transform(|range| {
754+ selection.transform(|range| {
799 movement::move_horizontally(text, range, Direction::Forward, count, Movement::Extend)
755 movement::move_horizontally(text, range, Direction::Forward, count, Movement::Extend)
801− doc.set_selection(view.id, selection);
804fn extend_line_up(cx: &mut Context) {
759fn extend_line_up(cx: &mut Context) {
805 let count = cx.count();
760 let count = cx.count();
806 let (view, doc) = current!(cx.editor);
761 let (view, doc) = current!(cx.editor);
807− let text = doc.text().slice(..);
762+ let (text, selection) = doc.text_and_mut_selection(view.id);
808− let selection = doc.selection(view.id).transform(|range| {
763+ selection.transform(|range| {
809 movement::move_vertically(text, range, Direction::Backward, count, Movement::Extend)
764 movement::move_vertically(text, range, Direction::Backward, count, Movement::Extend)
811− doc.set_selection(view.id, selection);
814fn extend_line_down(cx: &mut Context) {
768fn extend_line_down(cx: &mut Context) {
815 let count = cx.count();
769 let count = cx.count();
816 let (view, doc) = current!(cx.editor);
770 let (view, doc) = current!(cx.editor);
817− let text = doc.text().slice(..);
771+ let (text, selection) = doc.text_and_mut_selection(view.id);
818− let selection = doc.selection(view.id).transform(|range| {
772+ selection.transform(|range| {
819 movement::move_vertically(text, range, Direction::Forward, count, Movement::Extend)
773 movement::move_vertically(text, range, Direction::Forward, count, Movement::Extend)
821− doc.set_selection(view.id, selection);
824fn extend_line_end(cx: &mut Context) {
777fn extend_line_end(cx: &mut Context) {
825 let (view, doc) = current!(cx.editor);
778 let (view, doc) = current!(cx.editor);
827− let selection = doc.selection(view.id).transform(|range| {
780+ let (text, selection) = doc.text_and_mut_selection(view.id);
828− let text = doc.text();
781+ selection.transform(|range| {
829 let line = text.char_to_line(range.head);
782 let line = text.char_to_line(range.head);
831 let pos = line_end_char_index(&text.slice(..), line);
784 let pos = line_end_char_index(&text.slice(..), line);
@@ -834,23 +787,19 @@ fn extend_line_end(cx: &mut Context) {
835 Range::new(range.anchor, pos)
788 Range::new(range.anchor, pos)
838− doc.set_selection(view.id, selection);
841fn extend_line_start(cx: &mut Context) {
792fn extend_line_start(cx: &mut Context) {
842 let (view, doc) = current!(cx.editor);
793 let (view, doc) = current!(cx.editor);
844− let selection = doc.selection(view.id).transform(|range| {
795+ let (text, selection) = doc.text_and_mut_selection(view.id);
845− let text = doc.text();
796+ selection.transform(|range| {
846 let line = text.char_to_line(range.head);
797 let line = text.char_to_line(range.head);
848 // adjust to start of the line
799 // adjust to start of the line
849 let pos = text.line_to_char(line);
800 let pos = text.line_to_char(line);
850 Range::new(range.anchor, pos)
801 Range::new(range.anchor, pos)
853− doc.set_selection(view.id, selection);
856fn select_all(cx: &mut Context) {
805fn select_all(cx: &mut Context) {
@@ -1043,20 +992,16 @@ fn change_selection(cx: &mut Context) {
1044fn collapse_selection(cx: &mut Context) {
993fn collapse_selection(cx: &mut Context) {
1045 let (view, doc) = current!(cx.editor);
994 let (view, doc) = current!(cx.editor);
1046− let selection = doc
1047− .selection(view.id)
1048− .transform(|range| Range::new(range.head, range.head));
1050− doc.set_selection(view.id, selection);
996+ doc.selection_mut(view.id)
997+ .transform(|range| Range::new(range.head, range.head));
1053fn flip_selections(cx: &mut Context) {
1000fn flip_selections(cx: &mut Context) {
1054 let (view, doc) = current!(cx.editor);
1001 let (view, doc) = current!(cx.editor);
1055− let selection = doc
1056− .selection(view.id)
1057− .transform(|range| Range::new(range.head, range.anchor));
1059− doc.set_selection(view.id, selection);
1003+ doc.selection_mut(view.id)
1004+ .transform(|range| Range::new(range.head, range.anchor));
1062fn enter_insert_mode(doc: &mut Document) {
1007fn enter_insert_mode(doc: &mut Document) {
@@ -1068,10 +1013,8 @@ fn insert_mode(cx: &mut Context) {
1068 let (view, doc) = current!(cx.editor);
1013 let (view, doc) = current!(cx.editor);
1069 enter_insert_mode(doc);
1014 enter_insert_mode(doc);
1071− let selection = doc
1016+ doc.selection_mut(view.id)
1072− .selection(view.id)
1073 .transform(|range| Range::new(range.to(), range.from()));
1017 .transform(|range| Range::new(range.to(), range.from()));
1074− doc.set_selection(view.id, selection);
1077// inserts at the end of each selection
1020// inserts at the end of each selection
@@ -1080,8 +1023,8 @@ fn append_mode(cx: &mut Context) {
1080 enter_insert_mode(doc);
1023 enter_insert_mode(doc);
1081 doc.restore_cursor = true;
1024 doc.restore_cursor = true;
1083− let text = doc.text().slice(..);
1026+ let (text, selection) = doc.text_and_mut_selection(view.id);
1084− let selection = doc.selection(view.id).transform(|range| {
1027+ selection.transform(|range| {
1085 Range::new(
1028 Range::new(
1086 range.from(),
1029 range.from(),
1087 graphemes::next_grapheme_boundary(text, range.to()), // to() + next char
1030 graphemes::next_grapheme_boundary(text, range.to()), // to() + next char
@@ -1097,8 +1040,6 @@ fn append_mode(cx: &mut Context) {
1098 doc.apply(&transaction, view.id);
1041 doc.apply(&transaction, view.id);
1101− doc.set_selection(view.id, selection);
1104mod cmd {
1045mod cmd {
@@ -1904,13 +1845,12 @@ fn append_to_line(cx: &mut Context) {
1904 let (view, doc) = current!(cx.editor);
1845 let (view, doc) = current!(cx.editor);
1905 enter_insert_mode(doc);
1846 enter_insert_mode(doc);
1907− let selection = doc.selection(view.id).transform(|range| {
1848+ let (text, selection) = doc.text_and_mut_selection(view.id);
1908− let text = doc.text();
1849+ selection.transform(|range| {
1909 let line = text.char_to_line(range.head);
1850 let line = text.char_to_line(range.head);
1910 let pos = line_end_char_index(&text.slice(..), line);
1851 let pos = line_end_char_index(&text.slice(..), line);
1911 Range::new(pos, pos)
1852 Range::new(pos, pos)
1913− doc.set_selection(view.id, selection);
1916/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
1856/// Sometimes when applying formatting changes we want to mark the buffer as unmodified, for
@@ -2040,14 +1980,13 @@ fn normal_mode(cx: &mut Context) {
2041 // if leaving append mode, move cursor back by 1
1981 // if leaving append mode, move cursor back by 1
2042 if doc.restore_cursor {
1982 if doc.restore_cursor {
2043− let text = doc.text().slice(..);
1983+ let (text, selection) = doc.text_and_mut_selection(view.id);
2044− let selection = doc.selection(view.id).transform(|range| {
1984+ selection.transform(|range| {
2045 Range::new(
1985 Range::new(
2046 range.from(),
1986 range.from(),
2047 graphemes::prev_grapheme_boundary(text, range.to()),
1987 graphemes::prev_grapheme_boundary(text, range.to()),
2050− doc.set_selection(view.id, selection);
2052 doc.restore_cursor = false;
1991 doc.restore_cursor = false;
@@ -2679,11 +2618,9 @@ pub mod insert {
2679 pub fn delete_word_backward(cx: &mut Context) {
2618 pub fn delete_word_backward(cx: &mut Context) {
2680 let count = cx.count();
2619 let count = cx.count();
2681 let (view, doc) = current!(cx.editor);
2620 let (view, doc) = current!(cx.editor);
2682− let text = doc.text().slice(..);
2621+
2683− let selection = doc
2622+ let (text, selection) = doc.text_and_mut_selection(view.id);
2684− .selection(view.id)
2685− .transform(|range| movement::move_prev_word_start(text, range, count));
2623+ selection.transform(|range| movement::move_prev_word_start(text, range, count));
2686− doc.set_selection(view.id, selection);
2687 delete_selection(cx)
2624 delete_selection(cx)