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
Omnikar 3 years ago committed by GitHub
parent 9d591427be
commit bf95a9ed04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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), &regex) { if let Some(selection) =
selection::keep_or_remove_matches(text, doc.selection(view.id), &regex, 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…
Cancel
Save