This document details the changes between this version, readline-5.1,
and the previous version, readline-5.0.

1.  Changes to Readline

a.  Fixed a bug that caused multiliine prompts to be wrapped and displayed
    incorrectly.

b.  Fixed a bug that caused ^P/^N in emacs mode to fail to display the current
    line correctly.

c.  Fixed a problem in computing the number of invisible characters on the first
    line of a prompt whose length exceeds the screen width.

d.  Fixed vi-mode searching so that failure preserves the current line rather
    than the last line in the history list.

e.  Fixed the vi-mode `~' command (change-case) to have the correct behavior at
    end-of-line when manipulating multibyte characters.

f.  Fixed the vi-mode `r' command (change-char) to have the correct behavior at
    end-of-line when manipulating multibyte characters.

g.  Fixed multiple bugs in the redisplay of multibyte characters:  displaying
    prompts longer than the screen width containing multibyte characters,

h.  Fix the calculation of the number of physical characters in the prompt
    string when it contains multibyte characters.

i.  A non-zero value for the `rl_complete_suppress_append' variable now causes
    no `/' to be appended to a directory name.

j.  Fixed forward-word and backward-word to work when words contained
    multibyte characters.

k.  Fixed a bug in finding the delimiter of a `?' substring when performing
    history expansion in a locale that supports multibyte characters.

l.  Fixed a memory leak caused by not freeing the timestamp in a history entry.

m.  Fixed a bug that caused "\M-x" style key bindings to not obey the setting
    of the `convert-meta' variable.

n.  Fixed saving and restoring primary prompt when prompting for incremental   
    and non-incremental searches; search prompts now display multibyte
    characters correctly.

o.  Fixed a bug that caused keys originally bound to self-insert but shadowed
    by a multi-character key sequence to not be inserted.

p.  Fixed code so rl_prep_term_function and rl_deprep_term_function aren't
    dereferenced if NULL (matching the documentation).

q.  Extensive changes to readline to add enough state so that commands
    requiring additional characters (searches, multi-key sequences, numeric
    arguments, commands requiring an additional specifier character like
    vi-mode change-char, etc.) work without synchronously waiting for
    additional input.

r.  Lots of changes so readline builds and runs on MinGW.

s.  Readline no longer tries to modify the terminal settings when running in
    callback mode.

t.  The Readline display code no longer sets the location of the last invisible
    character in the prompt if the \[\] sequence is empty.

u.  The `change-case' command now correctly changes the case of multibyte
    characters.

v.  Changes to the shared library construction scripts to deal with Windows
    DLL naming conventions for Cygwin.

w.  Fixed the redisplay code to avoid core dumps resulting from a poorly-timed
    SIGWINCH.

x.  Fixed the non-incremental search code in vi mode to dispose of any current
    undo list when copying a line from the history into the current editing
    buffer.

y.  Fixed a bug that caused reversing the incremental search direction to
    not work correctly.  
    
z.  Fixed the vi-mode `U' command to only undo up to the first time insert mode
    was entered, as Posix specifies.

aa. Fixed a bug in the vi-mode `r' command that left the cursor in the wrong
    place.

bb. Fixed a redisplay bug caused by moving the cursor vertically to a line
    with invisible characters in the prompt in a multibyte locale.

cc. Fixed a bug that could cause the terminal special chars to be bound in the
    wrong keymap in vi mode.

2.  New Features in Readline

a.  The key sequence sent by the keypad `delete' key is now automatically   
    bound to delete-char.

b.  A negative argument to menu-complete now cycles backward through the
    completion list.

c.  A new bindable readline variable:  bind-tty-special-chars.  If non-zero,
    readline will bind the terminal special characters to their readline
    equivalents when it's called (on by default).

d.  New bindable command: vi-rubout.  Saves deleted text for possible  
    reinsertion, as with any vi-mode `text modification' command; `X' is bound
    to this in vi command mode.

e.  If the rl_completion_query_items is set to a value < 0, readline never
    asks the user whether or not to view the possible completions.

