Mercurial > hg > xemacs-beta
comparison lisp/electric/ebuff-menu.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | b82b59fe008d |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 ;;; ebuff-menu.el --- electric-buffer-list mode | |
2 | |
3 ;; Copyright (C) 1985, 1986, 1992, 1993, 1994 Free Software Foundation, Inc. | |
4 | |
5 ;; Author: Richard Mlynarik <mly@ai.mit.edu> | |
6 | |
7 ;; This file is part of XEmacs. | |
8 | |
9 ;; 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 ;; the Free Software Foundation; either version 2, or (at your option) | |
12 ;; any later version. | |
13 | |
14 ;; XEmacs is distributed in the hope that it will be useful, but | |
15 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 ;; General Public License for more details. | |
18 | |
19 ;; 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 ;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
22 | |
23 ;;; Synched up with: FSF 19.30. | |
24 | |
25 ;;; Commentary: | |
26 | |
27 ;; 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 | |
29 ;; ITS Emacs lunar or tmacs libraries. | |
30 | |
31 ;;; Code: | |
32 | |
33 (require 'electric) | |
34 (require 'buff-menu) | |
35 | |
36 ;; this depends on the format of list-buffers (from src/buffer.c) and | |
37 ;; on stuff in lisp/buff-menu.el | |
38 | |
39 (defvar electric-buffer-menu-mode-map nil) | |
40 | |
41 ;;;###autoload | |
42 (defun electric-buffer-list (&optional files-only) | |
43 "Pops up a buffer describing the set of Emacs buffers. | |
44 Vaguely like ITS lunar select buffer; combining typeoutoid buffer | |
45 listing with menuoid buffer selection. | |
46 | |
47 If the very next character typed is a space then the buffer list | |
48 window disappears. Otherwise, one may move around in the | |
49 buffer list window, marking buffers to be selected, saved or deleted. | |
50 | |
51 To exit and select a new buffer, type a space when the cursor is on the | |
52 appropriate line of the buffer-list window. | |
53 | |
54 Other commands are much like those of buffer-menu-mode. | |
55 | |
56 Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil. | |
57 | |
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}" | |
64 (interactive (list (if current-prefix-arg t nil))) | |
65 (let (select buffer) | |
66 (save-window-excursion | |
67 (save-excursion | |
68 (save-window-excursion | |
69 (let ((temp-buffer-show-function 'ignore)) | |
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 | |
98 (set-buffer buffer) | |
99 (Buffer-menu-mode)) | |
100 (bury-buffer buffer) | |
101 (message nil)))) | |
102 (if select | |
103 (progn | |
104 (set-buffer buffer) | |
105 (let ((opoint (point-marker))) | |
106 (Buffer-menu-execute) | |
107 (goto-char (point-min)) | |
108 (cond ((prog1 (search-forward "\n>" nil t) | |
109 (goto-char opoint) (set-marker opoint nil)) | |
110 (Buffer-menu-select)) | |
111 ((bufferp select) | |
112 (switch-to-buffer select)) | |
113 (t | |
114 (switch-to-buffer (Buffer-menu-buffer t))))))))) | |
115 | |
116 (defun electric-buffer-menu-looper (state condition) | |
117 (cond ((and condition | |
118 (not (memq (car condition) '(buffer-read-only | |
119 end-of-buffer | |
120 beginning-of-buffer)))) | |
121 (signal (car condition) (cdr condition))) | |
122 ((< (point) (car state)) | |
123 (goto-char (point-min)) | |
124 (forward-line 2)) | |
125 ((> (point) (cdr state)) | |
126 (goto-char (point-max)) | |
127 (forward-line -1) | |
128 (if (pos-visible-in-window-p (point-max)) | |
129 (recenter -1))))) | |
130 | |
131 (put 'Electric-buffer-menu-mode 'mode-class 'special) | |
132 (defun Electric-buffer-menu-mode () | |
133 "Major mode for editing a list of buffers. | |
134 Each line describes one of the buffers in Emacs. | |
135 Letters do not insert themselves; instead, they are commands. | |
136 \\<electric-buffer-menu-mode-map> | |
137 \\[keyboard-quit] or \\[Electric-buffer-menu-quit] -- exit buffer menu, returning to previous window and buffer | |
138 configuration. If the very first character typed is a space, it | |
139 also has this effect. | |
140 \\[Electric-buffer-menu-select] -- select buffer of line point is on. | |
141 Also show buffers marked with m in other windows, | |
142 deletes buffers marked with \"D\", and saves those marked with \"S\". | |
143 \\[Buffer-menu-mark] -- mark buffer to be displayed. | |
144 \\[Buffer-menu-not-modified] -- clear modified-flag on that buffer. | |
145 \\[Buffer-menu-save] -- mark that buffer to be saved. | |
146 \\[Buffer-menu-delete] or \\[Buffer-menu-delete-backwards] -- mark that buffer to be deleted. | |
147 \\[Buffer-menu-unmark] -- remove all kinds of marks from current line. | |
148 \\[Electric-buffer-menu-mode-view-buffer] -- view buffer, returning when done. | |
149 \\[Buffer-menu-backup-unmark] -- back up a line and remove marks. | |
150 | |
151 \\{electric-buffer-menu-mode-map} | |
152 | |
153 Entry to this mode via command `electric-buffer-list' calls the value of | |
154 `electric-buffer-menu-mode-hook' if it is non-nil." | |
155 (kill-all-local-variables) | |
156 (use-local-map electric-buffer-menu-mode-map) | |
157 (setq mode-name "Electric Buffer Menu") | |
158 (setq mode-line-buffer-identification "Electric Buffer List") | |
159 (if (memq 'mode-name mode-line-format) | |
160 (progn (setq mode-line-format (copy-sequence mode-line-format)) | |
161 (setcar (memq 'mode-name mode-line-format) "Buffers"))) | |
162 (make-local-variable 'Helper-return-blurb) | |
163 (setq Helper-return-blurb "return to buffer editing") | |
164 (setq truncate-lines t) | |
165 (setq buffer-scrollbar-height 0) | |
166 (setq buffer-read-only t) | |
167 (setq major-mode 'Electric-buffer-menu-mode) | |
168 (setq mode-motion-hook 'mode-motion-highlight-line) | |
169 (goto-char (point-min)) | |
170 (if (search-forward "\n." nil t) (forward-char -1)) | |
171 (run-hooks 'electric-buffer-menu-mode-hook)) | |
172 | |
173 ;; generally the same as Buffer-menu-mode-map | |
174 ;; (except we don't indirect to global-map) | |
175 (put 'Electric-buffer-menu-undefined 'suppress-keymap t) | |
176 (if electric-buffer-menu-mode-map | |
177 nil | |
178 (let ((map (make-keymap))) | |
179 (set-keymap-name map 'electric-buffer-menu-mode-map) | |
180 ;;#### Urk! There must be a buffer way in Lucid Emacs. | |
181 (let ((i 0)) | |
182 (while (< i 128) | |
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) | |
193 ;; (define-key map "\C-h" 'Helper-help) | |
194 (define-key map '(control h) 'Helper-help) | |
195 (define-key map "?" 'Helper-describe-bindings) | |
196 (define-key map "\C-c" nil) | |
197 (define-key map "\C-c\C-c" 'Electric-buffer-menu-quit) | |
198 (define-key map "\C-]" 'Electric-buffer-menu-quit) | |
199 (define-key map "q" 'Electric-buffer-menu-quit) | |
200 (define-key map " " 'Electric-buffer-menu-select) | |
201 (define-key map "\r" 'Electric-buffer-menu-select) ;; XEmacs change | |
202 (define-key map "\C-l" 'recenter) | |
203 (define-key map "s" 'Buffer-menu-save) | |
204 (define-key map "d" 'Buffer-menu-delete) | |
205 (define-key map "k" 'Buffer-menu-delete) | |
206 (define-key map "\C-d" 'Buffer-menu-delete-backwards) | |
207 ;(define-key map "\C-k" 'Buffer-menu-delete) | |
208 (define-key map "\177" 'Buffer-menu-backup-unmark) | |
209 (define-key map 'backspace 'Buffer-menu-backup-unmark) | |
210 (define-key map "~" 'Buffer-menu-not-modified) | |
211 (define-key map "u" 'Buffer-menu-unmark) | |
212 (let ((i ?0)) | |
213 (while (<= i ?9) | |
214 (define-key map (char-to-string i) 'digit-argument) | |
215 ;;#### Urk! | |
216 (define-key map (concat "\e" (char-to-string i)) 'digit-argument) | |
217 (setq i (1+ i)))) | |
218 (define-key map "-" 'negative-argument) | |
219 (define-key map "\e-" 'negative-argument) | |
220 (define-key map "m" 'Buffer-menu-mark) | |
221 (define-key map "\C-u" 'universal-argument) | |
222 (define-key map "\C-p" 'previous-line) | |
223 (define-key map "\C-n" 'next-line) | |
224 (define-key map "p" 'previous-line) | |
225 (define-key map "n" 'next-line) | |
226 (define-key map "\C-v" 'scroll-up) | |
227 (define-key map "\ev" 'scroll-down) | |
228 (define-key map ">" 'scroll-right) | |
229 (define-key map "<" 'scroll-left) | |
230 (define-key map "\e\C-v" 'scroll-other-window) | |
231 (define-key map "\e>" 'end-of-buffer) | |
232 (define-key map "\e<" 'beginning-of-buffer) | |
233 (define-key map "\e\e" nil) | |
234 (define-key map "\e\e\e" 'Electric-buffer-menu-quit) | |
235 (define-key map [home] 'beginning-of-buffer) | |
236 (define-key map [down] 'next-line) | |
237 (define-key map [up] 'previous-line) | |
238 (define-key map [prior] 'scroll-down) | |
239 (define-key map [next] 'scroll-up) | |
240 (define-key map 'button2 'Electric-buffer-menu-mouse-select) | |
241 (define-key map 'button3 'Buffer-menu-popup-menu) | |
242 (setq electric-buffer-menu-mode-map map))) | |
243 | |
244 (defun Electric-buffer-menu-exit () | |
245 (interactive) | |
246 (setq unread-command-event last-input-event) | |
247 ;; for robustness | |
248 (condition-case () | |
249 (throw 'electric-buffer-menu-select nil) | |
250 (error (Buffer-menu-mode) | |
251 (other-buffer)))) | |
252 | |
253 (defun Electric-buffer-menu-select () | |
254 "Leave Electric Buffer Menu, selecting buffers and executing changes. | |
255 Saves buffers marked \"S\". Deletes buffers marked \"K\". | |
256 Selects buffer at point and displays buffers marked \">\" in other | |
257 windows." | |
258 (interactive) | |
259 (throw 'electric-buffer-menu-select (point))) | |
260 | |
261 (defun Electric-buffer-menu-mouse-select (event) | |
262 (interactive "e") | |
263 (mouse-set-point event) | |
264 (Electric-buffer-menu-select)) | |
265 | |
266 (defun Electric-buffer-menu-quit () | |
267 "Leave Electric Buffer Menu, restoring previous window configuration. | |
268 Does not execute select, save, or delete commands." | |
269 (interactive) | |
270 (throw 'electric-buffer-menu-select nil)) | |
271 | |
272 (defun Electric-buffer-menu-undefined () | |
273 (interactive) | |
274 (ding) | |
275 (message (substitute-command-keys "\ | |
276 Type \\[Electric-buffer-menu-quit] to exit, \ | |
277 \\[Electric-buffer-menu-select] to select, \ | |
278 \\[Helper-help] for help, \\[Helper-describe-bindings] for commands.")) | |
279 (sit-for 4)) | |
280 | |
281 (defun Electric-buffer-menu-mode-view-buffer () | |
282 "View buffer on current line in Electric Buffer Menu. | |
283 Returns to Electric Buffer Menu when done." | |
284 (interactive) | |
285 (let ((bufnam (Buffer-menu-buffer nil))) | |
286 (if bufnam | |
287 (view-buffer bufnam) | |
288 (ding) | |
289 (message "Buffer %s does not exist!" bufnam) | |
290 (sit-for 4)))) | |
291 | |
292 ;;; ebuff-menu.el ends here |