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