f.  The `C-w' binding in incremental search now understands multibyte
    characters.

g.  New application-callable auxiliary function, rl_variable_value, returns 
    a string corresponding to a readline variable's value.

h.  When parsing inputrc files and variable binding commands, the parser
    strips trailing whitespace from values assigned to boolean variables
    before checking them.

i.  A new external application-controllable variable that allows the LINES   
    and COLUMNS environment variables to set the window size regardless of
    what the kernel returns.

-------------------------------------------------------------------------------
This document details the changes between this version, readline-5.0,
and the previous version, readline-4.3.

1.  Changes to Readline

a.  Fixes to avoid core dumps because of null pointer references in the
    multibyte character code.

b.  Fix to avoid infinite recursion caused by certain key combinations.

c.  Fixed a bug that caused the vi-mode `last command' to be set incorrectly.

d.  Readline no longer tries to read ahead more than one line of input, even
    when more is available.

e.  Fixed the code that adjusts the point to not mishandle null wide
    characters.

f.  Fixed a bug in the history expansion `g' modifier that caused it to skip
    every other match.

g.  Fixed a bug that caused the prompt to overwrite previous output when the
    output doesn't contain a newline and the locale supports multibyte
    characters.  This same change fixes the problem of readline redisplay
    slowing down dramatically as the line gets longer in multibyte locales.

h.  History traversal with arrow keys in vi insertion mode causes the cursor
    to be placed at the end of the new line, like in emacs mode.

i.  The locale initialization code does a better job of using the right
    precedence and defaulting when checking the appropriate environment
    variables.

j.  Fixed the history word tokenizer to handle <( and >( better when used as
    part of bash.

k.  The overwrite mode code received several bug fixes to improve undo.

l.  Many speedups to the multibyte character redisplay code.

m.  The callback character reading interface should not hang waiting to read
    keyboard input.

n.  Fixed a bug with redoing vi-mode `s' command.

o.  The code that initializes the terminal tracks changes made to the terminal
    special characters with stty(1) (or equivalent), so that these changes
    are reflected in the readline bindings.  New application-callable function
    to make it work:  rl_tty_unset_default_bindings().

p.  Fixed a bug that could cause garbage to be inserted in the buffer when
    changing character case in vi mode when using a multibyte locale.

q.  Fixed a bug in the redisplay code that caused problems on systems
    supporting multibyte characters when moving between history lines when the
    new line has more glyphs but fewer bytes.

r.  Undo and redo now work better after exiting vi insertion mode.

s.  Make sure system calls are restarted after a SIGWINCH is received using
    SA_RESTART.

t.  Improvements to the code that displays possible completions when using
    multibyte characters.

u.  Fixed a problem when parsing nested if statements in inputrc files.

v.  The completer now takes multibyte characters into account when looking for
    quoted substrings on which to perform completion.

w.  The history search functions now perform better bounds checking on the
    history list.

x.  Change to history expansion functions to treat `^' as equivalent to word 
    one, as the documention states.

y.  Some changes to the display code to improve display and redisplay of
    multibyte characters.

z.  Changes to speed up the multibyte character redisplay code.

aa. Fixed a bug in the vi-mode `E' command that caused it to skip over the
    last character of a word if invoked while point was on the word's
    next-to-last character.

bb. Fixed a bug that could cause incorrect filename quoting when
    case-insensitive completion was enabled and the word being completed
    contained backslashes quoting word break characters.

cc. Fixed a bug in redisplay triggered when the prompt string contains
    invisible characters.

dd. Fixed some display (and other) bugs encountered in multibyte locales
    when a non-ascii character was the last character on a line.

ee. Fixed some display bugs caused by multibyte characters in prompt strings.

ff. Fixed a problem with history expansion caused by non-whitespace characters
    used as history word delimiters.

gg. Fixed a problem that could cause readline to refer to freed memory when
    moving between history lines while doing searches.

hh. Improvements to the code that expands and displays prompt strings
    containing multibyte characters.

