\input texinfo    @c -*-texinfo-*-
@comment %**start of header
@setfilename info-stnd.info
@settitle GNU Info
@set InfoProgVer 2.11
@paragraphindent none
@footnotestyle end
@synindex vr cp
@synindex fn cp
@synindex ky cp
@comment %**end of header
@comment $Id: info-stnd.texi,v 1.1.1.2 1998/03/24 18:20:36 law Exp $

@dircategory Texinfo documentation system
@direntry
* info program: (info-stnd).    Standalone Info-reading program.
@end direntry

@ifinfo
This file documents GNU Info, a program for viewing the on-line formatted
versions of Texinfo files.  This documentation is different from the
documentation for the Info reader that is part of GNU Emacs.  If you do
not know how to use Info, but have a working Info reader, you should
read that documentation first.

Copyright @copyright{} 1992, 93, 96, 97 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

@ignore
Permission is granted to process this file through TeX and print the
results, provided the printed document carries a copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).
@end ignore

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
sections entitled ``Copying'' and ``GNU General Public License'' are
included exactly as in the original, and provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the Free Software Foundation.
@end ifinfo

@titlepage
@title GNU Info User's Guide
@subtitle For GNU Info version @value{InfoProgVer}
@author Brian J. Fox (bfox@@ai.mit.edu)
@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1992, 1993, 1997 Free Software Foundation

Permission is granted to make and distribute verbatim copies of this
manual provided the copyright notice and this permission notice are
preserved on all copies.

Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
sections entitled ``Copying'' and ``GNU General Public License'' are
included exactly as in the original, and provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.

Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that this permission notice may be stated in a translation
approved by the Free Software Foundation.
@end titlepage

@ifinfo
@node Top, What is Info, , (dir)
@top The GNU Info Program

This file documents GNU Info, a program for viewing the on-line
formatted versions of Texinfo files, version @value{InfoProgVer}.  This
documentation is different from the documentation for the Info reader
that is part of GNU Emacs.
@end ifinfo

@menu
* What is Info::                
* Options::                     Options you can pass on the command line.
* Cursor Commands::             Commands which move the cursor within a node.
* Scrolling Commands::          Commands for moving the node around 
                                  in a window.
* Node Commands::               Commands for selecting a new node.
* Searching Commands::          Commands for searching an Info file.
* Xref Commands::               Commands for selecting cross references.
* Window Commands::             Commands which manipulate multiple windows.
* Printing Nodes::              How to print out the contents of a node.
* Miscellaneous Commands::      A few commands that defy categories.
* Variables::                   How to change the default behavior of Info.
* GNU Info Global Index::       Global index containing keystrokes, 
                                  command names, variable names, 
                                  and general concepts.
@end menu

@node What is Info, Options, Top, Top
@chapter What is Info?

@iftex
This file documents GNU Info, a program for viewing the on-line formatted
versions of Texinfo files, version @value{InfoProgVer}.
@end iftex

@dfn{Info} is a program which is used to view Info files on an ASCII
terminal.  @dfn{Info files} are the result of processing Texinfo files
with the program @code{makeinfo} or with one of the Emacs commands, such
as @code{M-x texinfo-format-buffer}.  Texinfo itself is a documentation
system that uses a single source file to produce both on-line
information and printed output.  You can typeset and print the
files that you read in Info.@refill

@node Options, Cursor Commands, What is Info, Top
@chapter Command Line Options
@cindex command line options
@cindex arguments, command line

GNU Info accepts several options to control the initial node being
viewed, and to specify which directories to search for Info files.  Here
is a template showing an invocation of GNU Info from the shell:

@example
info [--@var{option-name} @var{option-value}] @var{menu-item}@dots{}
@end example

The following @var{option-names} are available when invoking Info from
the shell:

@table @code
@cindex directory path
@item --directory @var{directory-path}
@itemx -d @var{directory-path}
Add @var{directory-path} to the list of directory paths searched when
Info needs to find a file.  You may issue @code{--directory} multiple
times; once for each directory which contains Info files.
Alternatively, you may specify a value for the environment variable
@code{INFOPATH}; if @code{--directory} is not given, the value of
@code{INFOPATH} is used.  The value of @code{INFOPATH} is a colon
separated list of directory names.  If you do not supply @code{INFOPATH}
or @code{--directory-path}, Info uses a default path.

@item --file @var{filename}
@itemx -f @var{filename}
@cindex Info file, selecting
Specify a particular Info file to visit.  By default, Info visits
the file @code{dir}; if you use this option, Info will start with
@code{(@var{filename})Top} as the first file and node.

@item --index-search @var{string}
@cindex index search, selecting
@cindex online help, using Info as
Go to the index entry @var{string} in the Info file specified with
@samp{--file}.  If no such entry, print @samp{no entries found} and exit
with nonzero status.  This can used from another program as a way to
provide online help.

@item --node @var{nodename}
@itemx -n @var{nodename}
@cindex node, selecting
Specify a particular node to visit in the initial file that Info
loads.  This is especially useful in conjunction with
@code{--file}@footnote{Of course, you can specify both the file and node
in a @code{--node} command; but don't forget to escape the open and
close parentheses from the shell as in: @code{info --node
"(emacs)Buffers"}}.  You may specify @code{--node} multiple times; for
an interactive Info, each @var{nodename} is visited in its own window,
for a non-interactive Info (such as when @code{--output} is given) each
@var{nodename} is processed sequentially.

