Implement selection rotation with (
and )
This commit is contained in:
parent
953125d3f3
commit
66a90130a5
3 changed files with 25 additions and 4 deletions
|
@ -76,6 +76,8 @@
|
||||||
| `Alt-;` | Flip selection cursor and anchor |
|
| `Alt-;` | Flip selection cursor and anchor |
|
||||||
| `C` | Copy selection onto the next line |
|
| `C` | Copy selection onto the next line |
|
||||||
| `Alt-C` | Copy selection onto the previous line |
|
| `Alt-C` | Copy selection onto the previous line |
|
||||||
|
| `(` | Rotate main selection forward |
|
||||||
|
| `)` | Rotate main selection backward |
|
||||||
| `%` | Select entire file |
|
| `%` | Select entire file |
|
||||||
| `x` | Select current line, if already selected, extend to next line |
|
| `x` | Select current line, if already selected, extend to next line |
|
||||||
| `X` | Extend selection to line bounds (line-wise selection) |
|
| `X` | Extend selection to line bounds (line-wise selection) |
|
||||||
|
|
|
@ -275,6 +275,8 @@ impl Command {
|
||||||
completion, "Invoke completion popup",
|
completion, "Invoke completion popup",
|
||||||
hover, "Show docs for item under cursor",
|
hover, "Show docs for item under cursor",
|
||||||
toggle_comments, "Comment/uncomment selections",
|
toggle_comments, "Comment/uncomment selections",
|
||||||
|
rotate_selections_forward, "Rotate selections forward",
|
||||||
|
rotate_selections_backward, "Rotate selections backward",
|
||||||
expand_selection, "Expand selection to parent syntax node",
|
expand_selection, "Expand selection to parent syntax node",
|
||||||
jump_forward, "Jump forward on jumplist",
|
jump_forward, "Jump forward on jumplist",
|
||||||
jump_backward, "Jump backward on jumplist",
|
jump_backward, "Jump backward on jumplist",
|
||||||
|
@ -3747,6 +3749,25 @@ fn toggle_comments(cx: &mut Context) {
|
||||||
doc.append_changes_to_history(view.id);
|
doc.append_changes_to_history(view.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn rotate_selections(cx: &mut Context, direction: Direction) {
|
||||||
|
let count = cx.count();
|
||||||
|
let (view, doc) = current!(cx.editor);
|
||||||
|
let mut selection = doc.selection(view.id).clone();
|
||||||
|
let index = selection.primary_index();
|
||||||
|
let len = selection.len();
|
||||||
|
selection.set_primary_index(match direction {
|
||||||
|
Direction::Forward => (index + count) % len,
|
||||||
|
Direction::Backward => (index + (len.saturating_sub(count) % len)) % len,
|
||||||
|
});
|
||||||
|
doc.set_selection(view.id, selection);
|
||||||
|
}
|
||||||
|
fn rotate_selections_forward(cx: &mut Context) {
|
||||||
|
rotate_selections(cx, Direction::Forward)
|
||||||
|
}
|
||||||
|
fn rotate_selections_backward(cx: &mut Context) {
|
||||||
|
rotate_selections(cx, Direction::Backward)
|
||||||
|
}
|
||||||
|
|
||||||
// tree sitter node selection
|
// tree sitter node selection
|
||||||
|
|
||||||
fn expand_selection(cx: &mut Context) {
|
fn expand_selection(cx: &mut Context) {
|
||||||
|
|
|
@ -451,7 +451,8 @@ impl Default for Keymaps {
|
||||||
// & align selections
|
// & align selections
|
||||||
// _ trim selections
|
// _ trim selections
|
||||||
|
|
||||||
// C / altC = copy (repeat) selections on prev/next lines
|
"(" => rotate_selections_backward,
|
||||||
|
")" => rotate_selections_forward,
|
||||||
|
|
||||||
"esc" => normal_mode,
|
"esc" => normal_mode,
|
||||||
"C-b" | "pageup" => page_up,
|
"C-b" | "pageup" => page_up,
|
||||||
|
@ -508,9 +509,6 @@ impl Default for Keymaps {
|
||||||
"\"" => select_register,
|
"\"" => select_register,
|
||||||
"C-z" => suspend,
|
"C-z" => suspend,
|
||||||
});
|
});
|
||||||
// TODO: decide whether we want normal mode to also be select mode (kakoune-like), or whether
|
|
||||||
// we keep this separate select mode. More keys can fit into normal mode then, but it's weird
|
|
||||||
// because some selection operations can now be done from normal mode, some from select mode.
|
|
||||||
let mut select = normal.clone();
|
let mut select = normal.clone();
|
||||||
select.merge_nodes(keymap!({ "Select mode"
|
select.merge_nodes(keymap!({ "Select mode"
|
||||||
"h" | "left" => extend_char_left,
|
"h" | "left" => extend_char_left,
|
||||||
|
|
Loading…
Reference in a new issue