ii. Fixed a problem with vi-mode not correctly remembering the numeric argument
    to the last `c'hange command for later use with `.'.

jj. Fixed a bug in vi-mode that caused multi-digit count arguments to work   
    incorrectly.

kk. Fixed a problem in vi-mode that caused the last text modification command
    to not be remembered across different command lines.

ll. Fixed problems with changing characters and changing case at the end of
    the line.

mm. Fixed a problem with readline saving the contents of the current line
    before beginning a non-interactive search.

nn. Fixed a problem with EOF detection when using rl_event_hook.

oo. Fixed a problem with the vi mode `p' and `P' commands ignoring numeric
    arguments.

2.  New Features in Readline

a.  History expansion has a new `a' modifier equivalent to the `g' modifier
    for compatibility with the BSD csh.

b.  History expansion has a new `G' modifier equivalent to the BSD csh `g'
    modifier, which performs a substitution once per word.

c.  All non-incremental search operations may now undo the operation of
    replacing the current line with the history line.

d.  The text inserted by an `a' command in vi mode can be reinserted with
    `.'.

e.  New bindable variable, `show-all-if-unmodified'.  If set, the readline
    completer will list possible completions immediately if there is more
    than one completion and partial completion cannot be performed.

f.  There is a new application-callable `free_history_entry()' function.

g.  History list entries now contain timestamp information; the history file
    functions know how to read and write timestamp information associated
    with each entry.

h.  Four new key binding functions have been added:

	rl_bind_key_if_unbound()
	rl_bind_key_if_unbound_in_map()
	rl_bind_keyseq_if_unbound()
	rl_bind_keyseq_if_unbound_in_map()

i.  New application variable, rl_completion_quote_character, set to any
    quote character readline finds before it calls the application completion
    function.

j.  New application variable, rl_completion_suppress_quote, settable by an   
    application completion function.  If set to non-zero, readline does not
    attempt to append a closing quote to a completed word.
    
k.  New application variable, rl_completion_found_quote, set to a non-zero
    value if readline determines that the word to be completed is quoted.
    Set before readline calls any application completion function.

l.  New function hook, rl_completion_word_break_hook, called when readline
    needs to break a line into words when completion is attempted.  Allows
    the word break characters to vary based on position in the line.

m.  New bindable command: unix-filename-rubout.  Does the same thing as
    unix-word-rubout, but adds `/' to the set of word delimiters.

n.  When listing completions, directories have a `/' appended if the
    `mark-directories' option has been enabled.

-------------------------------------------------------------------------------
This document details the changes between this version, readline-4.3,
and the previous version, readline-4.2a.

1.  Changes to Readline

a.  Fixed output of comment-begin character when listing variable values.

b.  Added some default key bindings for common escape sequences produced by
    HOME and END keys.

c.  Fixed the mark handling code to be more emacs-compatible.

d.  A bug was fixed in the code that prints possible completions to keep it
    from printing empty strings in certain circumstances.

e.  Change the key sequence printing code to print ESC as M\- if ESC is a
    meta-prefix character -- it's easier for users to understand than \e.

f.  Fixed unstifle_history() to return values that match the documentation.

g.  Fixed the event loop (rl_event_hook) to handle the case where the input
    file descriptor is invalidated.

h.  Fixed the prompt display code to work better when the application has a
    custom redisplay function.

i.  Changes to make reading and writing the history file a little faster, and
    to cope with huge history files without calling abort(3) from xmalloc.

j.  The vi-mode `S' and `s' commands are now undone correctly.

k.  Fixed a problem which caused the display to be messed up when the last
    line of a multi-line prompt (possibly containing invisible characters)
    was longer than the screen width.

2.  New Features in Readline

a.  Support for key `subsequences':  allows, e.g., ESC and ESC-a to both
    be bound to readline functions.  Now the arrow keys may be used in vi
    insert mode.

b.  When listing completions, and the number of lines displayed is more than
    the screen length, readline uses an internal pager to display the results.
    This is controlled by the `page-completions' variable (default on).

c.  New code to handle editing and displaying multibyte characters.

