Function: uniquify-rationalize-file-buffer-names
uniquify-rationalize-file-buffer-names is an interactive and
byte-compiled function defined in uniquify.el.gz.
Signature
(uniquify-rationalize-file-buffer-names BASE DIRNAME NEWBUF)
Documentation
Make file buffer names unique by adding segments from file name.
If uniquify-min-dir-content > 0, always pulls that many
file name elements.
Arguments BASE, DIRNAME, and NEWBUF specify the new buffer that causes
this rationalization.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/uniquify.el.gz
;;; Main entry point.
(defun uniquify-rationalize-file-buffer-names (base dirname newbuf)
"Make file buffer names unique by adding segments from file name.
If `uniquify-min-dir-content' > 0, always pulls that many
file name elements.
Arguments BASE, DIRNAME, and NEWBUF specify the new buffer that causes
this rationalization."
(interactive
(list (if uniquify-managed
(uniquify-item-base (car uniquify-managed)) (buffer-name))
(uniquify-buffer-file-name (current-buffer))
(current-buffer)))
;; Make sure we don't get confused by outdated uniquify-managed info in
;; this buffer.
(with-current-buffer newbuf (setq uniquify-managed nil))
(when dirname
(setq dirname (expand-file-name (directory-file-name dirname)))
(let ((fix-list (list (uniquify-make-item base dirname newbuf
nil dirname)))
items)
(dolist (buffer (buffer-list))
(when (and (not (and uniquify-ignore-buffers-re
(string-match uniquify-ignore-buffers-re
(buffer-name buffer))))
;; Only try to rename buffers we actually manage.
(setq items (buffer-local-value 'uniquify-managed buffer))
(equal base (uniquify-item-base (car items)))
;; Don't re-add stuff we already have. Actually this
;; whole `and' test should only match at most once.
(not (memq (car items) fix-list)))
(unless (cdr items)
;; If there was no conflict, the buffer-name is equal to the
;; base-name and we may have missed a rename-buffer because
;; of code like in set-visited-file-name:
;; (or (string= new-name (buffer-name)) (rename-buffer new-name t))
;; So we need to refresh the dirname of the uniquify-item.
(setf (uniquify-item-dirname (car items))
(uniquify-buffer-file-name
(uniquify-item-buffer (car items))))
;; This shouldn't happen, but maybe there's no dirname any more.
(unless (uniquify-item-dirname (car items))
(with-current-buffer (uniquify-item-buffer (car items))
(setq uniquify-managed nil))
(setq items nil)))
;; In case we missed some calls to kill-buffer, there may be dead
;; buffers in uniquify-managed, so filter them out.
(setq items
(delq nil (mapcar
(lambda (item)
(if (buffer-live-p (uniquify-item-buffer item))
item))
items)))
;; Other buffer's `uniquify-managed' lists may share
;; elements. Ensure that we don't add these elements more
;; than once to this buffer's `uniquify-managed' list.
(let ((new-items nil))
(dolist (item items)
(unless (memq item fix-list)
(push item new-items)))
(setq fix-list (append fix-list new-items)))))
;; selects buffers whose names may need changing, and others that
;; may conflict, then bring conflicting names together
(uniquify-rationalize fix-list))))