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.

View in manual

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