d.  The behavior introduced in bash-2.05a of deciding whether or not to
    append a slash to a completed name that is a symlink to a directory has
    been made optional, controlled by the `mark-symlinked-directories'
    variable (default is the 2.05a behavior).

e.  The `insert-comment' command now acts as a toggle if given a numeric
    argument:  if the first characters on the line don't specify a
    comment, insert one; if they do, delete the comment text

f.  New application-settable completion variable:
    rl_completion_mark_symlink_dirs, allows an application's completion
    function to temporarily override the user's preference for appending
    slashes to names which are symlinks to directories.

g.  New function available to application completion functions:
    rl_completion_mode, to tell how the completion function was invoked
    and decide which argument to supply to rl_complete_internal (to list
    completions, etc.).

h.  Readline now has an overwrite mode, toggled by the `overwrite-mode'
    bindable command, which could be bound to `Insert'.

i.  New application-settable completion variable:
    rl_completion_suppress_append, inhibits appending of
    rl_completion_append_character to completed words.

j.  New key bindings when reading an incremental search string:  ^W yanks
    the currently-matched word out of the current line into the search
    string; ^Y yanks the rest of the current line into the search string,
    DEL or ^H deletes characters from the search string.

-------------------------------------------------------------------------------
This document details the changes between this version, readline-4.2a,
and the previous version, readline-4.2.

1.  Changes to Readline

a.  More `const' and type casting fixes.

b.  Changed rl_message() to use vsnprintf(3) (if available) to fix buffer
    overflow problems.

c.  The completion code no longer appends a `/' or ` ' to a match when
    completing a symbolic link that resolves to a directory name, unless
    the match does not add anything to the word being completed.  This
    means that a tab will complete the word up to the full name, but not
    add anything, and a subsequent tab will add a slash.

d.  Fixed a trivial typo that made the vi-mode `dT' command not work.

e.  Fixed the tty code so that ^S and ^Q can be inserted with rl_quoted_insert.

f.  Fixed the tty code so that ^V works more than once.

g.  Changed the use of __P((...)) for function prototypes to PARAMS((...))
    because the use of __P in typedefs conflicted g++ and glibc.

h.  The completion code now attempts to do a better job of preserving the
    case of the word the user typed if ignoring case in completions.

i.  Readline defaults to not echoing the input and lets the terminal
    initialization code enable echoing if there is a controlling terminal.

j.  The key binding code now processes only two hex digits after a `\x'
    escape sequence, and the documentation was changed to note that the
    octal and hex escape sequences result in an eight-bit value rather
    than strict ASCII.

k.  Fixed a few places where negative array subscripts could have occurred.
    
l.  Fixed the vi-mode code to use a better method to determine the bounds of
    the array used to hold the marks, and to avoid out-of-bounds references.
    
m.  Fixed the defines in chardefs.h to work better when chars are signed.
    
n.  Fixed configure.in to use the new names for bash autoconf macros.
    
o.  Readline no longer attempts to define its own versions of some ctype
    macros if they are implemented as functions in libc but not as macros in
    <ctype.h>.

p.  Fixed a problem where rl_backward could possibly set point to before
    the beginning of the line.

q.  Fixed Makefile to not put -I/usr/include into CFLAGS, since it can cause
    include file problems.

2.  New Features in Readline

a.  Added extern declaration for rl_get_termcap to readline.h, making it a
    public function (it was always there, just not in readline.h).

b.  New #defines in readline.h:  RL_READLINE_VERSION, currently 0x0402,
    RL_VERSION_MAJOR, currently 4, and RL_VERSION_MINOR, currently 2.

c.  New readline variable:  rl_readline_version, mirrors RL_READLINE_VERSION.

d.  New bindable boolean readline variable:  match-hidden-files.  Controls
    completion of files beginning with a `.' (on Unix).  Enabled by default.

e.  The history expansion code now allows any character to terminate a
    `:first-' modifier, like csh.

f.  The incremental search code remembers the last search string and uses
    it if ^R^R is typed without a search string.

