@@ -1018,17 +1018,8 @@ func (h *BufPane) ReplaceCmd(args []string) {
10181018
10191019 replace := []byte (replaceStr )
10201020
1021- var regex * regexp.Regexp
1022- var err error
10231021 if h .Buf .Settings ["ignorecase" ].(bool ) {
1024- regex , err = regexp .Compile ("(?im)" + search )
1025- } else {
1026- regex , err = regexp .Compile ("(?m)" + search )
1027- }
1028- if err != nil {
1029- // There was an error with the user's regex
1030- InfoBar .Error (err )
1031- return
1022+ search = "(?i)" + search
10321023 }
10331024
10341025 nreplaced := 0
@@ -1042,21 +1033,32 @@ func (h *BufPane) ReplaceCmd(args []string) {
10421033 searchLoc = start // otherwise me might start at the end
10431034 }
10441035 if all {
1045- nreplaced , _ = h .Buf .ReplaceRegex (start , end , regex , replace , ! noRegex )
1036+ var err error
1037+ if noRegex {
1038+ nreplaced , _ , err = h .Buf .ReplaceAllLiteral (search , start , end , replace )
1039+ } else {
1040+ nreplaced , _ , err = h .Buf .ReplaceAll (search , start , end , replace )
1041+ }
1042+ if err != nil {
1043+ InfoBar .Error (err )
1044+ return
1045+ }
10461046 } else {
1047+ redata , err := buffer .NewRegexpData (search )
1048+ if err != nil {
1049+ InfoBar .Error (err )
1050+ return
1051+ }
1052+
10471053 inRange := func (l buffer.Loc ) bool {
10481054 return l .GreaterEqual (start ) && l .LessEqual (end )
10491055 }
10501056
10511057 lastMatchEnd := buffer.Loc {- 1 , - 1 }
10521058 var doReplacement func ()
10531059 doReplacement = func () {
1054- locs , found , err := h .Buf .FindNext (search , start , end , searchLoc , true , true )
1055- if err != nil {
1056- InfoBar .Error (err )
1057- return
1058- }
1059- if ! found || ! inRange (locs [0 ]) || ! inRange (locs [1 ]) {
1060+ locs := h .Buf .FindRegexpDown (redata , searchLoc , end )
1061+ if locs == nil || ! inRange (locs [0 ]) || ! inRange (locs [1 ]) {
10601062 h .Cursor .ResetSelection ()
10611063 h .Buf .RelocateCursors ()
10621064
@@ -1084,12 +1086,14 @@ func (h *BufPane) ReplaceCmd(args []string) {
10841086
10851087 InfoBar .YNPrompt ("Perform replacement (y,n,esc)" , func (yes , canceled bool ) {
10861088 if ! canceled && yes {
1087- _ , nrunes := h .Buf .ReplaceRegex (locs [0 ], locs [1 ], regex , replace , ! noRegex )
1089+ if noRegex {
1090+ _ , searchLoc , _ = h .Buf .ReplaceAllLiteral (search , locs [0 ], locs [1 ], replace )
1091+ } else {
1092+ _ , searchLoc , _ = h .Buf .ReplaceAll (search , locs [0 ], locs [1 ], replace )
1093+ }
10881094
1089- searchLoc = locs [0 ]
1090- searchLoc .X += nrunes + locs [0 ].Diff (locs [1 ], h .Buf )
10911095 if end .Y == locs [1 ].Y {
1092- end = end .Move ( nrunes , h . Buf )
1096+ end = buffer. Loc { end .X + searchLoc . X - locs [ 1 ]. X , end . Y }
10931097 }
10941098 h .Cursor .Loc = searchLoc
10951099 nreplaced ++
0 commit comments