@@ -121,7 +121,10 @@ enum Align {
121121}
122122
123123fn align_view(doc: &Document, view: &mut View, align: Align) {
124− let pos = doc.selection(view.id).cursor(doc.text().slice(..));
124+ let pos = doc
125+ .selection(view.id)
126+ .primary()
127+ .cursor(doc.text().slice(..));
125128 let line = doc.text().char_to_line(pos);
126129
127130 let relative = match align {
@@ -372,17 +375,13 @@ fn goto_line_end(cx: &mut Context) {
372375 let text = doc.text().slice(..);
373376
374377 let selection = doc.selection(view.id).clone().transform(|range| {
375− let line = range.head_line(text);
378+ let line = range.cursor_line(text);
376379 let line_start = text.line_to_char(line);
377380
378381 let pos = graphemes::prev_grapheme_boundary(text, line_end_char_index(&text, line))
379382 .max(line_start);
380383
381− if doc.mode == Mode::Select {
382− range.move_head(text, pos, true)
383− } else {
384− Range::point(pos)
385− }
384+ range.put_cursor(text, pos, doc.mode == Mode::Select)
386385 });
387386 doc.set_selection(view.id, selection);
388387}
@@ -392,14 +391,10 @@ fn goto_line_end_newline(cx: &mut Context) {
392391 let text = doc.text().slice(..);
393392
394393 let selection = doc.selection(view.id).clone().transform(|range| {
395− let line = range.head_line(text);
394+ let line = range.cursor_line(text);
396395 let pos = line_end_char_index(&text, line);
397396
398− if doc.mode == Mode::Select {
399− range.move_head(text, pos, true)
400− } else {
401− Range::point(pos)
402− }
397+ range.put_cursor(text, pos, doc.mode == Mode::Select)
403398 });
404399 doc.set_selection(view.id, selection);
405400}
@@ -409,15 +404,11 @@ fn goto_line_start(cx: &mut Context) {
409404 let text = doc.text().slice(..);
410405
411406 let selection = doc.selection(view.id).clone().transform(|range| {
412− let line = range.head_line(text);
407+ let line = range.cursor_line(text);
413408
414409 // adjust to start of the line
415410 let pos = text.line_to_char(line);
416− if doc.mode == Mode::Select {
417− range.move_head(text, pos, true)
418− } else {
419− Range::point(pos)
420− }
411+ range.put_cursor(text, pos, doc.mode == Mode::Select)
421412 });
422413 doc.set_selection(view.id, selection);
423414}
@@ -427,15 +418,11 @@ fn goto_first_nonwhitespace(cx: &mut Context) {
427418 let text = doc.text().slice(..);
428419
429420 let selection = doc.selection(view.id).clone().transform(|range| {
430− let line = range.head_line(text);
421+ let line = range.cursor_line(text);
431422
432423 if let Some(pos) = find_first_non_whitespace_char(text.line(line)) {
433424 let pos = pos + text.line_to_char(line);
434− if doc.mode == Mode::Select {
435− range.move_head(text, pos, true)
436− } else {
437− Range::point(pos)
438− }
425+ range.put_cursor(text, pos, doc.mode == Mode::Select)
439426 } else {
440427 range
441428 }
@@ -579,8 +566,8 @@ fn extend_next_word_start(cx: &mut Context) {
579566 .min_width_1(text)
580567 .transform(|range| {
581568 let word = movement::move_next_word_start(text, range, count);
582− let pos = graphemes::prev_grapheme_boundary(text, word.head);
583− range.move_head(text, pos, true)
569+ let pos = word.cursor(text);
570+ range.put_cursor(text, pos, true)
584571 });
585572 doc.set_selection(view.id, selection);
586573}
@@ -596,8 +583,8 @@ fn extend_prev_word_start(cx: &mut Context) {
596583 .min_width_1(text)
597584 .transform(|range| {
598585 let word = movement::move_prev_word_start(text, range, count);
599− let pos = word.head;
600− range.move_head(text, pos, true)
586+ let pos = word.cursor(text);
587+ range.put_cursor(text, pos, true)
601588 });
602589 doc.set_selection(view.id, selection);
603590}
@@ -613,8 +600,8 @@ fn extend_next_word_end(cx: &mut Context) {
613600 .min_width_1(text)
614601 .transform(|range| {
615602 let word = movement::move_next_word_end(text, range, count);
616− let pos = graphemes::prev_grapheme_boundary(text, word.head);
617− range.move_head(text, pos, true)
603+ let pos = word.cursor(text);
604+ range.put_cursor(text, pos, true)
618605 });
619606 doc.set_selection(view.id, selection);
620607}
@@ -663,18 +650,13 @@ where
663650
664651 let selection = doc.selection(view.id).clone().transform(|range| {
665652 let range = if range.anchor < range.head {
666− // For 1-width cursor semantics.
653+ // For block-cursor semantics.
667654 Range::new(range.anchor, range.head - 1)
668655 } else {
669656 range
670657 };
671− search_fn(text, ch, range.head, count, inclusive).map_or(range, |pos| {
672− if extend {
673− range.move_head(text, pos, true)
674− } else {
675− Range::point(pos)
676− }
677− })
658+ search_fn(text, ch, range.head, count, inclusive)
659+ .map_or(range, |pos| range.put_cursor(text, pos, extend))
678660 });
679661 doc.set_selection(view.id, selection);
680662 })
@@ -895,7 +877,9 @@ fn scroll(cx: &mut Context, offset: usize, direction: Direction) {
895877 let (view, doc) = current!(cx.editor);
896878 let cursor = coords_at_pos(
897879 doc.text().slice(..),
898− doc.selection(view.id).cursor(doc.text().slice(..)),
880+ doc.selection(view.id)
881+ .primary()
882+ .cursor(doc.text().slice(..)),
899883 );
900884 let doc_last_line = doc.text().len_lines() - 1;
901885
@@ -1220,12 +1204,7 @@ fn collapse_selection(cx: &mut Context) {
12201204 let text = doc.text().slice(..);
12211205
12221206 let selection = doc.selection(view.id).clone().transform(|range| {
1223− let pos = if range.head > range.anchor {
1224− // For 1-width cursor semantics.
1225− graphemes::prev_grapheme_boundary(text, range.head)
1226− } else {
1227− range.head
1228− };
1207+ let pos = range.cursor(text);
12291208 Range::new(pos, pos)
12301209 });
12311210 doc.set_selection(view.id, selection);
@@ -2203,7 +2182,7 @@ fn append_to_line(cx: &mut Context) {
22032182
22042183 let selection = doc.selection(view.id).clone().transform(|range| {
22052184 let text = doc.text().slice(..);
2206− let line = range.head_line(text);
2185+ let line = range.cursor_line(text);
22072186 let pos = line_end_char_index(&text, line);
22082187 Range::new(pos, pos)
22092188 });
@@ -2264,7 +2243,7 @@ fn open(cx: &mut Context, open: Open) {
22642243 let mut offs = 0;
22652244
22662245 let mut transaction = Transaction::change_by_selection(contents, selection, |range| {
2267− let line = range.head_line(text);
2246+ let line = range.cursor_line(text);
22682247
22692248 let line = match open {
22702249 // adjust position to the end of the line (next line - 1)
@@ -2472,7 +2451,9 @@ fn goto_definition(cx: &mut Context) {
24722451
24732452 let pos = pos_to_lsp_pos(
24742453 doc.text(),
2475− doc.selection(view.id).cursor(doc.text().slice(..)),
2454+ doc.selection(view.id)
2455+ .primary()
2456+ .cursor(doc.text().slice(..)),
24762457 offset_encoding,
24772458 );
24782459
@@ -2513,7 +2494,9 @@ fn goto_type_definition(cx: &mut Context) {
25132494
25142495 let pos = pos_to_lsp_pos(
25152496 doc.text(),
2516− doc.selection(view.id).cursor(doc.text().slice(..)),
2497+ doc.selection(view.id)
2498+ .primary()
2499+ .cursor(doc.text().slice(..)),
25172500 offset_encoding,
25182501 );
25192502
@@ -2554,7 +2537,9 @@ fn goto_implementation(cx: &mut Context) {
25542537
25552538 let pos = pos_to_lsp_pos(
25562539 doc.text(),
2557− doc.selection(view.id).cursor(doc.text().slice(..)),
2540+ doc.selection(view.id)
2541+ .primary()
2542+ .cursor(doc.text().slice(..)),
25582543 offset_encoding,
25592544 );
25602545
@@ -2595,7 +2580,9 @@ fn goto_reference(cx: &mut Context) {
25952580
25962581 let pos = pos_to_lsp_pos(
25972582 doc.text(),
2598− doc.selection(view.id).cursor(doc.text().slice(..)),
2583+ doc.selection(view.id)
2584+ .primary()
2585+ .cursor(doc.text().slice(..)),
25992586 offset_encoding,
26002587 );
26012588
@@ -2656,7 +2643,10 @@ fn goto_next_diag(cx: &mut Context) {
26562643 let editor = &mut cx.editor;
26572644 let (view, doc) = current!(editor);
26582645
2659− let cursor_pos = doc.selection(view.id).cursor(doc.text().slice(..));
2646+ let cursor_pos = doc
2647+ .selection(view.id)
2648+ .primary()
2649+ .cursor(doc.text().slice(..));
26602650 let diag = if let Some(diag) = doc
26612651 .diagnostics()
26622652 .iter()
@@ -2677,7 +2667,10 @@ fn goto_prev_diag(cx: &mut Context) {
26772667 let editor = &mut cx.editor;
26782668 let (view, doc) = current!(editor);
26792669
2680− let cursor_pos = doc.selection(view.id).cursor(doc.text().slice(..));
2670+ let cursor_pos = doc
2671+ .selection(view.id)
2672+ .primary()
2673+ .cursor(doc.text().slice(..));
26812674 let diag = if let Some(diag) = doc
26822675 .diagnostics()
26832676 .iter()
@@ -2705,7 +2698,9 @@ fn signature_help(cx: &mut Context) {
27052698
27062699 let pos = pos_to_lsp_pos(
27072700 doc.text(),
2708− doc.selection(view.id).cursor(doc.text().slice(..)),
2701+ doc.selection(view.id)
2702+ .primary()
2703+ .cursor(doc.text().slice(..)),
27092704 language_server.offset_encoding(),
27102705 );
27112706
@@ -3457,7 +3452,10 @@ fn completion(cx: &mut Context) {
34573452 };
34583453
34593454 let offset_encoding = language_server.offset_encoding();
3460− let cursor = doc.selection(view.id).cursor(doc.text().slice(..));
3455+ let cursor = doc
3456+ .selection(view.id)
3457+ .primary()
3458+ .cursor(doc.text().slice(..));
34613459
34623460 let pos = pos_to_lsp_pos(doc.text(), cursor, offset_encoding);
34633461
@@ -3514,7 +3512,9 @@ fn hover(cx: &mut Context) {
35143512
35153513 let pos = pos_to_lsp_pos(
35163514 doc.text(),
3517− doc.selection(view.id).cursor(doc.text().slice(..)),
3515+ doc.selection(view.id)
3516+ .primary()
3517+ .cursor(doc.text().slice(..)),
35183518 language_server.offset_encoding(),
35193519 );
35203520
@@ -3580,7 +3580,10 @@ fn match_brackets(cx: &mut Context) {
35803580 let (view, doc) = current!(cx.editor);
35813581
35823582 if let Some(syntax) = doc.syntax() {
3583− let pos = doc.selection(view.id).cursor(doc.text().slice(..));
3583+ let pos = doc
3584+ .selection(view.id)
3585+ .primary()
3586+ .cursor(doc.text().slice(..));
35843587 if let Some(pos) = match_brackets::find(syntax, doc.text(), pos) {
35853588 let selection = Selection::point(pos);
35863589 doc.set_selection(view.id, selection);
@@ -3684,7 +3687,10 @@ fn align_view_bottom(cx: &mut Context) {
36843687
36853688fn align_view_middle(cx: &mut Context) {
36863689 let (view, doc) = current!(cx.editor);
3687− let pos = doc.selection(view.id).cursor(doc.text().slice(..));
3690+ let pos = doc
3691+ .selection(view.id)
3692+ .primary()
3693+ .cursor(doc.text().slice(..));
36883694 let pos = coords_at_pos(doc.text().slice(..), pos);
36893695
36903696 const OFFSET: usize = 7; // gutters