Mercurial > hg > xemacs-beta
view src/cmdloop.c @ 1314:15a91d7ae2d1
[xemacs-hg @ 2003-02-20 08:16:21 by ben]
check in makefile fixes et al
Makefile.in.in: Major surgery. Move all stuff related to building anything in the
src/ directory into src/. Simplify the dependencies -- everything
in src/ is dependent on the single entry `src' in MAKE_SUBDIRS.
Remove weirdo targets like `all-elc[s]', dump-elc[s], etc.
mule/mule-msw-init.el: Removed.
Delete this file.
mule/mule-win32-init.el: New file, with stuff from mule-msw-init.el -- not just for MS Windows
native, boys and girls!
bytecomp.el: Change code inserted to catch trying to load a Mule-only .elc
file in a non-Mule XEmacs. Formerly you got the rather cryptic
"The required feature `mule' cannot be provided". Now you get
"Loading this file requires Mule support".
finder.el: Remove dependency on which directory this function is invoked
from.
update-elc.el: Don't mess around with ../src/BYTECOMPILE_CHANGE. Now that
Makefile.in.in and xemacs.mak are in sync, both of them use
NEEDTODUMP and the other one isn't used.
dumped-lisp.el: Rewrite in terms of `list' and `nconc' instead of assemble-list, so
we can have arbitrary forms, not just `when-feature'.
very-early-lisp.el: Nuke this file.
finder-inf.el, packages.el, update-elc.el, update-elc-2.el, loadup.el, make-docfile.el: Eliminate references to very-early-lisp.
msw-glyphs.el: Comment clarification.
xemacs.mak: Add macros DO_TEMACS, DO_XEMACS, and a few others; this macro
section is now completely in sync with src/Makefile.in.in. Copy
check-features, load-shadows, and rebuilding finder-inf.el from
src/Makefile.in.in. The main build/dump/recompile process is now
synchronized with src/Makefile.in.in. Change `WARNING' to `NOTE'
and `error checking' to `error-checking' TO avoid tripping
faux warnings and errors in the VC++ IDE.
Makefile.in.in: Major surgery. Move all stuff related to building anything in the
src/ directory from top-level Makefile.in.in to here. Simplify
the dependencies. Rearrange into logical subsections.
Synchronize the main compile/dump/build-elcs section with
xemacs.mak, which is already clean and in good working order.
Remove weirdo targets like `all-elc[s]', dump-elc[s], etc. Add
additional levels of macros \(e.g. DO_TEMACS, DO_XEMACS,
TEMACS_BATCH, XEMACS_BATCH, XEMACS_BATCH_PACKAGES) to factor out
duplicated stuff. Clean up handling of "HEAP_IN_DATA" (Cygwin) so
it doesn't need to ignore the return value from dumping. Add
.NO_PARALLEL since various aspects of building and dumping must be
serialized but do not always have dependencies between them
(this is impossible in some cases). Everything related to src/
now gets built in one pass in this directory by just running
`make' (except the Makefiles themselves and config.h, paths.h,
Emacs.ad.h, and other generated .h files).
console.c: Update list of possibly valid console types.
emacs.c: Rationalize the specifying and handling of the type of the first
frame. This was originally prompted by a workspace in which I got
GTK to compile under C++ and in the process fixed it so it could
coexist with X in the same build -- hence, a combined
TTY/X/MS-Windows/GTK build is now possible under Cygwin. (However,
you can't simultaneously *display* more than one kind of device
connection -- but getting that to work is not that difficult.
Perhaps a project for a bored grad student. I (ben) would do it
but don't see the use.) To make sense of this, I added new
switches that can be used to specifically indicate the window
system: -x [aka --use-x], -tty \[aka --use-tty], -msw [aka
--use-ms-windows], -gtk [aka --use-gtk], and -gnome [aka
--use-gnome, same as --use-gtk]. -nw continues as an alias for
-tty. When none have been given, XEmacs checks for other
parameters implying particular device types (-t -> tty, -display
-> x [or should it have same treatment as DISPLAY below?]), and
has ad-hoc logic afterwards: if env var DISPLAY is set, use x (or
gtk? perhaps should check whether gnome is running), else MS
Windows if it exsits, else TTY if it exists, else stream, and you
must be running in batch mode. This also fixes an existing bug
whereby compiling with no x, no mswin, no tty, when running non-
interactively (e.g. to dump) I get "sorry, must have TTY support".
emacs.c: Turn on Vstack_trace_on_error so that errors are debuggable even
when occurring extremely early in reinitialization.
emacs.c: Try to make sure that the user can see message output under
Windows (i.e. it doesn't just disappear right away) regardless of
when it occurs, e.g. in the middle of creating the first frame.
emacs.c: Define new function `emacs-run-status', indicating whether XEmacs
is noninteractive or interactive, whether raw,
post-dump/pdump-load or run-temacs, whether we are dumping,
whether pdump is in effect.
event-stream.c: It's "mommas are fat", not "momas are fat".
Fix other typo.
event-stream.c: Conditionalize in_menu_callback check on HAVE_MENUBARS,
because it won't exist on w/o menubar support,
lisp.h: More hackery on RETURN_NOT_REACHED. Cygwin v3.2 DOES complain here
if RETURN_NOT_REACHED() is blank, as it is for GCC 2.5+. So make it
blank only for GCC 2.5 through 2.999999999999999.
Declare Vstack_trace_on_error.
profile.c: Need to include "profile.h" to fix warnings.
sheap.c: Don't fatal() when need to rerun Make, just stderr_out() and exit(0).
That way we can distinguish between a dumping failing expectedly
(due to lack of stack space, triggering another dump) and unexpectedly,
in which case, we want to stop building. (or go on, if -K is given)
syntax.c, syntax.h: Use ints where they belong, and enum syntaxcode's where they belong,
and fix warnings thereby.
syntax.h: Fix crash caused by an edge condition in the syntax-cache macros.
text.h: Spacing fixes.
xmotif.h: New file, to get around shadowing warnings.
EmacsManager.c, event-Xt.c, glyphs-x.c, gui-x.c, input-method-motif.c, xmmanagerp.h, xmprimitivep.h: Include xmotif.h.
alloc.c: Conditionalize in_malloc on ERROR_CHECK_MALLOC.
config.h.in, file-coding.h, fileio.c, getloadavg.c, select-x.c, signal.c, sysdep.c, sysfile.h, systime.h, text.c, unicode.c: Eliminate HAVE_WIN32_CODING_SYSTEMS, use WIN32_ANY instead.
Replace defined (WIN32_NATIVE) || defined (CYGWIN) with WIN32_ANY.
lisp.h: More futile attempts to walk and chew gum at the same time when
dealing with subr's that don't return.
| author | ben |
|---|---|
| date | Thu, 20 Feb 2003 08:16:21 +0000 |
| parents | fffe735e63ee |
| children | f561c3904bb3 |
line wrap: on
line source
/* Editor command loop. Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. Copyright (C) 1995, 1996, 2001, 2002 Ben Wing. 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Synched up with: Mule 2.0. Not synched with FSF. This was renamed from keyboard.c. However, it only contains the command-loop stuff from FSF's keyboard.c; all the rest is in event*.c, console.c, or signal.c. */ /* #### This module purports to separate out the command-loop stuff from event-stream.c, but it doesn't really. Perhaps this file should just be merged into event-stream.c, given its shortness. */ #include <config.h> #include "lisp.h" #include "buffer.h" #include "console-impl.h" #include "device.h" #include "commands.h" #include "frame.h" #include "events.h" #include "window.h" #ifdef HAVE_MS_WINDOWS #include "console-msw.h" #endif /* Current depth in recursive edits. */ Fixnum command_loop_level; #ifndef LISP_COMMAND_LOOP /* Form to evaluate (if non-nil) when Emacs is started. */ Lisp_Object Vtop_level; #else /* Function to call to evaluate to read and process events. */ Lisp_Object Vcommand_loop; #endif /* LISP_COMMAND_LOOP */ Lisp_Object Venter_window_hook, Vleave_window_hook; Lisp_Object Qdisabled_command_hook, Vdisabled_command_hook; /* The error handler. */ Lisp_Object Qcommand_error; /* The emergency error handler, before we're ready. */ Lisp_Object Qreally_early_error_handler; /* Variable defined in Lisp. */ Lisp_Object Qerrors_deactivate_region; Lisp_Object Qtop_level; static Lisp_Object command_loop_1 (Lisp_Object dummy); EXFUN (Fcommand_loop_1, 0); /* There are two possible command loops -- one written entirely in C and one written mostly in Lisp, except stuff written in C for speed. The advantage of the Lisp command loop is that the user can specify their own command loop to use by changing the variable `command-loop'. Its disadvantage is that it's slow. */ static Lisp_Object default_error_handler (Lisp_Object data) { int speccount = specpdl_depth (); /* None of this is invoked, normally. This code is almost identical to the `command-error' function, except `command-error' does cool tricks with sounds. This function is a fallback, invoked if command-error is unavailable. */ Fding (Qnil, Qnil, Qnil); if (!NILP (Fboundp (Qerrors_deactivate_region)) && !NILP (Fsymbol_value (Qerrors_deactivate_region))) zmacs_deactivate_region (); Fdiscard_input (); specbind (Qinhibit_quit, Qt); Vstandard_output = Qt; Vstandard_input = Qt; Vexecuting_macro = Qnil; Fset (intern ("last-error"), data); clear_echo_area (selected_frame (), Qnil, 0); Fdisplay_error (data, Qt); check_quit (); /* make Vquit_flag accurate */ Vquit_flag = Qnil; return (unbind_to_1 (speccount, Qt)); } DEFUN ("really-early-error-handler", Freally_early_error_handler, 1, 1, 0, /* You should almost certainly not be using this. */ (x)) { /* This is an error handler used when we're running temacs and when we're in the early stages of XEmacs. No errors ought to be occurring in those cases (or they ought to be trapped and dealt with elsewhere), but if an error slips through, we need to deal with it. We could write this function in Lisp (and it used to be this way, at the beginning of loadup.el), but we do it this way in case an error occurs before we get to loading loadup.el. Note that there is also an `early-error-handler', used in startup.el to catch more reasonable errors that might occur during startup if the sysadmin or whoever fucked up. This function is more conservative in what it does and is used only as a last resort, indicating that the programmer himself fucked up somewhere. */ stderr_out ("*** Error in XEmacs initialization"); Fprint (x, Qexternal_debugging_output); stderr_out ("*** Backtrace\n"); Fbacktrace (Qexternal_debugging_output, Qt); stderr_out ("*** Killing XEmacs\n"); #ifdef HAVE_MS_WINDOWS Fmswindows_message_box (build_msg_string ("Initialization error"), Qnil, Qnil); #endif return Fkill_emacs (make_int (-1)); } /**********************************************************************/ /* Command-loop (in C) */ /**********************************************************************/ #ifndef LISP_COMMAND_LOOP /* The guts of the command loop are in command_loop_1(). This function doesn't catch errors, though -- that's the job of command_loop_2(), which is a condition-case wrapper around command_loop_1(). command_loop_1() never returns, but may get thrown out of. When an error occurs, cmd_error() is called, which usually invokes the Lisp error handler in `command-error'; however, a default error handler is provided if `command-error' is nil (e.g. during startup). The purpose of the error handler is simply to display the error message and do associated cleanup; it does not need to throw anywhere. When the error handler finishes, the condition-case in command_loop_2() will finish and command_loop_2() will reinvoke command_loop_1(). command_loop_2() is invoked from three places: from initial_command_loop() (called from main() at the end of internal initialization), from the Lisp function `recursive-edit', and from call_command_loop(). call_command_loop() is called when a macro is started and when the minibuffer is entered; normal termination of the macro or minibuffer causes a throw out of the recursive command loop. (To 'execute-kbd-macro for macros and 'exit for minibuffers. Note also that the low-level minibuffer-entering function, `read-minibuffer-internal', provides its own error handling and does not need command_loop_2()'s error encapsulation; so it tells call_command_loop() to invoke command_loop_1() directly.) Note that both read-minibuffer-internal and recursive-edit set up a catch for 'exit; this is why `abort-recursive-edit', which throws to this catch, exits out of either one. initial_command_loop(), called from main(), sets up a catch for 'top-level when invoking command_loop_2(), allowing functions to throw all the way to the top level if they really need to. Before invoking command_loop_2(), initial_command_loop() calls top_level_1(), which handles all of the startup stuff (creating the initial frame, handling the command-line options, loading the user's .emacs file, etc.). The function that actually does this is in Lisp and is pointed to by the variable `top-level'; normally this function is `normal-top-level'. top_level_1() is just an error-handling wrapper similar to command_loop_2(). Note also that initial_command_loop() sets up a catch for 'top-level when invoking top_level_1(), just like when it invokes command_loop_2(). */ static Lisp_Object cmd_error (Lisp_Object data, Lisp_Object dummy) { /* This function can GC */ check_quit (); /* make Vquit_flag accurate */ Vquit_flag = Qnil; any_console_state (); if (!NILP (Ffboundp (Qcommand_error))) return call1 (Qcommand_error, data); return default_error_handler (data); } static Lisp_Object top_level_1 (Lisp_Object dummy) { /* This function can GC */ /* On entry to the outer level, run the startup file */ if (!NILP (Vtop_level)) condition_case_1 (Qerror, Feval, Vtop_level, cmd_error, Qnil); #if 1 else { message ("\ntemacs can only be run in -batch mode."); noninteractive = 1; /* prevent things under kill-emacs from blowing up */ Fkill_emacs (make_int (-1)); } #else else if (purify_flag) message ("Bare impure Emacs (standard Lisp code not loaded)"); else message ("Bare Emacs (standard Lisp code not loaded)"); #endif return Qnil; } /* Here we catch errors in execution of commands within the editing loop, and reenter the editing loop. When there is an error, cmd_error runs and the call to condition_case_1() returns. */ /* Avoid confusing the compiler. A helper function for command_loop_2 */ static DOESNT_RETURN command_loop_3 (void) { /* * If we are inside of a menu callback we cannot reenter the command loop * because we will deadlock, as no input is allowed. */ if (in_modal_loop) invalid_operation ("Attempt to enter command loop inside menu callback", Qunbound); /* This function can GC */ for (;;) { condition_case_1 (Qerror, command_loop_1, Qnil, cmd_error, Qnil); /* #### wrong with selected-console? */ /* See command in initial_command_loop about why this value is 0. */ reset_this_command_keys (Vselected_console, 0); } } static Lisp_Object command_loop_2 (Lisp_Object dummy) { command_loop_3(); /* doesn't return */ return Qnil; } /* This is called from emacs.c when it's done with initialization. */ DOESNT_RETURN initial_command_loop (Lisp_Object load_me) { /* This function can GC */ if (!NILP (load_me)) Vtop_level = list2 (Qload, load_me); /* First deal with startup and command-line arguments. A throw to 'top-level gets us back here directly (does this ever happen?). Otherwise, this function will return normally when all command- line arguments have been processed, the user's initialization file has been read in, and the first frame has been created. */ internal_catch (Qtop_level, top_level_1, Qnil, 0, 0); /* If an error occurred during startup and the initial console wasn't created, then die now (the error was already printed out on the terminal device). */ if (!noninteractive && (!CONSOLEP (Vselected_console) || CONSOLE_STREAM_P (XCONSOLE (Vselected_console)))) Fkill_emacs (make_int (-1)); /* End of -batch run causes exit here. */ if (noninteractive) Fkill_emacs (Qt); for (;;) { command_loop_level = 0; MARK_MODELINE_CHANGED; /* Now invoke the command loop. It never returns; however, a throw to 'top-level will place us at the end of this loop. */ internal_catch (Qtop_level, command_loop_2, Qnil, 0, 0); /* #### wrong with selected-console? */ /* We don't actually call clear_echo_area() here, partially at least because that runs Lisp code and it may be unsafe to do so -- we are outside of the normal catches for errors and such. */ reset_this_command_keys (Vselected_console, 0); } } /* This function is invoked when a macro or minibuffer starts up. Normal termination of the macro or minibuffer causes a throw past us. See the comment above. Note that this function never returns (but may be thrown out of). */ Lisp_Object call_command_loop (Lisp_Object catch_errors) { /* This function can GC */ if (NILP (catch_errors)) return (command_loop_1 (Qnil)); else return (command_loop_2 (Qnil)); } static Lisp_Object recursive_edit_unwind (Lisp_Object buffer) { if (!NILP (buffer)) Fset_buffer (buffer); command_loop_level--; MARK_MODELINE_CHANGED; return Qnil; } DEFUN ("recursive-edit", Frecursive_edit, 0, 0, "", /* 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. */ ()) { /* This function can GC */ Lisp_Object val; int speccount = specpdl_depth (); command_loop_level++; MARK_MODELINE_CHANGED; record_unwind_protect (recursive_edit_unwind, current_buffer != XWINDOW_XBUFFER (Fselected_window (Qnil)) ? Fcurrent_buffer () : Qnil); specbind (Qstandard_output, Qt); specbind (Qstandard_input, Qt); val = internal_catch (Qexit, command_loop_2, Qnil, 0, 0); if (EQ (val, Qt)) /* Turn abort-recursive-edit into a quit. */ Fsignal (Qquit, Qnil); return unbind_to (speccount); } #endif /* !LISP_COMMAND_LOOP */ /**********************************************************************/ /* Alternate command-loop (largely in Lisp) */ /**********************************************************************/ #ifdef LISP_COMMAND_LOOP static Lisp_Object load1 (Lisp_Object name) { /* This function can GC */ call4 (Qload, name, Qnil, Qt, Qnil); return (Qnil); } /* emergency backups for cold-load-stream use */ static Lisp_Object cold_load_command_error (Lisp_Object datum, Lisp_Object ignored) { /* This function can GC */ check_quit (); /* make Vquit_flag accurate */ Vquit_flag = Qnil; return default_error_handler (datum); } static Lisp_Object cold_load_command_loop (Lisp_Object dummy) { /* This function can GC */ return (condition_case_1 (Qt, command_loop_1, Qnil, cold_load_command_error, Qnil)); } Lisp_Object call_command_loop (Lisp_Object catch_errors) { /* This function can GC */ reset_this_command_keys (Vselected_console, 0); /* #### bleagh */ loop: for (;;) { if (NILP (Vcommand_loop)) break; call1 (Vcommand_loop, catch_errors); } /* This isn't a "correct" definition, but you're pretty hosed if you broke "command-loop" anyway */ /* #### not correct with Vselected_console */ XCONSOLE (Vselected_console)->prefix_arg = Qnil; if (NILP (catch_errors)) Fcommand_loop_1 (); else internal_catch (Qtop_level, cold_load_command_loop, Qnil, 0, 0); goto loop; return Qnil; } static Lisp_Object initial_error_handler (Lisp_Object datum, Lisp_Object ignored) { /* This function can GC */ Vcommand_loop = Qnil; Fding (Qnil, Qnil, Qnil); if (CONSP (datum) && EQ (XCAR (datum), Qquit)) /* Don't bother with the message */ return (Qt); message ("Error in command-loop!!"); Fset (intern ("last-error"), datum); /* #### Better/different name? */ Fsit_for (make_int (2), Qnil); cold_load_command_error (datum, Qnil); return (Qt); } DOESNT_RETURN initial_command_loop (Lisp_Object load_me) { /* This function can GC */ if (!NILP (load_me)) { if (!NILP (condition_case_1 (Qt, load1, load_me, initial_error_handler, Qnil))) Fkill_emacs (make_int (-1)); } for (;;) { command_loop_level = 0; MARK_MODELINE_CHANGED; condition_case_1 (Qt, call_command_loop, Qtop_level, initial_error_handler, Qnil); } } #endif /* LISP_COMMAND_LOOP */ /**********************************************************************/ /* Guts of command loop */ /**********************************************************************/ static Lisp_Object command_loop_1 (Lisp_Object dummy) { /* This function can GC */ /* #### not correct with Vselected_console */ XCONSOLE (Vselected_console)->prefix_arg = Qnil; return (Fcommand_loop_1 ()); } /* This is the actual command reading loop, sans error-handling encapsulation. This is used for both the C and Lisp command loops. Originally this function was written in Lisp when the Lisp command loop was used, but it was too slow that way. Under the C command loop, this function will never return (although someone might throw past it). Under the Lisp command loop, this will return only when the user specifies a new command loop by changing the command-loop variable. */ DEFUN ("command-loop-1", Fcommand_loop_1, 0, 0, 0, /* Invoke the internals of the canonical editor command loop. Don't call this unless you know what you're doing. */ ()) { /* This function can GC */ Lisp_Object event = Fmake_event (Qnil, Qnil); Lisp_Object old_loop = Qnil; struct gcpro gcpro1, gcpro2; int was_locked = in_single_console_state (); GCPRO2 (event, old_loop); /* 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. */ if (!((STRINGP (Vexecuting_macro) || VECTORP (Vexecuting_macro)) && XINT (Flength (Vexecuting_macro)) == 1)) Vlast_command = Qt; #ifndef LISP_COMMAND_LOOP while (1) #else old_loop = Vcommand_loop; while (EQ (Vcommand_loop, old_loop)) #endif /* LISP_COMMAND_LOOP */ { /* If focus_follows_mouse, make sure the frame with window manager focus is selected. */ if (focus_follows_mouse) investigate_frame_change (); /* Make sure the current window's buffer is selected. */ { Lisp_Object selected_window = Fselected_window (Qnil); if (!NILP (selected_window) && XWINDOW_XBUFFER (selected_window) != current_buffer) { set_buffer_internal (XWINDOW_XBUFFER (selected_window)); } } #if 0 /* What's wrong with going through ordinary procedure of quit? quitting here leaves overriding-terminal-local-map when you type C-u C-u C-g. */ /* 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. */ QUIT; #endif /* If minibuffer on and echo area in use, wait 2 sec and redraw minibuffer. Treat a ^G here as a command, not an interrupt. */ if (minibuf_level > 0 && echo_area_active (selected_frame ())) { /* Bind dont_check_for_quit to 1 so that C-g gets read in rather than quitting back to the minibuffer. */ int count = begin_dont_check_for_quit (); Fsit_for (make_int (2), Qnil); clear_echo_area (selected_frame (), Qnil, 0); Vquit_flag = Qnil; /* see begin_dont_check_for_quit() */ unbind_to (count); } Fnext_event (event, Qnil); Fdispatch_event (event); if (!was_locked) any_console_state (); DO_NOTHING_DISABLING_NO_RETURN_WARNINGS; } #ifdef LISP_COMMAND_LOOP UNGCPRO; return Qnil; #else RETURN_NOT_REACHED (Qnil); #endif } /**********************************************************************/ /* Initialization */ /**********************************************************************/ void syms_of_cmdloop (void) { DEFSYMBOL (Qdisabled_command_hook); DEFSYMBOL (Qcommand_error); DEFSYMBOL (Qreally_early_error_handler); DEFSYMBOL (Qtop_level); DEFSYMBOL (Qerrors_deactivate_region); #ifndef LISP_COMMAND_LOOP DEFSUBR (Frecursive_edit); #endif DEFSUBR (Freally_early_error_handler); DEFSUBR (Fcommand_loop_1); } void vars_of_cmdloop (void) { DEFVAR_INT ("command-loop-level", &command_loop_level /* Number of recursive edits in progress. */ ); command_loop_level = 0; DEFVAR_LISP ("disabled-command-hook", &Vdisabled_command_hook /* Value is called instead of any command that is disabled, i.e. has a non-nil `disabled' property. */ ); Vdisabled_command_hook = intern ("disabled-command-hook"); DEFVAR_LISP ("leave-window-hook", &Vleave_window_hook /* Not yet implemented. */ ); Vleave_window_hook = Qnil; DEFVAR_LISP ("enter-window-hook", &Venter_window_hook /* Not yet implemented. */ ); Venter_window_hook = Qnil; #ifndef LISP_COMMAND_LOOP DEFVAR_LISP ("top-level", &Vtop_level /* Form to evaluate when Emacs starts up. Useful to set before you dump a modified Emacs. */ ); Vtop_level = Qnil; #else DEFVAR_LISP ("command-loop", &Vcommand_loop /* Function or one argument to call to read and process keyboard commands. The passed argument specifies whether or not to handle errors. */ ); Vcommand_loop = Qnil; #endif /* LISP_COMMAND_LOOP */ }