h.  New bindable variable `history-preserve-point'.  If set, the history
    code attempts to place the user at the same location on each history
    line retrived with previous-history or next-history.

-------------------------------------------------------------------------------
This document details the changes between this version, readline-4.2,
and the previous version, readline-4.1.

1.  Changes to Readline

a.  When setting the terminal attributes on systems using `struct termio',
    readline waits for output to drain before changing the attributes.

b.  A fix was made to the history word tokenization code to avoid attempts to
    dereference a null pointer.

c.  Readline now defaults rl_terminal_name to $TERM if the calling application
    has left it unset, and tries to initialize with the resultant value.

d.  Instead of calling (*rl_getc_function)() directly to get input in certain
    places, readline now calls rl_read_key() consistently.

e.  Fixed a bug in the completion code that allowed a backslash to quote a
    single quote inside a single-quoted string.

f.  rl_prompt is no longer assigned directly from the argument to readline(),
    but uses memory allocated by readline.  This allows constant strings to
    be passed to readline without problems arising when the prompt processing
    code wants to modify the string.

g.  Fixed a bug that caused non-interactive history searches to return the
    wrong line when performing multiple searches backward for the same string.

h.  Many variables, function arguments, and function return values are now
    declared `const' where appropriate, to improve behavior when linking with
    C++ code.

i.  The control character detection code now works better on systems where
    `char' is unsigned by default.

j.  The vi-mode numeric argument is now capped at 999999, just like emacs mode.

k.  The Function, CPFunction, CPPFunction, and VFunction typedefs have been
    replaced with a set of specific prototyped typedefs, though they are
    still in the readline header files for backwards compatibility.

m.  Nearly all of the (undocumented) internal global variables in the library
    now have an _rl_ prefix -- there were a number that did not, like
    screenheight, screenwidth, alphabetic, etc.

n.  The ding() convenience function has been renamed to rl_ding(), though the
    old function is still defined for backwards compatibility.

o.  The completion convenience functions filename_completion_function,
    username_completion_function, and completion_matches now have an rl_
    prefix, though the old names are still defined for backwards compatibility.

p.  The functions shared by readline and bash (linkage is satisfied from bash
    when compiling with bash, and internally otherwise) now have an sh_ prefix.

q.  Changed the shared library creation procedure on Linux and BSD/OS 4.x so
    that the `soname' contains only the major version number rather than the
    major and minor numbers.

r.  Fixed a redisplay bug that occurred when the prompt spanned more than one
    physical line and contained invisible characters.

s.  Added a missing `includedir' variable to the Makefile.

t.  When installing the shared libraries, make sure symbolic links are relative.

u.  Added configure test so that it can set `${MAKE}' appropriately.

v.  Fixed a bug in rl_forward that could cause the point to be set to before
    the beginning of the line in vi mode.

w.  Fixed a bug in the callback read-char interface to make it work when a
    readline function pushes some input onto the input stream with
    rl_execute_next (like the incremental search functions).

x.  Fixed a file descriptor leak in the history file manipulation code that
    was tripped when attempting to truncate a non-regular file (like
    /dev/null).

y.  Changes to make all of the exported readline functions declared in
    readline.h have an rl_ prefix (rltty_set_default_bindings is now
    rl_tty_set_default_bindings, crlf is now rl_crlf, etc.)

z.  The formatted documentation included in the base readline distribution
    is no longer removed on a `make distclean'.

aa. Some changes were made to avoid gcc warnings with -Wall.

