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 (funcall uniquify-dirname-transform
                           (expand-file-name (directory-file-name dirname))))
    (let ((fix-list (list (uniquify-make-item base dirname newbuf
                                              nil)))
	  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))))