diff lisp/prim/cmdloop1.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children 0293115a14e9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/prim/cmdloop1.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,151 @@
+;;; cmdloop.el
+;; Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+ 
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING.  If not, write to the Free
+;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Synched up with: Not in FSF.
+
+;; Written by Richard Mlynarik 8-Jul-92
+
+;; Putting this in lisp slows things down.
+
+(defun recursive-edit ()
+  "Invoke the editor command loop recursively.
+To get out of the recursive edit, a command can do `(throw 'exit nil)';
+that tells this function to return.
+Alternately, `(throw 'exit t)' makes this function signal an error."
+  (interactive)
+  (let ((command-loop-level (1+ command-loop-level)))
+    (redraw-modeline)
+    (let ((_buf (and (not (eq (current-buffer)
+			      (window-buffer (selected-window))))
+		     (current-buffer))))
+      (unwind-protect
+           ;; command_loop
+           (if (catch 'exit
+                 (let ((standard-output t)
+                       (standard-input t))
+                   ;; command_loop_2
+                   (while t (funcall command-loop t))))
+               ;; turn abort-recursive-edit into a quit
+               (signal 'quit '()))
+        (if _buf (set-buffer _buf))
+        (redraw-modeline)))
+    nil))
+
+;; We demand lexical scope!
+(defun command-loop (_catch_errors)
+  "This function is the default value of the variable command-loop."
+  (setq prefix-arg nil)
+  (setq last-command 't)
+  (cond ((not _catch_errors)
+         (command-loop-1))
+        ((> (recursion-depth) 0)
+         (while (condition-case e
+                    (command-loop-1)
+                  (t (command-error e) t))))
+        (t
+         (if (not (null top-level))
+             ;; On entry to the outer level, run the startup file
+             (condition-case e
+                 (catch 'top-level
+                   (eval top-level))
+               (t (command-error e))))
+
+	 ;; If an error occurred during startup and the initial device
+	 ;; wasn't created, then die now (the error was already printed out
+	 ;; on the terminal device).
+	 (if (and (not (noninteractive))
+		  (or (not (devicep (selected-device)))
+		      (eq 'terminal (device-type (selected-device)))))
+	     (kill-emacs -1))
+
+	 ;; End of -batch run causes exit here.
+         (if (noninteractive)
+             (kill-emacs t))
+
+         (catch 'top-level
+           (while (condition-case e
+                      (command-loop-1)
+                    (t (command-error e) t)))))))
+
+;; Putting this in lisp slows things down a lot; see also comment above.
+;(defun command-loop-1 ()
+;  (let ((_event (allocate-event))
+;      (_old-command-loop command-loop)
+;      ;; We deal with quits ourself
+;      (_old-inhibit-quit inhibit-quit)
+;      (inhibit-quit t))
+;
+;  ;; ## cancel_echoing();
+;
+;  ;; This magically makes single character keyboard macros work just
+;  ;; like the real thing.  This is slightly bogus, but it's in here for
+;  ;; compatibility with Emacs 18.
+;  ;; It's not even clear what the "right thing" is.
+;  (and executing-macro
+;       (eq (length executing-macro) 1)
+;       (setq last-command 't))
+;
+;  ;; Keep looping until somebody wants a different command-loop
+;  (while (eq command-loop _old-command-loop)
+;
+;    ;; Make sure current window's buffer is selected.
+;    (set-buffer (window-buffer (selected-window)))
+;
+;    ;; C code had a `QUIT' here so that if ^G was typed before we got here
+;    ;; (that is, before emacs was idle and waiting for input) then we treat
+;    ;; that as an interrupt.  The easiest way to do that here is to make a
+;    ;; function call (but pick one the compiler won't optimize away...)
+;    (let ((inhibit-quit _old-inhibit-quit)) (eval nil))
+;
+;    ;; This condition-case was originally just wrapped around the
+;    ;;  call to dispatch-event, but in fact we can have errors signalled
+;    ;;  by process-filters in either sit-for and next-event.  Those errors
+;    ;;  shouldn't be fatal to the command-loop, so we put the condition-case
+;    ;;  here and hope we're not hiding other bugs in the process.
+;    (condition-case e
+;        (progn
+;          (if (and (> (minibuffer-depth) 0)
+;                   (message-displayed-p))
+;              (progn
+;                (sit-for 2)
+;                (message nil)))
+;
+;          (next-event _event)
+;          ;; If ^G was typed while emacs was reading input from the user, 
+;          ;; then it is treated as just another key.  This is what v18
+;          ;; did.  This is bogus because it gives the illusion that one
+;          ;; can bind commands to sequences involving ^G, when really one
+;          ;; can only execute those sequences in non-typeahead contexts.
+;          (setq quit-flag nil)
+;
+;          (let ((inhibit-quit _old-inhibit-quit))
+;            (dispatch-event _event))
+;
+;          ;; check for bogus code trying to use the old method of unreading.
+;          (if (globally-boundp 'unread-command-char)
+;              (progn
+;                (makunbound 'unread-command-char)
+;                (error
+;                 "%S set unread-command-char instead of unread-command-event."
+;		   this-command)))
+;	    )
+;        (t
+;         (command-error e))))))
+
+(setq-default command-loop 'command-loop)