elisp: Command Overview
20.1 Command Loop Overview
==========================
The first thing the command loop must do is read a key sequence, which
is a sequence of input events that translates into a command. It does
this by calling the function ‘read-key-sequence’. Lisp programs can
also call this function (
Key Sequence Input). They can also
read input at a lower level with ‘read-key’ or ‘read-event’ (
Reading One Event), or discard pending input with ‘discard-input’
(
Event Input Misc).
The key sequence is translated into a command through the currently
active keymaps.
Key Lookup, for information on how this is
done. The result should be a keyboard macro or an interactively
callable function. If the key is ‘M-x’, then it reads the name of
another command, which it then calls. This is done by the command
‘execute-extended-command’ (
Interactive Call).
Prior to executing the command, Emacs runs ‘undo-boundary’ to create
an undo boundary.
Maintaining Undo.
To execute a command, Emacs first reads its arguments by calling
‘command-execute’ (
Interactive Call). For commands written in
Lisp, the ‘interactive’ specification says how to read the arguments.
This may use the prefix argument (
Prefix Command Arguments) or
may read with prompting in the minibuffer (
Minibuffers). For
example, the command ‘find-file’ has an ‘interactive’ specification
which says to read a file name using the minibuffer. The function body
of ‘find-file’ does not use the minibuffer, so if you call ‘find-file’
as a function from Lisp code, you must supply the file name string as an
ordinary Lisp function argument.
If the command is a keyboard macro (i.e., a string or vector), Emacs
executes it using ‘execute-kbd-macro’ (
Keyboard Macros).
-- Variable: pre-command-hook
This normal hook is run by the editor command loop before it
executes each command. At that time, ‘this-command’ contains the
command that is about to run, and ‘last-command’ describes the
previous command.
Command Loop Info.
-- Variable: post-command-hook
This normal hook is run by the editor command loop after it
executes each command (including commands terminated prematurely by
quitting or by errors). At that time, ‘this-command’ refers to the
command that just ran, and ‘last-command’ refers to the command
before that.
This hook is also run when Emacs first enters the command loop (at
which point ‘this-command’ and ‘last-command’ are both ‘nil’).
Quitting is suppressed while running ‘pre-command-hook’ and
‘post-command-hook’. If an error happens while executing one of these
hooks, it does not terminate execution of the hook; instead the error is
silenced and the function in which the error occurred is removed from
the hook.
A request coming into the Emacs server (
(emacs)Emacs Server)
runs these two hooks just as a keyboard command does.