This is history.info, produced by makeinfo version 4.7 from
/Users/chet/src/bash/readline-src/doc/history.texi.

   This document describes the GNU History library (version 5.1-beta1,
11 November 2005), a programming tool that provides a consistent user
interface for recalling lines of previously typed input.

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

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

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU Free Documentation License,
     Version 1.1 or any later version published by the Free Software
     Foundation; with no Invariant Sections, with the Front-Cover texts
     being "A GNU Manual," and with the Back-Cover Texts as in (a)
     below.  A copy of the license is included in the section entitled
     "GNU Free Documentation License."

     (a) The FSF's Back-Cover Text is: "You have freedom to copy and
     modify this GNU Manual, like GNU software.  Copies published by
     the Free Software Foundation raise funds for GNU development."

INFO-DIR-SECTION Libraries
START-INFO-DIR-ENTRY
* History: (history).       The GNU history library API.
END-INFO-DIR-ENTRY


File: history.info,  Node: Top,  Next: Using History Interactively,  Up: (dir)

GNU History Library
*******************

This document describes the GNU History library, a programming tool that
provides a consistent user interface for recalling lines of previously
typed input.

* Menu:

* Using History Interactively::	  GNU History User's Manual.
* Programming with GNU History::  GNU History Programmer's Manual.
* Copying This Manual::		  Copying This Manual.
* Concept Index::		  Index of concepts described in this manual.
* Function and Variable Index::	  Index of externally visible functions
				  and variables.


File: history.info,  Node: Using History Interactively,  Next: Programming with GNU History,  Prev: Top,  Up: Top

1 Using History Interactively
*****************************

This chapter describes how to use the GNU History Library interactively,
from a user's standpoint.  It should be considered a user's guide.  For
information on using the GNU History Library in your own programs,
*note Programming with GNU History::.

* Menu:

* History Interaction::		What it feels like using History as a user.


File: history.info,  Node: History Interaction,  Up: Using History Interactively

1.1 History Expansion
=====================

The History library provides a history expansion feature that is similar
to the history expansion provided by `csh'.  This section describes the
syntax used to manipulate the history information.

   History expansions introduce words from the history list into the
input stream, making it easy to repeat commands, insert the arguments
to a previous command into the current input line, or fix errors in
previous commands quickly.

   History expansion takes place in two parts.  The first is to
determine which line from the history list should be used during
substitution.  The second is to select portions of that line for
inclusion into the current one.  The line selected from the history is
called the "event", and the portions of that line that are acted upon
are called "words".  Various "modifiers" are available to manipulate
the selected words.  The line is broken into words in the same fashion
that Bash does, so that several words surrounded by quotes are
considered one word.  History expansions are introduced by the
appearance of the history expansion character, which is `!' by default.

* Menu:

* Event Designators::	How to specify which history line to use.
* Word Designators::	Specifying which words are of interest.
* Modifiers::		Modifying the results of substitution.


File: history.info,  Node: Event Designators,  Next: Word Designators,  Up: History Interaction

1.1.1 Event Designators
-----------------------

An event designator is a reference to a command line entry in the
history list.  

`!'
     Start a history substitution, except when followed by a space, tab,
     the end of the line, or `='.

`!N'
     Refer to command line N.

`!-N'
     Refer to the command N lines back.

`!!'
     Refer to the previous command.  This is a synonym for `!-1'.

`!STRING'
     Refer to the most recent command starting with STRING.

`!?STRING[?]'
     Refer to the most recent command containing STRING.  The trailing
     `?' may be omitted if the STRING is followed immediately by a
     newline.

`^STRING1^STRING2^'
     Quick Substitution.  Repeat the last command, replacing STRING1
     with STRING2.  Equivalent to `!!:s/STRING1/STRING2/'.

`!#'
     The entire command line typed so far.



File: history.info,  Node: Word Designators,  Next: Modifiers,  Prev: Event Designators,  Up: History Interaction

1.1.2 Word Designators
----------------------

Word designators are used to select desired words from the event.  A
`:' separates the event specification from the word designator.  It may
be omitted if the word designator begins with a `^', `$', `*', `-', or
`%'.  Words are numbered from the beginning of the line, with the first
word being denoted by 0 (zero).  Words are inserted into the current
line separated by single spaces.

   For example,

`!!'
     designates the preceding command.  When you type this, the
     preceding command is repeated in toto.

`!!:$'
     designates the last argument of the preceding command.  This may be
     shortened to `!$'.

`!fi:2'
     designates the second argument of the most recent command starting
     with the letters `fi'.

   Here are the word designators:

`0 (zero)'
     The `0'th word.  For many applications, this is the command word.

`N'
     The Nth word.

`^'
     The first argument; that is, word 1.

