Mercurial > hg > xemacs-beta
diff lisp/utils/uniquify.el @ 189:489f57a838ef r20-3b21
Import from CVS: tag r20-3b21
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:57:07 +0200 |
parents | 8eaf7971accc |
children | 1f0dabaa0855 |
line wrap: on
line diff
--- a/lisp/utils/uniquify.el Mon Aug 13 09:56:30 2007 +0200 +++ b/lisp/utils/uniquify.el Mon Aug 13 09:57:07 2007 +0200 @@ -83,14 +83,12 @@ ;;; User-visible variables -(progn - (defgroup uniquify nil - "Unique buffer names dependent on file name" - :group 'applications) - ) +(defgroup uniquify nil + "Unique buffer names dependent on file name" + :group 'applications) -(defcustom uniquify-buffer-name-style 'post-forward +(defcustom uniquify-buffer-name-style nil "*If non-nil, buffer names are uniquified with parts of directory name. The value determines the buffer name style and is one of `forward', `reverse', `post-forward' (the default), or `post-forward-angle-brackets'. @@ -106,6 +104,7 @@ (const post-forward) (const podt-forward-angle-brackets) (const nil)) + :require 'uniquify :group 'uniquify) (defcustom uniquify-after-kill-buffer-p nil @@ -360,149 +359,68 @@ ;;; Hooks from the rest of Emacs -(cond - ((string-match "^\\(19\\|20\\)" 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. - - ;; 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. +;; 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 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