X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/69adebeb51104f53801e42b8444ae747a5241620..b83813ec2214046e9a2448058d4ede8e0062c0c4:/lisp/ebuff-menu.el diff --git a/lisp/ebuff-menu.el b/lisp/ebuff-menu.el index b776012158..9323c8133e 100644 --- a/lisp/ebuff-menu.el +++ b/lisp/ebuff-menu.el @@ -1,8 +1,11 @@ ;;; ebuff-menu.el --- electric-buffer-list mode -;; Copyright (C) 1985, 1986, 1994 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1986, 1994, 2001, 2002, 2003, 2004, +;; 2005, 2006, 2007 Free Software Foundation, Inc. ;; Author: Richard Mlynarik +;; Maintainer: FSF +;; Keywords: convenience ;; This file is part of GNU Emacs. @@ -17,8 +20,9 @@ ;; 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: @@ -35,9 +39,12 @@ (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. @@ -47,30 +54,32 @@ window, marking buffers to be selected, saved or deleted. 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 Return to bury the buffer list >>>") (if (eq (setq unread-command-events (list (read-event))) - ?\ ) + ?\s) (progn (setq unread-command-events nil) (throw 'electric-buffer-menu-select nil))) (let ((start-point (point)) (first (progn (goto-char (point-min)) - (forward-line 2) + (unless Buffer-menu-use-header-line + (forward-line 2)) (point))) (last (progn (goto-char (point-max)) (forward-line -1) @@ -108,12 +117,16 @@ Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil. (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 () @@ -137,9 +150,11 @@ Letters do not insert themselves; instead, they are commands. \\{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") @@ -150,17 +165,16 @@ electric-buffer-menu-mode-hook if it is non-nil." (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) (put 'Electric-buffer-menu-undefined 'suppress-keymap t) (if electric-buffer-menu-mode-map nil - (let ((map (make-keymap)) (submap (make-keymap))) + (let ((map (make-keymap))) (fillarray (car (cdr map)) 'Electric-buffer-menu-undefined) - (define-key map "\e" submap) - (fillarray (car (cdr submap)) '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 (char-to-string help-char) 'Helper-help) @@ -205,7 +219,7 @@ electric-buffer-menu-mode-hook if it is non-nil." (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-events (listify-key-sequence (this-command-keys))) @@ -217,8 +231,8 @@ electric-buffer-menu-mode-hook if it is non-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))) @@ -231,14 +245,15 @@ Selects buffer at point and displays buffers marked \">\" in other windows." (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 (char-to-string help-char)) 'Helper-help) (eq (key-binding "?") 'Helper-describe-bindings)) @@ -251,7 +266,7 @@ Type \\[Electric-buffer-menu-quit] to exit, \ (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 @@ -260,4 +275,20 @@ Returns to Electric Buffer Menu when done." (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