`$'
     The last argument.

`%'
     The word matched by the most recent `?STRING?' search.

`X-Y'
     A range of words; `-Y' abbreviates `0-Y'.

`*'
     All of the words, except the `0'th.  This is a synonym for `1-$'.
     It is not an error to use `*' if there is just one word in the
     event; the empty string is returned in that case.

`X*'
     Abbreviates `X-$'

`X-'
     Abbreviates `X-$' like `X*', but omits the last word.


   If a word designator is supplied without an event specification, the
previous command is used as the event.


File: history.info,  Node: Modifiers,  Prev: Word Designators,  Up: History Interaction

1.1.3 Modifiers
---------------

After the optional word designator, you can add a sequence of one or
more of the following modifiers, each preceded by a `:'.

`h'
     Remove a trailing pathname component, leaving only the head.

`t'
     Remove all leading  pathname  components, leaving the tail.

`r'
     Remove a trailing suffix of the form `.SUFFIX', leaving the
     basename.

`e'
     Remove all but the trailing suffix.

`p'
     Print the new command but do not execute it.

`s/OLD/NEW/'
     Substitute NEW for the first occurrence of OLD in the event line.
     Any delimiter may be used in place of `/'.  The delimiter may be
     quoted in OLD and NEW with a single backslash.  If `&' appears in
     NEW, it is replaced by OLD.  A single backslash will quote the
     `&'.  The final delimiter is optional if it is the last character
     on the input line.

`&'
     Repeat the previous substitution.

`g'
`a'
     Cause changes to be applied over the entire event line.  Used in
     conjunction with `s', as in `gs/OLD/NEW/', or with `&'.

`G'
     Apply the following `s' modifier once to each word in the event.



File: history.info,  Node: Programming with GNU History,  Next: Copying This Manual,  Prev: Using History Interactively,  Up: Top

2 Programming with GNU History
******************************

This chapter describes how to interface programs that you write with
the GNU History Library.  It should be considered a technical guide.
For information on the interactive use of GNU History, *note Using
History Interactively::.

* Menu:

* Introduction to History::	What is the GNU History library for?
* History Storage::		How information is stored.
* History Functions::		Functions that you can use.
* History Variables::		Variables that control behaviour.
* History Programming Example::	Example of using the GNU History Library.


File: history.info,  Node: Introduction to History,  Next: History Storage,  Up: Programming with GNU History

2.1 Introduction to History
===========================

Many programs read input from the user a line at a time.  The GNU
History library is able to keep track of those lines, associate
arbitrary data with each line, and utilize information from previous
lines in composing new ones.

   The programmer using the History library has available functions for
remembering lines on a history list, associating arbitrary data with a
line, removing lines from the list, searching through the list for a
line containing an arbitrary text string, and referencing any line in
the list directly.  In addition, a history "expansion" function is
available which provides for a consistent user interface across
different programs.

   The user using programs written with the History library has the
benefit of a consistent user interface with a set of well-known
commands for manipulating the text of previous lines and using that text
in new commands.  The basic history manipulation commands are similar to
the history substitution provided by `csh'.

   If the programmer desires, he can use the Readline library, which
includes some history manipulation by default, and has the added
advantage of command line editing.

   Before declaring any functions using any functionality the History
library provides in other code, an application writer should include
the file `<readline/history.h>' in any file that uses the History
library's features.  It supplies extern declarations for all of the
library's public functions and variables, and declares all of the
public data structures.


File: history.info,  Node: History Storage,  Next: History Functions,  Prev: Introduction to History,  Up: Programming with GNU History

2.2 History Storage
===================

The history list is an array of history entries.  A history entry is
declared as follows:

     typedef void *histdata_t;

     typedef struct _hist_entry {
       char *line;
       char *timestamp;
       histdata_t data;
     } HIST_ENTRY;

   The history list itself might therefore be declared as

     HIST_ENTRY **the_history_list;

   The state of the History library is encapsulated into a single
