X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/8892e83c7c27d449031dd7939dcc7dee3524f49c..3c53a3cf83c218772d9bcfde4cd60c1face33e93:/lisp/ebuff-menu.el diff --git a/lisp/ebuff-menu.el b/lisp/ebuff-menu.el index f9bb8adf3b..3d2f87b04b 100644 --- a/lisp/ebuff-menu.el +++ b/lisp/ebuff-menu.el @@ -1,8 +1,10 @@ ;;; ebuff-menu.el --- electric-buffer-list mode -;; Copyright (C) 1985, 1986 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1986, 1994 Free Software Foundation, Inc. ;; Author: Richard Mlynarik +;; Maintainer: FSF +;; Keywords: convenience ;; This file is part of GNU Emacs. @@ -17,13 +19,15 @@ ;; 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., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, 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: @@ -54,26 +58,33 @@ Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil. (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)) + (let ((start-point (point)) + (first (progn (goto-char (point-min)) (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 @@ -106,7 +117,8 @@ Calls value of `electric-buffer-menu-mode-hook' on entry if non-nil. (goto-char (point-max)) (forward-line -1) (if (pos-visible-in-window-p (point-max)) - (recenter -1))))) + (recenter -1)))) + (electric-buffer-update-highlight)) (put 'Electric-buffer-menu-mode 'mode-class 'special) (defun Electric-buffer-menu-mode () @@ -151,9 +163,8 @@ electric-buffer-menu-mode-hook if it is non-nil." (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 (char-to-string help-char) 'Helper-help) @@ -163,6 +174,7 @@ electric-buffer-menu-mode-hook if it is non-nil." (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) @@ -192,11 +204,15 @@ electric-buffer-menu-mode-hook if it is non-nil." (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) @@ -210,6 +226,13 @@ Selects buffer at point and displays 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." @@ -219,9 +242,10 @@ Does not execute select, save, or delete commands." (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 "\ @@ -241,4 +265,18 @@ 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 () + ;; 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) + ;;; ebuff-menu.el ends here