mirror of https://github.com/helix-editor/helix
Add `remove_selections` command (#1065)
* Add `remove_selections` command * Document `remove_selections` * Update helix-term/src/keymap.rs Co-authored-by: Blaž Hrastnik <blaz@mxxn.io>pull/987/head^2
parent
9d591427be
commit
bf95a9ed04
|
@ -101,6 +101,7 @@
|
||||||
| | Expand selection to parent syntax node TODO: pick a key | `expand_selection` |
|
| | Expand selection to parent syntax node TODO: pick a key | `expand_selection` |
|
||||||
| `J` | Join lines inside selection | `join_selections` |
|
| `J` | Join lines inside selection | `join_selections` |
|
||||||
| `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` |
|
||||||
| `$` | Pipe each selection into shell command, keep selections where command returned 0 | `shell_keep_pipe` |
|
| `$` | Pipe each selection into shell command, keep selections where command returned 0 | `shell_keep_pipe` |
|
||||||
| `Ctrl-c` | Comment/uncomment the selections | `toggle_comments` |
|
| `Ctrl-c` | Comment/uncomment the selections | `toggle_comments` |
|
||||||
|
|
||||||
|
|
|
@ -528,14 +528,15 @@ impl<'a> IntoIterator for &'a Selection {
|
||||||
|
|
||||||
// TODO: checkSelection -> check if valid for doc length && sorted
|
// TODO: checkSelection -> check if valid for doc length && sorted
|
||||||
|
|
||||||
pub fn keep_matches(
|
pub fn keep_or_remove_matches(
|
||||||
text: RopeSlice,
|
text: RopeSlice,
|
||||||
selection: &Selection,
|
selection: &Selection,
|
||||||
regex: &crate::regex::Regex,
|
regex: &crate::regex::Regex,
|
||||||
|
remove: bool,
|
||||||
) -> Option<Selection> {
|
) -> Option<Selection> {
|
||||||
let result: SmallVec<_> = selection
|
let result: SmallVec<_> = selection
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|range| regex.is_match(&range.fragment(text)))
|
.filter(|range| regex.is_match(&range.fragment(text)) ^ remove)
|
||||||
.copied()
|
.copied()
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|
|
@ -302,6 +302,7 @@ impl Command {
|
||||||
format_selections, "Format selection",
|
format_selections, "Format selection",
|
||||||
join_selections, "Join lines inside selection",
|
join_selections, "Join lines inside selection",
|
||||||
keep_selections, "Keep selections matching regex",
|
keep_selections, "Keep selections matching regex",
|
||||||
|
remove_selections, "Remove selections matching regex",
|
||||||
keep_primary_selection, "Keep primary selection",
|
keep_primary_selection, "Keep primary selection",
|
||||||
remove_primary_selection, "Remove primary selection",
|
remove_primary_selection, "Remove primary selection",
|
||||||
completion, "Invoke completion popup",
|
completion, "Invoke completion popup",
|
||||||
|
@ -4320,12 +4321,12 @@ fn join_selections(cx: &mut Context) {
|
||||||
doc.append_changes_to_history(view.id);
|
doc.append_changes_to_history(view.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn keep_selections(cx: &mut Context) {
|
fn keep_or_remove_selections_impl(cx: &mut Context, remove: bool) {
|
||||||
// keep selections matching regex
|
// keep or remove selections matching regex
|
||||||
let reg = cx.register.unwrap_or('/');
|
let reg = cx.register.unwrap_or('/');
|
||||||
let prompt = ui::regex_prompt(
|
let prompt = ui::regex_prompt(
|
||||||
cx,
|
cx,
|
||||||
"keep:".into(),
|
if !remove { "keep:" } else { "remove:" }.into(),
|
||||||
Some(reg),
|
Some(reg),
|
||||||
|_input: &str| Vec::new(),
|
|_input: &str| Vec::new(),
|
||||||
move |view, doc, regex, event| {
|
move |view, doc, regex, event| {
|
||||||
|
@ -4334,7 +4335,9 @@ fn keep_selections(cx: &mut Context) {
|
||||||
}
|
}
|
||||||
let text = doc.text().slice(..);
|
let text = doc.text().slice(..);
|
||||||
|
|
||||||
if let Some(selection) = selection::keep_matches(text, doc.selection(view.id), ®ex) {
|
if let Some(selection) =
|
||||||
|
selection::keep_or_remove_matches(text, doc.selection(view.id), ®ex, remove)
|
||||||
|
{
|
||||||
doc.set_selection(view.id, selection);
|
doc.set_selection(view.id, selection);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -4343,6 +4346,14 @@ fn keep_selections(cx: &mut Context) {
|
||||||
cx.push_layer(Box::new(prompt));
|
cx.push_layer(Box::new(prompt));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn keep_selections(cx: &mut Context) {
|
||||||
|
keep_or_remove_selections_impl(cx, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_selections(cx: &mut Context) {
|
||||||
|
keep_or_remove_selections_impl(cx, true)
|
||||||
|
}
|
||||||
|
|
||||||
fn keep_primary_selection(cx: &mut Context) {
|
fn keep_primary_selection(cx: &mut Context) {
|
||||||
let (view, doc) = current!(cx.editor);
|
let (view, doc) = current!(cx.editor);
|
||||||
// TODO: handle count
|
// TODO: handle count
|
||||||
|
|
|
@ -577,7 +577,7 @@ impl Default for Keymaps {
|
||||||
"=" => format_selections,
|
"=" => format_selections,
|
||||||
"J" => join_selections,
|
"J" => join_selections,
|
||||||
"K" => keep_selections,
|
"K" => keep_selections,
|
||||||
// TODO: and another method for inverse
|
"A-K" => remove_selections,
|
||||||
|
|
||||||
"," => keep_primary_selection,
|
"," => keep_primary_selection,
|
||||||
"A-," => remove_primary_selection,
|
"A-," => remove_primary_selection,
|
||||||
|
|
Loading…
Reference in New Issue