Annotation of embedaddon/readline/doc/hstech.texi, revision 1.1

1.1     ! misho       1: @ignore
        !             2: This file documents the user interface to the GNU History library.
        !             3: 
        !             4: Copyright (C) 1988-2014 Free Software Foundation, Inc.
        !             5: Authored by Brian Fox and Chet Ramey.
        !             6: 
        !             7: Permission is granted to make and distribute verbatim copies of this manual
        !             8: provided the copyright notice and this permission notice are preserved on
        !             9: all copies.
        !            10: 
        !            11: Permission is granted to process this file through Tex and print the
        !            12: results, provided the printed document carries copying permission notice
        !            13: identical to this one except for the removal of this paragraph (this
        !            14: paragraph not being relevant to the printed manual).
        !            15: 
        !            16: Permission is granted to copy and distribute modified versions of this
        !            17: manual under the conditions for verbatim copying, provided also that the
        !            18: GNU Copyright statement is available to the distributee, and provided that
        !            19: the entire resulting derived work is distributed under the terms of a
        !            20: permission notice identical to this one.
        !            21: 
        !            22: Permission is granted to copy and distribute translations of this manual
        !            23: into another language, under the above conditions for modified versions.
        !            24: @end ignore
        !            25: 
        !            26: @node Programming with GNU History
        !            27: @chapter Programming with GNU History
        !            28: 
        !            29: This chapter describes how to interface programs that you write
        !            30: with the @sc{gnu} History Library.
        !            31: It should be considered a technical guide.
        !            32: For information on the interactive use of @sc{gnu} History, @pxref{Using
        !            33: History Interactively}.
        !            34: 
        !            35: @menu
        !            36: * Introduction to History::    What is the GNU History library for?
        !            37: * History Storage::            How information is stored.
        !            38: * History Functions::          Functions that you can use.
        !            39: * History Variables::          Variables that control behaviour.
        !            40: * History Programming Example::        Example of using the GNU History Library.
        !            41: @end menu
        !            42: 
        !            43: @node Introduction to History
        !            44: @section Introduction to History
        !            45: 
        !            46: Many programs read input from the user a line at a time.  The @sc{gnu}
        !            47: History library is able to keep track of those lines, associate arbitrary
        !            48: data with each line, and utilize information from previous lines in
        !            49: composing new ones. 
        !            50: 
        !            51: The programmer using the History library has available functions
        !            52: for remembering lines on a history list, associating arbitrary data
        !            53: with a line, removing lines from the list, searching through the list
        !            54: for a line containing an arbitrary text string, and referencing any line
        !            55: in the list directly.  In addition, a history @dfn{expansion} function
        !            56: is available which provides for a consistent user interface across
        !            57: different programs.
        !            58: 
        !            59: The user using programs written with the History library has the
        !            60: benefit of a consistent user interface with a set of well-known
        !            61: commands for manipulating the text of previous lines and using that text
        !            62: in new commands.  The basic history manipulation commands are similar to
        !            63: the history substitution provided by @code{csh}.
        !            64: 
        !            65: If the programmer desires, he can use the Readline library, which
        !            66: includes some history manipulation by default, and has the added
        !            67: advantage of command line editing.
        !            68: 
        !            69: Before declaring any functions using any functionality the History
        !            70: library provides in other code, an application writer should include
        !            71: the file @code{<readline/history.h>} in any file that uses the
        !            72: History library's features.  It supplies extern declarations for all
        !            73: of the library's public functions and variables, and declares all of
        !            74: the public data structures.
        !            75: 
        !            76: @node History Storage
        !            77: @section History Storage
        !            78: 
        !            79: The history list is an array of history entries.  A history entry is
        !            80: declared as follows:
        !            81: 
        !            82: @example
        !            83: typedef void *histdata_t;
        !            84: 
        !            85: typedef struct _hist_entry @{
        !            86:   char *line;
        !            87:   char *timestamp;
        !            88:   histdata_t data;
        !            89: @} HIST_ENTRY;
        !            90: @end example
        !            91: 
        !            92: The history list itself might therefore be declared as
        !            93: 
        !            94: @example
        !            95: HIST_ENTRY **the_history_list;
        !            96: @end example
        !            97: 
        !            98: The state of the History library is encapsulated into a single structure:
        !            99: 
        !           100: @example
        !           101: /*
        !           102:  * A structure used to pass around the current state of the history.
        !           103:  */
        !           104: typedef struct _hist_state @{
        !           105:   HIST_ENTRY **entries; /* Pointer to the entries themselves. */
        !           106:   int offset;           /* The location pointer within this array. */
        !           107:   int length;           /* Number of elements within this array. */
        !           108:   int size;             /* Number of slots allocated to this array. */
        !           109:   int flags;
        !           110: @} HISTORY_STATE;
        !           111: @end example
        !           112: 
        !           113: If the flags member includes @code{HS_STIFLED}, the history has been
        !           114: stifled.
        !           115: 
        !           116: @node History Functions
        !           117: @section History Functions
        !           118: 
        !           119: This section describes the calling sequence for the various functions
        !           120: exported by the @sc{gnu} History library.
        !           121: 
        !           122: @menu
        !           123: * Initializing History and State Management::  Functions to call when you
        !           124:                                                want to use history in a
        !           125:                                                program.
        !           126: * History List Management::            Functions used to manage the list
        !           127:                                        of history entries.
        !           128: * Information About the History List:: Functions returning information about
        !           129:                                        the history list.
        !           130: * Moving Around the History List::     Functions used to change the position
        !           131:                                        in the history list.
        !           132: * Searching the History List::         Functions to search the history list
        !           133:                                        for entries containing a string.
        !           134: * Managing the History File::          Functions that read and write a file
        !           135:                                        containing the history list.
        !           136: * History Expansion::                  Functions to perform csh-like history
        !           137:                                        expansion.
        !           138: @end menu
        !           139: 
        !           140: @node Initializing History and State Management
        !           141: @subsection Initializing History and State Management
        !           142: 
        !           143: This section describes functions used to initialize and manage
        !           144: the state of the History library when you want to use the history
        !           145: functions in your program.
        !           146: 
        !           147: @deftypefun void using_history (void)
        !           148: Begin a session in which the history functions might be used.  This
        !           149: initializes the interactive variables.
        !           150: @end deftypefun
        !           151: 
        !           152: @deftypefun {HISTORY_STATE *} history_get_history_state (void)
        !           153: Return a structure describing the current state of the input history.
        !           154: @end deftypefun
        !           155: 
        !           156: @deftypefun void history_set_history_state (HISTORY_STATE *state)
        !           157: Set the state of the history list according to @var{state}.
        !           158: @end deftypefun
        !           159: 
        !           160: @node History List Management
        !           161: @subsection History List Management
        !           162: 
        !           163: These functions manage individual entries on the history list, or set
        !           164: parameters managing the list itself.
        !           165: 
        !           166: @deftypefun void add_history (const char *string)
        !           167: Place @var{string} at the end of the history list.  The associated data
        !           168: field (if any) is set to @code{NULL}.
        !           169: @end deftypefun
        !           170: 
        !           171: @deftypefun void add_history_time (const char *string)
        !           172: Change the time stamp associated with the most recent history entry to
        !           173: @var{string}.
        !           174: @end deftypefun
        !           175: 
        !           176: @deftypefun {HIST_ENTRY *} remove_history (int which)
        !           177: Remove history entry at offset @var{which} from the history.  The
        !           178: removed element is returned so you can free the line, data,
        !           179: and containing structure.
        !           180: @end deftypefun
        !           181: 
        !           182: @deftypefun {histdata_t} free_history_entry (HIST_ENTRY *histent)
        !           183: Free the history entry @var{histent} and any history library private
        !           184: data associated with it.  Returns the application-specific data
        !           185: so the caller can dispose of it.
        !           186: @end deftypefun
        !           187: 
        !           188: @deftypefun {HIST_ENTRY *} replace_history_entry (int which, const char *line, histdata_t data)
        !           189: Make the history entry at offset @var{which} have @var{line} and @var{data}.
        !           190: This returns the old entry so the caller can dispose of any
        !           191: application-specific data.  In the case
        !           192: of an invalid @var{which}, a @code{NULL} pointer is returned.
        !           193: @end deftypefun
        !           194: 
        !           195: @deftypefun void clear_history (void)
        !           196: Clear the history list by deleting all the entries.
        !           197: @end deftypefun
        !           198: 
        !           199: @deftypefun void stifle_history (int max)
        !           200: Stifle the history list, remembering only the last @var{max} entries.
        !           201: @end deftypefun
        !           202: 
        !           203: @deftypefun int unstifle_history (void)
        !           204: Stop stifling the history.  This returns the previously-set
        !           205: maximum number of history entries (as set by @code{stifle_history()}).
        !           206: The value is positive if the history was
        !           207: stifled, negative if it wasn't.
        !           208: @end deftypefun
        !           209: 
        !           210: @deftypefun int history_is_stifled (void)
        !           211: Returns non-zero if the history is stifled, zero if it is not.
        !           212: @end deftypefun
        !           213: 
        !           214: @node Information About the History List
        !           215: @subsection Information About the History List
        !           216: 
        !           217: These functions return information about the entire history list or
        !           218: individual list entries.
        !           219: 
        !           220: @deftypefun {HIST_ENTRY **} history_list (void)
        !           221: Return a @code{NULL} terminated array of @code{HIST_ENTRY *} which is the
        !           222: current input history.  Element 0 of this list is the beginning of time.
        !           223: If there is no history, return @code{NULL}.
        !           224: @end deftypefun
        !           225: 
        !           226: @deftypefun int where_history (void)
        !           227: Returns the offset of the current history element.
        !           228: @end deftypefun
        !           229: 
        !           230: @deftypefun {HIST_ENTRY *} current_history (void)
        !           231: Return the history entry at the current position, as determined by
        !           232: @code{where_history()}.  If there is no entry there, return a @code{NULL}
        !           233: pointer.
        !           234: @end deftypefun
        !           235: 
        !           236: @deftypefun {HIST_ENTRY *} history_get (int offset)
        !           237: Return the history entry at position @var{offset}, starting from
        !           238: @code{history_base} (@pxref{History Variables}).
        !           239: If there is no entry there, or if @var{offset}
        !           240: is greater than the history length, return a @code{NULL} pointer.
        !           241: @end deftypefun
        !           242: 
        !           243: @deftypefun time_t history_get_time (HIST_ENTRY *entry)
        !           244: Return the time stamp associated with the history entry @var{entry}.
        !           245: @end deftypefun
        !           246: 
        !           247: @deftypefun int history_total_bytes (void)
        !           248: Return the number of bytes that the primary history entries are using.
        !           249: This function returns the sum of the lengths of all the lines in the
        !           250: history.
        !           251: @end deftypefun
        !           252: 
        !           253: @node Moving Around the History List
        !           254: @subsection Moving Around the History List
        !           255: 
        !           256: These functions allow the current index into the history list to be
        !           257: set or changed.
        !           258: 
        !           259: @deftypefun int history_set_pos (int pos)
        !           260: Set the current history offset to @var{pos}, an absolute index
        !           261: into the list.
        !           262: Returns 1 on success, 0 if @var{pos} is less than zero or greater
        !           263: than the number of history entries.
        !           264: @end deftypefun
        !           265: 
        !           266: @deftypefun {HIST_ENTRY *} previous_history (void)
        !           267: Back up the current history offset to the previous history entry, and
        !           268: return a pointer to that entry.  If there is no previous entry, return
        !           269: a @code{NULL} pointer.
        !           270: @end deftypefun
        !           271: 
        !           272: @deftypefun {HIST_ENTRY *} next_history (void)
        !           273: Move the current history offset forward to the next history entry, and
        !           274: return the a pointer to that entry.  If there is no next entry, return
        !           275: a @code{NULL} pointer.
        !           276: @end deftypefun
        !           277: 
        !           278: @node Searching the History List
        !           279: @subsection Searching the History List
        !           280: @cindex History Searching
        !           281: 
        !           282: These functions allow searching of the history list for entries containing
        !           283: a specific string.  Searching may be performed both forward and backward
        !           284: from the current history position.  The search may be @dfn{anchored},
        !           285: meaning that the string must match at the beginning of the history entry.
        !           286: @cindex anchored search
        !           287: 
        !           288: @deftypefun int history_search (const char *string, int direction)
        !           289: Search the history for @var{string}, starting at the current history offset.
        !           290: If @var{direction} is less than 0, then the search is through
        !           291: previous entries, otherwise through subsequent entries.
        !           292: If @var{string} is found, then
        !           293: the current history index is set to that history entry, and the value
        !           294: returned is the offset in the line of the entry where
        !           295: @var{string} was found.  Otherwise, nothing is changed, and a -1 is
        !           296: returned.
        !           297: @end deftypefun
        !           298: 
        !           299: @deftypefun int history_search_prefix (const char *string, int direction)
        !           300: Search the history for @var{string}, starting at the current history
        !           301: offset.  The search is anchored: matching lines must begin with
        !           302: @var{string}.  If @var{direction} is less than 0, then the search is
        !           303: through previous entries, otherwise through subsequent entries.
        !           304: If @var{string} is found, then the
        !           305: current history index is set to that entry, and the return value is 0. 
        !           306: Otherwise, nothing is changed, and a -1 is returned. 
        !           307: @end deftypefun
        !           308: 
        !           309: @deftypefun int history_search_pos (const char *string, int direction, int pos)
        !           310: Search for @var{string} in the history list, starting at @var{pos}, an
        !           311: absolute index into the list.  If @var{direction} is negative, the search
        !           312: proceeds backward from @var{pos}, otherwise forward.  Returns the absolute
        !           313: index of the history element where @var{string} was found, or -1 otherwise.
        !           314: @end deftypefun
        !           315: 
        !           316: @node Managing the History File
        !           317: @subsection Managing the History File
        !           318: 
        !           319: The History library can read the history from and write it to a file.
        !           320: This section documents the functions for managing a history file.
        !           321: 
        !           322: @deftypefun int read_history (const char *filename)
        !           323: Add the contents of @var{filename} to the history list, a line at a time.
        !           324: If @var{filename} is @code{NULL}, then read from @file{~/.history}.
        !           325: Returns 0 if successful, or @code{errno} if not.
        !           326: @end deftypefun
        !           327: 
        !           328: @deftypefun int read_history_range (const char *filename, int from, int to)
        !           329: Read a range of lines from @var{filename}, adding them to the history list.
        !           330: Start reading at line @var{from} and end at @var{to}.
        !           331: If @var{from} is zero, start at the beginning.  If @var{to} is less than
        !           332: @var{from}, then read until the end of the file.  If @var{filename} is
        !           333: @code{NULL}, then read from @file{~/.history}.  Returns 0 if successful,
        !           334: or @code{errno} if not.
        !           335: @end deftypefun
        !           336: 
        !           337: @deftypefun int write_history (const char *filename)
        !           338: Write the current history to @var{filename}, overwriting @var{filename}
        !           339: if necessary.
        !           340: If @var{filename} is @code{NULL}, then write the history list to
        !           341: @file{~/.history}.
        !           342: Returns 0 on success, or @code{errno} on a read or write error.
        !           343: @end deftypefun
        !           344: 
        !           345: @deftypefun int append_history (int nelements, const char *filename)
        !           346: Append the last @var{nelements} of the history list to @var{filename}.
        !           347: If @var{filename} is @code{NULL}, then append to @file{~/.history}.
        !           348: Returns 0 on success, or @code{errno} on a read or write error.
        !           349: @end deftypefun
        !           350: 
        !           351: @deftypefun int history_truncate_file (const char *filename, int nlines)
        !           352: Truncate the history file @var{filename}, leaving only the last
        !           353: @var{nlines} lines.
        !           354: If @var{filename} is @code{NULL}, then @file{~/.history} is truncated.
        !           355: Returns 0 on success, or @code{errno} on failure.
        !           356: @end deftypefun
        !           357: 
        !           358: @node History Expansion
        !           359: @subsection History Expansion
        !           360: 
        !           361: These functions implement history expansion.
        !           362: 
        !           363: @deftypefun int history_expand (char *string, char **output)
        !           364: Expand @var{string}, placing the result into @var{output}, a pointer
        !           365: to a string (@pxref{History Interaction}).  Returns:
        !           366: @table @code
        !           367: @item 0
        !           368: If no expansions took place (or, if the only change in
        !           369: the text was the removal of escape characters preceding the history expansion
        !           370: character);
        !           371: @item 1
        !           372: if expansions did take place;
        !           373: @item -1
        !           374: if there was an error in expansion;
        !           375: @item 2
        !           376: if the returned line should be displayed, but not executed,
        !           377: as with the @code{:p} modifier (@pxref{Modifiers}).
        !           378: @end table
        !           379: 
        !           380: If an error occurred in expansion, then @var{output} contains a descriptive
        !           381: error message.
        !           382: @end deftypefun
        !           383: 
        !           384: @deftypefun {char *} get_history_event (const char *string, int *cindex, int qchar)
        !           385: Returns the text of the history event beginning at @var{string} +
        !           386: @var{*cindex}.  @var{*cindex} is modified to point to after the event
        !           387: specifier.  At function entry, @var{cindex} points to the index into
        !           388: @var{string} where the history event specification begins.  @var{qchar}
        !           389: is a character that is allowed to end the event specification in addition
        !           390: to the ``normal'' terminating characters.
        !           391: @end deftypefun
        !           392: 
        !           393: @deftypefun {char **} history_tokenize (const char *string)
        !           394: Return an array of tokens parsed out of @var{string}, much as the
        !           395: shell might.  The tokens are split on the characters in the
        !           396: @var{history_word_delimiters} variable,
        !           397: and shell quoting conventions are obeyed.
        !           398: @end deftypefun
        !           399: 
        !           400: @deftypefun {char *} history_arg_extract (int first, int last, const char *string)
        !           401: Extract a string segment consisting of the @var{first} through @var{last}
        !           402: arguments present in @var{string}.  Arguments are split using
        !           403: @code{history_tokenize}.
        !           404: @end deftypefun
        !           405: 
        !           406: @node History Variables
        !           407: @section History Variables
        !           408: 
        !           409: This section describes the externally-visible variables exported by
        !           410: the @sc{gnu} History Library.
        !           411: 
        !           412: @deftypevar int history_base
        !           413: The logical offset of the first entry in the history list.
        !           414: @end deftypevar
        !           415: 
        !           416: @deftypevar int history_length
        !           417: The number of entries currently stored in the history list.
        !           418: @end deftypevar
        !           419: 
        !           420: @deftypevar int history_max_entries
        !           421: The maximum number of history entries.  This must be changed using
        !           422: @code{stifle_history()}.
        !           423: @end deftypevar
        !           424: 
        !           425: @deftypevar int history_write_timestamps
        !           426: If non-zero, timestamps are written to the history file, so they can be
        !           427: preserved between sessions.  The default value is 0, meaning that
        !           428: timestamps are not saved.
        !           429: 
        !           430: The current timestamp format uses the value of @var{history_comment_char}
        !           431: to delimit timestamp entries in the history file.  If that variable does
        !           432: not have a value (the default), timestamps will not be written.
        !           433: @end deftypevar
        !           434: 
        !           435: @deftypevar char history_expansion_char
        !           436: The character that introduces a history event.  The default is @samp{!}.
        !           437: Setting this to 0 inhibits history expansion.
        !           438: @end deftypevar
        !           439: 
        !           440: @deftypevar char history_subst_char
        !           441: The character that invokes word substitution if found at the start of
        !           442: a line.  The default is @samp{^}.
        !           443: @end deftypevar
        !           444: 
        !           445: @deftypevar char history_comment_char
        !           446: During tokenization, if this character is seen as the first character
        !           447: of a word, then it and all subsequent characters up to a newline are
        !           448: ignored, suppressing history expansion for the remainder of the line.
        !           449: This is disabled by default.
        !           450: @end deftypevar
        !           451: 
        !           452: @deftypevar {char *} history_word_delimiters
        !           453: The characters that separate tokens for @code{history_tokenize()}.
        !           454: The default value is @code{" \t\n()<>;&|"}.
        !           455: @end deftypevar
        !           456: 
        !           457: @deftypevar {char *} history_search_delimiter_chars
        !           458: The list of additional characters which can delimit a history search
        !           459: string, in addition to space, TAB, @samp{:} and @samp{?} in the case of
        !           460: a substring search.  The default is empty.
        !           461: @end deftypevar
        !           462: 
        !           463: @deftypevar {char *} history_no_expand_chars
        !           464: The list of characters which inhibit history expansion if found immediately
        !           465: following @var{history_expansion_char}.  The default is space, tab, newline,
        !           466: carriage return, and @samp{=}.
        !           467: @end deftypevar
        !           468: 
        !           469: @deftypevar int history_quotes_inhibit_expansion
        !           470: If non-zero, single-quoted words are not scanned for the history expansion
        !           471: character.  The default value is 0.
        !           472: @end deftypevar
        !           473: 
        !           474: @deftypevar {rl_linebuf_func_t *} history_inhibit_expansion_function
        !           475: This should be set to the address of a function that takes two arguments:
        !           476: a @code{char *} (@var{string})
        !           477: and an @code{int} index into that string (@var{i}).
        !           478: It should return a non-zero value if the history expansion starting at
        !           479: @var{string[i]} should not be performed; zero if the expansion should
        !           480: be done.
        !           481: It is intended for use by applications like Bash that use the history
        !           482: expansion character for additional purposes.
        !           483: By default, this variable is set to @code{NULL}.
        !           484: @end deftypevar
        !           485: 
        !           486: @node History Programming Example
        !           487: @section History Programming Example
        !           488: 
        !           489: The following program demonstrates simple use of the @sc{gnu} History Library.
        !           490: 
        !           491: @smallexample
        !           492: #include <stdio.h>
        !           493: #include <readline/history.h>
        !           494: 
        !           495: main (argc, argv)
        !           496:      int argc;
        !           497:      char **argv;
        !           498: @{
        !           499:   char line[1024], *t;
        !           500:   int len, done = 0;
        !           501: 
        !           502:   line[0] = 0;
        !           503: 
        !           504:   using_history ();
        !           505:   while (!done)
        !           506:     @{
        !           507:       printf ("history$ ");
        !           508:       fflush (stdout);
        !           509:       t = fgets (line, sizeof (line) - 1, stdin);
        !           510:       if (t && *t)
        !           511:         @{
        !           512:           len = strlen (t);
        !           513:           if (t[len - 1] == '\n')
        !           514:             t[len - 1] = '\0';
        !           515:         @}
        !           516: 
        !           517:       if (!t)
        !           518:         strcpy (line, "quit");
        !           519: 
        !           520:       if (line[0])
        !           521:         @{
        !           522:           char *expansion;
        !           523:           int result;
        !           524: 
        !           525:           result = history_expand (line, &expansion);
        !           526:           if (result)
        !           527:             fprintf (stderr, "%s\n", expansion);
        !           528: 
        !           529:           if (result < 0 || result == 2)
        !           530:             @{
        !           531:               free (expansion);
        !           532:               continue;
        !           533:             @}
        !           534: 
        !           535:           add_history (expansion);
        !           536:           strncpy (line, expansion, sizeof (line) - 1);
        !           537:           free (expansion);
        !           538:         @}
        !           539: 
        !           540:       if (strcmp (line, "quit") == 0)
        !           541:         done = 1;
        !           542:       else if (strcmp (line, "save") == 0)
        !           543:         write_history ("history_file");
        !           544:       else if (strcmp (line, "read") == 0)
        !           545:         read_history ("history_file");
        !           546:       else if (strcmp (line, "list") == 0)
        !           547:         @{
        !           548:           register HIST_ENTRY **the_list;
        !           549:           register int i;
        !           550: 
        !           551:           the_list = history_list ();
        !           552:           if (the_list)
        !           553:             for (i = 0; the_list[i]; i++)
        !           554:               printf ("%d: %s\n", i + history_base, the_list[i]->line);
        !           555:         @}
        !           556:       else if (strncmp (line, "delete", 6) == 0)
        !           557:         @{
        !           558:           int which;
        !           559:           if ((sscanf (line + 6, "%d", &which)) == 1)
        !           560:             @{
        !           561:               HIST_ENTRY *entry = remove_history (which);
        !           562:               if (!entry)
        !           563:                 fprintf (stderr, "No such entry %d\n", which);
        !           564:               else
        !           565:                 @{
        !           566:                   free (entry->line);
        !           567:                   free (entry);
        !           568:                 @}
        !           569:             @}
        !           570:           else
        !           571:             @{
        !           572:               fprintf (stderr, "non-numeric arg given to `delete'\n");
        !           573:             @}
        !           574:         @}
        !           575:     @}
        !           576: @}
        !           577: @end smallexample

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>