structure:

     /*
      * A structure used to pass around the current state of the history.
      */
     typedef struct _hist_state {
       HIST_ENTRY **entries; /* Pointer to the entries themselves. */
       int offset;           /* The location pointer within this array. */
       int length;           /* Number of elements within this array. */
       int size;             /* Number of slots allocated to this array. */
       int flags;
     } HISTORY_STATE;

   If the flags member includes `HS_STIFLED', the history has been
stifled.


File: history.info,  Node: History Functions,  Next: History Variables,  Prev: History Storage,  Up: Programming with GNU History

2.3 History Functions
=====================

This section describes the calling sequence for the various functions
exported by the GNU History library.

* Menu:

* Initializing History and State Management::	Functions to call when you
						want to use history in a
						program.
* History List Management::		Functions used to manage the list
					of history entries.
* Information About the History List::	Functions returning information about
					the history list.
* Moving Around the History List::	Functions used to change the position
					in the history list.
* Searching the History List::		Functions to search the history list
					for entries containing a string.
* Managing the History File::		Functions that read and write a file
					containing the history list.
* History Expansion::			Functions to perform csh-like history
					expansion.


File: history.info,  Node: Initializing History and State Management,  Next: History List Management,  Up: History Functions

2.3.1 Initializing History and State Management
-----------------------------------------------

This section describes functions used to initialize and manage the
state of the History library when you want to use the history functions
in your program.

 -- Function: void using_history (void)
     Begin a session in which the history functions might be used.  This
     initializes the interactive variables.

 -- Function: HISTORY_STATE * history_get_history_state (void)
     Return a structure describing the current state of the input
     history.

 -- Function: void history_set_history_state (HISTORY_STATE *state)
     Set the state of the history list according to STATE.


File: history.info,  Node: History List Management,  Next: Information About the History List,  Prev: Initializing History and State Management,  Up: History Functions

2.3.2 History List Management
-----------------------------

These functions manage individual entries on the history list, or set
parameters managing the list itself.

 -- Function: void add_history (const char *string)
     Place STRING at the end of the history list.  The associated data
     field (if any) is set to `NULL'.

 -- Function: void add_history_time (const char *string)
     Change the time stamp associated with the most recent history
     entry to STRING.

 -- Function: HIST_ENTRY * remove_history (int which)
     Remove history entry at offset WHICH from the history.  The
     removed element is returned so you can free the line, data, and
     containing structure.

 -- Function: histdata_t free_history_entry (HIST_ENTRY *histent)
     Free the history entry HISTENT and any history library private
     data associated with it.  Returns the application-specific data so
     the caller can dispose of it.

 -- Function: HIST_ENTRY * replace_history_entry (int which, const char
          *line, histdata_t data)
     Make the history entry at offset WHICH have LINE and DATA.  This
     returns the old entry so the caller can dispose of any
     application-specific data.  In the case of an invalid WHICH, a
     `NULL' pointer is returned.

 -- Function: void clear_history (void)
     Clear the history list by deleting all the entries.

 -- Function: void stifle_history (int max)
     Stifle the history list, remembering only the last MAX entries.

 -- Function: int unstifle_history (void)
     Stop stifling the history.  This returns the previously-set
     maximum number of history entries (as set by `stifle_history()').
     The value is positive if the history was stifled, negative if it
     wasn't.

 -- Function: int history_is_stifled (void)
     Returns non-zero if the history is stifled, zero if it is not.


File: history.info,  Node: Information About the History List,  Next: Moving Around the History List,  Prev: History List Management,  Up: History Functions

2.3.3 Information About the History List
----------------------------------------

These functions return information about the entire history list or
individual list entries.

 -- Function: HIST_ENTRY ** history_list (void)
     Return a `NULL' terminated array of `HIST_ENTRY *' which is the
     current input history.  Element 0 of this list is the beginning of
     time.  If there is no history, return `NULL'.

 -- Function: int where_history (void)
     Returns the offset of the current history element.

 -- Function: HIST_ENTRY * current_history (void)
     Return the history entry at the current position, as determined by
     `where_history()'.  If there is no entry there, return a `NULL'
     pointer.

 -- Function: HIST_ENTRY * history_get (int offset)
     Return the history entry at position OFFSET, starting from
     `history_base' (*note History Variables::).  If there is no entry
     there, or if OFFSET is greater than the history length, return a
     `NULL' pointer.

 -- Function: time_t history_get_time (HIST_ENTRY *entry)
     Return the time stamp associated with the history entry ENTRY.

 -- Function: int history_total_bytes (void)
     Return the number of bytes that the primary history entries are
     using.  This function returns the sum of the lengths of all the
     lines in the history.


File: history.info,  Node: Moving Around the History List,  Next: Searching the History List,  Prev: Information About the History List,  Up: History Functions

2.3.4 Moving Around the History List
------------------------------------

These functions allow the current index into the history list to be set
or changed.

 -- Function: int history_set_pos (int pos)
     Set the current history offset to POS, an absolute index into the
     list.  Returns 1 on success, 0 if POS is less than zero or greater
     than the number of history entries.

 -- Function: HIST_ENTRY * previous_history (void)
     Back up the current history offset to the previous history entry,
     and return a pointer to that entry.  If there is no previous
     entry, return a `NULL' pointer.

 -- Function: HIST_ENTRY * next_history (void)
     Move the current history offset forward to the next history entry,
     and return the a pointer to that entry.  If there is no next
     entry, return a `NULL' pointer.


