1063 lines
29 KiB
HTML
1063 lines
29 KiB
HTML
<HTML>
|
|
<HEAD>
|
|
<!-- This HTML file has been created by texi2html 1.51
|
|
from /usr/homes/chet/src/bash/readline-2.1/doc/hist.texinfo on 3 June 1997 -->
|
|
|
|
<TITLE>GNU History Library</TITLE>
|
|
</HEAD>
|
|
<BODY>
|
|
<H1>GNU History Library</H1>
|
|
<H2>Edition 2.1, for <CODE>History Library</CODE> Version 2.1.</H2>
|
|
<H2>March 1996</H2>
|
|
<ADDRESS>Brian Fox, Free Software Foundation</ADDRESS>
|
|
<ADDRESS>Chet Ramey, Case Western Reserve University</ADDRESS>
|
|
<P>
|
|
<P><HR><P>
|
|
|
|
<P>
|
|
This document describes the GNU History library, a programming tool that
|
|
provides a consistent user interface for recalling lines of previously
|
|
typed input.
|
|
|
|
</P>
|
|
<P>
|
|
Published by the Free Software Foundation <BR>
|
|
675 Massachusetts Avenue, <BR>
|
|
Cambridge, MA 02139 USA
|
|
|
|
</P>
|
|
<P>
|
|
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.
|
|
|
|
</P>
|
|
<P>
|
|
Permission is granted to copy and distribute modified versions of this
|
|
manual under the conditions for verbatim copying, provided that the entire
|
|
resulting derived work is distributed under the terms of a permission
|
|
notice identical to this one.
|
|
|
|
</P>
|
|
<P>
|
|
Permission is granted to copy and distribute translations of this manual
|
|
into another language, under the above conditions for modified versions,
|
|
except that this permission notice may be stated in a translation approved
|
|
by the Foundation.
|
|
|
|
</P>
|
|
<P>
|
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
|
|
|
</P>
|
|
|
|
|
|
|
|
<H1><A NAME="SEC1" HREF="history_toc.html#TOC1">Using History Interactively</A></H1>
|
|
|
|
<P>
|
|
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,
|
|
see section <A HREF="history.html#SEC6">Programming with GNU History</A>.
|
|
|
|
</P>
|
|
|
|
|
|
|
|
<H2><A NAME="SEC2" HREF="history_toc.html#TOC2">Interactive History Expansion</A></H2>
|
|
<P>
|
|
<A NAME="IDX1"></A>
|
|
|
|
</P>
|
|
<P>
|
|
The History library provides a history expansion feature that is similar
|
|
to the history expansion provided by <CODE>csh</CODE>. This section
|
|
describes the syntax used to manipulate the history information.
|
|
|
|
</P>
|
|
<P>
|
|
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.
|
|
|
|
</P>
|
|
<P>
|
|
History expansion takes place in two parts. The first is to determine
|
|
which line from the previous history 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 previous history is called the
|
|
<STRONG>event</STRONG>, and the portions of that line that are acted upon are
|
|
called <STRONG>words</STRONG>. Various <STRONG>modifiers</STRONG> are available to manipulate
|
|
the selected words. The line is broken into words in the same fashion
|
|
that Bash does, so that several English (or Unix) words
|
|
surrounded by quotes are considered as one word.
|
|
History expansions are introduced by the appearance of the
|
|
history expansion character, which is <SAMP>`!'</SAMP> by default.
|
|
|
|
</P>
|
|
|
|
|
|
|
|
<H3><A NAME="SEC3" HREF="history_toc.html#TOC3">Event Designators</A></H3>
|
|
<P>
|
|
<A NAME="IDX2"></A>
|
|
|
|
</P>
|
|
<P>
|
|
An event designator is a reference to a command line entry in the
|
|
history list.
|
|
<A NAME="IDX3"></A>
|
|
|
|
</P>
|
|
<DL COMPACT>
|
|
|
|
<DT><CODE>!</CODE>
|
|
<DD>
|
|
Start a history substitution, except when followed by a space, tab,
|
|
the end of the line, <KBD>=</KBD> or <KBD>(</KBD>.
|
|
|
|
<DT><CODE>!<VAR>n</VAR></CODE>
|
|
<DD>
|
|
Refer to command line <VAR>n</VAR>.
|
|
|
|
<DT><CODE>!-<VAR>n</VAR></CODE>
|
|
<DD>
|
|
Refer to the command <VAR>n</VAR> lines back.
|
|
|
|
<DT><CODE>!!</CODE>
|
|
<DD>
|
|
Refer to the previous command. This is a synonym for <SAMP>`!-1'</SAMP>.
|
|
|
|
<DT><CODE>!<VAR>string</VAR></CODE>
|
|
<DD>
|
|
Refer to the most recent command starting with <VAR>string</VAR>.
|
|
|
|
<DT><CODE>!?<VAR>string</VAR>[?]</CODE>
|
|
<DD>
|
|
Refer to the most recent command containing <VAR>string</VAR>. The trailing
|
|
<SAMP>`?'</SAMP> may be omitted if the <VAR>string</VAR> is followed immediately by
|
|
a newline.
|
|
|
|
<DT><CODE>^<VAR>string1</VAR>^<VAR>string2</VAR>^</CODE>
|
|
<DD>
|
|
Quick Substitution. Repeat the last command, replacing <VAR>string1</VAR>
|
|
with <VAR>string2</VAR>. Equivalent to
|
|
<CODE>!!:s/<VAR>string1</VAR>/<VAR>string2</VAR>/</CODE>.
|
|
|
|
<DT><CODE>!#</CODE>
|
|
<DD>
|
|
The entire command line typed so far.
|
|
|
|
</DL>
|
|
|
|
|
|
|
|
<H3><A NAME="SEC4" HREF="history_toc.html#TOC4">Word Designators</A></H3>
|
|
|
|
<P>
|
|
Word designators are used to select desired words from the event.
|
|
A <SAMP>`:'</SAMP> separates the event specification from the word designator. It
|
|
can be omitted if the word designator begins with a <SAMP>`^'</SAMP>, <SAMP>`$'</SAMP>,
|
|
<SAMP>`*'</SAMP>, <SAMP>`-'</SAMP>, or <SAMP>`%'</SAMP>. 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.
|
|
|
|
</P>
|
|
<DL COMPACT>
|
|
|
|
<DT><CODE>0 (zero)</CODE>
|
|
<DD>
|
|
The <CODE>0</CODE>th word. For many applications, this is the command word.
|
|
|
|
<DT><CODE><VAR>n</VAR></CODE>
|
|
<DD>
|
|
The <VAR>n</VAR>th word.
|
|
|
|
<DT><CODE>^</CODE>
|
|
<DD>
|
|
The first argument; that is, word 1.
|
|
|
|
<DT><CODE>$</CODE>
|
|
<DD>
|
|
The last argument.
|
|
|
|
<DT><CODE>%</CODE>
|
|
<DD>
|
|
The word matched by the most recent <SAMP>`?<VAR>string</VAR>?'</SAMP> search.
|
|
|
|
<DT><CODE><VAR>x</VAR>-<VAR>y</VAR></CODE>
|
|
<DD>
|
|
A range of words; <SAMP>`-<VAR>y</VAR>'</SAMP> abbreviates <SAMP>`0-<VAR>y</VAR>'</SAMP>.
|
|
|
|
<DT><CODE>*</CODE>
|
|
<DD>
|
|
All of the words, except the <CODE>0</CODE>th. This is a synonym for <SAMP>`1-$'</SAMP>.
|
|
It is not an error to use <SAMP>`*'</SAMP> if there is just one word in the event;
|
|
the empty string is returned in that case.
|
|
|
|
<DT><CODE><VAR>x</VAR>*</CODE>
|
|
<DD>
|
|
Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP>
|
|
|
|
<DT><CODE><VAR>x</VAR>-</CODE>
|
|
<DD>
|
|
Abbreviates <SAMP>`<VAR>x</VAR>-$'</SAMP> like <SAMP>`<VAR>x</VAR>*'</SAMP>, but omits the last word.
|
|
|
|
</DL>
|
|
|
|
<P>
|
|
If a word designator is supplied without an event specification, the
|
|
previous command is used as the event.
|
|
|
|
</P>
|
|
|
|
|
|
<H3><A NAME="SEC5" HREF="history_toc.html#TOC5">Modifiers</A></H3>
|
|
|
|
<P>
|
|
After the optional word designator, you can add a sequence of one or more
|
|
of the following modifiers, each preceded by a <SAMP>`:'</SAMP>.
|
|
|
|
</P>
|
|
<DL COMPACT>
|
|
|
|
<DT><CODE>h</CODE>
|
|
<DD>
|
|
Remove a trailing pathname component, leaving only the head.
|
|
|
|
<DT><CODE>t</CODE>
|
|
<DD>
|
|
Remove all leading pathname components, leaving the tail.
|
|
|
|
<DT><CODE>r</CODE>
|
|
<DD>
|
|
Remove a trailing suffix of the form <SAMP>`.<VAR>suffix</VAR>'</SAMP>, leaving
|
|
the basename.
|
|
|
|
<DT><CODE>e</CODE>
|
|
<DD>
|
|
Remove all but the trailing suffix.
|
|
|
|
<DT><CODE>p</CODE>
|
|
<DD>
|
|
Print the new command but do not execute it.
|
|
|
|
<DT><CODE>s/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>
|
|
<DD>
|
|
Substitute <VAR>new</VAR> for the first occurrence of <VAR>old</VAR> in the
|
|
event line. Any delimiter may be used in place of <SAMP>`/'</SAMP>.
|
|
The delimiter may be quoted in <VAR>old</VAR> and <VAR>new</VAR>
|
|
with a single backslash. If <SAMP>`&'</SAMP> appears in <VAR>new</VAR>,
|
|
it is replaced by <VAR>old</VAR>. A single backslash will quote
|
|
the <SAMP>`&'</SAMP>. The final delimiter is optional if it is the last
|
|
character on the input line.
|
|
|
|
<DT><CODE>&</CODE>
|
|
<DD>
|
|
Repeat the previous substitution.
|
|
|
|
<DT><CODE>g</CODE>
|
|
<DD>
|
|
Cause changes to be applied over the entire event line. Used in
|
|
conjunction with <SAMP>`s'</SAMP>, as in <CODE>gs/<VAR>old</VAR>/<VAR>new</VAR>/</CODE>,
|
|
or with <SAMP>`&'</SAMP>.
|
|
|
|
</DL>
|
|
|
|
|
|
|
|
<H1><A NAME="SEC6" HREF="history_toc.html#TOC6">Programming with GNU History</A></H1>
|
|
|
|
<P>
|
|
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, see section <A HREF="history.html#SEC1">Using History Interactively</A>.
|
|
|
|
</P>
|
|
|
|
|
|
|
|
<H2><A NAME="SEC7" HREF="history_toc.html#TOC7">Introduction to History</A></H2>
|
|
|
|
<P>
|
|
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.
|
|
|
|
</P>
|
|
<P>
|
|
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 <STRONG>expansion</STRONG> function
|
|
is available which provides for a consistent user interface across
|
|
different programs.
|
|
|
|
</P>
|
|
<P>
|
|
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 <CODE>csh</CODE>.
|
|
|
|
</P>
|
|
<P>
|
|
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.
|
|
|
|
</P>
|
|
|
|
|
|
<H2><A NAME="SEC8" HREF="history_toc.html#TOC8">History Storage</A></H2>
|
|
|
|
<P>
|
|
The history list is an array of history entries. A history entry is
|
|
declared as follows:
|
|
|
|
</P>
|
|
|
|
<PRE>
|
|
typedef struct _hist_entry {
|
|
char *line;
|
|
char *data;
|
|
} HIST_ENTRY;
|
|
</PRE>
|
|
|
|
<P>
|
|
The history list itself might therefore be declared as
|
|
|
|
</P>
|
|
|
|
<PRE>
|
|
HIST_ENTRY **the_history_list;
|
|
</PRE>
|
|
|
|
<P>
|
|
The state of the History library is encapsulated into a single structure:
|
|
|
|
</P>
|
|
|
|
<PRE>
|
|
/* A structure used to pass the current state of the history stuff around. */
|
|
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;
|
|
</PRE>
|
|
|
|
<P>
|
|
If the flags member includes <CODE>HS_STIFLED</CODE>, the history has been
|
|
stifled.
|
|
|
|
</P>
|
|
|
|
|
|
<H2><A NAME="SEC9" HREF="history_toc.html#TOC9">History Functions</A></H2>
|
|
|
|
<P>
|
|
This section describes the calling sequence for the various functions
|
|
present in GNU History.
|
|
|
|
</P>
|
|
|
|
|
|
|
|
<H3><A NAME="SEC10" HREF="history_toc.html#TOC10">Initializing History and State Management</A></H3>
|
|
|
|
<P>
|
|
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.
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> void <B>using_history</B> <I>()</I>
|
|
<DD><A NAME="IDX4"></A>
|
|
Begin a session in which the history functions might be used. This
|
|
initializes the interactive variables.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HISTORY_STATE * <B>history_get_history_state</B> <I>()</I>
|
|
<DD><A NAME="IDX5"></A>
|
|
Return a structure describing the current state of the input history.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> void <B>history_set_history_state</B> <I>(HISTORY_STATE *state)</I>
|
|
<DD><A NAME="IDX6"></A>
|
|
Set the state of the history list according to <VAR>state</VAR>.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H3><A NAME="SEC11" HREF="history_toc.html#TOC11">History List Management</A></H3>
|
|
|
|
<P>
|
|
These functions manage individual entries on the history list, or set
|
|
parameters managing the list itself.
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> void <B>add_history</B> <I>(char *string)</I>
|
|
<DD><A NAME="IDX7"></A>
|
|
Place <VAR>string</VAR> at the end of the history list. The associated data
|
|
field (if any) is set to <CODE>NULL</CODE>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HIST_ENTRY * <B>remove_history</B> <I>(int which)</I>
|
|
<DD><A NAME="IDX8"></A>
|
|
Remove history entry at offset <VAR>which</VAR> from the history. The
|
|
removed element is returned so you can free the line, data,
|
|
and containing structure.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HIST_ENTRY * <B>replace_history_entry</B> <I>(int which, char *line, char *data)</I>
|
|
<DD><A NAME="IDX9"></A>
|
|
Make the history entry at offset <VAR>which</VAR> have <VAR>line</VAR> and <VAR>data</VAR>.
|
|
This returns the old entry so you can dispose of the data. In the case
|
|
of an invalid <VAR>which</VAR>, a <CODE>NULL</CODE> pointer is returned.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> void <B>clear_history</B> <I>()</I>
|
|
<DD><A NAME="IDX10"></A>
|
|
Clear the history list by deleting all the entries.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> void <B>stifle_history</B> <I>(int max)</I>
|
|
<DD><A NAME="IDX11"></A>
|
|
Stifle the history list, remembering only the last <VAR>max</VAR> entries.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>unstifle_history</B> <I>()</I>
|
|
<DD><A NAME="IDX12"></A>
|
|
Stop stifling the history. This returns the previous amount the
|
|
history was stifled. The value is positive if the history was
|
|
stifled, negative if it wasn't.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_is_stifled</B> <I>()</I>
|
|
<DD><A NAME="IDX13"></A>
|
|
Returns non-zero if the history is stifled, zero if it is not.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H3><A NAME="SEC12" HREF="history_toc.html#TOC12">Information About the History List</A></H3>
|
|
|
|
<P>
|
|
These functions return information about the entire history list or
|
|
individual list entries.
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HIST_ENTRY ** <B>history_list</B> <I>()</I>
|
|
<DD><A NAME="IDX14"></A>
|
|
Return a <CODE>NULL</CODE> terminated array of <CODE>HIST_ENTRY</CODE> which is the
|
|
current input history. Element 0 of this list is the beginning of time.
|
|
If there is no history, return <CODE>NULL</CODE>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>where_history</B> <I>()</I>
|
|
<DD><A NAME="IDX15"></A>
|
|
Returns the offset of the current history element.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HIST_ENTRY * <B>current_history</B> <I>()</I>
|
|
<DD><A NAME="IDX16"></A>
|
|
Return the history entry at the current position, as determined by
|
|
<CODE>where_history ()</CODE>. If there is no entry there, return a <CODE>NULL</CODE>
|
|
pointer.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HIST_ENTRY * <B>history_get</B> <I>(int offset)</I>
|
|
<DD><A NAME="IDX17"></A>
|
|
Return the history entry at position <VAR>offset</VAR>, starting from
|
|
<CODE>history_base</CODE>. If there is no entry there, or if <VAR>offset</VAR>
|
|
is greater than the history length, return a <CODE>NULL</CODE> pointer.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_total_bytes</B> <I>()</I>
|
|
<DD><A NAME="IDX18"></A>
|
|
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.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H3><A NAME="SEC13" HREF="history_toc.html#TOC13">Moving Around the History List</A></H3>
|
|
|
|
<P>
|
|
These functions allow the current index into the history list to be
|
|
set or changed.
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_set_pos</B> <I>(int pos)</I>
|
|
<DD><A NAME="IDX19"></A>
|
|
Set the position in the history list to <VAR>pos</VAR>, an absolute index
|
|
into the list.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HIST_ENTRY * <B>previous_history</B> <I>()</I>
|
|
<DD><A NAME="IDX20"></A>
|
|
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 <CODE>NULL</CODE> pointer.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> HIST_ENTRY * <B>next_history</B> <I>()</I>
|
|
<DD><A NAME="IDX21"></A>
|
|
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 <CODE>NULL</CODE> pointer.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H3><A NAME="SEC14" HREF="history_toc.html#TOC14">Searching the History List</A></H3>
|
|
<P>
|
|
<A NAME="IDX22"></A>
|
|
|
|
</P>
|
|
<P>
|
|
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 <STRONG>anchored</STRONG>,
|
|
meaning that the string must match at the beginning of the history entry.
|
|
<A NAME="IDX23"></A>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_search</B> <I>(char *string, int direction)</I>
|
|
<DD><A NAME="IDX24"></A>
|
|
Search the history for <VAR>string</VAR>, starting at the current history
|
|
offset. If <VAR>direction</VAR> < 0, then the search is through previous entries,
|
|
else through subsequent. If <VAR>string</VAR> 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
|
|
<VAR>string</VAR> was found. Otherwise, nothing is changed, and a -1 is
|
|
returned.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_search_prefix</B> <I>(char *string, int direction)</I>
|
|
<DD><A NAME="IDX25"></A>
|
|
Search the history for <VAR>string</VAR>, starting at the current history
|
|
offset. The search is anchored: matching lines must begin with
|
|
<VAR>string</VAR>. If <VAR>direction</VAR> < 0, then the search is through previous
|
|
entries, else through subsequent. If <VAR>string</VAR> 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.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_search_pos</B> <I>(char *string, int direction, int pos)</I>
|
|
<DD><A NAME="IDX26"></A>
|
|
Search for <VAR>string</VAR> in the history list, starting at <VAR>pos</VAR>, an
|
|
absolute index into the list. If <VAR>direction</VAR> is negative, the search
|
|
proceeds backward from <VAR>pos</VAR>, otherwise forward. Returns the absolute
|
|
index of the history element where <VAR>string</VAR> was found, or -1 otherwise.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H3><A NAME="SEC15" HREF="history_toc.html#TOC15">Managing the History File</A></H3>
|
|
|
|
<P>
|
|
The History library can read the history from and write it to a file.
|
|
This section documents the functions for managing a history file.
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>read_history</B> <I>(char *filename)</I>
|
|
<DD><A NAME="IDX27"></A>
|
|
Add the contents of <VAR>filename</VAR> to the history list, a line at a
|
|
time. If <VAR>filename</VAR> is <CODE>NULL</CODE>, then read from
|
|
<TT>`~/.history'</TT>. Returns 0 if successful, or errno if not.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>read_history_range</B> <I>(char *filename, int from, int to)</I>
|
|
<DD><A NAME="IDX28"></A>
|
|
Read a range of lines from <VAR>filename</VAR>, adding them to the history list.
|
|
Start reading at line <VAR>from</VAR> and end at <VAR>to</VAR>. If
|
|
<VAR>from</VAR> is zero, start at the beginning. If <VAR>to</VAR> is less than
|
|
<VAR>from</VAR>, then read until the end of the file. If <VAR>filename</VAR> is
|
|
<CODE>NULL</CODE>, then read from <TT>`~/.history'</TT>. Returns 0 if successful,
|
|
or <CODE>errno</CODE> if not.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>write_history</B> <I>(char *filename)</I>
|
|
<DD><A NAME="IDX29"></A>
|
|
Write the current history to <VAR>filename</VAR>, overwriting <VAR>filename</VAR>
|
|
if necessary. If <VAR>filename</VAR> is
|
|
<CODE>NULL</CODE>, then write the history list to <TT>`~/.history'</TT>. Values
|
|
returned are as in <CODE>read_history ()</CODE>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>append_history</B> <I>(int nelements, char *filename)</I>
|
|
<DD><A NAME="IDX30"></A>
|
|
Append the last <VAR>nelements</VAR> of the history list to <VAR>filename</VAR>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_truncate_file</B> <I>(char *filename, int nlines)</I>
|
|
<DD><A NAME="IDX31"></A>
|
|
Truncate the history file <VAR>filename</VAR>, leaving only the last
|
|
<VAR>nlines</VAR> lines.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H3><A NAME="SEC16" HREF="history_toc.html#TOC16">History Expansion</A></H3>
|
|
|
|
<P>
|
|
These functions implement <CODE>csh</CODE>-like history expansion.
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> int <B>history_expand</B> <I>(char *string, char **output)</I>
|
|
<DD><A NAME="IDX32"></A>
|
|
Expand <VAR>string</VAR>, placing the result into <VAR>output</VAR>, a pointer
|
|
to a string (see section <A HREF="history.html#SEC2">Interactive History Expansion</A>). Returns:
|
|
<DL COMPACT>
|
|
|
|
<DT><CODE>0</CODE>
|
|
<DD>
|
|
If no expansions took place (or, if the only change in
|
|
the text was the de-slashifying of the history expansion
|
|
character);
|
|
<DT><CODE>1</CODE>
|
|
<DD>
|
|
if expansions did take place;
|
|
<DT><CODE>-1</CODE>
|
|
<DD>
|
|
if there was an error in expansion;
|
|
<DT><CODE>2</CODE>
|
|
<DD>
|
|
if the returned line should only be displayed, but not executed,
|
|
as with the <CODE>:p</CODE> modifier (see section <A HREF="history.html#SEC5">Modifiers</A>).
|
|
</DL>
|
|
|
|
<P>
|
|
If an error ocurred in expansion, then <VAR>output</VAR> contains a descriptive
|
|
error message.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> char * <B>history_arg_extract</B> <I>(int first, int last, char *string)</I>
|
|
<DD><A NAME="IDX33"></A>
|
|
Extract a string segment consisting of the <VAR>first</VAR> through <VAR>last</VAR>
|
|
arguments present in <VAR>string</VAR>. Arguments are broken up as in Bash.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> char * <B>get_history_event</B> <I>(char *string, int *cindex, int qchar)</I>
|
|
<DD><A NAME="IDX34"></A>
|
|
Returns the text of the history event beginning at <VAR>string</VAR> +
|
|
<VAR>*cindex</VAR>. <VAR>*cindex</VAR> is modified to point to after the event
|
|
specifier. At function entry, <VAR>cindex</VAR> points to the index into
|
|
<VAR>string</VAR> where the history event specification begins. <VAR>qchar</VAR>
|
|
is a character that is allowed to end the event specification in addition
|
|
to the "normal" terminating characters.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Function:</U> char ** <B>history_tokenize</B> <I>(char *string)</I>
|
|
<DD><A NAME="IDX35"></A>
|
|
Return an array of tokens parsed out of <VAR>string</VAR>, much as the
|
|
shell might. The tokens are split on white space and on the
|
|
characters <CODE>()<>;&|$</CODE>, and shell quoting conventions are
|
|
obeyed.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H2><A NAME="SEC17" HREF="history_toc.html#TOC17">History Variables</A></H2>
|
|
|
|
<P>
|
|
This section describes the externally visible variables exported by
|
|
the GNU History Library.
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> int <B>history_base</B>
|
|
<DD><A NAME="IDX36"></A>
|
|
The logical offset of the first entry in the history list.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> int <B>history_length</B>
|
|
<DD><A NAME="IDX37"></A>
|
|
The number of entries currently stored in the history list.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> int <B>max_input_history</B>
|
|
<DD><A NAME="IDX38"></A>
|
|
The maximum number of history entries. This must be changed using
|
|
<CODE>stifle_history ()</CODE>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> char <B>history_expansion_char</B>
|
|
<DD><A NAME="IDX39"></A>
|
|
The character that starts a history event. The default is <SAMP>`!'</SAMP>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> char <B>history_subst_char</B>
|
|
<DD><A NAME="IDX40"></A>
|
|
The character that invokes word substitution if found at the start of
|
|
a line. The default is <SAMP>`^'</SAMP>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> char <B>history_comment_char</B>
|
|
<DD><A NAME="IDX41"></A>
|
|
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.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> char * <B>history_no_expand_chars</B>
|
|
<DD><A NAME="IDX42"></A>
|
|
The list of characters which inhibit history expansion if found immediately
|
|
following <VAR>history_expansion_char</VAR>. The default is whitespace and
|
|
<SAMP>`='</SAMP>.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> char * <B>history_search_delimiter_chars</B>
|
|
<DD><A NAME="IDX43"></A>
|
|
The list of additional characters which can delimit a history search
|
|
string, in addition to whitespace, <SAMP>`:'</SAMP> and <SAMP>`?'</SAMP> in the case of
|
|
a substring search. The default is empty.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> int <B>history_quotes_inhibit_expansion</B>
|
|
<DD><A NAME="IDX44"></A>
|
|
If non-zero, single-quoted words are not scanned for the history expansion
|
|
character. The default value is 0.
|
|
</DL>
|
|
|
|
</P>
|
|
<P>
|
|
<DL>
|
|
<DT><U>Variable:</U> Function * <B>history_inhibit_expansion_function</B>
|
|
<DD><A NAME="IDX45"></A>
|
|
This should be set to the address of a function that takes two arguments:
|
|
a <CODE>char *</CODE> (<VAR>string</VAR>) and an integer index into that string (<VAR>i</VAR>).
|
|
It should return a non-zero value if the history expansion starting at
|
|
<VAR>string[i]</VAR> 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.
|
|
</DL>
|
|
|
|
</P>
|
|
|
|
|
|
<H2><A NAME="SEC18" HREF="history_toc.html#TOC18">History Programming Example</A></H2>
|
|
|
|
<P>
|
|
The following program demonstrates simple use of the GNU History Library.
|
|
|
|
</P>
|
|
|
|
<PRE>
|
|
main ()
|
|
{
|
|
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");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</PRE>
|
|
|
|
|
|
|
|
<H1><A NAME="SEC19" HREF="history_toc.html#TOC19">Concept Index</A></H1>
|
|
<P>
|
|
<H2>a</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX23">anchored search</A>
|
|
</DIR>
|
|
<H2>e</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX2">event designators</A>
|
|
</DIR>
|
|
<H2>h</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX3">history events</A>
|
|
<LI><A HREF="history.html#IDX1">history expansion</A>
|
|
<LI><A HREF="history.html#IDX22">History Searching</A>
|
|
</DIR>
|
|
|
|
</P>
|
|
|
|
|
|
<H1><A NAME="SEC20" HREF="history_toc.html#TOC20">Function and Variable Index</A></H1>
|
|
<P>
|
|
<H2>a</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX7">add_history</A>
|
|
<LI><A HREF="history.html#IDX30">append_history</A>
|
|
</DIR>
|
|
<H2>c</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX10">clear_history</A>
|
|
<LI><A HREF="history.html#IDX16">current_history</A>
|
|
</DIR>
|
|
<H2>g</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX34">get_history_event</A>
|
|
</DIR>
|
|
<H2>h</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX33">history_arg_extract</A>
|
|
<LI><A HREF="history.html#IDX36">history_base</A>
|
|
<LI><A HREF="history.html#IDX41">history_comment_char</A>
|
|
<LI><A HREF="history.html#IDX32">history_expand</A>
|
|
<LI><A HREF="history.html#IDX39">history_expansion_char</A>
|
|
<LI><A HREF="history.html#IDX17">history_get</A>
|
|
<LI><A HREF="history.html#IDX5">history_get_history_state</A>
|
|
<LI><A HREF="history.html#IDX45">history_inhibit_expansion_function</A>
|
|
<LI><A HREF="history.html#IDX13">history_is_stifled</A>
|
|
<LI><A HREF="history.html#IDX37">history_length</A>
|
|
<LI><A HREF="history.html#IDX14">history_list</A>
|
|
<LI><A HREF="history.html#IDX42">history_no_expand_chars</A>
|
|
<LI><A HREF="history.html#IDX44">history_quotes_inhibit_expansion</A>
|
|
<LI><A HREF="history.html#IDX24">history_search</A>
|
|
<LI><A HREF="history.html#IDX43">history_search_delimiter_chars</A>
|
|
<LI><A HREF="history.html#IDX26">history_search_pos</A>
|
|
<LI><A HREF="history.html#IDX25">history_search_prefix</A>
|
|
<LI><A HREF="history.html#IDX6">history_set_history_state</A>
|
|
<LI><A HREF="history.html#IDX19">history_set_pos</A>
|
|
<LI><A HREF="history.html#IDX40">history_subst_char</A>
|
|
<LI><A HREF="history.html#IDX35">history_tokenize</A>
|
|
<LI><A HREF="history.html#IDX18">history_total_bytes</A>
|
|
<LI><A HREF="history.html#IDX31">history_truncate_file</A>
|
|
</DIR>
|
|
<H2>m</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX38">max_input_history</A>
|
|
</DIR>
|
|
<H2>n</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX21">next_history</A>
|
|
</DIR>
|
|
<H2>p</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX20">previous_history</A>
|
|
</DIR>
|
|
<H2>r</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX27">read_history</A>
|
|
<LI><A HREF="history.html#IDX28">read_history_range</A>
|
|
<LI><A HREF="history.html#IDX8">remove_history</A>
|
|
<LI><A HREF="history.html#IDX9">replace_history_entry</A>
|
|
</DIR>
|
|
<H2>s</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX11">stifle_history</A>
|
|
</DIR>
|
|
<H2>u</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX12">unstifle_history</A>
|
|
<LI><A HREF="history.html#IDX4">using_history</A>
|
|
</DIR>
|
|
<H2>w</H2>
|
|
<DIR>
|
|
<LI><A HREF="history.html#IDX15">where_history</A>
|
|
<LI><A HREF="history.html#IDX29">write_history</A>
|
|
</DIR>
|
|
|
|
</P>
|
|
<P><HR><P>
|
|
This document was generated on 3 June 1997 using the
|
|
<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
|
|
translator version 1.51.</P>
|
|
</BODY>
|
|
</HTML>
|