]> code.delx.au - gnu-emacs/commitdiff
Move provide to end of file.
authorStefan Monnier <monnier@iro.umontreal.ca>
Sun, 4 May 2003 21:30:25 +0000 (21:30 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Sun, 4 May 2003 21:30:25 +0000 (21:30 +0000)
(uniquify-ref-base, uniquify-ref-filename, uniquify-ref-buffer)
(uniquify-ref-proposed, uniquify-set-proposed): Remove.
(uniquify-item): New struct.  Update users of uniquify-ref-*.
(uniquify-get-proposed-name, uniquify-rationalize-a-list):
Make `depth' optional.
(uniquify-non-file-buffer-names): Remove.
(uniquify-rationalize-file-buffer-names): Don't set it up.
Use uniquify-make-item and don't pass the now-optional depth.
(uniquify-rationalize-conflicting-sublist): Check the new buffer
name directly instead of relying on uniquify-non-file-buffer-names.
(uniquify-rename-buffer): Use with-current-buffer and pass
the `unique' arg to rename-buffer.

lisp/uniquify.el

index 8842a491363bd39dce39c223d3c271720446b6d0..33dfe72ae7a7b382c1d1f4b0ec6a2876d5dd524e 100644 (file)
@@ -84,7 +84,6 @@
 
 ;;; Code:
 
-(provide 'uniquify)
 (eval-when-compile (require 'cl))
 
 ;;; User-visible variables
@@ -170,14 +169,12 @@ contains the name of the directory which the buffer is visiting.")
   (file-name-nondirectory (directory-file-name file-name)))
 
 ;; uniquify-fix-list data structure
-(defsubst uniquify-ref-base (x) (aref x 0))
-(defsubst uniquify-ref-filename (x) (aref x 1))
-(defsubst uniquify-ref-buffer (x) (aref x 2))
-(defsubst uniquify-ref-proposed (x) (aref x 3))
-(defsubst uniquify-set-proposed (x p) (aset x 3 p))
+(defstruct (uniquify-item
+           (:constructor nil) (:copier nil)
+           (:constructor uniquify-make-item (base filename buffer proposed)))
+  base filename buffer proposed)
 
 ;; Internal variables used free
-(defvar uniquify-non-file-buffer-names nil)
 (defvar uniquify-possibly-resolvable nil)
 
 ;;; Main entry point.
@@ -189,7 +186,6 @@ file name elements.
 Arguments NEWBUFFILE and NEWBUF cause only a subset of buffers to be renamed."
   (interactive)
   (let (fix-list
-       uniquify-non-file-buffer-names
        (newbuffile-nd (and newbuffile
                            (uniquify-file-name-nondirectory newbuffile))))
     (dolist (buffer (buffer-list))
@@ -206,13 +202,11 @@ Arguments NEWBUFFILE and NEWBUF cause only a subset of buffers to be renamed."
                 (setq rawname (uniquify-file-name-nondirectory bfn))
                 (or (not newbuffile)
                     (equal rawname newbuffile-nd))
-                (setq proposed (uniquify-get-proposed-name
-                                rawname bfn uniquify-min-dir-content)))
-           (push (vector rawname bfn buffer proposed) fix-list)
-         (push bufname uniquify-non-file-buffer-names))))
+                (setq proposed (uniquify-get-proposed-name rawname bfn)))
+           (push (uniquify-make-item rawname bfn buffer proposed) fix-list))))
     ;; selects buffers whose names may need changing, and others that
     ;; may conflict, then bring conflicting names together