File: history.info,  Node: Searching the History List,  Next: Managing the History File,  Prev: Moving Around the History List,  Up: History Functions

2.3.5 Searching the History List
--------------------------------

These functions allow searching of the history list for entries
containing a specific string.  Searching may be performed both forward
and backward from the current history position.  The search may be
"anchored", meaning that the string must match at the beginning of the
history entry.  

 -- Function: int history_search (const char *string, int direction)
     Search the history for STRING, starting at the current history
     offset.  If DIRECTION is less than 0, then the search is through
     previous entries, otherwise through subsequent entries.  If STRING
     is found, then the current history index is set to that history
     entry, and the value returned is the offset in the line of the
     entry where STRING was found.  Otherwise, nothing is changed, and
     a -1 is returned.

 -- Function: int history_search_prefix (const char *string, int
          direction)
     Search the history for STRING, starting at the current history
     offset.  The search is anchored: matching lines must begin with
     STRING.  If DIRECTION is less than 0, then the search is through
     previous entries, otherwise through subsequent entries.  If STRING
     is found, then the current history index is set to that entry, and
     the return value is 0.  Otherwise, nothing is changed, and a -1 is
     returned.

 -- Function: int history_search_pos (const char *string, int
          direction, int pos)
     Search for STRING in the history list, starting at POS, an
     absolute index into the list.  If DIRECTION is negative, the search
     proceeds backward from POS, otherwise forward.  Returns the
     absolute index of the history element where STRING was found, or
     -1 otherwise.


File: history.info,  Node: Managing the History File,  Next: History Expansion,  Prev: Searching the History List,  Up: History Functions

2.3.6 Managing the History File
-------------------------------

