Function: dired-rename-file

dired-rename-file is an autoloaded and byte-compiled function defined in dired-aux.el.gz.

Signature

(dired-rename-file FILE NEWNAME OK-IF-ALREADY-EXISTS)

Documentation

Rename FILE to NEWNAME.

Signal a file-already-exists error if a file NEWNAME already exists unless OK-IF-ALREADY-EXISTS is non-nil.

Probably introduced at or before Emacs version 27.1.

Source Code

;; Defined in /usr/src/emacs/lisp/dired-aux.el.gz
;;;###autoload
(defun dired-rename-file (file newname ok-if-already-exists)
  "Rename FILE to NEWNAME.
Signal a `file-already-exists' error if a file NEWNAME already exists
unless OK-IF-ALREADY-EXISTS is non-nil."
  (let ((file-is-dir-p (file-directory-p file)))
    (dired-handle-overwrite newname)
    (dired-maybe-create-dirs (file-name-directory newname))
    (if-let* (dired-vc-rename-file
              (file-backend (if file-is-dir-p
                                (ignore-errors
                                  (vc-responsible-backend file))
                              (vc-backend file)))
              (file-root (vc-root-dir file-backend
                                      (file-name-directory file))))
        (let* ((file-base (file-name-nondirectory file))
               (newname (if (string-empty-p
                             (file-name-nondirectory newname))
                            (concat newname file-base)
                          newname))
               (newname-backend (ignore-errors
                                  (vc-responsible-backend newname)))
               (newname-root
                (and newname-backend
                     (vc-root-dir newname-backend
                                  (file-name-directory newname)))))
          (if (equal file-root newname-root)
              (vc-rename-file file newname ok-if-already-exists)
            (let ((already-exists (file-exists-p newname)))
              (copy-file file newname ok-if-already-exists)
              (vc-delete-file file 'noconfirm)
              (when newname-backend
                (let ((newname (expand-file-name newname newname-root))
                      (default-directory newname-root))
                  (if already-exists
                      (vc-state-refresh newname newname-backend)
                    (vc-register `(,newname-backend (,newname)))))))))
      ;; error is caught in -create-files
      (rename-file file newname ok-if-already-exists))
    ;; Silently rename the visited file of any buffer visiting this file.
    (and (get-file-buffer file)
         (with-current-buffer (get-file-buffer file)
	   (set-visited-file-name newname nil t)))
    (dired-remove-file file)
    ;; See if it's an inserted subdir, and rename that, too.
    (when file-is-dir-p
      (dired-rename-subdir file newname))))