Mercurial > emacs
annotate lisp/msb.el @ 30515:6165183bc490
(remove, remq): New functions.
author | Gerd Moellmann <gerd@gnu.org> |
---|---|
date | Thu, 27 Jul 2000 20:08:47 +0000 |
parents | 7322c22e17b0 |
children | aa5afea93d8a |
rev | line source |
---|---|
10228 | 1 ;;; msb.el --- Customizable buffer-selection with multiple menus. |
14169 | 2 |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
3 ;; Copyright (C) 1993, 94, 95, 97, 98, 99 Free Software Foundation, Inc. |
14169 | 4 |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
5 ;; Author: Lars Lindberg <Lars.G.Lindberg@capgemini.se> |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
6 ;; Maintainer: FSF |
10228 | 7 ;; Created: 8 Oct 1993 |
20901 | 8 ;; Lindberg's last update version: 3.34 |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
9 ;; Keywords: mouse buffer menu |
14169 | 10 |
11 ;; This file is part of GNU Emacs. | |
12 | |
13 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
10228 | 14 ;; it under the terms of the GNU General Public License as published by |
14169 | 15 ;; the Free Software Foundation; either version 2, or (at your option) |
16 ;; any later version. | |
17 | |
18 ;; GNU Emacs is distributed in the hope that it will be useful, | |
10228 | 19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 ;; GNU General Public License for more details. | |
14169 | 22 |
10228 | 23 ;; You should have received a copy of the GNU General Public License |
14169 | 24 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
26 ;; Boston, MA 02111-1307, USA. | |
10228 | 27 |
28 ;;; Commentary: | |
14169 | 29 |
10228 | 30 ;; Purpose of this package: |
31 ;; 1. Offer a function for letting the user choose buffer, | |
32 ;; not necessarily for switching to it. | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
33 ;; 2. Make a better mouse-buffer-menu. This is done as a global |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
34 ;; minor mode, msb-mode. |
10228 | 35 ;; |
36 ;; Customization: | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
37 ;; Look at the variable `msb-menu-cond' for deciding what menus you |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
38 ;; want. It's not that hard to customize, despite my not-so-good |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
39 ;; doc-string. Feel free to send me a better doc-string. |
10228 | 40 ;; There are some constants for you to try here: |
41 ;; msb--few-menus | |
42 ;; msb--very-many-menus (default) | |
20901 | 43 ;; |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
44 ;; Look at the variable `msb-item-handling-function' for customization |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
45 ;; of the appearance of every menu item. Try for instance setting |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
46 ;; it to `msb-alon-item-handler'. |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
47 ;; |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
48 ;; Look at the variable `msb-item-sort-function' for customization |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
49 ;; of sorting the menus. Set it to t for instance, which means no |
10228 | 50 ;; sorting - you will get latest used buffer first. |
51 ;; | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
52 ;; Also check out the variable `msb-display-invisible-buffers-p'. |
10228 | 53 |
54 ;; Known bugs: | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
55 ;; - Files-by-directory |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
56 ;; + No possibility to show client/changed buffers separately. |
20901 | 57 ;; + All file buffers only appear in a file sub-menu, they will |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
58 ;; for instance not appear in the Mail sub-menu. |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
59 |
10228 | 60 ;; Future enhancements: |
61 | |
62 ;;; Thanks goes to | |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
63 ;; Mark Brader <msb@sq.com> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
64 ;; Jim Berry <m1jhb00@FRB.GOV> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
65 ;; Hans Chalupsky <hans@cs.Buffalo.EDU> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
66 ;; Larry Rosenberg <ljr@ictv.com> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
67 ;; Will Henney <will@astroscu.unam.mx> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
68 ;; Jari Aalto <jaalto@tre.tele.nokia.fi> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
69 ;; Michael Kifer <kifer@sbkifer.cs.sunysb.edu> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
70 ;; Gael Marziou <gael@gnlab030.grenoble.hp.com> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
71 ;; Dave Gillespie <daveg@thymus.synaptics.com> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
72 ;; Alon Albert <alon@milcse.rtsg.mot.com> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
73 ;; Kevin Broadey, <KevinB@bartley.demon.co.uk> |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
74 ;; Ake Stenhof <ake@cadpoint.se> |
25278 | 75 ;; Richard Stallman <rms@gnu.org> |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
76 ;; Steve Fisk <fisk@medved.bowdoin.edu> |
10228 | 77 |
25095 | 78 ;; This version turned into a global minor mode and subsequently |
79 ;; hacked on by Dave Love. | |
10228 | 80 ;;; Code: |
81 | |
25095 | 82 (eval-when-compile (require 'cl)) |
10228 | 83 |
84 ;;; | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
85 ;;; Some example constants to be used for `msb-menu-cond'. See that |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
86 ;;; variable for more information. Please note that if the condition |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
87 ;;; returns `multi', then the buffer can appear in several menus. |
10228 | 88 ;;; |
89 (defconst msb--few-menus | |
90 '(((and (boundp 'server-buffer-clients) | |
91 server-buffer-clients | |
92 'multi) | |
93 3030 | |
94 "Clients (%d)") | |
95 ((and msb-display-invisible-buffers-p | |
96 (msb-invisible-buffer-p) | |
97 'multi) | |
98 3090 | |
99 "Invisible buffers (%d)") | |
100 ((eq major-mode 'dired-mode) | |
101 2010 | |
102 "Dired (%d)" | |
103 msb-dired-item-handler | |
104 msb-sort-by-directory) | |
105 ((eq major-mode 'Man-mode) | |
106 4090 | |
107 "Manuals (%d)") | |
108 ((eq major-mode 'w3-mode) | |
109 4020 | |
110 "WWW (%d)") | |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
111 ((or (memq major-mode '(rmail-mode rmail-edit-mode vm-summary-mode vm-mode mail-mode)) |
10228 | 112 (memq major-mode '(mh-letter-mode |
113 mh-show-mode | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
114 mh-folder-mode)) |
10228 | 115 (memq major-mode '(gnus-summary-mode |
116 news-reply-mode | |
117 gnus-group-mode | |
118 gnus-article-mode | |
119 gnus-kill-file-mode | |
120 gnus-browse-killed-mode))) | |
121 4010 | |
122 "Mail (%d)") | |
123 ((not buffer-file-name) | |
124 4099 | |
125 "Buffers (%d)") | |
126 ('no-multi | |
127 1099 | |
128 "Files (%d)"))) | |
129 | |
130 (defconst msb--very-many-menus | |
131 '(((and (boundp 'server-buffer-clients) | |
132 server-buffer-clients | |
133 'multi) | |
134 1010 | |
135 "Clients (%d)") | |
136 ((and (boundp 'vc-mode) vc-mode 'multi) | |
137 1020 | |
138 "Version Control (%d)") | |
139 ((and buffer-file-name | |
140 (buffer-modified-p) | |
141 'multi) | |
142 1030 | |
143 "Changed files (%d)") | |
144 ((and (get-buffer-process (current-buffer)) | |
145 'multi) | |
146 1040 | |
147 "Processes (%d)") | |
148 ((and msb-display-invisible-buffers-p | |
149 (msb-invisible-buffer-p) | |
150 'multi) | |
151 1090 | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
152 "Invisible buffers (%d)") |
10228 | 153 ((eq major-mode 'dired-mode) |
154 2010 | |
155 "Dired (%d)" | |
156 ;; Note this different menu-handler | |
157 msb-dired-item-handler | |
158 ;; Also note this item-sorter | |
159 msb-sort-by-directory) | |
160 ((eq major-mode 'Man-mode) | |
20901 | 161 5030 |
10228 | 162 "Manuals (%d)") |
163 ((eq major-mode 'w3-mode) | |
20901 | 164 5020 |
10228 | 165 "WWW (%d)") |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
166 ((or (memq major-mode '(rmail-mode rmail-edit-mode vm-summary-mode vm-mode mail-mode)) |
10228 | 167 (memq major-mode '(mh-letter-mode |
168 mh-show-mode | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
169 mh-folder-mode)) |
10228 | 170 (memq major-mode '(gnus-summary-mode |
171 news-reply-mode | |
172 gnus-group-mode | |
173 gnus-article-mode | |
174 gnus-kill-file-mode | |
175 gnus-browse-killed-mode))) | |
20901 | 176 5010 |
10228 | 177 "Mail (%d)") |
178 ;; Catchup for all non-file buffers | |
179 ((and (not buffer-file-name) | |
180 'no-multi) | |
20901 | 181 5099 |
10228 | 182 "Other non-file buffers (%d)") |
183 ((and (string-match "/\\.[^/]*$" buffer-file-name) | |
184 'multi) | |
185 3090 | |
186 "Hidden Files (%d)") | |
187 ((memq major-mode '(c-mode c++-mode)) | |
188 3010 | |
189 "C/C++ Files (%d)") | |
190 ((eq major-mode 'emacs-lisp-mode) | |
191 3020 | |
192 "Elisp Files (%d)") | |
193 ((eq major-mode 'latex-mode) | |
194 3030 | |
195 "LaTex Files (%d)") | |
196 ('no-multi | |
197 3099 | |
198 "Other files (%d)"))) | |
199 | |
200 ;; msb--many-menus is obsolete | |
201 (defvar msb--many-menus msb--very-many-menus) | |
202 | |
203 ;;; | |
204 ;;; Customizable variables | |
205 ;;; | |
206 | |
20901 | 207 (defgroup msb nil |
208 "Customizable buffer-selection with multiple menus." | |
209 :prefix "msb-" | |
210 :group 'mouse) | |
10228 | 211 |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
212 ;;;###autoload |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
213 (defcustom msb-mode nil |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
214 "Toggle msb-mode. |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
215 Setting this variable directly does not take effect; |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
216 use either \\[customize] or the function `msb-mode'." |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
217 :set (lambda (symbol value) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
218 (msb-mode (or value 0))) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
219 :initialize 'custom-initialize-default |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
220 :version "20.4" |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
221 :type 'boolean |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
222 :group 'msb |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
223 :require 'msb) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
224 |
20901 | 225 (defun msb-custom-set (symbol value) |
226 "Set the value of custom variables for msb." | |
227 (set symbol value) | |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
228 (if (and (featurep 'msb) msb-mode) |
20901 | 229 ;; wait until package has been loaded before bothering to update |
230 ;; the buffer lists. | |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
231 (msb-menu-bar-update-buffers t))) |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
232 |
20901 | 233 (defcustom msb-menu-cond msb--very-many-menus |
13998
2f2d3995b57f
(msb-max-file-menu-items, msb-menu-cond): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
13372
diff
changeset
|
234 "*List of criteria for splitting the mouse buffer menu. |
10228 | 235 The elements in the list should be of this type: |
236 (CONDITION MENU-SORT-KEY MENU-TITLE ITEM-HANDLING-FN ITEM-SORT-FN). | |
237 | |
238 When making the split, the buffers are tested one by one against the | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
239 CONDITION, just like a Lisp cond: When hitting a true condition, the |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
240 other criteria are *not* tested and the buffer name will appear in the |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
241 menu with the menu-title corresponding to the true condition. |
10228 | 242 |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
243 If the condition returns the symbol `multi', then the buffer will be |
10228 | 244 added to this menu *and* tested for other menus too. If it returns |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
245 `no-multi', then the buffer will only be added if it hasn't been added |
10228 | 246 to any other menu. |
247 | |
248 During this test, the buffer in question is the current buffer, and | |
249 the test is surrounded by calls to `save-excursion' and | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
250 `save-match-data'. |
10228 | 251 |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
252 The categories are sorted by MENU-SORT-KEY. Smaller keys are on top. |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
253 nil means don't display this menu. |
10228 | 254 |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
255 MENU-TITLE is really a format. If you add %d in it, the %d is |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
256 replaced with the number of items in that menu. |
10228 | 257 |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
258 ITEM-HANDLING-FN, is optional. If it is supplied and is a function, |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
259 than it is used for displaying the items in that particular buffer |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
260 menu, otherwise the function pointed out by |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
261 `msb-item-handling-function' is used. |
10228 | 262 |
263 ITEM-SORT-FN, is also optional. | |
264 If it is not supplied, the function pointed out by | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
265 `msb-item-sort-function' is used. |
10228 | 266 If it is nil, then no sort takes place and the buffers are presented |
267 in least-recently-used order. | |
268 If it is t, then no sort takes place and the buffers are presented in | |
269 most-recently-used order. | |
270 If it is supplied and non-nil and not t than it is used for sorting | |
271 the items in that particular buffer menu. | |
272 | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
273 Note1: There should always be a `catch-all' as last element, in this |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
274 list. That is an element like (t TITLE ITEM-HANDLING-FUNCTION). |
10228 | 275 Note2: A buffer menu appears only if it has at least one buffer in it. |
276 Note3: If you have a CONDITION that can't be evaluated you will get an | |
20901 | 277 error every time you do \\[msb]." |
278 :type `(choice (const :tag "long" :value ,msb--very-many-menus) | |
28977
7322c22e17b0
(msb-menu-cond): Add choice `user'.
Gerd Moellmann <gerd@gnu.org>
parents:
28300
diff
changeset
|
279 (const :tag "short" :value ,msb--few-menus) |
7322c22e17b0
(msb-menu-cond): Add choice `user'.
Gerd Moellmann <gerd@gnu.org>
parents:
28300
diff
changeset
|
280 (sexp :tag "user")) |
20901 | 281 :set 'msb-custom-set |
282 :group 'msb) | |
283 | |
284 (defcustom msb-modes-key 4000 | |
285 "The sort key for files sorted by mode." | |
286 :type 'integer | |
287 :set 'msb-custom-set | |
21670
808ecc2eaa84
*** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents:
20901
diff
changeset
|
288 :group 'msb |
808ecc2eaa84
*** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents:
20901
diff
changeset
|
289 :version "20.3") |
20901 | 290 |
291 (defcustom msb-separator-diff 100 | |
292 "*Non-nil means use separators. | |
293 The separators will appear between all menus that have a sorting key | |
294 that differs by this value or more." | |
295 :type '(choice integer (const nil)) | |
296 :set 'msb-custom-set | |
297 :group 'msb) | |
298 | |
299 (defvar msb-files-by-directory-sort-key 0 | |
300 "*The sort key for files sorted by directory.") | |
301 | |
302 (defcustom msb-max-menu-items 15 | |
303 "*The maximum number of items in a menu. | |
304 If this variable is set to 15 for instance, then the submenu will be | |
305 split up in minor parts, 15 items each. Nil means no limit." | |
306 :type '(choice integer (const nil)) | |
307 :set 'msb-custom-set | |
308 :group 'msb) | |
309 | |
310 (defcustom msb-max-file-menu-items 10 | |
311 "*The maximum number of items from different directories. | |
312 | |
313 When the menu is of type `file by directory', this is the maximum | |
314 number of buffers that are clumped together from different | |
315 directories. | |
316 | |
317 Set this to 1 if you want one menu per directory instead of clumping | |
318 them together. | |
319 | |
320 If the value is not a number, then the value 10 is used." | |
321 :type 'integer | |
322 :set 'msb-custom-set | |
323 :group 'msb) | |
324 | |
325 (defcustom msb-most-recently-used-sort-key -1010 | |
326 "*Where should the menu with the most recently used buffers be placed?" | |
327 :type 'integer | |
328 :set 'msb-custom-set | |
329 :group 'msb) | |
330 | |
331 (defcustom msb-display-most-recently-used 15 | |
332 "*How many buffers should be in the most-recently-used menu. | |
333 No buffers at all if less than 1 or nil (or any non-number)." | |
334 :type 'integer | |
335 :set 'msb-custom-set | |
336 :group 'msb) | |
10228 | 337 |
20901 | 338 (defcustom msb-most-recently-used-title "Most recently used (%d)" |
339 "*The title for the most-recently-used menu." | |
340 :type 'string | |
341 :set 'msb-custom-set | |
342 :group 'msb) | |
343 | |
344 (defvar msb-horizontal-shift-function '(lambda () 0) | |
345 "*Function that specifies how many pixels to shift the top menu leftwards.") | |
346 | |
347 (defcustom msb-display-invisible-buffers-p nil | |
348 "*Show invisible buffers or not. | |
349 Non-nil means that the buffer menu should include buffers that have | |
350 names that starts with a space character." | |
351 :type 'boolean | |
352 :set 'msb-custom-set | |
353 :group 'msb) | |
354 | |
355 (defvar msb-item-handling-function 'msb-item-handler | |
356 "*The appearance of a buffer menu. | |
357 | |
358 The default function to call for handling the appearance of a menu | |
359 item. It should take to arguments, BUFFER and MAX-BUFFER-NAME-LENGTH, | |
360 where the latter is the max length of all buffer names. | |
361 | |
362 The function should return the string to use in the menu. | |
363 | |
364 When the function is called, BUFFER is the current buffer. This | |
365 function is called for items in the variable `msb-menu-cond' that have | |
366 nil as ITEM-HANDLING-FUNCTION. See `msb-menu-cond' for more | |
367 information.") | |
368 | |
369 (defcustom msb-item-sort-function 'msb-sort-by-name | |
370 "*The order of items in a buffer menu. | |
371 | |
372 The default function to call for handling the order of items in a menu | |
373 item. This function is called like a sort function. The items look | |
374 like (ITEM-NAME . BUFFER). | |
375 | |
376 ITEM-NAME is the name of the item that will appear in the menu. | |
377 BUFFER is the buffer, this is not necessarily the current buffer. | |
378 | |
379 Set this to nil or t if you don't want any sorting (faster)." | |
380 :type '(choice (const msb-sort-by-name) | |
381 (const :tag "Newest first" t) | |
382 (const :tag "Oldest first" nil)) | |
383 :set 'msb-custom-set | |
384 :group 'msb | |
385 ) | |
386 | |
387 (defcustom msb-files-by-directory nil | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
388 "*Non-nil means that files should be sorted by directory. |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
389 This is instead of the groups in `msb-menu-cond'." |
20901 | 390 :type 'boolean |
391 :set 'msb-custom-set | |
392 :group 'msb) | |
393 | |
394 (defcustom msb-after-load-hooks nil | |
395 "Hooks to be run after the msb package has been loaded." | |
396 :type 'hook | |
397 :set 'msb-custom-set | |
398 :group 'msb) | |
10228 | 399 |
400 ;;; | |
401 ;;; Internal variables | |
402 ;;; | |
403 | |
404 ;; The last calculated menu. | |
405 (defvar msb--last-buffer-menu nil) | |
406 | |
407 ;; If this is non-nil, then it is a string that describes the error. | |
408 (defvar msb--error nil) | |
409 | |
410 ;;; | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
411 ;;; Some example function to be used for `msb-item-handling-function'. |
10228 | 412 ;;; |
413 (defun msb-item-handler (buffer &optional maxbuf) | |
414 "Create one string item, concerning BUFFER, for the buffer menu. | |
415 The item looks like: | |
416 *% <buffer-name> | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
417 The `*' appears only if the buffer is marked as modified. |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
418 The `%' appears only if the buffer is read-only. |
10228 | 419 Optional second argument MAXBUF is completely ignored." |
420 (let ((name (buffer-name)) | |
421 (modified (if (buffer-modified-p) "*" " ")) | |
422 (read-only (if buffer-read-only "%" " "))) | |
423 (format "%s%s %s" modified read-only name))) | |
424 | |
425 | |
426 (eval-when-compile (require 'dired)) | |
427 | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
428 ;; `dired' can be called with a list of the form (directory file1 file2 ...) |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
429 ;; which causes `dired-directory' to be in the same form. |
10228 | 430 (defun msb--dired-directory () |
431 (cond ((stringp dired-directory) | |
432 (abbreviate-file-name (expand-file-name dired-directory))) | |
433 ((consp dired-directory) | |
434 (abbreviate-file-name (expand-file-name (car dired-directory)))) | |
435 (t | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
436 (error "Unknown type of `dired-directory' in buffer %s" |
10228 | 437 (buffer-name))))) |
438 | |
439 (defun msb-dired-item-handler (buffer &optional maxbuf) | |
440 "Create one string item, concerning a dired BUFFER, for the buffer menu. | |
441 The item looks like: | |
442 *% <buffer-name> | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
443 The `*' appears only if the buffer is marked as modified. |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
444 The `%' appears only if the buffer is read-only. |
10228 | 445 Optional second argument MAXBUF is completely ignored." |
446 (let ((name (msb--dired-directory)) | |
447 (modified (if (buffer-modified-p) "*" " ")) | |
448 (read-only (if buffer-read-only "%" " "))) | |
449 (format "%s%s %s" modified read-only name))) | |
450 | |
451 (defun msb-alon-item-handler (buffer maxbuf) | |
452 "Create one string item for the buffer menu. | |
453 The item looks like: | |
454 <buffer-name> *%# <file-name> | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
455 The `*' appears only if the buffer is marked as modified. |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
456 The `%' appears only if the buffer is read-only. |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
457 The `#' appears only version control file (SCCS/RCS)." |
10228 | 458 (format (format "%%%ds %%s%%s%%s %%s" maxbuf) |
459 (buffer-name buffer) | |
460 (if (buffer-modified-p) "*" " ") | |
461 (if buffer-read-only "%" " ") | |
462 (if (and (boundp 'vc-mode) vc-mode) "#" " ") | |
463 (or buffer-file-name ""))) | |
464 | |
465 ;;; | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
466 ;;; Some example function to be used for `msb-item-sort-function'. |
10228 | 467 ;;; |
468 (defun msb-sort-by-name (item1 item2) | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
469 "Sort the items ITEM1 and ITEM2 by their `buffer-name'. |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
470 An item looks like (NAME . BUFFER)." |
10228 | 471 (string-lessp (buffer-name (cdr item1)) |
472 (buffer-name (cdr item2)))) | |
473 | |
474 | |
475 (defun msb-sort-by-directory (item1 item2) | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
476 "Sort the items ITEM1 and ITEM2 by directory name. Made for dired. |
10228 | 477 An item look like (NAME . BUFFER)." |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
478 (string-lessp (save-excursion (set-buffer (cdr item1)) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
479 (msb--dired-directory)) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
480 (save-excursion (set-buffer (cdr item2)) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
481 (msb--dired-directory)))) |
10228 | 482 |
483 ;;; | |
484 ;;; msb | |
485 ;;; | |
486 ;;; This function can be used instead of (mouse-buffer-menu EVENT) | |
487 ;;; function in "mouse.el". | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
488 ;;; |
10228 | 489 (defun msb (event) |
490 "Pop up several menus of buffers for selection with the mouse. | |
491 This command switches buffers in the window that you clicked on, and | |
492 selects that window. | |
493 | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
494 See the function `mouse-select-buffer' and the variable |
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
495 `msb-menu-cond' for more information about how the menus are split." |
10228 | 496 (interactive "e") |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
497 (let ((old-window (selected-window)) |
10228 | 498 (window (posn-window (event-start event)))) |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
499 (unless (framep window) (select-window window)) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
500 (let ((buffer (mouse-select-buffer event))) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
501 (if buffer |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
502 (switch-to-buffer buffer) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
503 (select-window old-window)))) |
10228 | 504 nil) |
505 | |
506 ;;; | |
507 ;;; Some supportive functions | |
508 ;;; | |
509 (defun msb-invisible-buffer-p (&optional buffer) | |
510 "Return t if optional BUFFER is an \"invisible\" buffer. | |
511 If the argument is left out or nil, then the current buffer is considered." | |
512 (and (> (length (buffer-name buffer)) 0) | |
513 (eq ?\ (aref (buffer-name buffer) 0)))) | |
514 | |
20505 | 515 (defun msb--strip-dir (dir) |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
516 "Strip one hierarchy level from the end of DIR." |
20758
f5a113b108ff
(msb--strip-dir): Use Emacs filename primitives, not regexps.
Richard M. Stallman <rms@gnu.org>
parents:
20506
diff
changeset
|
517 (file-name-directory (directory-file-name dir))) |
10228 | 518 |
519 ;; Create an alist with all buffers from LIST that lies under the same | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
520 ;; directory will be in the same item as the directory string. |
20506
c096aa581013
Fix mailer-introduced garbling.
Richard M. Stallman <rms@gnu.org>
parents:
20505
diff
changeset
|
521 ;; ((PATH1 . (BUFFER-1 BUFFER-2 ...)) (PATH2 . (BUFFER-K BUFFER-K+1...)) ...) |
10228 | 522 (defun msb--init-file-alist (list) |
523 (let ((buffer-alist | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
524 ;; Make alist that looks like |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
525 ;; ((PATH-1 BUFFER-1) (PATH-2 BUFFER-2) ...) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
526 ;; sorted on PATH-x |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
527 (sort (mapcar |
20901 | 528 (lambda (buffer) |
529 (let ((file-name (expand-file-name (buffer-file-name buffer)))) | |
530 (when file-name | |
531 (list (cons (msb--strip-dir file-name) buffer))))) | |
10228 | 532 list) |
20901 | 533 (lambda (item1 item2) |
534 (string< (car item1) (car item2)))))) | |
20884
91f9c828fc1a
(msb--choose-file-menu): Save some debugging info.
Richard M. Stallman <rms@gnu.org>
parents:
20758
diff
changeset
|
535 ;; Now clump buffers together that have the same path |
10228 | 536 ;; Make alist that looks like |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
537 ;; ((PATH1 . (BUFFER-1 BUFFER-2 ...)) (PATH2 . (BUFFER-K)) ...) |
10228 | 538 (let ((path nil) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
539 (buffers nil)) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
540 (nconc |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
541 (mapcar (lambda (item) |
20901 | 542 (cond |
543 ((and path | |
544 (string= path (car item))) | |
545 ;; The same path as earlier: Add to current list of | |
546 ;; buffers. | |
547 (push (cdr item) buffers) | |
548 ;; This item should not be added to list | |
549 nil) | |
550 (t | |
551 ;; New path | |
552 (let ((result (and path (cons path buffers)))) | |
553 (setq path (car item)) | |
554 (setq buffers (list (cdr item))) | |
555 ;; Add the last result the list. | |
556 (and result (list result)))))) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
557 buffer-alist) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
558 ;; Add the last result to the list |
10228 | 559 (list (cons path buffers)))))) |
560 | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
561 (defun msb--format-title (top-found-p path number-of-items) |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
562 "Format a suitable title for the menu item." |
25095 | 563 (format (if top-found-p "%s... (%d)" "%s (%d)") |
564 (abbreviate-file-name path) number-of-items)) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
565 |
20884
91f9c828fc1a
(msb--choose-file-menu): Save some debugging info.
Richard M. Stallman <rms@gnu.org>
parents:
20758
diff
changeset
|
566 ;; Variables for debugging. |
91f9c828fc1a
(msb--choose-file-menu): Save some debugging info.
Richard M. Stallman <rms@gnu.org>
parents:
20758
diff
changeset
|
567 (defvar msb--choose-file-menu-list) |
91f9c828fc1a
(msb--choose-file-menu): Save some debugging info.
Richard M. Stallman <rms@gnu.org>
parents:
20758
diff
changeset
|
568 (defvar msb--choose-file-menu-arg-list) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
569 |
10228 | 570 (defun msb--choose-file-menu (list) |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
571 "Choose file-menu with respect to directory for every buffer in LIST." |
20884
91f9c828fc1a
(msb--choose-file-menu): Save some debugging info.
Richard M. Stallman <rms@gnu.org>
parents:
20758
diff
changeset
|
572 (setq msb--choose-file-menu-arg-list list) |
10228 | 573 (let ((buffer-alist (msb--init-file-alist list)) |
574 (final-list nil) | |
575 (max-clumped-together (if (numberp msb-max-file-menu-items) | |
576 msb-max-file-menu-items | |
577 10)) | |
578 (top-found-p nil) | |
579 (last-path nil) | |
20901 | 580 first rest path buffers old-path) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
581 ;; Prepare for looping over all items in buffer-alist |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
582 (setq first (car buffer-alist) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
583 rest (cdr buffer-alist) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
584 path (car first) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
585 buffers (cdr first)) |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
586 (setq msb--choose-file-menu-list (apply #'list rest)) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
587 ;; This big loop tries to clump buffers together that have a |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
588 ;; similar name. Remember that buffer-alist is sorted based on the |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
589 ;; path for the buffers. |
10228 | 590 (while rest |
591 (let ((found-p nil) | |
592 (tmp-rest rest) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
593 result |
10228 | 594 new-path item) |
595 (setq item (car tmp-rest)) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
596 ;; Clump together the "rest"-buffers that have a path that is |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
597 ;; a subpath of the current one. |
10228 | 598 (while (and tmp-rest |
599 (<= (length buffers) max-clumped-together) | |
600 (>= (length (car item)) (length path)) | |
25281
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
601 ;; `completion-ignore-case' seems to default to t |
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
602 ;; on the systems with case-insensitive file names. |
25123
abf35a5606f6
(msb--choose-file-menu): Fix previous change.
Dave Love <fx@gnu.org>
parents:
25095
diff
changeset
|
603 (eq t (compare-strings path 0 nil |
25281
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
604 (car item) 0 (length path) |
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
605 completion-ignore-case))) |
10228 | 606 (setq found-p t) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
607 (setq buffers (append buffers (cdr item))) ;nconc is faster than append |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
608 (setq tmp-rest (cdr tmp-rest) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
609 item (car tmp-rest))) |
10228 | 610 (cond |
611 ((> (length buffers) max-clumped-together) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
612 ;; Oh, we failed. Too many buffers clumped together. |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
613 ;; Just use the original ones for the result. |
10228 | 614 (setq last-path (car first)) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
615 (push (cons (msb--format-title top-found-p |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
616 (car first) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
617 (length (cdr first))) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
618 (cdr first)) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
619 final-list) |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
620 (setq top-found-p nil) |
10228 | 621 (setq first (car rest) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
622 rest (cdr rest) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
623 path (car first) |
10228 | 624 buffers (cdr first))) |
625 (t | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
626 ;; The first pass of clumping together worked out, go ahead |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
627 ;; with this result. |
10228 | 628 (when found-p |
629 (setq top-found-p t) | |
630 (setq first (cons path buffers) | |
631 rest tmp-rest)) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
632 ;; Now see if we can clump more buffers together if we go up |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
633 ;; one step in the file hierarchy. |
20901 | 634 ;; If path isn't changed by msb--strip-dir, we are looking |
635 ;; at the machine name component of an ange-ftp filename. | |
636 (setq old-path path) | |
20505 | 637 (setq path (msb--strip-dir path) |
10228 | 638 buffers (cdr first)) |
20901 | 639 (if (equal old-path path) |
640 (setq last-path path)) | |
10228 | 641 (when (and last-path |
642 (or (and (>= (length path) (length last-path)) | |
25281
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
643 (eq t (compare-strings |
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
644 last-path 0 nil path 0 |
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
645 (length last-path) |
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
646 completion-ignore-case))) |
10228 | 647 (and (< (length path) (length last-path)) |
25281
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
648 (eq t (compare-strings |
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
649 path 0 nil last-path 0 (length path) |
26430a2408d5
(msb--choose-file-menu): Use `completion-ignore-case' in name
Dave Love <fx@gnu.org>
parents:
25278
diff
changeset
|
650 completion-ignore-case))))) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
651 ;; We have reached the same place in the file hierarchy as |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
652 ;; the last result, so we should quit at this point and |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
653 ;; take what we have as result. |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
654 (push (cons (msb--format-title top-found-p |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
655 (car first) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
656 (length (cdr first))) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
657 (cdr first)) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
658 final-list) |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
659 (setq top-found-p nil) |
10228 | 660 (setq first (car rest) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
661 rest (cdr rest) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
662 path (car first) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
663 buffers (cdr first))))))) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
664 ;; Now take care of the last item. |
20901 | 665 (when first |
666 (push (cons (msb--format-title top-found-p | |
667 (car first) | |
668 (length (cdr first))) | |
669 (cdr first)) | |
670 final-list)) | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
671 (setq top-found-p nil) |
10228 | 672 (nreverse final-list))) |
673 | |
674 (defun msb--create-function-info (menu-cond-elt) | |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
675 "Create a vector from an element MENU-COND-ELT of `msb-menu-cond'. |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
676 This takes the form: |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
677 \]BUFFER-LIST-VARIABLE CONDITION MENU-SORT-KEY MENU-TITLE ITEM-HANDLER SORTER) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
678 See `msb-menu-cond' for a description of its elements." |
10228 | 679 (let* ((list-symbol (make-symbol "-msb-buffer-list")) |
680 (tmp-ih (and (> (length menu-cond-elt) 3) | |
681 (nth 3 menu-cond-elt))) | |
682 (item-handler (if (and tmp-ih (fboundp tmp-ih)) | |
683 tmp-ih | |
684 msb-item-handling-function)) | |
685 (tmp-s (if (> (length menu-cond-elt) 4) | |
686 (nth 4 menu-cond-elt) | |
687 msb-item-sort-function)) | |
688 (sorter (if (or (fboundp tmp-s) | |
689 (null tmp-s) | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
690 (eq tmp-s t)) |
10228 | 691 tmp-s |
692 msb-item-sort-function))) | |
693 (when (< (length menu-cond-elt) 3) | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
694 (error "Wrong format of msb-menu-cond")) |
10228 | 695 (when (and (> (length menu-cond-elt) 3) |
696 (not (fboundp tmp-ih))) | |
697 (signal 'invalid-function (list tmp-ih))) | |
698 (when (and (> (length menu-cond-elt) 4) | |
699 tmp-s | |
700 (not (fboundp tmp-s)) | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
701 (not (eq tmp-s t))) |
10228 | 702 (signal 'invalid-function (list tmp-s))) |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
703 (set list-symbol ()) |
10228 | 704 (vector list-symbol ;BUFFER-LIST-VARIABLE |
705 (nth 0 menu-cond-elt) ;CONDITION | |
706 (nth 1 menu-cond-elt) ;SORT-KEY | |
707 (nth 2 menu-cond-elt) ;MENU-TITLE | |
708 item-handler ;ITEM-HANDLER | |
709 sorter) ;SORTER | |
710 )) | |
711 | |
712 ;; This defsubst is only used in `msb--choose-menu' below. It was | |
20901 | 713 ;; pulled out merely to make the code somewhat clearer. The indentation |
10228 | 714 ;; level was too big. |
715 (defsubst msb--collect (function-info-vector) | |
716 (let ((result nil) | |
717 (multi-flag nil) | |
718 function-info-list) | |
719 (setq function-info-list | |
720 (loop for fi | |
721 across function-info-vector | |
722 if (and (setq result | |
723 (eval (aref fi 1))) ;Test CONDITION | |
724 (not (and (eq result 'no-multi) | |
725 multi-flag)) | |
726 (progn (when (eq result 'multi) | |
727 (setq multi-flag t)) | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
728 t)) |
10228 | 729 collect fi |
730 until (and result | |
731 (not (eq result 'multi))))) | |
732 (when (and (not function-info-list) | |
733 (not result)) | |
734 (error "No catch-all in msb-menu-cond!")) | |
735 function-info-list)) | |
736 | |
737 (defun msb--add-to-menu (buffer function-info max-buffer-name-length) | |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
738 "Add BUFFER to the menu depicted by FUNCTION-INFO. |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
739 All side-effects. Adds an element of form (BUFFER-TITLE . BUFFER) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
740 to the buffer-list variable in function-info." |
10228 | 741 (let ((list-symbol (aref function-info 0))) ;BUFFER-LIST-VARIABLE |
742 ;; Here comes the hairy side-effect! | |
743 (set list-symbol | |
744 (cons (cons (funcall (aref function-info 4) ;ITEM-HANDLER | |
745 buffer | |
746 max-buffer-name-length) | |
747 buffer) | |
748 (eval list-symbol))))) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
749 |
10228 | 750 (defsubst msb--choose-menu (buffer function-info-vector max-buffer-name-length) |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
751 "Select the appropriate menu for BUFFER." |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
752 ;; This is all side-effects, folks! |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
753 ;; This should be optimized. |
10228 | 754 (unless (and (not msb-display-invisible-buffers-p) |
755 (msb-invisible-buffer-p buffer)) | |
756 (condition-case nil | |
757 (save-excursion | |
758 (set-buffer buffer) | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
759 ;; Menu found. Add to this menu |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
760 (dolist (info (msb--collect function-info-vector)) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
761 (msb--add-to-menu buffer info max-buffer-name-length))) |
10228 | 762 (error (unless msb--error |
763 (setq msb--error | |
764 (format | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
765 "In msb-menu-cond, error for buffer `%s'." |
10228 | 766 (buffer-name buffer))) |
14427
ac3101efc47e
(msb--choose-menu): Fix error format string.
Karl Heuer <kwzh@gnu.org>
parents:
14292
diff
changeset
|
767 (error "%s" msb--error)))))) |
10228 | 768 |
769 (defun msb--create-sort-item (function-info) | |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
770 "Return (SORT-KEY TITLE . BUFFER-LIST) or nil if the buffer-list is empty." |
10228 | 771 (let ((buffer-list (eval (aref function-info 0)))) |
772 (when buffer-list | |
773 (let ((sorter (aref function-info 5)) ;SORTER | |
774 (sort-key (aref function-info 2))) ;MENU-SORT-KEY | |
775 (when sort-key | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
776 (cons sort-key |
10228 | 777 (cons (format (aref function-info 3) ;MENU-TITLE |
778 (length buffer-list)) | |
779 (cond | |
780 ((null sorter) | |
781 buffer-list) | |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
782 ((eq sorter t) |
10228 | 783 (nreverse buffer-list)) |
784 (t | |
785 (sort buffer-list sorter)))))))))) | |
786 | |
20901 | 787 (defun msb--aggregate-alist (alist same-predicate sort-predicate) |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
788 "Return ALIST as a sorted, aggregated alist. |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
789 |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
790 In the result all items with the same car element (according to |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
791 SAME-PREDICATE) are aggregated together. The alist is first sorted by |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
792 SORT-PREDICATE. |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
793 |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
794 Example: |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
795 \(msb--aggregate-alist |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
796 '((a . a1) (a . a2) (b . b1) (c . c3) (a . a4) (a . a3) (b . b3) (b . b2)) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
797 (function string=) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
798 (lambda (item1 item2) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
799 (string< (symbol-name item1) (symbol-name item2)))) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
800 results in |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
801 \((a a1 a2 a4 a3) (b b1 b3 b2) (c c3))" |
20901 | 802 (when (not (null alist)) |
803 (let (result | |
804 same | |
805 tmp-old-car | |
806 tmp-same | |
807 (first-time-p t) | |
808 old-car) | |
809 (nconc | |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
810 (mapcar (lambda (item) |
20901 | 811 (cond |
812 (first-time-p | |
813 (push (cdr item) same) | |
814 (setq first-time-p nil) | |
815 (setq old-car (car item)) | |
816 nil) | |
817 ((funcall same-predicate (car item) old-car) | |
818 (push (cdr item) same) | |
819 nil) | |
820 (t | |
821 (setq tmp-same same | |
822 tmp-old-car old-car) | |
823 (setq same (list (cdr item)) | |
824 old-car (car item)) | |
825 (list (cons tmp-old-car (nreverse tmp-same)))))) | |
826 (sort alist (lambda (item1 item2) | |
827 (funcall sort-predicate (car item1) (car item2))))) | |
828 (list (cons old-car (nreverse same))))))) | |
829 | |
830 | |
831 (defun msb--mode-menu-cond () | |
832 (let ((key msb-modes-key)) | |
833 (mapcar (lambda (item) | |
834 (incf key) | |
835 (list `( eq major-mode (quote ,(car item))) | |
836 key | |
837 (concat (cdr item) " (%d)"))) | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
838 (sort |
20901 | 839 (let ((mode-list nil)) |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
840 (dolist (buffer (cdr (buffer-list))) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
841 (save-excursion |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
842 (set-buffer buffer) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
843 (when (and (not (msb-invisible-buffer-p)) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
844 (not (assq major-mode mode-list))) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
845 (push (cons major-mode mode-name) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
846 mode-list)))) |
20901 | 847 mode-list) |
848 (lambda (item1 item2) | |
849 (string< (cdr item1) (cdr item2))))))) | |
850 | |
10228 | 851 (defun msb--most-recently-used-menu (max-buffer-name-length) |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
852 "Return a list for the most recently used buffers. |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
853 It takes the form ((TITLE . BUFFER-LIST)...)." |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
854 (when (and (numberp msb-display-most-recently-used) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
855 (> msb-display-most-recently-used 0)) |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
856 (let* ((buffers (cdr (buffer-list))) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
857 (most-recently-used |
10228 | 858 (loop with n = 0 |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
859 for buffer in buffers |
10228 | 860 if (save-excursion |
861 (set-buffer buffer) | |
862 (and (not (msb-invisible-buffer-p)) | |
863 (not (eq major-mode 'dired-mode)))) | |
864 collect (save-excursion | |
865 (set-buffer buffer) | |
866 (cons (funcall msb-item-handling-function | |
867 buffer | |
868 max-buffer-name-length) | |
869 buffer)) | |
870 and do (incf n) | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
871 until (>= n msb-display-most-recently-used)))) |
10228 | 872 (cons (if (stringp msb-most-recently-used-title) |
873 (format msb-most-recently-used-title | |
874 (length most-recently-used)) | |
875 (signal 'wrong-type-argument (list msb-most-recently-used-title))) | |
876 most-recently-used)))) | |
877 | |
878 (defun msb--create-buffer-menu-2 () | |
879 (let ((max-buffer-name-length 0) | |
880 file-buffers | |
881 function-info-vector) | |
882 ;; Calculate the longest buffer name. | |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
883 (dolist (buffer (buffer-list)) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
884 (when (or msb-display-invisible-buffers-p |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
885 (not (msb-invisible-buffer-p))) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
886 (setq max-buffer-name-length |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
887 (max max-buffer-name-length (length (buffer-name buffer)))))) |
10228 | 888 ;; Make a list with elements of type |
889 ;; (BUFFER-LIST-VARIABLE | |
890 ;; CONDITION | |
891 ;; MENU-SORT-KEY | |
892 ;; MENU-TITLE | |
893 ;; ITEM-HANDLER | |
894 ;; SORTER) | |
895 ;; Uses "function-global" variables: | |
896 ;; function-info-vector | |
897 (setq function-info-vector | |
898 (apply (function vector) | |
899 (mapcar (function msb--create-function-info) | |
20901 | 900 (append msb-menu-cond (msb--mode-menu-cond))))) |
10228 | 901 ;; Split the buffer-list into several lists; one list for each |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
902 ;; criteria. This is the most critical part with respect to time. |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
903 (dolist (buffer (buffer-list)) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
904 (cond ((and msb-files-by-directory |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
905 (buffer-file-name buffer) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
906 ;; exclude ange-ftp buffers |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
907 ;;(not (string-match "\\/[^/:]+:" |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
908 ;; (buffer-file-name buffer))) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
909 ) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
910 (push buffer file-buffers)) |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
911 (t |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
912 (msb--choose-menu buffer |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
913 function-info-vector |
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
914 max-buffer-name-length)))) |
10228 | 915 (when file-buffers |
916 (setq file-buffers | |
20901 | 917 (mapcar (lambda (buffer-list) |
918 (cons msb-files-by-directory-sort-key | |
919 (cons (car buffer-list) | |
920 (sort | |
921 (mapcar (function | |
922 (lambda (buffer) | |
923 (cons (save-excursion | |
924 (set-buffer buffer) | |
925 (funcall msb-item-handling-function | |
926 buffer | |
927 max-buffer-name-length)) | |
928 buffer))) | |
929 (cdr buffer-list)) | |
930 (function | |
931 (lambda (item1 item2) | |
932 (string< (car item1) (car item2)))))))) | |
10228 | 933 (msb--choose-file-menu file-buffers)))) |
934 ;; Now make the menu - a list of (TITLE . BUFFER-LIST) | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
935 (let* (menu |
10228 | 936 (most-recently-used |
937 (msb--most-recently-used-menu max-buffer-name-length)) | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
938 (others (nconc file-buffers |
10228 | 939 (loop for elt |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
940 across function-info-vector |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
941 for value = (msb--create-sort-item elt) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
942 if value collect value)))) |
10228 | 943 (setq menu |
944 (mapcar 'cdr ;Remove the SORT-KEY | |
945 ;; Sort the menus - not the items. | |
946 (msb--add-separators | |
947 (sort | |
948 ;; Get a list of (SORT-KEY TITLE . BUFFER-LIST) | |
949 ;; Also sorts the items within the menus. | |
950 (if (cdr most-recently-used) | |
951 (cons | |
952 ;; Add most recent used buffers | |
953 (cons msb-most-recently-used-sort-key | |
954 most-recently-used) | |
955 others) | |
956 others) | |
20901 | 957 (lambda (elt1 elt2) |
958 (< (car elt1) (car elt2))))))) | |
10228 | 959 ;; Now make it a keymap menu |
960 (append | |
961 '(keymap "Select Buffer") | |
962 (msb--make-keymap-menu menu) | |
963 (when msb-separator-diff | |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
964 (list (list 'separator "--"))) |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
965 (list (cons 'toggle |
10228 | 966 (cons |
967 (if msb-files-by-directory | |
968 "*Files by type*" | |
969 "*Files by directory*") | |
970 'msb--toggle-menu-type))))))) | |
971 | |
972 (defun msb--create-buffer-menu () | |
973 (save-match-data | |
974 (save-excursion | |
975 (msb--create-buffer-menu-2)))) | |
976 | |
977 (defun msb--toggle-menu-type () | |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
978 "Multi purpose function for selecting a buffer with the mouse." |
10228 | 979 (interactive) |
980 (setq msb-files-by-directory (not msb-files-by-directory)) | |
20884
91f9c828fc1a
(msb--choose-file-menu): Save some debugging info.
Richard M. Stallman <rms@gnu.org>
parents:
20758
diff
changeset
|
981 ;; This gets a warning, but it is correct, |
91f9c828fc1a
(msb--choose-file-menu): Save some debugging info.
Richard M. Stallman <rms@gnu.org>
parents:
20758
diff
changeset
|
982 ;; because this file redefines menu-bar-update-buffers. |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
983 (msb-menu-bar-update-buffers t)) |
10228 | 984 |
985 (defun mouse-select-buffer (event) | |
986 "Pop up several menus of buffers, for selection with the mouse. | |
987 Returns the selected buffer or nil if no buffer is selected. | |
988 | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
989 The way the buffers are split is conveniently handled with the |
10239
52a1e5ef144c
Fix quoting conventions and spaces at end of sentence.
Richard M. Stallman <rms@gnu.org>
parents:
10228
diff
changeset
|
990 variable `msb-menu-cond'." |
10228 | 991 ;; Popup the menu and return the selected buffer. |
992 (when (or msb--error | |
993 (not msb--last-buffer-menu) | |
994 (not (fboundp 'frame-or-buffer-changed-p)) | |
995 (frame-or-buffer-changed-p)) | |
996 (setq msb--error nil) | |
997 (setq msb--last-buffer-menu (msb--create-buffer-menu))) | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
998 (let ((position event) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
999 choice) |
10228 | 1000 (when (and (fboundp 'posn-x-y) |
1001 (fboundp 'posn-window)) | |
1002 (let ((posX (car (posn-x-y (event-start event)))) | |
1003 (posY (cdr (posn-x-y (event-start event)))) | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1004 (posWind (posn-window (event-start event)))) |
10228 | 1005 ;; adjust position |
1006 (setq posX (- posX (funcall msb-horizontal-shift-function)) | |
1007 position (list (list posX posY) posWind)))) | |
10823
abd2a268ed88
(mouse-select-buffer): Do sit-for before x-popup-menu.
Richard M. Stallman <rms@gnu.org>
parents:
10821
diff
changeset
|
1008 ;; This `sit-for' magically makes the menu stay up if the mouse |
13998
2f2d3995b57f
(msb-max-file-menu-items, msb-menu-cond): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
13372
diff
changeset
|
1009 ;; button is released within 0.1 second. |
10823
abd2a268ed88
(mouse-select-buffer): Do sit-for before x-popup-menu.
Richard M. Stallman <rms@gnu.org>
parents:
10821
diff
changeset
|
1010 (sit-for 0 100) |
abd2a268ed88
(mouse-select-buffer): Do sit-for before x-popup-menu.
Richard M. Stallman <rms@gnu.org>
parents:
10821
diff
changeset
|
1011 ;; Popup the menu |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1012 (setq choice (x-popup-menu position msb--last-buffer-menu)) |
10228 | 1013 (cond |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1014 ((eq (car choice) 'toggle) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1015 ;; Bring up the menu again with type toggled. |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1016 (msb--toggle-menu-type) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1017 (mouse-select-buffer event)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1018 ((and (numberp (car choice)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1019 (null (cdr choice))) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1020 (let ((msb--last-buffer-menu (nthcdr 3 (assq (car choice) msb--last-buffer-menu)))) |
10228 | 1021 (mouse-select-buffer event))) |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1022 ((while (numberp (car choice)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1023 (setq choice (cdr choice)))) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1024 ((and (stringp (car choice)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1025 (null (cdr choice))) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1026 (car choice)) |
10403
c0e27466fb3f
(mouse-select-buffer) Handle an aborted selection.
Richard M. Stallman <rms@gnu.org>
parents:
10371
diff
changeset
|
1027 ((null choice) |
c0e27466fb3f
(mouse-select-buffer) Handle an aborted selection.
Richard M. Stallman <rms@gnu.org>
parents:
10371
diff
changeset
|
1028 choice) |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1029 (t |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1030 (error "Unknown form for buffer: %s" choice))))) |
20901 | 1031 |
10228 | 1032 ;; Add separators |
1033 (defun msb--add-separators (sorted-list) | |
1034 (cond | |
1035 ((or (not msb-separator-diff) | |
1036 (not (numberp msb-separator-diff))) | |
1037 sorted-list) | |
1038 (t | |
1039 (let ((last-key nil)) | |
28300
4a7a0fc36977
(msb--choose-file-menu): Use `(apply #'list ...)'
Gerd Moellmann <gerd@gnu.org>
parents:
25281
diff
changeset
|
1040 (mapcar |
20901 | 1041 (lambda (item) |
1042 (cond | |
1043 ((and msb-separator-diff | |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1044 last-key |
20901 | 1045 (> (- (car item) last-key) |
1046 msb-separator-diff)) | |
1047 (setq last-key (car item)) | |
1048 (list (cons last-key 'separator) | |
1049 item)) | |
1050 (t | |
1051 (setq last-key (car item)) | |
1052 (list item)))) | |
10228 | 1053 sorted-list))))) |
1054 | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1055 (defun msb--split-menus-2 (list mcount result) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1056 (cond |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1057 ((> (length list) msb-max-menu-items) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1058 (let ((count 0) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1059 sub-name |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1060 (tmp-list nil)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1061 (while (< count msb-max-menu-items) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1062 (push (pop list) tmp-list) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1063 (incf count)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1064 (setq tmp-list (nreverse tmp-list)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1065 (setq sub-name (concat (car (car tmp-list)) "...")) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
1066 (push (nconc (list mcount sub-name |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
1067 'keymap sub-name) |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1068 tmp-list) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1069 result)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1070 (msb--split-menus-2 list (1+ mcount) result)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1071 ((null result) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1072 list) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1073 (t |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1074 (let (sub-name) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1075 (setq sub-name (concat (car (car list)) "...")) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
1076 (push (nconc (list mcount sub-name |
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
1077 'keymap sub-name) |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1078 list) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1079 result)) |
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1080 (nreverse result)))) |
20901 | 1081 |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1082 (defun msb--split-menus (list) |
20901 | 1083 (if (and (integerp msb-max-menu-items) |
1084 (> msb-max-menu-items 0)) | |
1085 (msb--split-menus-2 list 0 nil) | |
1086 list)) | |
10371
629821e2b42e
Better format of files-by-directory menus.
Richard M. Stallman <rms@gnu.org>
parents:
10239
diff
changeset
|
1087 |
10228 | 1088 (defun msb--make-keymap-menu (raw-menu) |
1089 (let ((end (cons '(nil) 'menu-bar-select-buffer)) | |
1090 (mcount 0)) | |
1091 (mapcar | |
20901 | 1092 (lambda (sub-menu) |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1093 (cond |
20901 | 1094 ((eq 'separator sub-menu) |
1095 (list 'separator "--")) | |
1096 (t | |
1097 (let ((buffers (mapcar (function | |
1098 (lambda (item) | |
1099 (let ((string (car item)) | |
1100 (buffer (cdr item))) | |
1101 (cons (buffer-name buffer) | |
1102 (cons string end))))) | |
1103 (cdr sub-menu)))) | |
1104 (nconc (list (incf mcount) (car sub-menu) | |
1105 'keymap (car sub-menu)) | |
1106 (msb--split-menus buffers)))))) | |
10228 | 1107 raw-menu))) |
1108 | |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1109 (defun msb-menu-bar-update-buffers (&optional arg) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1110 "A re-written version of `menu-bar-update-buffers'." |
10228 | 1111 ;; If user discards the Buffers item, play along. |
1112 (when (and (lookup-key (current-global-map) [menu-bar buffer]) | |
1113 (or (not (fboundp 'frame-or-buffer-changed-p)) | |
1114 (frame-or-buffer-changed-p) | |
1115 arg)) | |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1116 (let ((frames (frame-list)) |
10228 | 1117 buffers-menu frames-menu) |
1118 ;; Make the menu of buffers proper. | |
1119 (setq msb--last-buffer-menu (msb--create-buffer-menu)) | |
1120 (setq buffers-menu msb--last-buffer-menu) | |
1121 ;; Make a Frames menu if we have more than one frame. | |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1122 (when (cdr frames) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1123 (let* ((frame-length (length frames)) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1124 (f-title (format "Frames (%d)" frame-length))) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1125 ;; List only the N most recently selected frames |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1126 (when (and (integerp msb-max-menu-items) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1127 (> msb-max-menu-items 1) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1128 (> frame-length msb-max-menu-items)) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1129 (setcdr (nthcdr msb-max-menu-items frames) nil)) |
10228 | 1130 (setq frames-menu |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1131 (nconc |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1132 (list 'frame f-title '(nil) 'keymap f-title) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1133 (mapcar |
20901 | 1134 (lambda (frame) |
1135 (nconc | |
1136 (list frame | |
1137 (cdr (assq 'name | |
1138 (frame-parameters frame))) | |
1139 (cons nil nil)) | |
1140 'menu-bar-select-frame)) | |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1141 frames))))) |
10228 | 1142 (define-key (current-global-map) [menu-bar buffer] |
1143 (cons "Buffers" | |
1144 (if (and buffers-menu frames-menu) | |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1145 ;; Combine Frame and Buffers menus with separator between |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1146 (nconc (list 'keymap "Buffers and Frames" frames-menu |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
1147 (and msb-separator-diff '(separator "--"))) |
10821
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1148 (cddr buffers-menu)) |
1ff0ed96a4c0
(msb): Select the window that the mouse is in before
Richard M. Stallman <rms@gnu.org>
parents:
10403
diff
changeset
|
1149 (or buffers-menu 'undefined))))))) |
10228 | 1150 |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1151 ;; Snarf current bindings of `mouse-buffer-menu' (normally |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1152 ;; C-down-mouse-1). |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1153 (defvar msb-mode-map |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1154 (let ((map (make-sparse-keymap))) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1155 (mapcar (lambda (key) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1156 (define-key map key #'msb)) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1157 (where-is-internal 'mouse-buffer-menu (make-sparse-keymap))) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1158 map)) |
20504
1b8aec1c12f1
Doc fixes. Changed `append' to `nconc'
Richard M. Stallman <rms@gnu.org>
parents:
16833
diff
changeset
|
1159 |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1160 ;;;###autoload |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1161 (defun msb-mode (&optional arg) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1162 "Toggle Msb mode. |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1163 With arg, turn Msb mode on if and only if arg is positive. |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1164 This mode overrides the binding(s) of `mouse-buffer-menu' to provide a |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1165 different buffer menu using the function `msb'." |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1166 (interactive "P") |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1167 (setq msb-mode (if arg |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1168 (> (prefix-numeric-value arg) 0) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1169 (not msb-mode))) |
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1170 (if msb-mode |
25050
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1171 (progn |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1172 (add-hook 'menu-bar-update-hook 'msb-menu-bar-update-buffers) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1173 (remove-hook 'menu-bar-update-hook 'menu-bar-update-buffers)) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1174 (remove-hook 'menu-bar-update-hook 'msb-menu-bar-update-buffers) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1175 (add-hook 'menu-bar-update-hook 'menu-bar-update-buffers)) |
1539c0070dd3
(msb-menu-bar-update-buffers): Renamed from
Dave Love <fx@gnu.org>
parents:
24796
diff
changeset
|
1176 (run-hooks 'menu-bar-update-hook)) |
10228 | 1177 |
24796
19424321d8e1
Add to minor-mode-map-alist. Remove hook installation
Dave Love <fx@gnu.org>
parents:
21670
diff
changeset
|
1178 (add-to-list 'minor-mode-map-alist (cons 'msb-mode msb-mode-map)) |
10228 | 1179 |
1180 (provide 'msb) | |
1181 (eval-after-load 'msb (run-hooks 'msb-after-load-hooks)) | |
16833
052a9f2e21e5
(frame-or-buffer-changed-p): Definition deleted.
Richard M. Stallman <rms@gnu.org>
parents:
16428
diff
changeset
|
1182 |
10228 | 1183 ;;; msb.el ends here |