@@ -780,11 +780,7 @@ fn trim_selections(cx: &mut Context) {
780780 let mut end = range.to();
781781 start = movement::skip_while(text, start, |x| x.is_whitespace()).unwrap_or(start);
782782 end = movement::backwards_skip_while(text, end, |x| x.is_whitespace()).unwrap_or(end);
783− if range.anchor < range.head {
784− Some(Range::new(start, end))
785− } else {
786− Some(Range::new(end, start))
787− }
783+ Some(Range::new(start, end).with_direction(range.direction()))
788784 })
789785 .collect();
790786
@@ -1656,11 +1652,7 @@ fn search_impl(
16561652
16571653 // Determine range direction based on the primary range
16581654 let primary = selection.primary();
1659− let range = if primary.head < primary.anchor {
1660− Range::new(end, start)
1661− } else {
1662− Range::new(start, end)
1663− };
1655+ let range = Range::new(start, end).with_direction(primary.direction());
16641656
16651657 let selection = match movement {
16661658 Movement::Extend => selection.clone().push(range),
@@ -2093,11 +2085,7 @@ fn extend_to_line_bounds(cx: &mut Context) {
20932085 let start = text.line_to_char(start_line);
20942086 let end = text.line_to_char((end_line + 1).min(text.len_lines()));
20952087
2096− if range.anchor <= range.head {
2097− Range::new(start, end)
2098− } else {
2099− Range::new(end, start)
2100− }
2088+ Range::new(start, end).with_direction(range.direction())
21012089 }),
21022090 );
21032091}
@@ -2134,11 +2122,7 @@ fn shrink_to_line_bounds(cx: &mut Context) {
21342122 end = text.line_to_char(end_line);
21352123 }
21362124
2137− if range.anchor <= range.head {
2138− Range::new(start, end)
2139− } else {
2140− Range::new(end, start)
2141− }
2125+ Range::new(start, end).with_direction(range.direction())
21422126 }),
21432127 );
21442128}
@@ -2753,15 +2737,15 @@ fn goto_line(cx: &mut Context) {
27532737fn goto_line_impl(editor: &mut Editor, count: Option<NonZeroUsize>) {
27542738 if let Some(count) = count {
27552739 let (view, doc) = current!(editor);
2756− let max_line = if doc.text().line(doc.text().len_lines() - 1).len_chars() == 0 {
2740+ let text = doc.text().slice(..);
2741+ let max_line = if text.line(text.len_lines() - 1).len_chars() == 0 {
27572742 // If the last line is blank, don't jump to it.
2758− doc.text().len_lines().saturating_sub(2)
2743+ text.len_lines().saturating_sub(2)
27592744 } else {
2760− doc.text().len_lines() - 1
2745+ text.len_lines() - 1
27612746 };
27622747 let line_idx = std::cmp::min(count.get() - 1, max_line);
2763− let text = doc.text().slice(..);
2764− let pos = doc.text().line_to_char(line_idx);
2748+ let pos = text.line_to_char(line_idx);
27652749 let selection = doc
27662750 .selection(view.id)
27672751 .clone()
@@ -2774,14 +2758,14 @@ fn goto_line_impl(editor: &mut Editor, count: Option<NonZeroUsize>) {
27742758
27752759fn goto_last_line(cx: &mut Context) {
27762760 let (view, doc) = current!(cx.editor);
2777− let line_idx = if doc.text().line(doc.text().len_lines() - 1).len_chars() == 0 {
2761+ let text = doc.text().slice(..);
2762+ let line_idx = if text.line(text.len_lines() - 1).len_chars() == 0 {
27782763 // If the last line is blank, don't jump to it.
2779− doc.text().len_lines().saturating_sub(2)
2764+ text.len_lines().saturating_sub(2)
27802765 } else {
2781− doc.text().len_lines() - 1
2766+ text.len_lines() - 1
27822767 };
2783− let text = doc.text().slice(..);
2784− let pos = doc.text().line_to_char(line_idx);
2768+ let pos = text.line_to_char(line_idx);
27852769 let selection = doc
27862770 .selection(view.id)
27872771 .clone()
@@ -3823,7 +3807,7 @@ fn format_selections(cx: &mut Context) {
38233807 apply_transaction(&transaction, doc, view);
38243808}
38253809
3826−fn join_selections_inner(cx: &mut Context, select_space: bool) {
3810+fn join_selections_impl(cx: &mut Context, select_space: bool) {
38273811 use movement::skip_while;
38283812 let (view, doc) = current!(cx.editor);
38293813 let text = doc.text();
@@ -3902,11 +3886,11 @@ fn keep_or_remove_selections_impl(cx: &mut Context, remove: bool) {
39023886}
39033887
39043888fn join_selections(cx: &mut Context) {
3905− join_selections_inner(cx, false)
3889+ join_selections_impl(cx, false)
39063890}
39073891
39083892fn join_selections_space(cx: &mut Context) {
3909− join_selections_inner(cx, true)
3893+ join_selections_impl(cx, true)
39103894}
39113895
39123896fn keep_selections(cx: &mut Context) {