@@ -121,7 +121,10 @@ enum Align {
123fn align_view(doc: &Document, view: &mut View, align: Align) {
123fn align_view(doc: &Document, view: &mut View, align: Align) {
124− let pos = doc.selection(view.id).cursor(doc.text().slice(..));
127+ .cursor(doc.text().slice(..));
125 let line = doc.text().char_to_line(pos);
128 let line = doc.text().char_to_line(pos);
127 let relative = match align {
130 let relative = match align {
@@ -372,17 +375,13 @@ fn goto_line_end(cx: &mut Context) {
372 let text = doc.text().slice(..);
375 let text = doc.text().slice(..);
374 let selection = doc.selection(view.id).clone().transform(|range| {
377 let selection = doc.selection(view.id).clone().transform(|range| {
375− let line = range.head_line(text);
378+ let line = range.cursor_line(text);
376 let line_start = text.line_to_char(line);
379 let line_start = text.line_to_char(line);
378 let pos = graphemes::prev_grapheme_boundary(text, line_end_char_index(&text, line))
381 let pos = graphemes::prev_grapheme_boundary(text, line_end_char_index(&text, line))
379 .max(line_start);
382 .max(line_start);
381− if doc.mode == Mode::Select {
384+ range.put_cursor(text, pos, doc.mode == Mode::Select)
382− range.move_head(text, pos, true)
387 doc.set_selection(view.id, selection);
386 doc.set_selection(view.id, selection);
@@ -392,14 +391,10 @@ fn goto_line_end_newline(cx: &mut Context) {
392 let text = doc.text().slice(..);
391 let text = doc.text().slice(..);
394 let selection = doc.selection(view.id).clone().transform(|range| {
393 let selection = doc.selection(view.id).clone().transform(|range| {
395− let line = range.head_line(text);
394+ let line = range.cursor_line(text);
396 let pos = line_end_char_index(&text, line);
395 let pos = line_end_char_index(&text, line);
398− if doc.mode == Mode::Select {
397+ range.put_cursor(text, pos, doc.mode == Mode::Select)
399− range.move_head(text, pos, true)
404 doc.set_selection(view.id, selection);
399 doc.set_selection(view.id, selection);
@@ -409,15 +404,11 @@ fn goto_line_start(cx: &mut Context) {
409 let text = doc.text().slice(..);
404 let text = doc.text().slice(..);
411 let selection = doc.selection(view.id).clone().transform(|range| {
406 let selection = doc.selection(view.id).clone().transform(|range| {
412− let line = range.head_line(text);
407+ let line = range.cursor_line(text);
414 // adjust to start of the line
409 // adjust to start of the line
415 let pos = text.line_to_char(line);
410 let pos = text.line_to_char(line);
416− if doc.mode == Mode::Select {
411+ range.put_cursor(text, pos, doc.mode == Mode::Select)
417− range.move_head(text, pos, true)
422 doc.set_selection(view.id, selection);
413 doc.set_selection(view.id, selection);
@@ -427,15 +418,11 @@ fn goto_first_nonwhitespace(cx: &mut Context) {
427 let text = doc.text().slice(..);
418 let text = doc.text().slice(..);
429 let selection = doc.selection(view.id).clone().transform(|range| {
420 let selection = doc.selection(view.id).clone().transform(|range| {
430− let line = range.head_line(text);
421+ let line = range.cursor_line(text);
432 if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
423 if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
433 let pos = pos + text.line_to_char(line);
424 let pos = pos + text.line_to_char(line);
434− if doc.mode == Mode::Select {
425+ range.put_cursor(text, pos, doc.mode == Mode::Select)
435− range.move_head(text, pos, true)
@@ -579,8 +566,8 @@ fn extend_next_word_start(cx: &mut Context) {
579 .min_width_1(text)
566 .min_width_1(text)
580 .transform(|range| {
567 .transform(|range| {
581 let word = movement::move_next_word_start(text, range, count);
568 let word = movement::move_next_word_start(text, range, count);
582− let pos = graphemes::prev_grapheme_boundary(text, word.head);
569+ let pos = word.cursor(text);
583− range.move_head(text, pos, true)
570+ range.put_cursor(text, pos, true)
585 doc.set_selection(view.id, selection);
572 doc.set_selection(view.id, selection);
@@ -596,8 +583,8 @@ fn extend_prev_word_start(cx: &mut Context) {
596 .min_width_1(text)
583 .min_width_1(text)
597 .transform(|range| {
584 .transform(|range| {
598 let word = movement::move_prev_word_start(text, range, count);
585 let word = movement::move_prev_word_start(text, range, count);
599− let pos = word.head;
586+ let pos = word.cursor(text);
600− range.move_head(text, pos, true)
587+ range.put_cursor(text, pos, true)
602 doc.set_selection(view.id, selection);
589 doc.set_selection(view.id, selection);
@@ -613,8 +600,8 @@ fn extend_next_word_end(cx: &mut Context) {
613 .min_width_1(text)
600 .min_width_1(text)
614 .transform(|range| {
601 .transform(|range| {
615 let word = movement::move_next_word_end(text, range, count);
602 let word = movement::move_next_word_end(text, range, count);
616− let pos = graphemes::prev_grapheme_boundary(text, word.head);
603+ let pos = word.cursor(text);
617− range.move_head(text, pos, true)
604+ range.put_cursor(text, pos, true)
619 doc.set_selection(view.id, selection);
606 doc.set_selection(view.id, selection);
@@ -663,18 +650,13 @@ where
664 let selection = doc.selection(view.id).clone().transform(|range| {
651 let selection = doc.selection(view.id).clone().transform(|range| {
665 let range = if range.anchor < range.head {
652 let range = if range.anchor < range.head {
666− // For 1-width cursor semantics.
653+ // For block-cursor semantics.
667 Range::new(range.anchor, range.head - 1)
654 Range::new(range.anchor, range.head - 1)
671− search_fn(text, ch, range.head, count, inclusive).map_or(range, |pos| {
658+ search_fn(text, ch, range.head, count, inclusive)
672− if extend {
659+ .map_or(range, |pos| range.put_cursor(text, pos, extend))
673− range.move_head(text, pos, true)
679 doc.set_selection(view.id, selection);
661 doc.set_selection(view.id, selection);
@@ -895,7 +877,9 @@ fn scroll(cx: &mut Context, offset: usize, direction: Direction) {
895 let (view, doc) = current!(cx.editor);
877 let (view, doc) = current!(cx.editor);
896 let cursor = coords_at_pos(
878 let cursor = coords_at_pos(
897 doc.text().slice(..),
879 doc.text().slice(..),
898− doc.selection(view.id).cursor(doc.text().slice(..)),
880+ doc.selection(view.id)
882+ .cursor(doc.text().slice(..)),
900 let doc_last_line = doc.text().len_lines() - 1;
884 let doc_last_line = doc.text().len_lines() - 1;
@@ -1220,12 +1204,7 @@ fn collapse_selection(cx: &mut Context) {
1220 let text = doc.text().slice(..);
1204 let text = doc.text().slice(..);
1222 let selection = doc.selection(view.id).clone().transform(|range| {
1206 let selection = doc.selection(view.id).clone().transform(|range| {
1223− let pos = if range.head > range.anchor {
1207+ let pos = range.cursor(text);
1224− // For 1-width cursor semantics.
1225− graphemes::prev_grapheme_boundary(text, range.head)
1229 Range::new(pos, pos)
1208 Range::new(pos, pos)
1231 doc.set_selection(view.id, selection);
1210 doc.set_selection(view.id, selection);
@@ -2203,7 +2182,7 @@ fn append_to_line(cx: &mut Context) {
2204 let selection = doc.selection(view.id).clone().transform(|range| {
2183 let selection = doc.selection(view.id).clone().transform(|range| {
2205 let text = doc.text().slice(..);
2184 let text = doc.text().slice(..);
2206− let line = range.head_line(text);
2185+ let line = range.cursor_line(text);
2207 let pos = line_end_char_index(&text, line);
2186 let pos = line_end_char_index(&text, line);
2208 Range::new(pos, pos)
2187 Range::new(pos, pos)
@@ -2264,7 +2243,7 @@ fn open(cx: &mut Context, open: Open) {
2264 let mut offs = 0;
2243 let mut offs = 0;
2266 let mut transaction = Transaction::change_by_selection(contents, selection, |range| {
2245 let mut transaction = Transaction::change_by_selection(contents, selection, |range| {
2267− let line = range.head_line(text);
2246+ let line = range.cursor_line(text);
2269 let line = match open {
2248 let line = match open {
2270 // adjust position to the end of the line (next line - 1)
2249 // adjust position to the end of the line (next line - 1)
@@ -2472,7 +2451,9 @@ fn goto_definition(cx: &mut Context) {
2473 let pos = pos_to_lsp_pos(
2452 let pos = pos_to_lsp_pos(
2474 doc.text(),
2453 doc.text(),
2475− doc.selection(view.id).cursor(doc.text().slice(..)),
2454+ doc.selection(view.id)
2456+ .cursor(doc.text().slice(..)),
2476 offset_encoding,
2457 offset_encoding,
@@ -2513,7 +2494,9 @@ fn goto_type_definition(cx: &mut Context) {
2514 let pos = pos_to_lsp_pos(
2495 let pos = pos_to_lsp_pos(
2515 doc.text(),
2496 doc.text(),
2516− doc.selection(view.id).cursor(doc.text().slice(..)),
2497+ doc.selection(view.id)
2499+ .cursor(doc.text().slice(..)),
2517 offset_encoding,
2500 offset_encoding,
@@ -2554,7 +2537,9 @@ fn goto_implementation(cx: &mut Context) {
2555 let pos = pos_to_lsp_pos(
2538 let pos = pos_to_lsp_pos(
2556 doc.text(),
2539 doc.text(),
2557− doc.selection(view.id).cursor(doc.text().slice(..)),
2540+ doc.selection(view.id)
2542+ .cursor(doc.text().slice(..)),
2558 offset_encoding,
2543 offset_encoding,
@@ -2595,7 +2580,9 @@ fn goto_reference(cx: &mut Context) {
2596 let pos = pos_to_lsp_pos(
2581 let pos = pos_to_lsp_pos(
2597 doc.text(),
2582 doc.text(),
2598− doc.selection(view.id).cursor(doc.text().slice(..)),
2583+ doc.selection(view.id)
2585+ .cursor(doc.text().slice(..)),
2599 offset_encoding,
2586 offset_encoding,
@@ -2656,7 +2643,10 @@ fn goto_next_diag(cx: &mut Context) {
2656 let editor = &mut cx.editor;
2643 let editor = &mut cx.editor;
2657 let (view, doc) = current!(editor);
2644 let (view, doc) = current!(editor);
2646+ let cursor_pos = doc
2647+ .selection(view.id)
2659− let cursor_pos = doc.selection(view.id).cursor(doc.text().slice(..));
2649+ .cursor(doc.text().slice(..));
2660 let diag = if let Some(diag) = doc
2650 let diag = if let Some(diag) = doc
2661 .diagnostics()
2651 .diagnostics()
@@ -2677,7 +2667,10 @@ fn goto_prev_diag(cx: &mut Context) {
2677 let editor = &mut cx.editor;
2667 let editor = &mut cx.editor;
2678 let (view, doc) = current!(editor);
2668 let (view, doc) = current!(editor);
2670+ let cursor_pos = doc
2671+ .selection(view.id)
2680− let cursor_pos = doc.selection(view.id).cursor(doc.text().slice(..));
2673+ .cursor(doc.text().slice(..));
2681 let diag = if let Some(diag) = doc
2674 let diag = if let Some(diag) = doc
2682 .diagnostics()
2675 .diagnostics()
@@ -2705,7 +2698,9 @@ fn signature_help(cx: &mut Context) {
2706 let pos = pos_to_lsp_pos(
2699 let pos = pos_to_lsp_pos(
2707 doc.text(),
2700 doc.text(),
2708− doc.selection(view.id).cursor(doc.text().slice(..)),
2701+ doc.selection(view.id)
2703+ .cursor(doc.text().slice(..)),
2709 language_server.offset_encoding(),
2704 language_server.offset_encoding(),
@@ -3457,7 +3452,10 @@ fn completion(cx: &mut Context) {
3459 let offset_encoding = language_server.offset_encoding();
3454 let offset_encoding = language_server.offset_encoding();
3456+ .selection(view.id)
3460− let cursor = doc.selection(view.id).cursor(doc.text().slice(..));
3458+ .cursor(doc.text().slice(..));
3462 let pos = pos_to_lsp_pos(doc.text(), cursor, offset_encoding);
3460 let pos = pos_to_lsp_pos(doc.text(), cursor, offset_encoding);
@@ -3514,7 +3512,9 @@ fn hover(cx: &mut Context) {
3515 let pos = pos_to_lsp_pos(
3513 let pos = pos_to_lsp_pos(
3516 doc.text(),
3514 doc.text(),
3517− doc.selection(view.id).cursor(doc.text().slice(..)),
3515+ doc.selection(view.id)
3517+ .cursor(doc.text().slice(..)),
3518 language_server.offset_encoding(),
3518 language_server.offset_encoding(),
@@ -3580,7 +3580,10 @@ fn match_brackets(cx: &mut Context) {
3580 let (view, doc) = current!(cx.editor);
3580 let (view, doc) = current!(cx.editor);
3582 if let Some(syntax) = doc.syntax() {
3582 if let Some(syntax) = doc.syntax() {
3584+ .selection(view.id)
3583− let pos = doc.selection(view.id).cursor(doc.text().slice(..));
3586+ .cursor(doc.text().slice(..));
3584 if let Some(pos) = match_brackets::find(syntax, doc.text(), pos) {
3587 if let Some(pos) = match_brackets::find(syntax, doc.text(), pos) {
3585 let selection = Selection::point(pos);
3588 let selection = Selection::point(pos);
3586 doc.set_selection(view.id, selection);
3589 doc.set_selection(view.id, selection);
@@ -3684,7 +3687,10 @@ fn align_view_bottom(cx: &mut Context) {
3685fn align_view_middle(cx: &mut Context) {
3688fn align_view_middle(cx: &mut Context) {
3686 let (view, doc) = current!(cx.editor);
3689 let (view, doc) = current!(cx.editor);
3691+ .selection(view.id)
3687− let pos = doc.selection(view.id).cursor(doc.text().slice(..));
3693+ .cursor(doc.text().slice(..));
3688 let pos = coords_at_pos(doc.text().slice(..), pos);
3694 let pos = coords_at_pos(doc.text().slice(..), pos);
3690 const OFFSET: usize = 7; // gutters
3696 const OFFSET: usize = 7; // gutters