Mercurial > hg > xemacs-beta
comparison lisp/electric/ebuff-menu.el @ 4:b82b59fe008d r19-15b3
Import from CVS: tag r19-15b3
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:46:56 +0200 |
parents | 376386a54a3c |
children | 27bc7f280385 |
comparison
equal
deleted
inserted
replaced
3:30df88044ec6 | 4:b82b59fe008d |
---|---|
1 ;;; ebuff-menu.el --- electric-buffer-list mode | 1 ;;; ebuff-menu.el --- electric-buffer-list mode |
2 | 2 |
3 ;; Copyright (C) 1985, 1986, 1992, 1993, 1994 Free Software Foundation, Inc. | 3 ;; Copyright (C) 1985, 1986, 1994 Free Software Foundation, Inc. |
4 | 4 |
5 ;; Author: Richard Mlynarik <mly@ai.mit.edu> | 5 ;; Author: Richard Mlynarik <mly@ai.mit.edu> |
6 ;; Keywords: frames | |
6 | 7 |
7 ;; This file is part of XEmacs. | 8 ;; This file is part of XEmacs. |
8 | 9 |
9 ;; XEmacs is free software; you can redistribute it and/or modify it | 10 ;; XEmacs is free software; you can redistribute it and/or modify it |
10 ;; under the terms of the GNU General Public License as published by | 11 ;; under the terms of the GNU General Public License as published by |
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 ;; General Public License for more details. | 18 ;; General Public License for more details. |
18 | 19 |
19 ;; You should have received a copy of the GNU General Public License | 20 ;; You should have received a copy of the GNU General Public License |
20 ;; along with XEmacs; see the file COPYING. If not, write to the Free | 21 ;; along with XEmacs; see the file COPYING. If not, write to the Free |
21 ;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | 22 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA |
22 | 23 ;; 02111-1307, USA. |
23 ;;; Synched up with: FSF 19.30. | 24 |
25 ;;; Synched up with: FSF 19.34. | |
24 | 26 |
25 ;;; Commentary: | 27 ;;; Commentary: |
26 | 28 |
27 ;; Who says one can't have typeout windows in GNU Emacs? The entry | 29 ;; Who says one can't have typeout windows in GNU Emacs? The entry |
28 ;; point, `electric-buffer-list' works like ^r select buffer from the | 30 ;; point, `electric-buffer-list' works like ^r select buffer from the |
29 ;; ITS Emacs lunar or tmacs libraries. | 31 ;; ITS Emacs lunar or tmacs libraries. |
30 | 32 |
31 ;;; Code: | 33 ;;; Code: |
32 | 34 |
33 (require 'electric) | 35 (require 'electric) |
36 ;; XEmacs change | |
34 (require 'buff-menu) | 37 (require 'buff-menu) |
35 | 38 |
36 ;; this depends on the format of list-buffers (from src/buffer.c) and | 39 ;; this depends on the format of list-buffers (from src/buffer.c) and |
37 ;; on stuff in lisp/buff-menu.el | 40 ;; on stuff in lisp/buff-menu.el |
38 | 41 |
39 (defvar electric-buffer-menu-mode-map nil) | 42 (defvar electric-buffer-menu-mode-map nil) |
40 | 43 |
41 ;;;###autoload | 44 ;;;###autoload |
42 (defun electric-buffer-list (&optional files-only) | 45 (defun electric-buffer-list (arg) |
43 "Pops up a buffer describing the set of Emacs buffers. | 46 "Pops up a buffer describing the set of Emacs buffers. |
44 Vaguely like ITS lunar select buffer; combining typeoutoid buffer | 47 Vaguely like ITS lunar select buffer; combining typeoutoid buffer |
45 listing with menuoid buffer selection. | 48 listing with menuoid buffer selection. |
46 | 49 |
47 If the very next character typed is a space then the buffer list | 50 If the very next character typed is a space then the buffer list |
48 window disappears. Otherwise, one may move around in the | 51 window disappears. Otherwise, one may move around in the buffer list |
49 buffer list window, marking buffers to be selected, saved or deleted. | 52 window, marking buffers to be selected, saved or deleted. |
50 | 53 |
51 To exit and select a new buffer, type a space when the cursor is on the | 54 To exit and select a new buffer, type a space when the cursor is on |
52 appropriate line of the buffer-list window. | 55 the appropriate line of the buffer-list window. Other commands are |
53 | 56 much like those of buffer-menu-mode. |
54 Other commands are much like those of buffer-menu-mode. | |
55 | 57 |
56 Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil. | 58 Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil. |
57 | 59 |
58 Non-null optional arg FILES-ONLY means mention only file buffers. | |
59 When called from Lisp code, FILES-ONLY may be a regular expression, | |
60 in which case only buffers whose names match that expression are listed, | |
61 or an arbitrary predicate function. | |
62 | |
63 \\{electric-buffer-menu-mode-map}" | 60 \\{electric-buffer-menu-mode-map}" |
64 (interactive (list (if current-prefix-arg t nil))) | 61 (interactive "P") |
65 (let (select buffer) | 62 (let (select buffer) |
66 (save-window-excursion | 63 (save-window-excursion |
67 (save-excursion | 64 (save-window-excursion (list-buffers arg)) |
68 (save-window-excursion | 65 (setq buffer (window-buffer (Electric-pop-up-window "*Buffer List*"))) |
69 (let ((temp-buffer-show-function 'ignore)) | 66 (unwind-protect |
70 (list-buffers files-only))) | 67 (progn |
71 (setq buffer (window-buffer (Electric-pop-up-window "*Buffer List*"))) | |
72 (unwind-protect | |
73 (progn | |
74 (set-buffer buffer) | |
75 (Electric-buffer-menu-mode) | |
76 (setq select | |
77 (catch 'electric-buffer-menu-select | |
78 (message "<<< Press Return to bury the buffer list >>>") | |
79 (let ((start-point (point)) | |
80 (first (progn (goto-char (point-min)) | |
81 (forward-line 2) | |
82 (point))) | |
83 (last (progn (goto-char (point-max)) | |
84 (forward-line -1) | |
85 (point))) | |
86 (goal-column 0)) | |
87 ;; Use start-point if it is meaningful. | |
88 (goto-char (if (or (< start-point first) | |
89 (> start-point last)) | |
90 first | |
91 start-point)) | |
92 (Electric-command-loop 'electric-buffer-menu-select | |
93 nil | |
94 t | |
95 'electric-buffer-menu-looper | |
96 (cons first last)))))) | |
97 (save-excursion | |
98 (set-buffer buffer) | 68 (set-buffer buffer) |
99 (Buffer-menu-mode)) | 69 (Electric-buffer-menu-mode) |
100 (bury-buffer buffer) | 70 (setq select |
101 (message nil)))) | 71 (catch 'electric-buffer-menu-select |
72 (message "<<< Press Return to bury the buffer list >>>") | |
73 ;; XEmacs change | |
74 (if (eq (setq unread-command-events | |
75 (list (next-command-event))) | |
76 ?\ ) | |
77 (progn (setq unread-command-events nil) | |
78 (throw 'electric-buffer-menu-select nil))) | |
79 (let ((start-point (point)) | |
80 (first (progn (goto-char (point-min)) | |
81 (forward-line 2) | |
82 (point))) | |
83 (last (progn (goto-char (point-max)) | |
84 (forward-line -1) | |
85 (point))) | |
86 (goal-column 0)) | |
87 ;; Use start-point if it is meaningful. | |
88 (goto-char (if (or (< start-point first) | |
89 (> start-point last)) | |
90 first | |
91 start-point)) | |
92 (Electric-command-loop 'electric-buffer-menu-select | |
93 nil | |
94 t | |
95 'electric-buffer-menu-looper | |
96 (cons first last)))))) | |
97 (set-buffer buffer) | |
98 (Buffer-menu-mode) | |
99 (bury-buffer buffer) | |
100 (message ""))) | |
102 (if select | 101 (if select |
103 (progn | 102 (progn (set-buffer buffer) |
104 (set-buffer buffer) | 103 (let ((opoint (point-marker))) |
105 (let ((opoint (point-marker))) | 104 (Buffer-menu-execute) |
106 (Buffer-menu-execute) | 105 (goto-char (point-min)) |
107 (goto-char (point-min)) | 106 (if (prog1 (search-forward "\n>" nil t) |
108 (cond ((prog1 (search-forward "\n>" nil t) | 107 (goto-char opoint) (set-marker opoint nil)) |
109 (goto-char opoint) (set-marker opoint nil)) | 108 (Buffer-menu-select) |
110 (Buffer-menu-select)) | 109 (switch-to-buffer (Buffer-menu-buffer t)))))))) |
111 ((bufferp select) | |
112 (switch-to-buffer select)) | |
113 (t | |
114 (switch-to-buffer (Buffer-menu-buffer t))))))))) | |
115 | 110 |
116 (defun electric-buffer-menu-looper (state condition) | 111 (defun electric-buffer-menu-looper (state condition) |
117 (cond ((and condition | 112 (cond ((and condition |
118 (not (memq (car condition) '(buffer-read-only | 113 (not (memq (car condition) '(buffer-read-only |
119 end-of-buffer | 114 end-of-buffer |
154 `electric-buffer-menu-mode-hook' if it is non-nil." | 149 `electric-buffer-menu-mode-hook' if it is non-nil." |
155 (kill-all-local-variables) | 150 (kill-all-local-variables) |
156 (use-local-map electric-buffer-menu-mode-map) | 151 (use-local-map electric-buffer-menu-mode-map) |
157 (setq mode-name "Electric Buffer Menu") | 152 (setq mode-name "Electric Buffer Menu") |
158 (setq mode-line-buffer-identification "Electric Buffer List") | 153 (setq mode-line-buffer-identification "Electric Buffer List") |
154 ;; XEmacs | |
159 (if (memq 'mode-name mode-line-format) | 155 (if (memq 'mode-name mode-line-format) |
160 (progn (setq mode-line-format (copy-sequence mode-line-format)) | 156 (progn (setq mode-line-format (copy-sequence mode-line-format)) |
161 (setcar (memq 'mode-name mode-line-format) "Buffers"))) | 157 (setcar (memq 'mode-name mode-line-format) "Buffers"))) |
162 (make-local-variable 'Helper-return-blurb) | 158 (make-local-variable 'Helper-return-blurb) |
163 (setq Helper-return-blurb "return to buffer editing") | 159 (setq Helper-return-blurb "return to buffer editing") |
164 (setq truncate-lines t) | 160 (setq truncate-lines t) |
161 ;; XEmacs | |
165 (setq buffer-scrollbar-height 0) | 162 (setq buffer-scrollbar-height 0) |
166 (setq buffer-read-only t) | 163 (setq buffer-read-only t) |
167 (setq major-mode 'Electric-buffer-menu-mode) | 164 (setq major-mode 'Electric-buffer-menu-mode) |
165 ;; XEmacs | |
168 (setq mode-motion-hook 'mode-motion-highlight-line) | 166 (setq mode-motion-hook 'mode-motion-highlight-line) |
169 (goto-char (point-min)) | 167 (goto-char (point-min)) |
170 (if (search-forward "\n." nil t) (forward-char -1)) | 168 (if (search-forward "\n." nil t) (forward-char -1)) |
171 (run-hooks 'electric-buffer-menu-mode-hook)) | 169 (run-hooks 'electric-buffer-menu-mode-hook)) |
172 | 170 |
173 ;; generally the same as Buffer-menu-mode-map | 171 ;; generally the same as Buffer-menu-mode-map |
174 ;; (except we don't indirect to global-map) | 172 ;; (except we don't indirect to global-map) |
175 (put 'Electric-buffer-menu-undefined 'suppress-keymap t) | 173 (put 'Electric-buffer-menu-undefined 'suppress-keymap t) |
176 (if electric-buffer-menu-mode-map | 174 (if electric-buffer-menu-mode-map |
177 nil | 175 nil |
178 (let ((map (make-keymap))) | 176 (let ((map (make-keymap)) (submap (make-keymap))) |
179 (set-keymap-name map 'electric-buffer-menu-mode-map) | 177 (fillarray (car (cdr map)) 'Electric-buffer-menu-undefined) |
180 ;;#### Urk! There must be a buffer way in Lucid Emacs. | 178 (define-key map "\e" submap) |
181 (let ((i 0)) | 179 (fillarray (car (cdr submap)) 'Electric-buffer-menu-undefined) |
182 (while (< i 128) | 180 (define-key map "\C-z" 'suspend-emacs) |
183 (define-key map (make-string 1 i) 'Electric-buffer-menu-undefined) | |
184 (setq i (1+ i)))) | |
185 (define-key map "\e" (make-keymap)) | |
186 (let ((map2 (lookup-key map "\e")) | |
187 (i 0)) | |
188 (while (< i 128) | |
189 (define-key map2 (make-string 1 i) 'Electric-buffer-menu-undefined) | |
190 (setq i (1+ i)))) | |
191 ;; (define-key map "\C-z" 'suspend-emacs) | |
192 (define-key map "v" 'Electric-buffer-menu-mode-view-buffer) | 181 (define-key map "v" 'Electric-buffer-menu-mode-view-buffer) |
193 ;; (define-key map "\C-h" 'Helper-help) | 182 (define-key map (char-to-string help-char) 'Helper-help) |
194 (define-key map '(control h) 'Helper-help) | |
195 (define-key map "?" 'Helper-describe-bindings) | 183 (define-key map "?" 'Helper-describe-bindings) |
196 (define-key map "\C-c" nil) | 184 (define-key map "\C-c" nil) |
197 (define-key map "\C-c\C-c" 'Electric-buffer-menu-quit) | 185 (define-key map "\C-c\C-c" 'Electric-buffer-menu-quit) |
198 (define-key map "\C-]" 'Electric-buffer-menu-quit) | 186 (define-key map "\C-]" 'Electric-buffer-menu-quit) |
199 (define-key map "q" 'Electric-buffer-menu-quit) | 187 (define-key map "q" 'Electric-buffer-menu-quit) |
200 (define-key map " " 'Electric-buffer-menu-select) | 188 (define-key map " " 'Electric-buffer-menu-select) |
201 (define-key map "\r" 'Electric-buffer-menu-select) ;; XEmacs change | 189 (define-key map "\C-m" 'Electric-buffer-menu-select) |
202 (define-key map "\C-l" 'recenter) | 190 (define-key map "\C-l" 'recenter) |
203 (define-key map "s" 'Buffer-menu-save) | 191 (define-key map "s" 'Buffer-menu-save) |
204 (define-key map "d" 'Buffer-menu-delete) | 192 (define-key map "d" 'Buffer-menu-delete) |
205 (define-key map "k" 'Buffer-menu-delete) | 193 (define-key map "k" 'Buffer-menu-delete) |
206 (define-key map "\C-d" 'Buffer-menu-delete-backwards) | 194 (define-key map "\C-d" 'Buffer-menu-delete-backwards) |
207 ;(define-key map "\C-k" 'Buffer-menu-delete) | 195 ;(define-key map "\C-k" 'Buffer-menu-delete) |
208 (define-key map "\177" 'Buffer-menu-backup-unmark) | 196 (define-key map "\177" 'Buffer-menu-backup-unmark) |
197 ;; XEmacs | |
209 (define-key map 'backspace 'Buffer-menu-backup-unmark) | 198 (define-key map 'backspace 'Buffer-menu-backup-unmark) |
210 (define-key map "~" 'Buffer-menu-not-modified) | 199 (define-key map "~" 'Buffer-menu-not-modified) |
211 (define-key map "u" 'Buffer-menu-unmark) | 200 (define-key map "u" 'Buffer-menu-unmark) |
212 (let ((i ?0)) | 201 (let ((i ?0)) |
213 (while (<= i ?9) | 202 (while (<= i ?9) |
230 (define-key map "\e\C-v" 'scroll-other-window) | 219 (define-key map "\e\C-v" 'scroll-other-window) |
231 (define-key map "\e>" 'end-of-buffer) | 220 (define-key map "\e>" 'end-of-buffer) |
232 (define-key map "\e<" 'beginning-of-buffer) | 221 (define-key map "\e<" 'beginning-of-buffer) |
233 (define-key map "\e\e" nil) | 222 (define-key map "\e\e" nil) |
234 (define-key map "\e\e\e" 'Electric-buffer-menu-quit) | 223 (define-key map "\e\e\e" 'Electric-buffer-menu-quit) |
224 ;; XEmacs | |
235 (define-key map [home] 'beginning-of-buffer) | 225 (define-key map [home] 'beginning-of-buffer) |
236 (define-key map [down] 'next-line) | 226 (define-key map [down] 'next-line) |
237 (define-key map [up] 'previous-line) | 227 (define-key map [up] 'previous-line) |
238 (define-key map [prior] 'scroll-down) | 228 (define-key map [prior] 'scroll-down) |
239 (define-key map [next] 'scroll-up) | 229 (define-key map [next] 'scroll-up) |
241 (define-key map 'button3 'Buffer-menu-popup-menu) | 231 (define-key map 'button3 'Buffer-menu-popup-menu) |
242 (setq electric-buffer-menu-mode-map map))) | 232 (setq electric-buffer-menu-mode-map map))) |
243 | 233 |
244 (defun Electric-buffer-menu-exit () | 234 (defun Electric-buffer-menu-exit () |
245 (interactive) | 235 (interactive) |
236 ;; XEmacs | |
246 (setq unread-command-event last-input-event) | 237 (setq unread-command-event last-input-event) |
247 ;; for robustness | 238 ;; for robustness |
248 (condition-case () | 239 (condition-case () |
249 (throw 'electric-buffer-menu-select nil) | 240 (throw 'electric-buffer-menu-select nil) |
250 (error (Buffer-menu-mode) | 241 (error (Buffer-menu-mode) |
251 (other-buffer)))) | 242 (other-buffer)))) |
252 | 243 |
253 (defun Electric-buffer-menu-select () | 244 (defun Electric-buffer-menu-select () |
254 "Leave Electric Buffer Menu, selecting buffers and executing changes. | 245 "Leave Electric Buffer Menu, selecting buffers and executing changes. |
255 Saves buffers marked \"S\". Deletes buffers marked \"K\". | 246 Saves buffers marked \"S\". Deletes buffers marked \"K\". |
256 Selects buffer at point and displays buffers marked \">\" in other | 247 Selects buffer at point and displays buffers marked \">\" in other windows." |
257 windows." | |
258 (interactive) | 248 (interactive) |
259 (throw 'electric-buffer-menu-select (point))) | 249 (throw 'electric-buffer-menu-select (point))) |
260 | 250 |
261 (defun Electric-buffer-menu-mouse-select (event) | 251 (defun Electric-buffer-menu-mouse-select (event) |
262 (interactive "e") | 252 (interactive "e") |
253 ;; XEmacs is simpler | |
263 (mouse-set-point event) | 254 (mouse-set-point event) |
264 (Electric-buffer-menu-select)) | 255 (Electric-buffer-menu-select)) |
265 | 256 |
266 (defun Electric-buffer-menu-quit () | 257 (defun Electric-buffer-menu-quit () |
267 "Leave Electric Buffer Menu, restoring previous window configuration. | 258 "Leave Electric Buffer Menu, restoring previous window configuration. |
270 (throw 'electric-buffer-menu-select nil)) | 261 (throw 'electric-buffer-menu-select nil)) |
271 | 262 |
272 (defun Electric-buffer-menu-undefined () | 263 (defun Electric-buffer-menu-undefined () |
273 (interactive) | 264 (interactive) |
274 (ding) | 265 (ding) |
275 (message (substitute-command-keys "\ | 266 (message "%s" |
267 (if (and (eq (key-binding "\C-c\C-c") 'Electric-buffer-menu-quit) | |
268 (eq (key-binding " ") 'Electric-buffer-menu-select) | |
269 (eq (key-binding (char-to-string help-char)) 'Helper-help) | |
270 (eq (key-binding "?") 'Helper-describe-bindings)) | |
271 (substitute-command-keys "Type C-c C-c to exit, Space to select, | |
276 Type \\[Electric-buffer-menu-quit] to exit, \ | 272 Type \\[Electric-buffer-menu-quit] to exit, \ |
277 \\[Electric-buffer-menu-select] to select, \ | 273 \\[Electric-buffer-menu-select] to select, \ |
278 \\[Helper-help] for help, \\[Helper-describe-bindings] for commands.")) | 274 \\[Helper-help] for help, \\[Helper-describe-bindings] for commands."))) |
279 (sit-for 4)) | 275 (sit-for 4)) |
280 | 276 |
281 (defun Electric-buffer-menu-mode-view-buffer () | 277 (defun Electric-buffer-menu-mode-view-buffer () |
282 "View buffer on current line in Electric Buffer Menu. | 278 "View buffer on current line in Electric Buffer Menu. |
283 Returns to Electric Buffer Menu when done." | 279 Returns to Electric Buffer Menu when done." |