Function: wdired-finish-edit
wdired-finish-edit is an interactive and byte-compiled function
defined in wdired.el.gz.
Signature
(wdired-finish-edit)
Documentation
Actually rename files based on your editing in the Dired buffer.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/wdired.el.gz
(defun wdired-finish-edit ()
"Actually rename files based on your editing in the Dired buffer."
(interactive)
(let ((changes nil)
(errors 0)
files-deleted
files-renamed
some-file-names-unchanged
file-old file-new tmp-value)
(save-excursion
(when (and wdired-allow-to-redirect-links
(fboundp 'make-symbolic-link))
(setq tmp-value (wdired-do-symlink-changes))
(setq errors (cdr tmp-value))
(setq changes (car tmp-value)))
(when (and wdired-allow-to-change-permissions
wdired--perm-beg) ; could have been changed
(setq tmp-value (wdired-do-perm-changes))
(setq errors (+ errors (cdr tmp-value)))
(setq changes (or changes (car tmp-value))))
(goto-char (point-max))
(while (not (bobp))
(setq file-old (and (wdired--line-preprocessed-p)
(wdired-get-filename nil t)))
(when file-old
(setq file-new (wdired-get-filename))
(if (equal file-new file-old)
(setq some-file-names-unchanged t)
(setq changes t)
(if (not file-new) ;empty filename!
(push file-old files-deleted)
(when wdired-keep-marker-rename
(let ((mark (cond ((integerp wdired-keep-marker-rename)
wdired-keep-marker-rename)
(wdired-keep-marker-rename
(cdr (assoc file-old wdired--old-marks)))
(t nil))))
(when mark
(push (cons (substitute-in-file-name file-new) mark)
wdired--old-marks))))
(push (cons file-old (substitute-in-file-name file-new))
files-renamed))))
(forward-line -1)))
(when files-renamed
(pcase-let ((`(,errs . ,successful-renames)
(wdired-do-renames files-renamed)))
(cl-incf errors errs)
;; Some of the renames may fail -- in that case, don't mark an
;; already-existing file with the same name as renamed.
(pcase-dolist (`(,file . _) wdired--old-marks)
(unless (member file successful-renames)
(setq wdired--old-marks
(assoc-delete-all file wdired--old-marks #'equal))))))
;; We have to be in wdired-mode when wdired-do-renames is executed
;; so that wdired--restore-properties runs, but we have to change
;; back to dired-mode before reverting the buffer to avoid using
;; wdired-revert, which changes back to wdired-mode.
(wdired-change-to-dired-mode)
(if changes
(progn
(cond
((and (stringp dired-directory)
(not (file-directory-p dired-directory))
(null some-file-names-unchanged)
(= (length files-renamed) 1))
;; If we are displaying a single file (rather than the
;; contents of a directory), change dired-directory if that
;; file was renamed.
(setq dired-directory (cdr (car files-renamed))))
((and (consp dired-directory)
(cdr dired-directory)
files-renamed)
;; Fix dired buffers created with
;; (dired '(foo f1 f2 f3)).
(setq dired-directory
(cons (car dired-directory)
;; Replace in `dired-directory' files that have
;; been modified with their new name keeping
;; the ones that are unmodified at the same place.
(cl-loop for f in (cdr dired-directory)
collect (or (assoc-default f files-renamed)
f))))))
;; Re-sort the buffer.
(revert-buffer)
(let ((inhibit-read-only t))
(dired-mark-remembered wdired--old-marks)))
(let ((inhibit-read-only t))
(remove-text-properties (point-min) (point-max)
'(old-name nil end-name nil old-link nil
end-link nil end-perm nil
old-perm nil perm-changed nil))
(message "(No changes to be performed)")
;; Deleting file indicator characters or editing the symlink
;; arrow in WDired are noops, so redisplay them immediately on
;; returning to Dired.
(revert-buffer)))
(when files-deleted
(wdired-flag-for-deletion files-deleted))
(when (> errors 0)
(dired-log-summary (format "%d actions failed" errors) nil)))
(set-buffer-modified-p nil)
(setq buffer-undo-list nil))