- "Return name of file BUFFER is visiting, or nil if none.
-Works on dired buffers and ordinary file-visiting buffers, but no others."
- (or (buffer-file-name buffer)
- (and (featurep 'dired)
- (save-excursion
- (set-buffer buffer)
- (and
- (eq major-mode 'dired-mode) ; do nothing if not a dired buffer
- (if (boundp 'list-buffers-directory) ; XEmacs mightn't define this
- (and list-buffers-directory
- (directory-file-name list-buffers-directory))
- ;; don't use default-directory if dired-directory is nil
- (and dired-directory
- (expand-file-name
- (directory-file-name
- (if (consp dired-directory)
- (car dired-directory)
- dired-directory))))))))))
-
-;; This examines the filename components in reverse order.
-(defun uniquify-filename-lessp (s1 s2)
- (let ((s1f (uniquify-file-name-nondirectory s1))
- (s2f (uniquify-file-name-nondirectory s2)))
- (and (not (equal s2f ""))
- (or (string-lessp s1f s2f)
- (and (equal s1f s2f)
- (let ((s1d (file-name-directory s1))
- (s2d (file-name-directory s2)))
- (and (not (<= (length s2d) 1))
- (or (<= (length s1d) 1)
- (uniquify-filename-lessp
- (substring s1d 0 -1)
- (substring s2d 0 -1))))))))))
-
-(defun uniquify-rationalize-a-list (fix-list depth)
+ "Return name of directory, file BUFFER is visiting, or nil if none.
+Works on ordinary file-visiting buffers and buffers whose mode is mentioned
+in `uniquify-list-buffers-directory-modes', otherwise returns nil."
+ (with-current-buffer buffer
+ (let ((filename
+ (or buffer-file-name
+ (if (memq major-mode uniquify-list-buffers-directory-modes)
+ list-buffers-directory))))
+ (when filename
+ (directory-file-name
+ (file-name-directory
+ (expand-file-name
+ (directory-file-name filename))))))))
+
+(defun uniquify-rerationalize-w/o-cb (fix-list)
+ "Re-rationalize the buffers in FIX-LIST, but ignoring current-buffer."
+ (let ((new-fix-list nil))
+ (dolist (item fix-list)
+ (let ((buf (uniquify-item-buffer item)))
+ (unless (or (eq buf (current-buffer)) (not (buffer-live-p buf)))
+ (push item new-fix-list))))
+ (when new-fix-list
+ (uniquify-rationalize new-fix-list))))
+
+(defun uniquify-rationalize (fix-list)
+ ;; Set up uniquify to re-rationalize after killing/renaming
+ ;; if there is a conflict.
+ (dolist (item fix-list)
+ (with-current-buffer (uniquify-item-buffer item)
+ ;; Refresh the dirnames and proposed names.
+ (setf (uniquify-item-proposed item)
+ (uniquify-get-proposed-name (uniquify-item-base item)
+ (uniquify-item-dirname item)))
+ (setq uniquify-managed fix-list)))
+ ;; Strip any shared last directory names of the dirname.
+ (when (and (cdr fix-list) uniquify-strip-common-suffix)
+ (let ((strip t))
+ (while (let* ((base (file-name-nondirectory
+ (uniquify-item-dirname (car fix-list))))
+ (items fix-list))
+ (when (> (length base) 0)
+ (while (and strip items)
+ (unless (equal base (file-name-nondirectory
+ (uniquify-item-dirname (pop items))))
+ (setq strip nil)))
+ strip))
+ ;; It's all the same => strip.
+ (dolist (item (prog1 fix-list (setq fix-list nil)))
+ ;; Create new items because the old ones are kept (with the true
+ ;; `dirname') for later rerationalizing.
+ (push (uniquify-make-item (uniquify-item-base item)
+ (let ((f (file-name-directory
+ (uniquify-item-dirname item))))
+ (and f (directory-file-name f)))
+ (uniquify-item-buffer item)
+ (uniquify-item-proposed item))
+ fix-list)))))
+ ;; If uniquify-min-dir-content is 0, this will end up just
+ ;; passing fix-list to uniquify-rationalize-conflicting-sublist.
+ (uniquify-rationalize-a-list fix-list))
+
+(defun uniquify-item-greaterp (item1 item2)
+ (string-lessp (uniquify-item-proposed item2)
+ (uniquify-item-proposed item1)))
+
+(defun uniquify-rationalize-a-list (fix-list &optional depth)
+ (unless depth (setq depth uniquify-min-dir-content))