summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2007-02-28 18:54:43 +0000
committerChong Yidong <cyd@stupidchicken.com>2007-02-28 18:54:43 +0000
commitb3aad29e4699da1f3b8d3bb05eb7f3ca695af7bf (patch)
treee66e6e8ca50da9246925a2d60b0228ad06103f63
parentb0c39184d2faebc62e6af2a59e19c8073e0630fd (diff)
downloademacs-b3aad29e4699da1f3b8d3bb05eb7f3ca695af7bf.tar.gz
(perform-replace): Undo forward-char immediately if non-adjacent
search fails.
-rw-r--r--lisp/replace.el56
1 files changed, 29 insertions, 27 deletions
diff --git a/lisp/replace.el b/lisp/replace.el
index 9790dacd82b..20f38aec32f 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -1466,27 +1466,35 @@ make, or the user didn't cancel the call."
;; 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 @@ make, or the user didn't cancel the call."
(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"