Function: multi-file-replace-as-diff

multi-file-replace-as-diff is a byte-compiled function defined in misearch.el.gz.

Signature

(multi-file-replace-as-diff FILES FROM-STRING REPLACEMENTS REGEXP-FLAG DELIMITED-FLAG)

Documentation

Show as diffs replacements of FROM-STRING with REPLACEMENTS.

FILES is a list of file names. REGEXP-FLAG and DELIMITED-FLAG have the same meaning as in perform-replace.

Source Code

;; Defined in /usr/src/emacs/lisp/misearch.el.gz
(defun multi-file-replace-as-diff (files from-string replacements regexp-flag delimited-flag)
  "Show as diffs replacements of FROM-STRING with REPLACEMENTS.
FILES is a list of file names.  REGEXP-FLAG and DELIMITED-FLAG have
the same meaning as in `perform-replace'."
  (require 'diff)
  (let ((inhibit-message t)
        (diff-buffer (get-buffer-create "*replace-diff*")))
    (when (eq multi-file-diff-unsaved 'save-buffers)
      (save-some-buffers t (lambda ()
                             (seq-some (lambda (f-or-b)
                                         (equal f-or-b buffer-file-name))
                                       files))))
    (with-current-buffer diff-buffer
      (buffer-disable-undo (current-buffer))
      (let ((inhibit-read-only t))
        (erase-buffer))
      ;; Make the *vc-diff* buffer read only, the diff-mode key
      ;; bindings are nicer for read only buffers.
      (setq buffer-read-only t)
      (diff-mode))
    (dolist (file-name files)
      (let* ((file-exists (file-exists-p file-name))
             (file-buffer
              (when (or (not file-exists)
                        (eq multi-file-diff-unsaved 'use-modified-buffer))
                (find-buffer-visiting file-name))))
        (when file-name
          (with-temp-buffer
            (if (and file-buffer
                     (or (not file-exists)
                         (buffer-modified-p file-buffer)))
                (insert-buffer-substring file-buffer)
              (insert-file-contents file-name))
            (goto-char (point-min))
            (perform-replace from-string replacements nil regexp-flag delimited-flag)
            (multi-file-diff-no-select
             (if file-exists file-name file-buffer)
             (current-buffer) nil diff-buffer
             (concat file-name "~") file-name)))))
    (with-current-buffer diff-buffer
      (diff-setup-whitespace)
      (diff-setup-buffer-type)
      (buffer-enable-undo (current-buffer))
      (setq-local revert-buffer-function
                  (lambda (_ignore-auto _noconfirm)
                    (multi-file-replace-as-diff
                     files from-string replacements regexp-flag delimited-flag)))
      (goto-char (point-min)))
    (pop-to-buffer diff-buffer)))