javascript-generic-mode: Added C style block comment as used in ECMA-262
[bpt/emacs.git] / lisp / ebuff-menu.el
index 6b5a8b6..3d2f87b 100644 (file)
@@ -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 <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., 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,18 +163,18 @@ 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 "\C-h" '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)
@@ -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,11 +242,12 @@ 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 "\C-h") 'Helper-help)
+                   (eq (key-binding (char-to-string help-char)) 'Helper-help)
                    (eq (key-binding "?") 'Helper-describe-bindings))
-              "Type C-c C-c to exit, Space to select, C-h for help, ? for commands"
+              (substitute-command-keys "Type C-c C-c to exit, Space to select, \\[Helper-help] for help, ? for commands")
             (substitute-command-keys "\
 Type \\[Electric-buffer-menu-quit] to exit, \
 \\[Electric-buffer-menu-select] to select, \
@@ -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