Implement 'remove_primary_selection' as Alt-,

This allows removing search matches from the selection

Fixes #713
This commit is contained in:
Blaž Hrastnik 2021-09-22 00:51:49 +09:00
parent 75dba1f956
commit 2e0803c8d9
3 changed files with 27 additions and 0 deletions

View file

@ -360,6 +360,15 @@ impl Selection {
self.normalize()
}
/// Adds a new range to the selection and makes it the primary range.
pub fn remove(mut self, index: usize) -> Self {
self.ranges.remove(index);
if index < self.primary_index || self.primary_index == self.ranges.len() {
self.primary_index -= 1;
}
self
}
/// Map selections over a set of changes. Useful for adjusting the selection position after
/// applying changes to a document.
pub fn map(self, changes: &ChangeSet) -> Self {

View file

@ -290,6 +290,7 @@ impl Command {
join_selections, "Join lines inside selection",
keep_selections, "Keep selections matching regex",
keep_primary_selection, "Keep primary selection",
remove_primary_selection, "Remove primary selection",
completion, "Invoke completion popup",
hover, "Show docs for item under cursor",
toggle_comments, "Comment/uncomment selections",
@ -4016,11 +4017,27 @@ fn keep_selections(cx: &mut Context) {
fn keep_primary_selection(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
// TODO: handle count
let range = doc.selection(view.id).primary();
doc.set_selection(view.id, Selection::single(range.anchor, range.head));
}
fn remove_primary_selection(cx: &mut Context) {
let (view, doc) = current!(cx.editor);
// TODO: handle count
let selection = doc.selection(view.id);
if selection.len() == 1 {
cx.editor.set_error("no selections remaining".to_owned());
return;
}
let index = selection.primary_index();
let selection = selection.clone().remove(index);
doc.set_selection(view.id, selection);
}
fn completion(cx: &mut Context) {
// trigger on trigger char, or if user calls it
// (or on word char typing??)

View file

@ -499,6 +499,7 @@ impl Default for Keymaps {
// TODO: and another method for inverse
"," => keep_primary_selection,
"A-," => remove_primary_selection,
// "q" => record_macro,
// "Q" => replay_macro,