Mercurial > hg > xemacs-beta
diff man/lispref/keymaps.texi @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 169c0442b401 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/lispref/keymaps.texi Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,1577 @@ +@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 Copyright (C) 1996 Ben Wing. +@c See the file lispref.texi for copying conditions. +@setfilename ../../info/keymaps.info +@node Keymaps, Menus, Command Loop, Top +@chapter Keymaps +@cindex keymap + +@c This section is largely different from the one in FSF Emacs. + + The bindings between input events and commands are recorded in data +structures called @dfn{keymaps}. Each binding in a keymap associates +(or @dfn{binds}) an individual event type either with another keymap or +with a command. When an event is bound to a keymap, that keymap is +used to look up the next input event; this continues until a command +is found. The whole process is called @dfn{key lookup}. + +@menu +* Keymap Terminology:: Definitions of terms pertaining to keymaps. +* Format of Keymaps:: What a keymap looks like as a Lisp object. +* Creating Keymaps:: Functions to create and copy keymaps. +* Inheritance and Keymaps:: How one keymap can inherit the bindings + of another keymap. +* Key Sequences:: How to specify key sequences. +* Prefix Keys:: Defining a key with a keymap as its definition. +* Active Keymaps:: Each buffer has a local keymap + to override the standard (global) bindings. + A minor mode can also override them. +* Key Lookup:: How extracting elements from keymaps works. +* Functions for Key Lookup:: How to request key lookup. +* Changing Key Bindings:: Redefining a key in a keymap. +* Key Binding Commands:: Interactive interfaces for redefining keys. +* Scanning Keymaps:: Looking through all keymaps, for printing help. +* Other Keymap Functions:: Miscellaneous keymap functions. +@end menu + +@node Keymap Terminology +@section Keymap Terminology +@cindex key +@cindex keystroke +@cindex key binding +@cindex binding of a key +@cindex complete key +@cindex undefined key + + A @dfn{keymap} is a table mapping event types to definitions (which +can be any Lisp objects, though only certain types are meaningful for +execution by the command loop). Given an event (or an event type) and a +keymap, XEmacs can get the event's definition. Events mapped in keymaps +include keypresses, button presses, and button releases +(@pxref{Events}). + + A sequence of input events that form a unit is called a +@dfn{key sequence}, or @dfn{key} for short. A sequence of one event +is always a key sequence, and so are some multi-event sequences. + + A keymap determines a binding or definition for any key sequence. If +the key sequence is a single event, its binding is the definition of the +event in the keymap. The binding of a key sequence of more than one +event is found by an iterative process: the binding of the first event +is found, and must be a keymap; then the second event's binding is found +in that keymap, and so on until all the events in the key sequence are +used up. + + If the binding of a key sequence is a keymap, we call the key sequence +a @dfn{prefix key}. Otherwise, we call it a @dfn{complete key} (because +no more events can be added to it). If the binding is @code{nil}, +we call the key @dfn{undefined}. Examples of prefix keys are @kbd{C-c}, +@kbd{C-x}, and @kbd{C-x 4}. Examples of defined complete keys are +@kbd{X}, @key{RET}, and @kbd{C-x 4 C-f}. Examples of undefined complete +keys are @kbd{C-x C-g}, and @kbd{C-c 3}. @xref{Prefix Keys}, for more +details. + + The rule for finding the binding of a key sequence assumes that the +intermediate bindings (found for the events before the last) are all +keymaps; if this is not so, the sequence of events does not form a +unit---it is not really a key sequence. In other words, removing one or +more events from the end of any valid key must always yield a prefix +key. For example, @kbd{C-f C-n} is not a key; @kbd{C-f} is not a prefix +key, so a longer sequence starting with @kbd{C-f} cannot be a key. + + Note that the set of possible multi-event key sequences depends on the +bindings for prefix keys; therefore, it can be different for different +keymaps, and can change when bindings are changed. However, a one-event +sequence is always a key sequence, because it does not depend on any +prefix keys for its well-formedness. + + At any time, several primary keymaps are @dfn{active}---that is, in +use for finding key bindings. These are the @dfn{global map}, which is +shared by all buffers; the @dfn{local keymap}, which is usually +associated with a specific major mode; and zero or more @dfn{minor mode +keymaps}, which belong to currently enabled minor modes. (Not all minor +modes have keymaps.) The local keymap bindings shadow (i.e., take +precedence over) the corresponding global bindings. The minor mode +keymaps shadow both local and global keymaps. @xref{Active Keymaps}, +for details. + +@node Format of Keymaps +@section Format of Keymaps +@cindex format of keymaps +@cindex keymap format + + A keymap is a primitive type that associates events with their +bindings. Note that this is different from Emacs 18 and FSF Emacs, +where keymaps are lists. + +@defun keymapp object +This function returns @code{t} if @var{object} is a keymap, @code{nil} +otherwise. +@end defun + +@node Creating Keymaps +@section Creating Keymaps +@cindex creating keymaps + + Here we describe the functions for creating keymaps. + +@defun make-keymap &optional name +This function constructs and returns a new keymap object. All entries +in it are @code{nil}, meaning ``command undefined''. + +Optional argument @var{name} specifies a name to assign to the keymap, +as in @code{set-keymap-name}. This name is only a debugging +convenience; it is not used except when printing the keymap. +@end defun + +@defun make-sparse-keymap &optional name +This function constructs and returns a new keymap object. All entries +in it are @code{nil}, meaning ``command undefined''. The only +difference between this function and @code{make-keymap} is that this +function returns a ``smaller'' keymap (one that is expected to contain +fewer entries). As keymaps dynamically resize, the distinction is not +great. + +Optional argument @var{name} specifies a name to assign to the keymap, +as in @code{set-keymap-name}. This name is only a debugging +convenience; it is not used except when printing the keymap. +@end defun + +@defun set-keymap-name keymap new-name +This function assigns a ``name'' to a keymap. The name is only a +debugging convenience; it is not used except when printing the keymap. +@end defun + +@defun keymap-name keymap +This function returns the ``name'' of a keymap, as assigned using +@code{set-keymap-name}. +@end defun + +@defun copy-keymap keymap +This function returns a copy of @var{keymap}. Any keymaps that +appear directly as bindings in @var{keymap} are also copied recursively, +and so on to any number of levels. However, recursive copying does not +take place when the definition of a character is a symbol whose function +definition is a keymap; the same symbol appears in the new copy. + +@example +@group +(setq map (copy-keymap (current-local-map))) +@result{} #<keymap 3 entries 0x21f80> +@end group + +@group +(eq map (current-local-map)) + @result{} nil +@end group +@ignore @c Doesn't work! +@group +(equal map (current-local-map)) + @result{} t +@end group +@end ignore +@end example +@end defun + +@node Inheritance and Keymaps +@section Inheritance and Keymaps +@cindex keymap inheritance +@cindex inheriting a keymap's bindings +@cindex keymap parent +@cindex parent of a keymap + + A keymap can inherit the bindings of other keymaps. The other +keymaps are called the keymap's @dfn{parents}, and are set with +@code{set-keymap-parents}. When searching for a binding for a key +sequence in a particular keymap, that keymap itself will first be +searched; then, if no binding was found in the map and it has parents, +the first parent keymap will be searched; then that keymap's parent will +be searched, and so on, until either a binding for the key sequence is +found, or a keymap without a parent is encountered. At this point, +the search will continue with the next parent of the most recently +encountered keymap that has another parent, etc. Essentially, a +depth-first search of all the ancestors of the keymap is conducted. + +@code{(current-global-map)} is the default parent of all keymaps. + +@defun set-keymap-parents keymap parents +This function sets the parent keymaps of @var{keymap} to the list +@var{parents}. + +If you change the bindings in one of the keymaps in @var{parents} using +@code{define-key} or other key-binding functions, these changes are +visible in @var{keymap} unless shadowed by bindings in that map or in +earlier-searched ancestors. The converse is not true: if you use +@code{define-key} to change @var{keymap}, that affects the bindings in +that map, but has no effect on any of the keymaps in @var{parents}. +@end defun + +@defun keymap-parents keymap +This function returns the list of parent keymaps of @var{keymap}, or +@code{nil} if @var{keymap} has no parents. +@end defun + + As an alternative to specifying a parent, you can also specify a +@dfn{default binding} that is used whenever a key is not otherwise bound +in the keymap. This is useful for terminal emulators, for example, +which may want to trap all keystrokes and pass them on in some modified +format. Note that if you specify a default binding for a keymap, +neither the keymap's parents nor the current global map are searched for +key bindings. + +@defun set-keymap-default-binding keymap command +This function sets the default binding of @var{keymap} to @var{command}, +or @code{nil} if no default is desired. +@end defun + +@defun keymap-default-binding keymap +This function returns the default binding of @var{keymap}, or @code{nil} +if it has none. +@end defun + +@node Key Sequences +@section Key Sequences +@cindex key sequences + + Contrary to popular belief, the world is not @sc{ASCII}. When running +under a window manager, XEmacs can tell the difference between, for +example, the keystrokes @kbd{control-h}, @kbd{control-shift-h}, and +@kbd{backspace}. You can, in fact, bind different commands to each of +these. + + A @dfn{key sequence} is a set of keystrokes. A @dfn{keystroke} is a +keysym and some set of modifiers (such as @key{CONTROL} and @key{META}). +A @dfn{keysym} is what is printed on the keys on your keyboard. + + A keysym may be represented by a symbol, or (if and only if it is +equivalent to an @sc{ASCII} character in the range 32 - 255) by a +character or its equivalent @sc{ASCII} code. The @kbd{A} key may be +represented by the symbol @code{A}, the character @code{?A}, or by the +number 65. The @kbd{break} key may be represented only by the symbol +@code{break}. + + A keystroke may be represented by a list: the last element of the list +is the key (a symbol, character, or number, as above) and the preceding +elements are the symbolic names of modifier keys (@key{CONTROL}, +@key{META}, @key{SUPER}, @key{HYPER}, @key{ALT}, and @key{SHIFT}). +Thus, the sequence @kbd{control-b} is represented by the forms +@code{(control b)}, @code{(control ?b)}, and @code{(control 98)}. A +keystroke may also be represented by an event object, as returned by the +@code{next-command-event} and @code{read-key-sequence} functions. + + Note that in this context, the keystroke @kbd{control-b} is @emph{not} +represented by the number 2 (the @sc{ASCII} code for @samp{^B}) or the +character @code{?\^B}. See below. + + The @key{SHIFT} modifier is somewhat of a special case. You should +not (and cannot) use @code{(meta shift a)} to mean @code{(meta A)}, +since for characters that have @sc{ASCII} equivalents, the state of the +shift key is implicit in the keysym (@samp{a} vs. @samp{A}). You also +cannot say @code{(shift =)} to mean @code{+}, as that sort of thing +varies from keyboard to keyboard. The @key{SHIFT} modifier is for use +only with characters that do not have a second keysym on the same key, +such as @code{backspace} and @code{tab}. + + A key sequence is a vector of keystrokes. As a degenerate case, +elements of this vector may also be keysyms if they have no modifiers. +That is, the @kbd{A} keystroke is represented by all of these forms: + +@example + A ?A 65 (A) (?A) (65) + [A] [?A] [65] [(A)] [(?A)] [(65)] +@end example + +the @kbd{control-a} keystroke is represented by these forms: + +@example + (control A) (control ?A) (control 65) + [(control A)] [(control ?A)] [(control 65)] +@end example + +the key sequence @kbd{control-c control-a} is represented by these +forms: + +@example + [(control c) (control a)] [(control ?c) (control ?a)] + [(control 99) (control 65)] etc. +@end example + + Mouse button clicks work just like keypresses: @code{(control +button1)} means pressing the left mouse button while holding down the +control key. @code{[(control c) (shift button3)]} means +@kbd{control-c}, hold @key{SHIFT}, click right. + + Commands may be bound to the mouse-button up-stroke rather than the +down-stroke as well. @code{button1} means the down-stroke, and +@code{button1up} means the up-stroke. Different commands may be bound +to the up and down strokes, though that is probably not what you want, +so be careful. + + For backward compatibility, a key sequence may also be represented by +a string. In this case, it represents the key sequence(s) that would +produce that sequence of @sc{ASCII} characters in a purely @sc{ASCII} +world. For example, a string containing the @sc{ASCII} backspace +character, @code{"\^H"}, would represent two key sequences: +@code{(control h)} and @code{backspace}. Binding a command to this will +actually bind both of those key sequences. Likewise for the following +pairs: + +@example + control h backspace + control i tab + control m return + control j linefeed + control [ escape + control @@ control space +@end example + + After binding a command to two key sequences with a form like + +@example + (define-key global-map "\^X\^I" 'command-1) +@end example + +@noindent +it is possible to redefine only one of those sequences like so: + +@example + (define-key global-map [(control x) (control i)] 'command-2) + (define-key global-map [(control x) tab] 'command-3) +@end example + + Of course, all of this applies only when running under a window +system. If you're talking to XEmacs through a @sc{TTY} connection, you +don't get any of these features. + +@defun event-matches-key-specifier-p event key-specifier +This function returns non-@code{nil} if @var{event} matches +@var{key-specifier}, which can be any valid form representing a key +sequence. This can be useful, e.g., to determine if the user pressed +@code{help-char} or @code{quit-char}. +@end defun + +@node Prefix Keys +@section Prefix Keys +@cindex prefix key + + A @dfn{prefix key} has an associated keymap that defines what to do +with key sequences that start with the prefix key. For example, +@kbd{C-x} is a prefix key, and it uses a keymap that is also stored in +the variable @code{ctl-x-map}. Here is a list of the standard prefix +keys of XEmacs and their keymaps: + +@itemize @bullet +@item +@cindex @kbd{C-h} +@code{help-map} is used for events that follow @kbd{C-h}. + +@item +@cindex @kbd{C-c} +@vindex mode-specific-map +@code{mode-specific-map} is for events that follow @kbd{C-c}. This +map is not actually mode specific; its name was chosen to be informative +for the user in @kbd{C-h b} (@code{display-bindings}), where it +describes the main use of the @kbd{C-c} prefix key. + +@item +@cindex @kbd{C-x} +@vindex ctl-x-map +@findex Control-X-prefix +@code{ctl-x-map} is the map used for events that follow @kbd{C-x}. This +map is also the function definition of @code{Control-X-prefix}. + +@item +@cindex @kbd{C-x 4} +@vindex ctl-x-4-map +@code{ctl-x-4-map} is used for events that follow @kbd{C-x 4}. + +@c Emacs 19 feature +@item +@cindex @kbd{C-x 5} +@vindex ctl-x-5-map +@code{ctl-x-5-map} is used for events that follow @kbd{C-x 5}. + +@c Emacs 19 feature +@item +@cindex @kbd{C-x n} +@cindex @kbd{C-x r} +@cindex @kbd{C-x a} +The prefix keys @kbd{C-x n}, @kbd{C-x r} and @kbd{C-x a} use keymaps +that have no special name. + +@item +@vindex esc-map +@findex ESC-prefix +@code{esc-map} is an evil hack that is present for compatibility +purposes with Emacs 18. Defining a key in @code{esc-map} is equivalent +to defining the same key in @code{global-map} but with the @key{META} +prefix added. You should @emph{not} use this in your code. (This map is +also the function definition of @code{ESC-prefix}.) +@end itemize + + The binding of a prefix key is the keymap to use for looking up the +events that follow the prefix key. (It may instead be a symbol whose +function definition is a keymap. The effect is the same, but the symbol +serves as a name for the prefix key.) Thus, the binding of @kbd{C-x} is +the symbol @code{Control-X-prefix}, whose function definition is the +keymap for @kbd{C-x} commands. (The same keymap is also the value of +@code{ctl-x-map}.) + + Prefix key definitions can appear in any active keymap. The +definitions of @kbd{C-c}, @kbd{C-x}, @kbd{C-h} and @key{ESC} as prefix +keys appear in the global map, so these prefix keys are always +available. Major and minor modes can redefine a key as a prefix by +putting a prefix key definition for it in the local map or the minor +mode's map. @xref{Active Keymaps}. + + If a key is defined as a prefix in more than one active map, then its +various definitions are in effect merged: the commands defined in the +minor mode keymaps come first, followed by those in the local map's +prefix definition, and then by those from the global map. + + In the following example, we make @kbd{C-p} a prefix key in the local +keymap, in such a way that @kbd{C-p} is identical to @kbd{C-x}. Then +the binding for @kbd{C-p C-f} is the function @code{find-file}, just +like @kbd{C-x C-f}. The key sequence @kbd{C-p 6} is not found in any +active keymap. + +@example +@group +(use-local-map (make-sparse-keymap)) + @result{} nil +@end group +@group +(local-set-key "\C-p" ctl-x-map) + @result{} nil +@end group +@group +(key-binding "\C-p\C-f") + @result{} find-file +@end group + +@group +(key-binding "\C-p6") + @result{} nil +@end group +@end example + +@defun define-prefix-command symbol &optional mapvar +@cindex prefix command +This function defines @var{symbol} as a prefix command: it creates a +keymap and stores it as @var{symbol}'s function definition. +Storing the symbol as the binding of a key makes the key a prefix key +that has a name. If optional argument @var{mapvar} is not specified, +it also sets @var{symbol} as a variable, to have the keymap as its +value. (If @var{mapvar} is given and is not @code{t}, its value is +stored as the value of @var{symbol}.) The function returns @var{symbol}. + + In Emacs version 18, only the function definition of @var{symbol} was +set, not the value as a variable. +@end defun + +@node Active Keymaps +@section Active Keymaps +@cindex active keymap +@cindex global keymap +@cindex local keymap + + XEmacs normally contains many keymaps; at any given time, just a few of +them are @dfn{active} in that they participate in the interpretation +of user input. These are the global keymap, the current buffer's +local keymap, and the keymaps of any enabled minor modes. + + The @dfn{global keymap} holds the bindings of keys that are defined +regardless of the current buffer, such as @kbd{C-f}. The variable +@code{global-map} holds this keymap, which is always active. + + Each buffer may have another keymap, its @dfn{local keymap}, which may +contain new or overriding definitions for keys. The current buffer's +local keymap is always active except when @code{overriding-local-map} or +@code{overriding-terminal-local-map} overrides it. Extents and text +properties can specify an alternative local map for certain parts of the +buffer; see @ref{Extents and Events}. + + Each minor mode may have a keymap; if it does, the keymap is active +when the minor mode is enabled. + + The variable @code{overriding-local-map} and +@code{overriding-terminal-local-map}, if non-@code{nil}, specify other +local keymaps that override the buffer's local map and all the minor +mode keymaps. + + All the active keymaps are used together to determine what command to +execute when a key is entered. XEmacs searches these maps one by one, in +order of decreasing precedence, until it finds a binding in one of the maps. + + More specifically: + + For key-presses, the order of keymaps searched is: + +@itemize @bullet +@item +the @code{keymap} property of any extent(s) or text properties at point; +@item +any applicable minor-mode maps; +@item +the current local map of the current buffer; +@item +the current global map. +@end itemize + + For mouse-clicks, the order of keymaps searched is: + +@itemize @bullet +@item +the current local map of the @code{mouse-grabbed-buffer} if any; +@item +the @code{keymap} property of any extent(s) at the position of the click +(this includes modeline extents); +@item +the @code{modeline-map} of the buffer corresponding to the modeline +under the mouse (if the click happened over a modeline); +@item +the value of @code{toolbar-map} in the current buffer (if the click +happened over a toolbar); +@item +the current local map of the buffer under the mouse (does not +apply to toolbar clicks); +@item +any applicable minor-mode maps; +@item +the current global map. +@end itemize + + Note that if @code{overriding-local-map} or +@code{overriding-terminal-local-map} is non-@code{nil}, @emph{only} +those two maps and the current global map are searched. + + The procedure for searching a single keymap is called +@dfn{key lookup}; see @ref{Key Lookup}. + +@cindex major mode keymap + Since every buffer that uses the same major mode normally uses the +same local keymap, you can think of the keymap as local to the mode. A +change to the local keymap of a buffer (using @code{local-set-key}, for +example) is seen also in the other buffers that share that keymap. + + The local keymaps that are used for Lisp mode, C mode, and several +other major modes exist even if they have not yet been used. These +local maps are the values of the variables @code{lisp-mode-map}, +@code{c-mode-map}, and so on. For most other modes, which are less +frequently used, the local keymap is constructed only when the mode is +used for the first time in a session. + + The minibuffer has local keymaps, too; they contain various completion +and exit commands. @xref{Intro to Minibuffers}. + + @xref{Standard Keymaps}, for a list of standard keymaps. + +@defun current-keymaps &optional event-or-keys +This function returns a list of the current keymaps that will be +searched for bindings. This lists keymaps such as the current local map +and the minor-mode maps, but does not list the parents of those keymaps. +@var{event-or-keys} controls which keymaps will be listed. If +@var{event-or-keys} is a mouse event (or a vector whose last element is +a mouse event), the keymaps for that mouse event will be listed. +Otherwise, the keymaps for key presses will be listed. +@end defun + +@defvar global-map +This variable contains the default global keymap that maps XEmacs +keyboard input to commands. The global keymap is normally this keymap. +The default global keymap is a full keymap that binds +@code{self-insert-command} to all of the printing characters. + +It is normal practice to change the bindings in the global map, but you +should not assign this variable any value other than the keymap it starts +out with. +@end defvar + +@defun current-global-map +This function returns the current global keymap. This is the +same as the value of @code{global-map} unless you change one or the +other. + +@example +@group +(current-global-map) +@result{} #<keymap global-map 639 entries 0x221> +@end group +@end example +@end defun + +@defun current-local-map +This function returns the current buffer's local keymap, or @code{nil} +if it has none. In the following example, the keymap for the +@samp{*scratch*} buffer (using Lisp Interaction mode) has a number +of entries, including one prefix key, @kbd{C-x}. + +@example +@group +(current-local-map) +@result{} #<keymap lisp-interaction-mode-map 5 entries 0x558> +(describe-bindings-internal (current-local-map)) +@result{} ; @r{Inserted into the buffer:} +backspace backward-delete-char-untabify +linefeed eval-print-last-sexp +delete delete-char +C-j eval-print-last-sexp +C-x << Prefix Command >> +M-tab lisp-complete-symbol +M-; lisp-indent-for-comment +M-C-i lisp-complete-symbol +M-C-q indent-sexp +M-C-x eval-defun +Alt-backspace backward-kill-sexp +Alt-delete kill-sexp +@end group + +@group +C-x x edebug-defun +@end group +@end example +@end defun + +@defun current-minor-mode-maps +This function returns a list of the keymaps of currently enabled minor modes. +@end defun + +@defun use-global-map keymap +This function makes @var{keymap} the new current global keymap. It +returns @code{nil}. + +It is very unusual to change the global keymap. +@end defun + +@defun use-local-map keymap &optional buffer +This function makes @var{keymap} the new local keymap of @var{buffer}. +@var{buffer} defaults to the current buffer. If @var{keymap} is +@code{nil}, then the buffer has no local keymap. @code{use-local-map} +returns @code{nil}. Most major mode commands use this function. +@end defun + +@c Emacs 19 feature +@defvar minor-mode-map-alist +This variable is an alist describing keymaps that may or may not be +active according to the values of certain variables. Its elements look +like this: + +@example +(@var{variable} . @var{keymap}) +@end example + +The keymap @var{keymap} is active whenever @var{variable} has a +non-@code{nil} value. Typically @var{variable} is the variable that +enables or disables a minor mode. @xref{Keymaps and Minor Modes}. + +Note that elements of @code{minor-mode-map-alist} do not have the same +structure as elements of @code{minor-mode-alist}. The map must be the +@sc{cdr} of the element; a list with the map as the second element will +not do. + +What's more, the keymap itself must appear in the @sc{cdr}. It does not +work to store a variable in the @sc{cdr} and make the map the value of +that variable. + +When more than one minor mode keymap is active, their order of priority +is the order of @code{minor-mode-map-alist}. But you should design +minor modes so that they don't interfere with each other. If you do +this properly, the order will not matter. + +See also @code{minor-mode-key-binding}, above. See @ref{Keymaps and +Minor Modes}, for more information about minor modes. +@end defvar + +@defvar modeline-map +This variable holds the keymap consulted for mouse-clicks on the +modeline of a window. This variable may be buffer-local; its value will +be looked up in the buffer of the window whose modeline was clicked +upon. +@end defvar + +@defvar toolbar-map +This variable holds the keymap consulted for mouse-clicks over a +toolbar. +@end defvar + +@defvar mouse-grabbed-buffer +If non-@code{nil}, a buffer which should be consulted first for all +mouse activity. When a mouse-click is processed, it will first be +looked up in the local-map of this buffer, and then through the normal +mechanism if there is no binding for that click. This buffer's value of +@code{mode-motion-hook} will be consulted instead of the +@code{mode-motion-hook} of the buffer of the window under the mouse. +You should @emph{bind} this, not set it. +@end defvar + +@defvar overriding-local-map +If non-@code{nil}, this variable holds a keymap to use instead of the +buffer's local keymap and instead of all the minor mode keymaps. This +keymap, if any, overrides all other maps that would have been active, +except for the current global map. +@end defvar + +@defvar overriding-terminal-local-map +If non-@code{nil}, this variable holds a keymap to use instead of the +buffer's local keymap and instead of all the minor mode keymaps, but for +the selected console only. (In other words, this variable is always +console-local; putting a keymap here only applies to keystrokes coming +from the selected console. @xref{Consoles and Devices}.) This keymap, +if any, overrides all other maps that would have been active, except for +the current global map. +@end defvar + +@node Key Lookup +@section Key Lookup +@cindex key lookup +@cindex keymap entry + + @dfn{Key lookup} is the process of finding the binding of a key +sequence from a given keymap. Actual execution of the binding is not +part of key lookup. + + Key lookup uses just the event type of each event in the key +sequence; the rest of the event is ignored. In fact, a key sequence +used for key lookup may designate mouse events with just their types +(symbols) instead of with entire mouse events (lists). @xref{Events}. +Such a pseudo-key-sequence is insufficient for @code{command-execute}, +but it is sufficient for looking up or rebinding a key. + + When the key sequence consists of multiple events, key lookup +processes the events sequentially: the binding of the first event is +found, and must be a keymap; then the second event's binding is found in +that keymap, and so on until all the events in the key sequence are used +up. (The binding thus found for the last event may or may not be a +keymap.) Thus, the process of key lookup is defined in terms of a +simpler process for looking up a single event in a keymap. How that is +done depends on the type of object associated with the event in that +keymap. + + Let's use the term @dfn{keymap entry} to describe the value found by +looking up an event type in a keymap. (This doesn't include the item +string and other extra elements in menu key bindings because +@code{lookup-key} and other key lookup functions don't include them in +the returned value.) While any Lisp object may be stored in a keymap as +a keymap entry, not all make sense for key lookup. Here is a list of +the meaningful kinds of keymap entries: + +@table @asis +@item @code{nil} +@cindex @code{nil} in keymap +@code{nil} means that the events used so far in the lookup form an +undefined key. When a keymap fails to mention an event type at all, and +has no default binding, that is equivalent to a binding of @code{nil} +for that event type. + +@item @var{keymap} +@cindex keymap in keymap +The events used so far in the lookup form a prefix key. The next +event of the key sequence is looked up in @var{keymap}. + +@item @var{command} +@cindex command in keymap +The events used so far in the lookup form a complete key, +and @var{command} is its binding. @xref{What Is a Function}. + +@item @var{array} +@cindex string in keymap +The array (either a string or a vector) is a keyboard macro. The events +used so far in the lookup form a complete key, and the array is its +binding. See @ref{Keyboard Macros}, for more information. (Note that +you cannot use a shortened form of a key sequence here, such as +@code{(control y)}; you must use the full form @code{[(control y)]}. +@xref{Key Sequences}.) + +@item @var{list} +@cindex list in keymap +The meaning of a list depends on the types of the elements of the list. + +@itemize @bullet +@item +@cindex @code{lambda} in keymap +If the @sc{car} of @var{list} is @code{lambda}, then the list is a +lambda expression. This is presumed to be a command, and is treated as +such (see above). + +@item +If the @sc{car} of @var{list} is a keymap and the @sc{cdr} is an event +type, then this is an @dfn{indirect entry}: + +@example +(@var{othermap} . @var{othertype}) +@end example + +When key lookup encounters an indirect entry, it looks up instead the +binding of @var{othertype} in @var{othermap} and uses that. + +This feature permits you to define one key as an alias for another key. +For example, an entry whose @sc{car} is the keymap called @code{esc-map} +and whose @sc{cdr} is 32 (the code for @key{SPC}) means, ``Use the global +binding of @kbd{Meta-@key{SPC}}, whatever that may be.'' +@end itemize + +@item @var{symbol} +@cindex symbol in keymap +The function definition of @var{symbol} is used in place of +@var{symbol}. If that too is a symbol, then this process is repeated, +any number of times. Ultimately this should lead to an object that is +a keymap, a command or a keyboard macro. A list is allowed if it is a +keymap or a command, but indirect entries are not understood when found +via symbols. + +Note that keymaps and keyboard macros (strings and vectors) are not +valid functions, so a symbol with a keymap, string, or vector as its +function definition is invalid as a function. It is, however, valid as +a key binding. If the definition is a keyboard macro, then the symbol +is also valid as an argument to @code{command-execute} +(@pxref{Interactive Call}). + +@cindex @code{undefined} in keymap +The symbol @code{undefined} is worth special mention: it means to treat +the key as undefined. Strictly speaking, the key is defined, and its +binding is the command @code{undefined}; but that command does the same +thing that is done automatically for an undefined key: it rings the bell +(by calling @code{ding}) but does not signal an error. + +@cindex preventing prefix key +@code{undefined} is used in local keymaps to override a global key +binding and make the key ``undefined'' locally. A local binding of +@code{nil} would fail to do this because it would not override the +global binding. + +@item @var{anything else} +If any other type of object is found, the events used so far in the +lookup form a complete key, and the object is its binding, but the +binding is not executable as a command. +@end table + + In short, a keymap entry may be a keymap, a command, a keyboard macro, +a symbol that leads to one of them, or an indirection or @code{nil}. + +@node Functions for Key Lookup +@section Functions for Key Lookup + + Here are the functions and variables pertaining to key lookup. + +@defun lookup-key keymap key &optional accept-defaults +This function returns the definition of @var{key} in @var{keymap}. If +the string or vector @var{key} is not a valid key sequence according to +the prefix keys specified in @var{keymap} (which means it is ``too +long'' and has extra events at the end), then the value is a number, the +number of events at the front of @var{key} that compose a complete key. + +@c Emacs 19 feature +If @var{accept-defaults} is non-@code{nil}, then @code{lookup-key} +considers default bindings as well as bindings for the specific events +in @var{key}. Otherwise, @code{lookup-key} reports only bindings for +the specific sequence @var{key}, ignoring default bindings except when +you explicitly ask about them. + +All the other functions described in this chapter that look up keys use +@code{lookup-key}. + +@example +@group +(lookup-key (current-global-map) "\C-x\C-f") + @result{} find-file +@end group +@group +(lookup-key (current-global-map) "\C-x\C-f12345") + @result{} 2 +@end group +@end example + + If @var{key} begins with the character whose value is contained in +@code{meta-prefix-char}, that character is implicitly removed and the +@key{META} modifier added to the key. Thus, the first example below is +handled by conversion into the second example. + +@example +@group +(lookup-key (current-global-map) "\ef") + @result{} forward-word +@end group +@group +(lookup-key (current-global-map) "\M-f") + @result{} forward-word +@end group +@end example + +Unlike @code{read-key-sequence}, this function does not modify the +specified events in ways that discard information (@pxref{Key Sequence +Input}). In particular, it does not convert letters to lower case. +@end defun + +@deffn Command undefined +Used in keymaps to undefine keys. If a key sequence is defined to this, +invoking this key sequence causes a ``key undefined'' error, just as if +the key sequence had no binding. +@end deffn + +@defun key-binding key &optional accept-defaults +This function returns the binding for @var{key} in the current +keymaps, trying all the active keymaps. The result is @code{nil} if +@var{key} is undefined in the keymaps. + +@c Emacs 19 feature +The argument @var{accept-defaults} controls checking for default +bindings, as in @code{lookup-key} (above). + +@example +@group +(key-binding "\C-x\C-f") + @result{} find-file +(key-binding '(control home)) + @result{} beginning-of-buffer +(key-binding [escape escape escape]) + @result{} keyboard-escape-quit +@end group +@end example +@end defun + +@defun local-key-binding key &optional accept-defaults +This function returns the binding for @var{key} in the current +local keymap, or @code{nil} if it is undefined there. + +@c Emacs 19 feature +The argument @var{accept-defaults} controls checking for default bindings, +as in @code{lookup-key} (above). +@end defun + +@defun global-key-binding key &optional accept-defaults +This function returns the binding for command @var{key} in the +current global keymap, or @code{nil} if it is undefined there. + +@c Emacs 19 feature +The argument @var{accept-defaults} controls checking for default bindings, +as in @code{lookup-key} (above). +@end defun + +@c Emacs 19 feature +@defun minor-mode-key-binding key &optional accept-defaults +This function returns a list of all the active minor mode bindings of +@var{key}. More precisely, it returns an alist of pairs +@code{(@var{modename} . @var{binding})}, where @var{modename} is the +variable that enables the minor mode, and @var{binding} is @var{key}'s +binding in that mode. If @var{key} has no minor-mode bindings, the +value is @code{nil}. + +If the first binding is not a prefix command, all subsequent bindings +from other minor modes are omitted, since they would be completely +shadowed. Similarly, the list omits non-prefix bindings that follow +prefix bindings. + +The argument @var{accept-defaults} controls checking for default +bindings, as in @code{lookup-key} (above). +@end defun + +@defvar meta-prefix-char +@cindex @key{ESC} +This variable is the meta-prefix character code. It is used when +translating a two-character sequence to a meta character so it can be +looked up in a keymap. For useful results, the value should be a prefix +event (@pxref{Prefix Keys}). The default value is @code{?\^[} (integer +27), which is the @sc{ASCII} character usually produced by the @key{ESC} +key. + + As long as the value of @code{meta-prefix-char} remains @code{?\^[}, +key lookup translates @kbd{@key{ESC} b} into @kbd{M-b}, which is +normally defined as the @code{backward-word} command. However, if you +set @code{meta-prefix-char} to @code{?\^X} (i.e. the keystroke +@kbd{C-x}) or its equivalent @sc{ASCII} code @code{24}, then XEmacs will +translate @kbd{C-x b} (whose standard binding is the +@code{switch-to-buffer} command) into @kbd{M-b}. + +@smallexample +@group +meta-prefix-char ; @r{The default value.} + @result{} ?\^[ ; @r{Under XEmacs 20.} + @result{} 27 ; @r{Under XEmacs 19.} +@end group +@group +(key-binding "\eb") + @result{} backward-word +@end group +@group +?\C-x ; @r{The print representation} + ; @r{of a character.} + @result{} ?\^X ; @r{Under XEmacs 20.} + @result{} 24 ; @r{Under XEmacs 19.} +@end group +@group +(setq meta-prefix-char 24) + @result{} 24 +@end group +@group +(key-binding "\C-xb") + @result{} backward-word ; @r{Now, typing @kbd{C-x b} is} + ; @r{like typing @kbd{M-b}.} + +(setq meta-prefix-char ?\e) ; @r{Avoid confusion!} + ; @r{Restore the default value!} + @result{} ?\^[ ; @r{Under XEmacs 20.} + @result{} 27 ; @r{Under XEmacs 19.} +@end group +@end smallexample +@end defvar + +@node Changing Key Bindings +@section Changing Key Bindings +@cindex changing key bindings +@cindex rebinding + + The way to rebind a key is to change its entry in a keymap. If you +change a binding in the global keymap, the change is effective in all +buffers (though it has no direct effect in buffers that shadow the +global binding with a local one). If you change the current buffer's +local map, that usually affects all buffers using the same major mode. +The @code{global-set-key} and @code{local-set-key} functions are +convenient interfaces for these operations (@pxref{Key Binding +Commands}). You can also use @code{define-key}, a more general +function; then you must specify explicitly the map to change. + + The way to specify the key sequence that you want to rebind is +described above (@pxref{Key Sequences}). + + For the functions below, an error is signaled if @var{keymap} is not a +keymap or if @var{key} is not a string or vector representing a key +sequence. You can use event types (symbols) as shorthand for events +that are lists. + +@defun define-key keymap key binding +This function sets the binding for @var{key} in @var{keymap}. (If +@var{key} is more than one event long, the change is actually made +in another keymap reached from @var{keymap}.) The argument +@var{binding} can be any Lisp object, but only certain types are +meaningful. (For a list of meaningful types, see @ref{Key Lookup}.) +The value returned by @code{define-key} is @var{binding}. + +@cindex invalid prefix key error +@cindex key sequence error +Every prefix of @var{key} must be a prefix key (i.e., bound to a +keymap) or undefined; otherwise an error is signaled. + +If some prefix of @var{key} is undefined, then @code{define-key} defines +it as a prefix key so that the rest of @var{key} may be defined as +specified. +@end defun + + Here is an example that creates a sparse keymap and makes a number of +bindings in it: + +@smallexample +@group +(setq map (make-sparse-keymap)) + @result{} #<keymap 0 entries 0xbee> +@end group +@group +(define-key map "\C-f" 'forward-char) + @result{} forward-char +@end group +@group +map + @result{} #<keymap 1 entry 0xbee> +(describe-bindings-internal map) +@result{} ; @r{(Inserted in buffer)} +C-f forward-char +@end group + +@group +;; @r{Build sparse submap for @kbd{C-x} and bind @kbd{f} in that.} +(define-key map "\C-xf" 'forward-word) + @result{} forward-word +@end group +@group +map + @result{} #<keymap 2 entries 0xbee> +(describe-bindings-internal map) +@result{} ; @r{(Inserted in buffer)} +C-f forward-char +C-x << Prefix Command >> + +C-x f forward-word +@end group + +@group +;; @r{Bind @kbd{C-p} to the @code{ctl-x-map}.} +(define-key map "\C-p" ctl-x-map) +;; @code{ctl-x-map} +@result{} #<keymap Control-X-prefix 77 entries 0x3bf> +@end group + +@group +;; @r{Bind @kbd{C-f} to @code{foo} in the @code{ctl-x-map}.} +(define-key map "\C-p\C-f" 'foo) +@result{} foo +@end group +@group +map + @result{} #<keymap 3 entries 0xbee> +(describe-bindings-internal map) +@result{} ; @r{(Inserted in buffer)} +C-f forward-char +C-p << Prefix command Control-X-prefix >> +C-x << Prefix Command >> + +C-p tab indent-rigidly +C-p $ set-selective-display +C-p ' expand-abbrev +C-p ( start-kbd-macro +C-p ) end-kbd-macro + @dots{} +C-p C-x exchange-point-and-mark +C-p C-z suspend-or-iconify-emacs +C-p M-escape repeat-complex-command +C-p M-C-[ repeat-complex-command + +C-x f forward-word + +C-p 4 . find-tag-other-window + @dots{} +C-p 4 C-o display-buffer + +C-p 5 0 delete-frame + @dots{} +C-p 5 C-f find-file-other-frame + + @dots{} + +C-p a i g inverse-add-global-abbrev +C-p a i l inverse-add-mode-abbrev +@end group +@end smallexample + +@noindent +Note that storing a new binding for @kbd{C-p C-f} actually works by +changing an entry in @code{ctl-x-map}, and this has the effect of +changing the bindings of both @kbd{C-p C-f} and @kbd{C-x C-f} in the +default global map. + +@defun substitute-key-definition olddef newdef keymap &optional oldmap +@cindex replace bindings +This function replaces @var{olddef} with @var{newdef} for any keys in +@var{keymap} that were bound to @var{olddef}. In other words, +@var{olddef} is replaced with @var{newdef} wherever it appears. The +function returns @code{nil}. + +For example, this redefines @kbd{C-x C-f}, if you do it in an XEmacs with +standard bindings: + +@smallexample +@group +(substitute-key-definition + 'find-file 'find-file-read-only (current-global-map)) +@end group +@end smallexample + +@c Emacs 19 feature +If @var{oldmap} is non-@code{nil}, then its bindings determine which +keys to rebind. The rebindings still happen in @var{newmap}, not in +@var{oldmap}. Thus, you can change one map under the control of the +bindings in another. For example, + +@smallexample +(substitute-key-definition + 'delete-backward-char 'my-funny-delete + my-map global-map) +@end smallexample + +@noindent +puts the special deletion command in @code{my-map} for whichever keys +are globally bound to the standard deletion command. + +@ignore +@c Emacs 18 only +Prefix keymaps that appear within @var{keymap} are not checked +recursively for keys bound to @var{olddef}; they are not changed at all. +Perhaps it would be better to check nested keymaps recursively. +@end ignore + +@ignore @c #### fix this up. +Here is an example showing a keymap before and after substitution: + +@smallexample +@group +(setq map '(keymap + (?1 . olddef-1) + (?2 . olddef-2) + (?3 . olddef-1))) +@result{} (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1)) +@end group + +@group +(substitute-key-definition 'olddef-1 'newdef map) +@result{} nil +@end group +@group +map +@result{} (keymap (49 . newdef) (50 . olddef-2) (51 . newdef)) +@end group +@end smallexample +@end ignore +@end defun + +@defun suppress-keymap keymap &optional nodigits +@cindex @code{self-insert-command} override +This function changes the contents of the full keymap @var{keymap} by +making all the printing characters undefined. More precisely, it binds +them to the command @code{undefined}. This makes ordinary insertion of +text impossible. @code{suppress-keymap} returns @code{nil}. + +If @var{nodigits} is @code{nil}, then @code{suppress-keymap} defines +digits to run @code{digit-argument}, and @kbd{-} to run +@code{negative-argument}. Otherwise it makes them undefined like the +rest of the printing characters. + +@cindex yank suppression +@cindex @code{quoted-insert} suppression +The @code{suppress-keymap} function does not make it impossible to +modify a buffer, as it does not suppress commands such as @code{yank} +and @code{quoted-insert}. To prevent any modification of a buffer, make +it read-only (@pxref{Read Only Buffers}). + +Since this function modifies @var{keymap}, you would normally use it +on a newly created keymap. Operating on an existing keymap +that is used for some other purpose is likely to cause trouble; for +example, suppressing @code{global-map} would make it impossible to use +most of XEmacs. + +Most often, @code{suppress-keymap} is used to initialize local +keymaps of modes such as Rmail and Dired where insertion of text is not +desirable and the buffer is read-only. Here is an example taken from +the file @file{emacs/lisp/dired.el}, showing how the local keymap for +Dired mode is set up: + +@smallexample +@group + @dots{} + (setq dired-mode-map (make-keymap)) + (suppress-keymap dired-mode-map) + (define-key dired-mode-map "r" 'dired-rename-file) + (define-key dired-mode-map "\C-d" 'dired-flag-file-deleted) + (define-key dired-mode-map "d" 'dired-flag-file-deleted) + (define-key dired-mode-map "v" 'dired-view-file) + (define-key dired-mode-map "e" 'dired-find-file) + (define-key dired-mode-map "f" 'dired-find-file) + @dots{} +@end group +@end smallexample +@end defun + +@node Key Binding Commands +@section Commands for Binding Keys + + This section describes some convenient interactive interfaces for +changing key bindings. They work by calling @code{define-key}. + + People often use @code{global-set-key} in their @file{.emacs} file for +simple customization. For example, + +@smallexample +(global-set-key "\C-x\C-\\" 'next-line) +@end smallexample + +@noindent +or + +@smallexample +(global-set-key [(control ?x) (control ?\\)] 'next-line) +@end smallexample + +@noindent +or + +@smallexample +(global-set-key [?\C-x ?\C-\\] 'next-line) +@end smallexample + +@noindent +redefines @kbd{C-x C-\} to move down a line. + +@smallexample +(global-set-key [(meta button1)] 'mouse-set-point) +@end smallexample + +@noindent +redefines the first (leftmost) mouse button, typed with the Meta key, to +set point where you click. + +@deffn Command global-set-key key definition +This function sets the binding of @var{key} in the current global map +to @var{definition}. + +@smallexample +@group +(global-set-key @var{key} @var{definition}) +@equiv{} +(define-key (current-global-map) @var{key} @var{definition}) +@end group +@end smallexample +@end deffn + +@deffn Command global-unset-key key +@cindex unbinding keys +This function removes the binding of @var{key} from the current +global map. + +One use of this function is in preparation for defining a longer key +that uses @var{key} as a prefix---which would not be allowed if +@var{key} has a non-prefix binding. For example: + +@smallexample +@group +(global-unset-key "\C-l") + @result{} nil +@end group +@group +(global-set-key "\C-l\C-l" 'redraw-display) + @result{} nil +@end group +@end smallexample + +This function is implemented simply using @code{define-key}: + +@smallexample +@group +(global-unset-key @var{key}) +@equiv{} +(define-key (current-global-map) @var{key} nil) +@end group +@end smallexample +@end deffn + +@deffn Command local-set-key key definition +This function sets the binding of @var{key} in the current local +keymap to @var{definition}. + +@smallexample +@group +(local-set-key @var{key} @var{definition}) +@equiv{} +(define-key (current-local-map) @var{key} @var{definition}) +@end group +@end smallexample +@end deffn + +@deffn Command local-unset-key key +This function removes the binding of @var{key} from the current +local map. + +@smallexample +@group +(local-unset-key @var{key}) +@equiv{} +(define-key (current-local-map) @var{key} nil) +@end group +@end smallexample +@end deffn + +@node Scanning Keymaps +@section Scanning Keymaps + + This section describes functions used to scan all the current keymaps, +or all keys within a keymap, for the sake of printing help information. + +@defun accessible-keymaps keymap &optional prefix +This function returns a list of all the keymaps that can be accessed +(via prefix keys) from @var{keymap}. The value is an association list +with elements of the form @code{(@var{key} .@: @var{map})}, where +@var{key} is a prefix key whose definition in @var{keymap} is +@var{map}. + +The elements of the alist are ordered so that the @var{key} increases +in length. The first element is always @code{([] .@: @var{keymap})}, +because the specified keymap is accessible from itself with a prefix of +no events. + +If @var{prefix} is given, it should be a prefix key sequence; then +@code{accessible-keymaps} includes only the submaps whose prefixes start +with @var{prefix}. These elements look just as they do in the value of +@code{(accessible-keymaps)}; the only difference is that some elements +are omitted. + + In the example below, the returned alist indicates that the key +@kbd{C-x}, which is displayed as @samp{[(control x)]}, is a prefix key +whose definition is the keymap @code{#<keymap ((control x) #<keymap +emacs-lisp-mode-map 8 entries 0x546>) 1 entry 0x8a2>}. (The strange +notation for the keymap's name indicates that this is an internal submap +of @code{emacs-lisp-mode-map}. This is because +@code{lisp-interaction-mode-map} has set up @code{emacs-lisp-mode-map} +as its parent, and @code{lisp-interaction-mode-map} defines no key +sequences beginning with @kbd{C-x}.) + +@smallexample +@group +(current-local-map) +@result{} #<keymap lisp-interaction-mode-map 5 entries 0x558> +(accessible-keymaps (current-local-map)) +@result{}(([] . #<keymap lisp-interaction-mode-map 5 entries 0x558>) + ([(control x)] . + #<keymap ((control x) #<keymap emacs-lisp-mode-map 8 entries 0x546>) + 1 entry 0x8a2>)) +@end group +@end smallexample + + The following example shows the results of calling +@code{accessible-keymaps} on a large, complex keymap. Notice how +some keymaps were given explicit names using @code{set-keymap-name}; +those submaps without explicit names are given descriptive names +indicating their relationship to their enclosing keymap. + +@smallexample +@group +(accessible-keymaps (current-global-map)) +@result{} (([] . #<keymap global-map 639 entries 0x221>) + ([(control c)] . #<keymap mode-specific-command-prefix 1 entry 0x3cb>) + ([(control h)] . #<keymap help-map 33 entries 0x4ec>) + ([(control x)] . #<keymap Control-X-prefix 77 entries 0x3bf>) + ([(meta escape)] . + #<keymap ((meta escape) #<keymap global-map 639 entries 0x221>) + 3 entries 0x3e0>) + ([(meta control \[)] . + #<keymap ((meta escape) #<keymap global-map 639 entries 0x221>) + 3 entries 0x3e0>) + ([f1] . #<keymap help-map 33 entries 0x4ec>) + ([(control x) \4] . #<keymap ctl-x-4-prefix 9 entries 0x3c5>) + ([(control x) \5] . #<keymap ctl-x-5-prefix 8 entries 0x3c8>) + ([(control x) \6] . #<keymap 13 entries 0x4d2>) + ([(control x) a] . + #<keymap (a #<keymap Control-X-prefix 77 entries 0x3bf>) + 8 entries 0x3ef>) + ([(control x) n] . #<keymap narrowing-prefix 3 entries 0x3dd>) + ([(control x) r] . #<keymap rectangle-prefix 18 entries 0x3e9>) + ([(control x) v] . #<keymap vc-prefix-map 13 entries 0x60e>) + ([(control x) a i] . + #<keymap (i #<keymap (a #<keymap Control-X-prefix 77 entries 0x3bf>) + 8 entries 0x3ef>) + 2 entries 0x3f5>)) +@end group +@end smallexample +@end defun + +@defun map-keymap function keymap &optional sort-first +This function applies @var{function} to each element of @code{KEYMAP}. +@var{function} will be called with two arguments: a key-description +list, and the binding. The order in which the elements of the keymap +are passed to the function is unspecified. If the function inserts new +elements into the keymap, it may or may not be called with them later. +No element of the keymap will ever be passed to the function more than +once. + +The function will not be called on elements of this keymap's parents +(@pxref{Inheritance and Keymaps}) or upon keymaps which are contained +within this keymap (multi-character definitions). It will be called on +@key{META} characters since they are not really two-character sequences. + +If the optional third argument @var{sort-first} is non-@code{nil}, then +the elements of the keymap will be passed to the mapper function in a +canonical order. Otherwise, they will be passed in hash (that is, +random) order, which is faster. +@end defun + +@defun keymap-fullness keymap +This function returns the number of bindings in the keymap. +@end defun + +@defun where-is-internal definition &optional keymaps firstonly noindirect event-or-keys +This function returns a list of key sequences (of any length) that are +bound to @var{definition} in a set of keymaps. + +The argument @var{definition} can be any object; it is compared with all +keymap entries using @code{eq}. + +KEYMAPS can be either a keymap (meaning search in that keymap and the +current global keymap) or a list of keymaps (meaning search in exactly +those keymaps and no others). If KEYMAPS is nil, search in the currently +applicable maps for EVENT-OR-KEYS. + +If @var{keymap} is a keymap, then the maps searched are @var{keymap} and +the global keymap. If @var{keymap} is a list of keymaps, then the maps +searched are exactly those keymaps, and no others. If @var{keymap} is +@code{nil}, then the maps used are the current active keymaps for +@var{event-or-keys} (this is equivalent to specifying +@code{(current-keymaps @var{event-or-keys})} as the argument to +@var{keymaps}). + +If @var{firstonly} is non-@code{nil}, then the value is a single +vector representing the first key sequence found, rather than a list of +all possible key sequences. +@ignore @c #### Should fix where-is to be more like FSF +If @var{firstonly} is @code{non-ascii}, then the value is a single +string representing the first key sequence found, rather than a list of +all possible key sequences. If @var{firstonly} is @code{t}, then the +value is the first key sequence, except that key sequences consisting +entirely of @sc{ASCII} characters (or meta variants of @sc{ASCII} +characters) are preferred to all other key sequences. +@end ignore + +If @var{noindirect} is non-@code{nil}, @code{where-is-internal} doesn't +follow indirect keymap bindings. This makes it possible to search for +an indirect definition itself. + +This function is used by @code{where-is} (@pxref{Help, , Help, emacs, +The XEmacs Reference Manual}). + +@smallexample +@group +(where-is-internal 'describe-function) + @result{} ([(control h) d] [(control h) f] [f1 d] [f1 f]) +@end group +@end smallexample +@end defun + +@defun describe-bindings-internal map &optional all shadow prefix mouse-only-p +This function inserts (into the current buffer) a list of all defined +keys and their definitions in @var{map}. Optional second argument +@var{all} says whether to include even ``uninteresting'' definitions, +i.e. symbols with a non-@code{nil} @code{suppress-keymap} property. +Third argument @var{shadow} is a list of keymaps whose bindings shadow +those of map; if a binding is present in any shadowing map, it is not +printed. Fourth argument @var{prefix}, if non-@code{nil}, should be a +key sequence; only bindings which start with that key sequence will be +printed. Fifth argument @var{mouse-only-p} says to only print bindings +for mouse clicks. +@end defun + + @code{describe-bindings-internal} is used to implement the +help command @code{describe-bindings}. + +@deffn Command describe-bindings prefix mouse-only-p +This function creates a listing of all defined keys and their +definitions. It writes the listing in a buffer named @samp{*Help*} and +displays it in a window. + +If @var{prefix} is non-@code{nil}, it should be a prefix key; then the +listing includes only keys that start with @var{prefix}. + +When several characters with consecutive @sc{ASCII} codes have the +same definition, they are shown together, as +@samp{@var{firstchar}..@var{lastchar}}. In this instance, you need to +know the @sc{ASCII} codes to understand which characters this means. +For example, in the default global map, the characters @samp{@key{SPC} +..@: ~} are described by a single line. @key{SPC} is @sc{ASCII} 32, +@kbd{~} is @sc{ASCII} 126, and the characters between them include all +the normal printing characters, (e.g., letters, digits, punctuation, +etc.@:); all these characters are bound to @code{self-insert-command}. + +If the second argument (prefix arg, interactively) is non-@code{nil} +then only the mouse bindings are displayed. +@end deffn + +@node Other Keymap Functions +@section Other Keymap Functions + +@defun set-keymap-prompt keymap new-prompt +This function sets the ``prompt'' of @var{keymap} to string +@var{new-prompt}, or @code{nil} if no prompt is desired. The prompt is +shown in the echo-area when reading a key-sequence to be looked-up in +this keymap. +@end defun + +@defun keymap-prompt keymap &optional use-inherited +This function returns the ``prompt'' of the given keymap. +If @var{use-inherited} is non-@code{nil}, any parent keymaps +will also be searched for a prompt. +@end defun