@comment %**start of header (This is for running Texinfo on a region.)
@setfilename rluser.info
@comment %**end of header (This is for running Texinfo on a region.)
@setchapternewpage odd

@ignore
This file documents the end user interface to the GNU command line
editing features.  It is to be an appendix to manuals for programs which
use these features.  There is a document entitled "readline.texinfo"
which contains both end-user and programmer documentation for the
GNU Readline Library.

Copyright (C) 1988-1999 Free Software Foundation, Inc.

Authored by Brian Fox and Chet Ramey.

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

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
GNU Copyright statement is available to the distributee, 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.
@end ignore

@comment If you are including this manual as an appendix, then set the
@comment variable readline-appendix.

@ifclear BashFeatures
@defcodeindex bt
@end ifclear

@node Command Line Editing
@chapter Command Line Editing

This chapter describes the basic features of the @sc{gnu}
command line editing interface.
@ifset BashFeatures
Command line editing is provided by the Readline library, which is
used by several different programs, including Bash.
@end ifset

@menu
* Introduction and Notation::	Notation used in this text.
* Readline Interaction::	The minimum set of commands for editing a line.
* Readline Init File::		Customizing Readline from a user's view.
* Bindable Readline Commands::	A description of most of the Readline commands
				available for binding
* Readline vi Mode::		A short description of how to make Readline
				behave like the vi editor.
@ifset BashFeatures
* Programmable Completion::	How to specify the possible completions for
				a specific command.
* Programmable Completion Builtins::	Builtin commands to specify how to
				complete arguments for a particular command.
@end ifset
@end menu

@node Introduction and Notation
@section Introduction to Line Editing

The following paragraphs describe the notation used to represent
keystrokes.

The text @key{C-k} is read as `Control-K' and describes the character
produced when the @key{k} key is pressed while the Control key
is depressed.

The text @key{M-k} is read as `Meta-K' and describes the character
produced when the Meta key (if you have one) is depressed, and the @key{k}
key is pressed.
The Meta key is labeled @key{ALT} on many keyboards.
On keyboards with two keys labeled @key{ALT} (usually to either side of
the space bar), the @key{ALT} on the left side is generally set to
work as a Meta key.
The @key{ALT} key on the right may also be configured to work as a
Meta key or may be configured as some other modifier, such as a
Compose key for typing accented characters.

If you do not have a Meta or @key{ALT} key, or another key working as
a Meta key, the identical keystroke can be generated by typing @key{ESC}
@i{first}, and then typing @key{k}.
Either process is known as @dfn{metafying} the @key{k} key.

The text @key{M-C-k} is read as `Meta-Control-k' and describes the
character produced by @dfn{metafying} @key{C-k}.

In addition, several keys have their own names.  Specifically,
@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all
stand for themselves when seen in this text, or in an init file
(@pxref{Readline Init File}).
If your keyboard lacks a @key{LFD} key, typing @key{C-j} will
produce the desired character.
The @key{RET} key may be labeled @key{Return} or @key{Enter} on
some keyboards.

@node Readline Interaction
@section Readline Interaction
@cindex interaction, readline

Often during an interactive session you type in a long line of text,
only to notice that the first word on the line is misspelled.  The
Readline library gives you a set of commands for manipulating the text
as you type it in, allowing you to just fix your typo, and not forcing
you to retype the majority of the line.  Using these editing commands,
you move the cursor to the place that needs correction, and delete or
insert the text of the corrections.  Then, when you are satisfied with
the line, you simply press @key{RETURN}.  You do not have to be at the
end of the line to press @key{RETURN}; the entire line is accepted
regardless of the location of the cursor within the line.

@menu
* Readline Bare Essentials::	The least you need to know about Readline.
* Readline Movement Commands::	Moving about the input line.
* Readline Killing Commands::	How to delete text, and how to get it back!
* Readline Arguments::		Giving numeric arguments to commands.
* Searching::			Searching through previous lines.
@end menu

@node Readline Bare Essentials
@subsection Readline Bare Essentials
@cindex notation, readline
@cindex command editing
@cindex editing command lines

In order to enter characters into the line, simply type them.  The typed
character appears where the cursor was, and then the cursor moves one
space to the right.  If you mistype a character, you can use your
erase character to back up and delete the mistyped character.

Sometimes you may mistype a character, and
not notice the error until you have typed several other characters.  In
that case, you can type @key{C-b} to move the cursor to the left, and then
correct your mistake.  Afterwards, you can move the cursor to the right
with @key{C-f}.

When you add text in the middle of a line, you will notice that characters
to the right of the cursor are `pushed over' to make room for the text
that you have inserted.  Likewise, when you delete text behind the cursor,
characters to the right of the cursor are `pulled back' to fill in the
blank space created by the removal of the text.  A list of the bare
essentials for editing the text of an input line follows.

@table @asis
@item @key{C-b}
Move back one character.
@item @key{C-f}
Move forward one character.
@item @key{DEL} or @key{Backspace}
Delete the character to the left of the cursor.
@item @key{C-d}
Delete the character underneath the cursor.
@item @w{Printing characters}
Insert the character into the line at the cursor.
@item @key{C-_} or @key{C-x C-u}
Undo the last editing command.  You can undo all the way back to an
empty line.
@end table

@noindent
(Depending on your configuration, the @key{Backspace} key be set to
delete the character to the left of the cursor and the @key{DEL} key set
to delete the character underneath the cursor, like @key{C-d}, rather
than the character to the left of the cursor.)

@node Readline Movement Commands
@subsection Readline Movement Commands


The above table describes the most basic keystrokes that you need
in order to do editing of the input line.  For your convenience, many
other commands have been added in addition to @key{C-b}, @key{C-f},
@key{C-d}, and @key{DEL}.  Here are some commands for moving more rapidly
about the line.

@table @key
@item C-a
Move to the start of the line.
@item C-e
Move to the end of the line.
@item M-f
Move forward a word, where a word is composed of letters and digits.
@item M-b
Move backward a word.
@item C-l
Clear the screen, reprinting the current line at the top.
@end table

Notice how @key{C-f} moves forward a character, while @key{M-f} moves
forward a word.  It is a loose convention that control keystrokes
operate on characters while meta keystrokes operate on words.

@node Readline Killing Commands
@subsection Readline Killing Commands

@cindex killing text
@cindex yanking text

@dfn{Killing} text means to delete the text from the line, but to save
it away for later use, usually by @dfn{yanking} (re-inserting)
it back into the line.
(`Cut' and `paste' are more recent jargon for `kill' and `yank'.)

