From 298fa40f9021a28bdfbef108fa4365480038fe99 Mon Sep 17 00:00:00 2001 From: Dmitry Maluka Date: Tue, 20 Oct 2020 02:36:14 +0200 Subject: [PATCH] Fix buffer.RuneAt (#1895) Fix buffer.RuneAt returning the rune not at the given location (as the documentation claims) but just before it. --- internal/buffer/autocomplete.go | 4 ++-- internal/buffer/buffer.go | 3 ++- internal/buffer/save.go | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/buffer/autocomplete.go b/internal/buffer/autocomplete.go index b1c061cd..414e3060 100644 --- a/internal/buffer/autocomplete.go +++ b/internal/buffer/autocomplete.go @@ -69,11 +69,11 @@ func GetWord(b *Buffer) ([]byte, int) { l := b.LineBytes(c.Y) l = util.SliceStart(l, c.X) - if c.X == 0 || util.IsWhitespace(b.RuneAt(c.Loc)) { + if c.X == 0 || util.IsWhitespace(b.RuneAt(c.Loc.Move(-1, b))) { return []byte{}, -1 } - if util.IsNonAlphaNumeric(b.RuneAt(c.Loc)) { + if util.IsNonAlphaNumeric(b.RuneAt(c.Loc.Move(-1, b))) { return []byte{}, c.X } diff --git a/internal/buffer/buffer.go b/internal/buffer/buffer.go index 43be4a81..387b041c 100644 --- a/internal/buffer/buffer.go +++ b/internal/buffer/buffer.go @@ -511,11 +511,12 @@ func (b *Buffer) RuneAt(loc Loc) rune { for len(line) > 0 { r, _, size := util.DecodeCharacter(line) line = line[size:] - i++ if i == loc.X { return r } + + i++ } } return '\n' diff --git a/internal/buffer/save.go b/internal/buffer/save.go index d037fb92..e912055d 100644 --- a/internal/buffer/save.go +++ b/internal/buffer/save.go @@ -109,7 +109,7 @@ func (b *Buffer) saveToFile(filename string, withSudo bool) error { if b.Settings["eofnewline"].(bool) { end := b.End() - if b.RuneAt(Loc{end.X, end.Y}) != '\n' { + if b.RuneAt(Loc{end.X - 1, end.Y}) != '\n' { b.insert(end, []byte{'\n'}) } }