@item --output @var{filename}
@itemx -o @var{filename}
@cindex file, outputting to
@cindex outputting to a file
Specify @var{filename} as the name of a file to which to direct output.
Each node that Info visits will be output to @var{filename} instead of
interactively viewed.  A value of @code{-} for @var{filename} specifies
the standard output.

@item --subnodes
@cindex @code{--subnodes}, command line option
This option only has meaning when given in conjunction with
@code{--output}.  It means to recursively output the nodes appearing in
the menus of each node being output.  Menu items which resolve to
external Info files are not output, and neither are menu items which are
members of an index.  Each node is only output once.

@item --help
@itemx -h
Produces a relatively brief description of the available Info options.

@item --version
@cindex version information
Prints the version information of Info and exits.

@item @var{menu-item}
@cindex menu, following
Info treats its remaining arguments as the names of menu items.  The
first argument is a menu item in the initial node visited, while
the second argument is a menu item in the first argument's node.
You can easily move to the node of your choice by specifying the menu
names which describe the path to that node.  For example,

@example
info emacs buffers
@end example

@noindent
first selects the menu item @samp{Emacs} in the node @samp{(dir)Top},
and then selects the menu item @samp{Buffers} in the node
@samp{(emacs)Top}.
@end table

@node Cursor Commands, Scrolling Commands, Options, Top
@chapter Moving the Cursor
@cindex cursor, moving

Many people find that reading screens of text page by page is made
easier when one is able to indicate particular pieces of text with some
kind of pointing device.  Since this is the case, GNU Info (both the
Emacs and standalone versions) have several commands which allow you to
move the cursor about the screen.  The notation used in this manual to
describe keystrokes is identical to the notation used within the Emacs
manual, and the GNU Readline manual.  @xref{Characters, , Character
Conventions, emacs, the GNU Emacs Manual}, if you are unfamiliar with the
notation.

The following table lists the basic cursor movement commands in Info.
Each entry consists of the key sequence you should type to execute the
cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it
invokes @code{execute-extended-command}.  @xref{M-x, , Executing an
extended command, emacs, the GNU Emacs Manual}, for more detailed
information.} command name (displayed in parentheses), and a short
description of what the command does.  All of the cursor motion commands
can take an @dfn{numeric} argument (@pxref{Miscellaneous Commands,
@code{universal-argument}}), to find out how to supply them.  With a
numeric argument, the motion commands are simply executed that
many times; for example, a numeric argument of 4 given to
@code{next-line} causes the cursor to move down 4 lines.  With a
negative numeric argument, the motion is reversed; an argument of -4
given to the @code{next-line} command would cause the cursor to move
@emph{up} 4 lines.

@table @asis
@item @code{C-n} (@code{next-line})
@kindex C-n
@findex next-line
Move the cursor down to the next line.

@item @code{C-p} (@code{prev-line})
@kindex C-p
@findex prev-line
Move the cursor up to the previous line.

@item @code{C-a} (@code{beginning-of-line})
@kindex C-a, in Info windows
@findex beginning-of-line
Move the cursor to the start of the current line.

@item @code{C-e} (@code{end-of-line})
@kindex C-e, in Info windows
@findex end-of-line
Move the cursor to the end of the current line.

@item @code{C-f} (@code{forward-char})
@kindex C-f, in Info windows
@findex forward-char
Move the cursor forward a character.

@item @code{C-b} (@code{backward-char})
@kindex C-b, in Info windows
@findex backward-char
Move the cursor backward a character.

@item @code{M-f} (@code{forward-word})
@kindex M-f, in Info windows
@findex forward-word
Move the cursor forward a word.

@item @code{M-b} (@code{backward-word})
@kindex M-b, in Info windows
@findex backward-word
Move the cursor backward a word.

@item @code{M-<} (@code{beginning-of-node})
@itemx @code{b}
@kindex b, in Info windows
@kindex M-<
@findex beginning-of-node
Move the cursor to the start of the current node.

@item @code{M->} (@code{end-of-node})
@kindex M->
@findex end-of-node
Move the cursor to the end of the current node.

@item @code{M-r} (@code{move-to-window-line})
@kindex M-r
@findex move-to-window-line
Move the cursor to a specific line of the window.  Without a numeric
argument, @code{M-r} moves the cursor to the start of the line in the
center of the window.  With a numeric argument of @var{n}, @code{M-r}
moves the cursor to the start of the @var{n}th line in the window.
@end table

@node Scrolling Commands, Node Commands, Cursor Commands, Top
@chapter Moving Text Within a Window
@cindex scrolling

Sometimes you are looking at a screenful of text, and only part of the
current paragraph you are reading is visible on the screen.  The
commands detailed in this section are used to shift which part of the
current node is visible on the screen.

@table @asis
@item @code{SPC} (@code{scroll-forward})
@itemx @code{C-v}
@kindex SPC, in Info windows
@kindex C-v
@findex scroll-forward
Shift the text in this window up.  That is, show more of the node which
is currently below the bottom of the window.  With a numeric argument,
show that many more lines at the bottom of the window; a numeric
argument of 4 would shift all of the text in the window up 4 lines
(discarding the top 4 lines), and show you four new lines at the bottom
of the window.  Without a numeric argument, @key{SPC} takes the bottom
two lines of the window and places them at the top of the window,
redisplaying almost a completely new screenful of lines.

@item @code{DEL} (@code{scroll-backward})
@itemx @code{M-v}
@kindex DEL, in Info windows
@kindex M-v
@findex scroll-backward
Shift the text in this window down.  The inverse of
@code{scroll-forward}.
@end table