If the description for a command says that it `kills' text, then you can
be sure that you can get the text back in a different (or the same)
place later.

When you use a kill command, the text is saved in a @dfn{kill-ring}.
Any number of consecutive kills save all of the killed text together, so
that when you yank it back, you get it all.  The kill
ring is not line specific; the text that you killed on a previously
typed line is available to be yanked back later, when you are typing
another line.
@cindex kill ring

Here is the list of commands for killing text.

@table @key
@item C-k
Kill the text from the current cursor position to the end of the line.

@item M-d
Kill from the cursor to the end of the current word, or, if between
words, to the end of the next word.
Word boundaries are the same as those used by @key{M-f}.

@item M-DEL
Kill from the cursor the start of the previous word, or, if between
words, to the start of the previous word.
Word boundaries are the same as those used by @key{M-b}.

@item C-w
Kill from the cursor to the previous whitespace.  This is different than
@key{M-DEL} because the word boundaries differ.

@end table

Here is how to @dfn{yank} the text back into the line.  Yanking
means to copy the most-recently-killed text from the kill buffer.

@table @key
@item C-y
Yank the most recently killed text back into the buffer at the cursor.

@item M-y
Rotate the kill-ring, and yank the new top.  You can only do this if
the prior command is @key{C-y} or @key{M-y}.
@end table

@node Readline Arguments
@subsection Readline Arguments

You can pass numeric arguments to Readline commands.  Sometimes the
argument acts as a repeat count, other times it is the @i{sign} of the
argument that is significant.  If you pass a negative argument to a
command which normally acts in a forward direction, that command will
act in a backward direction.  For example, to kill text back to the
start of the line, you might type @samp{M-- C-k}.

The general way to pass numeric arguments to a command is to type meta
digits before the command.  If the first `digit' typed is a minus
sign (@samp{-}), then the sign of the argument will be negative.  Once
you have typed one meta digit to get the argument started, you can type
the remainder of the digits, and then the command.  For example, to give
the @key{C-d} command an argument of 10, you could type @samp{M-1 0 C-d}.

@node Searching
@subsection Searching for Commands in the History

Readline provides commands for searching through the command history
@ifset BashFeatures
(@pxref{Bash History Facilities})
@end ifset
for lines containing a specified string.
There are two search modes:  @var{incremental} and @var{non-incremental}.

Incremental searches begin before the user has finished typing the
search string.
As each character of the search string is typed, Readline displays
the next entry from the history matching the string typed so far.
An incremental search requires only as many characters as needed to
find the desired history entry.
To search backward in the history for a particular string, type
@key{C-r}.  Typing @key{C-s} searches forward through the history.
The characters present in the value of the @code{isearch-terminators} variable
are used to terminate an incremental search.
If that variable has not been assigned a value, the @key{ESC} and
@key{C-J} characters will terminate an incremental search.
@key{C-g} will abort an incremental search and restore the original line.
When the search is terminated, the history entry containing the
search string becomes the current line.

To find other matching entries in the history list, type @key{C-r} or
@key{C-s} as appropriate.
This will search backward or forward in the history for the next
entry matching the search string typed so far.
Any other key sequence bound to a Readline command will terminate
the search and execute that command.
For instance, a @key{RET} will terminate the search and accept
the line, thereby executing the command from the history list.

Non-incremental searches read the entire search string before starting
to search for matching history lines.  The search string may be
typed by the user or be part of the contents of the current line.

@node Readline Init File
@section Readline Init File
@cindex initialization file, readline

Although the Readline library comes with a set of Emacs-like
keybindings installed by default, it is possible to use a different set
of keybindings.
Any user can customize programs that use Readline by putting
commands in an @dfn{inputrc} file, conventionally in his home directory.
The name of this
@ifset BashFeatures
file is taken from the value of the shell variable @code{INPUTRC}.  If
@end ifset
@ifclear BashFeatures
file is taken from the value of the environment variable @code{INPUTRC}.  If
@end ifclear
that variable is unset, the default is @file{~/.inputrc}.

When a program which uses the Readline library starts up, the
init file is read, and the key bindings are set.

In addition, the @code{C-x C-r} command re-reads this init file, thus
incorporating any changes that you might have made to it.

@menu
* Readline Init File Syntax::	Syntax for the commands in the inputrc file.

* Conditional Init Constructs::	Conditional key bindings in the inputrc file.

* Sample Init File::		An example inputrc file.
@end menu

@node Readline Init File Syntax
@subsection Readline Init File Syntax

