Commit 3a52ccf7 authored by Juri Linkov's avatar Juri Linkov
Browse files

* lisp/replace.el (replace-search): New function with code moved out

from `perform-replace'.
(replace-highlight, replace-dehighlight): Move function definitions
up closer to `replace-search'.

Fixes: debbugs:11746
parent f1a60a0f
2013-05-27 Juri Linkov <juri@jurta.org>
* replace.el (replace-search): New function with code moved out
from `perform-replace'.
(replace-highlight, replace-dehighlight): Move function definitions
up closer to `replace-search'. (Bug#11746)
2013-05-27 Juri Linkov <juri@jurta.org> 2013-05-27 Juri Linkov <juri@jurta.org>
   
* replace.el (perform-replace): Ignore invisible matches. * replace.el (perform-replace): Ignore invisible matches.
......
...@@ -1838,6 +1838,68 @@ It is used by `query-replace-regexp', `replace-regexp', ...@@ -1838,6 +1838,68 @@ It is used by `query-replace-regexp', `replace-regexp',
It is called with three arguments, as if it were It is called with three arguments, as if it were
`re-search-forward'.") `re-search-forward'.")
(defun replace-search (search-string limit regexp-flag delimited-flag
case-fold-search)
"Search for the next occurence of SEARCH-STRING to replace."
;; Let-bind global isearch-* variables to values used
;; to search the next replacement. These let-bindings
;; should be effective both at the time of calling
;; `isearch-search-fun-default' and also at the
;; time of funcalling `search-function'.
;; These isearch-* bindings can't be placed higher
;; outside of this function because then another I-search
;; used after `recursive-edit' might override them.
(let* ((isearch-regexp regexp-flag)
(isearch-word delimited-flag)
(isearch-lax-whitespace
replace-lax-whitespace)
(isearch-regexp-lax-whitespace
replace-regexp-lax-whitespace)
(isearch-case-fold-search case-fold-search)
(isearch-adjusted nil)
(isearch-nonincremental t) ; don't use lax word mode
(isearch-forward t)
(search-function
(or (if regexp-flag
replace-re-search-function
replace-search-function)
(isearch-search-fun-default))))
(funcall search-function search-string limit t)))
(defvar replace-overlay nil)
(defun replace-highlight (match-beg match-end range-beg range-end
search-string regexp-flag delimited-flag
case-fold-search)
(if query-replace-highlight
(if replace-overlay
(move-overlay replace-overlay match-beg match-end (current-buffer))
(setq replace-overlay (make-overlay match-beg match-end))
(overlay-put replace-overlay 'priority 1001) ;higher than lazy overlays
(overlay-put replace-overlay 'face 'query-replace)))
(if query-replace-lazy-highlight
(let ((isearch-string search-string)
(isearch-regexp regexp-flag)
(isearch-word delimited-flag)
(isearch-lax-whitespace
replace-lax-whitespace)
(isearch-regexp-lax-whitespace
replace-regexp-lax-whitespace)
(isearch-case-fold-search case-fold-search)
(isearch-forward t)
(isearch-other-end match-beg)
(isearch-error nil))
(isearch-lazy-highlight-new-loop range-beg range-end))))
(defun replace-dehighlight ()
(when replace-overlay
(delete-overlay replace-overlay))
(when query-replace-lazy-highlight
(lazy-highlight-cleanup lazy-highlight-cleanup)
(setq isearch-lazy-highlight-last-string nil))
;; Close overlays opened by `isearch-range-invisible' in `perform-replace'.
(isearch-clean-overlays))
(defun perform-replace (from-string replacements (defun perform-replace (from-string replacements
query-flag regexp-flag delimited-flag query-flag regexp-flag delimited-flag
&optional repeat-count map start end) &optional repeat-count map start end)
...@@ -1925,29 +1987,6 @@ make, or the user didn't cancel the call." ...@@ -1925,29 +1987,6 @@ make, or the user didn't cancel the call."
;; Loop finding occurrences that perhaps should be replaced. ;; Loop finding occurrences that perhaps should be replaced.
(while (and keep-going (while (and keep-going
(not (or (eobp) (and limit (>= (point) limit)))) (not (or (eobp) (and limit (>= (point) limit))))
;; Let-bind global isearch-* variables to values used
;; to search the next replacement. These let-bindings
;; should be effective both at the time of calling
;; `isearch-search-fun-default' and also at the
;; time of funcalling `search-function'.
;; These isearch-* bindings can't be placed higher
;; outside of this loop because then another I-search
;; used after `recursive-edit' might override them.
(let* ((isearch-regexp regexp-flag)
(isearch-word delimited-flag)
(isearch-lax-whitespace
replace-lax-whitespace)
(isearch-regexp-lax-whitespace
replace-regexp-lax-whitespace)
(isearch-case-fold-search case-fold-search)
(isearch-adjusted nil)
(isearch-nonincremental t) ; don't use lax word mode
(isearch-forward t)
(search-function
(or (if regexp-flag
replace-re-search-function
replace-search-function)
(isearch-search-fun-default))))
;; Use the next match if it is already known; ;; Use the next match if it is already known;
;; otherwise, search for a match after moving forward ;; otherwise, search for a match after moving forward
;; one char if progress is required. ;; one char if progress is required.
...@@ -1960,8 +1999,9 @@ make, or the user didn't cancel the call." ...@@ -1960,8 +1999,9 @@ make, or the user didn't cancel the call."
;; adjacent match. ;; adjacent match.
(match-again (match-again
(and (and
(funcall search-function search-string (replace-search search-string limit
limit t) regexp-flag delimited-flag
case-fold-search)
;; For speed, use only integers and ;; For speed, use only integers and
;; reuse the list used last time. ;; reuse the list used last time.
(replace-match-data t real-match-data))) (replace-match-data t real-match-data)))
...@@ -1974,13 +2014,13 @@ make, or the user didn't cancel the call." ...@@ -1974,13 +2014,13 @@ make, or the user didn't cancel the call."
;; if the search fails. ;; if the search fails.
(let ((opoint (point))) (let ((opoint (point)))
(forward-char 1) (forward-char 1)
(if (funcall (if (replace-search search-string limit
search-function search-string regexp-flag delimited-flag
limit t) case-fold-search)
(replace-match-data (replace-match-data
t real-match-data) t real-match-data)
(goto-char opoint) (goto-char opoint)
nil))))))) nil))))))
;; Record whether the match is nonempty, to avoid an infinite loop ;; Record whether the match is nonempty, to avoid an infinite loop
;; repeatedly matching the same empty string. ;; repeatedly matching the same empty string.
...@@ -2229,38 +2269,4 @@ make, or the user didn't cancel the call." ...@@ -2229,38 +2269,4 @@ make, or the user didn't cancel the call."
(if (= replace-count 1) "" "s"))) (if (= replace-count 1) "" "s")))
(or (and keep-going stack) multi-buffer))) (or (and keep-going stack) multi-buffer)))
(defvar replace-overlay nil)
(defun replace-highlight (match-beg match-end range-beg range-end
search-string regexp-flag delimited-flag
case-fold-search)
(if query-replace-highlight
(if replace-overlay
(move-overlay replace-overlay match-beg match-end (current-buffer))
(setq replace-overlay (make-overlay match-beg match-end))
(overlay-put replace-overlay 'priority 1001) ;higher than lazy overlays
(overlay-put replace-overlay 'face 'query-replace)))
(if query-replace-lazy-highlight
(let ((isearch-string search-string)
(isearch-regexp regexp-flag)
(isearch-word delimited-flag)
(isearch-lax-whitespace
replace-lax-whitespace)
(isearch-regexp-lax-whitespace
replace-regexp-lax-whitespace)
(isearch-case-fold-search case-fold-search)
(isearch-forward t)
(isearch-other-end match-beg)
(isearch-error nil))
(isearch-lazy-highlight-new-loop range-beg range-end))))
(defun replace-dehighlight ()
(when replace-overlay
(delete-overlay replace-overlay))
(when query-replace-lazy-highlight
(lazy-highlight-cleanup lazy-highlight-cleanup)
(setq isearch-lazy-highlight-last-string nil))
;; Close overlays opened by `isearch-range-invisible' in `perform-replace'.
(isearch-clean-overlays))
;;; replace.el ends here ;;; replace.el ends here
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment