@@ -21,14 +21,14 @@ use helix_core::{
2121 visual_offset_from_block, Position, Range, Selection, Transaction,
2222};
2323use helix_view::{
24− document::{Mode, SCRATCH_BUFFER_NAME},
24+ document::{Mode, SavePoint, SCRATCH_BUFFER_NAME},
2525 editor::{CompleteAction, CursorShapeConfig},
2626 graphics::{Color, CursorKind, Modifier, Rect, Style},
2727 input::{KeyEvent, MouseButton, MouseEvent, MouseEventKind},
2828 keyboard::{KeyCode, KeyModifiers},
2929 Document, Editor, Theme, View,
3030};
31−use std::{num::NonZeroUsize, path::PathBuf, rc::Rc};
31+use std::{mem::take, num::NonZeroUsize, path::PathBuf, rc::Rc, sync::Arc};
3232
3333use tui::buffer::Buffer as Surface;
3434
@@ -39,7 +39,7 @@ pub struct EditorView {
3939 pub keymaps: Keymaps,
4040 on_next_key: Option<OnKeyCallback>,
4141 pseudo_pending: Vec<KeyEvent>,
42− last_insert: (commands::MappableCommand, Vec<InsertEvent>),
42+ pub(crate) last_insert: (commands::MappableCommand, Vec<InsertEvent>),
4343 pub(crate) completion: Option<Completion>,
4444 spinners: ProgressSpinners,
4545}
@@ -49,6 +49,7 @@ pub enum InsertEvent {
4949 Key(KeyEvent),
5050 CompletionApply(CompleteAction),
5151 TriggerCompletion,
52+ RequestCompletion,
5253}
5354
5455impl Default for EditorView {
@@ -891,6 +892,8 @@ impl EditorView {
891892 for _ in 0..cxt.editor.count.map_or(1, NonZeroUsize::into) {
892893 // first execute whatever put us into insert mode
893894 self.last_insert.0.execute(cxt);
895+ let mut last_savepoint = None;
896+ let mut last_request_savepoint = None;
894897 // then replay the inputs
895898 for key in self.last_insert.1.clone() {
896899 match key {
@@ -898,7 +901,9 @@ impl EditorView {
898901 InsertEvent::CompletionApply(compl) => {
899902 let (view, doc) = current!(cxt.editor);
900903
901− doc.restore(view);
904+ if let Some(last_savepoint) = last_savepoint.as_deref() {
905+ doc.restore(view, last_savepoint);
906+ }
902907
903908 let text = doc.text().slice(..);
904909 let cursor = doc.selection(view.id).primary().cursor(text);
@@ -915,8 +920,11 @@ impl EditorView {
915920 doc.apply(&tx, view.id);
916921 }
917922 InsertEvent::TriggerCompletion => {
923+ last_savepoint = take(&mut last_request_savepoint);
924+ }
925+ InsertEvent::RequestCompletion => {
918926 let (view, doc) = current!(cxt.editor);
919− doc.savepoint(view);
927+ last_request_savepoint = Some(doc.savepoint(view));
920928 }
921929 }
922930 }