@@ -780,11 +780,7 @@ fn trim_selections(cx: &mut Context) {
780 let mut end = range.to();
780 let mut end = range.to();
781 start = movement::skip_while(text, start, |x| x.is_whitespace()).unwrap_or(start);
781 start = movement::skip_while(text, start, |x| x.is_whitespace()).unwrap_or(start);
782 end = movement::backwards_skip_while(text, end, |x| x.is_whitespace()).unwrap_or(end);
782 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))
783+ Some(Range::new(start, end).with_direction(range.direction()))
786− Some(Range::new(end, start))
789 .collect();
785 .collect();
@@ -1656,11 +1652,7 @@ fn search_impl(
1657 // Determine range direction based on the primary range
1653 // Determine range direction based on the primary range
1658 let primary = selection.primary();
1654 let primary = selection.primary();
1659− let range = if primary.head < primary.anchor {
1655+ let range = Range::new(start, end).with_direction(primary.direction());
1660− Range::new(end, start)
1662− Range::new(start, end)
1665 let selection = match movement {
1657 let selection = match movement {
1666 Movement::Extend => selection.clone().push(range),
1658 Movement::Extend => selection.clone().push(range),
@@ -2093,11 +2085,7 @@ fn extend_to_line_bounds(cx: &mut Context) {
2093 let start = text.line_to_char(start_line);
2085 let start = text.line_to_char(start_line);
2094 let end = text.line_to_char((end_line + 1).min(text.len_lines()));
2086 let end = text.line_to_char((end_line + 1).min(text.len_lines()));
2096− if range.anchor <= range.head {
2097− Range::new(start, end)
2088+ Range::new(start, end).with_direction(range.direction())
2099− Range::new(end, start)
@@ -2134,11 +2122,7 @@ fn shrink_to_line_bounds(cx: &mut Context) {
2134 end = text.line_to_char(end_line);
2122 end = text.line_to_char(end_line);
2137− if range.anchor <= range.head {
2138− Range::new(start, end)
2125+ Range::new(start, end).with_direction(range.direction())
2140− Range::new(end, start)
@@ -2753,15 +2737,15 @@ fn goto_line(cx: &mut Context) {
2753fn goto_line_impl(editor: &mut Editor, count: Option<NonZeroUsize>) {
2737fn goto_line_impl(editor: &mut Editor, count: Option<NonZeroUsize>) {
2754 if let Some(count) = count {
2738 if let Some(count) = count {
2755 let (view, doc) = current!(editor);
2739 let (view, doc) = current!(editor);
2740+ let text = doc.text().slice(..);
2756− let max_line = if doc.text().line(doc.text().len_lines() - 1).len_chars() == 0 {
2741+ let max_line = if text.line(text.len_lines() - 1).len_chars() == 0 {
2757 // If the last line is blank, don't jump to it.
2742 // 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)
2759 } else {
2744 } else {
2760− doc.text().len_lines() - 1
2745+ text.len_lines() - 1
2762 let line_idx = std::cmp::min(count.get() - 1, max_line);
2747 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);
2765 let selection = doc
2749 let selection = doc
2766 .selection(view.id)
2750 .selection(view.id)
2767 .clone()
2751 .clone()
@@ -2774,14 +2758,14 @@ fn goto_line_impl(editor: &mut Editor, count: Option<NonZeroUsize>) {
2775fn goto_last_line(cx: &mut Context) {
2759fn goto_last_line(cx: &mut Context) {
2776 let (view, doc) = current!(cx.editor);
2760 let (view, doc) = current!(cx.editor);
2761+ let text = doc.text().slice(..);
2777− let line_idx = if doc.text().line(doc.text().len_lines() - 1).len_chars() == 0 {
2762+ let line_idx = if text.line(text.len_lines() - 1).len_chars() == 0 {
2778 // If the last line is blank, don't jump to it.
2763 // 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)
2780 } else {
2765 } else {
2781− doc.text().len_lines() - 1
2766+ text.len_lines() - 1
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);
2785 let selection = doc
2769 let selection = doc
2786 .selection(view.id)
2770 .selection(view.id)
2787 .clone()
2771 .clone()
@@ -3823,7 +3807,7 @@ fn format_selections(cx: &mut Context) {
3823 apply_transaction(&transaction, doc, view);
3807 apply_transaction(&transaction, doc, view);
3826−fn join_selections_inner(cx: &mut Context, select_space: bool) {
3810+fn join_selections_impl(cx: &mut Context, select_space: bool) {
3827 use movement::skip_while;
3811 use movement::skip_while;
3828 let (view, doc) = current!(cx.editor);
3812 let (view, doc) = current!(cx.editor);
3829 let text = doc.text();
3813 let text = doc.text();
@@ -3902,11 +3886,11 @@ fn keep_or_remove_selections_impl(cx: &mut Context, remove: bool) {
3904fn join_selections(cx: &mut Context) {
3888fn join_selections(cx: &mut Context) {
3905− join_selections_inner(cx, false)
3889+ join_selections_impl(cx, false)
3908fn join_selections_space(cx: &mut Context) {
3892fn join_selections_space(cx: &mut Context) {
3909− join_selections_inner(cx, true)
3893+ join_selections_impl(cx, true)
3912fn keep_selections(cx: &mut Context) {
3896fn keep_selections(cx: &mut Context) {