;;; ebuff-menu.el --- electric-buffer-list mode
-;; Copyright (C) 1985, 1986 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 1986, 1994, 2002, 2003, 2004,
+;; 2005 Free Software Foundation, Inc.
;; Author: Richard Mlynarik <mly@ai.mit.edu>
+;; Maintainer: FSF
+;; Keywords: convenience
;; This file is part of GNU Emacs.
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Commentary:
-;; who says one can't have typeout windows in gnu emacs?
-;; like ^r select buffer from its emacs lunar or tmacs libraries.
+;; Who says one can't have typeout windows in GNU Emacs? The entry
+;; point, `electric-buffer-list' works like ^r select buffer from the
+;; ITS Emacs lunar or tmacs libraries.
;;; Code:
(defvar electric-buffer-menu-mode-map nil)
+(defvar electric-buffer-menu-mode-hook nil
+ "Normal hook run by `electric-buffer-list'.")
+
;;;###autoload
(defun electric-buffer-list (arg)
- "Pops up a buffer describing the set of Emacs buffers.
+ "Pop up a buffer describing the set of Emacs buffers.
Vaguely like ITS lunar select buffer; combining typeoutoid buffer
listing with menuoid buffer selection.
To exit and select a new buffer, type a space when the cursor is on
the appropriate line of the buffer-list window. Other commands are
-much like those of buffer-menu-mode.
+much like those of `Buffer-menu-mode'.
-Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil.
+Run hooks in `electric-buffer-menu-mode-hook' on entry.
-\\{electric-buffer-menu-mode-map}"
+\\{electric-buffer-menu-mode-map}"
(interactive "P")
(let (select buffer)
(save-window-excursion
- (save-window-excursion (list-buffers arg))
- (setq buffer (window-buffer (Electric-pop-up-window "*Buffer List*")))
+ (setq buffer (list-buffers-noselect arg))
+ (Electric-pop-up-window buffer)
(unwind-protect
(progn
(set-buffer buffer)
(Electric-buffer-menu-mode)
+ (electric-buffer-update-highlight)
(setq select
(catch 'electric-buffer-menu-select
- (message "<<< Press Space to bury the buffer list >>>")
- (if (= (setq unread-command-char (read-char)) ?\ )
- (progn (setq unread-command-char -1)
+ (message "<<< Press Return to bury the buffer list >>>")
+ (if (eq (setq unread-command-events (list (read-event)))
+ ?\ )
+ (progn (setq unread-command-events nil)
(throw 'electric-buffer-menu-select nil)))
- (let ((first (progn (goto-char (point-min))
- (forward-line 2)
+ (let ((start-point (point))
+ (first (progn (goto-char (point-min))
+ (unless Buffer-menu-use-header-line
+ (forward-line 2))
(point)))
(last (progn (goto-char (point-max))
(forward-line -1)
(point)))
(goal-column 0))
- (goto-char first)
+ ;; Use start-point if it is meaningful.
+ (goto-char (if (or (< start-point first)
+ (> start-point last))
+ first
+ start-point))
(Electric-command-loop 'electric-buffer-menu-select
nil
t
(signal (car condition) (cdr condition)))
((< (point) (car state))
(goto-char (point-min))
- (forward-line 2))
+ (unless Buffer-menu-use-header-line
+ (forward-line 2)))
((> (point) (cdr state))
(goto-char (point-max))
(forward-line -1)
(if (pos-visible-in-window-p (point-max))
- (recenter -1)))))
+ (recenter -1))))
+ (electric-buffer-update-highlight))
+
+(defvar Helper-return-blurb)
(put 'Electric-buffer-menu-mode 'mode-class 'special)
(defun Electric-buffer-menu-mode ()
\\{electric-buffer-menu-mode-map}
-Entry to this mode via command electric-buffer-list calls the value of
-electric-buffer-menu-mode-hook if it is non-nil."
- (kill-all-local-variables)
+Entry to this mode via command `electric-buffer-list' calls the value of
+`electric-buffer-menu-mode-hook'."
+ (let ((saved header-line-format))
+ (kill-all-local-variables)
+ (setq header-line-format saved))
(use-local-map electric-buffer-menu-mode-map)
(setq mode-name "Electric Buffer Menu")
(setq mode-line-buffer-identification "Electric Buffer List")
(setq major-mode 'Electric-buffer-menu-mode)
(goto-char (point-min))
(if (search-forward "\n." nil t) (forward-char -1))
- (run-hooks 'electric-buffer-menu-mode-hook))
+ (run-mode-hooks 'electric-buffer-menu-mode-hook))
;; generally the same as Buffer-menu-mode-map
;; (except we don't indirect to global-map)
(if electric-buffer-menu-mode-map
nil
(let ((map (make-keymap)))
- (fillarray map 'Electric-buffer-menu-undefined)
- (define-key map "\e" (make-keymap))
- (fillarray (lookup-key map "\e") 'Electric-buffer-menu-undefined)
+ (fillarray (car (cdr map)) 'Electric-buffer-menu-undefined)
+ (define-key map "\e" nil)
(define-key map "\C-z" 'suspend-emacs)
(define-key map "v" 'Electric-buffer-menu-mode-view-buffer)
- (define-key map help-char 'Helper-help)
+ (define-key map (char-to-string help-char) 'Helper-help)
(define-key map "?" 'Helper-describe-bindings)
(define-key map "\C-c" nil)
(define-key map "\C-c\C-c" 'Electric-buffer-menu-quit)
(define-key map "\C-]" 'Electric-buffer-menu-quit)
(define-key map "q" 'Electric-buffer-menu-quit)
(define-key map " " 'Electric-buffer-menu-select)
+ (define-key map "\C-m" 'Electric-buffer-menu-select)
(define-key map "\C-l" 'recenter)
(define-key map "s" 'Buffer-menu-save)
(define-key map "d" 'Buffer-menu-delete)
(define-key map "\e\C-v" 'scroll-other-window)
(define-key map "\e>" 'end-of-buffer)
(define-key map "\e<" 'beginning-of-buffer)
+ (define-key map "\e\e" nil)
+ (define-key map "\e\e\e" 'Electric-buffer-menu-quit)
+ (define-key map [escape escape escape] 'Electric-buffer-menu-quit)
+ (define-key map [mouse-2] 'Electric-buffer-menu-mouse-select)
(setq electric-buffer-menu-mode-map map)))
-
+
(defun Electric-buffer-menu-exit ()
(interactive)
- (setq unread-command-char last-input-char)
+ (setq unread-command-events (listify-key-sequence (this-command-keys)))
;; for robustness
(condition-case ()
(throw 'electric-buffer-menu-select nil)
(defun Electric-buffer-menu-select ()
"Leave Electric Buffer Menu, selecting buffers and executing changes.
-Saves buffers marked \"S\". Deletes buffers marked \"K\".
-Selects buffer at point and displays buffers marked \">\" in other windows."
+Save buffers marked \"S\". Delete buffers marked \"K\".
+Select buffer at point and display buffers marked \">\" in other windows."
(interactive)
(throw 'electric-buffer-menu-select (point)))
+(defun Electric-buffer-menu-mouse-select (event)
+ (interactive "e")
+ (select-window (posn-window (event-end event)))
+ (set-buffer (window-buffer (selected-window)))
+ (goto-char (posn-point (event-end event)))
+ (throw 'electric-buffer-menu-select (point)))
+
(defun Electric-buffer-menu-quit ()
"Leave Electric Buffer Menu, restoring previous window configuration.
-Does not execute select, save, or delete commands."
+Skip execution of select, save, and delete commands."
(interactive)
(throw 'electric-buffer-menu-select nil))
(defun Electric-buffer-menu-undefined ()
(interactive)
(ding)
- (message (if (and (eq (key-binding "\C-c\C-c") 'Electric-buffer-menu-quit)
+ (message "%s"
+ (if (and (eq (key-binding "\C-c\C-c") 'Electric-buffer-menu-quit)
(eq (key-binding " ") 'Electric-buffer-menu-select)
- (eq (key-binding help-key) 'Helper-help)
+ (eq (key-binding (char-to-string help-char)) 'Helper-help)
(eq (key-binding "?") 'Helper-describe-bindings))
(substitute-command-keys "Type C-c C-c to exit, Space to select, \\[Helper-help] for help, ? for commands")
(substitute-command-keys "\
(defun Electric-buffer-menu-mode-view-buffer ()
"View buffer on current line in Electric Buffer Menu.
-Returns to Electric Buffer Menu when done."
+Return to Electric Buffer Menu when done."
(interactive)
(let ((bufnam (Buffer-menu-buffer nil)))
(if bufnam
(message "Buffer %s does not exist!" bufnam)
(sit-for 4))))
+(defvar electric-buffer-overlay nil)
+(defun electric-buffer-update-highlight ()
+ (when (eq major-mode 'Electric-buffer-menu-mode)
+ ;; Make sure we have an overlay to use.
+ (or electric-buffer-overlay
+ (progn
+ (make-local-variable 'electric-buffer-overlay)
+ (setq electric-buffer-overlay (make-overlay (point) (point)))))
+ (move-overlay electric-buffer-overlay
+ (save-excursion (beginning-of-line) (point))
+ (save-excursion (end-of-line) (point)))
+ (overlay-put electric-buffer-overlay 'face 'highlight)))
+
+(provide 'ebuff-menu)
+
+;;; arch-tag: 1d4509b3-eece-4d4f-95ea-77c83eaf0275
;;; ebuff-menu.el ends here