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)
pull/6242/head
Pascal Kuthe 2 years ago committed by Blaž Hrastnik
parent 4300a3ad05
commit 2588fa3710

@ -4181,7 +4181,7 @@ pub fn completion(cx: &mut Context) {
iter.reverse(); iter.reverse();
let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count(); let offset = iter.take_while(|ch| chars::char_is_word(*ch)).count();
let start_offset = cursor.saturating_sub(offset); let start_offset = cursor.saturating_sub(offset);
doc.savepoint(); doc.savepoint(&view);
cx.callback( cx.callback(
future, future,

@ -235,7 +235,7 @@ impl Completion {
); );
// initialize a savepoint // initialize a savepoint
doc.savepoint(); doc.savepoint(&view);
doc.apply(&transaction, view.id); doc.apply(&transaction, view.id);
editor.last_completion = Some(CompleteAction { editor.last_completion = Some(CompleteAction {

@ -914,8 +914,8 @@ impl EditorView {
doc.apply(&tx, view.id); doc.apply(&tx, view.id);
} }
InsertEvent::TriggerCompletion => { InsertEvent::TriggerCompletion => {
let (_, doc) = current!(cxt.editor); let (view, doc) = current!(cxt.editor);
doc.savepoint(); doc.savepoint(view);
} }
} }
} }

@ -941,7 +941,8 @@ impl Document {
} }
pub fn savepoint(&mut self) { 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) { pub fn restore(&mut self, view: &mut View) {

Loading…
Cancel
Save