diff options
author | Pascal Kuthe | 2023-03-02 18:10:47 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2023-03-09 04:01:02 +0000 |
commit | 2588fa3710921683c16a84ffd91103a0823a033b (patch) | |
tree | 6ff584e2e3a440a5ec18ab8be491f95b7a85a158 | |
parent | 4300a3ad058ea383a59a0a90f31a597eb264a7d4 (diff) |
save selection before completion savepoint
Currently, the selection is not saved/restored when completion
checkpoints are applied. This is usually fine because undoing changes
usually restores maps selections back in insert mode. But this is not
always the case and especially problematic in the presence of
multi-cursor completions (since completions are applied relative to
the selection/cursor) and snippets (which can change the selection)
-rw-r--r-- | helix-term/src/commands.rs | 2 | ||||
-rw-r--r-- | helix-term/src/ui/completion.rs | 2 | ||||
-rw-r--r-- | helix-term/src/ui/editor.rs | 4 | ||||
-rw-r--r-- | helix-view/src/document.rs | 3 |
4 files changed, 6 insertions, 5 deletions
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 55ca875d..bc0e8ebe 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -4181,7 +4181,7 @@ pub fn completion(cx: &mut Context) { iter.reverse(); let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count(); let start_offset = cursor.saturating_sub(offset); - doc.savepoint(); + doc.savepoint(&view); cx.callback( future, diff --git a/helix-term/src/ui/completion.rs b/helix-term/src/ui/completion.rs index 85931fe3..179a8cf8 100644 --- a/helix-term/src/ui/completion.rs +++ b/helix-term/src/ui/completion.rs @@ -235,7 +235,7 @@ impl Completion { ); // initialize a savepoint - doc.savepoint(); + doc.savepoint(&view); doc.apply(&transaction, view.id); editor.last_completion = Some(CompleteAction { diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs index 2ea1b714..62f04cc9 100644 --- a/helix-term/src/ui/editor.rs +++ b/helix-term/src/ui/editor.rs @@ -914,8 +914,8 @@ impl EditorView { doc.apply(&tx, view.id); } InsertEvent::TriggerCompletion => { - let (_, doc) = current!(cxt.editor); - doc.savepoint(); + let (view, doc) = current!(cxt.editor); + doc.savepoint(view); } } } diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 4d3586f1..13ffe794 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -941,7 +941,8 @@ impl Document { } pub fn savepoint(&mut self) { - self.savepoint = Some(Transaction::new(self.text())); + self.savepoint = + Some(Transaction::new(self.text()).with_selection(self.selection(view.id).clone())); } pub fn restore(&mut self, view: &mut View) { |