Select inserted space after join (#3549)
* Select inserted space after join * Split join_selections with space selection to A-J Kakoune does that too and some users may still want to retain their selections. * Update join_selections docs
This commit is contained in:
parent
4a3b776b78
commit
66bbba9024
3 changed files with 27 additions and 4 deletions
|
@ -129,6 +129,7 @@
|
||||||
| `X` | Extend selection to line bounds (line-wise selection) | `extend_to_line_bounds` |
|
| `X` | Extend selection to line bounds (line-wise selection) | `extend_to_line_bounds` |
|
||||||
| `Alt-x` | Shrink selection to line bounds (line-wise selection) | `shrink_to_line_bounds` |
|
| `Alt-x` | Shrink selection to line bounds (line-wise selection) | `shrink_to_line_bounds` |
|
||||||
| `J` | Join lines inside selection | `join_selections` |
|
| `J` | Join lines inside selection | `join_selections` |
|
||||||
|
| `A-J` | Join lines inside selection and select space | `join_selections_space` |
|
||||||
| `K` | Keep selections matching the regex | `keep_selections` |
|
| `K` | Keep selections matching the regex | `keep_selections` |
|
||||||
| `Alt-K` | Remove selections matching the regex | `remove_selections` |
|
| `Alt-K` | Remove selections matching the regex | `remove_selections` |
|
||||||
| `Ctrl-c` | Comment/uncomment the selections | `toggle_comments` |
|
| `Ctrl-c` | Comment/uncomment the selections | `toggle_comments` |
|
||||||
|
|
|
@ -346,6 +346,7 @@ impl MappableCommand {
|
||||||
unindent, "Unindent selection",
|
unindent, "Unindent selection",
|
||||||
format_selections, "Format selection",
|
format_selections, "Format selection",
|
||||||
join_selections, "Join lines inside selection",
|
join_selections, "Join lines inside selection",
|
||||||
|
join_selections_space, "Join lines inside selection and select spaces",
|
||||||
keep_selections, "Keep selections matching regex",
|
keep_selections, "Keep selections matching regex",
|
||||||
remove_selections, "Remove selections matching regex",
|
remove_selections, "Remove selections matching regex",
|
||||||
align_selections, "Align selections in column",
|
align_selections, "Align selections in column",
|
||||||
|
@ -3731,7 +3732,7 @@ fn format_selections(cx: &mut Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn join_selections(cx: &mut Context) {
|
fn join_selections_inner(cx: &mut Context, select_space: bool) {
|
||||||
use movement::skip_while;
|
use movement::skip_while;
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
let text = doc.text();
|
let text = doc.text();
|
||||||
|
@ -3766,9 +3767,21 @@ fn join_selections(cx: &mut Context) {
|
||||||
// TODO: joining multiple empty lines should be replaced by a single space.
|
// TODO: joining multiple empty lines should be replaced by a single space.
|
||||||
// need to merge change ranges that touch
|
// need to merge change ranges that touch
|
||||||
|
|
||||||
let transaction = Transaction::change(doc.text(), changes.into_iter());
|
// select inserted spaces
|
||||||
// TODO: select inserted spaces
|
let transaction = if select_space {
|
||||||
// .with_selection(selection);
|
let ranges: SmallVec<_> = changes
|
||||||
|
.iter()
|
||||||
|
.scan(0, |offset, change| {
|
||||||
|
let range = Range::point(change.0 - *offset);
|
||||||
|
*offset += change.1 - change.0 - 1; // -1 because cursor is 0-sized
|
||||||
|
Some(range)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
let selection = Selection::new(ranges, 0);
|
||||||
|
Transaction::change(doc.text(), changes.into_iter()).with_selection(selection)
|
||||||
|
} else {
|
||||||
|
Transaction::change(doc.text(), changes.into_iter())
|
||||||
|
};
|
||||||
|
|
||||||
doc.apply(&transaction, view.id);
|
doc.apply(&transaction, view.id);
|
||||||
}
|
}
|
||||||
|
@ -3797,6 +3810,14 @@ fn keep_or_remove_selections_impl(cx: &mut Context, remove: bool) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn join_selections(cx: &mut Context) {
|
||||||
|
join_selections_inner(cx, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn join_selections_space(cx: &mut Context) {
|
||||||
|
join_selections_inner(cx, true)
|
||||||
|
}
|
||||||
|
|
||||||
fn keep_selections(cx: &mut Context) {
|
fn keep_selections(cx: &mut Context) {
|
||||||
keep_or_remove_selections_impl(cx, false)
|
keep_or_remove_selections_impl(cx, false)
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,6 +144,7 @@ pub fn default() -> HashMap<Mode, Keymap> {
|
||||||
"<" => unindent,
|
"<" => unindent,
|
||||||
"=" => format_selections,
|
"=" => format_selections,
|
||||||
"J" => join_selections,
|
"J" => join_selections,
|
||||||
|
"A-J" => join_selections_space,
|
||||||
"K" => keep_selections,
|
"K" => keep_selections,
|
||||||
"A-K" => remove_selections,
|
"A-K" => remove_selections,
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue