Mercurial > hg > xemacs-beta
diff man/lispref/commands.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | ac2d302a0011 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/lispref/commands.texi Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,2242 @@ +@c -*-texinfo-*- +@c This is part of the XEmacs Lisp Reference Manual. +@c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. +@c See the file lispref.texi for copying conditions. +@setfilename ../../info/commands.info +@node Command Loop, Keymaps, Minibuffers, Top +@chapter Command Loop +@cindex editor command loop +@cindex command loop + + When you run XEmacs, it enters the @dfn{editor command loop} almost +immediately. This loop reads events, executes their definitions, +and displays the results. In this chapter, we describe how these things +are done, and the subroutines that allow Lisp programs to do them. + +@menu +* Command Overview:: How the command loop reads commands. +* Defining Commands:: Specifying how a function should read arguments. +* Interactive Call:: Calling a command, so that it will read arguments. +* Command Loop Info:: Variables set by the command loop for you to examine. +* Events:: What input looks like when you read it. +* Reading Input:: How to read input events from the keyboard or mouse. +* Waiting:: Waiting for user input or elapsed time. +* Quitting:: How @kbd{C-g} works. How to catch or defer quitting. +* Prefix Command Arguments:: How the commands to set prefix args work. +* Recursive Editing:: Entering a recursive edit, + and why you usually shouldn't. +* Disabling Commands:: How the command loop handles disabled commands. +* Command History:: How the command history is set up, and how accessed. +* Keyboard Macros:: How keyboard macros are implemented. +@end menu + +@node Command Overview +@section Command Loop Overview + + The command loop in XEmacs is a standard event loop, reading events +one at a time with @code{next-event} and handling them with +@code{dispatch-event}. An event is typically a single user action, such +as a keypress, mouse movement, or menu selection; but they can also be +notifications from the window system, informing XEmacs that (for +example) part of its window was just uncovered and needs to be redrawn. +@xref{Events}. Pending events are held in a first-in, first-out list +called the @dfn{event queue}: events are read from the head of the list, +and newly arriving events are added to the tail. In this way, events +are always processed in the order in which they arrive. + + @code{dispatch-event} does most of the work of handling user actions. +The first thing it must do is put the events together into a key +sequence, which is a sequence of events that translates into a command. +It does this by consulting the active keymaps, which specify what the +valid key sequences are and how to translate them into commands. +@xref{Key Lookup}, for information on how this is done. The result of +the translation should be a keyboard macro or an interactively callable +function. If the key is @kbd{M-x}, then it reads the name of another +command, which it then calls. This is done by the command +@code{execute-extended-command} (@pxref{Interactive Call}). + + To execute a command requires first reading the arguments for it. +This is done by calling @code{command-execute} (@pxref{Interactive +Call}). For commands written in Lisp, the @code{interactive} +specification says how to read the arguments. This may use the prefix +argument (@pxref{Prefix Command Arguments}) or may read with prompting +in the minibuffer (@pxref{Minibuffers}). For example, the command +@code{find-file} has an @code{interactive} specification which says to +read a file name using the minibuffer. The command's function body does +not use the minibuffer; if you call this command from Lisp code as a +function, you must supply the file name string as an ordinary Lisp +function argument. + + If the command is a string or vector (i.e., a keyboard macro) then +@code{execute-kbd-macro} is used to execute it. You can call this +function yourself (@pxref{Keyboard Macros}). + + To terminate the execution of a running command, type @kbd{C-g}. This +character causes @dfn{quitting} (@pxref{Quitting}). + +@defvar pre-command-hook +The editor command loop runs this normal hook before each command. At +that time, @code{this-command} contains the command that is about to +run, and @code{last-command} describes the previous command. +@xref{Hooks}. +@end defvar + +@defvar post-command-hook +The editor command loop runs this normal hook after each command. (In +FSF Emacs, it is also run when the command loop is entered, or +reentered after an error or quit.) At that time, +@code{this-command} describes the command that just ran, and +@code{last-command} describes the command before that. @xref{Hooks}. +@end defvar + + Quitting is suppressed while running @code{pre-command-hook} and +@code{post-command-hook}. If an error happens while executing one of +these hooks, it terminates execution of the hook, but that is all it +does. + +@node Defining Commands +@section Defining Commands +@cindex defining commands +@cindex commands, defining +@cindex functions, making them interactive +@cindex interactive function + + A Lisp function becomes a command when its body contains, at top +level, a form that calls the special form @code{interactive}. This +form does nothing when actually executed, but its presence serves as a +flag to indicate that interactive calling is permitted. Its argument +controls the reading of arguments for an interactive call. + +@menu +* Using Interactive:: General rules for @code{interactive}. +* Interactive Codes:: The standard letter-codes for reading arguments + in various ways. +* Interactive Examples:: Examples of how to read interactive arguments. +@end menu + +@node Using Interactive +@subsection Using @code{interactive} + + This section describes how to write the @code{interactive} form that +makes a Lisp function an interactively-callable command. + +@defspec interactive arg-descriptor +@cindex argument descriptors +This special form declares that the function in which it appears is a +command, and that it may therefore be called interactively (via +@kbd{M-x} or by entering a key sequence bound to it). The argument +@var{arg-descriptor} declares how to compute the arguments to the +command when the command is called interactively. + +A command may be called from Lisp programs like any other function, but +then the caller supplies the arguments and @var{arg-descriptor} has no +effect. + +The @code{interactive} form has its effect because the command loop +(actually, its subroutine @code{call-interactively}) scans through the +function definition looking for it, before calling the function. Once +the function is called, all its body forms including the +@code{interactive} form are executed, but at this time +@code{interactive} simply returns @code{nil} without even evaluating its +argument. +@end defspec + +There are three possibilities for the argument @var{arg-descriptor}: + +@itemize @bullet +@item +It may be omitted or @code{nil}; then the command is called with no +arguments. This leads quickly to an error if the command requires one +or more arguments. + +@item +It may be a Lisp expression that is not a string; then it should be a +form that is evaluated to get a list of arguments to pass to the +command. +@cindex argument evaluation form + +If this expression reads keyboard input (this includes using the +minibuffer), keep in mind that the integer value of point or the mark +before reading input may be incorrect after reading input. This is +because the current buffer may be receiving subprocess output; +if subprocess output arrives while the command is waiting for input, +it could relocate point and the mark. + +Here's an example of what @emph{not} to do: + +@smallexample +(interactive + (list (region-beginning) (region-end) + (read-string "Foo: " nil 'my-history))) +@end smallexample + +@noindent +Here's how to avoid the problem, by examining point and the mark only +after reading the keyboard input: + +@smallexample +(interactive + (let ((string (read-string "Foo: " nil 'my-history))) + (list (region-beginning) (region-end) string))) +@end smallexample + +@item +@cindex argument prompt +It may be a string; then its contents should consist of a code character +followed by a prompt (which some code characters use and some ignore). +The prompt ends either with the end of the string or with a newline. +Here is a simple example: + +@smallexample +(interactive "bFrobnicate buffer: ") +@end smallexample + +@noindent +The code letter @samp{b} says to read the name of an existing buffer, +with completion. The buffer name is the sole argument passed to the +command. The rest of the string is a prompt. + +If there is a newline character in the string, it terminates the prompt. +If the string does not end there, then the rest of the string should +contain another code character and prompt, specifying another argument. +You can specify any number of arguments in this way. + +@c Emacs 19 feature +The prompt string can use @samp{%} to include previous argument values +(starting with the first argument) in the prompt. This is done using +@code{format} (@pxref{Formatting Strings}). For example, here is how +you could read the name of an existing buffer followed by a new name to +give to that buffer: + +@smallexample +@group +(interactive "bBuffer to rename: \nsRename buffer %s to: ") +@end group +@end smallexample + +@cindex @samp{*} in interactive +@cindex read-only buffers in interactive +If the first character in the string is @samp{*}, then an error is +signaled if the buffer is read-only. + +@cindex @samp{@@} in interactive +@c Emacs 19 feature +If the first character in the string is @samp{@@}, and if the key +sequence used to invoke the command includes any mouse events, then +the window associated with the first of those events is selected +before the command is run. + +@cindex @samp{_} in interactive +@c XEmacs feature +If the first character in the string is @samp{_}, then this command will +not cause the region to be deactivated when it completes; that is, +@code{zmacs-region-stays} will be set to @code{t} when the command exits +successfully. + +You can use @samp{*}, @samp{@@}, and @samp{_} together; the order does +not matter. Actual reading of arguments is controlled by the rest of +the prompt string (starting with the first character that is not +@samp{*}, @samp{@@}, or @samp{_}). +@end itemize + +@node Interactive Codes +@subsection Code Characters for @code{interactive} +@cindex interactive code description +@cindex description for interactive codes +@cindex codes, interactive, description of +@cindex characters for interactive codes + + The code character descriptions below contain a number of key words, +defined here as follows: + +@table @b +@item Completion +@cindex interactive completion +Provide completion. @key{TAB}, @key{SPC}, and @key{RET} perform name +completion because the argument is read using @code{completing-read} +(@pxref{Completion}). @kbd{?} displays a list of possible completions. + +@item Existing +Require the name of an existing object. An invalid name is not +accepted; the commands to exit the minibuffer do not exit if the current +input is not valid. + +@item Default +@cindex default argument string +A default value of some sort is used if the user enters no text in the +minibuffer. The default depends on the code character. + +@item No I/O +This code letter computes an argument without reading any input. +Therefore, it does not use a prompt string, and any prompt string you +supply is ignored. + +Even though the code letter doesn't use a prompt string, you must follow +it with a newline if it is not the last code character in the string. + +@item Prompt +A prompt immediately follows the code character. The prompt ends either +with the end of the string or with a newline. + +@item Special +This code character is meaningful only at the beginning of the +interactive string, and it does not look for a prompt or a newline. +It is a single, isolated character. +@end table + +@cindex reading interactive arguments + Here are the code character descriptions for use with @code{interactive}: + +@table @samp +@item * +Signal an error if the current buffer is read-only. Special. + +@item @@ +Select the window mentioned in the first mouse event in the key +sequence that invoked this command. Special. + +@item _ +Do not cause the region to be deactivated when this command completes. +Special. + +@item a +A function name (i.e., a symbol satisfying @code{fboundp}). Existing, +Completion, Prompt. + +@item b +The name of an existing buffer. By default, uses the name of the +current buffer (@pxref{Buffers}). Existing, Completion, Default, +Prompt. + +@item B +A buffer name. The buffer need not exist. By default, uses the name of +a recently used buffer other than the current buffer. Completion, +Default, Prompt. + +@item c +A character. The cursor does not move into the echo area. Prompt. + +@item C +A command name (i.e., a symbol satisfying @code{commandp}). Existing, +Completion, Prompt. + +@item d +@cindex position argument +The position of point, as an integer (@pxref{Point}). No I/O. + +@item D +A directory name. The default is the current default directory of the +current buffer, @code{default-directory} (@pxref{System Environment}). +Existing, Completion, Default, Prompt. + +@item e +The last mouse-button or misc-user event in the key sequence that +invoked the command. No I/O. + +You can use @samp{e} more than once in a single command's interactive +specification. If the key sequence that invoked the command has @var{n} +mouse-button or misc-user events, the @var{n}th @samp{e} provides the +@var{n}th such event. + +@item f +A file name of an existing file (@pxref{File Names}). The default +directory is @code{default-directory}. Existing, Completion, Default, +Prompt. + +@item F +A file name. The file need not exist. Completion, Default, Prompt. + +@item k +A key sequence (@pxref{Keymap Terminology}). This keeps reading events +until a command (or undefined command) is found in the current key +maps. The key sequence argument is represented as a vector of events. +The cursor does not move into the echo area. Prompt. + +This kind of input is used by commands such as @code{describe-key} and +@code{global-set-key}. + +@item K +A key sequence, whose definition you intend to change. This works like +@samp{k}, except that it suppresses, for the last input event in the key +sequence, the conversions that are normally used (when necessary) to +convert an undefined key into a defined one. + +@item m +@cindex marker argument +The position of the mark, as an integer. No I/O. + +@item n +A number read with the minibuffer. If the input is not a number, the +user is asked to try again. The prefix argument, if any, is not used. +Prompt. + +@item N +@cindex raw prefix argument usage +The raw prefix argument. If the prefix argument is @code{nil}, then +read a number as with @kbd{n}. Requires a number. @xref{Prefix Command +Arguments}. Prompt. + +@item p +@cindex numeric prefix argument usage +The numeric prefix argument. (Note that this @samp{p} is lower case.) +No I/O. + +@item P +The raw prefix argument. (Note that this @samp{P} is upper case.) No +I/O. + +@item r +@cindex region argument +Point and the mark, as two numeric arguments, smallest first. This is +the only code letter that specifies two successive arguments rather than +one. No I/O. + +@item s +Arbitrary text, read in the minibuffer and returned as a string +(@pxref{Text from Minibuffer}). Terminate the input with either +@key{LFD} or @key{RET}. (@kbd{C-q} may be used to include either of +these characters in the input.) Prompt. + +@item S +An interned symbol whose name is read in the minibuffer. Any whitespace +character terminates the input. (Use @kbd{C-q} to include whitespace in +the string.) Other characters that normally terminate a symbol (e.g., +parentheses and brackets) do not do so here. Prompt. + +@item v +A variable declared to be a user option (i.e., satisfying the predicate +@code{user-variable-p}). @xref{High-Level Completion}. Existing, +Completion, Prompt. + +@item x +A Lisp object, specified with its read syntax, terminated with a +@key{LFD} or @key{RET}. The object is not evaluated. @xref{Object from +Minibuffer}. Prompt. + +@item X +@cindex evaluated expression argument +A Lisp form is read as with @kbd{x}, but then evaluated so that its +value becomes the argument for the command. Prompt. +@end table + +@node Interactive Examples +@subsection Examples of Using @code{interactive} +@cindex examples of using @code{interactive} +@cindex @code{interactive}, examples of using + + Here are some examples of @code{interactive}: + +@example +@group +(defun foo1 () ; @r{@code{foo1} takes no arguments,} + (interactive) ; @r{just moves forward two words.} + (forward-word 2)) + @result{} foo1 +@end group + +@group +(defun foo2 (n) ; @r{@code{foo2} takes one argument,} + (interactive "p") ; @r{which is the numeric prefix.} + (forward-word (* 2 n))) + @result{} foo2 +@end group + +@group +(defun foo3 (n) ; @r{@code{foo3} takes one argument,} + (interactive "nCount:") ; @r{which is read with the Minibuffer.} + (forward-word (* 2 n))) + @result{} foo3 +@end group + +@group +(defun three-b (b1 b2 b3) + "Select three existing buffers. +Put them into three windows, selecting the last one." +@end group + (interactive "bBuffer1:\nbBuffer2:\nbBuffer3:") + (delete-other-windows) + (split-window (selected-window) 8) + (switch-to-buffer b1) + (other-window 1) + (split-window (selected-window) 8) + (switch-to-buffer b2) + (other-window 1) + (switch-to-buffer b3)) + @result{} three-b +@group +(three-b "*scratch*" "declarations.texi" "*mail*") + @result{} nil +@end group +@end example + +@node Interactive Call +@section Interactive Call +@cindex interactive call + + After the command loop has translated a key sequence into a +definition, it invokes that definition using the function +@code{command-execute}. If the definition is a function that is a +command, @code{command-execute} calls @code{call-interactively}, which +reads the arguments and calls the command. You can also call these +functions yourself. + +@defun commandp object +Returns @code{t} if @var{object} is suitable for calling interactively; +that is, if @var{object} is a command. Otherwise, returns @code{nil}. + +The interactively callable objects include strings and vectors (treated +as keyboard macros), lambda expressions that contain a top-level call to +@code{interactive}, compiled-function objects made from such lambda +expressions, autoload objects that are declared as interactive +(non-@code{nil} fourth argument to @code{autoload}), and some of the +primitive functions. + +A symbol is @code{commandp} if its function definition is +@code{commandp}. + +Keys and keymaps are not commands. Rather, they are used to look up +commands (@pxref{Keymaps}). + +See @code{documentation} in @ref{Accessing Documentation}, for a +realistic example of using @code{commandp}. +@end defun + +@defun call-interactively command &optional record-flag +This function calls the interactively callable function @var{command}, +reading arguments according to its interactive calling specifications. +An error is signaled if @var{command} is not a function or if it cannot +be called interactively (i.e., is not a command). Note that keyboard +macros (strings and vectors) are not accepted, even though they are +considered commands, because they are not functions. + +@c XEmacs feature? +If @var{record-flag} is the symbol @code{lambda}, the interactive +calling arguments for @code{command} are read and returned as a list, +but the function is not called on them. + +@cindex record command history +If @var{record-flag} is @code{t}, then this command and its arguments +are unconditionally added to the list @code{command-history}. +Otherwise, the command is added only if it uses the minibuffer to read +an argument. @xref{Command History}. +@end defun + +@defun command-execute command &optional record-flag +@cindex keyboard macro execution +This function executes @var{command} as an editing command. The +argument @var{command} must satisfy the @code{commandp} predicate; i.e., +it must be an interactively callable function or a keyboard macro. + +A string or vector as @var{command} is executed with +@code{execute-kbd-macro}. A function is passed to +@code{call-interactively}, along with the optional @var{record-flag}. + +A symbol is handled by using its function definition in its place. A +symbol with an @code{autoload} definition counts as a command if it was +declared to stand for an interactively callable function. Such a +definition is handled by loading the specified library and then +rechecking the definition of the symbol. +@end defun + +@deffn Command execute-extended-command prefix-argument +@cindex read command name +This function reads a command name from the minibuffer using +@code{completing-read} (@pxref{Completion}). Then it uses +@code{command-execute} to call the specified command. Whatever that +command returns becomes the value of @code{execute-extended-command}. + +@cindex execute with prefix argument +If the command asks for a prefix argument, it receives the value +@var{prefix-argument}. If @code{execute-extended-command} is called +interactively, the current raw prefix argument is used for +@var{prefix-argument}, and thus passed on to whatever command is run. + +@c !!! Should this be @kindex? +@cindex @kbd{M-x} +@code{execute-extended-command} is the normal definition of @kbd{M-x}, +so it uses the string @w{@samp{M-x }} as a prompt. (It would be better +to take the prompt from the events used to invoke +@code{execute-extended-command}, but that is painful to implement.) A +description of the value of the prefix argument, if any, also becomes +part of the prompt. + +@example +@group +(execute-extended-command 1) +---------- Buffer: Minibuffer ---------- +1 M-x forward-word RET +---------- Buffer: Minibuffer ---------- + @result{} t +@end group +@end example +@end deffn + +@defun interactive-p +This function returns @code{t} if the containing function (the one that +called @code{interactive-p}) was called interactively, with the function +@code{call-interactively}. (It makes no difference whether +@code{call-interactively} was called from Lisp or directly from the +editor command loop.) If the containing function was called by Lisp +evaluation (or with @code{apply} or @code{funcall}), then it was not +called interactively. + +The most common use of @code{interactive-p} is for deciding whether to +print an informative message. As a special exception, +@code{interactive-p} returns @code{nil} whenever a keyboard macro is +being run. This is to suppress the informative messages and speed +execution of the macro. + +For example: + +@example +@group +(defun foo () + (interactive) + (and (interactive-p) + (message "foo"))) + @result{} foo +@end group + +@group +(defun bar () + (interactive) + (setq foobar (list (foo) (interactive-p)))) + @result{} bar +@end group + +@group +;; @r{Type @kbd{M-x foo}.} + @print{} foo +@end group + +@group +;; @r{Type @kbd{M-x bar}.} +;; @r{This does not print anything.} +@end group + +@group +foobar + @result{} (nil t) +@end group +@end example +@end defun + +@node Command Loop Info +@section Information from the Command Loop + +The editor command loop sets several Lisp variables to keep status +records for itself and for commands that are run. + +@defvar last-command +This variable records the name of the previous command executed by the +command loop (the one before the current command). Normally the value +is a symbol with a function definition, but this is not guaranteed. + +The value is copied from @code{this-command} when a command returns to +the command loop, except when the command specifies a prefix argument +for the following command. +@end defvar + +@defvar this-command +@cindex current command +This variable records the name of the command now being executed by +the editor command loop. Like @code{last-command}, it is normally a symbol +with a function definition. + +The command loop sets this variable just before running a command, and +copies its value into @code{last-command} when the command finishes +(unless the command specifies a prefix argument for the following +command). + +@cindex kill command repetition +Some commands set this variable during their execution, as a flag for +whatever command runs next. In particular, the functions for killing text +set @code{this-command} to @code{kill-region} so that any kill commands +immediately following will know to append the killed text to the +previous kill. +@end defvar + +If you do not want a particular command to be recognized as the previous +command in the case where it got an error, you must code that command to +prevent this. One way is to set @code{this-command} to @code{t} at the +beginning of the command, and set @code{this-command} back to its proper +value at the end, like this: + +@example +(defun foo (args@dots{}) + (interactive @dots{}) + (let ((old-this-command this-command)) + (setq this-command t) + @r{@dots{}do the work@dots{}} + (setq this-command old-this-command))) +@end example + +@defun this-command-keys +This function returns a vector containing the key and mouse events that +invoked the present command, plus any previous commands that generated +the prefix argument for this command. (Note: this is not the same as in +FSF Emacs, which can return a string.) @xref{Events}. + +This function copies the vector and the events; it is safe to keep and +modify them. + +@example +@group +(this-command-keys) +;; @r{Now use @kbd{C-u C-x C-e} to evaluate that.} + @result{} [#<keypress-event control-U> #<keypress-event control-X> #<keypress-event control-E>] +@end group +@end example +@end defun + +@ignore Not in XEmacs +@defvar last-nonmenu-event +This variable holds the last input event read as part of a key +sequence, not counting events resulting from mouse menus. + +One use of this variable is to figure out a good default location to +pop up another menu. +@end defvar +@end ignore + +@defvar last-command-event +This variable is set to the last input event that was read by the +command loop as part of a command. The principal use of this variable +is in @code{self-insert-command}, which uses it to decide which +character to insert. + +This variable is off limits: you may not set its value or modify the +event that is its value, as it is destructively modified by +@code{read-key-sequence}. If you want to keep a pointer to this value, +you must use @code{copy-event}. + +Note that this variable is an alias for @code{last-command-char} in +FSF Emacs. + +@example +@group +last-command-event +;; @r{Now type @kbd{C-u C-x C-e}.} + @result{} #<keypress-event control-E> +@end group +@end example +@end defvar + +@defvar last-command-char +If the value of @code{last-command-event} is a keyboard event, then this +is the nearest @sc{ASCII} equivalent to it. This the the value that +@code{self-insert-command} will put in the buffer. Remember that there +is @emph{not} a 1:1 mapping between keyboard events and @sc{ASCII} +characters: the set of keyboard events is much larger, so writing code +that examines this variable to determine what key has been typed is bad +practice, unless you are certain that it will be one of a small set of +characters. + +This function exists for compatibility with Emacs version 18. + +@example +@group +last-command-char +;; @r{Now use @kbd{C-u C-x C-e} to evaluate that.} + @result{} 5 +@end group +@end example + +@noindent +The value is 5 because that is the @sc{ASCII} code for @kbd{C-e}. +@end defvar + +@defvar current-mouse-event +This variable holds the mouse-button event which invoked this command, +or @code{nil}. This is what @code{(interactive "e")} returns. +@end defvar + +@defvar echo-keystrokes +This variable determines how much time should elapse before command +characters echo. Its value must be an integer, which specifies the +number of seconds to wait before echoing. If the user types a prefix +key (say @kbd{C-x}) and then delays this many seconds before continuing, +the key @kbd{C-x} is echoed in the echo area. Any subsequent characters +in the same command will be echoed as well. + +If the value is zero, then command input is not echoed. +@end defvar + +@node Events +@section Events +@cindex events +@cindex input events + +The XEmacs command loop reads a sequence of @dfn{events} that +represent keyboard or mouse activity. Unlike in Emacs 18 and in FSF +Emacs, events are a primitive Lisp type that must be manipulated +using their own accessor and settor primitives. This section describes +the representation and meaning of input events in detail. + +A key sequence that starts with a mouse event is read using the keymaps +of the buffer in the window that the mouse was in, not the current +buffer. This does not imply that clicking in a window selects that +window or its buffer---that is entirely under the control of the command +binding of the key sequence. + +For information about how exactly the XEmacs command loop works, +@xref{Reading Input}. + +@defun eventp object +This function returns non-@code{nil} if @var{event} is an input event. +@end defun + +@menu +* Event Types:: Events come in different types. +* Event Contents:: What the contents of each event type are. +* Event Predicates:: Querying whether an event is of a + particular type. +* Accessing Mouse Event Positions:: + Determining where a mouse event occurred, + and over what. +* Accessing Other Event Info:: Accessing non-positional event info. +* Working With Events:: Creating, copying, and destroying events. +* Converting Events:: Converting between events, keys, and + characters. +@end menu + +@node Event Types +@subsection Event Types + +Events represent keyboard or mouse activity or status changes of various +sorts, such as process input being available or a timeout being triggered. +The different event types are as follows: + +@table @asis +@item key-press event + A key was pressed. Note that modifier keys such as ``control'', ``shift'', +and ``alt'' do not generate events; instead, they are tracked internally +by XEmacs, and non-modifier key presses generate events that specify both +the key pressed and the modifiers that were held down at the time. + +@item button-press event +@itemx button-release event + A button was pressed or released. Along with the button that was pressed +or released, button events specify the modifier keys that were held down +at the time and the position of the pointer at the time. + +@item pointer-motion event + The pointer was moved. Along with the position of the pointer, these events +also specify the modifier keys that were held down at the time. + +@item misc-user event + A menu item was selected, or the scrollbar was used. + +@item process event + Input is available on a process. + +@item timeout event + A timeout has triggered. + +@item magic event + Some window-system-specific action (such as a frame being resized or +a portion of a frame needing to be redrawn) has occurred. The contents +of this event are not accessible at the E-Lisp level, but +@code{dispatch-event} knows what to do with an event of this type. + +@item eval event + This is a special kind of event specifying that a particular function +needs to be called when this event is dispatched. An event of this type +is sometimes placed in the event queue when a magic event is processed. +This kind of event should generally just be passed off to +@code{dispatch-event}. @xref{Dispatching an Event}. +@end table + +@node Event Contents +@subsection Contents of the Different Types of Events + + Every event, no matter what type it is, contains a timestamp (which is +typically an offset in milliseconds from when the X server was started) +indicating when the event occurred. In addition, many events contain +a @dfn{channel}, which specifies which frame the event occurred on, +and/or a value indicating which modifier keys (shift, control, etc.) +were held down at the time of the event. + +The contents of each event are as follows: + +@table @asis +@item key-press event +@table @asis +@item channel +@item timestamp +@item key + Which key was pressed. This is an integer (in the printing @sc{ASCII} +range: >32 and <127) or a symbol such as @code{left} or @code{right}. +Note that many physical keys are actually treated as two separate keys, +depending on whether the shift key is pressed; for example, the ``a'' +key is treated as either ``a'' or ``A'' depending on the state of the +shift key, and the ``1'' key is similarly treated as either ``1'' or +``!'' on most keyboards. In such cases, the shift key does not show up +in the modifier list. For other keys, such as @code{backspace}, the +shift key shows up as a regular modifier. +@item modifiers + Which modifier keys were pressed. As mentioned above, the shift key +is not treated as a modifier for many keys and will not show up in this list +in such cases. +@end table + +@item button-press event +@itemx button-release event +@table @asis +@item channel +@item timestamp +@item button + What button went down or up. Buttons are numbered starting at 1. +@item modifiers + Which modifier keys were pressed. The special business mentioned above +for the shift key does @emph{not} apply to mouse events. +@item x +@itemx y + The position of the pointer (in pixels) at the time of the event. +@end table + +@item pointer-motion event +@table @asis +@item channel +@item timestamp +@item x +@itemx y + The position of the pointer (in pixels) after it moved. +@item modifiers + Which modifier keys were pressed. The special business mentioned above +for the shift key does @emph{not} apply to mouse events. +@end table + +@item misc-user event +@table @asis +@item timestamp +@item function + The E-Lisp function to call for this event. This is normally either +@code{eval} or @code{call-interactively}. +@item object + The object to pass to the function. This is normally the callback that +was specified in the menu description. +@end table + +@item process_event +@table @asis +@item timestamp +@item process + The Emacs ``process'' object in question. +@end table + +@item timeout event +@table @asis +@item timestamp +@item function + The E-Lisp function to call for this timeout. It is called with one +argument, the event. +@item object + Some Lisp object associated with this timeout, to make it easier to tell +them apart. The function and object for this event were specified when +the timeout was set. +@end table + +@item magic event +@table @asis +@item timestamp +@end table +(The rest of the information in this event is not user-accessible.) + +@item eval event +@table @asis +@item timestamp +@item function + An E-Lisp function to call when this event is dispatched. +@item object + The object to pass to the function. The function and object are set +when the event is created. +@end table +@end table + +@node Event Predicates +@subsection Event Predicates + +The following predicates return whether an object is an event of a particular +type. + +@defun button-event-p object object +This is true if @var{object} is a button-press or button-release event. +@end defun + +@defun button-press-event-p object +This is true if @var{object} is a mouse-button-press event. +@end defun + +@defun button-release-event-p object +This is true if @var{object} is a mouse-button-release event. +@end defun + +@defun eval-event-p object +This is true if @var{object} is an eval or misc-user event. +@end defun + +@defun key-press-event-p object +This is true if @var{object} is a key-press event. +@end defun + +@defun misc-user-event-p object +This is true if @var{object} is a misc-user event. +@end defun + +@defun motion-event-p object +This is true if @var{object} is a mouse-motion event. +@end defun + +@defun process-event-p object +This is true if @var{object} is a process event. +@end defun + +@defun timeout-event-p object +This is true if @var{object} is a timeout event. +@end defun + +@defun event-live-p object +This is true if @var{object} is any event that has not been deallocated. +@end defun + +@node Accessing Mouse Event Positions +@subsection Accessing the Position of a Mouse Event + +Unlike other events, mouse events (i.e. mouse-motion, button-press, and +button-release events) occur in a particular location on the screen. +Many primitives are provided for determining exactly where the event +occurred and what is under that location. + +@menu +* Frame-Level Event Position Info:: +* Window-Level Event Position Info:: +* Event Text Position Info:: +* Event Glyph Position Info:: +* Event Toolbar Position Info:: +* Other Event Position Info:: +@end menu + +@node Frame-Level Event Position Info +@subsubsection Frame-Level Event Position Info + +The following functions return frame-level information about where +a mouse event occurred. + +@defun event-frame event +This function returns the ``channel'' or frame that the given mouse +motion, button press, or button release event occurred in. This will be +@code{nil} for non-mouse events. +@end defun + +@defun event-x-pixel event +This function returns the X position in pixels of the given mouse event. +The value returned is relative to the frame the event occurred in. +This will signal an error if the event is not a mouse-motion, button-press, +or button-release event. +@end defun + +@defun event-y-pixel event +This function returns the Y position in pixels of the given mouse event. +The value returned is relative to the frame the event occurred in. +This will signal an error if the event is not a mouse-motion, button-press, +or button-release event. +@end defun + +@node Window-Level Event Position Info +@subsubsection Window-Level Event Position Info + +The following functions return window-level information about where +a mouse event occurred. + +@defun event-window event +Given a mouse motion, button press, or button release event, compute and +return the window on which that event occurred. This may be @code{nil} +if the event occurred in the border or over a toolbar. The modeline is +considered to be in the window it represents. +@end defun + +@defun event-buffer event +Given a mouse motion, button press, or button release event, compute and +return the buffer of the window on which that event occurred. This may +be @code{nil} if the event occurred in the border or over a toolbar. +The modeline is considered to be in the window it represents. This is +equivalent to calling @code{event-window} and then calling +@code{event-buffer} on the result if it is a window. +@end defun + +@defun event-window-x-pixel event +This function returns the X position in pixels of the given mouse event. +The value returned is relative to the window the event occurred in. +This will signal an error if the event is not a mouse-motion, button-press, +or button-release event. +@end defun + +@defun event-window-y-pixel event +This function returns the Y position in pixels of the given mouse event. +The value returned is relative to the window the event occurred in. +This will signal an error if the event is not a mouse-motion, button-press, +or button-release event. +@end defun + +@node Event Text Position Info +@subsubsection Event Text Position Info + +The following functions return information about the text (including the +modeline) that a mouse event occurred over or near. + +@defun event-over-text-area-p event +Given a mouse-motion, button-press, or button-release event, this +function returns @code{t} if the event is over the the text area of a +window. Otherwise, @code{nil} is returned. The modeline is not +considered to be part of the text area. +@end defun + +@defun event-over-modeline-p event +Given a mouse-motion, button-press, or button-release event, this +function returns @code{t} if the event is over the modeline of a window. +Otherwise, @code{nil} is returned. +@end defun + +@defun event-x event +This function returns the X position of the given mouse-motion, +button-press, or button-release event in characters. This is relative +to the window the event occurred over. +@end defun + +@defun event-y event +This function returns the Y position of the given mouse-motion, +button-press, or button-release event in characters. This is relative +to the window the event occurred over. +@end defun + +@defun event-point event +This function returns the character position of the given mouse-motion, +button-press, or button-release event. If the event did not occur over +a window, or did not occur over text, then this returns @code{nil}. +Otherwise, it returns an index into the buffer visible in the event's +window. +@end defun + +@defun event-closest-point event +This function returns the character position of the given mouse-motion, +button-press, or button-release event. If the event did not occur over +a window or over text, it returns the closest point to the location of +the event. If the Y pixel position overlaps a window and the X pixel +position is to the left of that window, the closest point is the +beginning of the line containing the Y position. If the Y pixel +position overlaps a window and the X pixel position is to the right of +that window, the closest point is the end of the line containing the Y +position. If the Y pixel position is above a window, 0 is returned. If +it is below a window, the value of @code{(window-end)} is returned. +@end defun + +@node Event Glyph Position Info +@subsubsection Event Glyph Position Info + +The following functions return information about the glyph (if any) that +a mouse event occurred over. + +@defun event-over-glyph-p event +Given a mouse-motion, button-press, or button-release event, this +function returns @code{t} if the event is over a glyph. Otherwise, +@code{nil} is returned. +@end defun + +@defun event-glyph-extent event +If the given mouse-motion, button-press, or button-release event happened +on top of a glyph, this returns its extent; else @code{nil} is returned. +@end defun + +@defun event-glyph-x-pixel event +Given a mouse-motion, button-press, or button-release event over a +glyph, this function returns the X position of the pointer relative to +the upper left of the glyph. If the event is not over a glyph, it returns +@code{nil}. +@end defun + +@defun event-glyph-y-pixel event +Given a mouse-motion, button-press, or button-release event over a +glyph, this function returns the Y position of the pointer relative to +the upper left of the glyph. If the event is not over a glyph, it returns +@code{nil}. +@end defun + +@node Event Toolbar Position Info +@subsubsection Event Toolbar Position Info + +@defun event-over-toolbar-p event +Given a mouse-motion, button-press, or button-release event, this +function returns @code{t} if the event is over a toolbar. Otherwise, +@code{nil} is returned. +@end defun + +@defun event-toolbar-button event +If the given mouse-motion, button-press, or button-release event +happened on top of a toolbar button, this function returns the button. +Otherwise, @code{nil} is returned. +@end defun + +@node Other Event Position Info +@subsubsection Other Event Position Info + +@defun event-over-border-p event +Given a mouse-motion, button-press, or button-release event, this +function returns @code{t} if the event is over an internal toolbar. +Otherwise, @code{nil} is returned. +@end defun + +@node Accessing Other Event Info +@subsection Accessing the Other Contents of Events + +The following functions allow access to the contents of events other than +the position info described in the previous section. + +@defun event-timestamp event +This function returns the timestamp of the given event object. +@end defun + +@defun event-device event +This function returns the device that the given event occurred on. +@end defun + +@defun event-key event +This function returns the Keysym of the given key-press event. +This will be the @sc{ASCII} code of a printing character, or a symbol. +@end defun + +@defun event-button event +This function returns the button-number of the given mouse-button-press +event. +@end defun + +@defun event-modifiers event +This function returns a list of symbols, the names of the modifier keys +which were down when the given mouse or keyboard event was produced. +@end defun + +@defun event-modifier-bits event +This function returns a number representing the modifier keys which were down +when the given mouse or keyboard event was produced. +@end defun + +@defun event-function event +This function returns the callback function of the given timeout, misc-user, +or eval event. +@end defun + +@defun event-object event +This function returns the callback function argument of the given timeout, +misc-user, or eval event. +@end defun + +@defun event-process event +This function returns the process of the given process event. +@end defun + +@node Working With Events +@subsection Working With Events + +XEmacs provides primitives for creating, copying, and destroying event +objects. Many functions that return events take an event object as an +argument and fill in the fields of this event; or they make accept +either an event object or @code{nil}, creating the event object first in +the latter case. + +@defun allocate-event +This function returns an empty event structure. WARNING: The event +object returned may be a reused one; see the function +@code{deallocate-event}. +@end defun + +@defun copy-event event1 &optional event2 +This function makes a copy of the given event object. If a second +argument is given, the first event is copied into the second and the +second is returned. If the second argument is not supplied (or is +@code{nil}) then a new event will be made as with @code{allocate-event}. +@end defun + +@defun deallocate-event event +This function allows the given event structure to be reused. You +@strong{MUST NOT} use this event object after calling this function with +it. You will lose. It is not necessary to call this function, as event +objects are garbage-collected like all other objects; however, it may be +more efficient to explicitly deallocate events when you are sure that +that is safe. +@end defun + +@node Converting Events +@subsection Converting Events + +XEmacs provides some auxiliary functions for converting between events +and other ways of representing keys. These are useful when working with +@sc{ASCII} strings and with keymaps. + +@defun character-to-event ch &optional event device +This function converts a numeric @sc{ASCII} value to an event structure, +replete with modifier bits. @var{ch} is the character to convert, and +@var{event} is the event object to fill in. This function contains +knowledge about what the codes ``mean'' -- for example, the number 9 is +converted to the character @key{Tab}, not the distinct character +@key{Control-I}. + +Note that @var{ch} does not have to be a numeric value, but can be a +symbol such as @code{clear} or a list such as @code{(control +backspace)}. + +If @code{event} is not @code{nil}, it is modified; otherwise, a +new event object is created. In both cases, the event is returned. + +Optional third arg @var{device} is the device to store in the event; +this also affects whether the high bit is interpreted as a meta key. A +value of @code{nil} means use the selected device but always treat the +high bit as meta. + +Beware that @code{character-to-event} and @code{event-to-character} are +not strictly inverse functions, since events contain much more +information than the @sc{ASCII} character set can encode. +@end defun + +@defun event-to-character event &optional allow-extra-modifiers allow-meta allow-non-ascii +This function returns the closest @sc{ASCII} approximation to +@var{event}. If the event isn't a keypress, this returns @code{nil}. + +If @var{allow-extra-modifiers} is non-@code{nil}, then this is lenient +in its translation; it will ignore modifier keys other than +@key{control} and @key{meta}, and will ignore the @key{shift} modifier +on those characters which have no shifted @sc{ASCII} equivalent +(@key{Control-Shift-A} for example, will be mapped to the same +@sc{ASCII} code as @key{Control-A}). + +If @var{allow-meta} is non-@code{nil}, then the @key{Meta} modifier will +be represented by turning on the high bit of the byte returned; +otherwise, @code{nil} will be returned for events containing the +@key{Meta} modifier. + +If @var{allow-non-ascii} is non-@code{nil}, then characters which are +present in the prevailing character set (@pxref{Keymaps, variable +@code{character-set-property}}) will be returned as their code in that +character set, instead of the return value being restricted to +@sc{ASCII}. + +Note that specifying both @var{allow-meta} and @var{allow-non-ascii} is +ambiguous, as both use the high bit; @key{M-x} and @key{oslash} will be +indistinguishable. +@end defun + +@defun events-to-keys events &optional no-mice +Given a vector of event objects, this function returns a vector of key +descriptors, or a string (if they all fit in the @sc{ASCII} range). +Optional arg @var{no-mice} means that button events are not allowed. +@end defun + +@node Reading Input +@section Reading Input + + The editor command loop reads keyboard input using the function +@code{next-event} and constructs key sequences out of the events using +@code{dispatch-event}. Lisp programs can also use the function +@code{read-key-sequence}, which reads input a key sequence at a time. +See also @code{momentary-string-display} in @ref{Temporary Displays}, +and @code{sit-for} in @ref{Waiting}. @xref{Terminal Input}, for +functions and variables for controlling terminal input modes and +debugging terminal input. + + For higher-level input facilities, see @ref{Minibuffers}. + +@menu +* Key Sequence Input:: How to read one key sequence. +* Reading One Event:: How to read just one event. +* Dispatching an Event:: What to do with an event once it has been read. +* Quoted Character Input:: Asking the user to specify a character. +* Peeking and Discarding:: How to reread or throw away input events. +@end menu + +@node Key Sequence Input +@subsection Key Sequence Input +@cindex key sequence input + +Lisp programs can read input a key sequence at a time by calling +@code{read-key-sequence}; for example, @code{describe-key} uses it to +read the key to describe. + +@defun read-key-sequence prompt +@cindex key sequence +This function reads a sequence of keystrokes or mouse clicks and returns +it as a vector of events. It keeps reading events until it has +accumulated a full key sequence; that is, enough to specify a non-prefix +command using the currently active keymaps. + +The vector and the event objects it contains are freshly created, and +will not be side-effected by subsequent calls to this function. + +The function @code{read-key-sequence} suppresses quitting: @kbd{C-g} +typed while reading with this function works like any other character, +and does not set @code{quit-flag}. @xref{Quitting}. + +The argument @var{prompt} is either a string to be displayed in the echo +area as a prompt, or @code{nil}, meaning not to display a prompt. + +@c XEmacs feature +If the user selects a menu item while we are prompting for a key +sequence, the returned value will be a vector of a single menu-selection +event (a misc-user event). An error will be signalled if you pass this +value to @code{lookup-key} or a related function. + +In the example below, the prompt @samp{?} is displayed in the echo area, +and the user types @kbd{C-x C-f}. + +@example +(read-key-sequence "?") + +@group +---------- Echo Area ---------- +?@kbd{C-x C-f} +---------- Echo Area ---------- + + @result{} [#<keypress-event control-X> #<keypress-event control-F>] +@end group +@end example +@end defun + +@ignore @c Not in XEmacs +@defvar num-input-keys +@c Emacs 19 feature +This variable's value is the number of key sequences processed so far in +this XEmacs session. This includes key sequences read from the terminal +and key sequences read from keyboard macros being executed. +@end defvar +@end ignore + +@cindex upper case key sequence +@cindex downcasing in @code{lookup-key} +If an input character is an upper-case letter and has no key binding, +but its lower-case equivalent has one, then @code{read-key-sequence} +converts the character to lower case. Note that @code{lookup-key} does +not perform case conversion in this way. + +@node Reading One Event +@subsection Reading One Event + + The lowest level functions for command input are those which read a +single event. These functions often make a distinction between +@dfn{command events}, which are user actions (keystrokes and mouse +actions), and other events, which serve as communication between +XEmacs and the window system. + +@defun next-event &optional event prompt +This function reads and returns the next available event from the window +system or terminal driver, waiting if necessary until an event is +available. Pass this object to @code{dispatch-event} to handle it. If +an event object is supplied, it is filled in and returned; otherwise a +new event object will be created. + +Events can come directly from the user, from a keyboard macro, or from +@code{unread-command-events}. + +In most cases, the function @code{next-command-event} is more +appropriate. +@end defun + +@defun next-command-event &optional event +This function returns the next available ``user'' event from the window +system or terminal driver. Pass this object to @code{dispatch-event} to +handle it. If an event object is supplied, it is filled in and +returned, otherwise a new event object will be created. + +The event returned will be a keyboard, mouse press, or mouse release +event. If there are non-command events available (mouse motion, +sub-process output, etc) then these will be executed (with +@code{dispatch-event}) and discarded. This function is provided as a +convenience; it is equivalent to the Lisp code + +@lisp +@group + (while (progn + (next-event event) + (not (or (key-press-event-p event) + (button-press-event-p event) + (button-release-event-p event) + (menu-event-p event)))) + (dispatch-event event)) +@end group +@end lisp + +Here is what happens if you call @code{next-command-event} and then +press the right-arrow function key: + +@example +@group +(next-command-event) + @result{} #<keypress-event right> +@end group +@end example +@end defun + +@defun read-char +This function reads and returns a character of command input. If a +mouse click is detected, an error is signalled. The character typed is +returned as an @sc{ASCII} value. This function is retained for +compatibility with Emacs 18, and is most likely the wrong thing for you +to be using: consider using @code{next-command-event} instead. +@end defun + +@defun enqueue-eval-event function object +This function adds an eval event to the back of the queue. The +eval event will be the next event read after all pending events. +@end defun + +@node Dispatching an Event +@subsection Dispatching an Event +@cindex dispatching an event + +@defun dispatch-event event +Given an event object returned by @code{next-event}, this function +executes it. This is the basic function that makes XEmacs respond to +user input; it also deals with notifications from the window system +(such as Expose events). +@end defun + +@node Quoted Character Input +@subsection Quoted Character Input +@cindex quoted character input + + You can use the function @code{read-quoted-char} to ask the user to +specify a character, and allow the user to specify a control or meta +character conveniently, either literally or as an octal character code. +The command @code{quoted-insert} uses this function. + +@defun read-quoted-char &optional prompt +@cindex octal character input +@cindex control characters, reading +@cindex nonprinting characters, reading +This function is like @code{read-char}, except that if the first +character read is an octal digit (0-7), it reads up to two more octal digits +(but stopping if a non-octal digit is found) and returns the +character represented by those digits in octal. + +Quitting is suppressed when the first character is read, so that the +user can enter a @kbd{C-g}. @xref{Quitting}. + +If @var{prompt} is supplied, it specifies a string for prompting the +user. The prompt string is always displayed in the echo area, followed +by a single @samp{-}. + +In the following example, the user types in the octal number 177 (which +is 127 in decimal). + +@example +(read-quoted-char "What character") + +@group +---------- Echo Area ---------- +What character-@kbd{177} +---------- Echo Area ---------- + + @result{} 127 +@end group +@end example +@end defun + +@need 2000 +@node Peeking and Discarding +@subsection Miscellaneous Event Input Features + +This section describes how to ``peek ahead'' at events without using +them up, how to check for pending input, and how to discard pending +input. + +See also the variables @code{last-command-event} and @code{last-command-char} +(@ref{Command Loop Info}). + +@defvar unread-command-events +@cindex next input +@cindex peeking at input +This variable holds a list of events waiting to be read as command +input. The events are used in the order they appear in the list, and +removed one by one as they are used. + +The variable is needed because in some cases a function reads a event +and then decides not to use it. Storing the event in this variable +causes it to be processed normally, by the command loop or by the +functions to read command input. + +@cindex prefix argument unreading +For example, the function that implements numeric prefix arguments reads +any number of digits. When it finds a non-digit event, it must unread +the event so that it can be read normally by the command loop. +Likewise, incremental search uses this feature to unread events with no +special meaning in a search, because these events should exit the search +and then execute normally. + +@ignore FSF Emacs stuff +The reliable and easy way to extract events from a key sequence so as to +put them in @code{unread-command-events} is to use +@code{listify-key-sequence} (@pxref{Strings of Events}). +@end ignore +@end defvar + +@defvar unread-command-event +This variable holds a single event to be read as command input. + +This variable is mostly obsolete now that you can use +@code{unread-command-events} instead; it exists only to support programs +written for versions of XEmacs prior to 19.12. +@end defvar + +@defun input-pending-p +@cindex waiting for command key input +This function determines whether any command input is currently +available to be read. It returns immediately, with value @code{t} if +there is available input, @code{nil} otherwise. On rare occasions it +may return @code{t} when no input is available. +@end defun + +@defvar last-input-event +This variable is set to the last keyboard or mouse button event received. + +This variable is off limits: you may not set its value or modify the +event that is its value, as it is destructively modified by +@code{read-key-sequence}. If you want to keep a pointer to this value, +you must use @code{copy-event}. + +Note that this variable is an alias for @code{last-input-char} in +FSF Emacs. + +In the example below, a character is read (the character @kbd{1}). It +becomes the value of @code{last-input-event}, while @kbd{C-e} (from the +@kbd{C-x C-e} command used to evaluate this expression) remains the +value of @code{last-command-event}. + +@example +@group +(progn (print (next-command-event)) + (print last-command-event) + last-input-event) + @print{} #<keypress-event 1> + @print{} #<keypress-event control-E> + @result{} #<keypress-event 1> + +@end group +@end example +@end defvar + +@defvar last-input-char +If the value of @code{last-input-event} is a keyboard event, then this +is the nearest @sc{ASCII} equivalent to it. Remember that there is +@emph{not} a 1:1 mapping between keyboard events and @sc{ASCII} +characters: the set of keyboard events is much larger, so writing code +that examines this variable to determine what key has been typed is bad +practice, unless you are certain that it will be one of a small set of +characters. + +This function exists for compatibility with Emacs version 18. +@end defvar + +@defun discard-input +@cindex flush input +@cindex discard input +@cindex terminate keyboard macro +This function discards the contents of the terminal input buffer and +cancels any keyboard macro that might be in the process of definition. +It returns @code{nil}. + +In the following example, the user may type a number of characters right +after starting the evaluation of the form. After the @code{sleep-for} +finishes sleeping, @code{discard-input} discards any characters typed +during the sleep. + +@example +(progn (sleep-for 2) + (discard-input)) + @result{} nil +@end example +@end defun + +@node Waiting +@section Waiting for Elapsed Time or Input +@cindex pausing +@cindex waiting + + The wait functions are designed to wait for a certain amount of time +to pass or until there is input. For example, you may wish to pause in +the middle of a computation to allow the user time to view the display. +@code{sit-for} pauses and updates the screen, and returns immediately if +input comes in, while @code{sleep-for} pauses without updating the +screen. + +Note that in FSF Emacs, the commands @code{sit-for} and @code{sleep-for} +take two arguments to specify the time (one integer and one float +value), instead of a single argument that can be either an integer or a +float. + +@defun sit-for seconds &optional nodisp +This function performs redisplay (provided there is no pending input +from the user), then waits @var{seconds} seconds, or until input is +available. The result is @code{t} if @code{sit-for} waited the full +time with no input arriving (see @code{input-pending-p} in @ref{Peeking +and Discarding}). Otherwise, the value is @code{nil}. + +The argument @var{seconds} need not be an integer. If it is a floating +point number, @code{sit-for} waits for a fractional number of seconds. +@ignore FSF Emacs stuff +Some systems support only a whole number of seconds; on these systems, +@var{seconds} is rounded down. + +The optional argument @var{millisec} specifies an additional waiting +period measured in milliseconds. This adds to the period specified by +@var{seconds}. If the system doesn't support waiting fractions of a +second, you get an error if you specify nonzero @var{millisec}. +@end ignore + +@cindex forcing redisplay +Redisplay is normally preempted if input arrives, and does not happen at +all if input is available before it starts. (You can force screen +updating in such a case by using @code{force-redisplay}. @xref{Refresh +Screen}.) If there is no input pending, you can force an update with no +delay by using @code{(sit-for 0)}. + +If @var{nodisp} is non-@code{nil}, then @code{sit-for} does not +redisplay, but it still returns as soon as input is available (or when +the timeout elapses). + +@ignore +Iconifying or deiconifying a frame makes @code{sit-for} return, because +that generates an event. @xref{Misc Events}. +@end ignore + +The usual purpose of @code{sit-for} is to give the user time to read +text that you display. +@end defun + +@defun sleep-for seconds +This function simply pauses for @var{seconds} seconds without updating +the display. This function pays no attention to available input. It +returns @code{nil}. + +The argument @var{seconds} need not be an integer. If it is a floating +point number, @code{sleep-for} waits for a fractional number of seconds. +@ignore FSF Emacs stuff +Some systems support only a whole number of seconds; on these systems, +@var{seconds} is rounded down. + +The optional argument @var{millisec} specifies an additional waiting +period measured in milliseconds. This adds to the period specified by +@var{seconds}. If the system doesn't support waiting fractions of a +second, you get an error if you specify nonzero @var{millisec}. +@end ignore + +Use @code{sleep-for} when you wish to guarantee a delay. +@end defun + + @xref{Time of Day}, for functions to get the current time. + +@node Quitting +@section Quitting +@cindex @kbd{C-g} +@cindex quitting + + Typing @kbd{C-g} while a Lisp function is running causes XEmacs to +@dfn{quit} whatever it is doing. This means that control returns to the +innermost active command loop. + + Typing @kbd{C-g} while the command loop is waiting for keyboard input +does not cause a quit; it acts as an ordinary input character. In the +simplest case, you cannot tell the difference, because @kbd{C-g} +normally runs the command @code{keyboard-quit}, whose effect is to quit. +However, when @kbd{C-g} follows a prefix key, the result is an undefined +key. The effect is to cancel the prefix key as well as any prefix +argument. + + In the minibuffer, @kbd{C-g} has a different definition: it aborts out +of the minibuffer. This means, in effect, that it exits the minibuffer +and then quits. (Simply quitting would return to the command loop +@emph{within} the minibuffer.) The reason why @kbd{C-g} does not quit +directly when the command reader is reading input is so that its meaning +can be redefined in the minibuffer in this way. @kbd{C-g} following a +prefix key is not redefined in the minibuffer, and it has its normal +effect of canceling the prefix key and prefix argument. This too +would not be possible if @kbd{C-g} always quit directly. + + When @kbd{C-g} does directly quit, it does so by setting the variable +@code{quit-flag} to @code{t}. XEmacs checks this variable at appropriate +times and quits if it is not @code{nil}. Setting @code{quit-flag} +non-@code{nil} in any way thus causes a quit. + + At the level of C code, quitting cannot happen just anywhere; only at the +special places that check @code{quit-flag}. The reason for this is +that quitting at other places might leave an inconsistency in XEmacs's +internal state. Because quitting is delayed until a safe place, quitting +cannot make XEmacs crash. + + Certain functions such as @code{read-key-sequence} or +@code{read-quoted-char} prevent quitting entirely even though they wait +for input. Instead of quitting, @kbd{C-g} serves as the requested +input. In the case of @code{read-key-sequence}, this serves to bring +about the special behavior of @kbd{C-g} in the command loop. In the +case of @code{read-quoted-char}, this is so that @kbd{C-q} can be used +to quote a @kbd{C-g}. + + You can prevent quitting for a portion of a Lisp function by binding +the variable @code{inhibit-quit} to a non-@code{nil} value. Then, +although @kbd{C-g} still sets @code{quit-flag} to @code{t} as usual, the +usual result of this---a quit---is prevented. Eventually, +@code{inhibit-quit} will become @code{nil} again, such as when its +binding is unwound at the end of a @code{let} form. At that time, if +@code{quit-flag} is still non-@code{nil}, the requested quit happens +immediately. This behavior is ideal when you wish to make sure that +quitting does not happen within a ``critical section'' of the program. + +@cindex @code{read-quoted-char} quitting + In some functions (such as @code{read-quoted-char}), @kbd{C-g} is +handled in a special way that does not involve quitting. This is done +by reading the input with @code{inhibit-quit} bound to @code{t}, and +setting @code{quit-flag} to @code{nil} before @code{inhibit-quit} +becomes @code{nil} again. This excerpt from the definition of +@code{read-quoted-char} shows how this is done; it also shows that +normal quitting is permitted after the first character of input. + +@example +(defun read-quoted-char (&optional prompt) + "@dots{}@var{documentation}@dots{}" + (let ((count 0) (code 0) char) + (while (< count 3) + (let ((inhibit-quit (zerop count)) + (help-form nil)) + (and prompt (message "%s-" prompt)) + (setq char (read-char)) + (if inhibit-quit (setq quit-flag nil))) + @dots{}) + (logand 255 code))) +@end example + +@defvar quit-flag +If this variable is non-@code{nil}, then XEmacs quits immediately, unless +@code{inhibit-quit} is non-@code{nil}. Typing @kbd{C-g} ordinarily sets +@code{quit-flag} non-@code{nil}, regardless of @code{inhibit-quit}. +@end defvar + +@defvar inhibit-quit +This variable determines whether XEmacs should quit when @code{quit-flag} +is set to a value other than @code{nil}. If @code{inhibit-quit} is +non-@code{nil}, then @code{quit-flag} has no special effect. +@end defvar + +@deffn Command keyboard-quit +This function signals the @code{quit} condition with @code{(signal 'quit +nil)}. This is the same thing that quitting does. (See @code{signal} +in @ref{Errors}.) +@end deffn + + You can specify a character other than @kbd{C-g} to use for quitting. +See the function @code{set-input-mode} in @ref{Terminal Input}. + +@node Prefix Command Arguments +@section Prefix Command Arguments +@cindex prefix argument +@cindex raw prefix argument +@cindex numeric prefix argument + + Most XEmacs commands can use a @dfn{prefix argument}, a number +specified before the command itself. (Don't confuse prefix arguments +with prefix keys.) The prefix argument is at all times represented by a +value, which may be @code{nil}, meaning there is currently no prefix +argument. Each command may use the prefix argument or ignore it. + + There are two representations of the prefix argument: @dfn{raw} and +@dfn{numeric}. The editor command loop uses the raw representation +internally, and so do the Lisp variables that store the information, but +commands can request either representation. + + Here are the possible values of a raw prefix argument: + +@itemize @bullet +@item +@code{nil}, meaning there is no prefix argument. Its numeric value is +1, but numerous commands make a distinction between @code{nil} and the +integer 1. + +@item +An integer, which stands for itself. + +@item +A list of one element, which is an integer. This form of prefix +argument results from one or a succession of @kbd{C-u}'s with no +digits. The numeric value is the integer in the list, but some +commands make a distinction between such a list and an integer alone. + +@item +The symbol @code{-}. This indicates that @kbd{M--} or @kbd{C-u -} was +typed, without following digits. The equivalent numeric value is +@minus{}1, but some commands make a distinction between the integer +@minus{}1 and the symbol @code{-}. +@end itemize + +We illustrate these possibilities by calling the following function with +various prefixes: + +@example +@group +(defun display-prefix (arg) + "Display the value of the raw prefix arg." + (interactive "P") + (message "%s" arg)) +@end group +@end example + +@noindent +Here are the results of calling @code{display-prefix} with various +raw prefix arguments: + +@example + M-x display-prefix @print{} nil + +C-u M-x display-prefix @print{} (4) + +C-u C-u M-x display-prefix @print{} (16) + +C-u 3 M-x display-prefix @print{} 3 + +M-3 M-x display-prefix @print{} 3 ; @r{(Same as @code{C-u 3}.)} + +C-3 M-x display-prefix @print{} 3 ; @r{(Same as @code{C-u 3}.)} + +C-u - M-x display-prefix @print{} - + +M-- M-x display-prefix @print{} - ; @r{(Same as @code{C-u -}.)} + +C-- M-x display-prefix @print{} - ; @r{(Same as @code{C-u -}.)} + +C-u - 7 M-x display-prefix @print{} -7 + +M-- 7 M-x display-prefix @print{} -7 ; @r{(Same as @code{C-u -7}.)} + +C-- 7 M-x display-prefix @print{} -7 ; @r{(Same as @code{C-u -7}.)} +@end example + + XEmacs uses two variables to store the prefix argument: +@code{prefix-arg} and @code{current-prefix-arg}. Commands such as +@code{universal-argument} that set up prefix arguments for other +commands store them in @code{prefix-arg}. In contrast, +@code{current-prefix-arg} conveys the prefix argument to the current +command, so setting it has no effect on the prefix arguments for future +commands. + + Normally, commands specify which representation to use for the prefix +argument, either numeric or raw, in the @code{interactive} declaration. +(@xref{Using Interactive}.) Alternatively, functions may look at the +value of the prefix argument directly in the variable +@code{current-prefix-arg}, but this is less clean. + +@defun prefix-numeric-value arg +This function returns the numeric meaning of a valid raw prefix argument +value, @var{arg}. The argument may be a symbol, a number, or a list. +If it is @code{nil}, the value 1 is returned; if it is @code{-}, the +value @minus{}1 is returned; if it is a number, that number is returned; +if it is a list, the @sc{car} of that list (which should be a number) is +returned. +@end defun + +@defvar current-prefix-arg +This variable holds the raw prefix argument for the @emph{current} +command. Commands may examine it directly, but the usual way to access +it is with @code{(interactive "P")}. +@end defvar + +@defvar prefix-arg +The value of this variable is the raw prefix argument for the +@emph{next} editing command. Commands that specify prefix arguments for +the following command work by setting this variable. +@end defvar + + Do not call the functions @code{universal-argument}, +@code{digit-argument}, or @code{negative-argument} unless you intend to +let the user enter the prefix argument for the @emph{next} command. + +@deffn Command universal-argument +This command reads input and specifies a prefix argument for the +following command. Don't call this command yourself unless you know +what you are doing. +@end deffn + +@deffn Command digit-argument arg +This command adds to the prefix argument for the following command. The +argument @var{arg} is the raw prefix argument as it was before this +command; it is used to compute the updated prefix argument. Don't call +this command yourself unless you know what you are doing. +@end deffn + +@deffn Command negative-argument arg +This command adds to the numeric argument for the next command. The +argument @var{arg} is the raw prefix argument as it was before this +command; its value is negated to form the new prefix argument. Don't +call this command yourself unless you know what you are doing. +@end deffn + +@node Recursive Editing +@section Recursive Editing +@cindex recursive command loop +@cindex recursive editing level +@cindex command loop, recursive + + The XEmacs command loop is entered automatically when XEmacs starts up. +This top-level invocation of the command loop never exits; it keeps +running as long as XEmacs does. Lisp programs can also invoke the +command loop. Since this makes more than one activation of the command +loop, we call it @dfn{recursive editing}. A recursive editing level has +the effect of suspending whatever command invoked it and permitting the +user to do arbitrary editing before resuming that command. + + The commands available during recursive editing are the same ones +available in the top-level editing loop and defined in the keymaps. +Only a few special commands exit the recursive editing level; the others +return to the recursive editing level when they finish. (The special +commands for exiting are always available, but they do nothing when +recursive editing is not in progress.) + + All command loops, including recursive ones, set up all-purpose error +handlers so that an error in a command run from the command loop will +not exit the loop. + +@cindex minibuffer input + Minibuffer input is a special kind of recursive editing. It has a few +special wrinkles, such as enabling display of the minibuffer and the +minibuffer window, but fewer than you might suppose. Certain keys +behave differently in the minibuffer, but that is only because of the +minibuffer's local map; if you switch windows, you get the usual XEmacs +commands. + +@cindex @code{throw} example +@kindex exit +@cindex exit recursive editing +@cindex aborting + To invoke a recursive editing level, call the function +@code{recursive-edit}. This function contains the command loop; it also +contains a call to @code{catch} with tag @code{exit}, which makes it +possible to exit the recursive editing level by throwing to @code{exit} +(@pxref{Catch and Throw}). If you throw a value other than @code{t}, +then @code{recursive-edit} returns normally to the function that called +it. The command @kbd{C-M-c} (@code{exit-recursive-edit}) does this. +Throwing a @code{t} value causes @code{recursive-edit} to quit, so that +control returns to the command loop one level up. This is called +@dfn{aborting}, and is done by @kbd{C-]} (@code{abort-recursive-edit}). + + Most applications should not use recursive editing, except as part of +using the minibuffer. Usually it is more convenient for the user if you +change the major mode of the current buffer temporarily to a special +major mode, which should have a command to go back to the previous mode. +(The @kbd{e} command in Rmail uses this technique.) Or, if you wish to +give the user different text to edit ``recursively'', create and select +a new buffer in a special mode. In this mode, define a command to +complete the processing and go back to the previous buffer. (The +@kbd{m} command in Rmail does this.) + + Recursive edits are useful in debugging. You can insert a call to +@code{debug} into a function definition as a sort of breakpoint, so that +you can look around when the function gets there. @code{debug} invokes +a recursive edit but also provides the other features of the debugger. + + Recursive editing levels are also used when you type @kbd{C-r} in +@code{query-replace} or use @kbd{C-x q} (@code{kbd-macro-query}). + +@defun recursive-edit +@cindex suspend evaluation +This function invokes the editor command loop. It is called +automatically by the initialization of XEmacs, to let the user begin +editing. When called from a Lisp program, it enters a recursive editing +level. + + In the following example, the function @code{simple-rec} first +advances point one word, then enters a recursive edit, printing out a +message in the echo area. The user can then do any editing desired, and +then type @kbd{C-M-c} to exit and continue executing @code{simple-rec}. + +@example +(defun simple-rec () + (forward-word 1) + (message "Recursive edit in progress") + (recursive-edit) + (forward-word 1)) + @result{} simple-rec +(simple-rec) + @result{} nil +@end example +@end defun + +@deffn Command exit-recursive-edit +This function exits from the innermost recursive edit (including +minibuffer input). Its definition is effectively @code{(throw 'exit +nil)}. +@end deffn + +@deffn Command abort-recursive-edit +This function aborts the command that requested the innermost recursive +edit (including minibuffer input), by signaling @code{quit} +after exiting the recursive edit. Its definition is effectively +@code{(throw 'exit t)}. @xref{Quitting}. +@end deffn + +@deffn Command top-level +This function exits all recursive editing levels; it does not return a +value, as it jumps completely out of any computation directly back to +the main command loop. +@end deffn + +@defun recursion-depth +This function returns the current depth of recursive edits. When no +recursive edit is active, it returns 0. +@end defun + +@node Disabling Commands +@section Disabling Commands +@cindex disabled command + + @dfn{Disabling a command} marks the command as requiring user +confirmation before it can be executed. Disabling is used for commands +which might be confusing to beginning users, to prevent them from using +the commands by accident. + +@kindex disabled + The low-level mechanism for disabling a command is to put a +non-@code{nil} @code{disabled} property on the Lisp symbol for the +command. These properties are normally set up by the user's +@file{.emacs} file with Lisp expressions such as this: + +@example +(put 'upcase-region 'disabled t) +@end example + +@noindent +For a few commands, these properties are present by default and may be +removed by the @file{.emacs} file. + + If the value of the @code{disabled} property is a string, the message +saying the command is disabled includes that string. For example: + +@example +(put 'delete-region 'disabled + "Text deleted this way cannot be yanked back!\n") +@end example + + @xref{Disabling,,, emacs, The XEmacs Reference Manual}, for the details on +what happens when a disabled command is invoked interactively. +Disabling a command has no effect on calling it as a function from Lisp +programs. + +@deffn Command enable-command command +Allow @var{command} to be executed without special confirmation from now +on, and (if the user confirms) alter the user's @file{.emacs} file so +that this will apply to future sessions. +@end deffn + +@deffn Command disable-command command +Require special confirmation to execute @var{command} from now on, and +(if the user confirms) alter the user's @file{.emacs} file so that this +will apply to future sessions. +@end deffn + +@defvar disabled-command-hook +This normal hook is run instead of a disabled command, when the user +invokes the disabled command interactively. The hook functions can use +@code{this-command-keys} to determine what the user typed to run the +command, and thus find the command itself. @xref{Hooks}. + +By default, @code{disabled-command-hook} contains a function that asks +the user whether to proceed. +@end defvar + +@node Command History +@section Command History +@cindex command history +@cindex complex command +@cindex history of commands + + The command loop keeps a history of the complex commands that have +been executed, to make it convenient to repeat these commands. A +@dfn{complex command} is one for which the interactive argument reading +uses the minibuffer. This includes any @kbd{M-x} command, any +@kbd{M-:} command, and any command whose @code{interactive} +specification reads an argument from the minibuffer. Explicit use of +the minibuffer during the execution of the command itself does not cause +the command to be considered complex. + +@defvar command-history +This variable's value is a list of recent complex commands, each +represented as a form to evaluate. It continues to accumulate all +complex commands for the duration of the editing session, but all but +the first (most recent) thirty elements are deleted when a garbage +collection takes place (@pxref{Garbage Collection}). + +@example +@group +command-history +@result{} ((switch-to-buffer "chistory.texi") + (describe-key "^X^[") + (visit-tags-table "~/emacs/src/") + (find-tag "repeat-complex-command")) +@end group +@end example +@end defvar + + This history list is actually a special case of minibuffer history +(@pxref{Minibuffer History}), with one special twist: the elements are +expressions rather than strings. + + There are a number of commands devoted to the editing and recall of +previous commands. The commands @code{repeat-complex-command}, and +@code{list-command-history} are described in the user manual +(@pxref{Repetition,,, emacs, The XEmacs Reference Manual}). Within the +minibuffer, the history commands used are the same ones available in any +minibuffer. + +@node Keyboard Macros +@section Keyboard Macros +@cindex keyboard macros + + A @dfn{keyboard macro} is a canned sequence of input events that can +be considered a command and made the definition of a key. The Lisp +representation of a keyboard macro is a string or vector containing the +events. Don't confuse keyboard macros with Lisp macros +(@pxref{Macros}). + +@defun execute-kbd-macro macro &optional count +This function executes @var{macro} as a sequence of events. If +@var{macro} is a string or vector, then the events in it are executed +exactly as if they had been input by the user. The sequence is +@emph{not} expected to be a single key sequence; normally a keyboard +macro definition consists of several key sequences concatenated. + +If @var{macro} is a symbol, then its function definition is used in +place of @var{macro}. If that is another symbol, this process repeats. +Eventually the result should be a string or vector. If the result is +not a symbol, string, or vector, an error is signaled. + +The argument @var{count} is a repeat count; @var{macro} is executed that +many times. If @var{count} is omitted or @code{nil}, @var{macro} is +executed once. If it is 0, @var{macro} is executed over and over until it +encounters an error or a failing search. +@end defun + +@defvar executing-macro +This variable contains the string or vector that defines the keyboard +macro that is currently executing. It is @code{nil} if no macro is +currently executing. A command can test this variable to behave +differently when run from an executing macro. Do not set this variable +yourself. +@end defvar + +@defvar defining-kbd-macro +This variable indicates whether a keyboard macro is being defined. A +command can test this variable to behave differently while a macro is +being defined. The commands @code{start-kbd-macro} and +@code{end-kbd-macro} set this variable---do not set it yourself. +@end defvar + +@defvar last-kbd-macro +This variable is the definition of the most recently defined keyboard +macro. Its value is a string or vector, or @code{nil}. +@end defvar + +@c Broke paragraph to prevent overfull hbox. --rjc 15mar92 + The commands are described in the user's manual (@pxref{Keyboard +Macros,,, emacs, The XEmacs Reference Manual}).