The History library can read the history from and write it to a file.
This section documents the functions for managing a history file.

 -- Function: int read_history (const char *filename)
     Add the contents of FILENAME to the history list, a line at a time.
     If FILENAME is `NULL', then read from `~/.history'.  Returns 0 if
     successful, or `errno' if not.

 -- Function: int read_history_range (const char *filename, int from,
          int to)
     Read a range of lines from FILENAME, adding them to the history
     list.  Start reading at line FROM and end at TO.  If FROM is zero,
     start at the beginning.  If TO is less than FROM, then read until
     the end of the file.  If FILENAME is `NULL', then read from
     `~/.history'.  Returns 0 if successful, or `errno' if not.

 -- Function: int write_history (const char *filename)
     Write the current history to FILENAME, overwriting FILENAME if
     necessary.  If FILENAME is `NULL', then write the history list to
     `~/.history'.  Returns 0 on success, or `errno' on a read or write
     error.

 -- Function: int append_history (int nelements, const char *filename)
     Append the last NELEMENTS of the history list to FILENAME.  If
     FILENAME is `NULL', then append to `~/.history'.  Returns 0 on
     success, or `errno' on a read or write error.

 -- Function: int history_truncate_file (const char *filename, int
          nlines)
     Truncate the history file FILENAME, leaving only the last NLINES
     lines.  If FILENAME is `NULL', then `~/.history' is truncated.
     Returns 0 on success, or `errno' on failure.


File: history.info,  Node: History Expansion,  Prev: Managing the History File,  Up: History Functions

2.3.7 History Expansion
-----------------------

These functions implement history expansion.

 -- Function: int history_expand (char *string, char **output)
     Expand STRING, placing the result into OUTPUT, a pointer to a
     string (*note History Interaction::).  Returns:
    `0'
          If no expansions took place (or, if the only change in the
          text was the removal of escape characters preceding the
          history expansion character);

    `1'
          if expansions did take place;

    `-1'
          if there was an error in expansion;

    `2'
          if the returned line should be displayed, but not executed,
          as with the `:p' modifier (*note Modifiers::).

     If an error ocurred in expansion, then OUTPUT contains a
     descriptive error message.

 -- Function: char * get_history_event (const char *string, int
          *cindex, int qchar)
     Returns the text of the history event beginning at STRING +
     *CINDEX.  *CINDEX is modified to point to after the event
     specifier.  At function entry, CINDEX points to the index into
     STRING where the history event specification begins.  QCHAR is a
     character that is allowed to end the event specification in
     addition to the "normal" terminating characters.

 -- Function: char ** history_tokenize (const char *string)
     Return an array of tokens parsed out of STRING, much as the shell
     might.  The tokens are split on the characters in the
     HISTORY_WORD_DELIMITERS variable, and shell quoting conventions
     are obeyed.

 -- Function: char * history_arg_extract (int first, int last, const
          char *string)
     Extract a string segment consisting of the FIRST through LAST
     arguments present in STRING.  Arguments are split using
     `history_tokenize'.


File: history.info,  Node: History Variables,  Next: History Programming Example,  Prev: History Functions,  Up: Programming with GNU History

2.4 History Variables
=====================

This section describes the externally-visible variables exported by the
GNU History Library.

 -- Variable: int history_base
     The logical offset of the first entry in the history list.

 -- Variable: int history_length
     The number of entries currently stored in the history list.

 -- Variable: int history_max_entries
     The maximum number of history entries.  This must be changed using
     `stifle_history()'.

 -- Variable: int history_write_timestamps
     If non-zero, timestamps are written to the history file, so they
     can be preserved between sessions.  The default value is 0,
     meaning that timestamps are not saved.

 -- Variable: char history_expansion_char
     The character that introduces a history event.  The default is `!'.
     Setting this to 0 inhibits history expansion.

 -- Variable: char history_subst_char
     The character that invokes word substitution if found at the start
     of a line.  The default is `^'.

 -- Variable: char history_comment_char
     During tokenization, if this character is seen as the first
     character of a word, then it and all subsequent characters up to a
     newline are ignored, suppressing history expansion for the
     remainder of the line.  This is disabled by default.

 -- Variable: char * history_word_delimiters
     The characters that separate tokens for `history_tokenize()'.  The
     default value is `" \t\n()<>;&|"'.

 -- Variable: char * history_search_delimiter_chars
     The list of additional characters which can delimit a history
     search string, in addition to space, TAB, `:' and `?' in the case
     of a substring search.  The default is empty.

 -- Variable: char * history_no_expand_chars
     The list of characters which inhibit history expansion if found
     immediately following HISTORY_EXPANSION_CHAR.  The default is
     space, tab, newline, carriage return, and `='.

 -- Variable: int history_quotes_inhibit_expansion
     If non-zero, single-quoted words are not scanned for the history
     expansion character.  The default value is 0.

 -- Variable: rl_linebuf_func_t * history_inhibit_expansion_function
     This should be set to the address of a function that takes two
     arguments: a `char *' (STRING) and an `int' index into that string
     (I).  It should return a non-zero value if the history expansion
     starting at STRING[I] should not be performed; zero if the
     expansion should be done.  It is intended for use by applications
     like Bash that use the history expansion character for additional
     purposes.  By default, this variable is set to `NULL'.


File: history.info,  Node: History Programming Example,  Prev: History Variables,  Up: Programming with GNU History

2.5 History Programming Example
===============================

The following program demonstrates simple use of the GNU History
Library.

     #include <stdio.h>
     #include <readline/history.h>

     main (argc, argv)
          int argc;
          char **argv;
     {
       char line[1024], *t;
       int len, done = 0;

       line[0] = 0;

       using_history ();
       while (!done)
         {
           printf ("history$ ");
           fflush (stdout);
           t = fgets (line, sizeof (line) - 1, stdin);
           if (t && *t)
             {
               len = strlen (t);
               if (t[len - 1] == '\n')
                 t[len - 1] = '\0';
             }

           if (!t)
             strcpy (line, "quit");

           if (line[0])
             {
               char *expansion;
               int result;

               result = history_expand (line, &expansion);
               if (result)
                 fprintf (stderr, "%s\n", expansion);

               if (result < 0 || result == 2)
                 {
                   free (expansion);
                   continue;
                 }

               add_history (expansion);
               strncpy (line, expansion, sizeof (line) - 1);
               free (expansion);
             }

           if (strcmp (line, "quit") == 0)
             done = 1;
           else if (strcmp (line, "save") == 0)
             write_history ("history_file");
           else if (strcmp (line, "read") == 0)
             read_history ("history_file");
           else if (strcmp (line, "list") == 0)
             {
               register HIST_ENTRY **the_list;
               register int i;

               the_list = history_list ();
               if (the_list)
                 for (i = 0; the_list[i]; i++)
                   printf ("%d: %s\n", i + history_base, the_list[i]->line);
             }
           else if (strncmp (line, "delete", 6) == 0)
             {
               int which;
               if ((sscanf (line + 6, "%d", &which)) == 1)
                 {
                   HIST_ENTRY *entry = remove_history (which);
                   if (!entry)
                     fprintf (stderr, "No such entry %d\n", which);
                   else
                     {
                       free (entry->line);
                       free (entry);
                     }
                 }
               else
                 {
                   fprintf (stderr, "non-numeric arg given to `delete'\n");
                 }
             }
         }
     }


File: history.info,  Node: Copying This Manual,  Next: Concept Index,  Prev: Programming with GNU History,  Up: Top

Appendix A Copying This Manual
******************************

* Menu:

* GNU Free Documentation License::	License for copying this manual.


