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>