changeset 76236:91de64a1c05e

(perform-replace): Undo forward-char immediately if non-adjacent search fails.
author Chong Yidong <cyd@stupidchicken.com>
date Wed, 28 Feb 2007 18:54:43 +0000
parents 68aa1beabc09
children 616e0f6cc423
files lisp/replace.el
diffstat 1 files changed, 29 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/replace.el	Wed Feb 28 18:54:34 2007 +0000
+++ b/lisp/replace.el	Wed Feb 28 18:54:43 2007 +0000
@@ -1466,27 +1466,35 @@
 		    ;; otherwise, search for a match after moving forward
 		    ;; one char if progress is required.
 		    (setq real-match-data
-			  (if (consp match-again)
-			      (progn (goto-char (nth 1 match-again))
-				     (replace-match-data t
-				      real-match-data
-				      match-again))
-			    (and (or match-again
-				     ;; MATCH-AGAIN non-nil means we
-				     ;; accept an adjacent match.  If
-				     ;; we don't, move one char to the
-				     ;; right.  This takes us a
-				     ;; character too far at the end,
-				     ;; but this is undone after the
-				     ;; while-loop.
-				     (progn
-				       (forward-char 1)
-				       (not (or (eobp)
-						(and limit (>= (point) limit))))))
-				 (funcall search-function search-string limit t)
-				 ;; For speed, use only integers and
-				 ;; reuse the list used last time.
-				 (replace-match-data t real-match-data)))))
+			  (cond ((consp match-again)
+				 (goto-char (nth 1 match-again))
+				 (replace-match-data
+				  t real-match-data match-again))
+				;; MATCH-AGAIN non-nil means accept an
+				;; adjacent match.
+				(match-again
+				 (and
+				  (funcall search-function search-string
+					   limit t)
+				  ;; For speed, use only integers and
+				  ;; reuse the list used last time.
+				  (replace-match-data t real-match-data)))
+				((and (< (1+ (point)) (point-max))
+				      (or (null limit)
+					  (< (1+ (point)) limit)))
+				 ;; If not accepting adjacent matches,
+				 ;; move one char to the right before
+				 ;; searching again.  Undo the motion
+				 ;; if the search fails.
+				 (let ((opoint (point)))
+				   (forward-char 1)
+				   (if (funcall
+					search-function search-string
+					limit t)
+				       (replace-match-data
+					t real-match-data)
+				     (goto-char opoint)
+				     nil))))))
 
 	  ;; Record whether the match is nonempty, to avoid an infinite loop
 	  ;; repeatedly matching the same empty string.
@@ -1702,12 +1710,6 @@
 			      (match-data t)))
 		      stack)))))
 
-      ;; The code preventing adjacent regexp matches in the condition
-      ;; of the while-loop above will haven taken us one character
-      ;; beyond the last replacement.  Undo that.
-      (when (and regexp-flag (not match-again) (> replace-count 0))
-	(backward-char 1))
-
       (replace-dehighlight))
     (or unread-command-events
 	(message "Replaced %d occurrence%s"