comparison lisp/electric/ebuff-menu.el @ 70:131b0175ea99 r20-0b30

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