Function: multi-file-replace-as-diff

multi-file-replace-as-diff is an autoloaded and 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. Also it's possible to provide a list of buffers in FILES. REGEXP-FLAG and DELIMITED-FLAG have the same meaning as in perform-replace.

Source Code

;; Defined in /usr/src/emacs/lisp/misearch.el.gz
(defvar diff--coding-system-for-buffer) ; from diff.el

;;;###autoload
(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.  Also it's possible to provide a list of
buffers in FILES.  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* ((non-file-buffer (and (buffer-live-p file-name)
                                   (not (buffer-local-value
                                         'buffer-file-name file-name))))
             (file-exists (unless non-file-buffer
                            (file-exists-p file-name)))
             (file-buffer
              (if non-file-buffer
                  file-name
                (when (or (not file-exists)
                          (eq multi-file-diff-unsaved 'use-modified-buffer))
                  (find-buffer-visiting file-name))))
             ;; Make sure any supported characters can be written to a
             ;; file without asking the user to select a safe
             ;; coding-system.
             (diff--coding-system-for-buffer 'utf-8-emacs))
        (when non-file-buffer (setq file-name (buffer-name file-name)))
        (when (or file-exists file-buffer)
          (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)))