-    (uniquify-rationalize-a-list fix-list uniquify-min-dir-content)))
+    (uniquify-rationalize-a-list fix-list)))
 
 ;; uniquify's version of buffer-file-name; result never contains trailing slash
 (defun uniquify-buffer-file-name (buffer)
@@ -235,15 +229,18 @@ in `uniquify-list-buffers-directory-modes', otherwise returns nil."
                    dired-directory)))))))))
 
 (defun uniquify-item-greaterp (item1 item2)
-  (string-lessp (uniquify-ref-proposed item2)
-               (uniquify-ref-proposed item1)))
+  (string-lessp (uniquify-item-proposed item2)
+               (uniquify-item-proposed item1)))
 
-(defun uniquify-rationalize-a-list (fix-list depth)
+(defun uniquify-rationalize-a-list (fix-list &optional depth)
+  (unless depth (setq depth uniquify-min-dir-content))
   (let (conflicting-sublist    ; all elements have the same proposed name
        (old-proposed "")
        proposed)
+    ;; Divide fix-list into items with same proposed names and pass them
+    ;; to uniquify-rationalize-conflicting-sublist.
     (dolist (item (sort fix-list 'uniquify-item-greaterp))
-      (setq proposed (uniquify-ref-proposed item))
+      (setq proposed (uniquify-item-proposed item))
       (unless (equal proposed old-proposed)
        (uniquify-rationalize-conflicting-sublist conflicting-sublist
                                                  old-proposed depth)
@@ -253,7 +250,8 @@ in `uniquify-list-buffers-directory-modes', otherwise returns nil."
     (uniquify-rationalize-conflicting-sublist conflicting-sublist
                                              old-proposed depth)))
 
-(defun uniquify-get-proposed-name (base filename depth)
+(defun uniquify-get-proposed-name (base filename &optional depth)
+  (unless depth (setq depth uniquify-min-dir-content))
   (assert (equal base (uniquify-file-name-nondirectory filename)))
   (assert (equal (directory-file-name filename) filename))
 
@@ -315,29 +313,31 @@ in `uniquify-list-buffers-directory-modes', otherwise returns nil."
 (defun uniquify-rationalize-conflicting-sublist (conf-list old-name depth)
   (when conf-list
     (if (or (cdr conf-list)
-           (member old-name uniquify-non-file-buffer-names))
+           ;; Check that the proposed name doesn't conflict with some
+           ;; existing buffer.
+           (let ((buf (get-buffer old-name)))
+             (and buf (not (eq buf (uniquify-item-buffer (car conf-list)))))))
        (when uniquify-possibly-resolvable
          (setq uniquify-possibly-resolvable nil
                depth (1+ depth))
          (dolist (item conf-list)
-           (uniquify-set-proposed item (uniquify-get-proposed-name
-                                        (uniquify-ref-base item)
-                                        (uniquify-ref-filename item)
-                                        depth)))
+           (setf (uniquify-item-proposed item)
+                 (uniquify-get-proposed-name
+                  (uniquify-item-base item)
+                  (uniquify-item-filename item)
+                  depth)))
          (uniquify-rationalize-a-list conf-list depth))
       (unless (string= old-name "")
        (uniquify-rename-buffer (car conf-list) old-name)))))
 
 
 (defun uniquify-rename-buffer (item newname)
-  (let ((buffer (uniquify-ref-buffer item)))
+  (let ((buffer (uniquify-item-buffer item)))
     (unless (equal newname (buffer-name buffer))
-      (let ((unset (current-buffer))
-           ;; avoid hooks on rename-buffer
-           (uniquify-buffer-name-style nil))
-       (set-buffer buffer)
-       (rename-buffer newname)
-       (set-buffer unset)))))
+      (with-current-buffer buffer
+       (let ((uniquify-buffer-name-style nil)) ;Avoid hooks on rename-buffer.
+         ;; Pass the `unique' arg, just in case.
+         (rename-buffer newname t))))))
 
 ;;; Hooks from the rest of Emacs
 
@@ -403,6 +403,9 @@ See also `delay-rationalize-file-buffer-names' for hook setter."
   (remove-hook 'post-command-hook
               'uniquify-delayed-rationalize-file-buffer-names))
 
+;; Ideally we'd like to add it buffer-locally, but that doesn't work
+;; because kill-buffer-hook is not permanent-local :-(
 (add-hook 'kill-buffer-hook 'uniquify-delay-rationalize-file-buffer-names)
 
+(provide 'uniquify)
 ;;; uniquify.el ends here