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.
