(fancy-splash-screens): Remove the code for debugging;
[bpt/emacs.git] / lisp / ebuff-menu.el
CommitLineData
c0274f38
ER
1;;; ebuff-menu.el --- electric-buffer-list mode
2
8f1204db 3;; Copyright (C) 1985, 1986, 1994 Free Software Foundation, Inc.
2076c87c 4
3a801d0c 5;; Author: Richard Mlynarik <mly@ai.mit.edu>
54138c9d 6;; Maintainer: FSF
3465cfd7 7;; Keywords: convenience
3a801d0c 8
2076c87c
JB
9;; This file is part of GNU Emacs.
10
11;; GNU Emacs is free software; you can redistribute it and/or modify
12;; it under the terms of the GNU General Public License as published by
e5167999 13;; the Free Software Foundation; either version 2, or (at your option)
2076c87c
JB
14;; any later version.
15
16;; GNU Emacs is distributed in the hope that it will be useful,
17;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;; GNU General Public License for more details.
20
21;; You should have received a copy of the GNU General Public License
b578f267
EN
22;; along with GNU Emacs; see the file COPYING. If not, write to the
23;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24;; Boston, MA 02111-1307, USA.
2076c87c 25
e5167999
ER
26;;; Commentary:
27
e41b2db1
ER
28;; Who says one can't have typeout windows in GNU Emacs? The entry
29;; point, `electric-buffer-list' works like ^r select buffer from the
30;; ITS Emacs lunar or tmacs libraries.
e5167999
ER
31
32;;; Code:
2076c87c
JB
33
34(require 'electric)
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 (arg)
43 "Pops up a buffer describing the set of Emacs buffers.
44Vaguely like ITS lunar select buffer; combining typeoutoid buffer
45listing with menuoid buffer selection.
46
47If the very next character typed is a space then the buffer list
48window disappears. Otherwise, one may move around in the buffer list
49window, marking buffers to be selected, saved or deleted.
50
51To exit and select a new buffer, type a space when the cursor is on
52the appropriate line of the buffer-list window. Other commands are
53much like those of buffer-menu-mode.
54
55Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil.
56
57\\{electric-buffer-menu-mode-map}"
58 (interactive "P")
59 (let (select buffer)
60 (save-window-excursion
61 (save-window-excursion (list-buffers arg))
62 (setq buffer (window-buffer (Electric-pop-up-window "*Buffer List*")))
63 (unwind-protect
64 (progn
65 (set-buffer buffer)
66 (Electric-buffer-menu-mode)
67 (setq select
68 (catch 'electric-buffer-menu-select
fc7323e6 69 (message "<<< Press Return to bury the buffer list >>>")
d42cc509
RS
70 (if (eq (setq unread-command-events (list (read-event)))
71 ?\ )
dbc4e1c1 72 (progn (setq unread-command-events nil)
2076c87c 73 (throw 'electric-buffer-menu-select nil)))
69adebeb
KH
74 (let ((start-point (point))
75 (first (progn (goto-char (point-min))
2076c87c
JB
76 (forward-line 2)
77 (point)))
78 (last (progn (goto-char (point-max))
79 (forward-line -1)
80 (point)))
81 (goal-column 0))
69adebeb
KH
82 ;; Use start-point if it is meaningful.
83 (goto-char (if (or (< start-point first)
84 (> start-point last))
85 first
86 start-point))
2076c87c
JB
87 (Electric-command-loop 'electric-buffer-menu-select
88 nil
89 t
90 'electric-buffer-menu-looper
91 (cons first last))))))
92 (set-buffer buffer)
93 (Buffer-menu-mode)
94 (bury-buffer buffer)
95 (message "")))
96 (if select
97 (progn (set-buffer buffer)
98 (let ((opoint (point-marker)))
99 (Buffer-menu-execute)
100 (goto-char (point-min))
101 (if (prog1 (search-forward "\n>" nil t)
102 (goto-char opoint) (set-marker opoint nil))
103 (Buffer-menu-select)
104 (switch-to-buffer (Buffer-menu-buffer t))))))))
105
106(defun electric-buffer-menu-looper (state condition)
107 (cond ((and condition
108 (not (memq (car condition) '(buffer-read-only
109 end-of-buffer
110 beginning-of-buffer))))
111 (signal (car condition) (cdr condition)))
112 ((< (point) (car state))
113 (goto-char (point-min))
114 (forward-line 2))
115 ((> (point) (cdr state))
116 (goto-char (point-max))
117 (forward-line -1)
118 (if (pos-visible-in-window-p (point-max))
119 (recenter -1)))))
120
121(put 'Electric-buffer-menu-mode 'mode-class 'special)
122(defun Electric-buffer-menu-mode ()
123 "Major mode for editing a list of buffers.
124Each line describes one of the buffers in Emacs.
125Letters do not insert themselves; instead, they are commands.
126\\<electric-buffer-menu-mode-map>
127\\[keyboard-quit] or \\[Electric-buffer-menu-quit] -- exit buffer menu, returning to previous window and buffer
128 configuration. If the very first character typed is a space, it
129 also has this effect.
130\\[Electric-buffer-menu-select] -- select buffer of line point is on.
131 Also show buffers marked with m in other windows,
132 deletes buffers marked with \"D\", and saves those marked with \"S\".
133\\[Buffer-menu-mark] -- mark buffer to be displayed.
134\\[Buffer-menu-not-modified] -- clear modified-flag on that buffer.
135\\[Buffer-menu-save] -- mark that buffer to be saved.
136\\[Buffer-menu-delete] or \\[Buffer-menu-delete-backwards] -- mark that buffer to be deleted.
137\\[Buffer-menu-unmark] -- remove all kinds of marks from current line.
138\\[Electric-buffer-menu-mode-view-buffer] -- view buffer, returning when done.
139\\[Buffer-menu-backup-unmark] -- back up a line and remove marks.
140
141\\{electric-buffer-menu-mode-map}
142
143Entry to this mode via command electric-buffer-list calls the value of
144electric-buffer-menu-mode-hook if it is non-nil."
145 (kill-all-local-variables)
146 (use-local-map electric-buffer-menu-mode-map)
147 (setq mode-name "Electric Buffer Menu")
148 (setq mode-line-buffer-identification "Electric Buffer List")
149 (make-local-variable 'Helper-return-blurb)
150 (setq Helper-return-blurb "return to buffer editing")
151 (setq truncate-lines t)
152 (setq buffer-read-only t)
153 (setq major-mode 'Electric-buffer-menu-mode)
154 (goto-char (point-min))
155 (if (search-forward "\n." nil t) (forward-char -1))
156 (run-hooks 'electric-buffer-menu-mode-hook))
157
158;; generally the same as Buffer-menu-mode-map
159;; (except we don't indirect to global-map)
160(put 'Electric-buffer-menu-undefined 'suppress-keymap t)
161(if electric-buffer-menu-mode-map
162 nil
9be969d7 163 (let ((map (make-keymap)))
f536481d 164 (fillarray (car (cdr map)) 'Electric-buffer-menu-undefined)
9be969d7 165 (define-key map "\e" nil)
2076c87c
JB
166 (define-key map "\C-z" 'suspend-emacs)
167 (define-key map "v" 'Electric-buffer-menu-mode-view-buffer)
8892e83c 168 (define-key map (char-to-string help-char) 'Helper-help)
2076c87c
JB
169 (define-key map "?" 'Helper-describe-bindings)
170 (define-key map "\C-c" nil)
171 (define-key map "\C-c\C-c" 'Electric-buffer-menu-quit)
172 (define-key map "\C-]" 'Electric-buffer-menu-quit)
173 (define-key map "q" 'Electric-buffer-menu-quit)
174 (define-key map " " 'Electric-buffer-menu-select)
fc7323e6 175 (define-key map "\C-m" 'Electric-buffer-menu-select)
2076c87c
JB
176 (define-key map "\C-l" 'recenter)
177 (define-key map "s" 'Buffer-menu-save)
178 (define-key map "d" 'Buffer-menu-delete)
179 (define-key map "k" 'Buffer-menu-delete)
180 (define-key map "\C-d" 'Buffer-menu-delete-backwards)
181 ;(define-key map "\C-k" 'Buffer-menu-delete)
182 (define-key map "\177" 'Buffer-menu-backup-unmark)
183 (define-key map "~" 'Buffer-menu-not-modified)
184 (define-key map "u" 'Buffer-menu-unmark)
185 (let ((i ?0))
186 (while (<= i ?9)
187 (define-key map (char-to-string i) 'digit-argument)
188 (define-key map (concat "\e" (char-to-string i)) 'digit-argument)
189 (setq i (1+ i))))
190 (define-key map "-" 'negative-argument)
191 (define-key map "\e-" 'negative-argument)
192 (define-key map "m" 'Buffer-menu-mark)
193 (define-key map "\C-u" 'universal-argument)
194 (define-key map "\C-p" 'previous-line)
195 (define-key map "\C-n" 'next-line)
196 (define-key map "p" 'previous-line)
197 (define-key map "n" 'next-line)
198 (define-key map "\C-v" 'scroll-up)
199 (define-key map "\ev" 'scroll-down)
200 (define-key map ">" 'scroll-right)
201 (define-key map "<" 'scroll-left)
202 (define-key map "\e\C-v" 'scroll-other-window)
203 (define-key map "\e>" 'end-of-buffer)
204 (define-key map "\e<" 'beginning-of-buffer)
43145fb4 205 (define-key map "\e\e" nil)
ef946998
RS
206 (define-key map "\e\e\e" 'Electric-buffer-menu-quit)
207 (define-key map [escape escape escape] 'Electric-buffer-menu-quit)
3c59c255 208 (define-key map [mouse-2] 'Electric-buffer-menu-mouse-select)
2076c87c
JB
209 (setq electric-buffer-menu-mode-map map)))
210
211(defun Electric-buffer-menu-exit ()
212 (interactive)
d42cc509 213 (setq unread-command-events (listify-key-sequence (this-command-keys)))
2076c87c
JB
214 ;; for robustness
215 (condition-case ()
216 (throw 'electric-buffer-menu-select nil)
217 (error (Buffer-menu-mode)
218 (other-buffer))))
219
220(defun Electric-buffer-menu-select ()
221 "Leave Electric Buffer Menu, selecting buffers and executing changes.
222Saves buffers marked \"S\". Deletes buffers marked \"K\".
223Selects buffer at point and displays buffers marked \">\" in other windows."
224 (interactive)
225 (throw 'electric-buffer-menu-select (point)))
226
3c59c255
KH
227(defun Electric-buffer-menu-mouse-select (event)
228 (interactive "e")
229 (select-window (posn-window (event-end event)))
230 (set-buffer (window-buffer (selected-window)))
231 (goto-char (posn-point (event-end event)))
232 (throw 'electric-buffer-menu-select (point)))
233
2076c87c
JB
234(defun Electric-buffer-menu-quit ()
235 "Leave Electric Buffer Menu, restoring previous window configuration.
236Does not execute select, save, or delete commands."
237 (interactive)
238 (throw 'electric-buffer-menu-select nil))
239
240(defun Electric-buffer-menu-undefined ()
241 (interactive)
242 (ding)
2bb7c30c
KH
243 (message "%s"
244 (if (and (eq (key-binding "\C-c\C-c") 'Electric-buffer-menu-quit)
2076c87c 245 (eq (key-binding " ") 'Electric-buffer-menu-select)
e17d2fd1 246 (eq (key-binding (char-to-string help-char)) 'Helper-help)
2076c87c 247 (eq (key-binding "?") 'Helper-describe-bindings))
573cd924 248 (substitute-command-keys "Type C-c C-c to exit, Space to select, \\[Helper-help] for help, ? for commands")
2076c87c
JB
249 (substitute-command-keys "\
250Type \\[Electric-buffer-menu-quit] to exit, \
251\\[Electric-buffer-menu-select] to select, \
252\\[Helper-help] for help, \\[Helper-describe-bindings] for commands.")))
253 (sit-for 4))
254
255(defun Electric-buffer-menu-mode-view-buffer ()
256 "View buffer on current line in Electric Buffer Menu.
257Returns to Electric Buffer Menu when done."
258 (interactive)
259 (let ((bufnam (Buffer-menu-buffer nil)))
260 (if bufnam
261 (view-buffer bufnam)
262 (ding)
263 (message "Buffer %s does not exist!" bufnam)
264 (sit-for 4))))
265
896546cd
RS
266(provide 'ebuff-menu)
267
c0274f38 268;;; ebuff-menu.el ends here