File: history.info,  Node: GNU Free Documentation License,  Up: Copying This Manual

A.1 GNU Free Documentation License
==================================

                      Version 1.2, November 2002

     Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307, USA

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     functional and useful document "free" in the sense of freedom: to
     assure everyone the effective freedom to copy and redistribute it,
     with or without modifying it, either commercially or
     noncommercially.  Secondarily, this License preserves for the
     author and publisher a way to get credit for their work, while not
     being considered responsible for modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.
     We recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work, in any medium,
     that contains a notice placed by the copyright holder saying it
     can be distributed under the terms of this License.  Such a notice
     grants a world-wide, royalty-free license, unlimited in duration,
     to use that work under the conditions stated herein.  The
     "Document", below, refers to any such manual or work.  Any member
     of the public is a licensee, and is addressed as "you".  You
     accept the license if you copy, modify or distribute the work in a
     way requiring permission under copyright law.

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter section
     of the Document that deals exclusively with the relationship of the
     publishers or authors of the Document to the Document's overall
     subject (or to related matters) and contains nothing that could
     fall directly within that overall subject.  (Thus, if the Document
     is in part a textbook of mathematics, a Secondary Section may not
     explain any mathematics.)  The relationship could be a matter of
     historical connection with the subject or with related matters, or
     of legal, commercial, philosophical, ethical or political position
     regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in
     the notice that says that the Document is released under this
     License.  If a section does not fit the above definition of
     Secondary then it is not allowed to be designated as Invariant.
     The Document may contain zero Invariant Sections.  If the Document
     does not identify any Invariant Sections then there are none.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.  A
     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
     be at most 25 words.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, that is suitable for revising the document
     straightforwardly with generic text editors or (for images
     composed of pixels) generic paint programs or (for drawings) some
     widely available drawing editor, and that is suitable for input to
     text formatters or for automatic translation to a variety of
     formats suitable for input to text formatters.  A copy made in an
     otherwise Transparent file format whose markup, or absence of
     markup, has been arranged to thwart or discourage subsequent
     modification by readers is not Transparent.  An image format is
     not Transparent if used for any substantial amount of text.  A
     copy that is not "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and
     standard-conforming simple HTML, PostScript or PDF designed for
     human modification.  Examples of transparent image formats include
     PNG, XCF and JPG.  Opaque formats include proprietary formats that
     can be read and edited only by proprietary word processors, SGML or
     XML for which the DTD and/or processing tools are not generally
     available, and the machine-generated HTML, PostScript or PDF
     produced by some word processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

     A section "Entitled XYZ" means a named subunit of the Document
     whose title either is precisely XYZ or contains XYZ in parentheses
     following text that translates XYZ in another language.  (Here XYZ
     stands for a specific section name mentioned below, such as
     "Acknowledgements", "Dedications", "Endorsements", or "History".)
     To "Preserve the Title" of such a section when you modify the
     Document means that it remains a section "Entitled XYZ" according
     to this definition.

     The Document may include Warranty Disclaimers next to the notice
     which states that this License applies to the Document.  These
     Warranty Disclaimers are considered to be included by reference in
     this License, but only as regards disclaiming warranties: any other
     implication that these Warranty Disclaimers may have is void and
     has no effect on the meaning of this License.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow
     the conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies (or copies in media that commonly
     have printed covers) of the Document, numbering more than 100, and
     the Document's license notice requires Cover Texts, you must
     enclose the copies in covers that carry, clearly and legibly, all
     these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the
     title equally prominent and visible.  You may add other material
     on the covers in addition.  Copying with changes limited to the
     covers, as long as they preserve the title of the Document and
     satisfy these conditions, can be treated as verbatim copying in
     other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a
     machine-readable Transparent copy along with each Opaque copy, or
     state in or with each Opaque copy a computer-network location from
     which the general network-using public has access to download
     using public-standard network protocols a complete Transparent
     copy of the Document, free of added material.  If you use the
     latter option, you must take reasonably prudent steps, when you
     begin distribution of Opaque copies in quantity, to ensure that
     this Transparent copy will remain thus accessible at the stated
     location until at least one year after the last time you
     distribute an Opaque copy (directly or through your agents or
     retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of
     copies, to give them a chance to provide you with an updated
     version of the Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with
     the Modified Version filling the role of the Document, thus
     licensing distribution and modification of the Modified Version to
     whoever possesses a copy of it.  In addition, you must do these
     things in the Modified Version:

       A. Use in the Title Page (and on the covers, if any) a title
          distinct from that of the Document, and from those of
          previous versions (which should, if there were any, be listed
          in the History section of the Document).  You may use the
          same title as a previous version if the original publisher of
          that version gives permission.

       B. List on the Title Page, as authors, one or more persons or
          entities responsible for authorship of the modifications in
          the Modified Version, together with at least five of the
          principal authors of the Document (all of its principal
          authors, if it has fewer than five), unless they release you
          from this requirement.

       C. State on the Title page the name of the publisher of the
          Modified Version, as the publisher.

       D. Preserve all the copyright notices of the Document.

       E. Add an appropriate copyright notice for your modifications
          adjacent to the other copyright notices.

       F. Include, immediately after the copyright notices, a license
          notice giving the public permission to use the Modified
          Version under the terms of this License, in the form shown in
          the Addendum below.

       G. Preserve in that license notice the full lists of Invariant
          Sections and required Cover Texts given in the Document's
          license notice.

       H. Include an unaltered copy of this License.

       I. Preserve the section Entitled "History", Preserve its Title,
          and add to it an item stating at least the title, year, new
          authors, and publisher of the Modified Version as given on
          the Title Page.  If there is no section Entitled "History" in
          the Document, create one stating the title, year, authors,
          and publisher of the Document as given on its Title Page,
          then add an item describing the Modified Version as stated in
          the previous sentence.

       J. Preserve the network location, if any, given in the Document
          for public access to a Transparent copy of the Document, and
          likewise the network locations given in the Document for
          previous versions it was based on.  These may be placed in
          the "History" section.  You may omit a network location for a
          work that was published at least four years before the
          Document itself, or if the original publisher of the version
          it refers to gives permission.

       K. For any section Entitled "Acknowledgements" or "Dedications",
          Preserve the Title of the section, and preserve in the
          section all the substance and tone of each of the contributor
          acknowledgements and/or dedications given therein.

       L. Preserve all the Invariant Sections of the Document,
          unaltered in their text and in their titles.  Section numbers
          or the equivalent are not considered part of the section
          titles.

       M. Delete any section Entitled "Endorsements".  Such a section
          may not be included in the Modified Version.

       N. Do not retitle any existing section to be Entitled
          "Endorsements" or to conflict in title with any Invariant
          Section.

       O. Preserve any Warranty Disclaimers.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option
     designate some or all of these sections as invariant.  To do this,
     add their titles to the list of Invariant Sections in the Modified
     Version's license notice.  These titles must be distinct from any
     other section titles.

     You may add a section Entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties--for example, statements of peer review or that the text
     has been approved by an organization as the authoritative
     definition of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end
     of the list of Cover Texts in the Modified Version.  Only one
     passage of Front-Cover Text and one of Back-Cover Text may be
     added by (or through arrangements made by) any one entity.  If the
     Document already includes a cover text for the same cover,
     previously added by you or by arrangement made by the same entity
     you are acting on behalf of, you may not add another; but you may
     replace the old one, on explicit permission from the previous
     publisher that added the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination
     all of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice, and that you preserve all
     their Warranty Disclaimers.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections Entitled
     "History" in the various original documents, forming one section
     Entitled "History"; likewise combine any sections Entitled
     "Acknowledgements", and any sections Entitled "Dedications".  You
     must delete all sections Entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the
     documents in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow
     this License in all other respects regarding verbatim copying of
     that document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of
     a storage or distribution medium, is called an "aggregate" if the
     copyright resulting from the compilation is not used to limit the
     legal rights of the compilation's users beyond what the individual
     works permit.  When the Document is included an aggregate, this
     License does not apply to the other works in the aggregate which
     are not themselves derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one half
     of the entire aggregate, the Document's Cover Texts may be placed
     on covers that bracket the Document within the aggregate, or the
     electronic equivalent of covers if the Document is in electronic
     form.  Otherwise they must appear on printed covers that bracket
     the whole aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License, and all the license notices in the
     Document, and any Warranty Disclaimers, provided that you also
     include the original English version of this License and the
     original versions of those notices and disclaimers.  In case of a
     disagreement between the translation and the original version of
     this License or a notice or disclaimer, the original version will
     prevail.

     If a section in the Document is Entitled "Acknowledgements",
     "Dedications", or "History", the requirement (section 4) to
     Preserve its Title (section 1) will typically require changing the
     actual title.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided for under this License.  Any other
     attempt to copy, modify, sublicense or distribute the Document is
     void, and will automatically terminate your rights under this
     License.  However, parties who have received copies, or rights,
     from you under this License will not have their licenses
     terminated so long as such parties remain in full compliance.

 10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     `http://www.gnu.org/copyleft/'.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If
     the Document does not specify a version number of this License,
     you may choose any version ever published (not as a draft) by the
     Free Software Foundation.

A.1.1 ADDENDUM: How to use this License for your documents
----------------------------------------------------------

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.2
       or any later version published by the Free Software Foundation;
       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
       A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.

   If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts." line with this:

         with the Invariant Sections being LIST THEIR TITLES, with
         the Front-Cover Texts being LIST, and with the Back-Cover Texts
         being LIST.

   If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
free software license, such as the GNU General Public License, to
permit their use in free software.


File: history.info,  Node: Concept Index,  Next: Function and Variable Index,  Prev: Copying This Manual,  Up: Top

Appendix B Concept Index
************************

 [index ]
* Menu:

* anchored search:                       Searching the History List.
                                                               (line 10)
* event designators:                     Event Designators.    (line  6)
* FDL, GNU Free Documentation License:   GNU Free Documentation License.
                                                               (line  6)
* history events:                        Event Designators.    (line  7)
* history expansion:                     History Interaction.  (line  6)
* History Searching:                     Searching the History List.
                                                               (line  6)


File: history.info,  Node: Function and Variable Index,  Prev: Concept Index,  Up: Top

Appendix C Function and Variable Index
**************************************

 [index ]
* Menu:

* add_history:                           History List Management.
                                                               (line 10)
* add_history_time:                      History List Management.
                                                               (line 14)
* append_history:                        Managing the History File.
                                                               (line 29)
* clear_history:                         History List Management.
                                                               (line 35)
* current_history:                       Information About the History List.
                                                               (line 18)
* free_history_entry:                    History List Management.
                                                               (line 23)
* get_history_event:                     History Expansion.    (line 31)
* history_arg_extract:                   History Expansion.    (line 46)
* history_base:                          History Variables.    (line 10)
* history_comment_char:                  History Variables.    (line 33)
* history_expand:                        History Expansion.    (line  9)
* history_expansion_char:                History Variables.    (line 25)
* history_get:                           Information About the History List.
                                                               (line 23)
* history_get_history_state:             Initializing History and State Management.
                                                               (line 15)
* history_get_time:                      Information About the History List.
                                                               (line 29)
* history_inhibit_expansion_function:    History Variables.    (line 57)
* history_is_stifled:                    History List Management.
                                                               (line 47)
* history_length:                        History Variables.    (line 13)
* history_list:                          Information About the History List.
                                                               (line 10)
* history_max_entries:                   History Variables.    (line 16)
* history_no_expand_chars:               History Variables.    (line 48)
* history_quotes_inhibit_expansion:      History Variables.    (line 53)
* history_search:                        Searching the History List.
                                                               (line 13)
* history_search_delimiter_chars:        History Variables.    (line 43)
* history_search_pos:                    Searching the History List.
                                                               (line 33)
* history_search_prefix:                 Searching the History List.
                                                               (line 23)
* history_set_history_state:             Initializing History and State Management.
                                                               (line 19)
* history_set_pos:                       Moving Around the History List.
                                                               (line 10)
* history_subst_char:                    History Variables.    (line 29)
* history_tokenize:                      History Expansion.    (line 39)
* history_total_bytes:                   Information About the History List.
                                                               (line 32)
* history_truncate_file:                 Managing the History File.
                                                               (line 35)
* history_word_delimiters:               History Variables.    (line 39)
* history_write_timestamps:              History Variables.    (line 20)
* next_history:                          Moving Around the History List.
                                                               (line 20)
* previous_history:                      Moving Around the History List.
                                                               (line 15)
* read_history:                          Managing the History File.
                                                               (line 10)
* read_history_range:                    Managing the History File.
                                                               (line 16)
* remove_history:                        History List Management.
                                                               (line 18)
* replace_history_entry:                 History List Management.
                                                               (line 29)
* stifle_history:                        History List Management.
                                                               (line 38)
* unstifle_history:                      History List Management.
                                                               (line 41)
* using_history:                         Initializing History and State Management.
                                                               (line 11)
* where_history:                         Information About the History List.
                                                               (line 15)
* write_history:                         Managing the History File.
                                                               (line 23)



Tag Table:
Node: Top1323
Node: Using History Interactively1948
Node: History Interaction2456
Node: Event Designators3880
Node: Word Designators4815
Node: Modifiers6454
Node: Programming with GNU History7681
Node: Introduction to History8413
Node: History Storage10103
Node: History Functions11238
Node: Initializing History and State Management12227
Node: History List Management13039
Node: Information About the History List15071
Node: Moving Around the History List16568
Node: Searching the History List17569
Node: Managing the History File19501
Node: History Expansion21321
Node: History Variables23229
Node: History Programming Example26035
Node: Copying This Manual28712
Node: GNU Free Documentation License28972
Node: Concept Index51378
Node: Function and Variable Index52218

End Tag Table