bb. rl_get_keymap_by_name now finds keymaps case-insensitively, so
    `set keymap EMACS' works.

cc. The history file writing and truncation functions now return a useful
    status on error.

dd. Fixed a bug that could cause applications to dereference a NULL pointer
    if a NULL second argument was passed to history_expand().

ee. If a hook function assigned to rl_event_hook sets rl_done to a non-zero
    value, rl_read_key() now immediately returns '\n' (which is assumed to   
    be bound to accept-line).

2.  New Features in Readline

a.  The blink timeout for paren matching is now settable by applications,
    via the rl_set_paren_blink_timeout() function.

b.  _rl_executing_macro has been renamed to rl_executing_macro, which means
    it's now part of the public interface.

c.  Readline has a new variable, rl_readline_state, which is a bitmap that
    encapsulates the current state of the library; intended for use by
    callbacks and hook functions.

d.  rlfe has a new -l option to log input and output (-a appends to logfile),
    a new -n option to set the readline application name, and -v and -h
    options for version and help information.

e.  rlfe can now perform filename completion for the inferior process if the
    OS has a /proc/<PID>/cwd that can be read with readlink(2) to get the
    inferior's current working directory.

f.  A new file, rltypedefs.h, contains the new typedefs for function pointers
    and is installed by `make install'.

g.  New application-callable function rl_set_prompt(const char *prompt):
    expands its prompt string argument and sets rl_prompt to the result.

h.  New application-callable function rl_set_screen_size(int rows, int cols):
    public method for applications to set readline's idea of the screen
    dimensions.

i.  The history example program (examples/histexamp.c) is now built as one
    of the examples.

j.  The documentation has been updated to cover nearly all of the public
    functions and variables declared in readline.h.

k.  New function, rl_get_screen_size (int *rows, int *columns), returns
    readline's idea of the screen dimensions.

l.  The timeout in rl_gather_tyi (readline keyboard input polling function)
    is now settable via a function (rl_set_keyboard_input_timeout()).

m.  Renamed the max_input_history variable to history_max_entries; the old
    variable is maintained for backwards compatibility.

n.  The list of characters that separate words for the history tokenizer is
    now settable with a variable:  history_word_delimiters.  The default
    value is as before.

o.  There is a new history.3 manual page documenting the history library.

-------------------------------------------------------------------------------
This document details the changes between this version, readline-4.1,
and the previous version, readline-4.0.

1.  Changes to Readline

a.  Changed the HTML documents so that the table-of-contents is no longer
    a separate file.

b.  Changes to the shared object configuration for: Irix 5.x, Irix 6.x,
    OSF/1.

c.  The shared library major and minor versions are now constructed
    automatically by configure and substituted into the makefiles.

d.  It's now possible to install the shared libraries separately from the
    static libraries.

e.  The history library tries to truncate the history file only if it is a
    regular file.

f.  A bug that caused _rl_dispatch to address negative array indices on
    systems with signed chars was fixed.

g.  rl-yank-nth-arg now leaves the history position the same as when it was
    called.

h.  Changes to the completion code to handle MS-DOS drive-letter:pathname
    filenames.

i.  Completion is now case-insensitive by default on MS-DOS.

j.  Fixes to the history file manipulation code for MS-DOS.

k.  Readline attempts to bind the arrow keys to appropriate defaults on MS-DOS.

l.  Some fixes were made to the redisplay code for better operation on MS-DOS.

m.  The quoted-insert code will now insert tty special chars like ^C.

n.  A bug was fixed that caused the display code to reference memory before
    the start of the prompt string.

o.  More support for __EMX__ (OS/2).

p.  A bug was fixed in readline's signal handling that could cause infinite
    recursion in signal handlers.

q.  A bug was fixed that caused the point to be less than zero when rl_forward
    was given a very large numeric argument.

r.  The vi-mode code now gets characters via the application-settable value
    of rl_getc_function rather than calling rl_getc directly.

s.  The history file code now uses O_BINARY mode when reading and writing
    the history file on cygwin32.

t.  Fixed a bug in the redisplay code for lines with more than 256 line
    breaks.

u.  A bug was fixed which caused invisible character markers to not be
    stripped from the prompt string if the terminal was in no-echo mode.
    
v.  Readline no longer tries to get the variables it needs for redisplay 
    from the termcap entry if the calling application has specified its
    own redisplay function.  Readline treats the terminal as `dumb' in
    this case.

w.  Fixes to the SIGWINCH code so that a multiple-line prompt with escape
    sequences is redrawn correctly.

x.  Changes to the install and install-shared targets so that the libraries
    and header files are installed separately.

2.  New Features in Readline

a.  A new Readline `user manual' is in doc/rluserman.texinfo.

