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)))