From c0b457636e9a18775121223d04bbea36cf14454d Mon Sep 17 00:00:00 2001 From: "Richard M. Stallman" Date: Tue, 27 Dec 2005 04:31:21 +0000 Subject: [PATCH] (perform-replace): Calculate match-again before skipping read-only matches. --- lisp/ChangeLog | 3 +++ lisp/replace.el | 43 ++++++++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 2798afaaf35..2cb816e4513 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2005-12-26 Richard M. Stallman + * replace.el (perform-replace): Calculate match-again + before skipping read-only matches. + * paren.el (paren-showing-faces): New group. (show-paren-match, show-paren-mismatch): Move to that group. diff --git a/lisp/replace.el b/lisp/replace.el index 8229eda85a4..46f672a8d1a 100644 --- a/lisp/replace.el +++ b/lisp/replace.el @@ -1474,32 +1474,33 @@ make, or the user didn't cancel the call." ;; For speed, use only integers and ;; reuse the list used last time. (replace-match-data t real-match-data))))) + + ;; Record whether the match is nonempty, to avoid an infinite loop + ;; repeatedly matching the same empty string. + (setq nonempty-match + (/= (nth 0 real-match-data) (nth 1 real-match-data))) + + ;; If the match is empty, record that the next one can't be + ;; adjacent. + + ;; Otherwise, if matching a regular expression, do the next + ;; match now, since the replacement for this match may + ;; affect whether the next match is adjacent to this one. + ;; If that match is empty, don't use it. + (setq match-again + (and nonempty-match + (or (not regexp-flag) + (and (looking-at search-string) + (let ((match (match-data))) + (and (/= (nth 0 match) (nth 1 match)) + match)))))) + ;; Optionally ignore matches that have a read-only property. (unless (and query-replace-skip-read-only (text-property-not-all - (match-beginning 0) (match-end 0) + (nth 0 real-match-data) (nth 1 real-match-data) 'read-only nil)) - ;; Record whether the match is nonempty, to avoid an infinite loop - ;; repeatedly matching the same empty string. - (setq nonempty-match - (/= (nth 0 real-match-data) (nth 1 real-match-data))) - - ;; If the match is empty, record that the next one can't be - ;; adjacent. - - ;; Otherwise, if matching a regular expression, do the next - ;; match now, since the replacement for this match may - ;; affect whether the next match is adjacent to this one. - ;; If that match is empty, don't use it. - (setq match-again - (and nonempty-match - (or (not regexp-flag) - (and (looking-at search-string) - (let ((match (match-data))) - (and (/= (nth 0 match) (nth 1 match)) - match)))))) - ;; Calculate the replacement string, if necessary. (when replacements (set-match-data real-match-data) -- 2.39.5