diff --git a/internal/action/actions.go b/internal/action/actions.go index c0804b35b..4dd82b03d 100644 --- a/internal/action/actions.go +++ b/internal/action/actions.go @@ -11,6 +11,7 @@ import ( "time" shellquote "github.com/kballard/go-shellquote" + "github.com/micro-editor/tcell/v2" "github.com/zyedidia/micro/v2/internal/buffer" "github.com/zyedidia/micro/v2/internal/clipboard" "github.com/zyedidia/micro/v2/internal/config" @@ -18,7 +19,6 @@ import ( "github.com/zyedidia/micro/v2/internal/screen" "github.com/zyedidia/micro/v2/internal/shell" "github.com/zyedidia/micro/v2/internal/util" - "github.com/micro-editor/tcell/v2" ) // ScrollUp is not an action @@ -901,19 +901,17 @@ func (h *BufPane) OutdentSelection() bool { // Autocomplete cycles the suggestions and performs autocompletion if there are suggestions func (h *BufPane) Autocomplete() bool { b := h.Buf + cc := buffer.AutocompleteCursorCheck(h.Cursor) + rc := buffer.AutocompleteRuneCheck(h.Cursor) // Don't autocomplete at all if the active cursor cannot be autocomplete - if !buffer.AutocompleteCheck(h.Cursor) { - return false - } - - if !b.HasSuggestions && !b.StartAutocomplete(buffer.BufferComplete) { + if !b.HasSuggestions && (!rc || !cc || !b.StartAutocomplete(buffer.BufferComplete)) { return false } prevSuggestion := b.CycleAutocomplete(true) for i := 0; i < b.NumCursors(); i++ { - if buffer.AutocompleteCheck(b.GetCursor(i)) { + if buffer.AutocompleteCursorCheck(b.GetCursor(i)) { b.PerformSingleAutocomplete(prevSuggestion, b.GetCursor(i)) } } @@ -931,7 +929,7 @@ func (h *BufPane) CycleAutocompleteBack() bool { if b.HasSuggestions { prevSuggestion := b.CycleAutocomplete(false) for i := 0; i < b.NumCursors(); i++ { - if buffer.AutocompleteCheck(b.GetCursor(i)) { + if buffer.AutocompleteCursorCheck(b.GetCursor(i)) { b.PerformSingleAutocomplete(prevSuggestion, b.GetCursor(i)) } } diff --git a/internal/action/infopane.go b/internal/action/infopane.go index fa104c315..f16e22fef 100644 --- a/internal/action/infopane.go +++ b/internal/action/infopane.go @@ -3,12 +3,12 @@ package action import ( "bytes" + "github.com/micro-editor/tcell/v2" "github.com/zyedidia/micro/v2/internal/buffer" "github.com/zyedidia/micro/v2/internal/config" "github.com/zyedidia/micro/v2/internal/display" "github.com/zyedidia/micro/v2/internal/info" "github.com/zyedidia/micro/v2/internal/util" - "github.com/micro-editor/tcell/v2" ) type InfoKeyAction func(*InfoPane) @@ -193,11 +193,19 @@ func (h *InfoPane) CommandComplete() { b := h.Buf c := b.GetActiveCursor() + cc := buffer.AutocompleteCursorCheck(c) + rc := buffer.AutocompleteRuneCheck(c) + // Cycling commands - if !buffer.AutocompleteCheck(c) { + if !b.HasSuggestions && !cc && !rc { return } + if b.HasSuggestions { + if !cc { + return + } + prevSuggestion := b.CycleAutocomplete(true) b.PerformSingleAutocomplete(prevSuggestion, c) return diff --git a/internal/buffer/autocomplete.go b/internal/buffer/autocomplete.go index cc53ad16a..175fa902a 100644 --- a/internal/buffer/autocomplete.go +++ b/internal/buffer/autocomplete.go @@ -23,13 +23,7 @@ func (b *Buffer) GetSuggestions() { } -func AutocompleteCheck(cursor *Cursor) bool { - if cursor.HasSelection() { - return false - } - if cursor.X == 0 { - return false - } +func AutocompleteRuneCheck(cursor *Cursor) bool { r := cursor.RuneUnder(cursor.X) prev := cursor.RuneUnder(cursor.X - 1) if !util.IsAutocomplete(prev) || util.IsWordChar(r) { @@ -39,6 +33,16 @@ func AutocompleteCheck(cursor *Cursor) bool { return true } +func AutocompleteCursorCheck(cursor *Cursor) bool { + if cursor.HasSelection() { + return false + } + if cursor.X == 0 { + return false + } + return true +} + func (b *Buffer) StartAutocomplete(c Completer) bool { b.Completions, b.Suggestions = c(b) if len(b.Completions) != len(b.Suggestions) || len(b.Completions) == 0 {