emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to keymaps.texi


From: Glenn Morris
Subject: [Emacs-diffs] Changes to keymaps.texi
Date: Thu, 06 Sep 2007 04:21:07 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Glenn Morris <gm>       07/09/06 04:21:07

Index: keymaps.texi
===================================================================
RCS file: keymaps.texi
diff -N keymaps.texi
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ keymaps.texi        6 Sep 2007 04:21:06 -0000       1.1
@@ -0,0 +1,2785 @@
address@hidden -*-texinfo-*-
address@hidden This is part of the GNU Emacs Lisp Reference Manual.
address@hidden Copyright (C) 1990, 1991, 1992, 1993, 1994, 1998, 1999, 2000, 
2001,
address@hidden   2002, 2003, 2004, 2005, 2006, 2007  Free Software Foundation, 
Inc.
address@hidden See the file elisp.texi for copying conditions.
address@hidden ../info/keymaps
address@hidden Keymaps, Modes, Command Loop, Top
address@hidden Keymaps
address@hidden keymap
+
+  The command bindings of input events are recorded in data structures
+called @dfn{keymaps}.  Each entry in a keymap associates (or
address@hidden) an individual event type, either to another keymap or to
+a command.  When an event type 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}.
+
address@hidden
+* Key Sequences::              Key sequences as Lisp objects.
+* Keymap Basics::               Basic concepts of 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.
+* Prefix Keys::                 Defining a key with a keymap as its definition.
+* Active Keymaps::              How Emacs searches the active keymaps
+                                   for a key binding.
+* Searching Keymaps::           A pseudo-Lisp summary of searching active maps.
+* Controlling Active Maps::     Each buffer has a local keymap
+                                   to override the standard (global) bindings.
+                                  A minor mode can also override them.
+* Key Lookup::                  Finding a key's binding in one keymap.
+* Functions for Key Lookup::    How to request key lookup.
+* Changing Key Bindings::       Redefining a key in a keymap.
+* Remapping Commands::          A keymap can translate one command to another.
+* Translation Keymaps::         Keymaps for translating sequences of events.
+* Key Binding Commands::        Interactive interfaces for redefining keys.
+* Scanning Keymaps::            Looking through all keymaps, for printing help.
+* Menu Keymaps::               Defining a menu as a keymap.
address@hidden menu
+
address@hidden Key Sequences
address@hidden Key Sequences
address@hidden key
address@hidden keystroke
address@hidden key sequence
+
+  A @dfn{key sequence}, or @dfn{key} for short, is a sequence of one
+or more input events that form a unit.  Input events include
+characters, function keys, and mouse actions (@pxref{Input Events}).
+The Emacs Lisp representation for a key sequence is a string or
+vector.  Unless otherwise stated, any Emacs Lisp function that accepts
+a key sequence as an argument can handle both representations.
+
+  In the string representation, alphanumeric characters ordinarily
+stand for themselves; for example, @code{"a"} represents @kbd{a}
+and @code{"2"} represents @kbd{2}.  Control character events are
+prefixed by the substring @code{"\C-"}, and meta characters by
address@hidden"\M-"}; for example, @code{"\C-x"} represents the key @kbd{C-x}.
+In addition, the @key{TAB}, @key{RET}, @key{ESC}, and @key{DEL} events
+are represented by @code{"\t"}, @code{"\r"}, @code{"\e"}, and
address@hidden"\d"} respectively.  The string representation of a complete key
+sequence is the concatenation of the string representations of the
+constituent events; thus, @code{"\C-xl"} represents the key sequence
address@hidden l}.
+
+  Key sequences containing function keys, mouse button events, or
+non-ASCII characters such as @kbd{C-=} or @kbd{H-a} cannot be
+represented as strings; they have to be represented as vectors.
+
+  In the vector representation, each element of the vector represents
+an input event, in its Lisp form.  @xref{Input Events}.  For example,
+the vector @code{[?\C-x ?l]} represents the key sequence @kbd{C-x l}.
+
+  For examples of key sequences written in string and vector
+representations, @ref{Init Rebinding,,, emacs, The GNU Emacs Manual}.
+
address@hidden kbd keyseq-text
+This macro converts the text @var{keyseq-text} (a string constant)
+into a key sequence (a string or vector constant).  The contents of
address@hidden should describe the key sequence using almost the same
+syntax used in this manual.  More precisely, it uses the same syntax
+that Edit Macro mode uses for editing keyboard macros (@pxref{Edit
+Keyboard Macro,,, emacs, The GNU Emacs Manual}); you must surround
+function key names with @samp{<@dots{}>}.
+
address@hidden
+(kbd "C-x") @result{} "\C-x"
+(kbd "C-x C-f") @result{} "\C-x\C-f"
+(kbd "C-x 4 C-f") @result{} "\C-x4\C-f"
+(kbd "X") @result{} "X"
+(kbd "RET") @result{} "\^M"
+(kbd "C-c SPC") @result{} "\C-c@ "
+(kbd "<f1> SPC") @result{} [f1 32]
+(kbd "C-M-<down>") @result{} [C-M-down]
address@hidden example
+
+This macro is not meant for use with arguments that vary---only
+with string constants.
address@hidden defmac
+
address@hidden Keymap Basics
address@hidden Keymap Basics
address@hidden key binding
address@hidden binding of a key
address@hidden complete key
address@hidden undefined key
+
+  A keymap is a Lisp data structure that specifies @dfn{key bindings}
+for various key sequences.
+
+  A single keymap directly specifies definitions for individual
+events.  When a key sequence consists of a single event, its binding
+in a keymap is the keymap's definition for that event.  The binding of
+a longer key sequence is found by an iterative process: first find the
+definition of the first event (which must itself be a keymap); then
+find the second event's definition in that keymap, and so on until all
+the events in the key sequence have been processed.
+
+  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},
address@hidden, and @kbd{C-x 4}.  Examples of defined complete keys are
address@hidden, @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 one key sequence.  In other words, removing one
+or more events from the end of any valid key sequence must always yield
+a prefix key.  For example, @kbd{C-f C-n} is not a key sequence;
address@hidden is not a prefix key, so a longer sequence starting with
address@hidden cannot be a key sequence.
+
+  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.
+
address@hidden Format of Keymaps
address@hidden Format of Keymaps
address@hidden format of keymaps
address@hidden keymap format
address@hidden full keymap
address@hidden sparse keymap
+
+  Each keymap is a list whose @sc{car} is the symbol @code{keymap}.  The
+remaining elements of the list define the key bindings of the keymap.
+A symbol whose function definition is a keymap is also a keymap.  Use
+the function @code{keymapp} (see below) to test whether an object is a
+keymap.
+
+  Several kinds of elements may appear in a keymap, after the symbol
address@hidden that begins it:
+
address@hidden @code
address@hidden (@var{type} .@: @var{binding})
+This specifies one binding, for events of type @var{type}.  Each
+ordinary binding applies to events of a particular @dfn{event type},
+which is always a character or a symbol.  @xref{Classifying Events}.
+In this kind of binding, @var{binding} is a command.
+
address@hidden (@var{type} @var{item-name} @address@hidden@r{]} .@: 
@var{binding})
+This specifies a binding which is also a simple menu item that
+displays as @var{item-name} in the menu.  @var{cache}, if present,
+caches certain information for display in the menu.  @xref{Simple Menu
+Items}.
+
address@hidden (@var{type} @var{item-name} @var{help-string} 
@address@hidden@r{]} .@: @var{binding})
+This is a simple menu item with help string @var{help-string}.
+
address@hidden (@var{type} menu-item .@: @var{details})
+This specifies a binding which is also an extended menu item.  This
+allows use of other features.  @xref{Extended Menu Items}.
+
address@hidden (t .@: @var{binding})
address@hidden default key binding
+This specifies a @dfn{default key binding}; any event not bound by other
+elements of the keymap is given @var{binding} as its binding.  Default
+bindings allow a keymap to bind all possible event types without having
+to enumerate all of them.  A keymap that has a default binding
+completely masks any lower-precedence keymap, except for events
+explicitly bound to @code{nil} (see below).
+
address@hidden @var{char-table}
+If an element of a keymap is a char-table, it counts as holding
+bindings for all character events with no modifier bits
+(@pxref{modifier bits}): element @var{n} is the binding for the
+character with code @var{n}.  This is a compact way to record lots of
+bindings.  A keymap with such a char-table is called a @dfn{full
+keymap}.  Other keymaps are called @dfn{sparse keymaps}.
+
address@hidden @var{string}
address@hidden keymap prompt string
address@hidden overall prompt string
address@hidden prompt string of keymap
+Aside from elements that specify bindings for keys, a keymap can also
+have a string as an element.  This is called the @dfn{overall prompt
+string} and makes it possible to use the keymap as a menu.
address@hidden Menus}.
address@hidden table
+
+When the binding is @code{nil}, it doesn't constitute a definition
+but it does take precedence over a default binding or a binding in the
+parent keymap.  On the other hand, a binding of @code{nil} does
address@hidden override lower-precedence keymaps; thus, if the local map
+gives a binding of @code{nil}, Emacs uses the binding from the
+global map.
+
address@hidden meta characters lookup
+  Keymaps do not directly record bindings for the meta characters.
+Instead, meta characters are regarded for purposes of key lookup as
+sequences of two characters, the first of which is @key{ESC} (or
+whatever is currently the value of @code{meta-prefix-char}).  Thus, the
+key @kbd{M-a} is internally represented as @address@hidden a}, and its
+global binding is found at the slot for @kbd{a} in @code{esc-map}
+(@pxref{Prefix Keys}).
+
+  This conversion applies only to characters, not to function keys or
+other input events; thus, @address@hidden has nothing to do with
address@hidden@key{ESC} @key{end}}.
+
+  Here as an example is the local keymap for Lisp mode, a sparse
+keymap.  It defines bindings for @key{DEL} and @key{TAB}, plus @kbd{C-c
+C-l}, @kbd{M-C-q}, and @kbd{M-C-x}.
+
address@hidden
address@hidden
+lisp-mode-map
address@hidden
address@hidden group
address@hidden
+(keymap
+ (3 keymap
+    ;; @kbd{C-c C-z}
+    (26 . run-lisp))
address@hidden group
address@hidden
+ (27 keymap
+     ;; @address@hidden, treated as @address@hidden C-x}}
+     (24 . lisp-send-defun)
+     keymap
+     ;; @address@hidden, treated as @address@hidden C-q}}
+     (17 . indent-sexp))
address@hidden group
address@hidden
+ ;; @r{This part is inherited from @code{lisp-mode-shared-map}.}
+ keymap
+ ;; @key{DEL}
+ (127 . backward-delete-char-untabify)
address@hidden group
address@hidden
+ (27 keymap
+     ;; @address@hidden, treated as @address@hidden C-q}}
+     (17 . indent-sexp))
+ (9 . lisp-indent-line))
address@hidden group
address@hidden example
+
address@hidden keymapp object
+This function returns @code{t} if @var{object} is a keymap, @code{nil}
+otherwise.  More precisely, this function tests for a list whose
address@hidden is @code{keymap}, or for a symbol whose function definition
+satisfies @code{keymapp}.
+
address@hidden
address@hidden
+(keymapp '(keymap))
+    @result{} t
address@hidden group
address@hidden
+(fset 'foo '(keymap))
+(keymapp 'foo)
+    @result{} t
address@hidden group
address@hidden
+(keymapp (current-global-map))
+    @result{} t
address@hidden group
address@hidden example
address@hidden defun
+
address@hidden Creating Keymaps
address@hidden Creating Keymaps
address@hidden creating keymaps
+
+  Here we describe the functions for creating keymaps.
+
address@hidden make-sparse-keymap &optional prompt
+This function creates and returns a new sparse keymap with no entries.
+(A sparse keymap is the kind of keymap you usually want.)  The new
+keymap does not contain a char-table, unlike @code{make-keymap}, and
+does not bind any events.
+
address@hidden
address@hidden
+(make-sparse-keymap)
+    @result{} (keymap)
address@hidden group
address@hidden example
+
+If you specify @var{prompt}, that becomes the overall prompt string
+for the keymap.  You should specify this only for menu keymaps
+(@pxref{Defining Menus}).  A keymap with an overall prompt string will
+always present a mouse menu or a keyboard menu if it is active for
+looking up the next input event.  Don't specify an overall prompt string
+for the main map of a major or minor mode, because that would cause
+the command loop to present a keyboard menu every time.
address@hidden defun
+
address@hidden make-keymap &optional prompt
+This function creates and returns a new full keymap.  That keymap
+contains a char-table (@pxref{Char-Tables}) with slots for all
+characters without modifiers.  The new keymap initially binds all
+these characters to @code{nil}, and does not bind any other kind of
+event.  The argument @var{prompt} specifies a
+prompt string, as in @code{make-sparse-keymap}.
+
address@hidden
address@hidden
+(make-keymap)
+    @result{} (keymap #^[t nil nil nil @dots{} nil nil keymap])
address@hidden group
address@hidden example
+
+A full keymap is more efficient than a sparse keymap when it holds
+lots of bindings; for just a few, the sparse keymap is better.
address@hidden defun
+
address@hidden 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.
address@hidden Emacs 19 feature
+
address@hidden
address@hidden
+(setq map (copy-keymap (current-local-map)))
address@hidden (keymap
address@hidden group
address@hidden
+     ;; @r{(This implements meta characters.)}
+     (27 keymap
+         (83 . center-paragraph)
+         (115 . center-line))
+     (9 . tab-to-tab-stop))
address@hidden group
+
address@hidden
+(eq map (current-local-map))
+    @result{} nil
address@hidden group
address@hidden
+(equal map (current-local-map))
+    @result{} t
address@hidden group
address@hidden example
address@hidden defun
+
address@hidden Inheritance and Keymaps
address@hidden Inheritance and Keymaps
address@hidden keymap inheritance
address@hidden inheriting a keymap's bindings
+
+  A keymap can inherit the bindings of another keymap, which we call the
address@hidden keymap}.  Such a keymap looks like this:
+
address@hidden
+(keymap @address@hidden . @var{parent-keymap})
address@hidden example
+
address@hidden
+The effect is that this keymap inherits all the bindings of
address@hidden, whatever they may be at the time a key is looked up,
+but can add to them or override them with @var{elements}.
+
+If you change the bindings in @var{parent-keymap} using
address@hidden or other key-binding functions, these changed
+bindings are visible in the inheriting keymap, unless shadowed by the
+bindings made by @var{elements}.  The converse is not true: if you use
address@hidden to change bindings in the inheriting keymap, these
+changes are recorded in @var{elements}, but have no effect on
address@hidden
+
+The proper way to construct a keymap with a parent is to use
address@hidden; if you have code that directly constructs a
+keymap with a parent, please convert the program to use
address@hidden instead.
+
address@hidden keymap-parent keymap
+This returns the parent keymap of @var{keymap}.  If @var{keymap}
+has no parent, @code{keymap-parent} returns @code{nil}.
address@hidden defun
+
address@hidden set-keymap-parent keymap parent
+This sets the parent keymap of @var{keymap} to @var{parent}, and returns
address@hidden  If @var{parent} is @code{nil}, this function gives
address@hidden no parent at all.
+
+If @var{keymap} has submaps (bindings for prefix keys), they too receive
+new parent keymaps that reflect what @var{parent} specifies for those
+prefix keys.
address@hidden defun
+
+   Here is an example showing how to make a keymap that inherits
+from @code{text-mode-map}:
+
address@hidden
+(let ((map (make-sparse-keymap)))
+  (set-keymap-parent map text-mode-map)
+  map)
address@hidden example
+
+  A non-sparse keymap can have a parent too, but this is not very
+useful.  A non-sparse keymap always specifies something as the binding
+for every numeric character code without modifier bits, even if it is
address@hidden, so these character's bindings are never inherited from
+the parent keymap.
+
address@hidden Prefix Keys
address@hidden Prefix Keys
address@hidden prefix key
+
+  A @dfn{prefix key} is a key sequence whose binding is a keymap.  The
+keymap defines what to do with key sequences that extend 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}.  This keymap defines
+bindings for key sequences starting with @kbd{C-x}.
+
+  Some of the standard Emacs prefix keys use keymaps that are
+also found in Lisp variables:
+
address@hidden @bullet
address@hidden
address@hidden esc-map
address@hidden ESC-prefix
address@hidden is the global keymap for the @key{ESC} prefix key.  Thus,
+the global definitions of all meta characters are actually found here.
+This map is also the function definition of @code{ESC-prefix}.
+
address@hidden
address@hidden @kbd{C-h}
address@hidden is the global keymap for the @kbd{C-h} prefix key.
+
address@hidden
address@hidden @kbd{C-c}
address@hidden mode-specific-map
address@hidden is the global keymap for the prefix key
address@hidden  This map is actually global, not mode-specific, but its name
+provides useful information about @kbd{C-c} in the output of @kbd{C-h b}
+(@code{display-bindings}), since the main use of this prefix key is for
+mode-specific bindings.
+
address@hidden
address@hidden @kbd{C-x}
address@hidden ctl-x-map
address@hidden Control-X-prefix
address@hidden is the global keymap used for the @kbd{C-x} prefix key.
+This map is found via the function cell of the symbol
address@hidden
+
address@hidden
address@hidden @kbd{C-x @key{RET}}
address@hidden mule-keymap
address@hidden is the global keymap used for the @kbd{C-x @key{RET}}
+prefix key.
+
address@hidden
address@hidden @kbd{C-x 4}
address@hidden ctl-x-4-map
address@hidden is the global keymap used for the @kbd{C-x 4} prefix
+key.
+
address@hidden Emacs 19 feature
address@hidden
address@hidden @kbd{C-x 5}
address@hidden ctl-x-5-map
address@hidden is the global keymap used for the @kbd{C-x 5} prefix
+key.
+
address@hidden Emacs 19 feature
address@hidden
address@hidden @kbd{C-x 6}
address@hidden 2C-mode-map
address@hidden is the global keymap used for the @kbd{C-x 6} prefix
+key.
+
address@hidden
address@hidden @kbd{C-x v}
address@hidden vc-prefix-map
address@hidden is the global keymap used for the @kbd{C-x v} prefix
+key.
+
address@hidden
address@hidden @kbd{M-o}
address@hidden facemenu-keymap
address@hidden is the global keymap used for the @kbd{M-o}
+prefix key.
+
address@hidden Emacs 19 feature
address@hidden
+The other Emacs prefix keys are @kbd{M-g}, @kbd{C-x @@}, @kbd{C-x a i},
address@hidden @key{ESC}} and @address@hidden @key{ESC}}.  They use keymaps
+that have no special names.
address@hidden itemize
+
+  The keymap binding of a prefix key is used for looking up the event
+that follows 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 cell holds the keymap
+for @kbd{C-x} commands.  (The same keymap is also the value of
address@hidden)
+
+  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.
+
address@hidden
address@hidden
+(use-local-map (make-sparse-keymap))
+    @result{} nil
address@hidden group
address@hidden
+(local-set-key "\C-p" ctl-x-map)
+    @result{} nil
address@hidden group
address@hidden
+(key-binding "\C-p\C-f")
+    @result{} find-file
address@hidden group
+
address@hidden
+(key-binding "\C-p6")
+    @result{} nil
address@hidden group
address@hidden example
+
address@hidden define-prefix-command symbol &optional mapvar prompt
address@hidden prefix command
address@hidden of define-prefix-command}
+This function prepares @var{symbol} for use as a prefix key's binding:
+it creates a sparse keymap and stores it as @var{symbol}'s function
+definition.  Subsequently binding a key sequence to @var{symbol} will
+make that key sequence into a prefix key.  The return value is @code{symbol}.
+
+This function also sets @var{symbol} as a variable, with the keymap as
+its value.  But if @var{mapvar} is address@hidden, it sets @var{mapvar}
+as a variable instead.
+
+If @var{prompt} is address@hidden, that becomes the overall prompt
+string for the keymap.  The prompt string should be given for menu keymaps
+(@pxref{Defining Menus}).
address@hidden defun
+
address@hidden Active Keymaps
address@hidden Active Keymaps
address@hidden active keymap
address@hidden global keymap
address@hidden local keymap
+
+  Emacs normally contains many keymaps; at any given time, just a few
+of them are @dfn{active}, meaning that they participate in the
+interpretation of user input.  All the active keymaps are used
+together to determine what command to execute when a key is entered.
+
+  Normally the active keymaps are the @code{keymap} property keymap,
+the keymaps of any enabled minor modes, the current buffer's local
+keymap, and the global keymap, in that order.  Emacs searches for each
+input key sequence in all these keymaps.  @xref{Searching Keymaps},
+for more details of this procedure.
+
+  When the key sequence starts with a mouse event (optionally preceded
+by a symbolic prefix), the active keymaps are determined based on the
+position in that event.  If the event happened on a string embedded
+with a @code{display}, @code{before-string}, or @code{after-string}
+property (@pxref{Special Properties}), the address@hidden map
+properties of the string override those of the buffer.
+
+  The @dfn{global keymap} holds the bindings of keys that are defined
+regardless of the current buffer, such as @kbd{C-f}.  The variable
address@hidden 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
address@hidden overrides it.  The @code{local-map} text
+or overlay property can specify an alternative local keymap for certain
+parts of the buffer; see @ref{Special Properties}.
+
+  Each minor mode can have a keymap; if it does, the keymap is active
+when the minor mode is enabled.  Modes for emulation can specify
+additional active keymaps through the variable
address@hidden
+
+  The highest precedence normal keymap comes from the @code{keymap}
+text or overlay property.  If that is address@hidden, it is the first
+keymap to be processed, in normal circumstances.
+
+  However, there are also special ways for programs to substitute
+other keymaps for some of those.  The variable
address@hidden, if address@hidden, specifies a keymap
+that replaces all the usual active keymaps except the global keymap.
+Another way to do this is with @code{overriding-terminal-local-map};
+it operates on a per-terminal basis.  These variables are documented
+below.
+
address@hidden 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 and some other major
+modes exist even if they have not yet been used.  These local keymaps are
+the values of variables such as @code{lisp-mode-map}.  For most major
+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}.
+
+  Emacs has other keymaps that are used in a different way---translating
+events within @code{read-key-sequence}.  @xref{Translation Keymaps}.
+
+  @xref{Standard Keymaps}, for a list of standard keymaps.
+
address@hidden current-active-maps &optional olp position
+This returns the list of active keymaps that would be used by the
+command loop in the current circumstances to look up a key sequence.
+Normally it ignores @code{overriding-local-map} and
address@hidden, but if @var{olp} is address@hidden
+then it pays attention to them.  @var{position} can optionally be either
+an event position as returned by @code{event-start} or a buffer
+position, and may change the keymaps as described for
address@hidden
address@hidden defun
+
address@hidden key-binding key &optional accept-defaults no-remap position
+This function returns the binding for @var{key} according to the
+current active keymaps.  The result is @code{nil} if @var{key} is
+undefined in the keymaps.
+
+The argument @var{accept-defaults} controls checking for default
+bindings, as in @code{lookup-key} (@pxref{Functions for Key Lookup}).
+
+When commands are remapped (@pxref{Remapping Commands}),
address@hidden normally processes command remappings so as to
+returns the remapped command that will actually be executed.  However,
+if @var{no-remap} is address@hidden, @code{key-binding} ignores
+remappings and returns the binding directly specified for @var{key}.
+
+If @var{key} starts with a mouse event (perhaps following a prefix
+event), the maps to be consulted are determined based on the event's
+position.  Otherwise, they are determined based on the value of point.
+However, you can override either of them by specifying @var{position}.
+If @var{position} is address@hidden, it should be either a buffer
+position or an event position like the value of @code{event-start}.
+Then the maps consulted are determined based on @var{position}.
+
+An error is signaled if @var{key} is not a string or a vector.
+
address@hidden
address@hidden
+(key-binding "\C-x\C-f")
+    @result{} find-file
address@hidden group
address@hidden example
address@hidden defun
+
address@hidden Searching Keymaps
address@hidden Searching the Active Keymaps
address@hidden searching active keymaps for keys
+
+  After translation of event subsequences (@pxref{Translation
+Keymaps}) Emacs looks for them in the active keymaps.  Here is a
+pseudo-Lisp description of the order and conditions for searching
+them:
+
address@hidden
+(or (if overriding-terminal-local-map
+        (@var{find-in} overriding-terminal-local-map)
+      (if overriding-local-map
+          (@var{find-in} overriding-local-map)
+        (or (@var{find-in} (get-char-property (point) 'keymap))
+            (@var{find-in-any} emulation-mode-map-alists)
+            (@var{find-in-any} minor-mode-overriding-map-alist)
+            (@var{find-in-any} minor-mode-map-alist)
+            (if (get-text-property (point) 'local-map)
+                (@var{find-in} (get-char-property (point) 'local-map))
+              (@var{find-in} (current-local-map))))))
+    (@var{find-in} (current-global-map)))
address@hidden lisp
+
address@hidden
+The @var{find-in} and @var{find-in-any} are pseudo functions that
+search in one keymap and in an alist of keymaps, respectively.
+(Searching a single keymap for a binding is called @dfn{key lookup};
+see @ref{Key Lookup}.)  If the key sequence starts with a mouse event,
+or a symbolic prefix event followed by a mouse event, that event's
+position is used instead of point and the current buffer.  Mouse
+events on an embedded string use address@hidden text properties from
+that string instead of the buffer.
+
address@hidden
address@hidden
+The function finally found may be remapped
+(@pxref{Remapping Commands}).
+
address@hidden
+Characters that are bound to @code{self-insert-command} are translated
+according to @code{translation-table-for-input} before insertion.
+
address@hidden
address@hidden returns a list of the
+currently active keymaps at point.
+
address@hidden
+When a match is found (@pxref{Key Lookup}), if the binding in the
+keymap is a function, the search is over.  However if the keymap entry
+is a symbol with a value or a string, Emacs replaces the input key
+sequences with the variable's value or the string, and restarts the
+search of the active keymaps.
address@hidden enumerate
+
address@hidden Controlling Active Maps
address@hidden Controlling the Active Keymaps
+
address@hidden global-map
+This variable contains the default global keymap that maps Emacs
+keyboard input to commands.  The global keymap is normally this
+keymap.  The default global keymap is a full keymap that binds
address@hidden to all of the printing characters.
+
+It is normal practice to change the bindings in the global keymap, but you
+should not assign this variable any value other than the keymap it starts
+out with.
address@hidden defvar
+
address@hidden 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.
+
address@hidden
address@hidden
+(current-global-map)
address@hidden (keymap [set-mark-command beginning-of-line @dots{}
+            delete-backward-char])
address@hidden group
address@hidden example
address@hidden defun
+
address@hidden 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
address@hidden buffer (using Lisp Interaction mode) is a sparse keymap
+in which the entry for @key{ESC}, @acronym{ASCII} code 27, is another sparse
+keymap.
+
address@hidden
address@hidden
+(current-local-map)
address@hidden (keymap
+    (10 . eval-print-last-sexp)
+    (9 . lisp-indent-line)
+    (127 . backward-delete-char-untabify)
address@hidden group
address@hidden
+    (27 keymap
+        (24 . eval-defun)
+        (17 . indent-sexp)))
address@hidden group
address@hidden example
address@hidden defun
+
address@hidden current-minor-mode-maps
+This function returns a list of the keymaps of currently enabled minor modes.
address@hidden defun
+
address@hidden 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.
address@hidden defun
+
address@hidden use-local-map keymap
+This function makes @var{keymap} the new local keymap of 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.
address@hidden defun
+
address@hidden Emacs 19 feature
address@hidden minor-mode-map-alist
address@hidden of 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:
+
address@hidden
+(@var{variable} . @var{keymap})
address@hidden example
+
+The keymap @var{keymap} is active whenever @var{variable} has a
address@hidden 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
address@hidden of the element; a list with the map as the second element will
+not do.  The @sc{cdr} can be either a keymap (a list) or a symbol whose
+function definition is a keymap.
+
+When more than one minor mode keymap is active, the earlier one in
address@hidden takes priority.  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 @ref{Keymaps and Minor Modes}, for more information about minor
+modes.  See also @code{minor-mode-key-binding} (@pxref{Functions for Key
+Lookup}).
address@hidden defvar
+
address@hidden minor-mode-overriding-map-alist
+This variable allows major modes to override the key bindings for
+particular minor modes.  The elements of this alist look like the
+elements of @code{minor-mode-map-alist}: @code{(@var{variable}
+. @var{keymap})}.
+
+If a variable appears as an element of
address@hidden, the map specified by that
+element totally replaces any map specified for the same variable in
address@hidden
+
address@hidden is automatically buffer-local in
+all buffers.
address@hidden defvar
+
address@hidden overriding-local-map
+If address@hidden, this variable holds a keymap to use instead of the
+buffer's local keymap, any text property or overlay keymaps, and any
+minor mode keymaps.  This keymap, if specified, overrides all other
+maps that would have been active, except for the current global map.
address@hidden defvar
+
address@hidden overriding-terminal-local-map
+If address@hidden, this variable holds a keymap to use instead of
address@hidden, the buffer's local keymap, text property
+or overlay keymaps, and all the minor mode keymaps.
+
+This variable is always local to the current terminal and cannot be
+buffer-local.  @xref{Multiple Displays}.  It is used to implement
+incremental search mode.
address@hidden defvar
+
address@hidden overriding-local-map-menu-flag
+If this variable is address@hidden, the value of
address@hidden or @code{overriding-terminal-local-map} can
+affect the display of the menu bar.  The default value is @code{nil}, so
+those map variables have no effect on the menu bar.
+
+Note that these two map variables do affect the execution of key
+sequences entered using the menu bar, even if they do not affect the
+menu bar display.  So if a menu bar key sequence comes in, you should
+clear the variables before looking up and executing that key sequence.
+Modes that use the variables would typically do this anyway; normally
+they respond to events that they do not handle by ``unreading'' them and
+exiting.
address@hidden defvar
+
address@hidden special-event-map
+This variable holds a keymap for special events.  If an event type has a
+binding in this keymap, then it is special, and the binding for the
+event is run directly by @code{read-event}.  @xref{Special Events}.
address@hidden defvar
+
address@hidden emulation-mode-map-alists
+This variable holds a list of keymap alists to use for emulations
+modes.  It is intended for modes or packages using multiple minor-mode
+keymaps.  Each element is a keymap alist which has the same format and
+meaning as @code{minor-mode-map-alist}, or a symbol with a variable
+binding which is such an alist.  The ``active'' keymaps in each alist
+are used before @code{minor-mode-map-alist} and
address@hidden
address@hidden defvar
+
address@hidden Key Lookup
address@hidden Key Lookup
address@hidden key lookup
address@hidden keymap entry
+
+  @dfn{Key lookup} is the process of finding the binding of a key
+sequence from a given keymap.  The execution or use 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 a mouse event with just its types (a symbol)
+instead of the entire event (a list).  @xref{Input Events}.  Such
+a ``key sequence'' is insufficient for @code{command-execute} to run,
+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 a keymap element for a menu item, because
address@hidden 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 table
+of the meaningful types of keymap entries:
+
address@hidden @asis
address@hidden @code{nil}
address@hidden @code{nil} in keymap
address@hidden 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.
+
address@hidden @var{command}
address@hidden 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}.
+
address@hidden @var{array}
address@hidden 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.
+
address@hidden @var{keymap}
address@hidden 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}.
+
address@hidden @var{list}
address@hidden list in keymap
+The meaning of a list depends on what it contains:
+
address@hidden @bullet
address@hidden
+If the @sc{car} of @var{list} is the symbol @code{keymap}, then the list
+is a keymap, and is treated as a keymap (see above).
+
address@hidden
address@hidden @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 function, and is treated
+as such (see above).  In order to execute properly as a key binding,
+this function must be a command---it must have an @code{interactive}
+specification.  @xref{Defining Commands}.
+
address@hidden
+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}:
+
address@hidden
+(@var{othermap} . @var{othertype})
address@hidden 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 @address@hidden, whatever that may be.''
address@hidden itemize
+
address@hidden @var{symbol}
address@hidden symbol in keymap
+The function definition of @var{symbol} is used in place of
address@hidden  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}).
+
address@hidden @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.
+
address@hidden preventing prefix key
address@hidden is used in local keymaps to override a global key
+binding and make the key ``undefined'' locally.  A local binding of
address@hidden would fail to do this because it would not override the
+global binding.
+
address@hidden @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.
address@hidden 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}.
+Here is an example of a sparse keymap with two characters bound to
+commands and one bound to another keymap.  This map is the normal value
+of @code{emacs-lisp-mode-map}.  Note that 9 is the code for @key{TAB},
+127 for @key{DEL}, 27 for @key{ESC}, 17 for @kbd{C-q} and 24 for
address@hidden
+
address@hidden
address@hidden
+(keymap (9 . lisp-indent-line)
+        (127 . backward-delete-char-untabify)
+        (27 keymap (17 . indent-sexp) (24 . eval-defun)))
address@hidden group
address@hidden example
+
address@hidden Functions for Key Lookup
address@hidden Functions for Key Lookup
+
+  Here are the functions and variables pertaining to key lookup.
+
address@hidden lookup-key keymap key &optional accept-defaults
+This function returns the definition of @var{key} in @var{keymap}.  All
+the other functions described in this chapter that look up keys use
address@hidden  Here are examples:
+
address@hidden
address@hidden
+(lookup-key (current-global-map) "\C-x\C-f")
+    @result{} find-file
address@hidden group
address@hidden
+(lookup-key (current-global-map) (kbd "C-x C-f"))
+    @result{} find-file
address@hidden group
address@hidden
+(lookup-key (current-global-map) "\C-x\C-f12345")
+    @result{} 2
address@hidden group
address@hidden example
+
+If the string or vector @var{key} is not a valid key sequence according
+to the prefix keys specified in @var{keymap}, it must be ``too long''
+and have extra events at the end that do not fit into a single key
+sequence.  Then the value is a number, the number of events at the front
+of @var{key} that compose a complete key.
+
address@hidden Emacs 19 feature
+If @var{accept-defaults} is address@hidden, 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.  (To do this, supply @code{t} as an
+element of @var{key}; see @ref{Format of Keymaps}.)
+
+If @var{key} contains a meta character (not a function key), that
+character is implicitly replaced by a two-character sequence: the value
+of @code{meta-prefix-char}, followed by the corresponding non-meta
+character.  Thus, the first example below is handled by conversion into
+the second example.
+
address@hidden
address@hidden
+(lookup-key (current-global-map) "\M-f")
+    @result{} forward-word
address@hidden group
address@hidden
+(lookup-key (current-global-map) "\ef")
+    @result{} forward-word
address@hidden group
address@hidden 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 and
+it does not change drag events to clicks.
address@hidden defun
+
address@hidden Command undefined
+Used in keymaps to undefine keys.  It calls @code{ding}, but does
+not cause an error.
address@hidden deffn
+
address@hidden 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.
+
address@hidden Emacs 19 feature
+The argument @var{accept-defaults} controls checking for default bindings,
+as in @code{lookup-key} (above).
address@hidden defun
+
address@hidden 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.
+
address@hidden Emacs 19 feature
+The argument @var{accept-defaults} controls checking for default bindings,
+as in @code{lookup-key} (above).
address@hidden defun
+
address@hidden Emacs 19 feature
address@hidden minor-mode-key-binding key &optional accept-defaults
+This function returns a list of all the active minor mode bindings of
address@hidden  More precisely, it returns an alist of pairs
address@hidden(@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 found is not a prefix definition (a keymap or a
+symbol defined as a keymap), 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).
address@hidden defun
+
address@hidden meta-prefix-char
address@hidden @key{ESC}
+This variable is the meta-prefix character code.  It is used for
+translating a meta character to a two-character sequence 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 27, which is
+the @acronym{ASCII} code for @key{ESC}.
+
+As long as the value of @code{meta-prefix-char} remains 27, key lookup
+translates @kbd{M-b} into @address@hidden b}, which is normally defined
+as the @code{backward-word} command.  However, if you were to set
address@hidden to 24, the code for @kbd{C-x}, then Emacs will
+translate @kbd{M-b} into @kbd{C-x b}, whose standard binding is the
address@hidden command.  (Don't actually do this!)  Here is an
+illustration of what would happen:
+
address@hidden
address@hidden
+meta-prefix-char                    ; @r{The default value.}
+     @result{} 27
address@hidden group
address@hidden
+(key-binding "\M-b")
+     @result{} backward-word
address@hidden group
address@hidden
+?\C-x                               ; @r{The print representation}
+     @result{} 24                          ;   @r{of a character.}
address@hidden group
address@hidden
+(setq meta-prefix-char 24)
+     @result{} 24
address@hidden group
address@hidden
+(key-binding "\M-b")
+     @result{} switch-to-buffer            ; @r{Now, typing @kbd{M-b} is}
+                                    ;   @r{like typing @kbd{C-x b}.}
+
+(setq meta-prefix-char 27)          ; @r{Avoid confusion!}
+     @result{} 27                          ; @r{Restore the default value!}
address@hidden group
address@hidden smallexample
+
+This translation of one event into two happens only for characters, not
+for other kinds of input events.  Thus, @address@hidden, a function
+key, is not converted into @address@hidden @key{F1}}.
address@hidden defvar
+
address@hidden Changing Key Bindings
address@hidden Changing Key Bindings
address@hidden changing key bindings
address@hidden 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.
+
+  When choosing the key sequences for Lisp programs to rebind, please
+follow the Emacs conventions for use of various keys (@pxref{Key
+Binding Conventions}).
+
address@hidden meta character key constants
address@hidden control character key constants
+  In writing the key sequence to rebind, it is good to use the special
+escape sequences for control and meta characters (@pxref{String Type}).
+The syntax @samp{\C-} means that the following character is a control
+character and @samp{\M-} means that the following character is a meta
+character.  Thus, the string @code{"\M-x"} is read as containing a
+single @kbd{M-x}, @code{"\C-f"} is read as containing a single
address@hidden, and @code{"\M-\C-x"} and @code{"\C-\M-x"} are both read as
+containing a single @kbd{C-M-x}.  You can also use this escape syntax in
+vectors, as well as others that aren't allowed in strings; one example
+is @samp{[?\C-\H-x home]}.  @xref{Character Type}.
+
+  The key definition and lookup functions accept an alternate syntax for
+event types in a key sequence that is a vector: you can use a list
+containing modifier names plus one base event (a character or function
+key name).  For example, @code{(control ?a)} is equivalent to
address@hidden and @code{(hyper control left)} is equivalent to
address@hidden  One advantage of such lists is that the precise
+numeric codes for the modifier bits don't appear in compiled files.
+
+  The functions below signal an error 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.  The @code{kbd} macro (@pxref{Key Sequences}) is a convenient
+way to specify the key sequence.
+
address@hidden define-key keymap key binding
+This function sets the binding for @var{key} in @var{keymap}.  (If
address@hidden is more than one event long, the change is actually made
+in another keymap reached from @var{keymap}.)  The argument
address@hidden 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}.
+
+If @var{key} is @code{[t]}, this sets the default binding in
address@hidden  When an event has no binding of its own, the Emacs
+command loop uses the keymap's default binding, if there is one.
+
address@hidden invalid prefix key error
address@hidden 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
address@hidden is undefined, then @code{define-key} defines it as a prefix
+key so that the rest of @var{key} can be defined as specified.
+
+If there was previously no binding for @var{key} in @var{keymap}, the
+new binding is added at the beginning of @var{keymap}.  The order of
+bindings in a keymap makes no difference for keyboard input, but it
+does matter for menu keymaps (@pxref{Menu Keymaps}).
address@hidden defun
+
+  This example creates a sparse keymap and makes a number of
+bindings in it:
+
address@hidden
address@hidden
+(setq map (make-sparse-keymap))
+    @result{} (keymap)
address@hidden group
address@hidden
+(define-key map "\C-f" 'forward-char)
+    @result{} forward-char
address@hidden group
address@hidden
+map
+    @result{} (keymap (6 . forward-char))
address@hidden group
+
address@hidden
+;; @r{Build sparse submap for @kbd{C-x} and bind @kbd{f} in that.}
+(define-key map (kbd "C-x f") 'forward-word)
+    @result{} forward-word
address@hidden group
address@hidden
+map
address@hidden (keymap
+    (24 keymap                ; @kbd{C-x}
+        (102 . forward-word)) ;      @kbd{f}
+    (6 . forward-char))       ; @kbd{C-f}
address@hidden group
+
address@hidden
+;; @r{Bind @kbd{C-p} to the @code{ctl-x-map}.}
+(define-key map (kbd "C-p") ctl-x-map)
+;; @code{ctl-x-map}
address@hidden [nil @dots{} find-file @dots{} backward-kill-sentence]
address@hidden group
+
address@hidden
+;; @r{Bind @kbd{C-f} to @code{foo} in the @code{ctl-x-map}.}
+(define-key map (kbd "C-p C-f") 'foo)
address@hidden 'foo
address@hidden group
address@hidden
+map
address@hidden (keymap     ; @r{Note @code{foo} in @code{ctl-x-map}.}
+    (16 keymap [nil @dots{} foo @dots{} backward-kill-sentence])
+    (24 keymap
+        (102 . forward-word))
+    (6 . forward-char))
address@hidden group
address@hidden smallexample
+
address@hidden
+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.
+
+  The function @code{substitute-key-definition} scans a keymap for
+keys that have a certain binding and rebinds them with a different
+binding.  Another feature which is cleaner and can often produce the
+same results to remap one command into another (@pxref{Remapping
+Commands}).
+
address@hidden substitute-key-definition olddef newdef keymap &optional oldmap
address@hidden replace bindings
+This function replaces @var{olddef} with @var{newdef} for any keys in
address@hidden that were bound to @var{olddef}.  In other words,
address@hidden 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 Emacs with
+standard bindings:
+
address@hidden
address@hidden
+(substitute-key-definition
+ 'find-file 'find-file-read-only (current-global-map))
address@hidden group
address@hidden smallexample
+
address@hidden Emacs 19 feature
+If @var{oldmap} is address@hidden, that changes the behavior of
address@hidden: the bindings in @var{oldmap} determine
+which keys to rebind.  The rebindings still happen in @var{keymap}, not
+in @var{oldmap}.  Thus, you can change one map under the control of the
+bindings in another.  For example,
+
address@hidden
+(substitute-key-definition
+  'delete-backward-char 'my-funny-delete
+  my-map global-map)
address@hidden smallexample
+
address@hidden
+puts the special deletion command in @code{my-map} for whichever keys
+are globally bound to the standard deletion command.
+
+Here is an example showing a keymap before and after substitution:
+
address@hidden
address@hidden
+(setq map '(keymap
+            (?1 . olddef-1)
+            (?2 . olddef-2)
+            (?3 . olddef-1)))
address@hidden (keymap (49 . olddef-1) (50 . olddef-2) (51 . olddef-1))
address@hidden group
+
address@hidden
+(substitute-key-definition 'olddef-1 'newdef map)
address@hidden nil
address@hidden group
address@hidden
+map
address@hidden (keymap (49 . newdef) (50 . olddef-2) (51 . newdef))
address@hidden group
address@hidden smallexample
address@hidden defun
+
address@hidden suppress-keymap keymap &optional nodigits
address@hidden @code{self-insert-command} override
+This function changes the contents of the full keymap @var{keymap} by
+remapping @code{self-insert-command} to the command @code{undefined}
+(@pxref{Remapping Commands}).  This has the effect of undefining all
+printing characters, thus making ordinary insertion of text impossible.
address@hidden returns @code{nil}.
+
+If @var{nodigits} is @code{nil}, then @code{suppress-keymap} defines
+digits to run @code{digit-argument}, and @kbd{-} to run
address@hidden  Otherwise it makes them undefined like the
+rest of the printing characters.
+
address@hidden yank suppression
address@hidden @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 Emacs.
+
+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:
+
address@hidden
address@hidden
+(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)
address@hidden
address@hidden group
address@hidden smallexample
address@hidden defun
+
address@hidden Remapping Commands
address@hidden Remapping Commands
address@hidden remapping commands
+
+  A special kind of key binding, using a special ``key sequence''
+which includes a command name, has the effect of @dfn{remapping} that
+command into another.  Here's how it works.  You make a key binding
+for a key sequence that starts with the dummy event @code{remap},
+followed by the command name you want to remap.  Specify the remapped
+definition as the definition in this binding.  The remapped definition
+is usually a command name, but it can be any valid definition for
+a key binding.
+
+  Here's an example.  Suppose that My mode uses special commands
address@hidden and @code{my-kill-word}, which should be invoked
+instead of @code{kill-line} and @code{kill-word}.  It can establish
+this by making these two command-remapping bindings in its keymap:
+
address@hidden
+(define-key my-mode-map [remap kill-line] 'my-kill-line)
+(define-key my-mode-map [remap kill-word] 'my-kill-word)
address@hidden smallexample
+
+Whenever @code{my-mode-map} is an active keymap, if the user types
address@hidden, Emacs will find the standard global binding of
address@hidden (assuming nobody has changed it).  But
address@hidden remaps @code{kill-line} to @code{my-kill-line},
+so instead of running @code{kill-line}, Emacs runs
address@hidden
+
+Remapping only works through a single level.  In other words,
+
address@hidden
+(define-key my-mode-map [remap kill-line] 'my-kill-line)
+(define-key my-mode-map [remap my-kill-line] 'my-other-kill-line)
address@hidden smallexample
+
address@hidden
+does not have the effect of remapping @code{kill-line} into
address@hidden  If an ordinary key binding specifies
address@hidden, this keymap will remap it to @code{my-kill-line};
+if an ordinary binding specifies @code{my-kill-line}, this keymap will
+remap it to @code{my-other-kill-line}.
+
address@hidden command-remapping command &optional position keymaps
+This function returns the remapping for @var{command} (a symbol),
+given the current active keymaps.  If @var{command} is not remapped
+(which is the usual situation), or not a symbol, the function returns
address@hidden  @code{position} can optionally specify a buffer position
+or an event position to determine the keymaps to use, as in
address@hidden
+
+If the optional argument @code{keymaps} is address@hidden, it
+specifies a list of keymaps to search in.  This argument is ignored if
address@hidden is address@hidden
address@hidden defun
+
address@hidden Translation Keymaps
address@hidden Keymaps for Translating Sequences of Events
address@hidden keymaps for translating events
+
+  This section describes keymaps that are used during reading a key
+sequence, to translate certain event sequences into others.
address@hidden checks every subsequence of the key sequence
+being read, as it is read, against @code{function-key-map} and then
+against @code{key-translation-map}.
+
address@hidden function-key-map
+This variable holds a keymap that describes the character sequences sent
+by function keys on an ordinary character terminal.  This keymap has the
+same structure as other keymaps, but is used differently: it specifies
+translations to make while reading key sequences, rather than bindings
+for key sequences.
+
+If @code{function-key-map} ``binds'' a key sequence @var{k} to a vector
address@hidden, then when @var{k} appears as a subsequence @emph{anywhere} in a
+key sequence, it is replaced with the events in @var{v}.
+
+For example, VT100 terminals send @address@hidden O P} when the
+keypad @key{PF1} key is pressed.  Therefore, we want Emacs to translate
+that sequence of events into the single event @code{pf1}.  We accomplish
+this by ``binding'' @address@hidden O P} to @code{[pf1]} in
address@hidden, when using a VT100.
+
+Thus, typing @kbd{C-c @key{PF1}} sends the character sequence @kbd{C-c
address@hidden O P}; later the function @code{read-key-sequence} translates
+this back into @kbd{C-c @key{PF1}}, which it returns as the vector
address@hidden pf1]}.
+
+Entries in @code{function-key-map} are ignored if they conflict with
+bindings made in the minor mode, local, or global keymaps.  The intent
+is that the character sequences that function keys send should not have
+command bindings in their own right---but if they do, the ordinary
+bindings take priority.
+
+The value of @code{function-key-map} is usually set up automatically
+according to the terminal's Terminfo or Termcap entry, but sometimes
+those need help from terminal-specific Lisp files.  Emacs comes with
+terminal-specific files for many common terminals; their main purpose is
+to make entries in @code{function-key-map} beyond those that can be
+deduced from Termcap and Terminfo.  @xref{Terminal-Specific}.
address@hidden defvar
+
address@hidden key-translation-map
+This variable is another keymap used just like @code{function-key-map}
+to translate input events into other events.  It differs from
address@hidden in two ways:
+
address@hidden @bullet
address@hidden
address@hidden goes to work after @code{function-key-map} is
+finished; it receives the results of translation by
address@hidden
+
address@hidden
+Non-prefix bindings in @code{key-translation-map} override actual key
+bindings.  For example, if @kbd{C-x f} has a non-prefix binding in
address@hidden, that translation takes effect even though
address@hidden f} also has a key binding in the global map.
address@hidden itemize
+
+Note however that actual key bindings can have an effect on
address@hidden, even though they are overridden by it.
+Indeed, actual key bindings override @code{function-key-map} and thus
+may alter the key sequence that @code{key-translation-map} receives.
+Clearly, it is better to avoid this type of situation.
+
+The intent of @code{key-translation-map} is for users to map one
+character set to another, including ordinary characters normally bound
+to @code{self-insert-command}.
address@hidden defvar
+
address@hidden key translation function
+You can use @code{function-key-map} or @code{key-translation-map} for
+more than simple aliases, by using a function, instead of a key
+sequence, as the ``translation'' of a key.  Then this function is called
+to compute the translation of that key.
+
+The key translation function receives one argument, which is the prompt
+that was specified in @code{read-key-sequence}---or @code{nil} if the
+key sequence is being read by the editor command loop.  In most cases
+you can ignore the prompt value.
+
+If the function reads input itself, it can have the effect of altering
+the event that follows.  For example, here's how to define @kbd{C-c h}
+to turn the character that follows into a Hyper character:
+
address@hidden
address@hidden
+(defun hyperify (prompt)
+  (let ((e (read-event)))
+    (vector (if (numberp e)
+                (logior (lsh 1 24) e)
+              (if (memq 'hyper (event-modifiers e))
+                  e
+                (add-event-modifier "H-" e))))))
+
+(defun add-event-modifier (string e)
+  (let ((symbol (if (symbolp e) e (car e))))
+    (setq symbol (intern (concat string
+                                 (symbol-name symbol))))
address@hidden group
address@hidden
+    (if (symbolp e)
+        symbol
+      (cons symbol (cdr e)))))
+
+(define-key function-key-map "\C-ch" 'hyperify)
address@hidden group
address@hidden example
+
+  If you have enabled keyboard character set decoding using
address@hidden, decoding is done after the
+translations listed above.  @xref{Terminal I/O Encoding}.  However, in
+future Emacs versions, character set decoding may be done at an
+earlier stage.
+
address@hidden Key Binding Commands
address@hidden 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 init files
+(@pxref{Init File}) for simple customization.  For example,
+
address@hidden
+(global-set-key (kbd "C-x C-\\") 'next-line)
address@hidden smallexample
+
address@hidden
+or
+
address@hidden
+(global-set-key [?\C-x ?\C-\\] 'next-line)
address@hidden smallexample
+
address@hidden
+or
+
address@hidden
+(global-set-key [(control ?x) (control ?\\)] 'next-line)
address@hidden smallexample
+
address@hidden
+redefines @kbd{C-x C-\} to move down a line.
+
address@hidden
+(global-set-key [M-mouse-1] 'mouse-set-point)
address@hidden smallexample
+
address@hidden
+redefines the first (leftmost) mouse button, entered with the Meta key, to
+set point where you click.
+
address@hidden address@hidden text in keybindings
+  Be careful when using address@hidden text characters in Lisp
+specifications of keys to bind.  If these are read as multibyte text, as
+they usually will be in a Lisp file (@pxref{Loading Non-ASCII}), you
+must type the keys as multibyte too.  For instance, if you use this:
+
address@hidden
+(global-set-key "@"o" 'my-function) ; bind o-umlaut
address@hidden smallexample
+
address@hidden
+or
+
address@hidden
+(global-set-key ?@"o 'my-function) ; bind o-umlaut
address@hidden smallexample
+
address@hidden
+and your language environment is multibyte Latin-1, these commands
+actually bind the multibyte character with code 2294, not the unibyte
+Latin-1 character with code 246 (@kbd{M-v}).  In order to use this
+binding, you need to enter the multibyte Latin-1 character as keyboard
+input.  One way to do this is by using an appropriate input method
+(@pxref{Input Methods, , Input Methods, emacs, The GNU Emacs Manual}).
+
+  If you want to use a unibyte character in the key binding, you can
+construct the key sequence string using @code{multibyte-char-to-unibyte}
+or @code{string-make-unibyte} (@pxref{Converting Representations}).
+
address@hidden Command global-set-key key binding
+This function sets the binding of @var{key} in the current global map
+to @var{binding}.
+
address@hidden
address@hidden
+(global-set-key @var{key} @var{binding})
address@hidden
+(define-key (current-global-map) @var{key} @var{binding})
address@hidden group
address@hidden smallexample
address@hidden deffn
+
address@hidden Command global-unset-key key
address@hidden 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
address@hidden has a non-prefix binding.  For example:
+
address@hidden
address@hidden
+(global-unset-key "\C-l")
+    @result{} nil
address@hidden group
address@hidden
+(global-set-key "\C-l\C-l" 'redraw-display)
+    @result{} nil
address@hidden group
address@hidden smallexample
+
+This function is implemented simply using @code{define-key}:
+
address@hidden
address@hidden
+(global-unset-key @var{key})
address@hidden
+(define-key (current-global-map) @var{key} nil)
address@hidden group
address@hidden smallexample
address@hidden deffn
+
address@hidden Command local-set-key key binding
+This function sets the binding of @var{key} in the current local
+keymap to @var{binding}.
+
address@hidden
address@hidden
+(local-set-key @var{key} @var{binding})
address@hidden
+(define-key (current-local-map) @var{key} @var{binding})
address@hidden group
address@hidden smallexample
address@hidden deffn
+
address@hidden Command local-unset-key key
+This function removes the binding of @var{key} from the current
+local map.
+
address@hidden
address@hidden
+(local-unset-key @var{key})
address@hidden
+(define-key (current-local-map) @var{key} nil)
address@hidden group
address@hidden smallexample
address@hidden deffn
+
address@hidden Scanning Keymaps
address@hidden Scanning Keymaps
+
+  This section describes functions used to scan all the current keymaps
+for the sake of printing help information.
+
address@hidden accessible-keymaps keymap &optional prefix
+This function returns a list of all the keymaps that can be reached (via
+zero or more prefix keys) from @var{keymap}.  The value is an
+association list with elements of the form @code{(@var{key} .@:
address@hidden)}, where @var{key} is a prefix key whose definition in
address@hidden 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
address@hidden includes only the submaps whose prefixes start
+with @var{prefix}.  These elements look just as they do in the value of
address@hidden(accessible-keymaps)}; the only difference is that some elements
+are omitted.
+
+In the example below, the returned alist indicates that the key
address@hidden, which is displayed as @samp{^[}, is a prefix key whose
+definition is the sparse keymap @code{(keymap (83 .@: center-paragraph)
+(115 .@: foo))}.
+
address@hidden
address@hidden
+(accessible-keymaps (current-local-map))
address@hidden(([] keymap
+      (27 keymap   ; @r{Note this keymap for @key{ESC} is repeated below.}
+          (83 . center-paragraph)
+          (115 . center-line))
+      (9 . tab-to-tab-stop))
address@hidden group
+
address@hidden
+   ("^[" keymap
+    (83 . center-paragraph)
+    (115 . foo)))
address@hidden group
address@hidden smallexample
+
+In the following example, @kbd{C-h} is a prefix key that uses a sparse
+keymap starting with @code{(keymap (118 . describe-variable)@dots{})}.
+Another prefix, @kbd{C-x 4}, uses a keymap which is also the value of
+the variable @code{ctl-x-4-map}.  The event @code{mode-line} is one of
+several dummy events used as prefixes for mouse actions in special parts
+of a window.
+
address@hidden
address@hidden
+(accessible-keymaps (current-global-map))
address@hidden (([] keymap [set-mark-command beginning-of-line @dots{}
+                   delete-backward-char])
address@hidden group
address@hidden
+    ("^H" keymap (118 . describe-variable) @dots{}
+     (8 . help-for-help))
address@hidden group
address@hidden
+    ("^X" keymap [x-flush-mouse-queue @dots{}
+     backward-kill-sentence])
address@hidden group
address@hidden
+    ("^[" keymap [mark-sexp backward-sexp @dots{}
+     backward-kill-word])
address@hidden group
+    ("^X4" keymap (15 . display-buffer) @dots{})
address@hidden
+    ([mode-line] keymap
+     (S-mouse-2 . mouse-split-window-horizontally) @dots{}))
address@hidden group
address@hidden smallexample
+
address@hidden
+These are not all the keymaps you would see in actuality.
address@hidden defun
+
address@hidden map-keymap function keymap
+The function @code{map-keymap} calls @var{function} once
+for each binding in @var{keymap}.  It passes two arguments,
+the event type and the value of the binding.  If @var{keymap}
+has a parent, the parent's bindings are included as well.
+This works recursively: if the parent has itself a parent, then the
+grandparent's bindings are also included and so on.
+
+This function is the cleanest way to examine all the bindings
+in a keymap.
address@hidden defun
+
address@hidden where-is-internal command &optional keymap firstonly noindirect 
no-remap
+This function is a subroutine used by the @code{where-is} command
+(@pxref{Help, , Help, emacs,The GNU Emacs Manual}).  It returns a list
+of all key sequences (of any length) that are bound to @var{command} in a
+set of keymaps.
+
+The argument @var{command} can be any object; it is compared with all
+keymap entries using @code{eq}.
+
+If @var{keymap} is @code{nil}, then the maps used are the current active
+keymaps, disregarding @code{overriding-local-map} (that is, pretending
+its value is @code{nil}).  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, only those keymaps are searched.
+
+Usually it's best to use @code{overriding-local-map} as the expression
+for @var{keymap}.  Then @code{where-is-internal} searches precisely the
+keymaps that are active.  To search only the global map, pass
address@hidden(keymap)} (an empty keymap) as @var{keymap}.
+
+If @var{firstonly} is @code{non-ascii}, then the value is a single
+vector 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 @acronym{ASCII} characters (or meta variants of @acronym{ASCII}
+characters) are preferred to all other key sequences and that the
+return value can never be a menu binding.
+
+If @var{noindirect} is address@hidden, @code{where-is-internal} doesn't
+follow indirect keymap bindings.  This makes it possible to search for
+an indirect definition itself.
+
+When command remapping is in effect (@pxref{Remapping Commands}),
address@hidden figures out when a command will be run due to
+remapping and reports keys accordingly.  It also returns @code{nil} if
address@hidden won't really be run because it has been remapped to some
+other command.  However, if @var{no-remap} is address@hidden
address@hidden ignores remappings.
+
address@hidden
address@hidden
+(where-is-internal 'describe-function)
+    @result{} ([8 102] [f1 102] [help 102]
+         [menu-bar help-menu describe describe-function])
address@hidden group
address@hidden smallexample
address@hidden defun
+
address@hidden Command describe-bindings &optional prefix buffer-or-name
+This function creates a listing of all current key bindings, and
+displays it in a buffer named @samp{*Help*}.  The text is grouped by
+modes---minor modes first, then the major mode, then global bindings.
+
+If @var{prefix} is address@hidden, it should be a prefix key; then the
+listing includes only keys that start with @var{prefix}.
+
+The listing describes meta characters as @key{ESC} followed by the
+corresponding non-meta character.
+
+When several characters with consecutive @acronym{ASCII} codes have the
+same definition, they are shown together, as
address@hidden@address@hidden  In this instance, you need to
+know the @acronym{ASCII} codes to understand which characters this means.
+For example, in the default global map, the characters @address@hidden
+..@: ~} are described by a single line.  @key{SPC} is @acronym{ASCII} 32,
address@hidden is @acronym{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 @var{buffer-or-name} is address@hidden, it should be a buffer or a
+buffer name.  Then @code{describe-bindings} lists that buffer's bindings,
+instead of the current buffer's.
address@hidden deffn
+
address@hidden Menu Keymaps
address@hidden Menu Keymaps
address@hidden menu keymaps
+
+A keymap can operate as a menu as well as defining bindings for
+keyboard keys and mouse buttons.  Menus are usually actuated with the
+mouse, but they can function with the keyboard also.  If a menu keymap
+is active for the next input event, that activates the keyboard menu
+feature.
+
address@hidden
+* Defining Menus::             How to make a keymap that defines a menu.
+* Mouse Menus::                        How users actuate the menu with the 
mouse.
+* Keyboard Menus::             How users actuate the menu with the keyboard.
+* Menu Example::               Making a simple menu.
+* Menu Bar::                   How to customize the menu bar.
+* Tool Bar::                    A tool bar is a row of images.
+* Modifying Menus::             How to add new items to a menu.
address@hidden menu
+
address@hidden Defining Menus
address@hidden Defining Menus
address@hidden defining menus
address@hidden menu prompt string
address@hidden prompt string (of menu)
+
+A keymap acts as a menu if it has an @dfn{overall prompt string},
+which is a string that appears as an element of the keymap.
+(@xref{Format of Keymaps}.)  The string should describe the purpose of
+the menu's commands.  Emacs displays the overall prompt string as the
+menu title in some cases, depending on the toolkit (if any) used for
+displaying address@hidden is required for menus which do not use a
+toolkit, e.g.@: under MS-DOS.}  Keyboard menus also display the
+overall prompt string.
+
+The easiest way to construct a keymap with a prompt string is to
+specify the string as an argument when you call @code{make-keymap},
address@hidden (@pxref{Creating Keymaps}), or
address@hidden (@pxref{Definition of
+define-prefix-command}).  If you do not want the keymap to operate as
+a menu, don't specify a prompt string for it.
+
address@hidden keymap-prompt keymap
+This function returns the overall prompt string of @var{keymap},
+or @code{nil} if it has none.
address@hidden defun
+
+The menu's items are the bindings in the keymap.  Each binding
+associates an event type to a definition, but the event types have no
+significance for the menu appearance.  (Usually we use pseudo-events,
+symbols that the keyboard cannot generate, as the event types for menu
+item bindings.)  The menu is generated entirely from the bindings that
+correspond in the keymap to these events.
+
+The order of items in the menu is the same as the order of bindings in
+the keymap.  Since @code{define-key} puts new bindings at the front, you
+should define the menu items starting at the bottom of the menu and
+moving to the top, if you care about the order.  When you add an item to
+an existing menu, you can specify its position in the menu using
address@hidden (@pxref{Modifying Menus}).
+
address@hidden
+* Simple Menu Items::       A simple kind of menu key binding,
+                              limited in capabilities.
+* Extended Menu Items::     More powerful menu item definitions
+                              let you specify keywords to enable
+                              various features.
+* Menu Separators::         Drawing a horizontal line through a menu.
+* Alias Menu Items::        Using command aliases in menu items.
address@hidden menu
+
address@hidden Simple Menu Items
address@hidden Simple Menu Items
+
+  The simpler (and original) way to define a menu item is to bind some
+event type (it doesn't matter what event type) to a binding like this:
+
address@hidden
+(@var{item-string} . @var{real-binding})
address@hidden example
+
address@hidden
+The @sc{car}, @var{item-string}, is the string to be displayed in the
+menu.  It should be short---preferably one to three words.  It should
+describe the action of the command it corresponds to.  Note that it is
+not generally possible to display address@hidden text in menus.  It will
+work for keyboard menus and will work to a large extent when Emacs is
+built with the Gtk+ address@hidden this case, the text is first
+encoded using the @code{utf-8} coding system and then rendered by the
+toolkit as it sees fit.}
+
+  You can also supply a second string, called the help string, as follows:
+
address@hidden
+(@var{item-string} @var{help} . @var{real-binding})
address@hidden example
+
address@hidden
address@hidden specifies a ``help-echo'' string to display while the mouse
+is on that item in the same way as @code{help-echo} text properties
+(@pxref{Help display}).
+
+  As far as @code{define-key} is concerned, @var{item-string} and
address@hidden are part of the event's binding.  However,
address@hidden returns just @var{real-binding}, and only
address@hidden is used for executing the key.
+
+  If @var{real-binding} is @code{nil}, then @var{item-string} appears in
+the menu but cannot be selected.
+
+  If @var{real-binding} is a symbol and has a address@hidden
address@hidden property, that property is an expression that
+controls whether the menu item is enabled.  Every time the keymap is
+used to display a menu, Emacs evaluates the expression, and it enables
+the menu item only if the expression's value is address@hidden  When a
+menu item is disabled, it is displayed in a ``fuzzy'' fashion, and
+cannot be selected.
+
+  The menu bar does not recalculate which items are enabled every time you
+look at a menu.  This is because the X toolkit requires the whole tree
+of menus in advance.  To force recalculation of the menu bar, call
address@hidden (@pxref{Mode Line Format}).
+
+  You've probably noticed that menu items show the equivalent keyboard key
+sequence (if any) to invoke the same command.  To save time on
+recalculation, menu display caches this information in a sublist in the
+binding, like this:
+
address@hidden This line is not too long--rms.
address@hidden
+(@var{item-string} @address@hidden@r{]} (@var{key-binding-data}) . 
@var{real-binding})
address@hidden example
+
address@hidden
+Don't put these sublists in the menu item yourself; menu display
+calculates them automatically.  Don't mention keyboard equivalents in
+the item strings themselves, since that is redundant.
+
address@hidden Extended Menu Items
address@hidden Extended Menu Items
address@hidden menu-item
+
+  An extended-format menu item is a more flexible and also cleaner
+alternative to the simple format.  You define an event type with a
+binding that's a list starting with the symbol @code{menu-item}.
+For a non-selectable string, the binding looks like this:
+
address@hidden
+(menu-item @var{item-name})
address@hidden example
+
address@hidden
+A string starting with two or more dashes specifies a separator line;
+see @ref{Menu Separators}.
+
+  To define a real menu item which can be selected, the extended format
+binding looks like this:
+
address@hidden
+(menu-item @var{item-name} @var{real-binding}
+    . @var{item-property-list})
address@hidden example
+
address@hidden
+Here, @var{item-name} is an expression which evaluates to the menu item
+string.  Thus, the string need not be a constant.  The third element,
address@hidden, is the command to execute.  The tail of the list,
address@hidden, has the form of a property list which contains
+other information.
+
+  When an equivalent keyboard key binding is cached, the extended menu
+item binding looks like this:
+
address@hidden
+(menu-item @var{item-name} @var{real-binding} (@var{key-binding-data})
+    . @var{item-property-list})
address@hidden example
+
+  Here is a table of the properties that are supported:
+
address@hidden @code
address@hidden :enable @var{form}
+The result of evaluating @var{form} determines whether the item is
+enabled (address@hidden means yes).  If the item is not enabled,
+you can't really click on it.
+
address@hidden :visible @var{form}
+The result of evaluating @var{form} determines whether the item should
+actually appear in the menu (address@hidden means yes).  If the item
+does not appear, then the menu is displayed as if this item were
+not defined at all.
+
address@hidden :help @var{help}
+The value of this property, @var{help}, specifies a ``help-echo'' string
+to display while the mouse is on that item.  This is displayed in the
+same way as @code{help-echo} text properties (@pxref{Help display}).
+Note that this must be a constant string, unlike the @code{help-echo}
+property for text and overlays.
+
address@hidden :button (@var{type} . @var{selected})
+This property provides a way to define radio buttons and toggle buttons.
+The @sc{car}, @var{type}, says which: it should be @code{:toggle} or
address@hidden:radio}.  The @sc{cdr}, @var{selected}, should be a form; the
+result of evaluating it says whether this button is currently selected.
+
+A @dfn{toggle} is a menu item which is labeled as either ``on'' or ``off''
+according to the value of @var{selected}.  The command itself should
+toggle @var{selected}, setting it to @code{t} if it is @code{nil},
+and to @code{nil} if it is @code{t}.  Here is how the menu item
+to toggle the @code{debug-on-error} flag is defined:
+
address@hidden
+(menu-item "Debug on Error" toggle-debug-on-error
+           :button (:toggle
+                    . (and (boundp 'debug-on-error)
+                           debug-on-error)))
address@hidden example
+
address@hidden
+This works because @code{toggle-debug-on-error} is defined as a command
+which toggles the variable @code{debug-on-error}.
+
address@hidden buttons} are a group of menu items, in which at any time one
+and only one is ``selected.''  There should be a variable whose value
+says which one is selected at any time.  The @var{selected} form for
+each radio button in the group should check whether the variable has the
+right value for selecting that button.  Clicking on the button should
+set the variable so that the button you clicked on becomes selected.
+
address@hidden :key-sequence @var{key-sequence}
+This property specifies which key sequence is likely to be bound to the
+same command invoked by this menu item.  If you specify the right key
+sequence, that makes preparing the menu for display run much faster.
+
+If you specify the wrong key sequence, it has no effect; before Emacs
+displays @var{key-sequence} in the menu, it verifies that
address@hidden is really equivalent to this menu item.
+
address@hidden :key-sequence nil
+This property indicates that there is normally no key binding which is
+equivalent to this menu item.  Using this property saves time in
+preparing the menu for display, because Emacs does not need to search
+the keymaps for a keyboard equivalent for this menu item.
+
+However, if the user has rebound this item's definition to a key
+sequence, Emacs ignores the @code{:keys} property and finds the keyboard
+equivalent anyway.
+
address@hidden :keys @var{string}
+This property specifies that @var{string} is the string to display
+as the keyboard equivalent for this menu item.  You can use
+the @samp{\\[...]} documentation construct in @var{string}.
+
address@hidden :filter @var{filter-fn}
+This property provides a way to compute the menu item dynamically.
+The property value @var{filter-fn} should be a function of one argument;
+when it is called, its argument will be @var{real-binding}.  The
+function should return the binding to use instead.
+
+Emacs can call this function at any time that it does redisplay or
+operates on menu data structures, so you should write it so it can
+safely be called at any time.
address@hidden table
+
address@hidden Menu Separators
address@hidden Menu Separators
address@hidden menu separators
+
+  A menu separator is a kind of menu item that doesn't display any
+text---instead, it divides the menu into subparts with a horizontal line.
+A separator looks like this in the menu keymap:
+
address@hidden
+(menu-item @var{separator-type})
address@hidden example
+
address@hidden
+where @var{separator-type} is a string starting with two or more dashes.
+
+  In the simplest case, @var{separator-type} consists of only dashes.
+That specifies the default kind of separator.  (For compatibility,
address@hidden""} and @code{-} also count as separators.)
+
+  Certain other values of @var{separator-type} specify a different
+style of separator.  Here is a table of them:
+
address@hidden @code
address@hidden "--no-line"
address@hidden "--space"
+An extra vertical space, with no actual line.
+
address@hidden "--single-line"
+A single line in the menu's foreground color.
+
address@hidden "--double-line"
+A double line in the menu's foreground color.
+
address@hidden "--single-dashed-line"
+A single dashed line in the menu's foreground color.
+
address@hidden "--double-dashed-line"
+A double dashed line in the menu's foreground color.
+
address@hidden "--shadow-etched-in"
+A single line with a 3D sunken appearance.  This is the default,
+used separators consisting of dashes only.
+
address@hidden "--shadow-etched-out"
+A single line with a 3D raised appearance.
+
address@hidden "--shadow-etched-in-dash"
+A single dashed line with a 3D sunken appearance.
+
address@hidden "--shadow-etched-out-dash"
+A single dashed line with a 3D raised appearance.
+
address@hidden "--shadow-double-etched-in"
+Two lines with a 3D sunken appearance.
+
address@hidden "--shadow-double-etched-out"
+Two lines with a 3D raised appearance.
+
address@hidden "--shadow-double-etched-in-dash"
+Two dashed lines with a 3D sunken appearance.
+
address@hidden "--shadow-double-etched-out-dash"
+Two dashed lines with a 3D raised appearance.
address@hidden table
+
+  You can also give these names in another style, adding a colon after
+the double-dash and replacing each single dash with capitalization of
+the following word.  Thus, @code{"--:singleLine"}, is equivalent to
address@hidden"--single-line"}.
+
+  Some systems and display toolkits don't really handle all of these
+separator types.  If you use a type that isn't supported, the menu
+displays a similar kind of separator that is supported.
+
address@hidden Alias Menu Items
address@hidden Alias Menu Items
+
+  Sometimes it is useful to make menu items that use the ``same''
+command but with different enable conditions.  The best way to do this
+in Emacs now is with extended menu items; before that feature existed,
+it could be done by defining alias commands and using them in menu
+items.  Here's an example that makes two aliases for
address@hidden and gives them different enable conditions:
+
address@hidden
+(defalias 'make-read-only 'toggle-read-only)
+(put 'make-read-only 'menu-enable '(not buffer-read-only))
+(defalias 'make-writable 'toggle-read-only)
+(put 'make-writable 'menu-enable 'buffer-read-only)
address@hidden example
+
+When using aliases in menus, often it is useful to display the
+equivalent key bindings for the ``real'' command name, not the aliases
+(which typically don't have any key bindings except for the menu
+itself).  To request this, give the alias symbol a address@hidden
address@hidden property.  Thus,
+
address@hidden
+(put 'make-read-only 'menu-alias t)
+(put 'make-writable 'menu-alias t)
address@hidden example
+
address@hidden
+causes menu items for @code{make-read-only} and @code{make-writable} to
+show the keyboard bindings for @code{toggle-read-only}.
+
address@hidden Mouse Menus
address@hidden Menus and the Mouse
+
+  The usual way to make a menu keymap produce a menu is to make it the
+definition of a prefix key.  (A Lisp program can explicitly pop up a
+menu and receive the user's choice---see @ref{Pop-Up Menus}.)
+
+  If the prefix key ends with a mouse event, Emacs handles the menu keymap
+by popping up a visible menu, so that the user can select a choice with
+the mouse.  When the user clicks on a menu item, the event generated is
+whatever character or symbol has the binding that brought about that
+menu item.  (A menu item may generate a series of events if the menu has
+multiple levels or comes from the menu bar.)
+
+  It's often best to use a button-down event to trigger the menu.  Then
+the user can select a menu item by releasing the button.
+
+  A single keymap can appear as multiple menu panes, if you explicitly
+arrange for this.  The way to do this is to make a keymap for each pane,
+then create a binding for each of those maps in the main keymap of the
+menu.  Give each of these bindings an item string that starts with
address@hidden@@}.  The rest of the item string becomes the name of the pane.
+See the file @file{lisp/mouse.el} for an example of this.  Any ordinary
+bindings with @samp{@@}-less item strings are grouped into one pane,
+which appears along with the other panes explicitly created for the
+submaps.
+
+  X toolkit menus don't have panes; instead, they can have submenus.
+Every nested keymap becomes a submenu, whether the item string starts
+with @samp{@@} or not.  In a toolkit version of Emacs, the only thing
+special about @samp{@@} at the beginning of an item string is that the
address@hidden@@} doesn't appear in the menu item.
+
+  Multiple keymaps that define the same menu prefix key produce
+separate panes or separate submenus.
+
address@hidden Keyboard Menus
address@hidden Menus and the Keyboard
+
+  When a prefix key ending with a keyboard event (a character or
+function key) has a definition that is a menu keymap, the keymap
+operates as a keyboard menu; the user specifies the next event by
+choosing a menu item with the keyboard.
+
+  Emacs displays the keyboard menu with the map's overall prompt
+string, followed by the alternatives (the item strings of the map's
+bindings), in the echo area.  If the bindings don't all fit at once,
+the user can type @key{SPC} to see the next line of alternatives.
+Successive uses of @key{SPC} eventually get to the end of the menu and
+then cycle around to the beginning.  (The variable
address@hidden specifies which character is used for
+this; @key{SPC} is the default.)
+
+  When the user has found the desired alternative from the menu, he or
+she should type the corresponding character---the one whose binding is
+that alternative.
+
address@hidden
+In a menu intended for keyboard use, each menu item must clearly
+indicate what character to type.  The best convention to use is to make
+the character the first letter of the item string---that is something
+users will understand without being told.  We plan to change this; by
+the time you read this manual, keyboard menus may explicitly name the
+key for each alternative.
address@hidden ignore
+
+  This way of using menus in an Emacs-like editor was inspired by the
+Hierarkey system.
+
address@hidden menu-prompt-more-char
+This variable specifies the character to use to ask to see
+the next line of a menu.  Its initial value is 32, the code
+for @key{SPC}.
address@hidden defvar
+
address@hidden Menu Example
address@hidden Menu Example
address@hidden menu definition example
+
+  Here is a complete example of defining a menu keymap.  It is the
+definition of the @samp{Replace} submenu in the @samp{Edit} menu in
+the menu bar, and it uses the extended menu item format
+(@pxref{Extended Menu Items}).  First we create the keymap, and give
+it a name:
+
address@hidden
+(defvar menu-bar-replace-menu (make-sparse-keymap "Replace"))
address@hidden smallexample
+
address@hidden
+Next we define the menu items:
+
address@hidden
+(define-key menu-bar-replace-menu [tags-repl-continue]
+  '(menu-item "Continue Replace" tags-loop-continue
+             :help "Continue last tags replace operation"))
+(define-key menu-bar-replace-menu [tags-repl]
+  '(menu-item "Replace in tagged files" tags-query-replace
+             :help "Interactively replace a regexp in all tagged files"))
+(define-key menu-bar-replace-menu [separator-replace-tags]
+  '(menu-item "--"))
+;; @address@hidden
address@hidden smallexample
+
address@hidden
+Note the symbols which the bindings are ``made for''; these appear
+inside square brackets, in the key sequence being defined.  In some
+cases, this symbol is the same as the command name; sometimes it is
+different.  These symbols are treated as ``function keys,'' but they are
+not real function keys on the keyboard.  They do not affect the
+functioning of the menu itself, but they are ``echoed'' in the echo area
+when the user selects from the menu, and they appear in the output of
address@hidden and @code{apropos}.
+
+  The menu in this example is intended for use with the mouse.  If a
+menu is intended for use with the keyboard, that is, if it is bound to
+a key sequence ending with a keyboard event, then the menu items
+should be bound to characters or ``real'' function keys, that can be
+typed with the keyboard.
+
+  The binding whose definition is @code{("--")} is a separator line.
+Like a real menu item, the separator has a key symbol, in this case
address@hidden  If one menu has two separators, they
+must have two different key symbols.
+
+  Here is how we make this menu appear as an item in the parent menu:
+
address@hidden
+(define-key menu-bar-edit-menu [replace]
+  (list 'menu-item "Replace" menu-bar-replace-menu))
address@hidden example
+
address@hidden
+Note that this incorporates the submenu keymap, which is the value of
+the variable @code{menu-bar-replace-menu}, rather than the symbol
address@hidden itself.  Using that symbol in the parent
+menu item would be meaningless because @code{menu-bar-replace-menu} is
+not a command.
+
+  If you wanted to attach the same replace menu to a mouse click, you
+can do it this way:
+
address@hidden
+(define-key global-map [C-S-down-mouse-1]
+   menu-bar-replace-menu)
address@hidden example
+
address@hidden Menu Bar
address@hidden The Menu Bar
address@hidden menu bar
+
+  Most window systems allow each frame to have a @dfn{menu bar}---a
+permanently displayed menu stretching horizontally across the top of the
+frame.  The items of the menu bar are the subcommands of the fake
+``function key'' @code{menu-bar}, as defined in the active keymaps.
+
+  To add an item to the menu bar, invent a fake ``function key'' of your
+own (let's call it @var{key}), and make a binding for the key sequence
address@hidden @var{key}]}.  Most often, the binding is a menu keymap,
+so that pressing a button on the menu bar item leads to another menu.
+
+  When more than one active keymap defines the same fake function key
+for the menu bar, the item appears just once.  If the user clicks on
+that menu bar item, it brings up a single, combined menu containing
+all the subcommands of that item---the global subcommands, the local
+subcommands, and the minor mode subcommands.
+
+  The variable @code{overriding-local-map} is normally ignored when
+determining the menu bar contents.  That is, the menu bar is computed
+from the keymaps that would be active if @code{overriding-local-map}
+were @code{nil}.  @xref{Active Keymaps}.
+
+  In order for a frame to display a menu bar, its @code{menu-bar-lines}
+parameter must be greater than zero.  Emacs uses just one line for the
+menu bar itself; if you specify more than one line, the other lines
+serve to separate the menu bar from the windows in the frame.  We
+recommend 1 or 2 as the value of @code{menu-bar-lines}.  @xref{Layout
+Parameters}.
+
+  Here's an example of setting up a menu bar item:
+
address@hidden
address@hidden
+(modify-frame-parameters (selected-frame)
+                         '((menu-bar-lines . 2)))
address@hidden group
+
address@hidden
+;; @r{Make a menu keymap (with a prompt string)}
+;; @r{and make it the menu bar item's definition.}
+(define-key global-map [menu-bar words]
+  (cons "Words" (make-sparse-keymap "Words")))
address@hidden group
+
address@hidden
+;; @r{Define specific subcommands in this menu.}
+(define-key global-map
+  [menu-bar words forward]
+  '("Forward word" . forward-word))
address@hidden group
address@hidden
+(define-key global-map
+  [menu-bar words backward]
+  '("Backward word" . backward-word))
address@hidden group
address@hidden example
+
+  A local keymap can cancel a menu bar item made by the global keymap by
+rebinding the same fake function key with @code{undefined} as the
+binding.  For example, this is how Dired suppresses the @samp{Edit} menu
+bar item:
+
address@hidden
+(define-key dired-mode-map [menu-bar edit] 'undefined)
address@hidden example
+
address@hidden
address@hidden is the fake function key used by the global map for the
address@hidden menu bar item.  The main reason to suppress a global
+menu bar item is to regain space for mode-specific items.
+
address@hidden menu-bar-final-items
+Normally the menu bar shows global items followed by items defined by the
+local maps.
+
+This variable holds a list of fake function keys for items to display at
+the end of the menu bar rather than in normal sequence.  The default
+value is @code{(help-menu)}; thus, the @samp{Help} menu item normally appears
+at the end of the menu bar, following local menu items.
address@hidden defvar
+
address@hidden menu-bar-update-hook
+This normal hook is run by redisplay to update the menu bar contents,
+before redisplaying the menu bar.  You can use it to update submenus
+whose contents should vary.  Since this hook is run frequently, we
+advise you to ensure that the functions it calls do not take much time
+in the usual case.
address@hidden defvar
+
address@hidden Tool Bar
address@hidden Tool bars
address@hidden tool bar
+
+  A @dfn{tool bar} is a row of icons at the top of a frame, that execute
+commands when you click on them---in effect, a kind of graphical menu
+bar.
+
+  The frame parameter @code{tool-bar-lines} (X resource @samp{toolBar})
+controls how many lines' worth of height to reserve for the tool bar.  A
+zero value suppresses the tool bar.  If the value is nonzero, and
address@hidden is address@hidden, the tool bar expands and
+contracts automatically as needed to hold the specified contents.
+
+  If the value of @code{auto-resize-tool-bars} is @code{grow-only},
+the tool bar expands automatically, but does not contract automatically.
+To contract the tool bar, the user has to redraw the frame by entering
address@hidden
+
+  The tool bar contents are controlled by a menu keymap attached to a
+fake ``function key'' called @code{tool-bar} (much like the way the menu
+bar is controlled).  So you define a tool bar item using
address@hidden, like this:
+
address@hidden
+(define-key global-map [tool-bar @var{key}] @var{item})
address@hidden example
+
address@hidden
+where @var{key} is a fake ``function key'' to distinguish this item from
+other items, and @var{item} is a menu item key binding (@pxref{Extended
+Menu Items}), which says how to display this item and how it behaves.
+
+  The usual menu keymap item properties, @code{:visible},
address@hidden:enable}, @code{:button}, and @code{:filter}, are useful in
+tool bar bindings and have their normal meanings.  The @var{real-binding}
+in the item must be a command, not a keymap; in other words, it does not
+work to define a tool bar icon as a prefix key.
+
+  The @code{:help} property specifies a ``help-echo'' string to display
+while the mouse is on that item.  This is displayed in the same way as
address@hidden text properties (@pxref{Help display}).
+
+  In addition, you should use the @code{:image} property;
+this is how you specify the image to display in the tool bar:
+
address@hidden @code
address@hidden :image @var{image}
address@hidden is either a single image specification or a vector of four
+image specifications.  If you use a vector of four,
+one of them is used, depending on circumstances:
+
address@hidden @asis
address@hidden item 0
+Used when the item is enabled and selected.
address@hidden item 1
+Used when the item is enabled and deselected.
address@hidden item 2
+Used when the item is disabled and selected.
address@hidden item 3
+Used when the item is disabled and deselected.
address@hidden table
address@hidden table
+
+If @var{image} is a single image specification, Emacs draws the tool bar
+button in disabled state by applying an edge-detection algorithm to the
+image.
+
+The default tool bar is defined so that items specific to editing do not
+appear for major modes whose command symbol has a @code{mode-class}
+property of @code{special} (@pxref{Major Mode Conventions}).  Major
+modes may add items to the global bar by binding @code{[tool-bar
address@hidden in their local map.  It makes sense for some major modes to
+replace the default tool bar items completely, since not many can be
+accommodated conveniently, and the default bindings make this easy by
+using an indirection through @code{tool-bar-map}.
+
address@hidden tool-bar-map
+By default, the global map binds @code{[tool-bar]} as follows:
address@hidden
+(global-set-key [tool-bar]
+               '(menu-item "tool bar" ignore
+                           :filter (lambda (ignore) tool-bar-map)))
address@hidden example
address@hidden
+Thus the tool bar map is derived dynamically from the value of variable
address@hidden and you should normally adjust the default (global)
+tool bar by changing that map.  Major modes may replace the global bar
+completely by making @code{tool-bar-map} buffer-local and set to a
+keymap containing only the desired items.  Info mode provides an
+example.
address@hidden defvar
+
+There are two convenience functions for defining tool bar items, as
+follows.
+
address@hidden tool-bar-add-item icon def key &rest props
+This function adds an item to the tool bar by modifying
address@hidden  The image to use is defined by @var{icon}, which
+is the base name of an XPM, XBM or PBM image file to be located by
address@hidden  Given a value @samp{"exit"}, say, @file{exit.xpm},
address@hidden and @file{exit.xbm} would be searched for in that order
+on a color display.  On a monochrome display, the search order is
address@hidden, @samp{.xbm} and @samp{.xpm}.  The binding to use is the
+command @var{def}, and @var{key} is the fake function key symbol in the
+prefix keymap.  The remaining arguments @var{props} are additional
+property list elements to add to the menu item specification.
+
+To define items in some local map, bind @code{tool-bar-map} with
address@hidden around calls of this function:
address@hidden
+(defvar foo-tool-bar-map
+  (let ((tool-bar-map (make-sparse-keymap)))
+    (tool-bar-add-item @dots{})
+    @dots{}
+    tool-bar-map))
address@hidden example
address@hidden defun
+
address@hidden tool-bar-add-item-from-menu command icon &optional map &rest 
props
+This function is a convenience for defining tool bar items which are
+consistent with existing menu bar bindings.  The binding of
address@hidden is looked up in the menu bar in @var{map} (default
address@hidden) and modified to add an image specification for
address@hidden, which is found in the same way as by
address@hidden  The resulting binding is then placed in
address@hidden, so use this function only for global tool bar
+items.
+
address@hidden must contain an appropriate keymap bound to
address@hidden  The remaining arguments @var{props} are additional
+property list elements to add to the menu item specification.
address@hidden defun
+
address@hidden tool-bar-local-item-from-menu command icon in-map &optional 
from-map &rest props
+This function is used for making non-global tool bar items.  Use it
+like @code{tool-bar-add-item-from-menu} except that @var{in-map}
+specifies the local map to make the definition in.  The argument
address@hidden is like the @var{map} argument of
address@hidden
address@hidden defun
+
address@hidden auto-resize-tool-bar
+If this variable is address@hidden, the tool bar automatically resizes to
+show all defined tool bar items---but not larger than a quarter of the
+frame's height.
+
+If the value is @code{grow-only}, the tool bar expands automatically,
+but does not contract automatically.  To contract the tool bar, the
+user has to redraw the frame by entering @kbd{C-l}.
address@hidden defvar
+
address@hidden auto-raise-tool-bar-buttons
+If this variable is address@hidden, tool bar items display
+in raised form when the mouse moves over them.
address@hidden defvar
+
address@hidden tool-bar-button-margin
+This variable specifies an extra margin to add around tool bar items.
+The value is an integer, a number of pixels.  The default is 4.
address@hidden defvar
+
address@hidden tool-bar-button-relief
+This variable specifies the shadow width for tool bar items.
+The value is an integer, a number of pixels.  The default is 1.
address@hidden defvar
+
address@hidden tool-bar-border
+This variable specifies the height of the border drawn below the tool
+bar area.  An integer value specifies height as a number of pixels.
+If the value is one of @code{internal-border-width} (the default) or
address@hidden, the tool bar border height corresponds to the
+corresponding frame parameter.
address@hidden defvar
+
+  You can define a special meaning for clicking on a tool bar item with
+the shift, control, meta, etc., modifiers.  You do this by setting up
+additional items that relate to the original item through the fake
+function keys.  Specifically, the additional items should use the
+modified versions of the same fake function key used to name the
+original item.
+
+  Thus, if the original item was defined this way,
+
address@hidden
+(define-key global-map [tool-bar shell]
+  '(menu-item "Shell" shell
+              :image (image :type xpm :file "shell.xpm")))
address@hidden example
+
address@hidden
+then here is how you can define clicking on the same tool bar image with
+the shift modifier:
+
address@hidden
+(define-key global-map [tool-bar S-shell] 'some-command)
address@hidden example
+
address@hidden Keys}, for more information about how to add modifiers to
+function keys.
+
address@hidden Modifying Menus
address@hidden Modifying Menus
+
+  When you insert a new item in an existing menu, you probably want to
+put it in a particular place among the menu's existing items.  If you
+use @code{define-key} to add the item, it normally goes at the front of
+the menu.  To put it elsewhere in the menu, use @code{define-key-after}:
+
address@hidden define-key-after map key binding &optional after
+Define a binding in @var{map} for @var{key}, with value @var{binding},
+just like @code{define-key}, but position the binding in @var{map} after
+the binding for the event @var{after}.  The argument @var{key} should be
+of length one---a vector or string with just one element.  But
address@hidden should be a single event type---a symbol or a character, not
+a sequence.  The new binding goes after the binding for @var{after}.  If
address@hidden is @code{t} or is omitted, then the new binding goes last, at
+the end of the keymap.  However, new bindings are added before any
+inherited keymap.
+
+Here is an example:
+
address@hidden
+(define-key-after my-menu [drink]
+  '("Drink" . drink-command) 'eat)
address@hidden example
+
address@hidden
+makes a binding for the fake function key @key{DRINK} and puts it
+right after the binding for @key{EAT}.
+
+Here is how to insert an item called @samp{Work} in the @samp{Signals}
+menu of Shell mode, after the item @code{break}:
+
address@hidden
+(define-key-after
+  (lookup-key shell-mode-map [menu-bar signals])
+  [work] '("Work" . work-command) 'break)
address@hidden example
address@hidden defun
+
address@hidden
+   arch-tag: cfb87287-9364-4e46-9e93-6c2f7f6ae794
address@hidden ignore




reply via email to

[Prev in Thread] Current Thread [Next in Thread]