diff options
Diffstat (limited to 'lisp/fileloop.el')
-rw-r--r-- | lisp/fileloop.el | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/lisp/fileloop.el b/lisp/fileloop.el index 833bb0401cb..d52e35d886f 100644 --- a/lisp/fileloop.el +++ b/lisp/fileloop.el @@ -201,30 +201,34 @@ operating on the next file and nil otherwise." ;;;###autoload (defun fileloop-initialize-replace (from to files case-fold &optional delimited) "Initialize a new round of query&replace on several files. - FROM is a regexp and TO is the replacement to use. - FILES describes the files, as in `fileloop-initialize'. - CASE-FOLD can be t, nil, or `default': - if it is nil, matching of FROM is case-sensitive. - if it is t, matching of FROM is case-insensitive, except - when `search-upper-case' is non-nil and FROM includes - upper-case letters. - if it is `default', the function uses the value of - `case-fold-search' instead. - DELIMITED if non-nil means replace only word-delimited matches." +FROM is a regexp and TO is the replacement to use. +FILES describes the files, as in `fileloop-initialize'. +CASE-FOLD can be t, nil, or `default': + if it is nil, matching of FROM is case-sensitive. + if it is t, matching of FROM is case-insensitive, except + when `search-upper-case' is non-nil and FROM includes + upper-case letters. + if it is `default', the function uses the value of + `case-fold-search' instead. +DELIMITED if non-nil means replace only word-delimited matches." ;; FIXME: Not sure how the delimited-flag interacts with the regexp-flag in ;; `perform-replace', so I just try to mimic the old code. - (fileloop-initialize - files - (lambda () - (let ((case-fold-search (fileloop--case-fold from case-fold))) - (if (re-search-forward from nil t) - ;; When we find a match, move back - ;; to the beginning of it so perform-replace - ;; will see it. - (goto-char (match-beginning 0))))) - (lambda () - (let ((case-fold-search (fileloop--case-fold from case-fold))) - (perform-replace from to t t delimited nil multi-query-replace-map))))) + (let ((mstart (make-hash-table :test 'eq))) + (fileloop-initialize + files + (lambda () + (let ((case-fold-search (fileloop--case-fold from case-fold))) + (when (re-search-forward from nil t) + ;; When we find a match, save its beginning for + ;; `perform-replace' (we used to just set point, but this + ;; is unreliable in the face of + ;; `switch-to-buffer-preserve-window-point'). + (puthash (current-buffer) (match-beginning 0) mstart)))) + (lambda () + (let ((case-fold-search (fileloop--case-fold from case-fold))) + (perform-replace from to t t delimited nil multi-query-replace-map + (gethash (current-buffer) mstart (point-min)) + (point-max))))))) (provide 'fileloop) ;;; fileloop.el ends here |