@@ -19,7 +19,7 @@ use helix_core::{
19 syntax::{self, HighlightEvent},
19 syntax::{self, HighlightEvent},
20 text_annotations::TextAnnotations,
20 text_annotations::TextAnnotations,
21 unicode::width::UnicodeWidthStr,
21 unicode::width::UnicodeWidthStr,
22− visual_offset_from_block, Position, Range, Selection, Transaction,
22+ visual_offset_from_block, Change, Position, Range, Selection, Transaction,
24use helix_view::{
24use helix_view::{
25 document::{Mode, SavePoint, SCRATCH_BUFFER_NAME},
25 document::{Mode, SavePoint, SCRATCH_BUFFER_NAME},
@@ -48,7 +48,10 @@ pub struct EditorView {
48#[derive(Debug, Clone)]
48#[derive(Debug, Clone)]
49pub enum InsertEvent {
49pub enum InsertEvent {
50 Key(KeyEvent),
50 Key(KeyEvent),
51− CompletionApply(CompleteAction),
51+ CompletionApply {
52+ trigger_offset: usize,
53+ changes: Vec<Change>,
52 TriggerCompletion,
55 TriggerCompletion,
53 RequestCompletion,
56 RequestCompletion,
@@ -813,7 +816,7 @@ impl EditorView {
814 (Mode::Insert, Mode::Normal) => {
817 (Mode::Insert, Mode::Normal) => {
815 // if exiting insert mode, remove completion
818 // if exiting insert mode, remove completion
816− self.completion = None;
819+ self.clear_completion(cxt.editor);
817 cxt.editor.completion_request_handle = None;
820 cxt.editor.completion_request_handle = None;
819 // TODO: Use an on_mode_change hook to remove signature help
822 // TODO: Use an on_mode_change hook to remove signature help
@@ -891,22 +894,25 @@ impl EditorView {
891 for key in self.last_insert.1.clone() {
894 for key in self.last_insert.1.clone() {
892 match key {
895 match key {
893 InsertEvent::Key(key) => self.insert_mode(cxt, key),
896 InsertEvent::Key(key) => self.insert_mode(cxt, key),
894− InsertEvent::CompletionApply(compl) => {
897+ InsertEvent::CompletionApply {
895 let (view, doc) = current!(cxt.editor);
901 let (view, doc) = current!(cxt.editor);
897 if let Some(last_savepoint) = last_savepoint.as_deref() {
903 if let Some(last_savepoint) = last_savepoint.as_deref() {
898− doc.restore(view, last_savepoint);
904+ doc.restore(view, last_savepoint, true);
901 let text = doc.text().slice(..);
907 let text = doc.text().slice(..);
902 let cursor = doc.selection(view.id).primary().cursor(text);
908 let cursor = doc.selection(view.id).primary().cursor(text);
904 let shift_position =
910 let shift_position =
905− |pos: usize| -> usize { pos + cursor - compl.trigger_offset };
911+ |pos: usize| -> usize { pos + cursor - trigger_offset };
907 let tx = Transaction::change(
913 let tx = Transaction::change(
908 doc.text(),
914 doc.text(),
909− compl.changes.iter().cloned().map(|(start, end, t)| {
915+ changes.iter().cloned().map(|(start, end, t)| {
910 (shift_position(start), shift_position(end), t)
916 (shift_position(start), shift_position(end), t)
@@ -979,6 +985,21 @@ impl EditorView {
980 pub fn clear_completion(&mut self, editor: &mut Editor) {
986 pub fn clear_completion(&mut self, editor: &mut Editor) {
981 self.completion = None;
987 self.completion = None;
988+ if let Some(last_completion) = editor.last_completion.take() {
989+ match last_completion {
990+ CompleteAction::Applied {
993+ } => self.last_insert.1.push(InsertEvent::CompletionApply {
997+ CompleteAction::Selected { savepoint } => {
998+ let (view, doc) = current!(editor);
999+ doc.restore(view, &savepoint, false);
983 // Clear any savepoints
1004 // Clear any savepoints
984 editor.clear_idle_timer(); // don't retrigger
1005 editor.clear_idle_timer(); // don't retrigger
@@ -1265,12 +1286,22 @@ impl Component for EditorView {
1265 jobs: cx.jobs,
1286 jobs: cx.jobs,
1266 scroll: None,
1287 scroll: None,
1268− completion.handle_event(event, &mut cx)
1271− if let EventResult::Consumed(callback) = res {
1290+ if let EventResult::Consumed(callback) =
1291+ completion.handle_event(event, &mut cx)
1272− consumed = true;
1293+ consumed = true;
1295+ } else if let EventResult::Consumed(callback) =
1296+ completion.handle_event(&Event::Key(key!(Enter)), &mut cx)
1304+ if let Some(callback) = res {
1274 if callback.is_some() {
1305 if callback.is_some() {
1275 // assume close_fn
1306 // assume close_fn
1276 self.clear_completion(cx.editor);
1307 self.clear_completion(cx.editor);
@@ -1286,10 +1317,6 @@ impl Component for EditorView {
1287 // if completion didn't take the event, we pass it onto commands
1318 // if completion didn't take the event, we pass it onto commands
1288 if !consumed {
1319 if !consumed {
1289− if let Some(compl) = cx.editor.last_completion.take() {
1290− self.last_insert.1.push(InsertEvent::CompletionApply(compl));
1293 self.insert_mode(&mut cx, key);
1320 self.insert_mode(&mut cx, key);
1295 // record last_insert key
1322 // record last_insert key