annotate src/cmdloop.c @ 4539:061e030e3270

Fix some bugs in load-history construction, built-in symbol file names. lib-src/ChangeLog addition: 2008-12-27 Aidan Kehoe <kehoea@parhasard.net> * make-docfile.c (main): Allow more than one -d argument, followed by a directory to change to. (put_filename): Don't strip directory information; with previous change, allows retrieval of Lisp function and variable origin files from #'built-in-symbol-file relative to lisp-directory. (scan_lisp_file): Don't add an extraneous newline after the file name, put_filename has added the newline already. lisp/ChangeLog addition: 2008-12-27 Aidan Kehoe <kehoea@parhasard.net> * loadup.el (load-history): Add the contents of current-load-list to load-history before clearing it. Move the variable declarations earlier in the file to a format understood by make-docfile.c. * custom.el (custom-declare-variable): Add the variable's symbol to the current file's load history entry correctly, don't use a cons. Eliminate a comment that we don't need to worry about, we don't need to check the `initialized' C variable in Lisp. * bytecomp.el (byte-compile-output-file-form): Merge Andreas Schwab's pre-GPLv3 GNU change of 19970831 here; treat #'custom-declare-variable correctly, generating the docstrings in a format understood by make-docfile.c. * loadhist.el (symbol-file): Correct behaviour for checking autoloaded macros and functions when supplied with a TYPE argument. Accept fully-qualified paths from #'built-in-symbol-file; if a path is not fully-qualified, return it relative to lisp-directory if the filename corresponds to a Lisp file, and relative to (concat source-directory "/src/") otherwise. * make-docfile.el (preloaded-file-list): Rationalise some let bindings a little. Use the "-d" argument to make-docfile.c to supply Lisp paths relative to lisp-directory, not absolutely. Add in loadup.el explicitly to the list of files to be processed by make-docfile.c--it doesn't make sense to add it to preloaded-file-list, since that is used for purposes of byte-compilation too. src/ChangeLog addition: 2008-12-27 Aidan Kehoe <kehoea@parhasard.net> * doc.c (Fbuilt_in_symbol_file): Return a subr's filename immediately if we've found it. Check for compiled function and compiled macro docstrings in DOC too, and return them if they exist. The branch of the if statement focused on functions may have executed, but we may still want to check variable bindings; an else clause isn't appropriate.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 27 Dec 2008 14:05:50 +0000
parents facf3239ba30
children 3465c3161fea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Editor command loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
2532
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 2286
diff changeset
3 Copyright (C) 1995, 1996, 2001, 2002, 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 /* Synched up with: Mule 2.0. Not synched with FSF.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 This was renamed from keyboard.c. However, it only contains the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 command-loop stuff from FSF's keyboard.c; all the rest is in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 event*.c, console.c, or signal.c. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* #### This module purports to separate out the command-loop stuff
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 from event-stream.c, but it doesn't really. Perhaps this file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 should just be merged into event-stream.c, given its shortness. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "buffer.h"
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
35 #include "console-impl.h"
800
a5954632b187 [xemacs-hg @ 2002-03-31 08:27:14 by ben]
ben
parents: 771
diff changeset
36 #include "device.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "commands.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "events.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
42 #ifdef HAVE_MS_WINDOWS
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
43 #include "console-msw.h"
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
44 #endif
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
45
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 /* Current depth in recursive edits. */
458
c33ae14dd6d0 Import from CVS: tag r21-2-44
cvs
parents: 444
diff changeset
47 Fixnum command_loop_level;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 #ifndef LISP_COMMAND_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 /* Form to evaluate (if non-nil) when Emacs is started. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 Lisp_Object Vtop_level;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 /* Function to call to evaluate to read and process events. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Lisp_Object Vcommand_loop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #endif /* LISP_COMMAND_LOOP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 Lisp_Object Venter_window_hook, Vleave_window_hook;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
733
b1f74adcc1ff [xemacs-hg @ 2002-01-22 20:40:00 by janv]
janv
parents: 563
diff changeset
59 Lisp_Object Qdisabled_command_hook, Vdisabled_command_hook;
b1f74adcc1ff [xemacs-hg @ 2002-01-22 20:40:00 by janv]
janv
parents: 563
diff changeset
60
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 /* The error handler. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 Lisp_Object Qcommand_error;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 /* The emergency error handler, before we're ready. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 Lisp_Object Qreally_early_error_handler;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 /* Variable defined in Lisp. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 Lisp_Object Qerrors_deactivate_region;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 Lisp_Object Qtop_level;
1703
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
71 Lisp_Object Vminibuffer_echo_wait_function;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
73 #ifdef LISP_COMMAND_LOOP
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 static Lisp_Object command_loop_1 (Lisp_Object dummy);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 EXFUN (Fcommand_loop_1, 0);
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
76 #else
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
77 static DECLARE_DOESNT_RETURN_TYPE (Lisp_Object,
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
78 command_loop_1 (Lisp_Object dummy));
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
79 EXFUN_NORETURN (Fcommand_loop_1, 0);
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
80 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 /* There are two possible command loops -- one written entirely in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 C and one written mostly in Lisp, except stuff written in C for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 speed. The advantage of the Lisp command loop is that the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 can specify their own command loop to use by changing the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 `command-loop'. Its disadvantage is that it's slow. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 default_error_handler (Lisp_Object data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 /* None of this is invoked, normally. This code is almost identical
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 to the `command-error' function, except `command-error' does cool
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 tricks with sounds. This function is a fallback, invoked if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 command-error is unavailable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 Fding (Qnil, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 if (!NILP (Fboundp (Qerrors_deactivate_region))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 && !NILP (Fsymbol_value (Qerrors_deactivate_region)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 zmacs_deactivate_region ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 Fdiscard_input ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 Vstandard_output = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 Vstandard_input = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 Vexecuting_macro = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 Fset (intern ("last-error"), data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 clear_echo_area (selected_frame (), Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 Fdisplay_error (data, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 check_quit (); /* make Vquit_flag accurate */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 Vquit_flag = Qnil;
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
113 return (unbind_to_1 (speccount, Qt));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
116 DEFUN_NORETURN ("really-early-error-handler", Freally_early_error_handler,
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
117 1, 1, 0, /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 You should almost certainly not be using this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 /* This is an error handler used when we're running temacs and when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 we're in the early stages of XEmacs. No errors ought to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 occurring in those cases (or they ought to be trapped and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 dealt with elsewhere), but if an error slips through, we need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 to deal with it. We could write this function in Lisp (and it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 used to be this way, at the beginning of loadup.el), but we do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 it this way in case an error occurs before we get to loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 loadup.el. Note that there is also an `early-error-handler',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 used in startup.el to catch more reasonable errors that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 might occur during startup if the sysadmin or whoever fucked
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 up. This function is more conservative in what it does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 and is used only as a last resort, indicating that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 programmer himself fucked up somewhere. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 stderr_out ("*** Error in XEmacs initialization");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 Fprint (x, Qexternal_debugging_output);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 stderr_out ("*** Backtrace\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 Fbacktrace (Qexternal_debugging_output, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 stderr_out ("*** Killing XEmacs\n");
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 434
diff changeset
140 #ifdef HAVE_MS_WINDOWS
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
141 Fmswindows_message_box (build_msg_string ("Initialization error"),
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 434
diff changeset
142 Qnil, Qnil);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 434
diff changeset
143 #endif
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
144 Fkill_emacs (make_int (-1));
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
145 RETURN_NOT_REACHED (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 /* Command-loop (in C) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 #ifndef LISP_COMMAND_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 /* The guts of the command loop are in command_loop_1(). This function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 doesn't catch errors, though -- that's the job of command_loop_2(),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 which is a condition-case wrapper around command_loop_1().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 command_loop_1() never returns, but may get thrown out of.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 When an error occurs, cmd_error() is called, which usually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 invokes the Lisp error handler in `command-error'; however,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 a default error handler is provided if `command-error' is nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (e.g. during startup). The purpose of the error handler is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 simply to display the error message and do associated cleanup;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 it does not need to throw anywhere. When the error handler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 finishes, the condition-case in command_loop_2() will finish and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 command_loop_2() will reinvoke command_loop_1().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 command_loop_2() is invoked from three places: from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 initial_command_loop() (called from main() at the end of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 internal initialization), from the Lisp function `recursive-edit',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 and from call_command_loop().
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 call_command_loop() is called when a macro is started and when the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 minibuffer is entered; normal termination of the macro or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 minibuffer causes a throw out of the recursive command loop. (To
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2532
diff changeset
177 `execute-kbd-macro' for macros and `exit' for minibuffers. Note also
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 that the low-level minibuffer-entering function,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 `read-minibuffer-internal', provides its own error handling and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 does not need command_loop_2()'s error encapsulation; so it tells
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 call_command_loop() to invoke command_loop_1() directly.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 Note that both read-minibuffer-internal and recursive-edit set
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2532
diff changeset
184 up a catch for `exit'; this is why `abort-recursive-edit', which
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 throws to this catch, exits out of either one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 initial_command_loop(), called from main(), sets up a catch
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2532
diff changeset
188 for `top-level' when invoking command_loop_2(), allowing functions
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 to throw all the way to the top level if they really need to.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 Before invoking command_loop_2(), initial_command_loop() calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 top_level_1(), which handles all of the startup stuff (creating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 the initial frame, handling the command-line options, loading
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 the user's .emacs file, etc.). The function that actually does this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 is in Lisp and is pointed to by the variable `top-level';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 normally this function is `normal-top-level'. top_level_1() is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 just an error-handling wrapper similar to command_loop_2().
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2532
diff changeset
197 Note also that initial_command_loop() sets up a catch for `top-level'
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 when invoking top_level_1(), just like when it invokes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 command_loop_2(). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 static Lisp_Object
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2268
diff changeset
203 cmd_error (Lisp_Object data, Lisp_Object UNUSED (dummy))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 check_quit (); /* make Vquit_flag accurate */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 any_console_state ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 if (!NILP (Ffboundp (Qcommand_error)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 return call1 (Qcommand_error, data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 return default_error_handler (data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 static Lisp_Object
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2268
diff changeset
218 top_level_1 (Lisp_Object UNUSED (dummy))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 /* On entry to the outer level, run the startup file */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 if (!NILP (Vtop_level))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 condition_case_1 (Qerror, Feval, Vtop_level, cmd_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 #if 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 message ("\ntemacs can only be run in -batch mode.");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 noninteractive = 1; /* prevent things under kill-emacs from blowing up */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 Fkill_emacs (make_int (-1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 else if (purify_flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 message ("Bare impure Emacs (standard Lisp code not loaded)");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 message ("Bare Emacs (standard Lisp code not loaded)");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 /* Here we catch errors in execution of commands within the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 editing loop, and reenter the editing loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 When there is an error, cmd_error runs and the call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 to condition_case_1() returns. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 /* Avoid confusing the compiler. A helper function for command_loop_2 */
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
247 static DECLARE_DOESNT_RETURN (command_loop_3 (void));
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
248
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 static DOESNT_RETURN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 command_loop_3 (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 /*
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
253 * If we are inside of a menu callback we cannot reenter the command loop
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
254 * because we will deadlock, as no input is allowed.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 */
1268
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
256 if (in_modal_loop)
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
257 invalid_operation ("Attempt to enter command loop inside menu callback",
fffe735e63ee [xemacs-hg @ 2003-02-07 11:50:50 by ben]
ben
parents: 1204
diff changeset
258 Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 condition_case_1 (Qerror, command_loop_1, Qnil, cmd_error, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 /* #### wrong with selected-console? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 /* See command in initial_command_loop about why this value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 is 0. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 reset_this_command_keys (Vselected_console, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
270 static DECLARE_DOESNT_RETURN_TYPE (Lisp_Object, command_loop_2 (Lisp_Object));
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
271
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
272 static DOESNT_RETURN_TYPE (Lisp_Object)
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2268
diff changeset
273 command_loop_2 (Lisp_Object UNUSED (dummy))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 command_loop_3(); /* doesn't return */
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
276 RETURN_NOT_REACHED (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 /* This is called from emacs.c when it's done with initialization. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 DOESNT_RETURN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 initial_command_loop (Lisp_Object load_me)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 if (!NILP (load_me))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 Vtop_level = list2 (Qload, load_me);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 /* First deal with startup and command-line arguments. A throw
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2532
diff changeset
289 to `top-level' gets us back here directly (does this ever happen?).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 Otherwise, this function will return normally when all command-
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 line arguments have been processed, the user's initialization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 file has been read in, and the first frame has been created. */
2532
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 2286
diff changeset
293 internal_catch (Qtop_level, top_level_1, Qnil, 0, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 /* If an error occurred during startup and the initial console
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 wasn't created, then die now (the error was already printed out
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 on the terminal device). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 if (!noninteractive &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 (!CONSOLEP (Vselected_console) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 CONSOLE_STREAM_P (XCONSOLE (Vselected_console))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 Fkill_emacs (make_int (-1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 /* End of -batch run causes exit here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 if (noninteractive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 Fkill_emacs (Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 command_loop_level = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 MARK_MODELINE_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 /* Now invoke the command loop. It never returns; however, a
3025
facf3239ba30 [xemacs-hg @ 2005-10-25 11:16:19 by ben]
ben
parents: 2532
diff changeset
312 throw to `top-level' will place us at the end of this loop. */
2532
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 2286
diff changeset
313 internal_catch (Qtop_level, command_loop_2, Qnil, 0, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 /* #### wrong with selected-console? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 /* We don't actually call clear_echo_area() here, partially
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 at least because that runs Lisp code and it may be unsafe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 to do so -- we are outside of the normal catches for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 errors and such. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 reset_this_command_keys (Vselected_console, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 /* This function is invoked when a macro or minibuffer starts up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 Normal termination of the macro or minibuffer causes a throw past us.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 See the comment above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 Note that this function never returns (but may be thrown out of). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
329 DOESNT_RETURN_TYPE (Lisp_Object)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 call_command_loop (Lisp_Object catch_errors)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 if (NILP (catch_errors))
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
334 command_loop_1 (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 else
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
336 command_loop_2 (Qnil);
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
337 RETURN_NOT_REACHED (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 recursive_edit_unwind (Lisp_Object buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 if (!NILP (buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 Fset_buffer (buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 command_loop_level--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 MARK_MODELINE_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 DEFUN ("recursive-edit", Frecursive_edit, 0, 0, "", /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 Invoke the editor command loop recursively.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 To get out of the recursive edit, a command can do `(throw 'exit nil)';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 that tells this function to return.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 Alternately, `(throw 'exit t)' makes this function signal an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 Lisp_Object val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 int speccount = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 command_loop_level++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 MARK_MODELINE_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 record_unwind_protect (recursive_edit_unwind,
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
368 current_buffer
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
369 != XWINDOW_XBUFFER (Fselected_window (Qnil))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 ? Fcurrent_buffer ()
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
371 : Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 specbind (Qstandard_output, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 specbind (Qstandard_input, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375
2532
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 2286
diff changeset
376 val = internal_catch (Qexit, command_loop_2, Qnil, 0, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 if (EQ (val, Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 /* Turn abort-recursive-edit into a quit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 Fsignal (Qquit, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
382 return unbind_to (speccount);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 #endif /* !LISP_COMMAND_LOOP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 /* Alternate command-loop (largely in Lisp) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 #ifdef LISP_COMMAND_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 load1 (Lisp_Object name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 call4 (Qload, name, Qnil, Qt, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 return (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 /* emergency backups for cold-load-stream use */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 cold_load_command_error (Lisp_Object datum, Lisp_Object ignored)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 check_quit (); /* make Vquit_flag accurate */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 Vquit_flag = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 return default_error_handler (datum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 cold_load_command_loop (Lisp_Object dummy)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 return (condition_case_1 (Qt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 command_loop_1, Qnil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 cold_load_command_error, Qnil));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
422 DOESNT_RETURN_TYPE (Lisp_Object)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 call_command_loop (Lisp_Object catch_errors)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 /* This function can GC */
479
52626a2f02ef [xemacs-hg @ 2001-04-20 11:31:53 by ben]
ben
parents: 458
diff changeset
426 reset_this_command_keys (Vselected_console, 0); /* #### bleagh */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 loop:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 if (NILP (Vcommand_loop))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 call1 (Vcommand_loop, catch_errors);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 /* This isn't a "correct" definition, but you're pretty hosed if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 you broke "command-loop" anyway */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 /* #### not correct with Vselected_console */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 XCONSOLE (Vselected_console)->prefix_arg = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 if (NILP (catch_errors))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 Fcommand_loop_1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 else
2532
989a7680c221 [xemacs-hg @ 2005-01-29 09:15:55 by ben]
ben
parents: 2286
diff changeset
443 internal_catch (Qtop_level, cold_load_command_loop, Qnil, 0, 0, 0);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 goto loop;
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
445 RETURN_NOT_REACHED (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 initial_error_handler (Lisp_Object datum, Lisp_Object ignored)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 Vcommand_loop = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 Fding (Qnil, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 if (CONSP (datum) && EQ (XCAR (datum), Qquit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 /* Don't bother with the message */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 return (Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 message ("Error in command-loop!!");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 Fset (intern ("last-error"), datum); /* #### Better/different name? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 Fsit_for (make_int (2), Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 cold_load_command_error (datum, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 return (Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 DOESNT_RETURN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 initial_command_loop (Lisp_Object load_me)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 if (!NILP (load_me))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 if (!NILP (condition_case_1 (Qt, load1, load_me,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 initial_error_handler, Qnil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 Fkill_emacs (make_int (-1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 command_loop_level = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 MARK_MODELINE_CHANGED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 condition_case_1 (Qt,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 call_command_loop, Qtop_level,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 initial_error_handler, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 #endif /* LISP_COMMAND_LOOP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 /* Guts of command loop */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
495 #ifdef LISP_COMMAND_LOOP
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 static Lisp_Object
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
497 #else
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
498 static DOESNT_RETURN_TYPE (Lisp_Object)
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
499 #endif
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 2268
diff changeset
500 command_loop_1 (Lisp_Object UNUSED (dummy))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 /* #### not correct with Vselected_console */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 XCONSOLE (Vselected_console)->prefix_arg = Qnil;
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
505 Fcommand_loop_1 ();
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
506 #ifdef LISP_COMMAND_LOOP
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
507 return Qnil;
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
508 #else
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
509 RETURN_NOT_REACHED (Qnil);
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
510 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 /* This is the actual command reading loop, sans error-handling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 encapsulation. This is used for both the C and Lisp command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 loops. Originally this function was written in Lisp when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 the Lisp command loop was used, but it was too slow that way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 Under the C command loop, this function will never return
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (although someone might throw past it). Under the Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 command loop, this will return only when the user specifies
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 a new command loop by changing the command-loop variable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522
2268
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
523 #ifdef LISP_COMMAND_LOOP
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
524 #define DEFUN_COMMAND_LOOP(a,b,c,d,e,f) DEFUN (a, b, c, d, e, f)
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
525 #else
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
526 #define DEFUN_COMMAND_LOOP(a,b,c,d,e,f) DEFUN_NORETURN (a, b, c, d, e, f)
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
527 #endif
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
528
61855263cb07 [xemacs-hg @ 2004-09-14 14:32:29 by james]
james
parents: 1703
diff changeset
529 DEFUN_COMMAND_LOOP ("command-loop-1", Fcommand_loop_1, 0, 0, 0, /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 Invoke the internals of the canonical editor command loop.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 Don't call this unless you know what you're doing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 Lisp_Object event = Fmake_event (Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 Lisp_Object old_loop = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 int was_locked = in_single_console_state ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 GCPRO2 (event, old_loop);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 /* cancel_echoing (); */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 /* This magically makes single character keyboard macros work just
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 like the real thing. This is slightly bogus, but it's in here for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 compatibility with Emacs 18. It's not even clear what the "right
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 thing" is. */
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
547 if (!((STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro))
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
548 && XINT (Flength (Vexecuting_macro)) == 1))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 Vlast_command = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 #ifndef LISP_COMMAND_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 old_loop = Vcommand_loop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 while (EQ (Vcommand_loop, old_loop))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 #endif /* LISP_COMMAND_LOOP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 /* If focus_follows_mouse, make sure the frame with window manager
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 focus is selected. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 if (focus_follows_mouse)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 investigate_frame_change ();
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
562
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 /* Make sure the current window's buffer is selected. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 Lisp_Object selected_window = Fselected_window (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 if (!NILP (selected_window) &&
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
568 XWINDOW_XBUFFER (selected_window) != current_buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 {
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 853
diff changeset
570 set_buffer_internal (XWINDOW_XBUFFER (selected_window));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
574 #if 0 /* What's wrong with going through ordinary procedure of quit?
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
575 quitting here leaves overriding-terminal-local-map
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
576 when you type C-u C-u C-g. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 /* If ^G was typed before we got here (that is, before emacs was
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 idle and waiting for input) then we treat that as an interrupt. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 QUIT;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
580 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 /* If minibuffer on and echo area in use, wait 2 sec and redraw
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 minibuffer. Treat a ^G here as a command, not an interrupt.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 if (minibuf_level > 0 && echo_area_active (selected_frame ()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 /* Bind dont_check_for_quit to 1 so that C-g gets read in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 rather than quitting back to the minibuffer. */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
589 int count = begin_dont_check_for_quit ();
1703
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
590 if (!NILP (Vminibuffer_echo_wait_function))
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
591 call0 (Vminibuffer_echo_wait_function);
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
592 else
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
593 Fsit_for (make_int (2), Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 clear_echo_area (selected_frame (), Qnil, 0);
853
2b6fa2618f76 [xemacs-hg @ 2002-05-28 08:44:22 by ben]
ben
parents: 800
diff changeset
595 Vquit_flag = Qnil; /* see begin_dont_check_for_quit() */
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 733
diff changeset
596 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 Fnext_event (event, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 Fdispatch_event (event);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 if (!was_locked)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 any_console_state ();
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 872
diff changeset
604
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 872
diff changeset
605 DO_NOTHING_DISABLING_NO_RETURN_WARNINGS;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 #ifdef LISP_COMMAND_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 return Qnil;
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 872
diff changeset
610 #else
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 872
diff changeset
611 RETURN_NOT_REACHED (Qnil);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 /* Initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 /**********************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 syms_of_cmdloop (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 {
733
b1f74adcc1ff [xemacs-hg @ 2002-01-22 20:40:00 by janv]
janv
parents: 563
diff changeset
623 DEFSYMBOL (Qdisabled_command_hook);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 479
diff changeset
624 DEFSYMBOL (Qcommand_error);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 479
diff changeset
625 DEFSYMBOL (Qreally_early_error_handler);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 479
diff changeset
626 DEFSYMBOL (Qtop_level);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 479
diff changeset
627 DEFSYMBOL (Qerrors_deactivate_region);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 #ifndef LISP_COMMAND_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 DEFSUBR (Frecursive_edit);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 DEFSUBR (Freally_early_error_handler);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 DEFSUBR (Fcommand_loop_1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 vars_of_cmdloop (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 DEFVAR_INT ("command-loop-level", &command_loop_level /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 Number of recursive edits in progress.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 command_loop_level = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 DEFVAR_LISP ("disabled-command-hook", &Vdisabled_command_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 Value is called instead of any command that is disabled,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 i.e. has a non-nil `disabled' property.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 Vdisabled_command_hook = intern ("disabled-command-hook");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 DEFVAR_LISP ("leave-window-hook", &Vleave_window_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 Not yet implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 Vleave_window_hook = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 DEFVAR_LISP ("enter-window-hook", &Venter_window_hook /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 Not yet implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 Venter_window_hook = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659
1703
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
660 DEFVAR_LISP ("minibuffer-echo-wait-function",
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
661 &Vminibuffer_echo_wait_function /*
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
662 The function called by command loop when minibuffer was active and
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
663 message was displayed (text appeared in \" *Echo Area*\" buffer). It
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
664 must wait after displaying message so that user can read it. If the
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
665 variable value is `nil', the equivalent of `(sit-for 2)' is run.
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
666 */ );
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
667 Vminibuffer_echo_wait_function = Qnil;
f561c3904bb3 [xemacs-hg @ 2003-09-20 01:46:53 by youngs]
youngs
parents: 1268
diff changeset
668
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 #ifndef LISP_COMMAND_LOOP
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 DEFVAR_LISP ("top-level", &Vtop_level /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 Form to evaluate when Emacs starts up.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 Useful to set before you dump a modified Emacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 Vtop_level = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 DEFVAR_LISP ("command-loop", &Vcommand_loop /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 Function or one argument to call to read and process keyboard commands.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 The passed argument specifies whether or not to handle errors.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 */ );
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 Vcommand_loop = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 #endif /* LISP_COMMAND_LOOP */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 }