diff lisp/utils/uniquify.el @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents ec9a17fef872
children 360340f9fd5f
line wrap: on
line diff
--- a/lisp/utils/uniquify.el	Mon Aug 13 09:00:04 2007 +0200
+++ b/lisp/utils/uniquify.el	Mon Aug 13 09:02:59 2007 +0200
@@ -1,11 +1,10 @@
 ;;; uniquify.el --- unique buffer names dependent on file name
 
-;; Copyright (c) 1989, 1995, 1996, 1997 Free Software Foundation, Inc.
+;; Copyright (c) 1989, 1995 Free Software Foundation, Inc.
 
 ;; Author: Dick King <king@reasoning.com>
 ;; Maintainer: Michael Ernst <mernst@theory.lcs.mit.edu>
 ;; Created: 15 May 86
-;; Time-stamp: <97/03/03 17:16:23 mernst>
 
 ;; This file is part of GNU Emacs.
 
@@ -20,8 +19,9 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
 
 ;;; Commentary:
 
@@ -34,17 +34,12 @@
 ;; Makefile|zaphod, respectively (instead of Makefile and Makefile<2>).
 ;; Other buffer name styles are also available.
 
-;; To use this file, just load it; or add (require 'uniquify) to your .emacs.
+;; To use this file, just load it.
 ;; To disable it after loading, set variable uniquify-buffer-name-style to nil.
 ;; For other options, see "User-visible variables", below.
 
-;; uniquify.el works under Emacs 18, Emacs 19, XEmacs, and InfoDock.
-
-;; Doesn't correctly handle buffer names created by M-x write-file in Emacs 18.
-;; Doesn't work under NT when backslash is used as a path separator (forward
-;;   slash path separator works fine).  To fix, check system-type against
-;;   'windows-nt, write a routine that breaks paths down into components.
-;;   (Surprisingly, there isn't one built in.)
+;; A version of uniquify.el that works under Emacs 18, Emacs 19, XEmacs,
+;; and InfoDock is available from the maintainer.
 
 ;;; Change Log:
 
@@ -64,17 +59,13 @@
 ;;  uniquify-buffer-name-style; add 'forward and 'post-forward-angle-brackets
 ;;  styles; remove uniquify-reverse-dir-content-p; add
 ;;  uniquify-trailing-separator-p.  mernst 4 Aug 95
-;; Don't call expand-file-name on nil.  mernst 7 Jan 96
-;; Check whether list-buffers-directory is bound.  mernst 11 Oct 96
-;; Ignore non-file non-dired buffers. Colin Rafferty <craffert@ml.com> 3 Mar 97
 
 ;; Valuable feedback was provided by
 ;; Paul Smith <psmith@baynetworks.com>,
 ;; Alastair Burt <burt@dfki.uni-kl.de>,
 ;; Bob Weiner <weiner@footloose.sps.mot.com>,
 ;; Albert L. Ting <alt@vlibs.com>,
-;; gyro@reasoning.com,
-;; Bryan O'Sullivan <bos@eng.sun.com>.
+;; gyro@reasoning.com.
 
 
 ;;; Code:
@@ -157,8 +148,8 @@
       (while buffers
 	(let* ((buffer (car buffers))
 	       (bfn (if (eq buffer newbuf)
-                        (and newbuffile
-                             (expand-file-name newbuffile))
+			(and newbuffile
+			     (expand-file-name newbuffile))
 		      (uniquify-buffer-file-name buffer)))
 	       (rawname (and bfn (file-name-nondirectory bfn)))
 	       (deserving (and rawname
@@ -181,23 +172,11 @@
 ;; uniquify's version of buffer-file-name
 (defun uniquify-buffer-file-name (buffer)
   "Return name of file BUFFER is visiting, or nil if none.
-Works on dired buffers as well as ordinary file-visiting buffers,
-but no others."
+Works on dired buffers as well as ordinary file-visiting buffers."
   (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
-		  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))))))))))
+      (save-excursion
+	(set-buffer buffer)
+	list-buffers-directory)))
 
 (defun uniquify-fix-list-filename-lessp (fixlist1 fixlist2)
   (uniquify-filename-lessp
@@ -337,149 +316,69 @@
 
 ;;; Hooks from the rest of Emacs
 
-(cond
- ((string-match "^19" emacs-version)
-  ;; Emacs 19 (Emacs or XEmacs)
-
-  ;; The logical place to put all this code is in generate-new-buffer-name.
-  ;; It's written in C, so we would add a generate-new-buffer-name-function
-  ;; which, if non-nil, would be called instead of the C.  One problem with
-  ;; that is that generate-new-buffer-name takes a potential buffer name as
-  ;; its argument -- not other information, such as what file the buffer will
-  ;; visit.
+;; Emacs 19 (Emacs or XEmacs)
 
-  ;; The below solution works because generate-new-buffer-name is called
-  ;; only by rename-buffer (which, as of 19.29, is never called from C) and
-  ;; generate-new-buffer, which is called only by Lisp functions
-  ;; create-file-buffer and rename-uniquely.  Rename-uniquely generally
-  ;; isn't used for buffers visiting files, so it's sufficient to hook
-  ;; rename-buffer and create-file-buffer.  (Setting find-file-hooks isn't
-  ;; sufficient.)
-
-  (defadvice rename-buffer (after rename-buffer-uniquify activate)
-    "Uniquify buffer names with parts of directory name."
-    (if (and uniquify-buffer-name-style
-	     ;; UNIQUE argument
-	     (ad-get-arg 1))
-	(progn
-	  (if uniquify-after-kill-buffer-p
-	      ;; call with no argument; rationalize vs. old name as well as new
-	      (uniquify-rationalize-file-buffer-names)
-	    ;; call with argument: rationalize vs. new name only
-	    (uniquify-rationalize-file-buffer-names
-	     (uniquify-buffer-file-name (current-buffer)) (current-buffer)))
-	  (setq ad-return-value (buffer-name (current-buffer))))))
+;; The logical place to put all this code is in generate-new-buffer-name.
+;; It's written in C, so we would add a generate-new-buffer-name-function
+;; which, if non-nil, would be called instead of the C.  One problem with
+;; that is that generate-new-buffer-name takes a potential buffer name as
+;; its argument -- not other information, such as what file the buffer will
+;; visit.
 
-  (defadvice create-file-buffer (after create-file-buffer-uniquify activate)
-    "Uniquify buffer names with parts of directory name."
-    (if uniquify-buffer-name-style
-	(uniquify-rationalize-file-buffer-names (ad-get-arg 0) ad-return-value)))
-
-  ;; Buffer deletion
-  ;; Rerationalize after a buffer is killed, to reduce coinciding buffer names.
-  ;; This mechanism uses `kill-buffer-hook', which runs *before* deletion.
-  ;; That means that the kill-buffer-hook function cannot just delete the
-  ;; buffer -- it has to set something to do the rationalization *later*.
-  ;; It actually puts another function on `post-command-hook'.  This other
-  ;; function runs the rationalization and then removes itself from the hook.
-  ;; Is there a better way to accomplish this?
-  ;; (This ought to set some global variables so the work is done only for
-  ;; buffers with names similar to the deleted buffer.  -MDE)
+;; The below solution works because generate-new-buffer-name is called
+;; only by rename-buffer (which, as of 19.29, is never called from C) and
+;; generate-new-buffer, which is called only by Lisp functions
+;; create-file-buffer and rename-uniquely.  Rename-uniquely generally
+;; isn't used for buffers visiting files, so it's sufficient to hook
+;; rename-buffer and create-file-buffer.  (Setting find-file-hooks isn't
+;; sufficient.)
 
-  (cond
-   ((or (not (string-lessp emacs-version "19.28"))
-	(and (string-match "XEmacs" emacs-version)
-	     (not (string-lessp emacs-version "19.12"))))
-    ;; Emacs 19.28 or later, or XEmacs (19.12 or later; is that necessary?)
-    (defun delay-uniquify-rationalize-file-buffer-names ()
-      "Add `delayed-uniquify-rationalize-file-buffer-names' to `post-command-hook'.
-For use on, eg, `kill-buffer-hook', to rationalize *after* buffer deletion."
-      (if (and uniquify-buffer-name-style
-	       uniquify-after-kill-buffer-p)
-	  (add-hook 'post-command-hook
-		    'delayed-uniquify-rationalize-file-buffer-names)))
-    (defun delayed-uniquify-rationalize-file-buffer-names ()
-      "Rerationalize buffer names and remove self from `post-command-hook'.
-See also `delay-rationalize-file-buffer-names' for hook setter."
-      (uniquify-rationalize-file-buffer-names)
-      (remove-hook 'post-command-hook
-		   'delayed-uniquify-rationalize-file-buffer-names))
+(defadvice rename-buffer (after rename-buffer-uniquify activate)
+  "Uniquify buffer names with parts of directory name."
+  (if (and uniquify-buffer-name-style
+	   ;; UNIQUE argument
+	   (ad-get-arg 1))
+      (progn
+	(if uniquify-after-kill-buffer-p
+	    ;; call with no argument; rationalize vs. old name as well as new
+	    (uniquify-rationalize-file-buffer-names)
+	  ;; call with argument: rationalize vs. new name only
+	  (uniquify-rationalize-file-buffer-names
+	   (uniquify-buffer-file-name (current-buffer)) (current-buffer)))
+	(setq ad-return-value (buffer-name (current-buffer))))))
 
-    (add-hook 'kill-buffer-hook 'delay-uniquify-rationalize-file-buffer-names))
-   (t
-    ;; GNU Emacs 19.01 through 19.27
-    ;; Before version 19.28, {pre,post}-command-hook was unable to set itself.
-
-    (defvar uniquify-post-command-p nil
-      "Set to trigger re-rationalization of buffer names by function on
-`post-command-hook'.  Used by kill-buffer-rationalization mechanism.")
-
-    (defun uniquify-post-command-rerationalization ()
-      "Set variable so buffer names may be rationalized by `post-command-hook'.
+(defadvice create-file-buffer (after create-file-buffer-uniquify activate)
+  "Uniquify buffer names with parts of directory name."
+  (if uniquify-buffer-name-style
+      (uniquify-rationalize-file-buffer-names (ad-get-arg 0) ad-return-value)))
 
-See variables `uniquify-post-command-p', `uniquify-buffer-name-style', and
-`uniquify-after-kill-buffer-p'."
-      (if (and uniquify-buffer-name-style
-	       uniquify-after-kill-buffer-p)
-	  (setq uniquify-post-command-p
-		;; Set the buffer name, so, once the delimiter character
-		;; is parameterized, we could selectively rationalize just
-		;; related buffer names.
-		(cons (buffer-name) uniquify-post-command-p))))
-    (defun uniquify-rationalize-after-buffer-kill ()
-      "Via `post-command-hook', rerationalize buffer names after kill-buffer.
-
-Checks `uniquify-post-command-p', which should be set by
-`uniquify-post-command-rerationalization' function on `kill-buffer-hook'."
-      (if uniquify-post-command-p
-	  (progn (if (and uniquify-buffer-name-style
-			  uniquify-after-kill-buffer-p)
-		     (uniquify-rationalize-file-buffer-names))
-		 (setq uniquify-post-command-p nil))))
-
-    (add-hook 'kill-buffer-hook 'uniquify-post-command-rerationalization)
-    (add-hook 'post-command-hook 'uniquify-rationalize-after-buffer-kill))
-  ))
- (t
-  ;; Emacs 18: redefine create-file-buffer and dired-find-buffer.
+;; Buffer deletion
+;; Rerationalize after a buffer is killed, to reduce coinciding buffer names.
+;; This mechanism uses `kill-buffer-hook', which runs *before* deletion.
+;; That means that the kill-buffer-hook function cannot just delete the
+;; buffer -- it has to set something to do the rationalization *later*.
+;; It actually puts another function on `post-command-hook'.  This other
+;; function runs the rationalization and then removes itself from the hook.
+;; Is there a better way to accomplish this?
+;; (This ought to set some global variables so the work is done only for
+;; buffers with names similar to the deleted buffer.  -MDE)
 
-  ;; Since advice.el can run in Emacs 18 as well as Emacs 19, we could use
-  ;; advice here, too, if it is available; but it's not worth it, since
-  ;; Emacs 18 is obsolescent anyway.
+(defun delay-uniquify-rationalize-file-buffer-names ()
+  "Add `delayed-uniquify-rationalize-file-buffer-names' to `post-command-hook'.
+For use on, eg, `kill-buffer-hook', to rationalize *after* buffer deletion."
+  (if (and uniquify-buffer-name-style
+	   uniquify-after-kill-buffer-p)
+      (add-hook 'post-command-hook
+		'delayed-uniquify-rationalize-file-buffer-names)))
 
-  (defun create-file-buffer (filename)	;from files.el
-    "Create a suitably named buffer for visiting FILENAME, and return it."
-    (let ((base (file-name-nondirectory filename)))
-      (if (string= base "")
-	  (setq base filename))
-      (if (and (get-buffer base)
-	       uniquify-ask-about-buffer-names-p)
-	  (get-buffer-create
-	   (let ((tem (read-string (format
-				    "Buffer name \"%s\" is in use; type a new name, or Return to clobber: "
-                                    base))))
-	     (if (equal tem "") base tem)))
-	(let ((buf (generate-new-buffer base)))
-	  (if uniquify-buffer-name-style
-	      (uniquify-rationalize-file-buffer-names filename buf))
-	  buf))))
+(defun delayed-uniquify-rationalize-file-buffer-names ()
+  "Rerationalize buffer names and remove self from `post-command-hook'.
+See also `delay-rationalize-file-buffer-names' for hook setter."
+  (uniquify-rationalize-file-buffer-names)
+  (remove-hook 'post-command-hook
+	       'delayed-uniquify-rationalize-file-buffer-names))
 
-  (defun dired-find-buffer (dirname)	;from dired.el
-    (let ((blist (buffer-list))
-	  found)
-      (while blist
-	(save-excursion
-	  (set-buffer (car blist))
-	  (if (and (eq major-mode 'dired-mode)
-		   (equal dired-directory dirname))
-	      (setq found (car blist)
-		    blist nil)
-	    (setq blist (cdr blist)))))
-      (or found
-	  (progn (if (string-match "/$" dirname)
-		     (setq dirname (substring dirname 0 -1)))
-		 (create-file-buffer (if uniquify-buffer-name-style
-					 dirname
-				       (file-name-nondirectory dirname)))))))))
+(add-hook 'kill-buffer-hook 'delay-uniquify-rationalize-file-buffer-names)
 
 ;;; uniquify.el ends here
+