Function: eglot--propose-changes-as-diff
eglot--propose-changes-as-diff is a byte-compiled function defined in
eglot.el.gz.
Signature
(eglot--propose-changes-as-diff PREPARED)
Documentation
Helper for eglot--apply-workspace-edit.
Goal is to popup a diff-mode buffer containing all the changes
of PREPARED, ready to apply with C-c C-a. PREPARED is a
list ((FILENAME EDITS VERSION)...).
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/eglot.el.gz
(defun eglot--propose-changes-as-diff (prepared)
"Helper for `eglot--apply-workspace-edit'.
Goal is to popup a `diff-mode' buffer containing all the changes
of PREPARED, ready to apply with C-c C-a. PREPARED is a
list ((FILENAME EDITS VERSION)...)."
(with-current-buffer (get-buffer-create "*EGLOT proposed server changes*")
(buffer-disable-undo (current-buffer))
(let ((inhibit-read-only t)
(target (current-buffer)))
(diff-mode)
(erase-buffer)
(pcase-dolist (`(,path ,edits ,_) prepared)
(with-temp-buffer
(let* ((diff (current-buffer))
(existing-buf (find-buffer-visiting path))
(existing-buf-label (prin1-to-string existing-buf)))
(with-temp-buffer
(if existing-buf
(insert-buffer-substring existing-buf)
(insert-file-contents path))
(eglot--apply-text-edits edits nil t)
(diff-no-select (or existing-buf path) (current-buffer) nil t diff)
(when existing-buf
;; Here we have to pretend the label of the unsaved
;; buffer is the actual file, just so that we can
;; diff-apply without troubles. If there's a better
;; way, it probably involves changes to `diff.el'.
(with-current-buffer diff
(goto-char (point-min))
(while (search-forward existing-buf-label nil t)
(replace-match (buffer-file-name existing-buf))))))
(with-current-buffer target
(insert-buffer-substring diff))))))
(setq-local buffer-read-only t)
(buffer-enable-undo (current-buffer))
(goto-char (point-min))
(pop-to-buffer (current-buffer))
(font-lock-ensure)))