diff --git a/README.md b/README.md index 5c9a36dc..a730de81 100644 --- a/README.md +++ b/README.md @@ -21,15 +21,20 @@ package main import ( "fmt" "github.com/elk-language/go-prompt" + pstrings "github.com/elk-language/go-prompt/strings" ) -func completer(d prompt.Document) []prompt.Suggest { +func completer(d prompt.Document) ([]prompt.Suggest, pstrings.RuneNumber, pstrings.RuneNumber) { + endIndex := d.CurrentRuneIndex() + w := d.GetWordBeforeCursor() + startIndex := endIndex - pstrings.RuneCount(w) + s := []prompt.Suggest{ {Text: "users", Description: "Store the username and age"}, {Text: "articles", Description: "Store the article text posted by user"}, {Text: "comments", Description: "Store the text commented to articles"}, } - return prompt.FilterHasPrefix(s, d.GetWordBeforeCursor(), true) + return prompt.FilterHasPrefix(s, w, true), startIndex, endIndex } func main() { diff --git a/buffer.go b/buffer.go index 4cbbbc5a..a54c7d11 100644 --- a/buffer.go +++ b/buffer.go @@ -179,6 +179,7 @@ func (b *Buffer) DeleteBeforeCursor(count istrings.RuneNumber, columns istrings. cursorPosition: b.cursorPosition - istrings.RuneNumber(len([]rune(deleted))), }, columns, rows) } + b.RecalculateStartLine(columns, rows) return } @@ -205,6 +206,7 @@ func (b *Buffer) Delete(count istrings.RuneNumber, col istrings.Width, row int) ) deleted := string(deletedRunes) + b.RecalculateStartLine(col, row) return deleted } diff --git a/renderer.go b/renderer.go index 3d440d62..c71ae3b8 100644 --- a/renderer.go +++ b/renderer.go @@ -250,6 +250,7 @@ func (r *Renderer) renderText(lexer Lexer, input string, startLine int) { for _, char := range input { if lineCharIndex >= col || char == '\n' { lineNumber++ + lineCharIndex = 0 if lineNumber-1 < startLine { continue } @@ -258,7 +259,6 @@ func (r *Renderer) renderText(lexer Lexer, input string, startLine int) { } lineBuffer.WriteRune('\n') r.renderLine(prefix, lineBuffer.String(), r.inputTextColor) - lineCharIndex = 0 lineBuffer.Reset() if char != '\n' { lineBuffer.WriteRune(char) @@ -271,11 +271,11 @@ func (r *Renderer) renderText(lexer Lexer, input string, startLine int) { continue } + lineCharIndex += istrings.GetRuneWidth(char) if lineNumber < startLine { continue } lineBuffer.WriteRune(char) - lineCharIndex += istrings.GetRuneWidth(char) } r.renderLine(prefix, lineBuffer.String(), r.inputTextColor) @@ -376,6 +376,7 @@ tokenLoop: for _, char := range text { if lineCharIndex >= col || char == '\n' { lineNumber++ + lineCharIndex = 0 if lineNumber-1 < startLine { continue charLoop } @@ -385,7 +386,6 @@ tokenLoop: lineBuffer = append(lineBuffer, '\n') r.writeColor(lineBuffer, token.Color()) r.renderPrefix(multilinePrefix) - lineCharIndex = 0 lineBuffer = lineBuffer[:0] if char != '\n' { size := utf8.EncodeRune(runeBuffer, char) @@ -395,12 +395,12 @@ tokenLoop: continue charLoop } + lineCharIndex += istrings.GetRuneWidth(char) if lineNumber < startLine { continue charLoop } size := utf8.EncodeRune(runeBuffer, char) lineBuffer = append(lineBuffer, runeBuffer[:size]...) - lineCharIndex += istrings.GetRuneWidth(char) } if len(lineBuffer) > 0 { r.writeColor(lineBuffer, token.Color())