b.  Parentheses matching is now always compiled into readline, and enabled
    or disabled when the value of the `blink-matching-paren' variable is
    changed.

c.  MS-DOS systems now use ~/_inputrc as the last-ditch inputrc filename.

d.  MS-DOS systems now use ~/_history as the default history file.

e.  history-search-{forward,backward} now leave the point at the end of the
    line when the string to search for is empty, like
    {reverse,forward}-search-history.

f.  history-search-{forward,backward} now leave the last history line found
    in the readline buffer if the second or subsequent search fails.

g.  New function for use by applications:  rl_on_new_line_with_prompt, used
    when an application displays the prompt itself before calling readline().

h.  New variable for use by applications:  rl_already_prompted.  An application
    that displays the prompt itself before calling readline() must set this to
    a non-zero value.

i.  A new variable, rl_gnu_readline_p, always 1.  The intent is that an
    application can verify whether or not it is linked with the `real'
    readline library or some substitute.

j.  Per Bothner's `rlfe' (pronounced `Ralphie') readline front-end program
    is included in the examples subdirectory, though it is not built
    by default.

-------------------------------------------------------------------------------
This document details the changes between this version, readline-4.0,
and the previous version, readline-2.2.

1.  Changes to Readline

a.  The version number is now 4.0, to match the major and minor version
    numbers on the shared readline and history libraries.  Future
    releases will maintain the identical numbering.

b.  Fixed a typo in the `make install' recipe that copied libreadline.a
    to libhistory.old right after installing it.

c.  The readline and history info files are now installed out of the source
    directory if they are not found in the build directory.

d.  The library no longer exports a function named `savestring' -- backwards
    compatibility be damned.

e.  There is no longer any #ifdef SHELL code in the source files.

f.  Some changes were made to the key binding code to fix memory leaks and
    better support Win32 systems.

g.  Fixed a silly typo in the paren matching code -- it's microseconds, not
    milliseconds.

h.  The readline library should be compilable by C++ compilers.

i.  The readline.h public header file now includes function prototypes for
    all readline functions, and some changes were made to fix errors in the
    source files uncovered by the use of prototypes.

j.  The maximum numeric argument is now clamped at 1000000.

k.  Fixes to rl_yank_last_arg to make it behave better.

l.  Fixed a bug in the display code that caused core dumps if the prompt
    string length exceeded 1024 characters.

m.  The menu completion code was fixed to properly insert a single completion
    if there is only one match.

n.  A bug was fixed that caused the display code to improperly display tabs
    after newlines.

o.  A fix was made to the completion code in which a typo caused the wrong
    value to be passed to the function that computed the longest common
    prefix of the list of matches.

p.  The completion code now checks the value of rl_filename_completion_desired,
    which is set by application-supplied completion functions to indicate
    that filename completion is being performed, to decide whether or not to
    call an application-supplied `ignore completions' function.

q.  Code was added to the history library to catch history substitutions
    using `&' without a previous history substitution or search having been
    performed.


2.  New Features in Readline

a.  There is a new script, support/shobj-conf, to do system-specific shared
    object and library configuration.  It generates variables for configure
    to substitute into makefiles.  The README file provides a detailed
    explanation of the shared library creation process.

b.  Shared libraries and objects are now built in the `shlib' subdirectory.
    There is a shlib/Makefile.in to control the build process.  `make shared'
    from the top-level directory is still the right way to build shared
    versions of the libraries.

c.  rlconf.h is now installed, so applications can find out which features
    have been compiled into the installed readline and history libraries.

d.  rlstdc.h is now an installed header file.

e.  Many changes to the signal handling:
        o Readline now catches SIGQUIT and cleans up the tty before returning;
        o A new variable, rl_catch_signals, is available to application writers 
          to indicate to readline whether or not it should install its own
          signal handlers for SIGINT, SIGTERM, SIGQUIT, SIGALRM, SIGTSTP,
          SIGTTIN, and SIGTTOU;
        o A new variable, rl_catch_sigwinch, is available to application
          writers to indicate to readline whether or not it should install its
          own signal handler for SIGWINCH, which will chain to the calling
          applications's SIGWINCH handler, if one is installed;
        o There is a new function, rl_free_line_state, for application signal
          handlers to call to free up the state associated with the current
          line after receiving a signal;
        o There is a new function, rl_cleanup_after_signal, to clean up the
          display and terminal state after receiving a signal;
        o There is a new function, rl_reset_after_signal, to reinitialize the
          terminal and display state after an application signal handler
          returns and readline continues

f.  There is a new function, rl_resize_terminal, to reset readline's idea of
    the screen size after a SIGWINCH.

g.  New public functions: rl_save_prompt and rl_restore_prompt.  These were
    previously private functions with a `_' prefix.  These functions are
    used when an application wants to write a message to the `message area'
    with rl_message and have the prompt restored correctly when the message
    is erased.

h.  New function hook: rl_pre_input_hook, called just before readline starts
    reading input, after initialization.

i.  New function hook: rl_display_matches_hook, called when readline would
    display the list of completion matches.  The new function
    rl_display_match_list is what readline uses internally, and is available
    for use by application functions called via this hook.

j.  New bindable function, delete-char-or-list, like tcsh.

k.  A new variable, rl_erase_empty_line, which, if set by an application using
    readline, will cause readline to erase, prompt and all, lines on which the
    only thing typed was a newline.

l.  There is a new script, support/shlib-install, to install and uninstall
    the shared readline and history libraries.

m.  A new bindable variable, `isearch-terminators', which is a string
    containing the set of characters that should terminate an incremental
    search without being executed as a command.

n.  A new bindable function, forward-backward-delete-char.

-------------------------------------------------------------------------------
This document details the changes between this version, readline-2.2,
and the previous version, readline-2.1.

1.  Changes to Readline

a.  Added a missing `extern' to a declaration in readline.h that kept
    readline from compiling cleanly on some systems.

b.  The history file is now opened with mode 0600 when it is written for
    better security.

c.  Changes were made to the SIGWINCH handling code so that prompt redisplay
    is done better.

d.  ^G now interrupts incremental searches correctly.

e.  A bug that caused a core dump when the set of characters to be quoted
    when completing words was empty was fixed.

f.  Fixed a problem in the readline test program rltest.c that caused a core
    dump.

g.  The code that handles parser directives in inputrc files now displays
    more error messages.

h.  The history expansion code was fixed so that the appearance of the
    history comment character at the beginning of a word inhibits history
    expansion for that word and the rest of the input line.

i.  The code that prints completion listings now behaves better if one or
    more of the filenames contains non-printable characters.

j.  The time delay when showing matching parentheses is now 0.5 seconds.


2.  New Features in Readline

a.  There is now an option for `iterative' yank-last-arg handline, so a user
    can keep entering `M-.', yanking the last argument of successive history
    lines.

b.  New variable, `print-completions-horizontally', which causes completion
    matches to be displayed across the screen (like `ls -x') rather than up
    and down the screen (like `ls').

c.  New variable, `completion-ignore-case', which causes filename completion
    and matching to be performed case-insensitively.

d.  There is a new bindable command, `magic-space', which causes history
    expansion to be performed on the current readline buffer and a space to
    be inserted into the result.

e.  There is a new bindable command, `menu-complete', which enables tcsh-like
    menu completion (successive executions of menu-complete insert a single
    completion match, cycling through the list of possible completions).

f.  There is a new bindable command, `paste-from-clipboard', for use on Win32
    systems, to insert the text from the Win32 clipboard into the editing
    buffer.

g.  The key sequence translation code now understands printf-style backslash
    escape sequences, including \NNN octal escapes.  These escape sequences
    may be used in key sequence definitions or macro values.

h.  An `$include' inputrc file parser directive has been added.
