@@ -1006,17 +1006,8 @@ func (h *BufPane) ReplaceCmd(args []string) {
10061006
10071007 replace := []byte (replaceStr )
10081008
1009- var regex * regexp.Regexp
1010- var err error
10111009 if h .Buf .Settings ["ignorecase" ].(bool ) {
1012- regex , err = regexp .Compile ("(?im)" + search )
1013- } else {
1014- regex , err = regexp .Compile ("(?m)" + search )
1015- }
1016- if err != nil {
1017- // There was an error with the user's regex
1018- InfoBar .Error (err )
1019- return
1010+ search = "(?i)" + search
10201011 }
10211012
10221013 nreplaced := 0
@@ -1030,21 +1021,32 @@ func (h *BufPane) ReplaceCmd(args []string) {
10301021 searchLoc = start // otherwise me might start at the end
10311022 }
10321023 if all {
1033- nreplaced , _ = h .Buf .ReplaceRegex (start , end , regex , replace , ! noRegex )
1024+ var err error
1025+ if noRegex {
1026+ nreplaced , _ , err = h .Buf .ReplaceAllLiteral (search , start , end , replace )
1027+ } else {
1028+ nreplaced , _ , err = h .Buf .ReplaceAll (search , start , end , replace )
1029+ }
1030+ if err != nil {
1031+ InfoBar .Error (err )
1032+ return
1033+ }
10341034 } else {
1035+ redata , err := buffer .NewRegexpData (search )
1036+ if err != nil {
1037+ InfoBar .Error (err )
1038+ return
1039+ }
1040+
10351041 inRange := func (l buffer.Loc ) bool {
10361042 return l .GreaterEqual (start ) && l .LessEqual (end )
10371043 }
10381044
10391045 lastMatchEnd := buffer.Loc {- 1 , - 1 }
10401046 var doReplacement func ()
10411047 doReplacement = func () {
1042- locs , found , err := h .Buf .FindNext (search , start , end , searchLoc , true , true )
1043- if err != nil {
1044- InfoBar .Error (err )
1045- return
1046- }
1047- if ! found || ! inRange (locs [0 ]) || ! inRange (locs [1 ]) {
1048+ locs := h .Buf .FindRegexpDown (redata , searchLoc , end )
1049+ if locs == nil || ! inRange (locs [0 ]) || ! inRange (locs [1 ]) {
10481050 h .Cursor .ResetSelection ()
10491051 h .Buf .RelocateCursors ()
10501052
@@ -1072,12 +1074,14 @@ func (h *BufPane) ReplaceCmd(args []string) {
10721074
10731075 InfoBar .YNPrompt ("Perform replacement (y,n,esc)" , func (yes , canceled bool ) {
10741076 if ! canceled && yes {
1075- _ , nrunes := h .Buf .ReplaceRegex (locs [0 ], locs [1 ], regex , replace , ! noRegex )
1077+ if noRegex {
1078+ _ , searchLoc , _ = h .Buf .ReplaceAllLiteral (search , locs [0 ], locs [1 ], replace )
1079+ } else {
1080+ _ , searchLoc , _ = h .Buf .ReplaceAll (search , locs [0 ], locs [1 ], replace )
1081+ }
10761082
1077- searchLoc = locs [0 ]
1078- searchLoc .X += nrunes + locs [0 ].Diff (locs [1 ], h .Buf )
10791083 if end .Y == locs [1 ].Y {
1080- end = end .Move ( nrunes , h . Buf )
1084+ end = buffer. Loc { end .X + searchLoc . X - locs [ 1 ]. X , end . Y }
10811085 }
10821086 h .Cursor .Loc = searchLoc
10831087 nreplaced ++
0 commit comments