on master help sign in
feat(commands): ensure_selections_forward (#1393)
bd2ab5bMatouš Dzivjak
helix-core/src/selection.rs+9
@@ -122,6 +122,15 @@ impl Range {
122 }
122 }
123 }
123 }
124
124
125+ // flips the direction of the selection
126+ pub fn flip(&self) -> Self {
127+ Self {
128+ anchor: self.head,
129+ head: self.anchor,
130+ horiz: self.horiz,
131+ }
132+ }
133+
125 /// Check two ranges for overlap.
134 /// Check two ranges for overlap.
126 #[must_use]
135 #[must_use]
127 pub fn overlaps(&self, other: &Self) -> bool {
136 pub fn overlaps(&self, other: &Self) -> bool {
helix-term/src/commands.rs+16−1
@@ -266,6 +266,7 @@ impl MappableCommand {
266 change_selection_noyank, "Change selection (delete and enter insert mode, without yanking)",
266 change_selection_noyank, "Change selection (delete and enter insert mode, without yanking)",
267 collapse_selection, "Collapse selection onto a single cursor",
267 collapse_selection, "Collapse selection onto a single cursor",
268 flip_selections, "Flip selection cursor and anchor",
268 flip_selections, "Flip selection cursor and anchor",
269+ ensure_selections_forward, "Ensure the selection is in forward direction",
269 insert_mode, "Insert before selection",
270 insert_mode, "Insert before selection",
270 append_mode, "Insert after selection (append)",
271 append_mode, "Insert after selection (append)",
271 command_mode, "Enter command mode",
272 command_mode, "Enter command mode",
@@ -1904,7 +1905,21 @@ fn flip_selections(cx: &mut Context) {
1904 let selection = doc
1905 let selection = doc
1905 .selection(view.id)
1906 .selection(view.id)
1906 .clone()
1907 .clone()
1907− .transform(|range| Range::new(range.head, range.anchor));
1908+ .transform(|range| range.flip());
1909+ doc.set_selection(view.id, selection);
1910+}
1911+
1912+fn ensure_selections_forward(cx: &mut Context) {
1913+ let (view, doc) = current!(cx.editor);
1914+
1915+ let selection = doc
1916+ .selection(view.id)
1917+ .clone()
1918+ .transform(|r| match r.direction() {
1919+ Direction::Forward => r,
1920+ Direction::Backward => r.flip(),
1921+ });
1922+
1908 doc.set_selection(view.id, selection);
1923 doc.set_selection(view.id, selection);
1909}
1924}
1910
1925
helix-term/src/keymap.rs+2
@@ -617,6 +617,8 @@ impl Default for Keymaps {
617 "A-(" => rotate_selection_contents_backward,
617 "A-(" => rotate_selection_contents_backward,
618 "A-)" => rotate_selection_contents_forward,
618 "A-)" => rotate_selection_contents_forward,
619
619
620+ "A-:" => ensure_selections_forward,
621+
620 "esc" => normal_mode,
622 "esc" => normal_mode,
621 "C-b" | "pageup" => page_up,
623 "C-b" | "pageup" => page_up,
622 "C-f" | "pagedown" => page_down,
624 "C-f" | "pagedown" => page_down,