@@ -21,14 +21,14 @@ use helix_core::{
21 visual_offset_from_block, Position, Range, Selection, Transaction,
21 visual_offset_from_block, Position, Range, Selection, Transaction,
23use helix_view::{
23use helix_view::{
24− document::{Mode, SCRATCH_BUFFER_NAME},
24+ document::{Mode, SavePoint, SCRATCH_BUFFER_NAME},
25 editor::{CompleteAction, CursorShapeConfig},
25 editor::{CompleteAction, CursorShapeConfig},
26 graphics::{Color, CursorKind, Modifier, Rect, Style},
26 graphics::{Color, CursorKind, Modifier, Rect, Style},
27 input::{KeyEvent, MouseButton, MouseEvent, MouseEventKind},
27 input::{KeyEvent, MouseButton, MouseEvent, MouseEventKind},
28 keyboard::{KeyCode, KeyModifiers},
28 keyboard::{KeyCode, KeyModifiers},
29 Document, Editor, Theme, View,
29 Document, Editor, Theme, View,
31−use std::{num::NonZeroUsize, path::PathBuf, rc::Rc};
31+use std::{mem::take, num::NonZeroUsize, path::PathBuf, rc::Rc, sync::Arc};
33use tui::buffer::Buffer as Surface;
33use tui::buffer::Buffer as Surface;
@@ -39,7 +39,7 @@ pub struct EditorView {
39 pub keymaps: Keymaps,
39 pub keymaps: Keymaps,
40 on_next_key: Option<OnKeyCallback>,
40 on_next_key: Option<OnKeyCallback>,
41 pseudo_pending: Vec<KeyEvent>,
41 pseudo_pending: Vec<KeyEvent>,
42− last_insert: (commands::MappableCommand, Vec<InsertEvent>),
42+ pub(crate) last_insert: (commands::MappableCommand, Vec<InsertEvent>),
43 pub(crate) completion: Option<Completion>,
43 pub(crate) completion: Option<Completion>,
44 spinners: ProgressSpinners,
44 spinners: ProgressSpinners,
@@ -49,6 +49,7 @@ pub enum InsertEvent {
49 Key(KeyEvent),
49 Key(KeyEvent),
50 CompletionApply(CompleteAction),
50 CompletionApply(CompleteAction),
51 TriggerCompletion,
51 TriggerCompletion,
54impl Default for EditorView {
55impl Default for EditorView {
@@ -891,6 +892,8 @@ impl EditorView {
891 for _ in 0..cxt.editor.count.map_or(1, NonZeroUsize::into) {
892 for _ in 0..cxt.editor.count.map_or(1, NonZeroUsize::into) {
892 // first execute whatever put us into insert mode
893 // first execute whatever put us into insert mode
893 self.last_insert.0.execute(cxt);
894 self.last_insert.0.execute(cxt);
895+ let mut last_savepoint = None;
896+ let mut last_request_savepoint = None;
894 // then replay the inputs
897 // then replay the inputs
895 for key in self.last_insert.1.clone() {
898 for key in self.last_insert.1.clone() {
896 match key {
899 match key {
@@ -898,7 +901,9 @@ impl EditorView {
898 InsertEvent::CompletionApply(compl) => {
901 InsertEvent::CompletionApply(compl) => {
899 let (view, doc) = current!(cxt.editor);
902 let (view, doc) = current!(cxt.editor);
904+ if let Some(last_savepoint) = last_savepoint.as_deref() {
901− doc.restore(view);
905+ doc.restore(view, last_savepoint);
903 let text = doc.text().slice(..);
908 let text = doc.text().slice(..);
904 let cursor = doc.selection(view.id).primary().cursor(text);
909 let cursor = doc.selection(view.id).primary().cursor(text);
@@ -915,8 +920,11 @@ impl EditorView {
915 doc.apply(&tx, view.id);
920 doc.apply(&tx, view.id);
917 InsertEvent::TriggerCompletion => {
922 InsertEvent::TriggerCompletion => {
923+ last_savepoint = take(&mut last_request_savepoint);
925+ InsertEvent::RequestCompletion => {
918 let (view, doc) = current!(cxt.editor);
926 let (view, doc) = current!(cxt.editor);
919− doc.savepoint(view);
927+ last_request_savepoint = Some(doc.savepoint(view));