There are only a few basic constructs allowed in the
Readline init file.  Blank lines are ignored.
Lines beginning with a @samp{#} are comments.
Lines beginning with a @samp{$} indicate conditional
constructs (@pxref{Conditional Init Constructs}).  Other lines
denote variable settings and key bindings.

@table @asis
@item Variable Settings
You can modify the run-time behavior of Readline by
altering the values of variables in Readline
using the @code{set} command within the init file.  Here is how to
change from the default Emacs-like key binding to use
@code{vi} line editing commands:

@example
set editing-mode vi
@end example

@ifset BashFeatures
The @w{@code{bind -V}} command lists the current Readline variable names
and values.  @xref{Bash Builtins}.
@end ifset

A great deal of run-time behavior is changeable with the following
variables.

@table @code

@item bell-style
@vindex bell-style
Controls what happens when Readline wants to ring the terminal bell.
If set to @samp{none}, Readline never rings the bell.  If set to
@samp{visible}, Readline uses a visible bell if one is available.
If set to @samp{audible} (the default), Readline attempts to ring
the terminal's bell.

@item comment-begin
@vindex comment-begin
The string to insert at the beginning of the line when the
@code{insert-comment} command is executed.  The default value
is @code{"#"}.

@item completion-ignore-case
If set to @samp{on}, Readline performs filename matching and completion
in a case-insensitive fashion.
The default value is @samp{off}.

@item completion-query-items
@vindex completion-query-items
The number of possible completions that determines when the user is
asked whether he wants to see the list of possibilities.  If the
number of possible completions is greater than this value,
Readline will ask the user whether or not he wishes to view
them; otherwise, they are simply listed.  The default limit is
@code{100}.

@item convert-meta
@vindex convert-meta
If set to @samp{on}, Readline will convert characters with the
eighth bit set to an ASCII key sequence by stripping the eighth
bit and prefixing an @key{ESC} character, converting them to a
meta-prefixed key sequence.  The default value is @samp{on}.

@item disable-completion
@vindex disable-completion
If set to @samp{On}, Readline will inhibit word completion.
Completion  characters will be inserted into the line as if they had
been mapped to @code{self-insert}.  The default is @samp{off}.

@item editing-mode
@vindex editing-mode
The @code{editing-mode} variable controls which default set of
key bindings is used.  By default, Readline starts up in Emacs editing
mode, where the keystrokes are most similar to Emacs.  This variable can be
set to either @samp{emacs} or @samp{vi}.

@item enable-keypad
@vindex enable-keypad
When set to @samp{on}, Readline will try to enable the application
keypad when it is called.  Some systems need this to enable the
arrow keys.  The default is @samp{off}.

@item expand-tilde
@vindex expand-tilde
If set to @samp{on}, tilde expansion is performed when Readline
attempts word completion.  The default is @samp{off}.

@item horizontal-scroll-mode
@vindex horizontal-scroll-mode
This variable can be set to either @samp{on} or @samp{off}.  Setting it
to @samp{on} means that the text of the lines being edited will scroll
horizontally on a single screen line when they are longer than the width
of the screen, instead of wrapping onto a new screen line.  By default,
this variable is set to @samp{off}.

@item input-meta
@vindex input-meta
@vindex meta-flag
If set to @samp{on}, Readline will enable eight-bit input (it
will not strip the eighth bit from the characters it reads),
regardless of what the terminal claims it can support.  The
default value is @samp{off}.  The name @code{meta-flag} is a
synonym for this variable.

@item isearch-terminators
@vindex isearch-terminators
The string of characters that should terminate an incremental search without
subsequently executing the character as a command (@pxref{Searching}).
If this variable has not been given a value, the characters @key{ESC} and
@key{C-J} will terminate an incremental search.

@item keymap
@vindex keymap
Sets Readline's idea of the current keymap for key binding commands.
Acceptable @code{keymap} names are
@code{emacs},
@code{emacs-standard},
@code{emacs-meta},
@code{emacs-ctlx},
@code{vi},
@code{vi-command}, and
@code{vi-insert}.
@code{vi} is equivalent to @code{vi-command}; @code{emacs} is
equivalent to @code{emacs-standard}.  The default value is @code{emacs}.
The value of the @code{editing-mode} variable also affects the
default keymap.

@item mark-directories
If set to @samp{on}, completed directory names have a slash
appended.  The default is @samp{on}.

@item mark-modified-lines
@vindex mark-modified-lines
This variable, when set to @samp{on}, causes Readline to display an
asterisk (@samp{*}) at the start of history lines which have been modified.
This variable is @samp{off} by default.

@item output-meta
@vindex output-meta
If set to @samp{on}, Readline will display characters with the
eighth bit set directly rather than as a meta-prefixed escape
sequence.  The default is @samp{off}.

@item print-completions-horizontally
If set to @samp{on}, Readline will display completions with matches
sorted horizontally in alphabetical order, rather than down the screen.
The default is @samp{off}.

@item show-all-if-ambiguous
@vindex show-all-if-ambiguous
This alters the default behavior of the completion functions.  If
set to @samp{on}, 
words which have more than one possible completion cause the
matches to be listed immediately instead of ringing the bell.
The default value is @samp{off}.

@item visible-stats
@vindex visible-stats
If set to @samp{on}, a character denoting a file's type
is appended to the filename when listing possible
completions.  The default is @samp{off}.

@end table

@item Key Bindings
The syntax for controlling key bindings in the init file is
simple.  First you need to find the name of the command that you
want to change.  The following sections contain tables of the command
name, the default keybinding, if any, and a short description of what
the command does.

Once you know the name of the command, simply place the name of the key
you wish to bind the command to, a colon, and then the name of the
command on a line in the init file.  The name of the key
can be expressed in different ways, depending on which is most
comfortable for you.

@ifset BashFeatures
The @w{@code{bind -p}} command displays Readline function names and
bindings in a format that can put directly into an initialization file.
@xref{Bash Builtins}.
@end ifset

@table @asis
@item @w{@var{keyname}: @var{function-name} or @var{macro}}
@var{keyname} is the name of a key spelled out in English.  For example:
@example
Control-u: universal-argument
Meta-Rubout: backward-kill-word
Control-o: "> output"
@end example

In the above example, @key{C-u} is bound to the function
@code{universal-argument}, and @key{C-o} is bound to run the macro
expressed on the right hand side (that is, to insert the text
@samp{> output} into the line).

@item @w{"@var{keyseq}": @var{function-name} or @var{macro}}
@var{keyseq} differs from @var{keyname} above in that strings
denoting an entire key sequence can be specified, by placing
the key sequence in double quotes.  Some @sc{gnu} Emacs style key
escapes can be used, as in the following example, but the
special character names are not recognized.

@example
"\C-u": universal-argument
"\C-x\C-r": re-read-init-file
"\e[11~": "Function Key 1"
@end example

In the above example, @key{C-u} is bound to the function
@code{universal-argument} (just as it was in the first example),
@samp{@key{C-x} @key{C-r}} is bound to the function @code{re-read-init-file},
and @samp{@key{ESC} @key{[} @key{1} @key{1} @key{~}} is bound to insert
the text @samp{Function Key 1}.

@end table

The following @sc{gnu} Emacs style escape sequences are available when
specifying key sequences:

@table @code
@item @kbd{\C-}
control prefix
@item @kbd{\M-}
meta prefix
@item @kbd{\e}
an escape character
@item @kbd{\\}
backslash
@item @kbd{\"}
@key{"}, a double quotation mark
@item @kbd{\'}
@key{'}, a single quote or apostrophe
@end table

In addition to the @sc{gnu} Emacs style escape sequences, a second
set of backslash escapes is available:

@table @code
@item \a
alert (bell)
@item \b
backspace
@item \d
delete
@item \f
form feed
@item \n
newline
@item \r
carriage return
@item \t
horizontal tab
@item \v
vertical tab
@item \@var{nnn}
the character whose @code{ASCII} code is the octal value @var{nnn}
(one to three digits)
@item \x@var{nnn}
the character whose @code{ASCII} code is the hexadecimal value @var{nnn}
(one to three digits)
@end table

When entering the text of a macro, single or double quotes must
be used to indicate a macro definition.
Unquoted text is assumed to be a function name.
In the macro body, the backslash escapes described above are expanded.
Backslash will quote any other character in the macro text,
including @samp{"} and @samp{'}.
For example, the following binding will make @samp{C-x \}
insert a single @samp{\} into the line:
@example
"\C-x\\": "\\"
@end example

@end table

@node Conditional Init Constructs
@subsection Conditional Init Constructs

Readline implements a facility similar in spirit to the conditional
compilation features of the C preprocessor which allows key
bindings and variable settings to be performed as the result
of tests.  There are four parser directives used.

@table @code
@item $if
The @code{$if} construct allows bindings to be made based on the
editing mode, the terminal being used, or the application using
Readline.  The text of the test extends to the end of the line;
no characters are required to isolate it.

@table @code
@item mode
The @code{mode=} form of the @code{$if} directive is used to test
whether Readline is in @code{emacs} or @code{vi} mode.
This may be used in conjunction
with the @samp{set keymap} command, for instance, to set bindings in
the @code{emacs-standard} and @code{emacs-ctlx} keymaps only if
Readline is starting out in @code{emacs} mode.

@item term
The @code{term=} form may be used to include terminal-specific
key bindings, perhaps to bind the key sequences output by the
terminal's function keys.  The word on the right side of the
@samp{=} is tested against both the full name of the terminal and
the portion of the terminal name before the first @samp{-}.  This
allows @code{sun} to match both @code{sun} and @code{sun-cmd},
for instance.

@item application
The @var{application} construct is used to include
application-specific settings.  Each program using the Readline
library sets the @var{application name}, and you can test for it. 
This could be used to bind key sequences to functions useful for
a specific program.  For instance, the following command adds a
key sequence that quotes the current or previous word in Bash:
@example
$if Bash
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
$endif
@end example
@end table

@item $endif
This command, as seen in the previous example, terminates an
@code{$if} command.

@item $else
Commands in this branch of the @code{$if} directive are executed if
the test fails.

@item $include
This directive takes a single filename as an argument and reads commands
and bindings from that file.
@example
$include /etc/inputrc
@end example
@end table

@node Sample Init File
@subsection Sample Init File

Here is an example of an inputrc file.  This illustrates key
binding, variable assignment, and conditional syntax.

@example
@page
# This file controls the behaviour of line input editing for
# programs that use the Gnu Readline library.  Existing programs
# include FTP, Bash, and Gdb.
#
# You can re-read the inputrc file with C-x C-r.
# Lines beginning with '#' are comments.
#
# First, include any systemwide bindings and variable assignments from
# /etc/Inputrc
$include /etc/Inputrc

#
# Set various bindings for emacs mode.

set editing-mode emacs 

$if mode=emacs

Meta-Control-h:	backward-kill-word	Text after the function name is ignored

#
# Arrow keys in keypad mode
#
#"\M-OD":        backward-char
#"\M-OC":        forward-char
#"\M-OA":        previous-history
#"\M-OB":        next-history
#
# Arrow keys in ANSI mode
#
"\M-[D":        backward-char
"\M-[C":        forward-char
"\M-[A":        previous-history
"\M-[B":        next-history
#
# Arrow keys in 8 bit keypad mode
#
#"\M-\C-OD":       backward-char
#"\M-\C-OC":       forward-char
#"\M-\C-OA":       previous-history
#"\M-\C-OB":       next-history
#
# Arrow keys in 8 bit ANSI mode
#
#"\M-\C-[D":       backward-char
#"\M-\C-[C":       forward-char
#"\M-\C-[A":       previous-history
#"\M-\C-[B":       next-history

C-q: quoted-insert

$endif

# An old-style binding.  This happens to be the default.
TAB: complete

# Macros that are convenient for shell interaction
$if Bash
# edit the path
"\C-xp": "PATH=$@{PATH@}\e\C-e\C-a\ef\C-f"
# prepare to type a quoted word -- insert open and close
# double quotes and move to just after the open quote
"\C-x\"": "\"\"\C-b"
# insert a backslash (testing backslash escapes in sequences
# and macros)
"\C-x\\": "\\"
# Quote the current or previous word
"\C-xq": "\eb\"\ef\""
# Add a binding to refresh the line, which is unbound
"\C-xr": redraw-current-line
# Edit variable on current line.
"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
$endif

# use a visible bell if one is available
set bell-style visible

# don't strip characters to 7 bits when reading
set input-meta on

# allow iso-latin1 characters to be inserted rather than converted to
# prefix-meta sequences
set convert-meta off

# display characters with the eighth bit set directly rather than
# as meta-prefixed characters
set output-meta on

# if there are more than 150 possible completions for a word, ask the
# user if he wants to see all of them
set completion-query-items 150

# For FTP
$if Ftp
"\C-xg": "get \M-?"
"\C-xt": "put \M-?"
"\M-.": yank-last-arg
$endif
@end example

@node Bindable Readline Commands
@section Bindable Readline Commands

@menu
* Commands For Moving::		Moving about the line.
* Commands For History::	Getting at previous lines.
* Commands For Text::		Commands for changing text.
* Commands For Killing::	Commands for killing and yanking.
* Numeric Arguments::		Specifying numeric arguments, repeat counts.
* Commands For Completion::	Getting Readline to do the typing for you.
* Keyboard Macros::		Saving and re-executing typed characters
* Miscellaneous Commands::	Other miscellaneous commands.
@end menu

This section describes Readline commands that may be bound to key
sequences.
@ifset BashFeatures
You can list your key bindings by executing
@w{@code{bind -P}} or, for a more terse format, suitable for an
@var{inputrc} file, @w{@code{bind -p}}.  (@xref{Bash Builtins}.)
@end ifset

Command names without an accompanying key sequence are unbound by default.
In the following descriptions, @var{point} refers to the current cursor
position, and @var{mark} refers to a cursor position saved by the
@code{set-mark} command.
The text between the point and mark is referred to as the @var{region}.

@node Commands For Moving
@subsection Commands For Moving
@ftable @code
@item beginning-of-line (C-a)
Move to the start of the current line.

@item end-of-line (C-e)
Move to the end of the line.

@item forward-char (C-f)
Move forward a character.

@item backward-char (C-b)
Move back a character.

@item forward-word (M-f)
Move forward to the end of the next word.  Words are composed of
letters and digits.

@item backward-word (M-b)
Move back to the start of the current or previous word.  Words are
composed of letters and digits.

@item clear-screen (C-l)
Clear the screen and redraw the current line,
leaving the current line at the top of the screen.

@item redraw-current-line ()
Refresh the current line.  By default, this is unbound.

@end ftable

@node Commands For History
@subsection Commands For Manipulating The History

@ftable @code
@item accept-line (Newline, Return)
@ifset BashFeatures
Accept the line regardless of where the cursor is.  If this line is
non-empty, add it to the history list according to the setting of
the @code{HISTCONTROL} and @code{HISTIGNORE} variables.
If this line was a history line, then restore the history line to its
original state.
@end ifset
@ifclear BashFeatures
Accept the line regardless of where the cursor is.  If this line is
non-empty, add it to the history list.  If this line was a history
line, then restore the history line to its original state.
@end ifclear

@item previous-history (C-p)
Move `up' through the history list.

@item next-history (C-n)
Move `down' through the history list.

@item beginning-of-history (M-<)
Move to the first line in the history.

@item end-of-history (M->)
Move to the end of the input history, i.e., the line currently
being entered.

@item reverse-search-history (C-r)
Search backward starting at the current line and moving `up' through
the history as necessary.  This is an incremental search.

@item forward-search-history (C-s)
Search forward starting at the current line and moving `down' through
the the history as necessary.  This is an incremental search.

@item non-incremental-reverse-search-history (M-p)
Search backward starting at the current line and moving `up'
through the history as necessary using a non-incremental search
for a string supplied by the user.

@item non-incremental-forward-search-history (M-n)
Search forward starting at the current line and moving `down'
through the the history as necessary using a non-incremental search
for a string supplied by the user.

@item history-search-forward ()
Search forward through the history for the string of characters
between the start of the current line and the point.
This is a non-incremental search.
By default, this command is unbound.

@item history-search-backward ()
Search backward through the history for the string of characters
between the start of the current line and the point.  This
is a non-incremental search.  By default, this command is unbound.

@item yank-nth-arg (M-C-y)
Insert the first argument to the previous command (usually
the second word on the previous line).  With an argument @var{n},
insert the @var{n}th word from the previous command (the words
in the previous command begin with word 0).  A negative argument
inserts the @var{n}th word from the end of the previous command.

@item yank-last-arg (M-., M-_)
Insert last argument to the previous command (the last word of the
previous history entry).  With an
argument, behave exactly like @code{yank-nth-arg}.
Successive calls to @code{yank-last-arg} move back through the history
list, inserting the last argument of each line in turn.

@end ftable

@node Commands For Text
@subsection Commands For Changing Text

@ftable @code
@item delete-char (C-d)
Delete the character under the cursor.  If the cursor is at the
beginning of the line, there are no characters in the line, and
the last character typed was not bound to @code{delete-char}, then
return @code{EOF}.

@item backward-delete-char (Rubout)
Delete the character behind the cursor.  A numeric argument means
to kill the characters instead of deleting them.

@item forward-backward-delete-char ()
Delete the character under the cursor, unless the cursor is at the
end of the line, in which case the character behind the cursor is
deleted.  By default, this is not bound to a key.

@item quoted-insert (C-q, C-v)
Add the next character typed to the line verbatim.  This is
how to insert key sequences like @key{C-q}, for example.

@ifclear BashFeatures
@item tab-insert (M-TAB)
Insert a tab character.
@end ifclear

@item self-insert (a, b, A, 1, !, ...)
Insert yourself.

@item transpose-chars (C-t)
Drag the character before the cursor forward over
the character at the cursor, moving the
cursor forward as well.  If the insertion point
is at the end of the line, then this
transposes the last two characters of the line.
Negative arguments have no effect.

@item transpose-words (M-t)
Drag the word before point past the word after point,
moving point past that word as well.

@item upcase-word (M-u)
Uppercase the current (or following) word.  With a negative argument,
uppercase the previous word, but do not move the cursor.

@item downcase-word (M-l)
Lowercase the current (or following) word.  With a negative argument,
lowercase the previous word, but do not move the cursor.

@item capitalize-word (M-c)
Capitalize the current (or following) word.  With a negative argument,
capitalize the previous word, but do not move the cursor.

@end ftable

@node Commands For Killing
@subsection Killing And Yanking

@ftable @code

@item kill-line (C-k)
Kill the text from point to the end of the line.

@item backward-kill-line (C-x Rubout)
Kill backward to the beginning of the line.

@item unix-line-discard (C-u)
Kill backward from the cursor to the beginning of the current line.

@item kill-whole-line ()
Kill all characters on the current line, no matter point is.
By default, this is unbound.

@item kill-word (M-d)
Kill from point to the end of the current word, or if between
words, to the end of the next word.
Word boundaries are the same as @code{forward-word}.

@item backward-kill-word (M-DEL)
Kill the word behind point.
Word boundaries are the same as @code{backward-word}.

@item unix-word-rubout (C-w)
Kill the word behind point, using white space as a word boundary.
The killed text is saved on the kill-ring.

@item delete-horizontal-space ()
Delete all spaces and tabs around point.  By default, this is unbound.

@item kill-region ()
Kill the text in the current region.
By default, this command is unbound.

@item copy-region-as-kill ()
Copy the text in the region to the kill buffer, so it can be yanked
right away.  By default, this command is unbound.

@item copy-backward-word ()
Copy the word before point to the kill buffer.
The word boundaries are the same as @code{backward-word}.
By default, this command is unbound.

@item copy-forward-word ()
Copy the word following point to the kill buffer.
The word boundaries are the same as @code{forward-word}.
By default, this command is unbound.

@item yank (C-y)
Yank the top of the kill ring into the buffer at the current
cursor position.

@item yank-pop (M-y)
Rotate the kill-ring, and yank the new top.  You can only do this if
the prior command is yank or yank-pop.
@end ftable

@node Numeric Arguments
@subsection Specifying Numeric Arguments
@ftable @code

@item digit-argument (M-0, M-1, ... M--)
Add this digit to the argument already accumulating, or start a new
argument.  @key{M--} starts a negative argument.

@item universal-argument ()
This is another way to specify an argument.
If this command is followed by one or more digits, optionally with a
leading minus sign, those digits define the argument.
If the command is followed by digits, executing @code{universal-argument}
again ends the numeric argument, but is otherwise ignored.
As a special case, if this command is immediately followed by a
character that is neither a digit or minus sign, the argument count
for the next command is multiplied by four.
The argument count is initially one, so executing this function the
first time makes the argument count four, a second time makes the
argument count sixteen, and so on.
By default, this is not bound to a key.
@end ftable

@node Commands For Completion
@subsection Letting Readline Type For You

@ftable @code
@item complete (TAB)
Attempt to do completion on the text before the cursor.  This is
application-specific.  Generally, if you are typing a filename
argument, you can do filename completion; if you are typing a command,
you can do command completion; if you are typing in a symbol to GDB, you
can do symbol name completion; if you are typing in a variable to Bash,
you can do variable name completion, and so on.
@ifset BashFeatures
Bash attempts completion treating the text as a variable (if the
text begins with @samp{$}), username (if the text begins with
@samp{~}), hostname (if the text begins with @samp{@@}), or
command (including aliases and functions) in turn.  If none 
of these produces a match, filename completion is attempted.
@end ifset

@item possible-completions (M-?)
List the possible completions of the text before the cursor.

@item insert-completions (M-*)
Insert all completions of the text before point that would have
been generated by @code{possible-completions}.

@item menu-complete ()
Similar to @code{complete}, but replaces the word to be completed
with a single match from the list of possible completions.
Repeated execution of @code{menu-complete} steps through the list
of possible completions, inserting each match in turn.
At the end of the list of completions, the bell is rung and the
original text is restored.
An argument of @var{n} moves @var{n} positions forward in the list
of matches; a negative argument may be used to move backward
through the list.
This command is intended to be bound to @code{TAB}, but is unbound
by default.

@item delete-char-or-list ()
Deletes the character under the cursor if not at the beginning or
end of the line (like @code{delete-char}).
If at the end of the line, behaves identically to
@code{possible-completions}.
This command is unbound by default.

@ifset BashFeatures
@item complete-filename (M-/)
Attempt filename completion on the text before point.

@item possible-filename-completions (C-x /)
List the possible completions of the text before point,
treating it as a filename.

@item complete-username (M-~)
Attempt completion on the text before point, treating
it as a username.

@item possible-username-completions (C-x ~)
List the possible completions of the text before point,
treating it as a username.

@item complete-variable (M-$)
Attempt completion on the text before point, treating
it as a shell variable.

@item possible-variable-completions (C-x $)
List the possible completions of the text before point,
treating it as a shell variable.

@item complete-hostname (M-@@)
Attempt completion on the text before point, treating
it as a hostname.

@item possible-hostname-completions (C-x @@)
List the possible completions of the text before point,
treating it as a hostname.

@item complete-command (M-!)
Attempt completion on the text before point, treating
it as a command name.  Command completion attempts to
match the text against aliases, reserved words, shell
functions, shell builtins, and finally executable filenames,
in that order.

@item possible-command-completions (C-x !)
List the possible completions of the text before point,
treating it as a command name.

@item dynamic-complete-history (M-TAB)
Attempt completion on the text before point, comparing
the text against lines from the history list for possible
completion matches.

@item complete-into-braces (M-@{)
Perform filename completion and insert the list of possible completions
enclosed within braces so the list is available to the shell
(@pxref{Brace Expansion}).

@end ifset
@end ftable

@node Keyboard Macros
@subsection Keyboard Macros
@ftable @code

@item start-kbd-macro (C-x ()
Begin saving the characters typed into the current keyboard macro.

@item end-kbd-macro (C-x ))
Stop saving the characters typed into the current keyboard macro
and save the definition.

@item call-last-kbd-macro (C-x e)
Re-execute the last keyboard macro defined, by making the characters
in the macro appear as if typed at the keyboard.

@end ftable

@node Miscellaneous Commands
@subsection Some Miscellaneous Commands
@ftable @code

@item re-read-init-file (C-x C-r)
Read in the contents of the @var{inputrc} file, and incorporate
any bindings or variable assignments found there.

@item abort (C-g)
Abort the current editing command and
ring the terminal's bell (subject to the setting of
@code{bell-style}).

@item do-uppercase-version (M-a, M-b, M-@var{x}, @dots{})
If the metafied character @var{x} is lowercase, run the command
that is bound to the corresponding uppercase character.

@item prefix-meta (ESC)
Make the next character typed be metafied.  This is for keyboards
without a meta key.  Typing @samp{ESC f} is equivalent to typing
@samp{M-f}.

@item undo (C-_, C-x C-u)
Incremental undo, separately remembered for each line.

@item revert-line (M-r)
Undo all changes made to this line.  This is like executing the @code{undo}
command enough times to get back to the beginning.

@ifset BashFeatures
@item tilde-expand (M-&)
@end ifset
@ifclear BashFeatures
@item tilde-expand (M-~)
@end ifclear
Perform tilde expansion on the current word.

@item set-mark (C-@@)
Set the mark to the current point.  If a
numeric argument is supplied, the mark is set to that position.

@item exchange-point-and-mark (C-x C-x)
Swap the point with the mark.  The current cursor position is set to
the saved position, and the old cursor position is saved as the mark.

@item character-search (C-])
A character is read and point is moved to the next occurrence of that
character.  A negative count searches for previous occurrences.

@item character-search-backward (M-C-])
A character is read and point is moved to the previous occurrence
of that character.  A negative count searches for subsequent
occurrences.

@item insert-comment (M-#)
The value of the @code{comment-begin}
variable is inserted at the beginning of the current line,
and the line is accepted as if a newline had been typed.
@ifset BashFeatures
The default value of @code{comment-begin} causes this command
to make the current line a shell comment.
@end ifset

@item dump-functions ()
Print all of the functions and their key bindings to the
Readline output stream.  If a numeric argument is supplied,
the output is formatted in such a way that it can be made part
of an @var{inputrc} file.  This command is unbound by default.

@item dump-variables ()
Print all of the settable variables and their values to the
Readline output stream.  If a numeric argument is supplied,
the output is formatted in such a way that it can be made part
of an @var{inputrc} file.  This command is unbound by default.

@item dump-macros ()
Print all of the Readline key sequences bound to macros and the
strings they ouput.  If a numeric argument is supplied,
the output is formatted in such a way that it can be made part
of an @var{inputrc} file.  This command is unbound by default.

@ifset BashFeatures
@item glob-expand-word (C-x *)
The word before point is treated as a pattern for pathname expansion,
and the list of matching file names is inserted, replacing the word.

@item glob-list-expansions (C-x g)
The list of expansions that would have been generated by
@code{glob-expand-word} is displayed, and the line is redrawn.

@item display-shell-version (C-x C-v)
Display version information about the current instance of Bash.

@item shell-expand-line (M-C-e)
Expand the line as the shell does.
This performs alias and history expansion as well as all of the shell
word expansions (@pxref{Shell Expansions}).

@item history-expand-line (M-^)
Perform history expansion on the current line.

@item magic-space ()
Perform history expansion on the current line and insert a space
(@pxref{History Interaction}).

@item alias-expand-line ()
Perform alias expansion on the current line (@pxref{Aliases}).

@item history-and-alias-expand-line ()
Perform history and alias expansion on the current line.

@item insert-last-argument (M-., M-_)
A synonym for @code{yank-last-arg}.

@item operate-and-get-next (C-o)
Accept the current line for execution and fetch the next line
relative to the current line from the history for editing.  Any
argument is ignored.

@item emacs-editing-mode (C-e)
When in @code{vi} editing mode, this causes a switch back to
@code{emacs} editing mode, as if the command @samp{set -o emacs} had
been executed.

@end ifset

@end ftable

@node Readline vi Mode
@section Readline vi Mode

While the Readline library does not have a full set of @code{vi}
editing functions, it does contain enough to allow simple editing
of the line.  The Readline @code{vi} mode behaves as specified in
the @sc{POSIX} 1003.2 standard.

@ifset BashFeatures
In order to switch interactively between @code{emacs} and @code{vi}
editing modes, use the @samp{set -o emacs} and @samp{set -o vi}
commands (@pxref{The Set Builtin}).
@end ifset
@ifclear BashFeatures
In order to switch interactively between @code{emacs} and @code{vi}
editing modes, use the command M-C-j (toggle-editing-mode).
@end ifclear
The Readline default is @code{emacs} mode.

When you enter a line in @code{vi} mode, you are already placed in
`insertion' mode, as if you had typed an @samp{i}.  Pressing @key{ESC}
switches you into `command' mode, where you can edit the text of the
line with the standard @code{vi} movement keys, move to previous
history lines with @samp{k} and subsequent lines with @samp{j}, and
so forth.

@ifset BashFeatures
@node Programmable Completion
@section Programmable Completion
@cindex programmable completion

When word completion is attempted for an argument to a command for
which a completion specification (a @var{compspec}) has been defined
using the @code{complete} builtin (@pxref{Programmable Completion Builtins}),
the programmable completion facilities are invoked. 

First, the command name is identified.
If a compspec has been defined for that command, the
compspec is used to generate the list of possible completions for the word.
If the command word is a full pathname, a compspec for the full
pathname is searched for first.
If no compspec is found for the full pathname, an attempt is made to
find a compspec for the portion following the final slash.

Once a compspec has been found, it is used to generate the list of
matching words.
If a compspec is not found, the default Bash completion
described above (@pxref{Commands For Completion}) is performed.

First, the actions specified by the compspec are used.
Only matches which are prefixed by the word being completed are
returned.
When the @samp{-f} or @samp{-d} option is used for filename or
directory name completion, the shell variable @code{FIGNORE} is
used to filter the matches.
@xref{Bash Variables}, for a description of @code{FIGNORE}.

Any completions specified by a filename expansion pattern to the
@samp{-G} option are generated next.
The words generated by the pattern need not match the word being completed.
The @code{GLOBIGNORE} shell variable is not used to filter the matches,
but the @code{FIGNORE} shell variable is used.

Next, the string specified as the argument to the @samp{-W} option
is considered.
The string is first split using the characters in the @code{IFS}
special variable as delimiters.
Shell quoting is honored.
Each word is then expanded using
brace expansion, tilde expansion, parameter and variable expansion,
command substitution, arithmetic expansion, and pathname expansion,
as described above (@pxref{Shell Expansions}).
The results are split using the rules described above
(@pxref{Word Splitting}).
The results of the expansion are prefix-matched against the word being
completed, and the matching words become the possible completions.

After these matches have been generated, any shell function or command
specified with the @samp{-F} and @samp{-C} options is invoked.
When the command or function is invoked, the @code{COMP_LINE} and
@code{COMP_POINT} variables are assigned values as described above
(@pxref{Bash Variables}).
If a shell function is being invoked, the @code{COMP_WORDS} and
@code{COMP_CWORD} variables are also set.
When the function or command is invoked, the first argument is the
name of the command whose arguments are being completed, the
second argument is the word being completed, and the third argument
is the word preceding the word being completed on the current command line.
No filtering of the generated completions against the word being completed
is performed; the function or command has complete freedom in generating
the matches.

Any function specified with @samp{-F} is invoked first.
The function may use any of the shell facilities, including the
@code{compgen} builtin described below
(@pxref{Programmable Completion Builtins}), to generate the matches.
It must put the possible completions in the @code{COMPREPLY} array
variable.

Next, any command specified with the @samp{-C} option is invoked
in an environment equivalent to command substitution.
It should print a list of completions, one per line, to
the standard output.
Backslash may be used to escape a newline, if necessary.

After all of the possible completions are generated, any filter
specified with the @samp{-X} option is applied to the list.
The filter is a pattern as used for pathname expansion; a @samp{&}
in the pattern is replaced with the text of the word being completed.
A literal @samp{&} may be escaped with a backslash; the backslash
is removed before attempting a match.
Any completion that matches the pattern will be removed from the list.
A leading @samp{!} negates the pattern; in this case any completion
not matching the pattern will be removed.

Finally, any prefix and suffix specified with the @samp{-P} and @samp{-S}
options are added to each member of the completion list, and the result is
returned to the Readline completion code as the list of possible
completions.

If a compspec is found, whatever it generates is returned to the completion
code as the full set of possible completions.
The default Bash completions are not attempted, and the Readline
default of filename completion is disabled.

@node Programmable Completion Builtins
@section Programmable Completion Builtins
@cindex completion builtins

Two builtin commands are available to manipulate the programmable completion
facilities.

@table @code
@item compgen
@btindex compgen
@example
@code{compgen [@var{option}] [@var{word}]}
@end example

Generate possible completion matches for @var{word} according to
the @var{option}s, which may be any option accepted by the
@code{complete}
builtin with the exception of @samp{-p} and @samp{-r}, and write
the matches to the standard output.
When using the @samp{-F} or @samp{-C} options, the various shell variables
set by the programmable completion facilities, while available, will not
have useful values.

The matches will be generated in the same way as if the programmable
completion code had generated them directly from a completion specification
with the same flags.
If @var{word} is specified, only those completions matching @var{word}
will be displayed.

The return value is true unless an invalid option is supplied, or no
matches were generated.

@item complete
@btindex complete
@example
@code{complete [-abcdefjkvu] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}]
[-P @var{prefix}] [-S @var{suffix}] [-X @var{filterpat}] [-F @var{function}]
[-C @var{command}] @var{name} [@var{name} @dots{}]}
@code{complete -pr [@var{name} @dots{}]}
@end example

Specify how arguments to each @var{name} should be completed.
If the @samp{-p} option is supplied, or if no options are supplied, existing
completion specifications are printed in a way that allows them to be
reused as input.
The @samp{-r} option removes a completion specification for
each @var{name}, or, if no @var{name}s are supplied, all
completion specifications.

The process of applying these completion specifications when word completion
is attempted is described above (@pxref{Programmable Completion}).

Other options, if specified, have the following meanings.
The arguments to the @samp{-G}, @samp{-W}, and @samp{-X} options
(and, if necessary, the @samp{-P} and @samp{-S} options)
should be quoted to protect them from expansion before the
@code{complete} builtin is invoked.

@table @code
@item -A @var{action}
The @var{action} may be one of the following to generate a list of possible
completions:

@table @code
@item alias
Alias names.  May also be specified as @samp{-a}.

@item arrayvar
Array variable names.

@item binding
Readline key binding names (@pxref{Bindable Readline Commands}).

@item builtin
Names of shell builtin commands.  May also be specified as @samp{-b}.

@item command
Command names.  May also be specified as @samp{-c}.

@item directory
Directory names.  May also be specified as @samp{-d}.

@item disabled
Names of disabled shell builtins.

@item enabled
Names of enabled shell builtins.

@item export
Names of exported shell variables.  May also be specified as @samp{-e}.

@item file
File names.  May also be specified as @samp{-f}.

@item function
Names of shell functions.

@item helptopic
Help topics as accepted by the @code{help} builtin (@pxref{Bash Builtins}).

@item hostname
Hostnames, as taken from the file specified by the
@code{HOSTFILE} shell variable (@pxref{Bash Variables}).

@item job
Job names, if job control is active.  May also be specified as @samp{-j}.

@item keyword
Shell reserved words.  May also be specified as @samp{-k}.

@item running
Names of running jobs, if job control is active.

@item setopt
Valid arguments for the @samp{-o} option to the @code{set} builtin
(@pxref{The Set Builtin}).

@item shopt
Shell option names as accepted by the @code{shopt} builtin
(@pxref{Bash Builtins}).

@item signal
Signal names.

@item stopped
Names of stopped jobs, if job control is active.

@item user
User names.  May also be specified as @samp{-u}.

@item variable
Names of all shell variables.  May also be specified as @samp{-v}.
@end table

@item -G @var{globpat}
The filename expansion pattern @var{globpat} is expanded to generate
the possible completions.

@item -W @var{wordlist}
The @var{wordlist} is split using the characters in the
@code{IFS} special variable as delimiters, and each resultant word
is expanded.
The possible completions are the members of the resultant list which
match the word being completed.

@item -C @var{command}
@var{command} is executed in a subshell environment, and its output is
used as the possible completions.

@item -F @var{function}
The shell function @var{function} is executed in the current shell
environment.
When it finishes, the possible completions are retrieved from the value
of the @code{COMPREPLY} array variable.

@item -X @var{filterpat}
@var{filterpat} is a pattern as used for filename expansion.
It is applied to the list of possible completions generated by the
preceding options and arguments, and each completion matching
@var{filterpat} is removed from the list.
A leading @samp{!} in @var{filterpat} negates the pattern; in this
case, any completion not matching @var{filterpat} is removed.

@item -P @var{prefix}
@var{prefix} is added at the beginning of each possible completion
after all other options have been applied.

@item -S @var{suffix}
@var{suffix} is appended to each possible completion
after all other options have been applied.
@end table

The return value is true unless an invalid option is supplied, an option
other than @samp{-p} or @samp{-r} is supplied without a @var{name}
argument, an attempt is made to remove a completion specification for
a @var{name} for which no specification exists, or
an error occurs adding a completion specification.

@end table
@end ifset
