From bee60023aeb5214c592949b60a0cfbc7ba895283 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Sat, 1 Jul 2017 16:40:28 -0400 Subject: [PATCH] Optimize search and replace --- cmd/micro/command.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cmd/micro/command.go b/cmd/micro/command.go index 9d691341..70361e2c 100644 --- a/cmd/micro/command.go +++ b/cmd/micro/command.go @@ -539,25 +539,25 @@ func Replace(args []string) { found := 0 if allAtOnce { - // var deltas []Delta + var deltas []Delta for i := 0; i < view.Buf.LinesNum(); i++ { - // view.Buf.lines[i].data = regex.ReplaceAll(view.Buf.lines[i].data, []byte(replace)) - for { - m := regex.FindIndex(view.Buf.lines[i].data) + matches := regex.FindAllIndex(view.Buf.lines[i].data, -1) + str := string(view.Buf.lines[i].data) - if m != nil { - from := Loc{m[0], i} - to := Loc{m[1], i} + xOffset := 0 + if matches != nil { + for _, m := range matches { + from := Loc{runePos(m[0]+xOffset, str), i} + to := Loc{runePos(m[1]+xOffset, str), i} - // deltas = append(deltas, Delta{replace, from, to}) - view.Buf.Replace(from, to, replace) + xOffset += len(replace) - len(search) + + deltas = append(deltas, Delta{replace, from, to}) found++ - } else { - break } } } - // view.Buf.MultipleReplace(deltas) + view.Buf.MultipleReplace(deltas) } else { for {