@cindex scrolling through node structure
The @code{scroll-forward} and @code{scroll-backward} commands can also
move forward and backward through the node structure of the file.  If
you press @key{SPC} while viewing the end of a node, or @key{DEL} while
viewing the beginning of a node, what happens is controlled by the
variable @code{scroll-behavior}.  @xref{Variables,
@code{scroll-behavior}}, for more information.

@table @asis
@item @code{C-l} (@code{redraw-display})
@kindex C-l
@findex redraw-display
Redraw the display from scratch, or shift the line containing the cursor
to a specified location.  With no numeric argument, @samp{C-l} clears
the screen, and then redraws its entire contents.  Given a numeric
argument of @var{n}, the line containing the cursor is shifted so that
it is on the @var{n}th line of the window.

@item @code{C-x w} (@code{toggle-wrap})
@kindex C-w
@findex toggle-wrap
Toggles the state of line wrapping in the current window.  Normally,
lines which are longer than the screen width @dfn{wrap}, i.e., they are
continued on the next line.  Lines which wrap have a @samp{\} appearing
in the rightmost column of the screen.  You can cause such lines to be
terminated at the rightmost column by changing the state of line
wrapping in the window with @code{C-x w}.  When a line which needs more
space than one screen width to display is displayed, a @samp{$} appears
in the rightmost column of the screen, and the remainder of the line is
invisible.
@end table

@node Node Commands, Searching Commands, Scrolling Commands, Top
@chapter Selecting a New Node
@cindex nodes, selection of

This section details the numerous Info commands which select a new node
to view in the current window.

The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and
@samp{l}.

When you are viewing a node, the top line of the node contains some Info
@dfn{pointers} which describe where the next, previous, and up nodes
are.  Info uses this line to move about the node structure of the file
when you use the following commands:

@table @asis
@item @code{n} (@code{next-node})
@kindex n
@findex next-node
Select the `Next' node.  

@item @code{p} (@code{prev-node})
@kindex p
@findex prev-node
Select the `Prev' node.

