annotate lisp/uniquify.el @ 63308:51d38cfbe542

Warn about using "cvs up -kb" if one intends to commit changes. Add a pointer to another site with detailed configure and build instructions. Suggest to look at config.log when configure fails. Add MinGW Make 3.80 to the list of successful combinations.
author Eli Zaretskii <eliz@gnu.org>
date Sat, 11 Jun 2005 11:31:29 +0000
parents c905fcf5e3d9
children c101699af337 f042e7c0fe20
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14295
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
1 ;;; uniquify.el --- unique buffer names dependent on file name
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2
59380
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
3 ;; Copyright (c) 1989, 1995, 1996, 1997, 2001, 2003, 2005
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
4 ;; Free Software Foundation, Inc.
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6 ;; Author: Dick King <king@reasoning.com>
36621
16e8795b3c64 Set maintainer to FSF.
Gerd Moellmann <gerd@gnu.org>
parents: 36141
diff changeset
7 ;; Maintainer: FSF
39117
abd085bfec0c Add Keywords header.
Gerd Moellmann <gerd@gnu.org>
parents: 38666
diff changeset
8 ;; Keywords: files
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
9 ;; Created: 15 May 86
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
10
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
11 ;; This file is part of GNU Emacs.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
12
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
15 ;; the Free Software Foundation; either version 2, or (at your option)
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
16 ;; any later version.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
17
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
22
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14056
diff changeset
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14056
diff changeset
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 14056
diff changeset
26 ;; Boston, MA 02111-1307, USA.
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
28 ;;; Commentary:
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
29
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
30 ;; Emacs's standard method for making buffer names unique adds <2>, <3>,
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
31 ;; etc. to the end of (all but one of) the buffers. This file replaces
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
32 ;; that behavior, for buffers visiting files and dired buffers, with a
14295
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
33 ;; uniquification that adds parts of the file name until the buffer names
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
34 ;; are unique. For instance, buffers visiting /u/mernst/tmp/Makefile and
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
35 ;; /usr/projects/zaphod/Makefile would be named Makefile|tmp and
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
36 ;; Makefile|zaphod, respectively (instead of Makefile and Makefile<2>).
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
37 ;; Other buffer name styles are also available.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
38
18375
b547822f0a11 (delay-uniquify-rationalize-file-buffer-names): Remove this hook here,
Richard M. Stallman <rms@gnu.org>
parents: 17414
diff changeset
39 ;; To use this file, do (require 'uniquify)
b547822f0a11 (delay-uniquify-rationalize-file-buffer-names): Remove this hook here,
Richard M. Stallman <rms@gnu.org>
parents: 17414
diff changeset
40 ;; and set uniquify-buffer-name-style to one of its non-nil alternative values.
b547822f0a11 (delay-uniquify-rationalize-file-buffer-names): Remove this hook here,
Richard M. Stallman <rms@gnu.org>
parents: 17414
diff changeset
41
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
42 ;; For other options, see "User-visible variables", below.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
43
13851
922f62608a55 (uniquify-fix-list-filename-lessp): Renamed from uniquify-filename-sort.
Richard M. Stallman <rms@gnu.org>
parents: 13814
diff changeset
44 ;; A version of uniquify.el that works under Emacs 18, Emacs 19, XEmacs,
922f62608a55 (uniquify-fix-list-filename-lessp): Renamed from uniquify-filename-sort.
Richard M. Stallman <rms@gnu.org>
parents: 13814
diff changeset
45 ;; and InfoDock is available from the maintainer.
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
46
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
47 ;;; Change Log:
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
48
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
49 ;; Originally by Dick King <king@reasoning.com> 15 May 86
39400
e69aa66ec7cc Update Stephen Gildea's mail address.
Eli Zaretskii <eliz@gnu.org>
parents: 39117
diff changeset
50 ;; Converted for Emacs 18 by Stephen Gildea <gildea@stop.mail-abuse.org>
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
51 ;; Make uniquify-min-dir-content 0 truly non-invasive. gildea 23 May 89
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
52 ;; Some cleanup. uniquify-min-dir-content default 0. gildea 01 Jun 89
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
53 ;; Don't rename to "". Michael Ernst <mernst@theory.lcs.mit.edu> 15 Jun 94
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
54 ;; Add kill-buffer-hook. Kenneth Manheimer <ken.manheimer@nist.gov> 09 May 95
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
55 ;; Add advice for rename-buffer and create-file-buffer, handle dired buffers,
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
56 ;; kill-buffer-rationalize-buffer-names-p, documentation. mernst 24 May 95
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
57 ;; Remove free variables, fix typos. mernst 5 Jun 95
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
58 ;; Efficiently support Emacs 19.27 & earlier. ken.manheimer, mernst 10 Jun 95
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
59 ;; Rename user options to "uniquify-...", add uniquify-reverse-dir-content-p,
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
60 ;; add uniquify-ask-about-buffer-names-p. king, mernst 13 Jun 95
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
61 ;; Prefix functions by "uniquify-..."; rename mnemonic-buffer-names to
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
62 ;; uniquify-buffer-name-style; add 'forward and 'post-forward-angle-brackets
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
63 ;; styles; remove uniquify-reverse-dir-content-p; add
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
64 ;; uniquify-trailing-separator-p. mernst 4 Aug 95
17145
d342009009c7 (uniquify-buffer-file-name): Don't call
Karl Heuer <kwzh@gnu.org>
parents: 14295
diff changeset
65 ;; Don't call expand-file-name on nil. mernst 7 Jan 96
d342009009c7 (uniquify-buffer-file-name): Don't call
Karl Heuer <kwzh@gnu.org>
parents: 14295
diff changeset
66 ;; Check whether list-buffers-directory is bound. mernst 11 Oct 96
d342009009c7 (uniquify-buffer-file-name): Don't call
Karl Heuer <kwzh@gnu.org>
parents: 14295
diff changeset
67 ;; Ignore non-file non-dired buffers. Colin Rafferty <craffert@ml.com> 3 Mar 97
19797
646589bc370b Rename uniquify-fix-list-* to uniquify-fix-item-*.
Richard M. Stallman <rms@gnu.org>
parents: 19755
diff changeset
68 ;; Use last component, not "", for file name of directories. mernst 27 Jun 97
646589bc370b Rename uniquify-fix-list-* to uniquify-fix-item-*.
Richard M. Stallman <rms@gnu.org>
parents: 19755
diff changeset
69 ;; Use directory-file-name; code cleanup. mernst 6 Sep 97
22140
26e470569368 (uniquify-ignore-buffers-re): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20065
diff changeset
70 ;; Add uniquify-ignore-buffers-re.
26e470569368 (uniquify-ignore-buffers-re): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20065
diff changeset
71 ;; Andre Srinivasan <andre@visigenic.com> 9 Sep 97
33700
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
72 ;; Add uniquify-list-buffers-directory-modes
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
73 ;; Stefan Monnier <monnier@cs.yale.edu> 17 Nov 2000
38665
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
74 ;; Algorithm and data structure changed to reduce consing with lots of buffers
38536
09aca87f88ce Overall speedup when using many buffers.
Francesco Potortì <pot@gnu.org>
parents: 38222
diff changeset
75 ;; Francesco Potort́ <pot@gnu.org> (ideas by rms and monnier) 2001-07-18
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
76
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
77 ;; Valuable feedback was provided by
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
78 ;; Paul Smith <psmith@baynetworks.com>,
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
79 ;; Alastair Burt <burt@dfki.uni-kl.de>,
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
80 ;; Bob Weiner <weiner@footloose.sps.mot.com>,
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
81 ;; Albert L. Ting <alt@vlibs.com>,
17145
d342009009c7 (uniquify-buffer-file-name): Don't call
Karl Heuer <kwzh@gnu.org>
parents: 14295
diff changeset
82 ;; gyro@reasoning.com,
d342009009c7 (uniquify-buffer-file-name): Don't call
Karl Heuer <kwzh@gnu.org>
parents: 14295
diff changeset
83 ;; Bryan O'Sullivan <bos@eng.sun.com>.
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
84
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
85
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
86 ;;; Code:
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
87
27686
888000b8e8b6 (toplevel): Require CL at compile time.
Gerd Moellmann <gerd@gnu.org>
parents: 26444
diff changeset
88 (eval-when-compile (require 'cl))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
89
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
90 ;;; User-visible variables
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
91
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
92 (defgroup uniquify nil
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
93 "Unique buffer names dependent on file name"
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
94 :group 'applications)
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
95
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
96
18375
b547822f0a11 (delay-uniquify-rationalize-file-buffer-names): Remove this hook here,
Richard M. Stallman <rms@gnu.org>
parents: 17414
diff changeset
97 (defcustom uniquify-buffer-name-style nil
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
98 "*If non-nil, buffer names are uniquified with parts of directory name.
14295
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
99 The value determines the buffer name style and is one of `forward',
36141
02c61ff8a12b (uniquify-buffer-name-style): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 33700
diff changeset
100 `reverse', `post-forward', or `post-forward-angle-brackets'.
14295
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
101 For example, files `/foo/bar/mumble/name' and `/baz/quux/mumble/name'
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
102 would have the following buffer names in the various styles:
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
103 forward bar/mumble/name quux/mumble/name
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
104 reverse name\\mumble\\bar name\\mumble\\quux
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
105 post-forward name|bar/mumble name|quux/mumble
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
106 post-forward-angle-brackets name<bar/mumble> name<quux/mumble>
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
107 nil name name<2>"
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
108 :type '(radio (const forward)
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
109 (const reverse)
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
110 (const post-forward)
19044
192305191a1f (uniquify-buffer-name-style): Fix typo.
Richard M. Stallman <rms@gnu.org>
parents: 18876
diff changeset
111 (const post-forward-angle-brackets)
18375
b547822f0a11 (delay-uniquify-rationalize-file-buffer-names): Remove this hook here,
Richard M. Stallman <rms@gnu.org>
parents: 17414
diff changeset
112 (const :tag "standard Emacs behavior (nil)" nil))
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
113 :require 'uniquify
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
114 :group 'uniquify)
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
115
50971
28d8b4a38ce1 (uniquify-after-kill-buffer-p): Set default to t.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50945
diff changeset
116 (defcustom uniquify-after-kill-buffer-p t
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
117 "If non-nil, rerationalize buffer names after a buffer has been killed."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
118 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
119 :group 'uniquify)
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
120
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
121 (defcustom uniquify-ask-about-buffer-names-p nil
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
122 "*If non-nil, permit user to choose names for buffers with same base file.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
123 If the user chooses to name a buffer, uniquification is preempted and no
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
124 other buffer names are changed."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
125 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
126 :group 'uniquify)
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
127
50785
2fb36b4b42f5 (uniquify-ignore-buffers-re): Change default to match some Gnus buffers.
Richard M. Stallman <rms@gnu.org>
parents: 48833
diff changeset
128 ;; The default value matches certain Gnus buffers.
50971
28d8b4a38ce1 (uniquify-after-kill-buffer-p): Set default to t.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50945
diff changeset
129 (defcustom uniquify-ignore-buffers-re nil
22808
435144eea4f4 (uniquify-ignore-buffers-re): Fix custom type.
Richard M. Stallman <rms@gnu.org>
parents: 22140
diff changeset
130 "*Regular expression matching buffer names that should not be uniquified.
22140
26e470569368 (uniquify-ignore-buffers-re): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20065
diff changeset
131 For instance, set this to \"^draft-[0-9]+$\" to avoid having uniquify rename
26e470569368 (uniquify-ignore-buffers-re): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20065
diff changeset
132 draft buffers even if `uniquify-after-kill-buffer-p' is non-nil and the
26e470569368 (uniquify-ignore-buffers-re): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20065
diff changeset
133 visited file name isn't the same as that of the buffer."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
134 :type '(choice (const :tag "Uniquify all buffers" nil) regexp)
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
135 :group 'uniquify)
22140
26e470569368 (uniquify-ignore-buffers-re): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 20065
diff changeset
136
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
137 (defcustom uniquify-min-dir-content 0
19840
f66b5085a537 Use uniquify-file-name-nondirectory throughout; documentation tweaks.
Richard M. Stallman <rms@gnu.org>
parents: 19797
diff changeset
138 "*Minimum number of directory name components included in buffer name."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
139 :type 'integer
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
140 :group 'uniquify)
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
141
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
142 (defcustom uniquify-separator nil
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
143 "*String separator for buffer name components.
14295
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
144 When `uniquify-buffer-name-style' is `post-forward', separates
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145 base file name from directory part in buffer names (default \"|\").
14295
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
146 When `uniquify-buffer-name-style' is `reverse', separates all
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
147 file name components (default \"\\\")."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
148 :type '(choice (const nil) string)
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
149 :group 'uniquify)
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
150
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
151 (defcustom uniquify-trailing-separator-p nil
14295
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
152 "*If non-nil, add a file name separator to dired buffer names.
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
153 If `uniquify-buffer-name-style' is `forward', add the separator at the end;
ca40593f8933 Several doc fixes.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
154 if it is `reverse', add the separator at the beginning; otherwise, this
17414
f967f12c8ec8 Add defgroup's; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17145
diff changeset
155 variable is ignored."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
156 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
157 :group 'uniquify)
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
158
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
159 (defcustom uniquify-strip-common-suffix
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
160 ;; Using it when uniquify-min-dir-content>0 doesn't make much sense.
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
161 (eq 0 uniquify-min-dir-content)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
162 "If non-nil, strip common directory suffixes of conflicting files.
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
163 E.g. if you open /a1/b/c/d and /a2/b/c/d, the buffer names will say
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
164 \"d|a1\" and \"d|a2\" instead of \"d|a1/b/c\" and \"d|a2/b/c\".
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
165 This can be handy when you have deep parallel hierarchies."
62531
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
166 :type 'boolean
c905fcf5e3d9 Specify missing group (and type, if simple) in defcustom.
Juanma Barranquero <lekktu@gmail.com>
parents: 59381
diff changeset
167 :group 'uniquify)
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
168
33700
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
169 (defvar uniquify-list-buffers-directory-modes '(dired-mode cvs-mode)
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
170 "List of modes for which uniquify should obey `list-buffers-directory'.
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
171 That means that when `buffer-file-name' is set to nil, `list-buffers-directory'
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
172 contains the name of the directory which the buffer is visiting.")
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
174 ;;; Utilities
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
175
19797
646589bc370b Rename uniquify-fix-list-* to uniquify-fix-item-*.
Richard M. Stallman <rms@gnu.org>
parents: 19755
diff changeset
176 ;; uniquify-fix-list data structure
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
177 (defstruct (uniquify-item
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
178 (:constructor nil) (:copier nil)
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
179 (:constructor uniquify-make-item
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
180 (base dirname buffer &optional proposed)))
50876
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
181 base dirname buffer proposed)
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
182
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
183 ;; Internal variables used free
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
184 (defvar uniquify-possibly-resolvable nil)
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185
50844
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
186 (defvar uniquify-managed nil
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
187 "Non-nil if the name of this buffer is managed by uniquify.
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
188 It actually holds the list of `uniquify-item's corresponding to the conflict.")
50844
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
189 (make-variable-buffer-local 'uniquify-managed)
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
190 (put 'uniquify-managed 'permanent-local t)
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
191
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192 ;;; Main entry point.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
194 (defun uniquify-rationalize-file-buffer-names (base dirname newbuf)
33700
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
195 "Make file buffer names unique by adding segments from file name.
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
196 If `uniquify-min-dir-content' > 0, always pulls that many
47644
de6f2422c09f (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46899
diff changeset
197 file name elements.
50942
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
198 Arguments BASE, DIRNAME, and NEWBUF specify the new buffer that causes
59380
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
199 this rationalization."
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
200 (interactive
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
201 (list (if uniquify-managed
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
202 (uniquify-item-base (car uniquify-managed)) (buffer-name))
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
203 (uniquify-buffer-file-name (current-buffer))
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
204 (current-buffer)))
59381
77618102ddc4 (uniquify-rationalize-file-buffer-names): Fix corner case when renaming
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59380
diff changeset
205 ;; Make sure we don't get confused by outdated uniquify-managed info in
77618102ddc4 (uniquify-rationalize-file-buffer-names): Fix corner case when renaming
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59380
diff changeset
206 ;; this buffer.
77618102ddc4 (uniquify-rationalize-file-buffer-names): Fix corner case when renaming
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59380
diff changeset
207 (with-current-buffer newbuf (setq uniquify-managed nil))
77618102ddc4 (uniquify-rationalize-file-buffer-names): Fix corner case when renaming
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59380
diff changeset
208 (when dirname
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
209 (setq dirname (expand-file-name (directory-file-name dirname)))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
210 (let ((fix-list (list (uniquify-make-item base dirname newbuf)))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
211 items)
50883
7b95d60a7574 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50877
diff changeset
212 (dolist (buffer (buffer-list))
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
213 (when (and (not (and uniquify-ignore-buffers-re
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
214 (string-match uniquify-ignore-buffers-re
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
215 (buffer-name buffer))))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
216 ;; Only try to rename buffers we actually manage.
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
217 (setq items (buffer-local-value 'uniquify-managed buffer))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
218 (equal base (uniquify-item-base (car items)))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
219 ;; Don't re-add stuff we already have. Actually this
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
220 ;; whole `and' test should only match at most once.
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
221 (not (memq (car items) fix-list)))
50942
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
222 (unless (cdr items)
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
223 ;; If there was no conflict, the buffer-name is equal to the
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
224 ;; base-name and we may have missed a rename-buffer because
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
225 ;; of code like in set-visited-file-name:
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
226 ;; (or (string= new-name (buffer-name)) (rename-buffer new-name t))
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
227 ;; So we need to refresh the dirname of the uniquify-item.
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
228 (setf (uniquify-item-dirname (car items))
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
229 (uniquify-buffer-file-name
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
230 (uniquify-item-buffer (car items))))
50971
28d8b4a38ce1 (uniquify-after-kill-buffer-p): Set default to t.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50945
diff changeset
231 ;; This shouldn't happen, but maybe there's no dirname any more.
50942
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
232 (unless (uniquify-item-dirname (car items))
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
233 (with-current-buffer (uniquify-item-buffer (car items))
50945
4151ece07b08 (uniquify-rationalize-file-buffer-names): Thinko.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50942
diff changeset
234 (setq uniquify-managed nil))
4151ece07b08 (uniquify-rationalize-file-buffer-names): Thinko.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50942
diff changeset
235 (setq items nil)))
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
236 (setq fix-list (append fix-list items))))
50883
7b95d60a7574 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50877
diff changeset
237 ;; selects buffers whose names may need changing, and others that
7b95d60a7574 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50877
diff changeset
238 ;; may conflict, then bring conflicting names together
7b95d60a7574 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50877
diff changeset
239 (uniquify-rationalize fix-list))))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
240
19797
646589bc370b Rename uniquify-fix-list-* to uniquify-fix-item-*.
Richard M. Stallman <rms@gnu.org>
parents: 19755
diff changeset
241 ;; uniquify's version of buffer-file-name; result never contains trailing slash
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
242 (defun uniquify-buffer-file-name (buffer)
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
243 "Return name of directory, file BUFFER is visiting, or nil if none.
33700
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
244 Works on ordinary file-visiting buffers and buffers whose mode is mentioned
32c5f03d36c9 (uniquify-list-buffers-directory-modes): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 27686
diff changeset
245 in `uniquify-list-buffers-directory-modes', otherwise returns nil."
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
246 (with-current-buffer buffer
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
247 (let ((filename
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
248 (or buffer-file-name
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
249 (if (memq major-mode uniquify-list-buffers-directory-modes)
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
250 list-buffers-directory))))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
251 (when filename
50942
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
252 (directory-file-name
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
253 (file-name-directory
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
254 (expand-file-name
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
255 (directory-file-name filename))))))))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
256
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
257 (defun uniquify-rerationalize-w/o-cb (fix-list)
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
258 "Re-rationalize the buffers in FIX-LIST, but ignoring current-buffer."
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
259 (let ((new-fix-list nil))
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
260 (dolist (item fix-list)
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
261 (let ((buf (uniquify-item-buffer item)))
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
262 (unless (or (eq buf (current-buffer)) (not (buffer-live-p buf)))
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
263 (push item new-fix-list))))
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
264 (when new-fix-list
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
265 (uniquify-rationalize new-fix-list))))
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
266
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
267 (defun uniquify-rationalize (fix-list)
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
268 ;; Set up uniquify to re-rationalize after killing/renaming
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
269 ;; if there is a conflict.
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
270 (dolist (item fix-list)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
271 (with-current-buffer (uniquify-item-buffer item)
50942
46d187316243 (uniquify-rationalize-file-buffer-names):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50914
diff changeset
272 ;; Refresh the dirnames and proposed names.
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
273 (setf (uniquify-item-proposed item)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
274 (uniquify-get-proposed-name (uniquify-item-base item)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
275 (uniquify-item-dirname item)))
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
276 (setq uniquify-managed fix-list)))
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
277 ;; Strip any shared last directory names of the dirname.
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
278 (when (and (cdr fix-list) uniquify-strip-common-suffix)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
279 (let ((strip t))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
280 (while (let* ((base (file-name-nondirectory
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
281 (uniquify-item-dirname (car fix-list))))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
282 (items fix-list))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
283 (when (> (length base) 0)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
284 (while (and strip items)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
285 (unless (equal base (file-name-nondirectory
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
286 (uniquify-item-dirname (pop items))))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
287 (setq strip nil)))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
288 strip))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
289 ;; It's all the same => strip.
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
290 (dolist (item (prog1 fix-list (setq fix-list nil)))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
291 ;; Create new items because the old ones are kept (with the true
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
292 ;; `dirname') for later rerationalizing.
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
293 (push (uniquify-make-item (uniquify-item-base item)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
294 (let ((f (file-name-directory
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
295 (uniquify-item-dirname item))))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
296 (and f (directory-file-name f)))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
297 (uniquify-item-buffer item)
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
298 (uniquify-item-proposed item))
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
299 fix-list)))))
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
300 ;; If uniquify-min-dir-content is 0, this will end up just
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
301 ;; passing fix-list to uniquify-rationalize-conflicting-sublist.
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
302 (uniquify-rationalize-a-list fix-list))
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
303
38651
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
304 (defun uniquify-item-greaterp (item1 item2)
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
305 (string-lessp (uniquify-item-proposed item2)
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
306 (uniquify-item-proposed item1)))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
307
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
308 (defun uniquify-rationalize-a-list (fix-list &optional depth)
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
309 (unless depth (setq depth uniquify-min-dir-content))
19840
f66b5085a537 Use uniquify-file-name-nondirectory throughout; documentation tweaks.
Richard M. Stallman <rms@gnu.org>
parents: 19797
diff changeset
310 (let (conflicting-sublist ; all elements have the same proposed name
38665
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
311 (old-proposed "")
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
312 proposed)
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
313 ;; Divide fix-list into items with same proposed names and pass them
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
314 ;; to uniquify-rationalize-conflicting-sublist.
38651
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
315 (dolist (item (sort fix-list 'uniquify-item-greaterp))
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
316 (setq proposed (uniquify-item-proposed item))
38665
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
317 (unless (equal proposed old-proposed)
38536
09aca87f88ce Overall speedup when using many buffers.
Francesco Potortì <pot@gnu.org>
parents: 38222
diff changeset
318 (uniquify-rationalize-conflicting-sublist conflicting-sublist
38665
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
319 old-proposed depth)
38536
09aca87f88ce Overall speedup when using many buffers.
Francesco Potortì <pot@gnu.org>
parents: 38222
diff changeset
320 (setq conflicting-sublist nil))
09aca87f88ce Overall speedup when using many buffers.
Francesco Potortì <pot@gnu.org>
parents: 38222
diff changeset
321 (push item conflicting-sublist)
38665
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
322 (setq old-proposed proposed))
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
323 (uniquify-rationalize-conflicting-sublist conflicting-sublist
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
324 old-proposed depth)))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
325
50876
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
326 (defun uniquify-get-proposed-name (base dirname &optional depth)
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
327 (unless depth (setq depth uniquify-min-dir-content))
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
328 (assert (equal (directory-file-name dirname) dirname)) ;No trailing slash.
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
329
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
330 ;; Distinguish directories by adding extra separator.
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
331 (if (and uniquify-trailing-separator-p
50876
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
332 (file-directory-p (expand-file-name base dirname))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
333 (not (string-equal base "")))
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
334 (cond ((eq uniquify-buffer-name-style 'forward)
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
335 (setq base (file-name-as-directory base)))
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
336 ;; (setq base (concat base "/")))
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
337 ((eq uniquify-buffer-name-style 'reverse)
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
338 (setq base (concat (or uniquify-separator "\\") base)))))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
339
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
340 (let ((extra-string nil)
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
341 (n depth))
50876
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
342 (while (and (> n 0) dirname)
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
343 (let ((file (file-name-nondirectory dirname)))
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
344 (when (setq dirname (file-name-directory dirname))
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
345 (setq dirname (directory-file-name dirname)))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
346 (setq n (1- n))
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
347 (push (if (zerop (length file)) ;nil or "".
50906
0dc88196f313 (uniquify-after-kill-buffer-p): Fix misleading docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50883
diff changeset
348 (prog1 "" (setq dirname nil)) ;Could be `dirname' iso "".
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
349 file)
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
350 extra-string)))
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
351 (when (zerop n)
50876
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
352 (if (and dirname extra-string
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
353 (equal dirname (file-name-directory dirname)))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
354 ;; We're just before the root. Let's add the leading / already.
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
355 ;; With "/a/b"+"/c/d/b" this leads to "/a/b" and "d/b" but with
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
356 ;; "/a/b"+"/c/a/b" this leads to "/a/b" and "a/b".
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
357 (push "" extra-string))
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
358 (setq uniquify-possibly-resolvable t))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
359
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
360 (cond
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
361 ((null extra-string) base)
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
362 ((string-equal base "") ;Happens for dired buffers on the root directory.
47863
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
363 (mapconcat 'identity extra-string "/"))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
364 ((eq uniquify-buffer-name-style 'reverse)
47863
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
365 (mapconcat 'identity
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
366 (cons base (nreverse extra-string))
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
367 (or uniquify-separator "\\")))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
368 ((eq uniquify-buffer-name-style 'forward)
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
369 (mapconcat 'identity (nconc extra-string (list base))
47863
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
370 "/"))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
371 ((eq uniquify-buffer-name-style 'post-forward)
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
372 (concat base (or uniquify-separator "|")
47863
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
373 (mapconcat 'identity extra-string "/")))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
374 ((eq uniquify-buffer-name-style 'post-forward-angle-brackets)
47863
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
375 (concat base "<" (mapconcat 'identity extra-string "/")
9925c06ca5fb (uniquify-get-proposed-name): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents: 47644
diff changeset
376 ">"))
39559
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
377 (t (error "Bad value for uniquify-buffer-name-style: %s"
5851ee3f83f5 (uniquify-get-proposed-name): Don't assume dirsep is /.
Gerd Moellmann <gerd@gnu.org>
parents: 39400
diff changeset
378 uniquify-buffer-name-style)))))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
379
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
380
19797
646589bc370b Rename uniquify-fix-list-* to uniquify-fix-item-*.
Richard M. Stallman <rms@gnu.org>
parents: 19755
diff changeset
381 ;; Deal with conflicting-sublist, all of whose elements have identical
646589bc370b Rename uniquify-fix-list-* to uniquify-fix-item-*.
Richard M. Stallman <rms@gnu.org>
parents: 19755
diff changeset
382 ;; "base" components.
38651
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
383 (defun uniquify-rationalize-conflicting-sublist (conf-list old-name depth)
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
384 (when conf-list
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
385 (if (or (cdr conf-list)
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
386 ;; Check that the proposed name doesn't conflict with some
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
387 ;; existing buffer.
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
388 (let ((buf (get-buffer old-name)))
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
389 (and buf (not (eq buf (uniquify-item-buffer (car conf-list)))))))
38651
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
390 (when uniquify-possibly-resolvable
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
391 (setq uniquify-possibly-resolvable nil
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
392 depth (1+ depth))
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
393 (dolist (item conf-list)
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
394 (setf (uniquify-item-proposed item)
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
395 (uniquify-get-proposed-name
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
396 (uniquify-item-base item)
50876
3311a93359a2 (uniquify-item, uniquify-get-proposed-name)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50844
diff changeset
397 (uniquify-item-dirname item)
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
398 depth)))
38651
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
399 (uniquify-rationalize-a-list conf-list depth))
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
400 (unless (string= old-name "")
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
401 (uniquify-rename-buffer (car conf-list) old-name)))))
683a60ba2533 These changes correct a corner case that the old code managed correctly.
Francesco Potortì <pot@gnu.org>
parents: 38641
diff changeset
402
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
403
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
404 (defun uniquify-rename-buffer (item newname)
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
405 (let ((buffer (uniquify-item-buffer item)))
38665
876a8018d21f Code cleanup, speed and consing improvements for uniquify.el.
Francesco Potortì <pot@gnu.org>
parents: 38651
diff changeset
406 (unless (equal newname (buffer-name buffer))
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
407 (with-current-buffer buffer
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
408 (let ((uniquify-buffer-name-style nil)) ;Avoid hooks on rename-buffer.
50844
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
409 ;; Pass the `unique' arg, so the advice doesn't mark it as unmanaged.
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
410 (rename-buffer newname t))))))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
411
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
412 ;;; Hooks from the rest of Emacs
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
413
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
414 ;; The logical place to put all this code is in generate-new-buffer-name.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
415 ;; It's written in C, so we would add a generate-new-buffer-name-function
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
416 ;; which, if non-nil, would be called instead of the C. One problem with
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
417 ;; that is that generate-new-buffer-name takes a potential buffer name as
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
418 ;; its argument -- not other information, such as what file the buffer will
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
419 ;; visit.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
420
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
421 ;; The below solution works because generate-new-buffer-name is called
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
422 ;; only by rename-buffer (which, as of 19.29, is never called from C) and
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
423 ;; generate-new-buffer, which is called only by Lisp functions
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
424 ;; create-file-buffer and rename-uniquely. Rename-uniquely generally
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
425 ;; isn't used for buffers visiting files, so it's sufficient to hook
46899
f00337f04e78 Use find-file-hook instead of find-file-hooks.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 46047
diff changeset
426 ;; rename-buffer and create-file-buffer. (Setting find-file-hook isn't
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
427 ;; sufficient.)
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
428
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
429 (defadvice rename-buffer (after rename-buffer-uniquify activate)
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
430 "Uniquify buffer names with parts of directory name."
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
431 (uniquify-maybe-rerationalize-w/o-cb)
50844
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
432 (if (null (ad-get-arg 1)) ; no UNIQUE argument.
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
433 ;; Mark this buffer so it won't be renamed by uniquify.
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
434 (setq uniquify-managed nil)
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
435 (when uniquify-buffer-name-style
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
436 ;; Rerationalize w.r.t the new name.
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
437 (uniquify-rationalize-file-buffer-names
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
438 (ad-get-arg 0)
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
439 (uniquify-buffer-file-name (current-buffer))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
440 (current-buffer))
50844
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
441 (setq ad-return-value (buffer-name (current-buffer))))))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
442
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
443 (defadvice create-file-buffer (after create-file-buffer-uniquify activate)
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
444 "Uniquify buffer names with parts of directory name."
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
445 (if uniquify-buffer-name-style
50914
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
446 (let ((filename (expand-file-name (directory-file-name (ad-get-arg 0)))))
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
447 (uniquify-rationalize-file-buffer-names
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
448 (file-name-nondirectory filename)
26edd9033fca Use the original buffer-name as `base' in place of the
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50906
diff changeset
449 (file-name-directory filename) ad-return-value))))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
450
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
451 ;; Buffer deletion
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
452 ;; Rerationalize after a buffer is killed, to reduce coinciding buffer names.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
453 ;; This mechanism uses `kill-buffer-hook', which runs *before* deletion.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
454 ;; That means that the kill-buffer-hook function cannot just delete the
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
455 ;; buffer -- it has to set something to do the rationalization *later*.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
456 ;; It actually puts another function on `post-command-hook'. This other
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
457 ;; function runs the rationalization and then removes itself from the hook.
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
458 ;; Is there a better way to accomplish this?
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
459 ;; (This ought to set some global variables so the work is done only for
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
460 ;; buffers with names similar to the deleted buffer. -MDE)
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
461
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
462 (defun uniquify-maybe-rerationalize-w/o-cb ()
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
463 "Re-rationalize buffer names, ignoring current buffer.
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
464 For use on `kill-buffer-hook'."
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
465 (if (and (cdr uniquify-managed)
50844
86903fed9f75 (uniquify-managed): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50826
diff changeset
466 uniquify-buffer-name-style
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
467 uniquify-after-kill-buffer-p)
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
468 (uniquify-rerationalize-w/o-cb uniquify-managed)))
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
469
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
470 ;; Ideally we'd like to add it buffer-locally, but that doesn't work
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
471 ;; because kill-buffer-hook is not permanent-local :-(
50877
c701779986a1 (uniquify-rationalize): New fun. Store the fix-list in uniquify-managed.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50876
diff changeset
472 (add-hook 'kill-buffer-hook 'uniquify-maybe-rerationalize-w/o-cb)
48833
df00563bf991 (uniquify-rationalize-file-buffer-names, rename-buffer)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47863
diff changeset
473
50814
28d06c5071e1 Move provide to end of file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 50785
diff changeset
474 (provide 'uniquify)
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 50971
diff changeset
475
59380
7764df4e45e1 (uniquify-rationalize-file-buffer-names): Re-add an interactive spec.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 59130
diff changeset
476 ;; arch-tag: e763faa3-56c9-4903-8eb8-26e1c45a0065
13814
f683f93b94e9 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
477 ;;; uniquify.el ends here