From 98b3ed0eec7d2e23368f73bf6c44989739c44ec5 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sun, 16 Aug 2020 01:03:41 -0400 Subject: [PATCH] Fix undo autocomplete --- internal/action/actions.go | 5 ++++- internal/buffer/autocomplete.go | 7 ++++++- internal/buffer/eventhandler.go | 2 ++ internal/buffer/loc.go | 5 +++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/internal/action/actions.go b/internal/action/actions.go index 3a77e264..5e8f235e 100644 --- a/internal/action/actions.go +++ b/internal/action/actions.go @@ -682,7 +682,10 @@ func (h *BufPane) Autocomplete() bool { // don't autocomplete if cursor is on alpha numeric character (middle of a word) return false } - return b.Autocomplete(buffer.LSPComplete) + if !b.Autocomplete(buffer.LSPComplete) { + return b.Autocomplete(buffer.BufferComplete) + } + return true } // CycleAutocompleteBack cycles back in the autocomplete suggestion list diff --git a/internal/buffer/autocomplete.go b/internal/buffer/autocomplete.go index 8e22c1a3..c8dcb8a7 100644 --- a/internal/buffer/autocomplete.go +++ b/internal/buffer/autocomplete.go @@ -60,7 +60,12 @@ func (b *Buffer) CycleAutocomplete(forward bool) { if prevCompletion != -1 { prev := b.Completions[prevCompletion] for i := 0; i < len(prev.Edits); i++ { - b.UndoOneEvent() + if len(prev.Edits[i].Text) != 0 { + b.UndoOneEvent() + } + if !prev.Edits[i].Start.Equal(prev.Edits[i].End) { + b.UndoOneEvent() + } } } diff --git a/internal/buffer/eventhandler.go b/internal/buffer/eventhandler.go index 94957c04..651eb5a8 100644 --- a/internal/buffer/eventhandler.go +++ b/internal/buffer/eventhandler.go @@ -2,6 +2,7 @@ package buffer import ( "bytes" + "log" "time" dmp "github.com/sergi/go-diff/diffmatchpatch" @@ -52,6 +53,7 @@ func (eh *EventHandler) DoTextEvent(t *TextEvent, useUndo bool) { } if len(t.Deltas) != 1 { + log.Println("Multiple deltas not supported") return } diff --git a/internal/buffer/loc.go b/internal/buffer/loc.go index 232133cb..019f9db3 100644 --- a/internal/buffer/loc.go +++ b/internal/buffer/loc.go @@ -48,6 +48,11 @@ func (l Loc) LessEqual(b Loc) bool { return l == b } +// Equal returns true if two locs are equal +func (l Loc) Equal(b Loc) bool { + return l.Y == b.Y && l.X == b.X +} + // The following functions require a buffer to know where newlines are // Diff returns the distance between two locations