@item @code{u} (@code{up-node})
@kindex u
@findex up-node
Select the `Up' node.
@end table

You can easily select a node that you have already viewed in this window
by using the @samp{l} command -- this name stands for "last", and
actually moves through the list of already visited nodes for this
window.  @samp{l} with a negative numeric argument moves forward through
the history of nodes for this window, so you can quickly step between
two adjacent (in viewing history) nodes.

@table @asis
@item @code{l} (@code{history-node})
@kindex l
@findex history-node
Select the most recently selected node in this window.
@end table

Two additional commands make it easy to select the most commonly
selected nodes; they are @samp{t} and @samp{d}.

@table @asis
@item @code{t} (@code{top-node})
@kindex t
@findex top-node
Select the node @samp{Top} in the current Info file.

@item @code{d} (@code{dir-node})
@kindex d
@findex dir-node
Select the directory node (i.e., the node @samp{(dir)}).
@end table

Here are some other commands which immediately result in the selection
of a different node in the current window:

@table @asis
@item @code{<} (@code{first-node})
@kindex <
@findex first-node
Selects the first node which appears in this file.  This node is most
often @samp{Top}, but it does not have to be.

@item @code{>} (@code{last-node})
@kindex >
@findex last-node
Select the last node which appears in this file.

@item @code{]} (@code{global-next-node})
@kindex ]
@findex global-next-node
Move forward or down through node structure.  If the node that you are
currently viewing has a @samp{Next} pointer, that node is selected.
Otherwise, if this node has a menu, the first menu item is selected.  If
there is no @samp{Next} and no menu, the same process is tried with the
@samp{Up} node of this node.

@item @code{[} (@code{global-prev-node})
@kindex [
@findex global-prev-node
Move backward or up through node structure.  If the node that you are
currently viewing has a @samp{Prev} pointer, that node is selected.
Otherwise, if the node has an @samp{Up} pointer, that node is selected,
and if it has a menu, the last item in the menu is selected.
@end table

You can get the same behavior as @code{global-next-node} and
@code{global-prev-node} while simply scrolling through the file with
@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behavior}}, for
more information.

@table @asis
@item @code{g} (@code{goto-node})
@kindex g
@findex goto-node
Read the name of a node and select it.  No completion is done while
reading the node name, since the desired node may reside in a separate
file.  The node must be typed exactly as it appears in the Info file.  A
file name may be included as with any node specification, for example

@example
@code{g(emacs)Buffers}
@end example

finds the node @samp{Buffers} in the Info file @file{emacs}.

@item @code{C-x k} (@code{kill-node})
@kindex C-x k
@findex kill-node
Kill a node.  The node name is prompted for in the echo area, with a
default of the current node.  @dfn{Killing} a node means that Info tries
hard to forget about it, removing it from the list of history nodes kept
for the window where that node is found.  Another node is selected in
the window which contained the killed node.

@item @code{C-x C-f} (@code{view-file})
@kindex C-x C-f
@findex view-file
Read the name of a file and selects the entire file.  The command
@example
@code{C-x C-f @var{filename}}
@end example
is equivalent to typing
@example
@code{g(@var{filename})*}
@end example

@item @code{C-x C-b} (@code{list-visited-nodes})
@kindex C-x C-b
@findex list-visited-nodes
Make a window containing a menu of all of the currently visited nodes.
This window becomes the selected window, and you may use the standard
Info commands within it.

@item @code{C-x b} (@code{select-visited-node})
@kindex C-x b
@findex select-visited-node
Select a node which has been previously visited in a visible window.
This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is
created.
@end table

@node Searching Commands, Xref Commands, Node Commands, Top
@chapter Searching an Info File
@cindex searching

GNU Info allows you to search for a sequence of characters throughout an
entire Info file, search through the indices of an Info file, or find
areas within an Info file which discuss a particular topic.

@table @asis
@item @code{s} (@code{search})
@kindex s
@findex search
Read a string in the echo area and search for it.

@item @code{C-s} (@code{isearch-forward})
@kindex C-s
@findex isearch-forward
Interactively search forward through the Info file for a string as you
type it.

@item @code{C-r} (@code{isearch-backward})
@kindex C-r
@findex isearch-backward
Interactively search backward through the Info file for a string as
you type it.

@item @code{i} (@code{index-search})
@kindex i
@findex index-search
Look up a string in the indices for this Info file, and select a node
where the found index entry points to.

@item @code{,} (@code{next-index-match})
@kindex ,
@findex next-index-match
Move to the node containing the next matching index item from the last
@samp{i} command.
@end table

The most basic searching command is @samp{s} (@code{search}).  The
@samp{s} command prompts you for a string in the echo area, and then
searches the remainder of the Info file for an occurrence of that string.
If the string is found, the node containing it is selected, and the
cursor is left positioned at the start of the found string.  Subsequent
@samp{s} commands show you the default search string within @samp{[} and
@samp{]}; pressing @key{RET} instead of typing a new string will use the
default search string.

@dfn{Incremental searching} is similar to basic searching, but the
string is looked up while you are typing it, instead of waiting until
the entire search string has been specified.

@node Xref Commands, Window Commands, Searching Commands, Top
@chapter Selecting Cross References

We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up}
pointers which appear at the top of a node.  In addition to these
pointers, a node may contain other pointers which refer you to a
different node, perhaps in another Info file.  Such pointers are called
@dfn{cross references}, or @dfn{xrefs} for short.

@menu
* Parts of an Xref::            What a cross reference is made of.
* Selecting Xrefs::             Commands for selecting menu or note items.
@end menu

@node Parts of an Xref, Selecting Xrefs,  , Xref Commands
@section Parts of an Xref

Cross references have two major parts: the first part is called the
@dfn{label}; it is the name that you can use to refer to the cross
reference, and the second is the @dfn{target}; it is the full name of
the node that the cross reference points to.

The target is separated from the label by a colon @samp{:}; first the
label appears, and then the target.  For example, in the sample menu
cross reference below, the single colon separates the label from the
target.

@example
* Foo Label: Foo Target.        More information about Foo.
@end example

Note the @samp{.} which ends the name of the target.  The @samp{.} is
not part of the target; it serves only to let Info know where the target
name ends.

A shorthand way of specifying references allows two adjacent colons to
stand for a target name which is the same as the label name:

@example
* Foo Commands::                Commands pertaining to Foo.
@end example

In the above example, the name of the target is the same as the name of
the label, in this case @code{Foo Commands}.

You will normally see two types of cross reference while viewing nodes:
@dfn{menu} references, and @dfn{note} references.  Menu references
appear within a node's menu; they begin with a @samp{*} at the beginning
of a line, and continue with a label, a target, and a comment which
describes what the contents of the node pointed to contains.

Note references appear within the body of the node text; they begin with
@code{*Note}, and continue with a label and a target.

Like @samp{Next}, @samp{Prev}, and @samp{Up} pointers, cross references
can point to any valid node.  They are used to refer you to a place
where more detailed information can be found on a particular subject.
Here is a cross reference which points to a node within the Texinfo
documentation:  @xref{xref, , Writing an Xref, texinfo, the Texinfo
Manual}, for more information on creating your own texinfo cross
references.

@node Selecting Xrefs,  , Parts of an Xref, Xref Commands
@section Selecting Xrefs

The following table lists the Info commands which operate on menu items.

@table @asis
@item @code{1} (@code{menu-digit})
@itemx @code{2} @dots{} @code{9}
@cindex 1 @dots{} 9, in Info windows
@kindex 1 @dots{} 9, in Info windows
@findex menu-digit
Within an Info window, pressing a single digit, (such as @samp{1}),
selects that menu item, and places its node in the current window.
For convenience, there is one exception; pressing @samp{0} selects the
@emph{last} item in the node's menu.

@item @code{0} (@code{last-menu-item})
@kindex 0, in Info windows
@findex last-menu-item
Select the last item in the current node's menu.

@item @code{m} (@code{menu-item})
@kindex m
@findex menu-item
Reads the name of a menu item in the echo area and selects its node.
Completion is available while reading the menu label.

@item @code{M-x find-menu}
@findex find-menu
Move the cursor to the start of this node's menu.
@end table

This table lists the Info commands which operate on note cross references.

@table @asis
@item @code{f} (@code{xref-item})
@itemx @code{r}
@kindex f
@kindex r
@findex xref-item
Reads the name of a note cross reference in the echo area and selects
its node.  Completion is available while reading the cross reference
label.
@end table

Finally, the next few commands operate on menu or note references alike:

@table @asis
@item @code{TAB} (@code{move-to-next-xref})
@kindex TAB, in Info windows
@findex move-to-next-xref
Move the cursor to the start of the next nearest menu item or note
reference in this node.  You can then use @key{RET}
(@code{select-reference-this-line}) to select the menu or note reference.

@item @code{M-TAB} (@code{move-to-prev-xref})
@kindex M-TAB, in Info windows
@findex move-to-prev-xref
Move the cursor the start of the nearest previous menu item or note
reference in this node.

@item @code{RET} (@code{select-reference-this-line})
@kindex RET, in Info windows
@findex select-reference-this-line
Select the menu item or note reference appearing on this line.
@end table

@node Window Commands, Printing Nodes, Xref Commands, Top
@chapter Manipulating Multiple Windows
@cindex windows, manipulating

A @dfn{window} is a place to show the text of a node.  Windows have a
view area where the text of the node is displayed, and an associated
@dfn{mode line}, which briefly describes the node being viewed.

GNU Info supports multiple windows appearing in a single screen; each
window is separated from the next by its modeline.  At any time, there
is only one @dfn{active} window, that is, the window in which the cursor
appears.  There are commands available for creating windows, changing
the size of windows, selecting which window is active, and for deleting
windows.

@menu
* The Mode Line::               What appears in the mode line?
* Basic Windows::               Manipulating windows in Info.
* The Echo Area::               Used for displaying errors and reading input.
@end menu

@node The Mode Line, Basic Windows,  , Window Commands
@section The Mode Line

A @dfn{mode line} is a line of inverse video which appears at the bottom
of an Info window.  It describes the contents of the window just above
it; this information includes the name of the file and node appearing in
that window, the number of screen lines it takes to display the node,
and the percentage of text that is above the top of the window.  It can
also tell you if the indirect tags table for this Info file needs to be
updated, and whether or not the Info file was compressed when stored on
disk.

Here is a sample mode line for a window containing an uncompressed file
named @file{dir}, showing the node @samp{Top}.

@example
@group
-----Info: (dir)Top, 40 lines --Top---------------------------------------
            ^^   ^   ^^^        ^^
          (file)Node #lines    where
@end group
@end example

When a node comes from a file which is compressed on disk, this is
indicated in the mode line with two small @samp{z}'s.  In addition, if
the Info file containing the node has been split into subfiles, the name
of the subfile containing the node appears in the modeline as well:

@example
--zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z---------------
@end example 

When Info makes a node internally, such that there is no corresponding
info file on disk, the name of the node is surrounded by asterisks
(@samp{*}).  The name itself tells you what the contents of the window
are; the sample mode line below shows an internally constructed node
showing possible completions:

@example
-----Info: *Completions*, 7 lines --All-----------------------------------
@end example

@node Basic Windows, The Echo Area, The Mode Line, Window Commands
@section Window Commands

It can be convenient to view more than one node at a time.  To allow
this, Info can display more than one @dfn{window}.  Each window has its
own mode line (@pxref{The Mode Line}) and history of nodes viewed in that
window (@pxref{Node Commands, , @code{history-node}}).

@table @asis
@item @code{C-x o} (@code{next-window})
@cindex windows, selecting
@kindex C-x o
@findex next-window
Select the next window on the screen.  Note that the echo area can only be
selected if it is already in use, and you have left it temporarily.
Normally, @samp{C-x o} simply moves the cursor into the next window on
the screen, or if you are already within the last window, into the first
window on the screen.  Given a numeric argument, @samp{C-x o} moves over
that many windows.  A negative argument causes @samp{C-x o} to select
the previous window on the screen.

@item @code{M-x prev-window}
@findex prev-window
Select the previous window on the screen.  This is identical to
@samp{C-x o} with a negative argument.

@item @code{C-x 2} (@code{split-window})
@cindex windows, creating
@kindex C-x 2
@findex split-window
Split the current window into two windows, both showing the same node.
Each window is one half the size of the original window, and the cursor
remains in the original window.  The variable @code{automatic-tiling}
can cause all of the windows on the screen to be resized for you
automatically, please @pxref{Variables, , automatic-tiling} for more
information.

@item @code{C-x 0} (@code{delete-window})
@cindex windows, deleting
@kindex C-x 0
@findex delete-window
Delete the current window from the screen.  If you have made too many
windows and your screen appears cluttered, this is the way to get rid of
some of them.

@item @code{C-x 1} (@code{keep-one-window})
@kindex C-x 1
@findex keep-one-window
Delete all of the windows excepting the current one.

@item @code{ESC C-v} (@code{scroll-other-window})
@kindex ESC C-v, in Info windows
@findex scroll-other-window
Scroll the other window, in the same fashion that @samp{C-v} might
scroll the current window.  Given a negative argument, scroll the
"other" window backward.

@item @code{C-x ^} (@code{grow-window})
@kindex C-x ^
@findex grow-window
Grow (or shrink) the current window.  Given a numeric argument, grow
the current window that many lines; with a negative numeric argument,
shrink the window instead.

@item @code{C-x t} (@code{tile-windows})
@cindex tiling
@kindex C-x t
@findex tile-windows
Divide the available screen space among all of the visible windows.
Each window is given an equal portion of the screen in which to display
its contents.  The variable @code{automatic-tiling} can cause
@code{tile-windows} to be called when a window is created or deleted.
@xref{Variables, , @code{automatic-tiling}}.
@end table

@node The Echo Area,  , Basic Windows, Window Commands
@section The Echo Area
@cindex echo area

The @dfn{echo area} is a one line window which appears at the bottom of
the screen.  It is used to display informative or error messages, and to
read lines of input from you when that is necessary.  Almost all of the
commands available in the echo area are identical to their Emacs
counterparts, so please refer to that documentation for greater depth of
discussion on the concepts of editing a line of text.  The following
table briefly lists the commands that are available while input is being
read in the echo area:

@table @asis
@item @code{C-f} (@code{echo-area-forward})
@kindex C-f, in the echo area
@findex echo-area-forward
Move forward a character.

@item @code{C-b} (@code{echo-area-backward})
@kindex C-b, in the echo area
@findex echo-area-backward
Move backward a character.

@item @code{C-a} (@code{echo-area-beg-of-line})
@kindex C-a, in the echo area
@findex echo-area-beg-of-line
Move to the start of the input line.

@item @code{C-e} (@code{echo-area-end-of-line})
@kindex C-e, in the echo area
@findex echo-area-end-of-line
Move to the end of the input line.

@item @code{M-f} (@code{echo-area-forward-word})
@kindex M-f, in the echo area
@findex echo-area-forward-word
Move forward a word.

@item @code{M-b} (@code{echo-area-backward-word})
@kindex M-b, in the echo area
@findex echo-area-backward-word
Move backward a word.

@item @code{C-d} (@code{echo-area-delete})
@kindex C-d, in the echo area
@findex echo-area-delete
Delete the character under the cursor.

@item @code{DEL} (@code{echo-area-rubout})
@kindex DEL, in the echo area
@findex echo-area-rubout
Delete the character behind the cursor.

@item @code{C-g} (@code{echo-area-abort})
@kindex C-g, in the echo area
@findex echo-area-abort
Cancel or quit the current operation.  If completion is being read,
@samp{C-g} discards the text of the input line which does not match any
completion.  If the input line is empty, @samp{C-g} aborts the calling
function.

@item @code{RET} (@code{echo-area-newline})
@kindex RET, in the echo area
@findex echo-area-newline
Accept (or forces completion of) the current input line.

@item @code{C-q} (@code{echo-area-quoted-insert})
@kindex C-q, in the echo area
@findex echo-area-quoted-insert
Insert the next character verbatim.  This is how you can insert control
characters into a search string, for example.

@item @var{printing character} (@code{echo-area-insert})
@kindex printing characters, in the echo area
@findex echo-area-insert
Insert the character.

@item @code{M-TAB} (@code{echo-area-tab-insert})
@kindex M-TAB, in the echo area
@findex echo-area-tab-insert
Insert a TAB character.

@item @code{C-t} (@code{echo-area-transpose-chars})
@kindex C-t, in the echo area
@findex echo-area-transpose-chars
Transpose the characters at the cursor.
@end table

The next group of commands deal with @dfn{killing}, and @dfn{yanking}
text.  For an in depth discussion of killing and yanking,
@pxref{Killing, , Killing and Deleting, emacs, the GNU Emacs Manual}

@table @asis
@item @code{M-d} (@code{echo-area-kill-word})
@kindex M-d, in the echo area
@findex echo-area-kill-word
Kill the word following the cursor.

@item @code{M-DEL} (@code{echo-area-backward-kill-word})
@kindex M-DEL, in the echo area
@findex echo-area-backward-kill-word
Kill the word preceding the cursor.

@item @code{C-k} (@code{echo-area-kill-line})
@kindex C-k, in the echo area
@findex echo-area-kill-line
Kill the text from the cursor to the end of the line.

@item @code{C-x DEL} (@code{echo-area-backward-kill-line})
@kindex C-x DEL, in the echo area
@findex echo-area-backward-kill-line
Kill the text from the cursor to the beginning of the line.

@item @code{C-y} (@code{echo-area-yank})
@kindex C-y, in the echo area
@findex echo-area-yank
Yank back the contents of the last kill.

@item @code{M-y} (@code{echo-area-yank-pop})
@kindex M-y, in the echo area
@findex echo-area-yank-pop
Yank back a previous kill, removing the last yanked text first.
@end table

Sometimes when reading input in the echo area, the command that needed
input will only accept one of a list of several choices.  The choices
represent the @dfn{possible completions}, and you must respond with one
of them.  Since there are a limited number of responses you can make,
Info allows you to abbreviate what you type, only typing as much of the
response as is necessary to uniquely identify it.  In addition, you can
request Info to fill in as much of the response as is possible; this
is called @dfn{completion}.

The following commands are available when completing in the echo area:

@table @asis
@item @code{TAB} (@code{echo-area-complete})
@itemx @code{SPC}
@kindex TAB, in the echo area
@kindex SPC, in the echo area
@findex echo-area-complete
Insert as much of a completion as is possible.

@item @code{?} (@code{echo-area-possible-completions})
@kindex ?, in the echo area
@findex echo-area-possible-completions
Display a window containing a list of the possible completions of what
you have typed so far.  For example, if the available choices are:

@example
@group
bar
foliate
food
forget
@end group
@end example

@noindent
and you have typed an @samp{f}, followed by @samp{?}, the possible
completions would contain:

@example
@group
foliate
food
forget
@end group
@end example

@noindent
i.e., all of the choices which begin with @samp{f}.  Pressing @key{SPC}
or @key{TAB} would result in @samp{fo} appearing in the echo area, since
all of the choices which begin with @samp{f} continue with @samp{o}.
Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate}
appearing in the echo area, since that is the only choice which begins
with @samp{fol}.

@item @code{ESC C-v} (@code{echo-area-scroll-completions-window})
@kindex ESC C-v, in the echo area
@findex echo-area-scroll-completions-window
Scroll the completions window, if that is visible, or the "other"
window if not.
@end table

@node Printing Nodes, Miscellaneous Commands, Window Commands, Top
@chapter Printing Out Nodes
@cindex printing

You may wish to print out the contents of a node as  a quick reference
document for later use.  Info provides you with a command for doing
this.  In general, we recommend that you use @TeX{} to format the
document and print sections of it, by running @code{tex} on the Texinfo
source file.

@table @asis
@item @code{M-x print-node}
@findex print-node
@cindex INFO_PRINT_COMMAND, environment variable
Pipe the contents of the current node through the command in the
environment variable @code{INFO_PRINT_COMMAND}.  If the variable does not
exist, the node is simply piped to @code{lpr}.
@end table

@node Miscellaneous Commands, Variables, Printing Nodes, Top
@chapter Miscellaneous Commands

GNU Info contains several commands which self-document GNU Info:

@table @asis
@item @code{M-x describe-command}
@cindex functions, describing
@cindex commands, describing
@findex describe-command
Read the name of an Info command in the echo area and then display a
brief description of what that command does.

@item @code{M-x describe-key}
@cindex keys, describing
@findex describe-key
Read a key sequence in the echo area, and then display the name and
documentation of the Info command that the key sequence invokes.

@item @code{M-x describe-variable}
Read the name of a variable in the echo area and then display a brief
description of what the variable affects.

@item @code{M-x where-is}
@findex where-is
Read the name of an Info command in the echo area, and then display
a key sequence which can be typed in order to invoke that command.

@item @code{C-h} (@code{get-help-window})
@itemx @code{?}
@kindex C-h
@kindex ?, in Info windows
@findex get-help-window
Create (or Move into) the window displaying @code{*Help*}, and place
a node containing a quick reference card into it.  This window displays
the most concise information about GNU Info available.

@item @code{h} (@code{get-info-help-node})
@kindex h
@findex get-info-help-node
Try hard to visit the node @code{(info)Help}.  The Info file
@file{info.texi} distributed with GNU Info contains this node.  Of
course, the file must first be processed with @code{makeinfo}, and then
placed into the location of your Info directory.
@end table

Here are the commands for creating a numeric argument:

@table @asis
@item @code{C-u} (@code{universal-argument})
@cindex numeric arguments
@kindex C-u
@findex universal-argument
Start (or multiply by 4) the current numeric argument.  @samp{C-u} is
a good way to give a small numeric argument to cursor movement or
scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while
@samp{C-u C-u C-n} moves the cursor down 16 lines.

@item @code{M-1} (@code{add-digit-to-numeric-arg})
@itemx @code{M-2} @dots{} @code{M-9}
@kindex M-1 @dots{} M-9
@findex add-digit-to-numeric-arg
Add the digit value of the invoking key to the current numeric
argument.  Once Info is reading a numeric argument, you may just type
the digits of the argument, without the Meta prefix.  For example, you
might give @samp{C-l} a numeric argument of 32 by typing:

@example
@kbd{C-u 3 2 C-l}
@end example

@noindent
or

@example
@kbd{M-3 2 C-l}
@end example
@end table

@samp{C-g} is used to abort the reading of a multi-character key
sequence, to cancel lengthy operations (such as multi-file searches) and
to cancel reading input in the echo area.

@table @asis
@item @code{C-g} (@code{abort-key})
@cindex cancelling typeahead
@cindex cancelling the current operation
@kindex C-g, in Info windows
@findex abort-key
Cancel current operation.
@end table

The @samp{q} command of Info simply quits running Info.

@table @asis
@item @code{q} (@code{quit})
@cindex quitting
@kindex q
@findex quit
Exit GNU Info.
@end table

If the operating system tells GNU Info that the screen is 60 lines tall,
and it is actually only 40 lines tall, here is a way to tell Info that
the operating system is correct.

@table @asis
@item @code{M-x set-screen-height}
@findex set-screen-height
@cindex screen, changing the height of
Read a height value in the echo area and set the height of the
displayed screen to that value.
@end table

Finally, Info provides a convenient way to display footnotes which might
be associated with the current node that you are viewing:

@table @asis
@item @code{ESC C-f} (@code{show-footnotes})
@kindex ESC C-f
@findex show-footnotes
@cindex footnotes, displaying
Show the footnotes (if any) associated with the current node in another
window.  You can have Info automatically display the footnotes
associated with a node when the node is selected by setting the variable
@code{automatic-footnotes}.  @xref{Variables, , @code{automatic-footnotes}}.
@end table

@node Variables, GNU Info Global Index, Miscellaneous Commands, Top
@chapter Manipulating Variables

GNU Info contains several @dfn{variables} whose values are looked at by
various Info commands.  You can change the values of these variables,
and thus change the behavior of Info to more closely match your
environment and Info file reading manner.

@table @asis
@item @code{M-x set-variable}
@cindex variables, setting
@findex set-variable
Read the name of a variable, and the value for it, in the echo area and
then set the variable to that value.  Completion is available when
reading the variable name; often, completion is available when reading
the value to give to the variable, but that depends on the variable
itself.  If a variable does @emph{not} supply multiple choices to
complete over, it expects a numeric value.

@item @code{M-x describe-variable}
@cindex variables, describing
@findex describe-variable
Read the name of a variable in the echo area and then display a brief
description of what the variable affects.
@end table

Here is a list of the variables that you can set in Info.

@table @code
@item automatic-footnotes
@vindex automatic-footnotes
When set to @code{On}, footnotes appear and disappear automatically.
This variable is @code{On} by default.  When a node is selected, a
window containing the footnotes which appear in that node is created,
and the footnotes are displayed within the new window.  The window that
Info creates to contain the footnotes is called @samp{*Footnotes*}.  If
a node is selected which contains no footnotes, and a @samp{*Footnotes*}
window is on the screen, the @samp{*Footnotes*} window is deleted.
Footnote windows created in this fashion are not automatically tiled so
that they can use as little of the display as is possible.

@item automatic-tiling
@vindex automatic-tiling
When set to @code{On}, creating or deleting a window resizes other
windows.  This variable is @code{Off} by default.  Normally, typing
@samp{C-x 2} divides the current window into two equal parts.  When
@code{automatic-tiling} is set to @code{On}, all of the windows are
resized automatically, keeping an equal number of lines visible in each
window.  There are exceptions to the automatic tiling; specifically, the
windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not}
resized through automatic tiling; they remain their original size.

@item visible-bell
@vindex visible-bell
When set to @code{On}, GNU Info attempts to flash the screen instead of
ringing the bell.  This variable is @code{Off} by default.  Of course,
Info can only flash the screen if the terminal allows it; in the case
that the terminal does not allow it, the setting of this variable has no
effect.  However, you can make Info perform quietly by setting the
@code{errors-ring-bell} variable to @code{Off}.

@item errors-ring-bell
@vindex errors-ring-bell
When set to @code{On}, errors cause the bell to ring.  The default
setting of this variable is @code{On}.

@item gc-compressed-files
@vindex gc-compressed-files
When set to @code{On}, Info garbage collects files which had to be
uncompressed.  The default value of this variable is @code{Off}.
Whenever a node is visited in Info, the Info file containing that node
is read into core, and Info reads information about the tags and nodes
contained in that file.  Once the tags information is read by Info, it
is never forgotten.  However, the actual text of the nodes does not need
to remain in core unless a particular Info window needs it.  For
non-compressed files, the text of the nodes does not remain in core when
it is no longer in use.  But de-compressing a file can be a time
consuming operation, and so Info tries hard not to do it twice.
@code{gc-compressed-files} tells Info it is okay to garbage collect the
text of the nodes of a file which was compressed on disk.

@item show-index-match
@vindex show-index-match
When set to @code{On}, the portion of the matched search string is
highlighted in the message which explains where the matched search
string was found.  The default value of this variable is @code{On}.
When Info displays the location where an index match was found,
(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the
string that you had typed is highlighted by displaying it in the inverse
case from its surrounding characters.

@item scroll-behavior
@vindex scroll-behavior
Control what happens when forward scrolling is requested at the end of
a node, or when backward scrolling is requested at the beginning of a
node.  The default value for this variable is @code{Continuous}.  There
are three possible values for this variable:

@table @code
@item Continuous
Try to get the first item in this node's menu, or failing that, the
@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}.
This behavior is identical to using the @samp{]}
(@code{global-next-node}) and @samp{[} (@code{global-prev-node})
commands.

@item Next Only
Only try to get the @samp{Next} node.

@item Page Only
Simply give up, changing nothing.  If @code{scroll-behavior} is
@code{Page Only}, no scrolling command can change the node that is being
viewed.
@end table

@item scroll-step
@vindex scroll-step
The number of lines to scroll when the cursor moves out of the window.
Scrolling happens automatically if the cursor has moved out of the
visible portion of the node text when it is time to display.  Usually
the scrolling is done so as to put the cursor on the center line of the
current window.  However, if the variable @code{scroll-step} has a
nonzero value, Info attempts to scroll the node text by that many lines;
if that is enough to bring the cursor back into the window, that is what
is done.  The default value of this variable is 0, thus placing the
cursor (and the text it is attached to) in the center of the window.
Setting this variable to 1 causes a kind of "smooth scrolling" which
some people prefer.

@item ISO-Latin
@cindex ISO Latin characters
@vindex ISO-Latin
When set to @code{On}, Info accepts and displays ISO Latin characters.
By default, Info assumes an ASCII character set.  @code{ISO-Latin} tells
Info that it is running in an environment where the European standard
character set is in use, and allows you to input such characters to
Info, as well as display them.
@end table



@c the following is incomplete
@ignore
@c node Info for Sys Admins
@c chapter Info for System Administrators

This text describes some common ways of setting up an Info hierarchy
from scratch, and details the various options that are available when
installing Info.  This text is designed for the person who is installing
GNU Info on the system; although users may find the information present
in this section interesting, none of it is vital to understanding how to
use GNU Info.

@menu
* Setting the INFOPATH::        Where are my Info files kept?
* Editing the DIR node::        What goes in `DIR', and why?
* Storing Info files::          Alternate formats allow flexibility in setups.
* Using `localdir'::            Building DIR on the fly.
* Example setups::              Some common ways to organize Info files.
@end menu

@c node Setting the INFOPATH
@c section Setting the INFOPATH

Where are my Info files kept?

@c node Editing the DIR node
@c section Editing the DIR node

What goes in `DIR', and why?

@c node Storing Info files
@c section Storing Info files

Alternate formats allow flexibility in setups.

@c node Using `localdir'
@c section Using `localdir'

Building DIR on the fly.

@c node Example setups
@c section Example setups

Some common ways to organize Info files.
@end ignore

@node GNU Info Global Index,  , Variables, Top
@appendix Global Index

@printindex cp

@contents
@bye
