@@ -2,7 +2,6 @@ package buffer
22
33import (
44 "regexp"
5- "unicode/utf8"
65
76 "github.com/zyedidia/micro/v2/internal/util"
87)
@@ -32,33 +31,6 @@ func NewRegexpGroup(s string) (RegexpGroup, error) {
3231 return rgrp , err
3332}
3433
35- func findLineParams (b * Buffer , start , end Loc , i int ) ([]byte , int , int ) {
36- l := b .LineBytes (i )
37- charpos := 0
38- padMode := 0
39-
40- if i == end .Y {
41- nchars := util .CharacterCount (l )
42- end .X = util .Clamp (end .X , 0 , nchars )
43- if end .X < nchars {
44- l = util .SliceStart (l , end .X + 1 )
45- padMode |= padEnd
46- }
47- }
48-
49- if i == start .Y {
50- nchars := util .CharacterCount (l )
51- start .X = util .Clamp (start .X , 0 , nchars )
52- if start .X > 0 {
53- charpos = start .X - 1
54- l = util .SliceEnd (l , charpos )
55- padMode |= padStart
56- }
57- }
58-
59- return l , charpos , padMode
60- }
61-
6234type bytesFind func (* regexp.Regexp , []byte ) []int
6335
6436func (b * Buffer ) findDownFunc (rgrp RegexpGroup , start , end Loc , find bytesFind ) []Loc {
@@ -77,21 +49,40 @@ func (b *Buffer) findDownFunc(rgrp RegexpGroup, start, end Loc, find bytesFind)
7749 }
7850
7951 for i := start .Y ; i <= end .Y ; i ++ {
80- l , charpos , padMode := findLineParams (b , start , end , i )
52+ l := b .LineBytes (i )
53+ from , to := 0 , len (l )
54+ padMode := 0
55+
56+ if i == end .Y {
57+ nchars := util .CharacterCount (l )
58+ end .X = util .Clamp (end .X , 0 , nchars )
59+ if end .X < nchars {
60+ padMode |= padEnd
61+ to = util .NextRunePos (l , util .BytePosFromCharPos (l , end .X ))
62+ }
63+ }
64+
65+ if i == start .Y {
66+ nchars := util .CharacterCount (l )
67+ start .X = util .Clamp (start .X , 0 , nchars )
68+ if start .X > 0 {
69+ padMode |= padStart
70+ from = util .PreviousRunePos (l , util .BytePosFromCharPos (l , start .X ))
71+ }
72+ }
8173
82- match := find (rgrp [padMode ], l )
74+ s := l [from :to ]
75+ match := find (rgrp [padMode ], s )
8376
8477 if match != nil {
8578 if padMode & padStart != 0 {
86- _ , size := utf8 .DecodeRune (l [match [0 ]:])
87- match [0 ] += size
79+ match [0 ] = util .NextRunePos (s , match [0 ])
8880 }
8981 if padMode & padEnd != 0 {
90- _ , size := utf8 .DecodeLastRune (l [:match [1 ]])
91- match [1 ] -= size
82+ match [1 ] = util .PreviousRunePos (s , match [1 ])
9283 }
9384 return util .SliceMap (match , func (pos int ) Loc {
94- return Loc {charpos + util .RunePos (l , pos ), i }
85+ return Loc {util .CharPos (l , from + pos ), i }
9586 })
9687 }
9788 }
0 commit comments