From d7fa6e206dfcf5ade54c67dd5bd01d4f9404505a Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Mon, 21 Dec 1998 20:06:35 +0000 Subject: [PATCH] Import of readline-2.2.1 --- readline/MANIFEST.doc | 16 + readline/acconfig.h | 30 + readline/doc/hist.texinfo | 43 +- readline/doc/history.dvi | Bin 0 -> 35068 bytes readline/doc/history.html | 1069 +++++++ readline/doc/history.info | 739 +++-- readline/doc/history.ps | 2071 +++++++++++++ readline/doc/history_toc.html | 51 + readline/doc/hstech.texinfo | 494 +++- readline/doc/hsuser.texinfo | 341 ++- readline/doc/readline.0 | 1122 ++++++++ readline/doc/readline.dvi | Bin 0 -> 185100 bytes readline/doc/readline.html | 3482 ++++++++++++++++++++++ readline/doc/readline.info | 2486 +++++++++++----- readline/doc/readline.ps | 4946 ++++++++++++++++++++++++++++++++ readline/doc/readline_toc.html | 77 + readline/doc/rlman.texinfo | 30 +- readline/doc/rltech.texinfo | 1130 ++++++-- readline/doc/rluser.texinfo | 1014 ++++++- readline/doc/texinfo.tex | 3431 ++++++++++++++++------ 20 files changed, 20182 insertions(+), 2390 deletions(-) create mode 100644 readline/MANIFEST.doc create mode 100644 readline/acconfig.h create mode 100644 readline/doc/history.dvi create mode 100644 readline/doc/history.html create mode 100644 readline/doc/history.ps create mode 100644 readline/doc/history_toc.html create mode 100644 readline/doc/readline.0 create mode 100644 readline/doc/readline.dvi create mode 100644 readline/doc/readline.html create mode 100644 readline/doc/readline.ps create mode 100644 readline/doc/readline_toc.html diff --git a/readline/MANIFEST.doc b/readline/MANIFEST.doc new file mode 100644 index 00000000000..ed27cb39107 --- /dev/null +++ b/readline/MANIFEST.doc @@ -0,0 +1,16 @@ +# +# Master Manifest file for documentation-only distribution +# +doc d +MANIFEST.doc f +doc/readline.ps f +doc/history.ps f +doc/readline.dvi f +doc/history.dvi f +doc/readline.info f +doc/history.info f +doc/readline.html f +doc/readline_toc.html f +doc/history.html f +doc/history_toc.html f +doc/readline.0 f diff --git a/readline/acconfig.h b/readline/acconfig.h new file mode 100644 index 00000000000..4f4223886c2 --- /dev/null +++ b/readline/acconfig.h @@ -0,0 +1,30 @@ +/* acconfig.h + This file is in the public domain. + + Descriptive text for the C preprocessor macros that + the distributed Autoconf macros can define. + No software package will use all of them; autoheader copies the ones + your configure.in uses into your configuration header file templates. + + The entries are in sort -df order: alphabetical, case insensitive, + ignoring punctuation (such as underscores). Although this order + can split up related entries, it makes it easier to check whether + a given entry is in the file. + + Leave the following blank line there!! Autoheader needs it. */ + + +/* Definitions pulled in from aclocal.m4. */ +#undef VOID_SIGHANDLER + +#undef TIOCGWINSZ_IN_SYS_IOCTL + +#undef TIOCSTAT_IN_SYS_IOCTL + +#undef HAVE_GETPW_DECLS + + +/* Leave that blank line there!! Autoheader needs it. + If you're adding to this file, keep in mind: + The entries are in sort -df order: alphabetical, case insensitive, + ignoring punctuation (such as underscores). */ diff --git a/readline/doc/hist.texinfo b/readline/doc/hist.texinfo index 62927381044..be8742f5e66 100644 --- a/readline/doc/hist.texinfo +++ b/readline/doc/hist.texinfo @@ -1,17 +1,31 @@ \input texinfo @c -*-texinfo-*- -@comment %**start of header (This is for running Texinfo on a region.) +@c %**start of header (This is for running Texinfo on a region.) @setfilename history.info -@settitle GNU Readline Library -@comment %**end of header (This is for running Texinfo on a region.) -@synindex vr fn +@settitle GNU History Library +@c %**end of header (This is for running Texinfo on a region.) + @setchapternewpage odd +@ignore +last change: Thu Apr 2 14:38:22 EST 1998 +@end ignore + +@set EDITION 2.2 +@set VERSION 2.2 +@set UPDATED 2 April 1998 +@set UPDATE-MONTH April 1998 + +@dircategory Libraries +@direntry +* History: (history). The GNU history library API +@end direntry + @ifinfo This document describes the GNU History library, a programming tool that provides a consistent user interface for recalling lines of previously typed input. -Copyright (C) 1988, 1991 Free Software Foundation, Inc. +Copyright (C) 1988, 1991, 1993, 1995, 1996, 1998 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -36,18 +50,13 @@ by the Foundation. @end ifinfo @titlepage -@sp 10 -@center @titlefont{GNU History Library} -@center Brian Fox -@center Free Software Foundation -@center Version 1.1 -@center April 1991 - -@c Include the Distribution inside the titlepage environment so -@c that headings are turned off. +@title GNU History Library +@subtitle Edition @value{EDITION}, for @code{History Library} Version @value{VERSION}. +@subtitle @value{UPDATE-MONTH} +@author Brian Fox, Free Software Foundation +@author Chet Ramey, Case Western Reserve University @page - This document describes the GNU History library, a programming tool that provides a consistent user interface for recalling lines of previously typed input. @@ -91,6 +100,8 @@ typed input. @end menu @end ifinfo +@syncodeindex fn vr + @include hsuser.texinfo @include hstech.texinfo @@ -101,6 +112,6 @@ typed input. @node Function and Variable Index @appendix Function and Variable Index @printindex vr -@contents +@contents @bye diff --git a/readline/doc/history.dvi b/readline/doc/history.dvi new file mode 100644 index 0000000000000000000000000000000000000000..f50179278cb642018d7d6af5d3b4ef5af01bbe50 GIT binary patch literal 35068 zcmeHw3wT^*o%bX&DWwzzRuDwcmP^x+gk0J}TM$EONtJSGQb3@zlbJJ_BXbFJX4(W~ zQSk=S(9mJt!itv_alNyC=mdlNDNsHa$S0yc!uR|A-}gP|%w(Dd zbRXA8`?y;=bI$wz@Avne-!?a0x8wfTu8iPM^zox#KWJV2`h2N4QYyZ_d-?KHJG+*2 zcJ-|2Ub1A#`|(5*AKTxb7x8D??q?&B@eem&*Zat}55I8Smw&O%J?zl4r!M*G!{>fD z@~SVsH8LNo%t>U2M!S3VUUK%i8_EZK<754{Q_L5}ymRcKLcB0G&R2HNpWAhPB!;a& zecR`DAGGtHZ95`Ae&f5QdfxoZ=CR1Usouyutkjao7P`BttCM!o&gaU}J5xQK-R)i~ zU+|`SAARz)QU6KoSuA#UP1Nn>RWEd3Ji@XH4&L|ha_9K&gCmh`JDSFJ7uUrLiS3_R zkan>yh_Y<_!%gq`{?=_%{esOaQmGnj`p+!b@m#qjm0Gjwg*#LE?KeI&+U~8X6fDad z$ft@o-}um0FJ7=*K2gb+a>+P>9^ZWk_FI*%Mn+_AiiDwb2U3OR4R z4*GHNaoyK<`8HwCThT(%*{b{RV*dITCd{h`# z9ZcI!Iri%>B=bAhO(aTLD+fXpy`<$N3ic3y@``E81OMFEuTzGm8O1*mwB2oa<9FlU zNFhI5h-b5QZrCg4EBOpwix>GZmfK=uIWIoG=iuI6*)@^RIS>Uaw-bAjnI+)t*|`cR zkcuZP;cLN4#4{N#i2sN8^C>K6ZL#wuCo|@OBqQ6`O;}0123hVLzxxoq`1z%wjP0bY zBo`jS4tN+StRb|9MU|};Fi3qCFz6!!+_F=a?!uev;*Jwf+zhGk09~=@RQk4fR?aI~ z?c?gfRq-s48!FhzVXK{+t?To;db)d;dm9G&#_yEH&d2^%A!|DnyK;2mGq&S_P{cF| zLV4Nv6&1^i=aOC$1OdfMMav`8hafXqFOeUy73xLs2~X!LrFe#9t&pf#B5i4C@F;*C zE7-$nPiUIU7j2M|Ysaob? z!Jni(AB!p}2GhyJ8cd)Z;5_*Qnds1{C?$8w(ObKz;9G=-K0zvDkcoCTy6eYbGC

irW1*Zkq3G60I%R>;y$5}rA01k1*$SE67f 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 literal 0 HcmV?d00001 diff --git a/readline/doc/history.html b/readline/doc/history.html new file mode 100644 index 00000000000..c8dd1e1e8c2 --- /dev/null +++ b/readline/doc/history.html @@ -0,0 +1,1069 @@ + + + + +GNU History Library + + +

GNU History Library

+

Edition 2.1, for History Library Version 2.1.

+

March 1996

+
Brian Fox, Free Software Foundation
+
Chet Ramey, Case Western Reserve University
+

+


+ +

+@dircategory Libraries +@direntry +* History: (history). The GNU history library API + +

+ +

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

+

+Published by the Free Software Foundation
+675 Massachusetts Avenue,
+Cambridge, MA 02139 USA + +

+

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

+

+Permission is granted to copy 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. + +

+

+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. + +

+

+Copyright (C) 1989, 1991 Free Software Foundation, Inc. + +

+ + + +

Using History Interactively

+ +

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

+ + + +

History Expansion

+

+ + +

+

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

+

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

+

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

+ + + +

Event Designators

+

+ + +

+

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

+
+ +
! +
+Start a history substitution, except when followed by a space, tab, +the end of the line, `=' or `('. + +
!n +
+Refer to command line n. + +
!-n +
+Refer to the command n lines back. + +
!! +
+Refer to the previous command. This is a synonym for `!-1'. + +
!string +
+Refer to the most recent command starting with string. + +
!?string[?] +
+Refer to the most recent command containing string. The trailing +`?' may be omitted if the string is followed immediately by +a newline. + +
^string1^string2^ +
+Quick Substitution. Repeat the last command, replacing string1 +with string2. Equivalent to +!!:s/string1/string2/. + +
!# +
+The entire command line typed so far. + +
+ + + +

Word Designators

+ +

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

+
+ +
0 (zero) +
+The 0th word. For many applications, this is the command word. + +
n +
+The nth word. + +
^ +
+The first argument; that is, word 1. + +
$ +
+The last argument. + +
% +
+The word matched by the most recent `?string?' search. + +
x-y +
+A range of words; `-y' abbreviates `0-y'. + +
* +
+All of the words, except the 0th. This is a synonym for `1-$'. +It is not an error to use `*' if there is just one word in the event; +the empty string is returned in that case. + +
x* +
+Abbreviates `x-$' + +
x- +
+Abbreviates `x-$' like `x*', but omits the last word. + +
+ +

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

+ + +

Modifiers

+ +

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

+
+ +
h +
+Remove a trailing pathname component, leaving only the head. + +
t +
+Remove all leading pathname components, leaving the tail. + +
r +
+Remove a trailing suffix of the form `.suffix', leaving +the basename. + +
e +
+Remove all but the trailing suffix. + +
p +
+Print the new command but do not execute it. + +
s/old/new/ +
+Substitute new for the first occurrence of old in the +event line. Any delimiter may be used in place of `/'. +The delimiter may be quoted in old and new +with a single backslash. If `&' appears in new, +it is replaced by old. A single backslash will quote +the `&'. The final delimiter is optional if it is the last +character on the input line. + +
& +
+Repeat the previous substitution. + +
g +
+Cause changes to be applied over the entire event line. Used in +conjunction with `s', as in gs/old/new/, +or with `&'. + +
+ + + +

Programming with GNU History

+ +

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

+ + + +

Introduction to History

+ +

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

+

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

+

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

+

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

+ + +

History Storage

+ +

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

+ +
+typedef struct _hist_entry {
+  char *line;
+  char *data;
+} HIST_ENTRY;
+
+ +

+The history list itself might therefore be declared as + +

+ +
+HIST_ENTRY **the_history_list;
+
+ +

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

+ +
+/* A structure used to pass 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;
+
+ +

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

+ + +

History Functions

+ +

+This section describes the calling sequence for the various functions +present in GNU History. + +

+ + + +

Initializing History and State Management

+ +

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

+

+

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

+

+

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

+

+

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

+ + +

History List Management

+ +

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

+

+

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

+

+

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

+

+

+
Function: HIST_ENTRY * replace_history_entry (int which, char *line, char *data) +
+Make the history entry at offset which have line and data. +This returns the old entry so you can dispose of the data. In the case +of an invalid which, a NULL pointer is returned. +
+ +

+

+

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

+

+

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

+

+

+
Function: int unstifle_history () +
+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. +
+ +

+

+

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

+ + +

Information About the History List

+ +

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

+

+

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

+

+

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

+

+

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

+

+

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

+

+

+
Function: int history_total_bytes () +
+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. +
+ +

+ + +

Moving Around the History List

+ +

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

+

+

+
Function: int history_set_pos (int pos) +
+Set the position in the history list to pos, an absolute index +into the list. +
+ +

+

+

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

+

+

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

+ + +

Searching the History List

+

+ + +

+

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

+

+

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

+

+

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

+

+

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

+ + +

Managing the History File

+ +

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

+

+

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

+

+

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

+

+

+
Function: int write_history (char *filename) +
+Write the current history to filename, overwriting filename +if necessary. If filename is +NULL, then write the history list to `~/.history'. Values +returned are as in read_history (). +
+ +

+

+

+
Function: int append_history (int nelements, char *filename) +
+Append the last nelements of the history list to filename. +
+ +

+

+

+
Function: int history_truncate_file (char *filename, int nlines) +
+Truncate the history file filename, leaving only the last +nlines lines. +
+ +

+ + +

History Expansion

+ +

+These functions implement csh-like history expansion. + +

+

+

+
Function: int history_expand (char *string, char **output) +
+Expand string, placing the result into output, a pointer +to a string (see section History Expansion). Returns: +
+ +
0 +
+If no expansions took place (or, if the only change in +the text was the de-slashifying of the history expansion +character); +
1 +
+if expansions did take place; +
-1 +
+if there was an error in expansion; +
2 +
+if the returned line should only be displayed, but not executed, +as with the :p modifier (see section Modifiers). +
+ +

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

+ +

+

+

+
Function: char * history_arg_extract (int first, int last, char *string) +
+Extract a string segment consisting of the first through last +arguments present in string. Arguments are broken up as in Bash. +
+ +

+

+

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

+

+

+
Function: char ** history_tokenize (char *string) +
+Return an array of tokens parsed out of string, much as the +shell might. The tokens are split on white space and on the +characters ()<>;&|$, and shell quoting conventions are +obeyed. +
+ +

+ + +

History Variables

+ +

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

+

+

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

+

+

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

+

+

+
Variable: int max_input_history +
+The maximum number of history entries. This must be changed using +stifle_history (). +
+ +

+

+

+
Variable: char history_expansion_char +
+The character that starts a history event. The default is `!'. +
+ +

+

+

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

+

+

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

+

+

+
Variable: char * history_no_expand_chars +
+The list of characters which inhibit history expansion if found immediately +following history_expansion_char. The default is whitespace and +`='. +
+ +

+

+

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

+

+

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

+

+

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

+ + +

History Programming Example

+ +

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

+ +
+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");
+            }
+        }
+    }
+}
+
+ + + +

Concept Index

+

+

a

+ +
  • anchored search +
  • +

    e

    + +
  • event designators +
  • +

    h

    + +
  • history events +
  • history expansion +
  • History Searching +
  • + +

    + + +

    Function and Variable Index

    +

    +

    a

    + +
  • add_history +
  • append_history +
  • +

    c

    + +
  • clear_history +
  • current_history +
  • +

    g

    + +
  • get_history_event +
  • +

    h

    + +
  • history_arg_extract +
  • history_base +
  • history_comment_char +
  • history_expand +
  • history_expansion_char +
  • history_get +
  • history_get_history_state +
  • history_inhibit_expansion_function +
  • history_is_stifled +
  • history_length +
  • history_list +
  • history_no_expand_chars +
  • history_quotes_inhibit_expansion +
  • history_search +
  • history_search_delimiter_chars +
  • history_search_pos +
  • history_search_prefix +
  • history_set_history_state +
  • history_set_pos +
  • history_subst_char +
  • history_tokenize +
  • history_total_bytes +
  • history_truncate_file +
  • +

    m

    + +
  • max_input_history +
  • +

    n

    + +
  • next_history +
  • +

    p

    + +
  • previous_history +
  • +

    r

    + +
  • read_history +
  • read_history_range +
  • remove_history +
  • replace_history_entry +
  • +

    s

    + +
  • stifle_history +
  • +

    u

    + +
  • unstifle_history +
  • using_history +
  • +

    w

    + +
  • where_history +
  • write_history +
  • + +

    +


    +This document was generated on 2 April 1998 using the +texi2html +translator version 1.51.

    + + diff --git a/readline/doc/history.info b/readline/doc/history.info index df7651d274f..f3c59a17786 100644 --- a/readline/doc/history.info +++ b/readline/doc/history.info @@ -1,15 +1,21 @@ -Info file history.info, produced by Makeinfo, -*- Text -*- from input -file hist.texinfo. +This is Info file history.info, produced by Makeinfo version 1.67 from +the input file /usr/homes/chet/src/bash/readline-2.2/doc/hist.texinfo. + +INFO-DIR-SECTION Libraries +START-INFO-DIR-ENTRY +* History: (history). The GNU history library API +END-INFO-DIR-ENTRY This document describes the GNU History library, a programming tool that provides a consistent user interface for recalling lines of previously typed input. - Copyright (C) 1988, 1991 Free Software Foundation, Inc. + Copyright (C) 1988, 1991, 1993, 1995, 1996 Free Software Foundation, +Inc. - Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice pare +preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that @@ -22,7 +28,7 @@ versions, except that this permission notice may be stated in a translation approved by the Foundation.  -File: history.info, Node: Top, Next: Using History Interactively, Prev: (DIR), Up: (DIR) +File: history.info, Node: Top, Next: Using History Interactively, Up: (dir) GNU History Library ******************* @@ -47,8 +53,8 @@ Using History Interactively This chapter describes how to use the GNU History Library interactively, from a user's standpoint. It should be considered a -user's guide. For information on using the GNU History Library in -your own programs, *note Programming with GNU History::.. +user's guide. For information on using the GNU History Library in your +own programs, *note Programming with GNU History::.. * Menu: @@ -57,27 +63,34 @@ your own programs, *note Programming with GNU History::..  File: history.info, Node: History Interaction, Up: Using History Interactively -History Interaction -=================== +History Expansion +================= The History library provides a history expansion feature that is -similar to the history expansion in Csh. The following text describes -the sytax that you use to manipulate the history information. +similar to the history expansion provided by `csh'. This section +describes the syntax used to manipulate the history information. + + History expansions introduce words from the history list into the +input stream, making it easy to repeat commands, insert the arguments +to a previous command into the current input line, or fix errors in +previous commands quickly. History expansion takes place in two parts. The first is to -determine which line from the previous history should be used during +determine which line from the history list should be used during substitution. The second is to select portions of that line for -inclusion into the current one. The line selected from the previous -history is called the "event", and the portions of that line that are -acted upon are called "words". The line is broken into words in the -same fashion that the Bash shell does, so that several English (or -Unix) words surrounded by quotes are considered as one word. +inclusion into the current one. The line selected from the history is +called the "event", and the portions of that line that are acted upon +are called "words". Various "modifiers" are available to manipulate +the selected words. The line is broken into words in the same fashion +that Bash does, so that several words surrounded by quotes are +considered one word. History expansions are introduced by the +appearance of the history expansion character, which is `!' by default. * Menu: * Event Designators:: How to specify which history line to use. * Word Designators:: Specifying which words are of interest. -* Modifiers:: Modifying the results of susbstitution. +* Modifiers:: Modifying the results of substitution.  File: history.info, Node: Event Designators, Next: Word Designators, Up: History Interaction @@ -89,23 +102,32 @@ Event Designators history list. `!' - Start a history subsititution, except when followed by a space, - tab, or the end of the line... = or (. + Start a history substitution, except when followed by a space, tab, + the end of the line, `=' or `('. + +`!N' + Refer to command line N. + +`!-N' + Refer to the command N lines back. `!!' Refer to the previous command. This is a synonym for `!-1'. -`!n' - Refer to command line N. +`!STRING' + Refer to the most recent command starting with STRING. -`!-n' - Refer to the command line N lines back. +`!?STRING[?]' + Refer to the most recent command containing STRING. The trailing + `?' may be omitted if the STRING is followed immediately by a + newline. -`!string' - Refer to the most recent command starting with STRING. +`^STRING1^STRING2^' + Quick Substitution. Repeat the last command, replacing STRING1 + with STRING2. Equivalent to `!!:s/STRING1/STRING2/'. -`!?string'[`?'] - Refer to the most recent command containing STRING. +`!#' + The entire command line typed so far.  File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction @@ -113,34 +135,44 @@ File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Desi Word Designators ---------------- - A : separates the event specification from the word designator. It -can be omitted if the word designator begins with a ^, $, * or %. -Words are numbered from the beginning of the line, with the first word -being denoted by a 0 (zero). + Word designators are used to select desired words from the event. A +`:' separates the event specification from the word designator. It may +be omitted if the word designator begins with a `^', `$', `*', `-', or +`%'. Words are numbered from the beginning of the line, with the first +word being denoted by 0 (zero). Words are inserted into the current +line separated by single spaces. `0 (zero)' - The zero'th word. For many applications, this is the command - word. + The `0'th word. For many applications, this is the command word. -`n' - The N'th word. +`N' + The Nth word. `^' - The first argument. that is, word 1. + The first argument; that is, word 1. `$' The last argument. `%' - The word matched by the most recent `?string?' search. + The word matched by the most recent `?STRING?' search. -`x-y' - A range of words; `-Y' Abbreviates `0-Y'. +`X-Y' + A range of words; `-Y' abbreviates `0-Y'. `*' - All of the words, excepting the zero'th. This is a synonym for - `1-$'. It is not an error to use * if there is just one word in - the event. The empty string is returned in that case. + All of the words, except the `0'th. This is a synonym for `1-$'. + It is not an error to use `*' if there is just one word in the + event; the empty string is returned in that case. + +`X*' + Abbreviates `X-$' + +`X-' + Abbreviates `X-$' like `X*', but omits the last word. + + If a word designator is supplied without an event specification, the +previous command is used as the event.  File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction @@ -148,38 +180,48 @@ File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Inte Modifiers --------- - After the optional word designator, you can add a sequence of one -or more of the following modifiers, each preceded by a :. - -`#' - The entire command line typed so far. This means the current - command, not the previous command, so it really isn't a word - designator, and doesn't belong in this section. + After the optional word designator, you can add a sequence of one or +more of the following modifiers, each preceded by a `:'. `h' Remove a trailing pathname component, leaving only the head. +`t' + Remove all leading pathname components, leaving the tail. + `r' - Remove a trailing suffix of the form `.'SUFFIX, leaving the + Remove a trailing suffix of the form `.SUFFIX', leaving the basename. `e' - Remove all but the suffix. - -`t' - Remove all leading pathname components, leaving the tail. + Remove all but the trailing suffix. `p' Print the new command but do not execute it. +`s/OLD/NEW/' + Substitute NEW for the first occurrence of OLD in the event line. + Any delimiter may be used in place of `/'. The delimiter may be + quoted in OLD and NEW with a single backslash. If `&' appears in + NEW, it is replaced by OLD. A single backslash will quote the + `&'. The final delimiter is optional if it is the last character + on the input line. + +`&' + Repeat the previous substitution. + +`g' + Cause changes to be applied over the entire event line. Used in + conjunction with `s', as in `gs/OLD/NEW/', or with `&'. +  File: history.info, Node: Programming with GNU History, Next: Concept Index, Prev: Using History Interactively, Up: Top Programming with GNU History **************************** - This chapter describes how to interface the GNU History Library with -programs that you write. It should be considered a technical guide. + This chapter describes how to interface programs that you write with +the GNU History Library. It should be considered a technical guide. For information on the interactive use of GNU History, *note Using History Interactively::.. @@ -198,27 +240,27 @@ Introduction to History ======================= Many programs read input from the user a line at a time. The GNU -history library is able to keep track of those lines, associate +History library is able to keep track of those lines, associate arbitrary data with each line, and utilize information from previous -lines in making up new ones. - - The programmer using the History library has available to him -functions for remembering lines on a history stack, associating -arbitrary data with a line, removing lines from the stack, searching -through the stack for a line containing an arbitrary text string, and -referencing any line on the stack directly. In addition, a history -"expansion" function is available which provides for a consistent user -interface across many different programs. - - The end-user using programs written with the History library has the -benifit 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 used by `Csh'. +lines in composing new ones. + + The programmer using the History library has available functions for +remembering lines on a history list, associating arbitrary data with a +line, removing lines from the list, searching through the list for a +line containing an arbitrary text string, and referencing any line in +the list directly. In addition, a history "expansion" function is +available which provides for a consistent user interface across +different programs. + + The user using programs written with the History library has the +benefit of a consistent user interface with a set of well-known +commands for manipulating the text of previous lines and using that text +in new commands. The basic history manipulation commands are similar to +the history substitution provided by `csh'. If the programmer desires, he can use the Readline library, which includes some history manipulation by default, and has the added -advantage of Emacs style command line editing. +advantage of command line editing.  File: history.info, Node: History Storage, Next: History Functions, Prev: Introduction to History, Up: Programming with GNU History @@ -226,139 +268,290 @@ File: history.info, Node: History Storage, Next: History Functions, Prev: Int History Storage =============== + The history list is an array of history entries. A history entry is +declared as follows: + typedef struct _hist_entry { char *line; char *data; } HIST_ENTRY; + The history list itself might therefore be declared as + + HIST_ENTRY **the_history_list; + + The state of the History library is encapsulated into a single +structure: + + /* A structure used to pass 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; + + If the flags member includes `HS_STIFLED', the history has been +stifled. +  File: history.info, Node: History Functions, Next: History Variables, Prev: History Storage, Up: Programming with GNU History History Functions ================= - This section describes the calling sequence for the various -functions present in GNU History. + This section describes the calling sequence for the various functions +present in GNU History. + +* Menu: + +* Initializing History and State Management:: Functions to call when you + want to use history in a + program. +* History List Management:: Functions used to manage the list + of history entries. +* Information About the History List:: Functions returning information about + the history list. +* Moving Around the History List:: Functions used to change the position + in the history list. +* Searching the History List:: Functions to search the history list + for entries containing a string. +* Managing the History File:: Functions that read and write a file + containing the history list. +* History Expansion:: Functions to perform csh-like history + expansion. + + +File: history.info, Node: Initializing History and State Management, Next: History List Management, Up: History Functions - * Function: void using_history () - Begin a session in which the history functions might be used. - This just initializes the interactive variables. +Initializing History and State Management +----------------------------------------- + + This section describes functions used to initialize and manage the +state of the History library when you want to use the history functions +in your program. + + - Function: void using_history () + Begin a session in which the history functions might be used. This + initializes the interactive variables. + + - Function: HISTORY_STATE * history_get_history_state () + Return a structure describing the current state of the input + history. + + - Function: void history_set_history_state (HISTORY_STATE *state) + Set the state of the history list according to STATE. + + +File: history.info, Node: History List Management, Next: Information About the History List, Prev: Initializing History and State Management, Up: History Functions - * Function: void add_history (CHAR *STRING) +History List Management +----------------------- + + These functions manage individual entries on the history list, or set +parameters managing the list itself. + + - Function: void add_history (char *string) Place STRING at the end of the history list. The associated data field (if any) is set to `NULL'. - * Function: int where_history () - Returns the number which says what history element we are now - looking at. + - Function: HIST_ENTRY * remove_history (int which) + Remove history entry at offset WHICH from the history. The + removed element is returned so you can free the line, data, and + containing structure. - * Function: int history_set_pos (INT POS) - Set the position in the history list to POS. + - Function: HIST_ENTRY * replace_history_entry (int which, char *line, + char *data) + Make the history entry at offset WHICH have LINE and DATA. This + returns the old entry so you can dispose of the data. In the case + of an invalid WHICH, a `NULL' pointer is returned. - * Function: int history_search_pos (CHAR *STRING, INT DIRECTION, INT - POS) - Search for STRING in the history list, starting at POS, an - absolute index into the list. DIRECTION, if negative, says to - search backwards from POS, else forwards. Returns the absolute - index of the history element where STRING was found, or -1 - otherwise. - - * Function: HIST_ENTRY *remove_history (); - Remove history element WHICH from the history. The removed - element is returned to you so you can free the line, data, and - containing structure. + - Function: void clear_history () + Clear the history list by deleting all the entries. - * Function: void stifle_history (INT MAX) - Stifle the history list, remembering only MAX number of entries. + - Function: void stifle_history (int max) + Stifle the history list, remembering only the last MAX entries. - * Function: int unstifle_history (); + - Function: int unstifle_history () Stop stifling the history. This returns the previous amount the - history was stifled by. The value is positive if the history was + history was stifled. The value is positive if the history was stifled, negative if it wasn't. - * Function: int read_history (CHAR *FILENAME) + - Function: int history_is_stifled () + Returns non-zero if the history is stifled, zero if it is not. + + +File: history.info, Node: Information About the History List, Next: Moving Around the History List, Prev: History List Management, Up: History Functions + +Information About the History List +---------------------------------- + + These functions return information about the entire history list or +individual list entries. + + - Function: HIST_ENTRY ** history_list () + Return a `NULL' terminated array of `HIST_ENTRY' which is the + current input history. Element 0 of this list is the beginning of + time. If there is no history, return `NULL'. + + - Function: int where_history () + Returns the offset of the current history element. + + - Function: HIST_ENTRY * current_history () + Return the history entry at the current position, as determined by + `where_history ()'. If there is no entry there, return a `NULL' + pointer. + + - Function: HIST_ENTRY * history_get (int offset) + Return the history entry at position OFFSET, starting from + `history_base'. If there is no entry there, or if OFFSET is + greater than the history length, return a `NULL' pointer. + + - Function: int history_total_bytes () + Return the number of bytes that the primary history entries are + using. This function returns the sum of the lengths of all the + lines in the history. + + +File: history.info, Node: Moving Around the History List, Next: Searching the History List, Prev: Information About the History List, Up: History Functions + +Moving Around the History List +------------------------------ + + These functions allow the current index into the history list to be +set or changed. + + - Function: int history_set_pos (int pos) + Set the position in the history list to POS, an absolute index + into the list. + + - Function: HIST_ENTRY * previous_history () + Back up the current history offset to the previous history entry, + and return a pointer to that entry. If there is no previous + entry, return a `NULL' pointer. + + - Function: HIST_ENTRY * next_history () + Move the current history offset forward to the next history entry, + and return the a pointer to that entry. If there is no next + entry, return a `NULL' pointer. + + +File: history.info, Node: Searching the History List, Next: Managing the History File, Prev: Moving Around the History List, Up: History Functions + +Searching the History List +-------------------------- + + These functions allow searching of the history list for entries +containing a specific string. Searching may be performed both forward +and backward from the current history position. The search may be +"anchored", meaning that the string must match at the beginning of the +history entry. + + - Function: int history_search (char *string, int direction) + Search the history for STRING, starting at the current history + offset. If DIRECTION < 0, then the search is through previous + entries, else through subsequent. If STRING is found, then the + current history index is set to that history entry, and the value + returned is the offset in the line of the entry where STRING was + found. Otherwise, nothing is changed, and a -1 is returned. + + - Function: int history_search_prefix (char *string, int direction) + Search the history for STRING, starting at the current history + offset. The search is anchored: matching lines must begin with + STRING. If DIRECTION < 0, then the search is through previous + entries, else through subsequent. If STRING is found, then the + current history index is set to that entry, and the return value + is 0. Otherwise, nothing is changed, and a -1 is returned. + + - Function: int history_search_pos (char *string, int direction, int + pos) + Search for STRING in the history list, starting at POS, an + absolute index into the list. If DIRECTION is negative, the search + proceeds backward from POS, otherwise forward. Returns the + absolute index of the history element where STRING was found, or + -1 otherwise. + + +File: history.info, Node: Managing the History File, Next: History Expansion, Prev: Searching the History List, Up: History Functions + +Managing the History File +------------------------- + + The History library can read the history from and write it to a file. +This section documents the functions for managing a history file. + + - Function: int read_history (char *filename) Add the contents of FILENAME to the history list, a line at a - time. If FILENAME is `NULL', then read from `~/.history'. + time. If FILENAME is `NULL', then read from `~/.history'. Returns 0 if successful, or errno if not. - * Function: int read_history_range (CHAR *FILENAME, INT FROM, INT TO) + - Function: int read_history_range (char *filename, int from, int to) Read a range of lines from FILENAME, adding them to the history - list. Start reading at the FROM'th line and end at the TO'th. If - FROM is zero, start at the beginning. If TO is less than FROM, - then read until the end of the file. If FILENAME is `NULL', then - read from `~/.history'. Returns 0 if successful, or `errno' if - not. - - * Function: int write_history (CHAR *FILENAME) - Append the current history to FILENAME. If FILENAME is `NULL', - then append the history list to `~/.history'. Values returned - are as in `read_history ()'. - - * Function: int append_history (INT NELEMENTS, CHAR *FILENAME) - Append NELEMENT entries to FILENAME. The entries appended are - from the end of the list minus NELEMENTS up to the end of the - list. - - * Function: HIST_ENTRY *replace_history_entry () - Make the history entry at WHICH have LINE and DATA. This returns - the old entry so you can dispose of the data. In the case of an - invalid WHICH, a `NULL' pointer is returned. - - * Function: HIST_ENTRY *current_history () - Return the history entry at the current position, as determined by - `history_offset'. If there is no entry there, return a `NULL' - pointer. + list. Start reading at line FROM and end at TO. If FROM is zero, + start at the beginning. If TO is less than FROM, then read until + the end of the file. If FILENAME is `NULL', then read from + `~/.history'. Returns 0 if successful, or `errno' if not. - * Function: HIST_ENTRY *previous_history () - Back up HISTORY_OFFSET to the previous history entry, and return a - pointer to that entry. If there is no previous entry, return a - `NULL' pointer. + - Function: int write_history (char *filename) + Write the current history to FILENAME, overwriting FILENAME if + necessary. If FILENAME is `NULL', then write the history list to + `~/.history'. Values returned are as in `read_history ()'. - * Function: HIST_ENTRY *next_history () - Move `history_offset' forward to the next history entry, and - return the a pointer to that entry. If there is no next entry, - return a `NULL' pointer. + - Function: int append_history (int nelements, char *filename) + Append the last NELEMENTS of the history list to FILENAME. - * Function: HIST_ENTRY **history_list () - Return a `NULL' terminated array of `HIST_ENTRY' which is the - current input history. Element 0 of this list is the beginning - of time. If there is no history, return `NULL'. - - * Function: int history_search (CHAR *STRING, INT DIRECTION) - Search the history for STRING, starting at `history_offset'. If - DIRECTION < 0, then the search is through previous entries, else - through subsequent. If STRING is found, then `current_history - ()' is the history entry, and the value of this function is the - offset in the line of that history entry that the STRING was - found in. Otherwise, nothing is changed, and a -1 is returned. - - * Function: int history_expand (CHAR *STRING, CHAR **OUTPUT) - Expand STRING, placing the result into OUTPUT, a pointer to a - string. Returns: + - Function: int history_truncate_file (char *filename, int nlines) + Truncate the history file FILENAME, leaving only the last NLINES + lines. + +File: history.info, Node: History Expansion, Prev: Managing the History File, Up: History Functions + +History Expansion +----------------- + + These functions implement `csh'-like history expansion. + + - Function: int history_expand (char *string, char **output) + Expand STRING, placing the result into OUTPUT, a pointer to a + string (*note History Interaction::.). Returns: `0' If no expansions took place (or, if the only change in the text was the de-slashifying of the history expansion - character), + character); `1' - if expansions did take place, or + if expansions did take place; `-1' - if there was an error in expansion. + if there was an error in expansion; + + `2' + if the returned line should only be displayed, but not + executed, as with the `:p' modifier (*note Modifiers::.). - If an error ocurred in expansion, then OUTPUT contains a + If an error ocurred in expansion, then OUTPUT contains a descriptive error message. - * Function: char *history_arg_extract (INT FIRST, INT LAST, CHAR - *STRING) + - Function: char * history_arg_extract (int first, int last, char + *string) Extract a string segment consisting of the FIRST through LAST - arguments present in STRING. Arguments are broken up as in the - GNU Bash shell. - - * Function: int history_total_bytes (); - Return the number of bytes that the primary history entries are - using. This just adds up the lengths of `the_history->lines'. + arguments present in STRING. Arguments are broken up as in Bash. + + - Function: char * get_history_event (char *string, int *cindex, int + qchar) + Returns the text of the history event beginning at STRING + + *CINDEX. *CINDEX is modified to point to after the event + specifier. At function entry, CINDEX points to the index into + STRING where the history event specification begins. QCHAR is a + character that is allowed to end the event specification in + addition to the "normal" terminating characters. + + - Function: char ** history_tokenize (char *string) + Return an array of tokens parsed out of STRING, much as the shell + might. The tokens are split on white space and on the characters + `()<>;&|$', and shell quoting conventions are obeyed.  File: history.info, Node: History Variables, Next: History Programming Example, Prev: History Functions, Up: Programming with GNU History @@ -366,12 +559,54 @@ File: history.info, Node: History Variables, Next: History Programming Example History Variables ================= - This section describes the variables in GNU History that are -externally visible. + This section describes the externally visible variables exported by +the GNU History Library. + + - Variable: int history_base + The logical offset of the first entry in the history list. + + - Variable: int history_length + The number of entries currently stored in the history list. + + - Variable: int max_input_history + The maximum number of history entries. This must be changed using + `stifle_history ()'. + + - Variable: char history_expansion_char + The character that starts a history event. The default is `!'. - * Variable: int history_base - For convenience only. You set this when interpreting history - commands. It is the logical offset of the first history element. + - Variable: char history_subst_char + The character that invokes word substitution if found at the start + of a line. The default is `^'. + + - Variable: char history_comment_char + During tokenization, if this character is seen as the first + character of a word, then it and all subsequent characters up to a + newline are ignored, suppressing history expansion for the + remainder of the line. This is disabled by default. + + - Variable: char * history_no_expand_chars + The list of characters which inhibit history expansion if found + immediately following HISTORY_EXPANSION_CHAR. The default is + whitespace and `='. + + - Variable: char * history_search_delimiter_chars + The list of additional characters which can delimit a history + search string, in addition to whitespace, `:' and `?' in the case + of a substring search. The default is empty. + + - Variable: int history_quotes_inhibit_expansion + If non-zero, single-quoted words are not scanned for the history + expansion character. The default value is 0. + + - Variable: Function * history_inhibit_expansion_function + This should be set to the address of a function that takes two + arguments: a `char *' (STRING) and an integer index into that + string (I). It should return a non-zero value if the history + expansion starting at STRING[I] should not be performed; zero if + the expansion should be done. It is intended for use by + applications like Bash that use the history expansion character + for additional purposes. By default, this variable is set to NULL.  File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History @@ -379,20 +614,28 @@ File: history.info, Node: History Programming Example, Prev: History Variables History Programming Example =========================== - The following snippet of code demonstrates simple use of the GNU -History Library. + The following program demonstrates simple use of the GNU History +Library. main () { char line[1024], *t; - int done = 0; + int len, done = 0; line[0] = 0; + using_history (); while (!done) { - fprintf (stdout, "history%% "); - t = gets (line); + 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"); @@ -402,37 +645,41 @@ History Library. char *expansion; int result; - using_history (); - result = history_expand (line, &expansion); - strcpy (line, expansion); - free (expansion); if (result) - fprintf (stderr, "%s\n", line); + fprintf (stderr, "%s\n", expansion); - if (result < 0) - continue; + if (result < 0 || result == 2) + { + free (expansion); + continue; + } - add_history (line); + add_history (expansion); + strncpy (line, expansion, sizeof (line) - 1); + free (expansion); } - if (strcmp (line, "quit") == 0) done = 1; - if (strcmp (line, "save") == 0) write_history (0); - if (strcmp (line, "read") == 0) read_history (0); - if (strcmp (line, "list") == 0) + 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 = history_list (); + register HIST_ENTRY **the_list; register int i; + the_list = history_list (); if (the_list) for (i = 0; the_list[i]; i++) - fprintf (stdout, "%d: %s\n", - i + history_base, the_list[i]->line); + printf ("%d: %s\n", i + history_base, the_list[i]->line); } - if (strncmp (line, "delete", strlen ("delete")) == 0) + else if (strncmp (line, "delete", 6) == 0) { int which; - if ((sscanf (line + strlen ("delete"), "%d", &which)) == 1) + if ((sscanf (line + 6, "%d", &which)) == 1) { HIST_ENTRY *entry = remove_history (which); if (!entry) @@ -459,8 +706,11 @@ Concept Index * Menu: -* event designators: Event Designators. -* expansion: History Interaction. +* anchored search: Searching the History List. +* event designators: Event Designators. +* history events: Event Designators. +* history expansion: History Interaction. +* History Searching: Searching the History List.  File: history.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top @@ -470,45 +720,70 @@ Function and Variable Index * Menu: -* HIST_ENTRY **history_list: History Functions. -* HIST_ENTRY *current_history: History Functions. -* HIST_ENTRY *next_history: History Functions. -* HIST_ENTRY *previous_history: History Functions. -* HIST_ENTRY *remove_history: History Functions. -* HIST_ENTRY *replace_history_entry: History Functions. -* char *history_arg_extract: History Functions. -* int append_history: History Functions. -* int history_base: History Variables. -* int history_expand: History Functions. -* int history_search: History Functions. -* int history_search_pos: History Functions. -* int history_set_pos: History Functions. -* int history_total_bytes: History Functions. -* int read_history: History Functions. -* int read_history_range: History Functions. -* int unstifle_history: History Functions. -* int where_history: History Functions. -* int write_history: History Functions. -* void add_history: History Functions. -* void stifle_history: History Functions. -* void using_history: History Functions. +* add_history: History List Management. +* append_history: Managing the History File. +* clear_history: History List Management. +* current_history: Information About the History List. +* get_history_event: History Expansion. +* history_arg_extract: History Expansion. +* history_base: History Variables. +* history_comment_char: History Variables. +* history_expand: History Expansion. +* history_expansion_char: History Variables. +* history_get: Information About the History List. +* history_get_history_state: Initializing History and State Management. +* history_inhibit_expansion_function: History Variables. +* history_is_stifled: History List Management. +* history_length: History Variables. +* history_list: Information About the History List. +* history_no_expand_chars: History Variables. +* history_quotes_inhibit_expansion: History Variables. +* history_search: Searching the History List. +* history_search_delimiter_chars: History Variables. +* history_search_pos: Searching the History List. +* history_search_prefix: Searching the History List. +* history_set_history_state: Initializing History and State Management. +* history_set_pos: Moving Around the History List. +* history_subst_char: History Variables. +* history_tokenize: History Expansion. +* history_total_bytes: Information About the History List. +* history_truncate_file: Managing the History File. +* max_input_history: History Variables. +* next_history: Moving Around the History List. +* previous_history: Moving Around the History List. +* read_history: Managing the History File. +* read_history_range: Managing the History File. +* remove_history: History List Management. +* replace_history_entry: History List Management. +* stifle_history: History List Management. +* unstifle_history: History List Management. +* using_history: Initializing History and State Management. +* where_history: Information About the History List. +* write_history: Managing the History File.  Tag Table: -Node: Top973 -Node: Using History Interactively1567 -Node: History Interaction2075 -Node: Event Designators3127 -Node: Word Designators3770 -Node: Modifiers4676 -Node: Programming with GNU History5425 -Node: Introduction to History6152 -Node: History Storage7502 -Node: History Functions7766 -Node: History Variables13063 -Node: History Programming Example13499 -Node: Concept Index15744 -Node: Function and Variable Index16030 +Node: Top1167 +Node: Using History Interactively1747 +Node: History Interaction2255 +Node: Event Designators3674 +Node: Word Designators4601 +Node: Modifiers5850 +Node: Programming with GNU History6988 +Node: Introduction to History7714 +Node: History Storage9035 +Node: History Functions10128 +Node: Initializing History and State Management11099 +Node: History List Management11891 +Node: Information About the History List13412 +Node: Moving Around the History List14718 +Node: Searching the History List15603 +Node: Managing the History File17435 +Node: History Expansion18941 +Node: History Variables20785 +Node: History Programming Example23103 +Node: Concept Index25707 +Node: Function and Variable Index26193  End Tag Table diff --git a/readline/doc/history.ps b/readline/doc/history.ps new file mode 100644 index 00000000000..b9a28e87fb6 --- /dev/null +++ b/readline/doc/history.ps @@ -0,0 +1,2071 @@ +%!PS-Adobe-2.0 +%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software +%%Title: history.dvi +%%Pages: 18 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentPaperSizes: A4 +%%EndComments +%DVIPSCommandLine: dvips -D 300 -o history.ps history.dvi +%DVIPSParameters: dpi=300, comments removed +%DVIPSSource: TeX output 1998.04.02:1444 +%%BeginProcSet: tex.pro +/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N +/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 +mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} +ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale +isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div +hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul +TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} +forall round exch round exch]setmatrix}N /@landscape{/isls true N}B +/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B +/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ +/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N +string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N +end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ +/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] +N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup +length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ +128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub +get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data +dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N +/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup +/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx +0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff +setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff +.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} +if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup +length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ +cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin +0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul +add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict +/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook +known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X +/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for +65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 +0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V +{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 +getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} +ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false +RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 +false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform +round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg +rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail +{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} +B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ +4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ +p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p +a}B /bos{/SS save N}B /eos{SS restore}B end +%%EndProcSet +TeXDict begin 39158280 55380996 1000 300 300 (history.dvi) +@start /Fa 1 47 df<70F8F8F0E005057B840E>46 D E /Fb 1 +47 df<0E003F007F807F80FF80FF80FF007E003C000909798815>46 +D E /Fc 11 121 df<00800100020004000C000800180030003000300060006000600060 +00E000E000E000E000E000E000E000E000E000E000600060006000600030003000300018 +0008000C00040002000100008009267D9B0F>40 D<8000400020001000180008000C0006 +000600060003000300030003000380038003800380038003800380038003800380030003 +00030003000600060006000C0008001800100020004000800009267E9B0F>I73 D<003F0000070000070000070000070000 +070000070000070000070000070003E7000C1700180F00300700700700E00700E00700E0 +0700E00700E00700E00700600700700700380F001C370007C7E0131A7F9915>100 +D<07C01C3030187018600CE00CFFFCE000E000E000E0006000700438081C1807E00E107F +8F11>I<183C3C18000000000000FC1C1C1C1C1C1C1C1C1C1C1C1C1C1CFF081A80990A> +105 D110 D<07E01C38300C700E6006E007 +E007E007E007E007E0076006700E381C1C3807E010107F8F13>I<1F2060E04020C020C0 +20F0007F003FC01FE000F080708030C030C020F0408F800C107F8F0F>115 +D<0800080008000800180018003800FFC038003800380038003800380038003800382038 +203820382018201C4007800B177F960F>I +120 D E /Fd 2 42 df<00E001C00380078007000F001E001E001C003C003C0038007800 +780078007000F000F000F000F000F000F000F000F000F000F000F000F000F000F0007000 +78007800780038003C003C001C001E001E000F0007000780038001C000E00B2E7CA112> +40 DI +E /Fe 27 123 df<0007F800007FFC0001FC0E0003F01F0007E03F000FC03F000FC03F00 +0FC03F000FC01E000FC00C000FC000000FC000000FC0FF80FFFFFF80FFFFFF800FC01F80 +0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F80 +0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F807FF8FFF0 +7FF8FFF01C237FA220>12 D<000FFF80007FFF8001FC1F8003F03F8007E03F800FC03F80 +0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F80FFFFFF80FFFFFF80 +0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F80 +0FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F80 +7FF8FFF07FF8FFF01C237FA220>I<07FE00001FFF80003F07E0003F03F0003F01F0003F +01F8001E01F8000001F8000001F800003FF80003FDF8001F81F8003E01F8007C01F800F8 +01F800F801F800F801F800F801F8007C02F8007E0CF8001FF87F8007E03F8019167E951C +>97 DI<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000 +FC0000FC0000FC0000FC00007C00007E00007E00003E00181F00300FC06007FFC000FF00 +15167E9519>I<0001FF000001FF0000003F0000003F0000003F0000003F0000003F0000 +003F0000003F0000003F0000003F0000003F0000003F0000FE3F0007FFBF000FC1FF001F +007F003E003F007E003F007C003F007C003F00FC003F00FC003F00FC003F00FC003F00FC +003F00FC003F00FC003F007C003F007E003F003E003F001F007F000F81FF0007FF3FE001 +FC3FE01B237EA220>I<00FE0007FF800F83C01E01E03E00F07E00F07C00F87C0078FC00 +78FFFFF8FFFFF8FC0000FC0000FC00007C00007C00003E00183E00181F00300F80E003FF +C000FF0015167E951A>I<001F8000FFE001F1F003E3F007E3F00FC3F00FC1E00FC0000F +C0000FC0000FC0000FC0000FC000FFFE00FFFE000FC0000FC0000FC0000FC0000FC0000F +C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000F +C0007FFC007FFC0014237EA212>I<00FE0F8003FF9FC00F83E3C01F01F3C01E00F0003E +00F8003E00F8003E00F8003E00F8003E00F8001E00F0001F01F0000F83E0000BFF800008 +FE000018000000180000001C0000001FFFE0001FFFFC000FFFFF0007FFFF001FFFFF807C +001FC078000FC0F80007C0F80007C0F80007C07C000F803E001F001F807E000FFFFC0001 +FFE0001A217F951D>II<1E003F007F807F807F807F803F001E0000000000000000 +0000000000FF80FF801F801F801F801F801F801F801F801F801F801F801F801F801F801F +801F801F801F801F80FFF0FFF00C247EA30F>I107 DIII<00FF0007FFE00F81F01F00F83E007C7C003E7C003E7C003E +FC003FFC003FFC003FFC003FFC003FFC003FFC003F7C003E7E007E3E007C1F00F80F81F0 +07FFE000FF0018167E951D>II<00FE030007FF07000FC1CF001F00DF003F007F007E003F007E003F007C003F00 +FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F007E003F007E003F00 +3E007F001F00FF000FC1FF0007FF3F0000FC3F0000003F0000003F0000003F0000003F00 +00003F0000003F0000003F0000003F000001FFE00001FFE01B207E951E>II<07F9801F +FF80380780700380F00180F00180F80000FF0000FFF8007FFE003FFF001FFF8007FF8000 +3FC0C007C0C003C0E003C0E003C0F00380FC0F00EFFE00C3F80012167E9517>I<018000 +0180000180000180000380000380000780000780000F80003F8000FFFF00FFFF001F8000 +1F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F81801F8180 +1F81801F81801F81800F83000FC30007FE0001F80011207F9F16>IIIIII<7FFFF07FFFF07C07E0700F +C0601FC0E01F80C03F00C07F00C07E0000FC0001FC0003F80003F03007E0300FE0300FC0 +701F80703F80603F00E07E03E0FFFFE0FFFFE014167E9519>I E +/Ff 24 119 df<00E00000E00000E00000E00000E000F0E1E0FCE7E07EEFC01FFF0007FC +0001F00007FC001FFF007EEFC0FCE7E0F0E1E000E00000E00000E00000E00000E0001315 +7D991A>42 D<003800007C00007C00006C0000EE0000EE0000EE0000C60000C60001C700 +01C70001C70001C7000383800383800383800383800701C00701C007FFC007FFC00FFFE0 +0E00E00E00E00E00E00E00E01C00707F01FCFF83FE7F01FC171E7F9D1A>65 +D69 D<7FFFFCFFFFFC7FFFFC +0E001C0E001C0E001C0E001C0E001C0E00000E00000E03800E03800E03800FFF800FFF80 +0FFF800E03800E03800E03800E00000E00000E00000E00000E00000E00000E00000E0000 +7FE000FFE0007FE000161E7F9D1A>I72 DI78 D<0FFE003FFF807FFFC07C07C07001C0 +F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0 +E000E0E000E0E000E0E000E0E000E0E000E0F001E0F001E07001C07C07C07FFFC03FFF80 +0FFE00131E7D9D1A>I82 +D<03F1C00FFDC03FFFC07C0FC07003C0E003C0E001C0E001C0E001C0E000007000007800 +003F00001FF00007FE0000FF80000FC00001E00000E0000070000070600070E00070E000 +70E000E0F001E0FC03C0FFFF80EFFF00E3FC00141E7D9D1A>I<7FFFFEFFFFFEFFFFFEE0 +380EE0380EE0380EE0380EE0380E00380000380000380000380000380000380000380000 +380000380000380000380000380000380000380000380000380000380000380000380003 +FF8003FF8003FF80171E7F9D1A>I89 D<7FFFC0FFFFE0FFFFE07FFFC013047D7E1A>95 D<1FF0003FFC007FFE00780F +00300700000380000380007F8007FF801FFF803F8380780380700380E00380E00380E003 +80700780780F803FFFFC1FFDFC07F0FC16157D941A>97 D<00FF8003FFC00FFFE01F01E0 +3C00C0780000700000700000E00000E00000E00000E00000E00000700000700000780070 +3C00701F01F00FFFE003FFC000FE0014157D941A>99 D<001FC0001FC0001FC00001C000 +01C00001C00001C00001C00001C001F1C007FDC00FFFC01E0FC03C07C07803C07001C0E0 +01C0E001C0E001C0E001C0E001C0E001C0E001C07003C07003C03807C03E0FC01FFFFC07 +FDFC01F1FC161E7E9D1A>I +104 D<01C00003E00003E00003E00001C0000000000000000000000000000000007FE000 +7FE0007FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000 +00E00000E00000E00000E00000E0007FFF80FFFFC07FFF80121F7C9E1A>I110 +D<01F00007FC001FFF003E0F803C07807803C07001C0E000E0E000E0E000E0E000E0E000 +E0E000E0F001E07001C07803C03C07803E0F801FFF0007FC0001F00013157D941A>I<7F +81F8FF8FFC7F9FFE03FE1E03F80C03E00003E00003C00003800003800003800003800003 +80000380000380000380000380000380007FFF00FFFF007FFF0017157F941A>114 +D<0180000380000380000380000380000380000380007FFFE0FFFFE0FFFFE00380000380 +000380000380000380000380000380000380000380000380000380700380700380700380 +7001C1E001FFE000FF80003F00141C7F9B1A>116 DI<7FC7FCFFC7FE7FC7FC0E00E00E00E00E +00E00701C00701C00701C003838003838003838001C70001C70001C70000EE0000EE0000 +EE00007C00007C0000380017157F941A>I E /Fg 41 123 df<0007FC00003FFF0000FE +078003F007C007E00FC007E00FC00FC00FC00FC00FC00FC00FC00FC003000FC000000FC0 +00000FC000000FC07FE0FFFFFFE0FFFFFFE00FC007E00FC007E00FC007E00FC007E00FC0 +07E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC0 +07E00FC007E00FC007E00FC007E00FC007E00FC007E00FC007E0FFFC7FFEFFFC7FFE1F26 +7FA522>12 D<3C7EFFFFFFFF7E3C08087C8711>46 D<001C00003C0000FC00FFFC00FFFC +0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC +0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC +0000FC0000FC0000FC0000FC007FFFFC7FFFFC16237CA21F>49 D<01FF0007FFC01E07F0 +3803F86001FC7C00FEFE00FEFE00FFFE007FFE007F7C007F3800FF0000FF0000FE0000FE +0001FC0001F80003F00007E0000780000F00001E00003C0000700000E00301C003038007 +0700060600060FFFFE1FFFFE3FFFFE7FFFFCFFFFFCFFFFFC18237DA21F>I<01FF0007FF +E01E03F03801F83C01FC7E00FE7E00FE7E00FE3E00FE1C01FE0001FC0001FC0003F80007 +F0000FC001FF0001FF000007E00001F00001F80000FC0000FE0000FF0000FF1000FF7C00 +FFFE00FFFE00FFFE00FEFE00FE7C01FC7001F83E07F00FFFC001FF0018237DA21F>I<00 +00380000007800000078000000F8000001F8000003F8000007F8000006F800000CF80000 +1CF8000038F8000030F8000060F80000E0F80001C0F8000180F8000300F8000700F8000E +00F8001C00F8001800F8003000F8007000F800E000F800FFFFFFC0FFFFFFC00001F80000 +01F8000001F8000001F8000001F8000001F8000001F800007FFFC0007FFFC01A237EA21F +>I<18000C1F007C1FFFF81FFFF01FFFE01FFFC01FFF801FFC0018000018000018000018 +000018000018FF001BFFE01F03F01C00F80800FC00007E00007E00007E00007F00007F78 +007FFC007FFC007FFC007FFC007EF8007E6000FC7000FC3801F81E07E007FFC001FE0018 +237DA21F>I<001FC0007FF001F03803E00C07803E0F807E1F007E3F007E3F007E7E003C +7E00007E00007E0000FE3FC0FE7FF0FE80F8FF80FCFF007CFF007EFE007EFE007FFE007F +FE007FFE007F7E007F7E007F7E007F7E007F3E007E3F007E1F007C0F80F807C1F003FFC0 +007F0018237DA21F>I<300000003C0000003FFFFFC03FFFFFC03FFFFF807FFFFF007FFF +FE007FFFFC006000180060001800E0003000C0006000C000C00000018000000180000003 +000000060000000E0000000E0000001C0000001C0000003C0000003C0000007800000078 +000000F8000000F8000000F8000000F8000001F8000001F8000001F8000001F8000001F8 +000001F8000000F00000006000001A257DA41F>I<00001C00000000001C00000000003E +00000000003E00000000003E00000000007F00000000007F0000000000FF8000000000FF +8000000000FF80000000019FC0000000019FC0000000031FE0000000030FE0000000070F +F00000000607F00000000607F00000000C07F80000000C03F80000001C03FC0000001801 +FC0000001801FC0000003000FE0000003000FE0000007FFFFF0000007FFFFF000000E000 +7F800000C0003F800000C0003F80000180003FC0000180001FC0000380001FE000030000 +0FE0000300000FE00007000007F000FFF000FFFF80FFF000FFFF8029257EA42E>65 +D68 DII72 DI76 DI<00FF008007FFE3800F80F7801E001F803C000F +807800078078000380F8000380F8000180F8000180FC000180FC000000FF0000007FE000 +007FFE00003FFFE0003FFFF8001FFFFE0007FFFF0003FFFF80007FFF800003FFC000003F +C000000FE0000007E0000007E0C00003E0C00003E0C00003E0C00003C0E00003C0F00007 +C0F8000780FC000F00FFC03E00E3FFF800803FE0001B257DA422>83 +D87 D<07FF00001FFFE0003E03F0003F00F8003F00FC +003F007E001E007E0000007E0000007E0000007E00001FFE0003FE7E000FC07E001F007E +003E007E007E007E00FC007E00FC007E00FC007E00FC00BE007E01BE003F073E001FFE1F +E007F00FE01B187E971E>97 DI<007FE003FFF807C0 +7C1F80FC1F00FC3F00FC7E00787E0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 +00FE00007E00007F00003F000C1F800C1FC01807E07003FFE0007F0016187E971B>I<00 +00FFC00000FFC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000 +000FC000000FC000000FC000000FC000000FC0007F0FC003FFCFC00FE0FFC01F803FC03F +000FC03F000FC07E000FC07E000FC0FE000FC0FE000FC0FE000FC0FE000FC0FE000FC0FE +000FC0FE000FC0FE000FC07E000FC07E000FC03F000FC03F001FC01F803FC00FC0EFC003 +FFCFFC00FE0FFC1E267EA522>I<007F0003FFC007C1F00F80F81F00F83F007C7E007C7E +007EFE007EFE007EFFFFFEFFFFFEFE0000FE0000FE00007E00007E00007E00063F00061F +000C0F801807E07003FFE0007F8017187E971C>I<001FC0007FF001F8F003E1F807E1F8 +07C1F80FC0F00FC0000FC0000FC0000FC0000FC0000FC0000FC000FFFF00FFFF000FC000 +0FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC000 +0FC0000FC0000FC0000FC0000FC0000FC0000FC000FFFE00FFFE0015267EA513>I<01FF +07C007FFDFE00F83F1E01F01F1E03E00F8007E00FC007E00FC007E00FC007E00FC007E00 +FC007E00FC003E00F8001F01F0000F83E0000FFFC00011FF000030000000300000003800 +00003C0000003FFFE0001FFFFC001FFFFE000FFFFF001FFFFF803C003F8078000FC0F800 +07C0F80007C0F80007C0F80007C07C000F803E001F001F807E0007FFF80000FFC0001B24 +7E971F>II<0F001F803FC03FC03FC03FC01F800F00 +00000000000000000000000000007FC07FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0 +0FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0FFF8FFF80D277EA611>I108 DII<007F800003FFF00007C0F8001F807E003F003F003F003F00 +7E001F807E001F80FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0 +FE001FC07E001F807E001F803F003F003F003F001F807E000FC0FC0003FFF000007F8000 +1A187E971F>II114 D<07F8C01FFFC03C07C07001C0F000C0F000 +C0F000C0FC0000FF80007FFC007FFE003FFF800FFFC003FFC0001FE00003E0C001E0C001 +E0E001E0E001C0F003C0FC0780EFFF00C3FC0013187E9718>I<00C00000C00000C00000 +C00001C00001C00001C00003C00007C0000FC0001FC000FFFFC0FFFFC00FC0000FC0000F +C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0600FC0600F +C0600FC0600FC0600FC06007E0C007E1C001FF80007E0013237FA218>III120 DI<7FFFF87FFFF87C03F07007F0600FE0E0 +0FC0E01F80C03F80C03F00C07E0000FE0000FC0001F80003F80C03F00C07E00C0FE00C0F +C01C1F80183F80387F00787E01F8FFFFF8FFFFF816187E971B>I +E /Fh 30 122 df<0003F07C001E0DC600380F0F00701E0F00E01E0E00E00C0001C01C00 +01C01C0001C01C0001C01C0001C01C00038038007FFFFFC0038038000380380003803800 +038038000700700007007000070070000700700007007000070070000E00E0000E00E000 +0E00E0000E00E0000E00E0000E00E0001C01C0001E01E000FF8FFC0020207E9F1B>11 +D<0003E0001C1800381800703C00E03C00E03801C00001C00001C00001C00001C0000380 +007FFFF00380700380700380700380700700E00700E00700E00700E00700E00700E00E01 +C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FF0FF016207E9F19>I<0003F03F +00001E09E08000380F80C000701F01E000E03E01E000E01E01C001C01C000001C01C0000 +01C01C000001C01C000001C01C000003803800007FFFFFFF800380380380038038038003 +803803800380380380070070070007007007000700700700070070070007007007000700 +7007000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E001C01C0 +1C001E01E01E00FF8FF8FFC023207E9F26>14 D<00200000600000600000600000600030 +61C03C43800E4E0007780001E00001E00007B8001C9C00708F00E0830001800001800001 +800001800001000012147AA117>42 D<0018003801F80E700070007000700070007000E0 +00E000E000E000E000E001C001C001C001C001C001C00380038003800380038003800700 +0780FFFC0E1E7B9D17>49 D<003F8000C1E00100700200780400780400780F007C0F807C +0F807C0F00780600780000F80000F00001E00001C0000380000700000E00001C00003800 +00600000C0000180000300200600200800401000403FFFC07FFF80FFFF80161E7E9D17> +I<00FF01FE01800180018001800180030003000300030003000300060006000600060006 +0006000C000C000C000C000C000C00180018001800180018001800300030003000300030 +003000600060006000600060006000FF00FF00102D7EA10D>91 D<00FF01FE0006000600 +0600060006000C000C000C000C000C000C00180018001800180018001800300030003000 +300030003000600060006000600060006000C000C000C000C000C000C001800180018001 +8001800180FF00FF00102D82A10D>93 D<07F8000C0C001E06001E07001C070000070000 +070000070000FF0007C7001E07003C0E00780E00F00E10F00E10F00E10F01E10F02E2078 +4F401F878014147D9317>97 D<00FE000383000E07801C0780380700380000780000F000 +00F00000F00000F00000E00000E00000E00000F00000F001007002003804001C180007E0 +0011147D9314>99 D<0000380001F8000078000038000038000070000070000070000070 +0000700000700000E000FCE00382E00601E01C01E03C00E03801C07801C0F001C0F001C0 +F001C0F001C0E00380E00380E00380E00380F00380700780380F001C378007C7E015207D +9F19>I<00F800070E000E07001C0700380380780380700380F00380F00380FFFF80F000 +00E00000E00000E00000E00000F001007002003004001C180007E00011147D9314>I<00 +07C0001C600030F00060F000E0E000C00001C00001C00001C00001C00001C0000380003F +FC000380000380000380000380000700000700000700000700000700000700000E00000E +00000E00000E00000E00000E00001C00001E0000FFC00014207F9F0E>I<00000E003E11 +00E1A301C1C20381E00780E00701E00F01E00F01E00F01E00703C007038007870004FC00 +0800000800001800001C00000FFF000FFFC00FFFE01800F0300030600030C00030C00030 +C000306000603000C01C070007FC00181F809417>I<00E00007E00001E00000E00000E0 +0001C00001C00001C00001C00001C00001C000038000038F800390E003A0E003C0600380 +600780E00700E00700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01 +C01C03801E03C0FF8FF014207E9F19>I<01C003E003E003C00180000000000000000000 +00000003801F800780038003800700070007000700070007000E000E000E000E000E000E +001C001E00FF800B1F7F9E0C>I<00E007E001E000E000E001C001C001C001C001C001C0 +0380038003800380038003800700070007000700070007000E000E000E000E000E000E00 +1C001E00FF800B207F9F0C>108 D<0387C07C001F9861860007A072070003C034030003 +803803000780780700070070070007007007000700700700070070070007007007000E00 +E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E001C01C01C001E01E0 +1E00FFCFFCFFC022147E9326>I<038F801F90E007A0E003C0600380600780E00700E007 +00E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FF +8FF014147E9319>I<00FC000387000E01801C00C03800E03800E07000F0F000F0F000F0 +F000F0F000F0E001E0E001E0E001C0E003C0F00380700700380E001C1C0007E00014147D +9317>I<00E3E00007EC380000F01C0000E00E0000E00F0001C0070001C0078001C00780 +01C0078001C0078001C0078003800F0003800F0003800E0003801E0003801C0003803800 +074070000761C000071F00000700000007000000070000000E0000000E0000000E000000 +0E0000001E000000FFC00000191D809319>I<00FC200382600702601E01E03C01E03801 +C07801C0F001C0F001C0F001C0F001C0E00380E00380F00380F00380F00780700780380F +001C370007C700000700000700000700000E00000E00000E00000E00001E0000FFC0131D +7D9318>I<038E001FB38007C78003C78003830007800007000007000007000007000007 +00000E00000E00000E00000E00000E00000E00001C00001E0000FFC00011147E9312>I< +01F9060708031803180138023C001F001FF007FC01FE001F40074003400360036006F004 +C81887E010147F9312>I<0080010001000100030007000F001E00FFF80E000E000E000E +001C001C001C001C001C001C00380038103810381038103820382018400F800D1C7C9B12 +>I<1C0380FC1F803C07801C03801C038038070038070038070038070038070038070070 +0E00700E00700E00700E00701E00701E00703C00305E001F9F8011147B9319>III<1FF0FF03C07801C07001C04000E0C000E180007300007600003C00003C +00001C00002E00004E000087000107000203800403800C01C03C03E0FE07FC18147F9318 +>I<0FF83F8001E00E0001C00C0001C0080001E0080000E0100000E0300000E0200000E0 +40000070400000708000007080000071000000390000003A0000003E0000003C00000038 +000000180000001000000010000000200000002000000040000070C00000F0800000F100 +0000E600000078000000191D809318>I E /Fi 36 122 df<0001C0000003C000000FC0 +00007FC0001FFFC000FFFFC000FFBFC000E03FC000003FC000003FC000003FC000003FC0 +00003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0 +00003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0 +00003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0 +00003FC000003FC000003FC000003FC0007FFFFFF07FFFFFF07FFFFFF01C2E7AAD28>49 +D<003FE00001FFFE0007FFFF800F80FFC01E003FE038001FF07C000FF87E0007FCFF0007 +FCFF8007FEFF8007FEFF8003FEFF8003FE7F0003FE3E0007FE000007FE000007FC000007 +FC00000FF800000FF800000FF000001FE000001FC000003F8000007F0000007E000000F8 +000001F0000003E0000007C000000F0000001E000E003C000E0038000E0070001E00E000 +1C01C0001C0300003C07FFFFFC0FFFFFFC1FFFFFFC3FFFFFFC7FFFFFF8FFFFFFF8FFFFFF +F8FFFFFFF81F2E7CAD28>I<0000007800000000000078000000000000FC000000000000 +FC000000000000FC000000000001FE000000000001FE000000000003FF000000000003FF +000000000007FF800000000007FF800000000007FF80000000000FFFC0000000000E7FC0 +000000001E7FE0000000001C3FE0000000001C3FE000000000383FF000000000381FF000 +000000781FF800000000700FF800000000700FF800000000E00FFC00000000E007FC0000 +0001E007FE00000001C003FE00000001C003FE000000038001FF000000038001FF000000 +078001FF800000070000FF8000000F0000FFC000000FFFFFFFC000000FFFFFFFC000001F +FFFFFFE000001C00003FE000003C00003FF000003800001FF000003800001FF000007000 +001FF800007000000FF80000F000000FFC0000E0000007FC0000E0000007FC0001C00000 +07FE0003E0000003FE00FFFF0001FFFFFCFFFF0001FFFFFCFFFF0001FFFFFC36317DB03D +>65 DI<000003FF800180 +00003FFFF003800001FFFFFC07800007FF003F0F80001FF800079F80003FC00001FF8000 +FF800000FF8001FE0000007F8003FC0000003F8007FC0000001F8007F80000000F800FF0 +0000000F801FF000000007801FF000000007803FE000000007803FE000000003807FE000 +000003807FE000000003807FC000000000007FC00000000000FFC00000000000FFC00000 +000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000000 +0000FFC00000000000FFC000000000007FC000000000007FC000000000007FE000000000 +007FE000000003803FE000000003803FE000000003801FF000000003801FF00000000780 +0FF0000000070007F8000000070007FC0000000E0003FC0000001E0001FE0000001C0000 +FF8000007800003FC00000F000001FF80003E0000007FF003F80000001FFFFFE00000000 +3FFFF80000000003FF80000031317CB03A>I70 +D<000003FF00030000007FFFF007000001FFFFFC0F000007FF007E1F00001FF0000FBF00 +007FC00003FF0000FF800001FF0001FE0000007F0003FC0000007F0007FC0000003F000F +F80000001F000FF00000001F001FF00000000F001FF00000000F003FE000000007003FE0 +00000007007FE000000007007FE000000007007FC00000000000FFC00000000000FFC000 +00000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000 +000000FFC00000000000FFC00000000000FFC00000000000FFC00007FFFFF87FC00007FF +FFF87FE00007FFFFF87FE0000001FF003FE0000001FF003FE0000001FF001FF0000001FF +001FF0000001FF000FF0000001FF000FF8000001FF0007FC000001FF0003FC000001FF00 +01FE000001FF0000FF800001FF00007FC00003FF00001FF800077F000007FF003E3F0000 +01FFFFFC1F0000007FFFF00F00000003FF80030035317CB03F>III78 D80 +D<7FFFFFFFFFFF007FFFFFFFFFFF007FFFFFFFFFFF007FC00FF801FF007E000FF8003F00 +7C000FF8001F0078000FF8000F0078000FF8000F0070000FF8000700F0000FF8000780F0 +000FF8000780F0000FF8000780E0000FF8000380E0000FF8000380E0000FF8000380E000 +0FF8000380E0000FF800038000000FF800000000000FF800000000000FF800000000000F +F800000000000FF800000000000FF800000000000FF800000000000FF800000000000FF8 +00000000000FF800000000000FF800000000000FF800000000000FF800000000000FF800 +000000000FF800000000000FF800000000000FF800000000000FF800000000000FF80000 +0000000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000 +00000FF800000000000FF800000000000FF800000000000FF8000000007FFFFFFF000000 +7FFFFFFF0000007FFFFFFF000031307DAF38>84 DII<00FFF0000003FFFF00000F803F80000FC00FE0001FE0 +07F0001FE007F0001FE003F8000FC003FC00078003FC00000003FC00000003FC00000003 +FC00000003FC000000FFFC00001FFFFC0000FFE3FC0003FC03FC000FF003FC001FC003FC +003FC003FC007F8003FC007F8003FC00FF0003FC00FF0003FC00FF0003FC00FF0007FC00 +FF0007FC007F800DFC003FC01DFE001FE078FFF007FFE07FF000FF803FF024207E9F27> +97 D<01F8000000FFF8000000FFF8000000FFF80000000FF800000007F800000007F800 +000007F800000007F800000007F800000007F800000007F800000007F800000007F80000 +0007F800000007F800000007F800000007F800000007F83FE00007F8FFFC0007FBE07F00 +07FF001F8007FE000FC007FC000FE007F80007F007F80007F807F80007F807F80003FC07 +F80003FC07F80003FC07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F8 +0003FE07F80003FE07F80003FE07F80003FC07F80003FC07F80003FC07F80007F807F800 +07F807F80007F007FC000FE007FE000FC007E7003F8007C3C0FE000780FFF80007003FC0 +0027327EB12D>I<000FFF00007FFFC001FC01F003F003F007E007F80FE007F81FC007F8 +3FC003F03FC001E07F8000007F8000007F800000FF800000FF800000FF800000FF800000 +FF800000FF800000FF800000FF8000007F8000007F8000007F8000003FC0001C3FC0001C +1FC000380FE0003807E0007003F001E001FC07C0007FFF00000FF8001E207D9F24>I<00 +00000FC0000007FFC0000007FFC0000007FFC00000007FC00000003FC00000003FC00000 +003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000000 +3FC00000003FC00000003FC00000003FC00007F83FC0003FFF3FC000FE07BFC003F801FF +C007E0007FC00FE0007FC01FC0003FC03FC0003FC03FC0003FC07F80003FC07F80003FC0 +7F80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF +80003FC0FF80003FC07F80003FC07F80003FC07F80003FC03FC0003FC03FC0003FC01FC0 +003FC00FE0007FC007E000FFC003F003FFE001FC0F3FFE007FFE3FFE000FF03FFE27327D +B12D>I<000FFC00007FFF8001FC0FC003F003E007E001F00FE001F81FC000FC3FC000FE +3FC000FE7F80007E7F80007F7F80007FFF80007FFF80007FFFFFFFFFFFFFFFFFFF800000 +FF800000FF800000FF8000007F8000007F8000007F8000003FC000071FC000071FC0000E +0FE0000E07F0001C03F8007800FE03E0003FFFC00007FE0020207E9F25>I<0001FE0000 +0FFF80001FC3C0007F07E000FE0FF001FE0FF001FC0FF003FC0FF003FC07E003FC018003 +FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0000FFFFFC00FF +FFFC00FFFFFC0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003 +FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003 +FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003 +FC00007FFFF0007FFFF0007FFFF0001C327EB119>I<001FF007C000FFFE3FE001F83F79 +F007E00FC3F00FE00FE1F00FC007E0E01FC007F0001FC007F0003FC007F8003FC007F800 +3FC007F8003FC007F8003FC007F8001FC007F0001FC007F0000FC007E0000FE00FE00007 +E00FC00003F83F000006FFFE00000E1FF000000E000000001E000000001E000000001F00 +0000001F800000001FFFFF80000FFFFFF0000FFFFFFC0007FFFFFE0003FFFFFF0003FFFF +FF800FFFFFFFC03F00007FC07E00001FE07C00000FE0FC000007E0FC000007E0FC000007 +E0FC000007E07E00000FC03E00000F803F00001F800FC0007E0007F803FC0001FFFFF000 +001FFF0000242F7E9F28>I<01F8000000FFF8000000FFF8000000FFF80000000FF80000 +0007F800000007F800000007F800000007F800000007F800000007F800000007F8000000 +07F800000007F800000007F800000007F800000007F800000007F800000007F807F80007 +F83FFE0007F8783F0007F8C03F8007F9801FC007FB001FC007FE001FE007FC001FE007FC +001FE007FC001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F800 +1FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001F +E007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0FFFFC3FFFF +FFFFC3FFFFFFFFC3FFFF28327DB12D>I<03C00007E0000FF0001FF8001FF8001FF8001F +F8000FF00007E00003C00000000000000000000000000000000000000000000000000000 +000001F8007FF8007FF8007FF80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F800FFFF80FFFF80FFFF8011337DB217>I<01F800 +FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F80007F800 +07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 +07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 +07F80007F80007F80007F80007F80007F80007F80007F80007F80007F800FFFFC0FFFFC0 +FFFFC012327DB117>108 D<03F007F8001FE000FFF03FFE00FFF800FFF0783F01E0FC00 +FFF0C03F8300FE000FF1801FC6007F0007F3001FCC007F0007F6001FF8007F8007FC001F +F0007F8007FC001FF0007F8007FC001FF0007F8007F8001FE0007F8007F8001FE0007F80 +07F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001F +E0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F80 +07F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001F +E0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F80FFFFC3FFFF0FFFFC +FFFFC3FFFF0FFFFCFFFFC3FFFF0FFFFC3E207D9F43>I<03F007F800FFF03FFE00FFF078 +3F00FFF0C03F800FF1801FC007F3001FC007F6001FE007FC001FE007FC001FE007FC001F +E007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0 +07F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007 +F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0FFFFC3FFFFFFFFC3FFFFFFFF +C3FFFF28207D9F2D>I<0007FC0000007FFFC00001FC07F00003F001F80007E000FC000F +C0007E001FC0007F003FC0007F803F80003F807F80003FC07F80003FC07F80003FC0FF80 +003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF8000 +3FE07F80003FC07F80003FC07F80003FC03FC0007F803FC0007F801FC0007F000FE000FE +0007E000FC0003F803F80001FE0FF000007FFFC0000007FC000023207E9F28>I<01F83F +E000FFF8FFFC00FFFBE07F00FFFF003F8007FE001FC007FC000FE007F8000FF007F80007 +F807F80007F807F80007FC07F80003FC07F80003FC07F80003FE07F80003FE07F80003FE +07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FC07F80007FC07 +F80007FC07F80007F807F80007F807F8000FF007FC000FE007FE001FC007FF003F8007FB +C0FE0007F8FFF80007F83FC00007F800000007F800000007F800000007F800000007F800 +000007F800000007F800000007F800000007F800000007F800000007F8000000FFFFC000 +00FFFFC00000FFFFC00000272E7E9F2D>I<03F03F00FFF07FC0FFF1C3E0FFF187E00FF3 +0FF007F60FF007F60FF007FC07E007FC03C007FC000007FC000007F8000007F8000007F8 +000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8 +000007F8000007F8000007F8000007F8000007F8000007F80000FFFFE000FFFFE000FFFF +E0001C207E9F21>114 D<01FF860007FFFE001F00FE003C003E0078001E0078000E00F8 +000E00F8000E00F8000E00FC000000FF800000FFFC00007FFFC0003FFFF0003FFFF8001F +FFFC0007FFFE0001FFFF00003FFF000000FF8000003F8060001F80E0000F80E0000F80F0 +000F80F0000F00F8000F00FC001E00FE001C00FF807800F3FFF000C07F800019207D9F20 +>I<001C0000001C0000001C0000001C0000001C0000003C0000003C0000003C0000007C +0000007C000000FC000001FC000003FC000007FC00001FFFFE00FFFFFE00FFFFFE0003FC +000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC +000003FC000003FC000003FC000003FC000003FC000003FC000003FC038003FC038003FC +038003FC038003FC038003FC038003FC038001FC038001FC070000FE0700007F0E00003F +FC000007F000192E7FAD1F>I<01F80007E0FFF803FFE0FFF803FFE0FFF803FFE00FF800 +3FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001F +E007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0 +07F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8003FE007F8003FE003 +F8007FE003F8007FE001FC00DFF000FE039FFF007FFF1FFF000FFC1FFF28207D9F2D>I< +FFFF001FFCFFFF001FFCFFFF001FFC0FF80003C007F800038007FC00078003FC00070003 +FE00070001FE000E0001FF000E0000FF001C0000FF001C0000FF803C00007F803800007F +C07800003FC07000003FE0F000001FE0E000001FF1E000000FF1C000000FF9C0000007FB +80000007FB80000007FF80000003FF00000003FF00000001FE00000001FE00000000FC00 +000000FC00000000780000000078000026207E9F2B>II<7FFF807FFC7FFF807FFC7FFF807FFC03FC000F0001FE001E0000FF003C0000FF8038 +00007FC07800003FC0F000001FE1E000000FF3C000000FFF80000007FF00000003FE0000 +0001FE00000000FF00000000FF80000000FFC0000001FFC0000003DFE00000078FF00000 +078FF800000F07FC00001E03FE00003C01FE00007800FF0000F000FF8001E0007FC003E0 +003FE0FFFC01FFFFFFFC01FFFFFFFC01FFFF28207F9F2B>II E /Fj 3 106 df<0000FF00000007FFE000001F00F8000078001E +0000E0000700018000018003000000C006000000600C000000300C000000301800000018 +300000000C300000000C6000000006600000000660000000066000000006C000000003C0 +00000003C000000003C000000003C000000003C000000003C000000003C000000003C000 +0000036000000006600000000660000000066000000006300000000C300000000C180000 +00180C000000300C00000030060000006003000000C0018000018000E00007000078001E +00001F00F8000007FFE0000000FF0000282B7EA02D>13 D<0020006000C000C000C00180 +0180030003000300060006000C000C0018001800180030003000600060006000C000C000 +600060006000300030001800180018000C000C00060006000300030003000180018000C0 +00C000C0006000200B2E7CA112>104 DI E /Fk 44 122 df<3C007F00FF80FF80FFC0FFC0FFC07FC03EC000C0 +00C00180018001800300030006000E001C00380010000A157B8813>44 +D<1C007F007F00FF80FF80FF807F007F001C0009097B8813>46 D<000E00001E00007E00 +07FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 +00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 +00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00FFFFFEFFFFFEFFFFFE +17277BA622>49 D<00FF800007FFF0000FFFFC001E03FE003800FF807C003F80FE003FC0 +FF001FC0FF001FE0FF000FE0FF000FE07E000FE03C001FE000001FE000001FC000001FC0 +00003F8000003F0000007E000000FC000000F8000001F0000003E00000078000000F0000 +001E0000003C00E0007000E000E000E001C001C0038001C0060001C00FFFFFC01FFFFFC0 +3FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007 +FFFC000F81FE001F007F003F807F003F803F803F803F803F803F801F803F801F003F8000 +007F0000007F0000007E000000FC000001F8000007F00000FFC00000FFC0000001F80000 +007E0000003F0000003F8000001FC000001FC000001FE000001FE03C001FE07E001FE0FF +001FE0FF001FE0FF001FC0FF003FC0FE003F807C007F003F01FE001FFFFC0007FFF00000 +FF80001B277DA622>I<00000F0000000F0000001F0000003F0000007F000000FF000001 +FF000001FF000003BF0000073F00000E3F00001C3F00003C3F0000383F0000703F0000E0 +3F0001C03F0003803F0007803F0007003F000E003F001C003F0038003F0070003F00F000 +3F00FFFFFFF8FFFFFFF8FFFFFFF800007F0000007F0000007F0000007F0000007F000000 +7F0000007F0000007F00001FFFF8001FFFF8001FFFF81D277EA622>I<180003001F801F +001FFFFE001FFFFC001FFFF8001FFFF0001FFFC0001FFF00001C0000001C0000001C0000 +001C0000001C0000001C0000001C0000001C7FC0001DFFF8001F80FC001E003F0008003F +0000001F8000001FC000001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001F +E0FE001FE0FE001FC0FC001FC078003F8078003F803C007F001F01FE000FFFFC0003FFF0 +0000FF80001B277DA622>I<00000780000000000780000000000FC0000000000FC00000 +00000FC0000000001FE0000000001FE0000000003FF0000000003FF0000000003FF00000 +000077F80000000077F800000000F7FC00000000E3FC00000000E3FC00000001C1FE0000 +0001C1FE00000003C1FF0000000380FF0000000380FF00000007007F80000007007F8000 +000F007FC000000E003FC000000E003FC000001C001FE000001C001FE000003FFFFFF000 +003FFFFFF000003FFFFFF00000700007F80000700007F80000F00007FC0000E00003FC00 +01E00003FE0001C00001FE0001C00001FE0003C00001FF00FFFE003FFFFCFFFE003FFFFC +FFFE003FFFFC2E297EA833>65 DI<00007FE0030007FFFC07001FFFFF0F007FF00F9F00FF0001FF01 +FC0000FF03F800007F07F000003F0FE000001F1FC000001F1FC000000F3F8000000F3F80 +0000077F800000077F800000077F00000000FF00000000FF00000000FF00000000FF0000 +0000FF00000000FF00000000FF00000000FF00000000FF000000007F000000007F800000 +007F800000073F800000073F800000071FC00000071FC000000E0FE000000E07F000001C +03F800003C01FC00007800FF0001F0007FF007C0001FFFFF800007FFFE0000007FF00028 +297CA831>I69 DI<00 +007FE003000007FFFC0700001FFFFF0F00007FF00F9F0000FF0001FF0001FC0000FF0003 +F800007F0007F000003F000FE000001F001FC000001F001FC000000F003F8000000F003F +80000007007F80000007007F80000007007F0000000000FF0000000000FF0000000000FF +0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF +0000FFFFF87F0000FFFFF87F8000FFFFF87F800000FF003F800000FF003F800000FF001F +C00000FF001FC00000FF000FE00000FF0007F00000FF0003F80000FF0001FC0000FF0000 +FF0001FF00007FF007FF00001FFFFF9F000007FFFE0F0000007FF003002D297CA835>I< +FFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFF03FC00003FC003FC00003FC003FC00003FC0 +03FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC0 +03FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC0 +03FFFFFFFFC003FFFFFFFFC003FFFFFFFFC003FC00003FC003FC00003FC003FC00003FC0 +03FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC0 +03FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC003FC00003FC0 +03FC00003FC003FC00003FC0FFFFF00FFFFFFFFFF00FFFFFFFFFF00FFFFF30297EA835> +II78 D80 D82 D<00FF806003FFF0E00FFFF8E0 +1F80FDE03F001FE03E0007E07C0003E07C0003E0FC0001E0FC0001E0FC0000E0FE0000E0 +FE0000E0FF000000FFC000007FFC00007FFFE0003FFFF8001FFFFE001FFFFF0007FFFF80 +03FFFFC000FFFFC0000FFFE000007FE000001FF000000FF0000007F0E00003F0E00003F0 +E00003F0E00003F0F00003E0F00003E0F80007E0FC0007C0FF000F80FFE03F80E3FFFE00 +E1FFFC00C01FF0001C297CA825>I85 DII<03FF +80000FFFF0001F01FC003F80FE003F807F003F803F003F803F801F003F8000003F800000 +3F8000003F8000003F80003FFF8001FC3F800FE03F801F803F803F003F807E003F80FC00 +3F80FC003F80FC003F80FC003F80FC005F807E00DF803F839FFC1FFE0FFC03FC03FC1E1B +7E9A21>97 D +I<003FF00001FFFC0003F03E000FC07F001F807F003F007F003F007F007F003E007E0000 +007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007E0000 +007E0000007F0000003F0003803F8003801F8007000FE00E0003F83C0001FFF800003FC0 +00191B7E9A1E>I<00007FF000007FF000007FF0000007F0000007F0000007F0000007F0 +000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0003F87F0 +01FFF7F007F03FF00FC00FF01F8007F03F0007F03F0007F07E0007F07E0007F07E0007F0 +FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F07E0007F0 +7E0007F03F0007F03F0007F01F800FF00FC01FF007E07FFF01FFE7FF007F87FF202A7EA9 +25>I<003FC00001FFF00003E07C000F803E001F801F001F001F003F000F807E000F807E +000FC07E000FC0FE0007C0FE0007C0FFFFFFC0FFFFFFC0FE000000FE000000FE0000007E +0000007E0000007F0000003F0001C01F0001C00F80038007C0070003F01E0000FFFC0000 +3FE0001A1B7E9A1F>I<0007F8003FFC007E3E01FC7F03F87F03F07F07F07F07F03E07F0 +0007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00 +FF80F003FFE3F80FC1FE1C1F007C7C3F007E7C3E003E107E003F007E003F007E003F007E +003F007E003F007E003F003E003E003F007E001F007C000FC1F8000BFFE00018FF800018 +00000038000000380000003C0000003FFFF8003FFFFF001FFFFFC00FFFFFE007FFFFF01F +FFFFF03C0007F07C0001F8F80000F8F80000F8F80000F8F80000F87C0001F07C0001F03F +0007E00FC01F8007FFFF00007FF0001E287E9A22>II<07000F801FC03FE03FE03FE01FC00F80070000 +00000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00F +E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7EAA12 +>I108 DII<003FE00001FFFC0003F07E000FC01F801F800FC03F0007E03F00 +07E07E0003F07E0003F07E0003F0FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE00 +03F8FE0003F8FE0003F87E0003F07E0003F03F0007E03F0007E01F800FC00FC01F8007F0 +7F0001FFFC00003FE0001D1B7E9A22>II< +FFC1F0FFC7FCFFC63E0FCC7F0FD87F0FD07F0FD07F0FF03E0FE0000FE0000FE0000FE000 +0FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE000 +FFFF00FFFF00FFFF00181B7F9A1B>114 D<03FE300FFFF03E03F07800F07000F0F00070 +F00070F80070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800FFF80007FC0000FC +E0007CE0003CF0003CF00038F80038FC0070FF01E0E7FFC0C1FF00161B7E9A1B>I<00E0 +0000E00000E00000E00001E00001E00001E00003E00003E00007E0000FE0001FFFE0FFFF +E0FFFFE00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0 +000FE0000FE0000FE0700FE0700FE0700FE0700FE0700FE0700FE07007F0E003F0C001FF +80007F0014267FA51A>IIIIII E /Fl 75 127 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F870000000000070 +F8F8F870051C779B18>33 D<4010E038F078E038E038E038E038E038E038E038E038E038 +E03860300D0E7B9C18>I<030600078F00078F00078F00078F00078F00078F007FFFC0FF +FFE0FFFFE07FFFC00F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FFFFE07F +FFC01E3C001E3C001E3C001E3C001E3C001E3C000C1800131C7E9B18>I<00C00001C000 +01C00001C00003F0000FFC003FFE007DCF0071C700E1C380E1C780E1C780E1C780F1C000 +79C0003FC0001FE0000FF80001FC0001DE0001CF0001C70061C380F1C380F1C380E1C380 +E1C70071C70079DE003FFE001FF80007E00001C00001C00001C00000C00011247D9F18> +I<3803007C07807C0780EE0F80EE0F00EE0F00EE1F00EE1E00EE1E00EE3E007C3C007C3C +00387C0000780000780000F80000F00001F00001E00001E00003E00003C00003C00007C0 +000783800787C00F87C00F0EE00F0EE01F0EE01E0EE01E0EE03E0EE03C07C03C07C01803 +8013247E9F18>I<01C00007E0000FF0000E70001C38001C38001C38001C38001C73F81C +F3F81CE3F80FC1C00FC3800F83800F03801F07003F87007B8E0071CE00E1FC00E0FC00E0 +7C00E07870E0787070FE707FFFE03FC7E00F03C0151C7F9B18>I<387C7C7E3E0E0E0E1C +1C38F8F0C0070E789B18>I<007000F001E003C007800F001E001C003800380070007000 +70007000E000E000E000E000E000E000E000E0007000700070007000380038001C001E00 +0F00078003C001F000F000700C24799F18>I<6000F00078003C001E000F000780038001 +C001C000E000E000E000E00070007000700070007000700070007000E000E000E000E001 +C001C0038007800F001E003C007800F00060000C247C9F18>I<01C00001C00001C00001 +C00041C100F1C780FDDF807FFF001FFC0007F00007F0001FFC007FFF00FDDF80F1C78041 +C10001C00001C00001C00001C00011147D9718>I<00600000F00000F00000F00000F000 +00F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F00000F00000F00000F00000F000 +00F00000F00000600013147E9718>I<1C3E7E7F3F1F070E1E7CF860080C788518>I<7FFF +C0FFFFE0FFFFE07FFFC013047E8F18>I<3078FCFC78300606778518>I<00030000078000 +0780000F80000F00001F00001E00001E00003E00003C00007C0000780000780000F80000 +F00001F00001E00003E00003C00003C00007C0000780000F80000F00000F00001F00001E +00003E00003C00003C00007C0000780000F80000F00000F0000060000011247D9F18>I< +01F00007FC000FFE001F1F001C07003803807803C07001C07001C0E000E0E000E0E000E0 +E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07001C07803C03803801C0700 +1F1F000FFE0007FC0001F000131C7E9B18>I<01800380038007800F803F80FF80FB8043 +8003800380038003800380038003800380038003800380038003800380038003807FFCFF +FE7FFC0F1C7B9B18>I<03F0000FFE003FFF007C0F807003C0E001C0F000E0F000E06000 +E00000E00000E00001C00001C00003C0000780000F00001E00003C0000780000F00001E0 +0007C0000F80001E00E03C00E07FFFE0FFFFE07FFFE0131C7E9B18>I<001F00003F0000 +770000770000E70001E70001C7000387000787000707000E07001E07003C070038070078 +0700F00700FFFFF8FFFFF8FFFFF8000700000700000700000700000700000700007FF000 +7FF0007FF0151C7F9B18>52 D<007E0001FF0007FF800F83C01E03C01C03C03801803800 +00700000700000E1F800E7FE00FFFF00FE0780F803C0F001C0F000E0E000E0F000E07000 +E07000E07000E03801C03C03C01E07800FFF0007FE0001F800131C7E9B18>54 +D<3078FCFC783000000000000000003078FCFC78300614779318>58 +D<183C7E7E3C180000000000000000183C7E7E3E1E0E1C3C78F060071A789318>I<0000 +C00003E00007E0001FC0003F8000FE0001FC0007F0000FE0003F80007F0000FC0000FC00 +007F00003F80000FE00007F00001FC0000FE00003F80001FC00007E00003E00000C01318 +7E9918>I<7FFFC0FFFFE0FFFFE07FFFC00000000000000000000000007FFFC0FFFFE0FF +FFE07FFFC0130C7E9318>I<600000F80000FC00007F00003F80000FE00007F00001FC00 +00FE00003F80001FC00007E00007E0001FC0003F8000FE0001FC0007F0000FE0003F8000 +7F0000FC0000F8000060000013187E9918>I<0FF0003FFC007FFF00700F00F00380F003 +80600780000F00003E00007C0001F00001E00003C00003C00003C00003C00003C0000380 +0000000000000000000000000000000003800007C00007C00007C000038000111C7D9B18 +>I<00700000F80000F80000D80000D80001DC0001DC0001DC00018C00038E00038E0003 +8E00038E000707000707000707000707000707000FFF800FFF800FFF800E03801C01C01C +01C01C01C07F07F0FF07F87F07F0151C7F9B18>65 D<7FF800FFFE007FFF001C0F801C03 +C01C03C01C01E01C00E01C00E01C00F01C00701C00701C00701C00701C00701C00701C00 +701C00701C00F01C00E01C00E01C01E01C01C01C03C01C0F807FFF00FFFE007FF800141C +7F9B18>68 DII<7F07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01C01C01C01C +01C01C01C01C01C01FFFC01FFFC01FFFC01C01C01C01C01C01C01C01C01C01C01C01C01C +01C01C01C01C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>72 +D<7FFF00FFFF807FFF0001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001C0007FFF00FFFF807FFF00111C7D9B18>I76 D<7E07F0FF0FF87F07F01D81C01D81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1 +C01CE1C01C61C01C71C01C71C01C31C01C39C01C39C01C39C01C19C01C19C01C1DC01C0D +C01C0DC01C0DC07F07C0FF87C07F03C0151C7F9B18>78 D<0FFE003FFF807FFFC07803C0 +7001C0F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0 +E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07C07C07FFFC03FFF800FFE00 +131C7E9B18>II<7FF800FFFE007FFF001C +0F801C03801C03C01C01C01C01C01C01C01C03C01C03801C0F801FFF001FFE001FFE001C +0F001C07001C03801C03801C03801C03801C03801C039C1C039C1C039C7F01F8FF81F87F +00F0161C7F9B18>82 D<03F1C01FFFC03FFFC07C0FC07003C0E001C0E001C0E001C0E000 +007000007800003F00001FF00007FE0000FF00000F800003C00001C00000E00000E06000 +E0E000E0E001E0F001C0F80780FFFF80FFFE00E7F800131C7E9B18>I<7FFFF8FFFFF8FF +FFF8E07038E07038E07038E0703800700000700000700000700000700000700000700000 +700000700000700000700000700000700000700000700000700000700000700007FF0007 +FF0007FF00151C7F9B18>II89 D91 D<600000F00000F00000F8000078 +00007C00003C00003C00003E00001E00001F00000F00000F00000F800007800007C00003 +C00003C00003E00001E00001F00000F00000F800007800007800007C00003C00003E0000 +1E00001E00001F00000F00000F8000078000078000030011247D9F18>I +I<018007C01FF07EFCF83EE00E0F067C9B18>I<7FFFC0FFFFE0FFFFE07FFFC013047E7F +18>I<061E3E387070E0E0E0F8FC7C7C38070E789E18>I<0FF0001FFC003FFE003C0F0018 +070000038000038000FF8007FF801FFF807F0380780380E00380E00380E00380F0078078 +0F803FFFF81FFDF807F0F815147E9318>I<7E0000FE00007E00000E00000E00000E0000 +0E00000E00000E3E000EFF800FFFC00FC1E00F80E00F00700E00700E00380E00380E0038 +0E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF80063E00151C809B18> +I<01FE0007FF001FFF803E0780380300700000700000E00000E00000E00000E00000E000 +00E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F8000 +3F80001F8000038000038000038000038000038003E3800FFB801FFF803C1F80380F8070 +0780700380E00380E00380E00380E00380E00380E00380700780700780380F803C1F801F +FFF00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F00380780700380700380 +E001C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E07C01FFF8007FF00 +01F80012147D9318>I<001F80007FC000FFE000E1E001C0C001C00001C00001C0007FFF +C0FFFFC0FFFFC001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001C00001C00001C00001C0007FFF007FFF007FFF00131C7F9B18>I<01E1F007FFF80F +FFF81E1E301C0E003807003807003807003807003807001C0E001E1E001FFC001FF80039 +E0003800001C00001FFE001FFFC03FFFE07801F0700070E00038E00038E00038E0003878 +00F07E03F01FFFC00FFF8001FC00151F7F9318>I<7E0000FE00007E00000E00000E0000 +0E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E0 +0E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC7FCFFE7FE7FC7FC171C80 +9B18>I<038007C007C007C0038000000000000000007FC0FFC07FC001C001C001C001C0 +01C001C001C001C001C001C001C001C001C001C0FFFFFFFFFFFF101D7C9C18>I108 DI<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00E00E00 +E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC7FCFFE7FE7FC7 +FC1714809318>I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000E0E0 +00E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E93 +18>I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E0038 +0E00380E00380F00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E0000 +0E00000E00000E00000E00007FC000FFE0007FC000151E809318>I<01F38007FB801FFF +803E1F80380F80700780700780E00380E00380E00380E00380E00380E003807007807007 +80380F803C1F801FFF800FFB8003E3800003800003800003800003800003800003800003 +80001FF0003FF8001FF0151E7E9318>II<07F7003FFF007FFF00780F00E00700E00700E007007C0000 +7FE0001FFC0003FE00001F00600780E00380E00380F00380F80F00FFFF00FFFC00E7F000 +11147D9318>I<0180000380000380000380000380007FFFC0FFFFC0FFFFC00380000380 +000380000380000380000380000380000380000380000380400380E00380E00380E001C1 +C001FFC000FF80003E0013197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E00E +00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03 +FFFE01FCFC1714809318>I<7F8FF0FF8FF87F8FF01C01C00E03800E03800E0380070700 +070700070700078F00038E00038E00038E0001DC0001DC0001DC0000F80000F800007000 +15147F9318>II<7F8FF07F9FF07F8FF00F0700078E00039E0001DC0001F80000F80000700000F00000 +F80001DC00039E00038E000707000E07807F8FF0FF8FF87F8FF015147F9318>I<7F8FF0 +FF8FF87F8FF00E01C00E03800E0380070380070700070700038700038700038E0001CE00 +01CE0001CC0000CC0000DC0000780000780000780000700000700000700000F00000E000 +79E0007BC0007F80003F00001E0000151E7F9318>I<3FFFF07FFFF07FFFF07001E07003 +C0700780000F00001E00003C0000F80001F00003C0000780000F00701E00703C00707800 +70FFFFF0FFFFF0FFFFF014147F9318>I<0007E0001FE0007FE000780000E00000E00000 +E00000E00000E00000E00000E00000E00000E00000E00000E00001E0007FC000FF8000FF +80007FC00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 +E00000E000007800007FE0001FE00007E013247E9F18>I<60F0F0F0F0F0F0F0F0F0F0F0 +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600424769F18>I<7C0000FF00 +00FFC00003C00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000F000007FC0003FE0003FE0007FC000F00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00003C000FFC000FF00007C000013247E9F18 +>I<060C1F1E3FBEFBF8F1F060C00F067C9B18>I E /Fm 74 123 +df<001F83E000F06E3001C078780380F8780300F0300700700007007000070070000700 +7000070070000700700007007000FFFFFF80070070000700700007007000070070000700 +700007007000070070000700700007007000070070000700700007007000070070000700 +7000070070000700700007007000070070003FE3FF001D20809F1B>11 +D<003F0000E0C001C0C00381E00701E00701E00700000700000700000700000700000700 +00FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 +E00700E00700E00700E00700E00700E00700E00700E03FC3FC1620809F19>I<003FE000 +E0E001C1E00381E00700E00700E00700E00700E00700E00700E00700E00700E0FFFFE007 +00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E007 +00E00700E00700E00700E00700E00700E03FE7FC1620809F19>I<001F81F80000F04F04 +0001C07C06000380F80F000300F00F000700F00F00070070000007007000000700700000 +070070000007007000000700700000FFFFFFFF0007007007000700700700070070070007 +007007000700700700070070070007007007000700700700070070070007007007000700 +700700070070070007007007000700700700070070070007007007000700700700070070 +07003FE3FE3FE02320809F26>I<7038F87CFC7EFC7E743A040204020402080408041008 +1008201040200F0E7F9F17>34 D<70F8FCFC74040404080810102040060E7C9F0D>39 +D<0040008001000300060004000C001800180038003000300070006000600060006000E0 +00E000E000E000E000E000E000E000E000E000E000E00060006000600060007000300030 +003800180018000C000400060003000100008000400A2E7BA112>I<8000400020003000 +180008000C00060006000700030003000380018001800180018001C001C001C001C001C0 +01C001C001C001C001C001C001C001800180018001800380030003000700060006000C00 +0800180030002000400080000A2E7EA112>I<70F0F8F878080808101010202040050E7C +840D>44 DI<70F8F8F87005057C840D>I<03F0000E1C001C0E00 +180600380700700380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0 +F003C0F003C0F003C0F003C0F003C0F003C0F003C0700380700380700380780780380700 +1806001C0E000E1C0003F000121F7E9D17>48 D<008003800F80F3800380038003800380 +038003800380038003800380038003800380038003800380038003800380038003800380 +0380038007C0FFFE0F1E7C9D17>I<03F0000C1C00100E00200700400780800780F007C0 +F803C0F803C0F803C02007C00007C0000780000780000F00000E00001C00003800007000 +00600000C0000180000300000600400C00401800401000803FFF807FFF80FFFF80121E7E +9D17>I<03F0000C1C00100E00200F00780F80780780780780380F80000F80000F00000F +00001E00001C0000700007F000003C00000E00000F000007800007800007C02007C0F807 +C0F807C0F807C0F00780400780400F00200E00183C0007F000121F7E9D17>I<00060000 +0600000E00000E00001E00002E00002E00004E00008E00008E00010E00020E00020E0004 +0E00080E00080E00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E0000 +0E00000E00000E00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE000 +10000010000010000010000010000010000011F000161C00180E00100700100780000380 +0003800003C00003C00003C07003C0F003C0F003C0E00380400380400700200600100C00 +08380007E000121F7E9D17>I<007C000182000701000E03800C07801807803803003800 +00780000700000700000F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003 +C0F003C0F003C07003C07003C07003803803803807001807000C0E00061C0001F000121F +7E9D17>I<4000007FFFE07FFFC07FFFC040008080010080010080020000040000040000 +080000100000100000200000200000600000600000E00000C00001C00001C00001C00001 +C00003C00003C00003C00003C00003C00003C00003C000018000131F7E9D17>I<03F000 +0C0C001006003003002001806001806001806001807001807803003E03003F06001FC800 +0FF00003F80007FC000C7E00103F00300F806007806001C0C001C0C000C0C000C0C000C0 +C000806001802001001002000C0C0003F000121F7E9D17>I<03F0000E18001C0C003806 +00380700700700700380F00380F00380F003C0F003C0F003C0F003C0F003C07007C07007 +C03807C0180BC00E13C003E3C0000380000380000380000700300700780600780E00700C +002018001070000FC000121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F8 +7005147C930D>I<70F8F8F8700000000000000000000070F0F8F8780808081010102020 +40051D7C930D>I<000100000003800000038000000380000007C0000007C0000007C000 +0009E0000009E0000009E0000010F0000010F0000010F000002078000020780000207800 +00403C0000403C0000C03E0000801E0000801E0001FFFF0001000F0001000F0002000780 +0200078002000780040003C0040003C00C0003C01E0003E0FF801FFE1F207F9F22>65 +DI<000FE01000381C3000E00270 +03C00170078000F00F0000701E0000701E0000303C0000303C0000107C00001078000010 +F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000 +780000007C0000103C0000103C0000101E0000201E0000200F0000200780004003C00080 +00E0030000380C00000FF0001C217E9F21>IIII<000FE01000381C3000E0027003C00170078000F0 +0F0000701E0000701E0000303C0000303C0000107C00001078000010F8000000F8000000 +F8000000F8000000F8000000F8000000F8000000F8003FFEF80001F0780000F07C0000F0 +3C0000F03C0000F01E0000F01E0000F00F0000F0078000F003C0017000E0023000380C10 +000FF0001F217E9F24>III76 DII<001FE000007038 +0001C00E0003800700070003800F0003C01E0001E03C0000F03C0000F07C0000F87C0000 +F878000078F800007CF800007CF800007CF800007CF800007CF800007CF800007CF80000 +7CF800007C780000787C0000F87C0000F83C0000F03E0001F01E0001E00F0003C0070003 +800380070001E01E0000703800001FE0001E217E9F23>II<001FE0000070380001C00E0003800700070003800F0003C01E +0001E03E0001F03C0000F07C0000F87C0000F878000078F800007CF800007CF800007CF8 +00007CF800007CF800007CF800007CF800007CF800007C780000787C0000F87C0000F83C +0000F03E0781F01E0841E00F1023C0071023800390170001D01E0000783804001FF80400 +001C0400000C0C00000E1C00000FF800000FF8000007F8000007F0000001E01E297E9F23 +>II<03F0400C0CC018 +03C03001C06000C06000C0E000C0E00040E00040E00040F00000F800007C00007F80003F +F8001FFF0007FF8000FFC0001FE00003E00001E00000F000007080007080007080007080 +0070C00060C000E0E000C0F80180C6030081FC0014217E9F19>I<7FFFFFE0780F01E060 +0F0060400F0020400F0020C00F0030800F0010800F0010800F0010800F0010000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 +1F800003FFFC001C1F7E9E21>IIII91 +D<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E7A9F17>I< +FFFF03030303030303030303030303030303030303030303030303030303030303030303 +03030303030303FFFF082D80A10D>I<081020204040808080B8FCFC7C38060E7D9F0D> +96 D<1FE000303000781800781C00300E00000E00000E00000E0000FE00078E001E0E00 +380E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>I<1C00 +00FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C +001D87001E01801E00C01C00E01C00701C00701C00781C00781C00781C00781C00781C00 +781C00701C00F01C00E01E00C01A0180198700107C0015207E9F19>I<01FC000706001C +0F00380F00380600780000700000F00000F00000F00000F00000F00000F0000070000078 +00003800803800801C010007060001F80011147F9314>I<0001C0000FC00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C00001C001F1C0070DC00C03C01801C0 +3801C07801C07001C0F001C0F001C0F001C0F001C0F001C0F001C07001C07001C03801C0 +1803C00C03C0070DC001F1F815207F9F19>I<03F0000E1C001C0E003807003807007007 +00700380F00380F00380FFFF80F00000F00000F000007000007000003800803800801C01 +0007060001F80011147F9314>I<007C01C6030F070F0E060E000E000E000E000E000E00 +0E00FFF00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 +0E000E007FE01020809F0E>I<0000E003E3300E3C301C1C30380E00780F00780F00780F +00780F00780F00380E001C1C001E380033E0002000002000003000003000003FFE001FFF +801FFFC03001E0600070C00030C00030C00030C000306000603000C01C038003FC00141F +7F9417>I<1C0000FC00001C00001C00001C00001C00001C00001C00001C00001C00001C +00001C00001C7C001C86001D03001E03801E03801C03801C03801C03801C03801C03801C +03801C03801C03801C03801C03801C03801C03801C03801C0380FF8FF014207E9F19>I< +38007C007C007C0038000000000000000000000000001C00FC001C001C001C001C001C00 +1C001C001C001C001C001C001C001C001C001C001C001C00FF80091F7F9E0C>I<00E001 +F001F001F000E0000000000000000000000000007007F000F00070007000700070007000 +700070007000700070007000700070007000700070007000700070007000706070F060F0 +C061803F000C28829E0E>I<1C0000FC00001C00001C00001C00001C00001C00001C0000 +1C00001C00001C00001C00001C1FE01C07801C06001C04001C08001C10001C20001C6000 +1CE0001DF0001E70001C38001C3C001C1C001C0E001C0F001C07001C07801C07C0FF9FF0 +14207E9F18>I<1C00FC001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF8009 +207F9F0C>I<1C3E03E000FCC30C30001D039038001E01E01C001E01E01C001C01C01C00 +1C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C +01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF802114 +7E9326>I<1C7C00FC86001D03001E03801E03801C03801C03801C03801C03801C03801C +03801C03801C03801C03801C03801C03801C03801C03801C0380FF8FF014147E9319>I< +01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0 +F000F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<1C7C00FD87 +001E01801E01C01C00E01C00F01C00701C00781C00781C00781C00781C00781C00781C00 +701C00F01C00E01E01C01E03801D87001C7C001C00001C00001C00001C00001C00001C00 +001C00001C0000FF8000151D7E9319>I<01F040070CC00E02C01C03C03801C07801C070 +01C0F001C0F001C0F001C0F001C0F001C0F001C07001C07801C03801C01C03C00C05C007 +09C001F1C00001C00001C00001C00001C00001C00001C00001C00001C0000FF8151D7F93 +18>I<1CF0FD181E3C1E3C1E181C001C001C001C001C001C001C001C001C001C001C001C +001C001C00FFC00E147E9312>I<0FC830386018C008C008C008E0007C003FE01FF007F8 +003C800E8006C006C006C004E00CD81887E00F147F9312>I<020002000200060006000E +000E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E +040E040708030801F00E1C7F9B12>I<1C0380FC1F801C03801C03801C03801C03801C03 +801C03801C03801C03801C03801C03801C03801C03801C03801C03801C07800C0780061B +8003E3F014147E9319>IIIII<7FFF700E600E401C40384078407000E001E001C00380078007010E011E011C033802 +7006700EFFFE10147F9314>I E /Fn 13 122 df<0000001FFC0000C000000003FFFFC0 +01C00000001FFFFFF003C00000007FFFFFFC07C0000001FFFC00FE0FC0000007FFC0001F +9FC000000FFE000007FFC000003FF8000003FFC000007FF0000000FFC00000FFE0000000 +7FC00001FFC00000007FC00001FF800000003FC00003FF000000001FC00007FE00000000 +1FC0000FFE000000000FC0000FFC000000000FC0001FFC0000000007C0001FFC00000000 +07C0003FF80000000007C0003FF80000000003C0003FF80000000003C0007FF800000000 +03C0007FF80000000003C0007FF0000000000000007FF000000000000000FFF000000000 +000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000000000 +000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000000000 +000000FFF000000000000000FFF000001FFFFFFF807FF000001FFFFFFF807FF000001FFF +FFFF807FF800001FFFFFFF807FF800000001FFC0003FF800000001FFC0003FF800000001 +FFC0003FF800000001FFC0001FFC00000001FFC0001FFC00000001FFC0000FFE00000001 +FFC0000FFE00000001FFC00007FF00000001FFC00003FF00000001FFC00001FF80000001 +FFC00001FFC0000001FFC00000FFE0000001FFC000007FF0000003FFC000003FFC000003 +FFC000000FFF000007FFC0000007FFC0001FBFC0000001FFFC00FF1FC00000007FFFFFFE +0FC00000001FFFFFF803C000000003FFFFE000C0000000001FFE00000000413D7BBB4C> +71 D +I76 D78 D85 +D<003FFE00000001FFFFE0000007FFFFF800000FE007FC00000FF001FE00001FF800FF00 +001FF8007F80001FF8007FC0001FF8003FC0000FF0003FE00007E0003FE00003C0003FE0 +000000003FE0000000003FE0000000003FE0000000003FE0000000FFFFE000001FFFFFE0 +00007FF83FE00003FF803FE00007FC003FE0000FF0003FE0001FE0003FE0003FE0003FE0 +007FC0003FE0007FC0003FE000FF80003FE000FF80003FE000FF80003FE000FF80003FE0 +00FF80007FE0007FC0007FE0007FC000DFE0003FE0039FF0001FF80F0FFFE007FFFE0FFF +E001FFFC07FFE0003FE000FFE02B267DA52F>97 D<00FE00000000FFFE00000000FFFE00 +000000FFFE00000000FFFE0000000007FE0000000003FE0000000003FE0000000003FE00 +00000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE00 +00000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE00 +00000003FE0000000003FE01FF000003FE1FFFF00003FE7FFFFC0003FEFC03FE0003FFF0 +00FF0003FFC0003F8003FF00001FC003FE00001FE003FE00000FF003FE00000FF803FE00 +000FF803FE000007FC03FE000007FC03FE000007FC03FE000007FE03FE000007FE03FE00 +0007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE00 +0007FE03FE000007FC03FE000007FC03FE000007FC03FE00000FFC03FE00000FF803FE00 +000FF003FE00001FF003FF00001FE003FF80003FC003FFC0007F8003F9E000FF0003F0FC +07FE0003F07FFFF80003E01FFFE00003C003FE00002F3C7DBB36>I<01E00007F8000FFC +000FFC001FFE001FFE001FFE001FFE000FFC000FFC0007F80001E0000000000000000000 +0000000000000000000000000000000000000000000000000000FE007FFE007FFE007FFE +007FFE0007FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE00FFFFF0FFFFF0FFFFF0FFFFF0143D7DBC1A +>105 D<0001FFC00000000FFFF80000007FFFFF000000FF80FF800003FE003FE00007F8 +000FF0000FF00007F8000FF00007F8001FE00003FC003FE00003FE003FE00003FE007FC0 +0001FF007FC00001FF007FC00001FF007FC00001FF00FFC00001FF80FFC00001FF80FFC0 +0001FF80FFC00001FF80FFC00001FF80FFC00001FF80FFC00001FF80FFC00001FF80FFC0 +0001FF807FC00001FF007FC00001FF007FC00001FF003FE00003FE003FE00003FE001FE0 +0003FC001FF00007FC000FF00007F80007F8000FF00003FE003FE00000FF80FF8000007F +FFFF0000000FFFF800000001FFC0000029267DA530>111 D<01FC03F000FFFC0FFC00FF +FC1FFF00FFFC3C3F80FFFC707F8007FCE0FFC003FCC0FFC003FD80FFC003FD80FFC003FF +807F8003FF003F0003FF001E0003FF00000003FE00000003FE00000003FE00000003FE00 +000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE0000 +0003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE000000 +03FE00000003FE00000003FE000000FFFFFC0000FFFFFC0000FFFFFC0000FFFFFC000022 +267DA528>114 D<003FF03803FFFE7807FFFFF81FC00FF83F0003F83E0000F87C0000F8 +7C000078FC000078FC000078FE000078FF000000FFC00000FFFC00007FFFF0003FFFFE00 +3FFFFF801FFFFFC00FFFFFE003FFFFF000FFFFF8001FFFFC00007FFC000007FE700001FE +F00000FEF000007EF800007EF800007EFC00007EFC00007CFE0000FCFF0000F8FF8001F0 +FFF00FE0F9FFFFC0F07FFF00C01FF8001F267DA526>I<000F0000000F0000000F000000 +0F0000000F0000001F0000001F0000001F0000001F0000003F0000003F0000007F000000 +7F000000FF000001FF000003FF000007FF00001FFFFFF0FFFFFFF0FFFFFFF0FFFFFFF001 +FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001 +FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001 +FF000001FF003C01FF003C01FF003C01FF003C01FF003C01FF003C01FF003C01FF003C00 +FF007800FF8078007F80F0003FC1E0001FFFC0000FFF800001FE001E377EB626>I121 D E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin +%%PaperSize: A4 + +%%EndSetup +%%Page: 1 1 +1 0 bop 75 693 a Fn(GNU)33 b(History)f(Library)p 75 743 +1800 17 v 960 791 a Fm(Edition)16 b(2.1,)e(for)h Fl(History)f(Library)g +Fm(V)l(ersion)i(2.1.)1643 845 y(Marc)o(h)e(1996)75 2467 +y Fk(Brian)23 b(F)-6 b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F) +-6 b(oundation)75 2534 y(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6 +b(estern)23 b(Reserv)n(e)f(Univ)n(ersit)n(y)p 75 2570 +1800 9 v eop +%%Page: 2 2 +2 1 bop 75 250 a Fm(This)21 b(do)q(cumen)o(t)g(describ)q(es)h(the)f +(GNU)f(History)g(library)l(,)j(a)d(programming)g(to)q(ol)g(that)g(pro)o +(vides)h(a)75 305 y(consisten)o(t)15 b(user)h(in)o(terface)f(for)g +(recalling)i(lines)f(of)f(previously)i(t)o(yp)q(ed)e(input.)75 +373 y(Published)i(b)o(y)f(the)f(F)l(ree)g(Soft)o(w)o(are)f(F)l +(oundation)75 427 y(675)g(Massac)o(h)o(usetts)g(Av)o(en)o(ue,)75 +482 y(Cam)o(bridge,)h(MA)g(02139)f(USA)75 549 y(P)o(ermission)j(is)f +(gran)o(ted)g(to)f(mak)o(e)h(and)g(distribute)i(v)o(erbatim)d(copies)i +(of)f(this)h(man)o(ual)f(pro)o(vided)h(the)75 604 y(cop)o(yrigh)o(t)e +(notice)h(and)f(this)h(p)q(ermission)g(notice)g(are)f(preserv)o(ed)h +(on)f(all)h(copies.)75 671 y(P)o(ermission)c(is)h(gran)o(ted)e(to)g +(cop)o(y)h(and)g(distribute)h(mo)q(di\014ed)g(v)o(ersions)f(of)f(this)h +(man)o(ual)g(under)h(the)f(con-)75 726 y(ditions)k(for)e(v)o(erbatim)h +(cop)o(ying,)g(pro)o(vided)h(that)e(the)h(en)o(tire)h(resulting)g +(deriv)o(ed)g(w)o(ork)e(is)h(distributed)75 781 y(under)h(the)f(terms)g +(of)g(a)f(p)q(ermission)j(notice)f(iden)o(tical)h(to)e(this)g(one.)75 +848 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f +(distribute)i(translations)f(of)f(this)h(man)o(ual)g(in)o(to)f(another) +g(lan-)75 903 y(guage,)e(under)h(the)f(ab)q(o)o(v)o(e)g(conditions)i +(for)d(mo)q(di\014ed)j(v)o(ersions,)e(except)h(that)f(this)h(p)q +(ermission)g(notice)75 958 y(ma)o(y)f(b)q(e)i(stated)f(in)h(a)f +(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l(oundation.)75 +2661 y(Cop)o(yrigh)o(t)301 2660 y(c)289 2661 y Fj(\015)g +Fm(1989,)f(1991)g(F)l(ree)h(Soft)o(w)o(are)f(F)l(oundation,)h(Inc.)p +eop +%%Page: 1 3 +1 2 bop 75 -58 a Fm(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o +(ely)1007 b(1)75 183 y Fi(1)41 b(Using)26 b(History)h(In)n(teractiv)n +(ely)137 317 y Fm(This)16 b(c)o(hapter)f(describ)q(es)i(ho)o(w)d(to)h +(use)g(the)g(GNU)g(History)g(Library)h(in)o(teractiv)o(ely)l(,)g(from)e +(a)h(user's)75 372 y(standp)q(oin)o(t.)35 b(It)20 b(should)g(b)q(e)h +(considered)h(a)d(user's)h(guide.)35 b(F)l(or)19 b(information)h(on)g +(using)h(the)f(GNU)75 427 y(History)15 b(Library)h(in)g(y)o(our)f(o)o +(wn)g(programs,)e(see)j Fj(h)p Fm(unde\014ned)p Fj(i)g +Fm([Programming)e(with)i(GNU)f(History],)75 482 y(page)g +Fj(h)p Fm(unde\014ned)p Fj(i)p Fm(.)75 625 y Fk(1.1)33 +b(History)22 b(Expansion)137 727 y Fm(The)c(History)g(library)h(pro)o +(vides)f(a)f(history)h(expansion)h(feature)e(that)h(is)g(similar)h(to)e +(the)h(history)75 782 y(expansion)12 b(pro)o(vided)g(b)o(y)f +Fl(csh)p Fm(.)18 b(This)11 b(section)h(describ)q(es)g(the)g(syn)o(tax)e +(used)h(to)g(manipulate)h(the)f(history)75 836 y(information.)137 +909 y(History)k(expansions)h(in)o(tro)q(duce)h(w)o(ords)d(from)g(the)i +(history)f(list)h(in)o(to)f(the)h(input)g(stream,)e(making)75 +964 y(it)h(easy)g(to)g(rep)q(eat)g(commands,)g(insert)h(the)f(argumen)o +(ts)f(to)h(a)g(previous)h(command)f(in)o(to)g(the)g(curren)o(t)75 +1019 y(input)h(line,)h(or)d(\014x)i(errors)e(in)i(previous)g(commands)f +(quic)o(kly)l(.)137 1092 y(History)j(expansion)i(tak)o(es)d(place)i(in) +h(t)o(w)o(o)d(parts.)28 b(The)19 b(\014rst)f(is)g(to)g(determine)i +(whic)o(h)f(line)h(from)75 1147 y(the)h(history)f(list)i(should)g(b)q +(e)f(used)g(during)h(substitution.)37 b(The)21 b(second)g(is)g(to)f +(select)i(p)q(ortions)e(of)75 1202 y(that)15 b(line)i(for)d(inclusion)k +(in)o(to)d(the)h(curren)o(t)f(one.)20 b(The)c(line)g(selected)h(from)e +(the)g(history)g(is)h(called)h(the)75 1256 y Fh(ev)o(en)o(t)p +Fm(,)c(and)h(the)g(p)q(ortions)g(of)f(that)g(line)i(that)e(are)g(acted) +h(up)q(on)g(are)f(called)j Fh(w)o(ords)p Fm(.)i(V)l(arious)c +Fh(mo)q(di\014ers)75 1311 y Fm(are)i(a)o(v)m(ailable)i(to)e(manipulate) +i(the)e(selected)i(w)o(ords.)23 b(The)17 b(line)h(is)f(brok)o(en)f(in)o +(to)h(w)o(ords)e(in)j(the)e(same)75 1366 y(fashion)c(that)e(Bash)i(do)q +(es,)g(so)f(that)g(sev)o(eral)g(w)o(ords)g(surrounded)h(b)o(y)f(quotes) +h(are)f(considered)h(one)g(w)o(ord.)75 1421 y(History)18 +b(expansions)h(are)g(in)o(tro)q(duced)g(b)o(y)f(the)h(app)q(earance)g +(of)f(the)g(history)h(expansion)g(c)o(haracter,)75 1475 +y(whic)o(h)d(is)g(`)p Fl(!)p Fm(')e(b)o(y)h(default.)75 +1599 y Fg(1.1.1)30 b(Ev)n(en)n(t)21 b(Designators)137 +1701 y Fm(An)16 b(ev)o(en)o(t)f(designator)g(is)g(a)g(reference)h(to)f +(a)g(command)g(line)i(en)o(try)d(in)i(the)g(history)f(list.)75 +1789 y Fl(!)216 b Fm(Start)16 b(a)g(history)h(substitution,)g(except)h +(when)f(follo)o(w)o(ed)g(b)o(y)f(a)h(space,)g(tab,)f(the)h(end)g(of)315 +1844 y(the)e(line,)i(`)p Fl(=)p Fm(')d(or)h(`)p Fl(\()p +Fm('.)75 1929 y Fl(!)p Fh(n)191 b Fm(Refer)16 b(to)e(command)h(line)i +Fh(n)p Fm(.)75 2015 y Fl(!-)p Fh(n)167 b Fm(Refer)16 +b(to)e(the)i(command)f Fh(n)g Fm(lines)i(bac)o(k.)75 +2100 y Fl(!!)192 b Fm(Refer)16 b(to)e(the)i(previous)f(command.)20 +b(This)c(is)g(a)f(synon)o(ym)g(for)f(`)p Fl(!-1)p Fm('.)75 +2186 y Fl(!)p Fh(string)102 b Fm(Refer)16 b(to)e(the)i(most)e(recen)o +(t)h(command)g(starting)g(with)g Fh(string)p Fm(.)75 +2271 y Fl(!?)p Fh(string)t Fl([?])315 2326 y Fm(Refer)i(to)f(the)h +(most)f(recen)o(t)h(command)g(con)o(taining)g Fh(string)p +Fm(.)25 b(The)17 b(trailing)g(`)p Fl(?)p Fm(')f(ma)o(y)g(b)q(e)315 +2381 y(omitted)f(if)h(the)f Fh(string)k Fm(is)d(follo)o(w)o(ed)f +(immediately)i(b)o(y)e(a)g(newline.)75 2466 y Fl(^)p +Fh(string1)t Fl(^)p Fh(string2)t Fl(^)315 2521 y Fm(Quic)o(k)i +(Substitution.)23 b(Rep)q(eat)17 b(the)f(last)f(command,)h(replacing)h +Fh(string1)i Fm(with)e Fh(string2)p Fm(.)315 2576 y(Equiv)m(alen)o(t)g +(to)d Fl(!!:s/)p Fh(string1)t Fl(/)p Fh(string2)t Fl(/)p +Fm(.)75 2661 y Fl(!#)192 b Fm(The)15 b(en)o(tire)h(command)f(line)i(t)o +(yp)q(ed)f(so)e(far.)p eop +%%Page: 2 4 +2 3 bop 75 -58 a Fm(2)1347 b(GNU)15 b(History)g(Library)75 +183 y Fg(1.1.2)30 b(W)-5 b(ord)20 b(Designators)137 279 +y Fm(W)l(ord)d(designators)g(are)g(used)h(to)f(select)h(desired)h(w)o +(ords)d(from)h(the)g(ev)o(en)o(t.)26 b(A)18 b(`)p Fl(:)p +Fm(')e(separates)h(the)75 333 y(ev)o(en)o(t)j(sp)q(eci\014cation)h +(from)e(the)h(w)o(ord)f(designator.)34 b(It)20 b(ma)o(y)f(b)q(e)h +(omitted)g(if)g(the)g(w)o(ord)f(designator)75 388 y(b)q(egins)f(with)g +(a)e(`)p Fl(^)p Fm(',)h(`)p Fl($)p Fm(',)f(`)p Fl(*)p +Fm(',)g(`)p Fl(-)p Fm(',)g(or)h(`)p Fl(\045)p Fm('.)24 +b(W)l(ords)17 b(are)g(n)o(um)o(b)q(ered)g(from)g(the)g(b)q(eginning)i +(of)e(the)g(line,)75 443 y(with)j(the)g(\014rst)f(w)o(ord)h(b)q(eing)h +(denoted)f(b)o(y)g(0)f(\(zero\).)33 b(W)l(ords)20 b(are)f(inserted)i +(in)o(to)f(the)g(curren)o(t)f(line)75 498 y(separated)c(b)o(y)g(single) +i(spaces.)75 575 y Fl(0)e(\(zero\))57 b Fm(The)15 b Fl(0)p +Fm(th)g(w)o(ord.)20 b(F)l(or)14 b(man)o(y)h(applications,)h(this)g(is)g +(the)f(command)g(w)o(ord.)75 653 y Fh(n)215 b Fm(The)15 +b Fh(n)p Fm(th)h(w)o(ord.)75 731 y Fl(^)216 b Fm(The)15 +b(\014rst)g(argumen)o(t;)f(that)h(is,)g(w)o(ord)g(1.)75 +808 y Fl($)216 b Fm(The)15 b(last)h(argumen)o(t.)75 886 +y Fl(\045)216 b Fm(The)15 b(w)o(ord)g(matc)o(hed)g(b)o(y)g(the)g(most)g +(recen)o(t)g(`)p Fl(?)p Fh(string)t Fl(?)p Fm(')f(searc)o(h.)75 +964 y Fh(x)p Fl(-)p Fh(y)168 b Fm(A)15 b(range)g(of)g(w)o(ords;)f(`)p +Fl(-)p Fh(y)t Fm(')g(abbreviates)i(`)p Fl(0-)p Fh(y)t +Fm('.)75 1042 y Fl(*)216 b Fm(All)15 b(of)f(the)f(w)o(ords,)g(except)i +(the)f Fl(0)p Fm(th.)19 b(This)14 b(is)h(a)e(synon)o(ym)h(for)f(`)p +Fl(1-$)p Fm('.)18 b(It)c(is)g(not)g(an)g(error)315 1096 +y(to)g(use)h(`)p Fl(*)p Fm(')f(if)i(there)e(is)i(just)e(one)h(w)o(ord)f +(in)i(the)f(ev)o(en)o(t;)f(the)h(empt)o(y)g(string)g(is)g(returned)g +(in)315 1151 y(that)f(case.)75 1229 y Fh(x)s Fl(*)189 +b Fm(Abbreviates)16 b(`)p Fh(x)p Fl(-$)p Fm(')75 1307 +y Fh(x)p Fl(-)192 b Fm(Abbreviates)16 b(`)p Fh(x)p Fl(-$)p +Fm(')e(lik)o(e)i(`)p Fh(x)s Fl(*)p Fm(',)e(but)i(omits)f(the)g(last)g +(w)o(ord.)137 1384 y(If)i(a)g(w)o(ord)f(designator)h(is)h(supplied)h +(without)e(an)g(ev)o(en)o(t)f(sp)q(eci\014cation,)j(the)e(previous)h +(command)75 1439 y(is)e(used)f(as)g(the)h(ev)o(en)o(t.)75 +1548 y Fg(1.1.3)30 b(Mo)r(di\014ers)137 1643 y Fm(After)10 +b(the)h(optional)g(w)o(ord)e(designator,)i(y)o(ou)f(can)h(add)f(a)g +(sequence)i(of)e(one)g(or)g(more)g(of)g(the)g(follo)o(wing)75 +1698 y(mo)q(di\014ers,)16 b(eac)o(h)f(preceded)i(b)o(y)e(a)g(`)p +Fl(:)p Fm('.)75 1776 y Fl(h)216 b Fm(Remo)o(v)o(e)15 +b(a)g(trailing)h(pathname)f(comp)q(onen)o(t,)g(lea)o(ving)h(only)g(the) +f(head.)75 1854 y Fl(t)216 b Fm(Remo)o(v)o(e)15 b(all)h(leading)h +(pathname)e(comp)q(onen)o(ts,)g(lea)o(ving)h(the)f(tail.)75 +1931 y Fl(r)216 b Fm(Remo)o(v)o(e)15 b(a)g(trailing)h(su\016x)f(of)g +(the)g(form)g(`)p Fl(.)p Fh(su\016x)s Fm(',)f(lea)o(ving)i(the)f +(basename.)75 2009 y Fl(e)216 b Fm(Remo)o(v)o(e)15 b(all)h(but)g(the)f +(trailing)h(su\016x.)75 2087 y Fl(p)216 b Fm(Prin)o(t)15 +b(the)g(new)h(command)f(but)g(do)g(not)g(execute)h(it.)75 +2164 y Fl(s/)p Fh(old)r Fl(/)p Fh(new)t Fl(/)315 2219 +y Fm(Substitute)h Fh(new)j Fm(for)c(the)h(\014rst)e(o)q(ccurrence)j(of) +e Fh(old)i Fm(in)f(the)g(ev)o(en)o(t)f(line.)25 b(An)o(y)16 +b(delimiter)315 2274 y(ma)o(y)c(b)q(e)h(used)g(in)g(place)g(of)f(`)p +Fl(/)p Fm('.)18 b(The)13 b(delimiter)h(ma)o(y)e(b)q(e)h(quoted)f(in)i +Fh(old)g Fm(and)f Fh(new)k Fm(with)12 b(a)315 2329 y(single)j(bac)o +(kslash.)20 b(If)15 b(`)p Fl(&)p Fm(')e(app)q(ears)h(in)h +Fh(new)p Fm(,)f(it)g(is)h(replaced)g(b)o(y)f Fh(old)p +Fm(.)20 b(A)14 b(single)i(bac)o(kslash)315 2383 y(will)j(quote)e(the)h +(`)p Fl(&)p Fm('.)25 b(The)17 b(\014nal)i(delimiter)g(is)f(optional)g +(if)f(it)h(is)g(the)f(last)g(c)o(haracter)g(on)315 2438 +y(the)e(input)h(line.)75 2516 y Fl(&)216 b Fm(Rep)q(eat)16 +b(the)f(previous)h(substitution.)75 2594 y Fl(g)216 b +Fm(Cause)19 b(c)o(hanges)h(to)e(b)q(e)i(applied)h(o)o(v)o(er)e(the)g +(en)o(tire)h(ev)o(en)o(t)f(line.)34 b(Used)20 b(in)g(conjunction)315 +2648 y(with)c(`)p Fl(s)p Fm(',)d(as)i(in)h Fl(gs/)p Fh(old)r +Fl(/)p Fh(new)t Fl(/)p Fm(,)f(or)g(with)g(`)p Fl(&)p +Fm('.)p eop +%%Page: 3 5 +3 4 bop 75 -58 a Fm(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(3)75 183 y Fi(2)41 b(Programming)28 b(with)e(GNU)i +(History)137 323 y Fm(This)16 b(c)o(hapter)e(describ)q(es)j(ho)o(w)d +(to)g(in)o(terface)h(programs)e(that)h(y)o(ou)h(write)g(with)g(the)g +(GNU)f(History)75 378 y(Library)l(.)24 b(It)17 b(should)g(b)q(e)g +(considered)h(a)e(tec)o(hnical)i(guide.)25 b(F)l(or)15 +b(information)i(on)f(the)h(in)o(teractiv)o(e)g(use)75 +433 y(of)e(GNU)g(History)l(,)g(see)g Fj(h)p Fm(unde\014ned)p +Fj(i)i Fm([Using)e(History)g(In)o(teractiv)o(ely],)g(page)g +Fj(h)p Fm(unde\014ned)p Fj(i)p Fm(.)75 581 y Fk(2.1)33 +b(In)n(tro)r(duction)24 b(to)e(History)137 685 y Fm(Man)o(y)c(programs) +g(read)h(input)g(from)f(the)h(user)g(a)f(line)j(at)d(a)g(time.)31 +b(The)19 b(GNU)g(History)f(library)75 740 y(is)k(able)g(to)e(k)o(eep)i +(trac)o(k)e(of)h(those)g(lines,)j(asso)q(ciate)d(arbitrary)g(data)f +(with)i(eac)o(h)f(line,)j(and)e(utilize)75 795 y(information)15 +b(from)g(previous)h(lines)h(in)f(comp)q(osing)f(new)h(ones.)137 +870 y(The)e(programmer)f(using)h(the)g(History)g(library)g(has)g(a)o(v) +m(ailable)h(functions)g(for)e(remem)o(b)q(ering)h(lines)75 +924 y(on)c(a)g(history)h(list,)g(asso)q(ciating)g(arbitrary)f(data)f +(with)i(a)f(line,)j(remo)o(ving)d(lines)i(from)d(the)i(list,)h(searc)o +(hing)75 979 y(through)17 b(the)h(list)g(for)f(a)h(line)h(con)o +(taining)f(an)g(arbitrary)f(text)g(string,)h(and)g(referencing)h(an)o +(y)e(line)i(in)75 1034 y(the)c(list)i(directly)l(.)22 +b(In)16 b(addition,)g(a)f(history)g Fh(expansion)h Fm(function)h(is)e +(a)o(v)m(ailable)i(whic)o(h)g(pro)o(vides)f(for)e(a)75 +1089 y(consisten)o(t)h(user)h(in)o(terface)f(across)g(di\013eren)o(t)g +(programs.)137 1164 y(The)f(user)h(using)f(programs)f(written)h(with)g +(the)g(History)g(library)h(has)f(the)g(b)q(ene\014t)h(of)e(a)h +(consisten)o(t)75 1219 y(user)20 b(in)o(terface)f(with)h(a)f(set)h(of)f +(w)o(ell-kno)o(wn)h(commands)g(for)e(manipulating)k(the)d(text)g(of)g +(previous)75 1273 y(lines)c(and)f(using)h(that)e(text)g(in)i(new)f +(commands.)19 b(The)14 b(basic)h(history)e(manipulation)j(commands)d +(are)75 1328 y(similar)j(to)f(the)g(history)g(substitution)h(pro)o +(vided)g(b)o(y)g Fl(csh)p Fm(.)137 1403 y(If)f(the)g(programmer)f +(desires,)h(he)g(can)g(use)g(the)g(Readline)i(library)l(,)f(whic)o(h)f +(includes)j(some)c(history)75 1458 y(manipulation)j(b)o(y)e(default,)g +(and)h(has)f(the)g(added)h(adv)m(an)o(tage)f(of)f(command)h(line)i +(editing.)75 1606 y Fk(2.2)33 b(History)22 b(Storage)137 +1710 y Fm(The)16 b(history)f(list)h(is)g(an)f(arra)o(y)f(of)g(history)i +(en)o(tries.)k(A)15 b(history)g(en)o(try)g(is)h(declared)g(as)f(follo)o +(ws:)195 1782 y Fl(typedef)23 b(struct)g(_hist_entry)f({)243 +1834 y(char)h(*line;)243 1886 y(char)g(*data;)195 1938 +y(})h(HIST_ENTRY;)137 2013 y Fm(The)16 b(history)f(list)h(itself)g +(migh)o(t)f(therefore)g(b)q(e)h(declared)g(as)195 2085 +y Fl(HIST_ENTRY)22 b(**the_history_list;)137 2160 y Fm(The)16 +b(state)e(of)h(the)g(History)g(library)h(is)g(encapsulated)g(in)o(to)f +(a)g(single)i(structure:)195 2232 y Fl(/*)24 b(A)f(structure)g(used)g +(to)h(pass)f(the)h(current)f(state)g(of)g(the)h(history)f(stuff)g +(around.)g(*/)p 2033 2242 21 42 v 195 2284 a(typedef)g(struct)g +(_hist_state)f({)243 2336 y(HIST_ENTRY)g(**entries;)214 +b(/*)23 b(Pointer)g(to)h(the)f(entries)g(themselves.)f(*/)243 +2387 y(int)h(offset;)453 b(/*)23 b(The)h(location)e(pointer)h(within)g +(this)h(array.)f(*/)p 2033 2398 V 243 2439 a(int)g(length;)453 +b(/*)23 b(Number)g(of)h(elements)f(within)g(this)g(array.)g(*/)p +1985 2449 V 243 2491 a(int)g(size;)501 b(/*)23 b(Number)g(of)h(slots)f +(allocated)g(to)g(this)h(array.)f(*/)p 2057 2501 V 243 +2543 a(int)g(flags;)195 2595 y(})h(HISTORY_STATE;)137 +2670 y Fm(If)16 b(the)f(\015ags)g(mem)o(b)q(er)g(includes)j +Fl(HS_STIFLED)p Fm(,)13 b(the)i(history)h(has)f(b)q(een)h(sti\015ed.)p +eop +%%Page: 4 6 +4 5 bop 75 -58 a Fm(4)1347 b(GNU)15 b(History)g(Library)75 +183 y Fk(2.3)33 b(History)22 b(F)-6 b(unctions)137 278 +y Fm(This)21 b(section)g(describ)q(es)h(the)f(calling)h(sequence)g(for) +e(the)g(v)m(arious)h(functions)g(presen)o(t)g(in)g(GNU)75 +333 y(History)l(.)75 441 y Fg(2.3.1)30 b(Initializing)20 +b(History)h(and)f(State)g(Managemen)n(t)137 536 y Fm(This)e(section)g +(describ)q(es)h(functions)f(used)g(to)e(initialize)21 +b(and)c(manage)g(the)g(state)g(of)g(the)g(History)75 +591 y(library)f(when)g(y)o(ou)f(w)o(an)o(t)f(to)g(use)i(the)f(history)g +(functions)h(in)g(y)o(our)f(program.)1650 679 y(F)l(unction)-1749 +b Ff(void)20 b Fe(using)p 333 679 18 3 v 20 w(history)j +Fd(\(\))195 734 y Fm(Begin)18 b(a)f(session)h(in)g(whic)o(h)g(the)g +(history)f(functions)h(migh)o(t)f(b)q(e)h(used.)27 b(This)18 +b(initializes)195 788 y(the)d(in)o(teractiv)o(e)h(v)m(ariables.)1650 +877 y(F)l(unction)-1749 b Ff(HISTORY_STATE)21 b(*)e Fe(history)p +657 877 V 21 w(get)p 755 877 V 21 w(history)p 951 877 +V 21 w(state)j Fd(\(\))195 931 y Fm(Return)16 b(a)f(structure)g +(describing)i(the)e(curren)o(t)g(state)f(of)h(the)g(input)i(history)l +(.)1650 1019 y(F)l(unction)-1749 b Ff(void)20 b Fe(history)p +377 1019 V 20 w(set)p 468 1019 V 21 w(history)p 664 1019 +V 21 w(state)j Fd(\()p Fl(HISTORY_STATE)13 b(*state)p +Fd(\))195 1074 y Fm(Set)i(the)h(state)e(of)h(the)g(history)g(list)h +(according)g(to)e Fh(state)p Fm(.)75 1182 y Fg(2.3.2)30 +b(History)20 b(List)h(Managemen)n(t)137 1277 y Fm(These)11 +b(functions)h(manage)e(individual)k(en)o(tries)d(on)g(the)g(history)f +(list,)i(or)f(set)f(parameters)g(managing)75 1332 y(the)15 +b(list)h(itself.)1650 1420 y(F)l(unction)-1749 b Ff(void)20 +b Fe(add)p 294 1420 V 20 w(history)j Fd(\()p Fl(char)14 +b(*string)p Fd(\))195 1475 y Fm(Place)i Fh(string)j Fm(at)c(the)g(end)i +(of)d(the)i(history)f(list.)22 b(The)15 b(asso)q(ciated)h(data)f +(\014eld)h(\(if)g(an)o(y\))e(is)195 1530 y(set)h(to)g +Fl(NULL)p Fm(.)1650 1618 y(F)l(unction)-1749 b Ff(HIST_ENTRY)21 +b(*)e Fe(remo)n(v)n(e)p 584 1618 V 20 w(history)k Fd(\()p +Fl(int)14 b(which)p Fd(\))195 1673 y Fm(Remo)o(v)o(e)g(history)g(en)o +(try)f(at)h(o\013set)f Fh(whic)o(h)h Fm(from)g(the)g(history)l(.)19 +b(The)14 b(remo)o(v)o(ed)g(elemen)o(t)g(is)195 1727 y(returned)i(so)e +(y)o(ou)h(can)h(free)f(the)g(line,)i(data,)d(and)h(con)o(taining)h +(structure.)1650 1816 y(F)l(unction)-1749 b Ff(HIST_ENTRY)21 +b(*)e Fe(replace)p 580 1816 V 22 w(history)p 777 1816 +V 20 w(en)n(try)24 b Fd(\()p Fl(int)14 b(which,)g(char)283 +1870 y(*line,)g(char)g(*data)p Fd(\))195 1925 y Fm(Mak)o(e)f(the)h +(history)f(en)o(try)g(at)g(o\013set)g Fh(whic)o(h)h Fm(ha)o(v)o(e)g +Fh(line)k Fm(and)13 b Fh(data)p Fm(.)19 b(This)14 b(returns)g(the)f +(old)195 1980 y(en)o(try)k(so)g(y)o(ou)g(can)g(disp)q(ose)i(of)d(the)i +(data.)25 b(In)18 b(the)f(case)h(of)f(an)g(in)o(v)m(alid)i +Fh(whic)o(h)p Fm(,)g(a)e Fl(NULL)195 2035 y Fm(p)q(oin)o(ter)f(is)f +(returned.)1650 2123 y(F)l(unction)-1749 b Ff(void)20 +b Fe(clear)p 320 2123 V 21 w(history)j Fd(\(\))195 2178 +y Fm(Clear)15 b(the)h(history)f(list)h(b)o(y)f(deleting)i(all)f(the)f +(en)o(tries.)1650 2266 y(F)l(unction)-1749 b Ff(void)20 +b Fe(sti\015e)p 320 2266 V 21 w(history)j Fd(\()p Fl(int)14 +b(max)p Fd(\))195 2321 y Fm(Sti\015e)i(the)f(history)h(list,)f(remem)o +(b)q(ering)h(only)g(the)f(last)g Fh(max)j Fm(en)o(tries.)1650 +2409 y(F)l(unction)-1749 b Ff(int)20 b Fe(unsti\015e)p +358 2409 V 21 w(history)i Fd(\(\))195 2463 y Fm(Stop)e(sti\015ing)i +(the)f(history)l(.)36 b(This)21 b(returns)g(the)f(previous)i(amoun)o(t) +e(the)g(history)h(w)o(as)195 2518 y(sti\015ed.)g(The)15 +b(v)m(alue)i(is)e(p)q(ositiv)o(e)i(if)e(the)g(history)h(w)o(as)e +(sti\015ed,)i(negativ)o(e)f(if)h(it)f(w)o(asn't.)1650 +2606 y(F)l(unction)-1749 b Ff(int)20 b Fe(history)p 351 +2606 V 20 w(is)p 409 2606 V 21 w(sti\015ed)k Fd(\(\))195 +2661 y Fm(Returns)16 b(non-zero)f(if)h(the)f(history)g(is)h(sti\015ed,) +g(zero)f(if)g(it)h(is)g(not.)p eop +%%Page: 5 7 +5 6 bop 75 -58 a Fm(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(5)75 183 y Fg(2.3.3)30 b(Information)19 +b(Ab)r(out)i(the)f(History)h(List)137 279 y Fm(These)13 +b(functions)h(return)f(information)g(ab)q(out)f(the)h(en)o(tire)h +(history)e(list)i(or)e(individual)k(list)e(en)o(tries.)1650 +371 y(F)l(unction)-1749 b Ff(HIST_ENTRY)21 b(**)e Fe(history)p +605 371 18 3 v 21 w(list)24 b Fd(\(\))195 426 y Fm(Return)f(a)g +Fl(NULL)f Fm(terminated)g(arra)o(y)g(of)g Fl(HIST_ENTRY)f +Fm(whic)o(h)j(is)f(the)f(curren)o(t)h(input)195 481 y(history)l(.)j +(Elemen)o(t)18 b(0)e(of)h(this)h(list)g(is)f(the)h(b)q(eginning)h(of)e +(time.)26 b(If)17 b(there)g(is)h(no)f(history)l(,)195 +535 y(return)e Fl(NULL)p Fm(.)1650 627 y(F)l(unction)-1749 +b Ff(int)20 b Fe(where)p 325 627 V 20 w(history)j Fd(\(\))195 +682 y Fm(Returns)16 b(the)f(o\013set)f(of)h(the)g(curren)o(t)g(history) +g(elemen)o(t.)1650 773 y(F)l(unction)-1749 b Ff(HIST_ENTRY)21 +b(*)e Fe(curren)n(t)p 587 773 V 21 w(history)k Fd(\(\))195 +828 y Fm(Return)g(the)f(history)g(en)o(try)g(at)f(the)h(curren)o(t)g(p) +q(osition,)j(as)c(determined)j(b)o(y)e Fl(where_)195 +883 y(history)14 b(\(\))p Fm(.)20 b(If)15 b(there)g(is)h(no)f(en)o(try) +g(there,)g(return)g(a)g Fl(NULL)g Fm(p)q(oin)o(ter.)1650 +975 y(F)l(unction)-1749 b Ff(HIST_ENTRY)21 b(*)e Fe(history)p +579 975 V 21 w(get)j Fd(\()p Fl(int)15 b(offset)p Fd(\))195 +1029 y Fm(Return)21 b(the)g(history)g(en)o(try)f(at)g(p)q(osition)i +Fh(o\013set)p Fm(,)e(starting)g(from)g Fl(history_base)p +Fm(.)35 b(If)195 1084 y(there)16 b(is)h(no)g(en)o(try)f(there,)g(or)g +(if)g Fh(o\013set)h Fm(is)g(greater)e(than)h(the)h(history)f(length,)h +(return)f(a)195 1139 y Fl(NULL)f Fm(p)q(oin)o(ter.)1650 +1231 y(F)l(unction)-1749 b Ff(int)20 b Fe(history)p 351 +1231 V 20 w(total)p 487 1231 V 22 w(b)n(ytes)j Fd(\(\))195 +1285 y Fm(Return)c(the)f(n)o(um)o(b)q(er)g(of)g(b)o(ytes)g(that)f(the)h +(primary)h(history)f(en)o(tries)g(are)g(using.)29 b(This)195 +1340 y(function)16 b(returns)f(the)g(sum)h(of)e(the)i(lengths)f(of)g +(all)h(the)g(lines)g(in)g(the)g(history)l(.)75 1452 y +Fg(2.3.4)30 b(Mo)n(ving)21 b(Around)f(the)h(History)g(List)137 +1548 y Fm(These)16 b(functions)g(allo)o(w)f(the)g(curren)o(t)h(index)g +(in)o(to)f(the)h(history)f(list)h(to)e(b)q(e)i(set)f(or)g(c)o(hanged.) +1650 1640 y(F)l(unction)-1749 b Ff(int)20 b Fe(history)p +351 1640 V 20 w(set)p 442 1640 V 21 w(p)r(os)h Fd(\()p +Fl(int)15 b(pos)p Fd(\))195 1694 y Fm(Set)g(the)h(p)q(osition)g(in)g +(the)f(history)g(list)h(to)f Fh(p)q(os)p Fm(,)g(an)g(absolute)g(index)i +(in)o(to)e(the)g(list.)1650 1786 y(F)l(unction)-1749 +b Ff(HIST_ENTRY)21 b(*)e Fe(previous)p 615 1786 V 20 +w(history)k Fd(\(\))195 1841 y Fm(Bac)o(k)17 b(up)h(the)f(curren)o(t)g +(history)g(o\013set)f(to)h(the)g(previous)h(history)f(en)o(try)l(,)g +(and)g(return)g(a)195 1896 y(p)q(oin)o(ter)f(to)e(that)h(en)o(try)l(.)k +(If)d(there)f(is)h(no)f(previous)h(en)o(try)l(,)f(return)g(a)g +Fl(NULL)f Fm(p)q(oin)o(ter.)1650 1987 y(F)l(unction)-1749 +b Ff(HIST_ENTRY)21 b(*)e Fe(next)p 514 1987 V 21 w(history)k +Fd(\(\))195 2042 y Fm(Mo)o(v)o(e)17 b(the)h(curren)o(t)g(history)f +(o\013set)g(forw)o(ard)g(to)g(the)h(next)g(history)g(en)o(try)l(,)g +(and)g(return)195 2097 y(the)d(a)g(p)q(oin)o(ter)h(to)e(that)h(en)o +(try)l(.)20 b(If)15 b(there)g(is)h(no)f(next)g(en)o(try)l(,)g(return)g +(a)g Fl(NULL)g Fm(p)q(oin)o(ter.)75 2208 y Fg(2.3.5)30 +b(Searc)n(hing)21 b(the)f(History)h(List)137 2304 y Fm(These)14 +b(functions)g(allo)o(w)g(searc)o(hing)g(of)e(the)i(history)f(list)h +(for)f(en)o(tries)h(con)o(taining)g(a)f(sp)q(eci\014c)i(string.)75 +2359 y(Searc)o(hing)f(ma)o(y)g(b)q(e)g(p)q(erformed)g(b)q(oth)g(forw)o +(ard)e(and)i(bac)o(kw)o(ard)f(from)g(the)h(curren)o(t)g(history)f(p)q +(osition.)75 2414 y(The)j(searc)o(h)f(ma)o(y)g(b)q(e)i +Fh(anc)o(hored)p Fm(,)e(meaning)h(that)f(the)h(string)g(m)o(ust)f(matc) +o(h)g(at)g(the)h(b)q(eginning)i(of)d(the)75 2469 y(history)g(en)o(try)l +(.)1650 2560 y(F)l(unction)-1749 b Ff(int)20 b Fe(history)p +351 2560 V 20 w(searc)n(h)j Fd(\()p Fl(char)14 b(*string,)g(int)h +(direction)p Fd(\))195 2615 y Fm(Searc)o(h)g(the)h(history)f(for)f +Fh(string)p Fm(,)h(starting)f(at)h(the)g(curren)o(t)g(history)g +(o\013set.)k(If)d Fh(direction)195 2670 y Fl(<)j Fm(0,)g(then)g(the)h +(searc)o(h)e(is)i(through)e(previous)i(en)o(tries,)g(else)g(through)f +(subsequen)o(t.)32 b(If)p eop +%%Page: 6 8 +6 7 bop 75 -58 a Fm(6)1347 b(GNU)15 b(History)g(Library)195 +183 y Fh(string)k Fm(is)d(found,)f(then)h(the)f(curren)o(t)g(history)g +(index)i(is)f(set)f(to)f(that)h(history)g(en)o(try)l(,)g(and)195 +238 y(the)g(v)m(alue)h(returned)f(is)g(the)g(o\013set)f(in)h(the)g +(line)h(of)e(the)h(en)o(try)g(where)g Fh(string)j Fm(w)o(as)c(found.) +195 293 y(Otherwise,)i(nothing)f(is)h(c)o(hanged,)f(and)h(a)e(-1)h(is)h +(returned.)1650 396 y(F)l(unction)-1749 b Ff(int)20 b +Fe(history)p 351 396 18 3 v 20 w(searc)n(h)p 527 396 +V 21 w(pre\014x)i Fd(\()p Fl(char)15 b(*string,)f(int)g(direction)p +Fd(\))195 451 y Fm(Searc)o(h)i(the)f(history)g(for)g +Fh(string)p Fm(,)g(starting)g(at)g(the)g(curren)o(t)h(history)f +(o\013set.)k(The)d(searc)o(h)195 506 y(is)h(anc)o(hored:)23 +b(matc)o(hing)17 b(lines)h(m)o(ust)e(b)q(egin)i(with)f +Fh(string)p Fm(.)25 b(If)17 b Fh(direction)h Fl(<)e Fm(0,)h(then)g(the) +195 560 y(searc)o(h)f(is)g(through)f(previous)i(en)o(tries,)f(else)g +(through)g(subsequen)o(t.)22 b(If)16 b Fh(string)k Fm(is)c(found,)195 +615 y(then)i(the)g(curren)o(t)g(history)g(index)h(is)g(set)e(to)h(that) +f(en)o(try)l(,)h(and)g(the)g(return)g(v)m(alue)h(is)g(0.)195 +670 y(Otherwise,)d(nothing)f(is)h(c)o(hanged,)f(and)h(a)e(-1)h(is)h +(returned.)1650 773 y(F)l(unction)-1749 b Ff(int)20 b +Fe(history)p 351 773 V 20 w(searc)n(h)p 527 773 V 21 +w(p)r(os)h Fd(\()p Fl(char)15 b(*string,)f(int)g(direction,)g(int)283 +828 y(pos)p Fd(\))195 883 y Fm(Searc)o(h)h(for)g Fh(string)k +Fm(in)d(the)f(history)g(list,)g(starting)g(at)f Fh(p)q(os)p +Fm(,)h(an)g(absolute)g(index)i(in)o(to)e(the)195 937 +y(list.)21 b(If)15 b Fh(direction)h Fm(is)g(negativ)o(e,)f(the)g(searc) +o(h)g(pro)q(ceeds)g(bac)o(kw)o(ard)g(from)f Fh(p)q(os)p +Fm(,)h(otherwise)195 992 y(forw)o(ard.)27 b(Returns)18 +b(the)g(absolute)g(index)h(of)f(the)g(history)f(elemen)o(t)i(where)f +Fh(string)k Fm(w)o(as)195 1047 y(found,)15 b(or)g(-1)g(otherwise.)75 +1170 y Fg(2.3.6)30 b(Managing)20 b(the)g(History)h(File)137 +1272 y Fm(The)16 b(History)g(library)h(can)e(read)h(the)g(history)g +(from)f(and)h(write)g(it)g(to)f(a)h(\014le.)22 b(This)17 +b(section)f(do)q(cu-)75 1327 y(men)o(ts)f(the)g(functions)h(for)f +(managing)g(a)g(history)g(\014le.)1650 1430 y(F)l(unction)-1749 +b Ff(int)20 b Fe(read)p 286 1430 V 20 w(history)i Fd(\()p +Fl(char)15 b(*filename)p Fd(\))195 1485 y Fm(Add)h(the)f(con)o(ten)o +(ts)f(of)h Fh(\014lename)j Fm(to)d(the)g(history)g(list,)g(a)g(line)h +(at)f(a)f(time.)21 b(If)15 b Fh(\014lename)j Fm(is)195 +1539 y Fl(NULL)p Fm(,)c(then)i(read)f(from)f(`)p Fl(~/.history)p +Fm('.)k(Returns)e(0)f(if)g(successful,)i(or)d(errno)h(if)h(not.)1650 +1643 y(F)l(unction)-1749 b Ff(int)20 b Fe(read)p 286 +1643 V 20 w(history)p 481 1643 V 20 w(range)i Fd(\()p +Fl(char)15 b(*filename,)e(int)i(from,)g(int)f(to)p Fd(\))195 +1697 y Fm(Read)21 b(a)f(range)g(of)g(lines)i(from)e Fh(\014lename)p +Fm(,)i(adding)f(them)g(to)f(the)g(history)h(list.)36 +b(Start)195 1752 y(reading)15 b(at)e(line)j Fh(from)e +Fm(and)g(end)h(at)e Fh(to)p Fm(.)19 b(If)c Fh(from)e +Fm(is)i(zero,)f(start)f(at)g(the)h(b)q(eginning.)22 b(If)15 +b Fh(to)195 1807 y Fm(is)i(less)g(than)f Fh(from)p Fm(,)g(then)h(read)f +(un)o(til)i(the)e(end)h(of)f(the)h(\014le.)24 b(If)17 +b Fh(\014lename)j Fm(is)d Fl(NULL)p Fm(,)f(then)195 1862 +y(read)f(from)g(`)p Fl(~/.history)p Fm('.)i(Returns)f(0)f(if)h +(successful,)g(or)e Fl(errno)h Fm(if)h(not.)1650 1965 +y(F)l(unction)-1749 b Ff(int)20 b Fe(write)p 304 1965 +V 22 w(history)i Fd(\()p Fl(char)15 b(*filename)p Fd(\))195 +2020 y Fm(W)l(rite)23 b(the)f(curren)o(t)g(history)h(to)f +Fh(\014lename)p Fm(,)j(o)o(v)o(erwriting)d Fh(\014lename)k +Fm(if)d(necessary)l(.)42 b(If)195 2074 y Fh(\014lename)20 +b Fm(is)d Fl(NULL)p Fm(,)f(then)g(write)h(the)f(history)h(list)g(to)f +(`)p Fl(~/.history)p Fm('.)21 b(V)l(alues)d(returned)195 +2129 y(are)d(as)g(in)h Fl(read_history)d(\(\))p Fm(.)1650 +2232 y(F)l(unction)-1749 b Ff(int)20 b Fe(app)r(end)p +360 2232 V 19 w(history)j Fd(\()p Fl(int)14 b(nelements,)g(char)h +(*filename)p Fd(\))195 2287 y Fm(App)q(end)i(the)e(last)g +Fh(nelemen)o(ts)j Fm(of)d(the)g(history)g(list)h(to)f +Fh(\014lename)p Fm(.)1650 2390 y(F)l(unction)-1749 b +Ff(int)20 b Fe(history)p 351 2390 V 20 w(truncate)p 582 +2390 V 21 w(\014le)k Fd(\()p Fl(char)14 b(*filename,)g(int)h(nlines)p +Fd(\))195 2445 y Fm(T)l(runcate)g(the)h(history)f(\014le)h +Fh(\014lename)p Fm(,)g(lea)o(ving)g(only)g(the)f(last)g +Fh(nlines)k Fm(lines.)75 2568 y Fg(2.3.7)30 b(History)20 +b(Expansion)137 2670 y Fm(These)c(functions)g(implemen)o(t)g +Fl(csh)p Fm(-lik)o(e)g(history)g(expansion.)p eop +%%Page: 7 9 +7 8 bop 75 -58 a Fm(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(7)1650 183 y(F)l(unction)-1749 b Ff(int)20 +b Fe(history)p 351 183 18 3 v 20 w(expand)j Fd(\()p Fl(char)14 +b(*string,)g(char)h(**output)p Fd(\))195 238 y Fm(Expand)g +Fh(string)p Fm(,)g(placing)h(the)f(result)h(in)o(to)f +Fh(output)p Fm(,)f(a)h(p)q(oin)o(ter)g(to)g(a)f(string)h(\(see)g +Fj(h)p Fm(unde-)195 293 y(\014ned)p Fj(i)h Fm([History)e(In)o +(teraction],)h(page)g Fj(h)p Fm(unde\014ned)p Fj(i)p +Fm(\).)21 b(Returns:)195 370 y Fl(0)216 b Fm(If)16 b(no)g(expansions)h +(to)q(ok)e(place)i(\(or,)d(if)j(the)f(only)g(c)o(hange)g(in)h(the)e +(text)h(w)o(as)435 425 y(the)f(de-slashifying)j(of)c(the)i(history)f +(expansion)h(c)o(haracter\);)195 502 y Fl(1)216 b Fm(if)16 +b(expansions)g(did)g(tak)o(e)e(place;)195 580 y Fl(-1)192 +b Fm(if)16 b(there)f(w)o(as)f(an)h(error)g(in)h(expansion;)195 +657 y Fl(2)216 b Fm(if)16 b(the)g(returned)g(line)i(should)f(only)f(b)q +(e)h(displa)o(y)o(ed,)f(but)g(not)g(executed,)g(as)435 +712 y(with)11 b(the)f Fl(:p)g Fm(mo)q(di\014er)h(\(see)g +Fj(h)p Fm(unde\014ned)p Fj(i)g Fm([Mo)q(di\014ers],)g(page)f +Fj(h)p Fm(unde\014ned)p Fj(i)p Fm(\).)195 789 y(If)15 +b(an)g(error)f(o)q(curred)i(in)g(expansion,)f(then)h +Fh(output)f Fm(con)o(tains)g(a)g(descriptiv)o(e)i(error)d(mes-)195 +844 y(sage.)1650 932 y(F)l(unction)-1749 b Ff(char)20 +b(*)f Fe(history)p 422 932 V 21 w(arg)p 524 932 V 19 +w(extract)24 b Fd(\()p Fl(int)14 b(first,)h(int)g(last,)f(char)283 +987 y(*string)p Fd(\))195 1042 y Fm(Extract)g(a)g(string)g(segmen)o(t)g +(consisting)i(of)e(the)g Fh(\014rst)i Fm(through)e Fh(last)h +Fm(argumen)o(ts)f(presen)o(t)195 1097 y(in)i Fh(string)p +Fm(.)k(Argumen)o(ts)15 b(are)f(brok)o(en)i(up)f(as)g(in)h(Bash.)1650 +1185 y(F)l(unction)-1749 b Ff(char)20 b(*)f Fe(get)p +324 1185 V 21 w(history)p 520 1185 V 20 w(ev)n(en)n(t)25 +b Fd(\()p Fl(char)14 b(*string,)g(int)h(*cindex,)f(int)283 +1240 y(qchar)p Fd(\))195 1295 y Fm(Returns)h(the)g(text)f(of)g(the)h +(history)g(ev)o(en)o(t)f(b)q(eginning)j(at)d Fh(string)k +Fl(+)d Fh(*cindex)p Fm(.)20 b Fh(*cindex)f Fm(is)195 +1350 y(mo)q(di\014ed)e(to)e(p)q(oin)o(t)h(to)f(after)g(the)h(ev)o(en)o +(t)f(sp)q(eci\014er.)23 b(A)o(t)16 b(function)g(en)o(try)l(,)f +Fh(cindex)21 b Fm(p)q(oin)o(ts)195 1404 y(to)16 b(the)h(index)h(in)o +(to)e Fh(string)21 b Fm(where)c(the)g(history)f(ev)o(en)o(t)h(sp)q +(eci\014cation)h(b)q(egins.)26 b Fh(qc)o(har)19 b Fm(is)195 +1459 y(a)h(c)o(haracter)g(that)g(is)h(allo)o(w)o(ed)f(to)g(end)h(the)g +(ev)o(en)o(t)f(sp)q(eci\014cation)i(in)g(addition)f(to)f(the)195 +1514 y(\\normal")15 b(terminating)g(c)o(haracters.)1650 +1602 y(F)l(unction)-1749 b Ff(char)20 b(**)f Fe(history)p +448 1602 V 21 w(tok)n(enize)25 b Fd(\()p Fl(char)14 b(*string)p +Fd(\))195 1657 y Fm(Return)j(an)g(arra)o(y)f(of)g(tok)o(ens)g(parsed)h +(out)g(of)f Fh(string)p Fm(,)h(m)o(uc)o(h)g(as)f(the)h(shell)h(migh)o +(t.)25 b(The)195 1712 y(tok)o(ens)d(are)g(split)i(on)f(white)g(space)g +(and)f(on)h(the)g(c)o(haracters)f Fl(\(\)<>;&|$)p Fm(,)h(and)f(shell) +195 1767 y(quoting)15 b(con)o(v)o(en)o(tions)h(are)e(ob)q(ey)o(ed.)75 +1892 y Fk(2.4)33 b(History)22 b(V)-6 b(ariables)137 1987 +y Fm(This)23 b(section)f(describ)q(es)h(the)f(externally)h(visible)h(v) +m(ariables)f(exp)q(orted)f(b)o(y)g(the)g(GNU)f(History)75 +2042 y(Library)l(.)1661 2130 y(V)l(ariable)-1749 b Ff(int)20 +b Fe(history)p 351 2130 V 20 w(base)195 2185 y Fm(The)15 +b(logical)i(o\013set)d(of)h(the)g(\014rst)g(en)o(try)g(in)h(the)f +(history)g(list.)1661 2274 y(V)l(ariable)-1749 b Ff(int)20 +b Fe(history)p 351 2274 V 20 w(length)195 2329 y Fm(The)15 +b(n)o(um)o(b)q(er)h(of)f(en)o(tries)g(curren)o(tly)h(stored)f(in)h(the) +f(history)g(list.)1661 2417 y(V)l(ariable)-1749 b Ff(int)20 +b Fe(max)p 283 2417 V 19 w(input)p 435 2417 V 21 w(history)195 +2472 y Fm(The)14 b(maxim)o(um)f(n)o(um)o(b)q(er)h(of)e(history)i(en)o +(tries.)19 b(This)14 b(m)o(ust)f(b)q(e)h(c)o(hanged)g(using)g +Fl(stifle_)195 2527 y(history)g(\(\))p Fm(.)1661 2615 +y(V)l(ariable)-1749 b Ff(char)20 b Fe(history)p 377 2615 +V 20 w(expansion)p 644 2615 V 21 w(c)n(har)195 2670 y +Fm(The)15 b(c)o(haracter)g(that)f(starts)g(a)h(history)g(ev)o(en)o(t.) +20 b(The)15 b(default)h(is)g(`)p Fl(!)p Fm('.)p eop +%%Page: 8 10 +8 9 bop 75 -58 a Fm(8)1347 b(GNU)15 b(History)g(Library)1661 +183 y(V)l(ariable)-1749 b Ff(char)20 b Fe(history)p 377 +183 18 3 v 20 w(subst)p 529 183 V 20 w(c)n(har)195 238 +y Fm(The)13 b(c)o(haracter)e(that)h(in)o(v)o(ok)o(es)g(w)o(ord)g +(substitution)h(if)g(found)g(at)e(the)i(start)e(of)h(a)g(line.)21 +b(The)195 293 y(default)16 b(is)f(`)p Fl(^)p Fm('.)1661 +388 y(V)l(ariable)-1749 b Ff(char)20 b Fe(history)p 377 +388 V 20 w(commen)n(t)p 627 388 V 19 w(c)n(har)195 443 +y Fm(During)e(tok)o(enization,)h(if)f(this)h(c)o(haracter)e(is)i(seen)f +(as)g(the)g(\014rst)g(c)o(haracter)f(of)g(a)h(w)o(ord,)195 +498 y(then)e(it)g(and)g(all)h(subsequen)o(t)g(c)o(haracters)e(up)h(to)g +(a)f(newline)j(are)e(ignored,)g(suppressing)195 553 y(history)f +(expansion)h(for)f(the)g(remainder)h(of)f(the)g(line.)22 +b(This)15 b(is)h(disabled)h(b)o(y)e(default.)1661 648 +y(V)l(ariable)-1749 b Ff(char)20 b(*)f Fe(history)p 422 +648 V 21 w(no)p 504 648 V 20 w(expand)p 704 648 V 20 +w(c)n(hars)195 703 y Fm(The)j(list)h(of)f(c)o(haracters)f(whic)o(h)i +(inhibit)h(history)e(expansion)h(if)g(found)f(immediately)195 +758 y(follo)o(wing)16 b Fh(history)p 528 758 14 2 v 16 +w(expansion)p 739 758 V 18 w(c)o(har)p Fm(.)j(The)d(default)f(is)h +(whitespace)g(and)g(`)p Fl(=)p Fm('.)1661 853 y(V)l(ariable)-1749 +b Ff(char)20 b(*)f Fe(history)p 422 853 18 3 v 21 w(searc)n(h)p +599 853 V 20 w(delimiter)p 843 853 V 23 w(c)n(hars)195 +908 y Fm(The)f(list)h(of)e(additional)i(c)o(haracters)e(whic)o(h)i(can) +f(delimit)h(a)f(history)g(searc)o(h)f(string,)h(in)195 +963 y(addition)c(to)d(whitespace,)j(`)p Fl(:)p Fm(')d(and)i(`)p +Fl(?)p Fm(')f(in)h(the)f(case)h(of)f(a)g(substring)h(searc)o(h.)19 +b(The)12 b(default)195 1018 y(is)k(empt)o(y)l(.)1661 +1113 y(V)l(ariable)-1749 b Ff(int)20 b Fe(history)p 351 +1113 V 20 w(quotes)p 533 1113 V 21 w(inhibit)p 717 1113 +V 23 w(expansion)195 1168 y Fm(If)13 b(non-zero,)f(single-quoted)i(w)o +(ords)e(are)g(not)g(scanned)h(for)f(the)g(history)h(expansion)g(c)o +(har-)195 1223 y(acter.)19 b(The)d(default)g(v)m(alue)g(is)g(0.)1661 +1318 y(V)l(ariable)-1749 b Ff(Function)20 b(*)g Fe(history)p +527 1318 V 20 w(inhibit)p 710 1318 V 23 w(expansion)p +980 1318 V 21 w(function)195 1373 y Fm(This)12 b(should)g(b)q(e)g(set)f +(to)f(the)i(address)f(of)g(a)g(function)h(that)e(tak)o(es)h(t)o(w)o(o)f +(argumen)o(ts:)17 b(a)11 b Fl(char)195 1428 y(*)j Fm(\()p +Fh(string)t Fm(\))f(and)i(an)f(in)o(teger)g(index)h(in)o(to)f(that)g +(string)g(\()p Fh(i)r Fm(\).)20 b(It)14 b(should)h(return)f(a)g +(non-zero)195 1482 y(v)m(alue)g(if)e(the)h(history)f(expansion)h +(starting)f(at)g Fh(string[i])i Fm(should)f(not)f(b)q(e)h(p)q +(erformed;)g(zero)195 1537 y(if)g(the)h(expansion)f(should)h(b)q(e)g +(done.)20 b(It)13 b(is)g(in)o(tended)i(for)d(use)h(b)o(y)g +(applications)i(lik)o(e)f(Bash)195 1592 y(that)j(use)h(the)g(history)f +(expansion)i(c)o(haracter)e(for)g(additional)i(purp)q(oses.)28 +b(By)18 b(default,)195 1647 y(this)e(v)m(ariable)g(is)g(set)f(to)f +(NULL.)75 1780 y Fk(2.5)33 b(History)22 b(Programming)h(Example)137 +1878 y Fm(The)16 b(follo)o(wing)g(program)e(demonstrates)g(simple)j +(use)e(of)g(the)g(GNU)g(History)g(Library)l(.)195 1944 +y Fl(main)23 b(\(\))195 1995 y({)243 2047 y(char)g(line[1024],)f(*t;) +243 2099 y(int)h(len,)g(done)h(=)g(0;)243 2203 y(line[0])f(=)g(0;)243 +2307 y(using_history)f(\(\);)243 2359 y(while)h(\(!done\))290 +2411 y({)338 2462 y(printf)g(\("history$)g("\);)338 2514 +y(fflush)g(\(stdout\);)338 2566 y(t)h(=)g(fgets)f(\(line,)g(sizeof)g +(\(line\))g(-)h(1,)f(stdin\);)338 2618 y(if)h(\(t)f(&&)h(*t\))386 +2670 y({)p eop +%%Page: 9 11 +9 10 bop 75 -58 a Fm(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(9)434 183 y Fl(len)23 b(=)h(strlen)f(\(t\);)434 +235 y(if)g(\(t[len)g(-)h(1])g(==)f('\\n'\))481 287 y(t[len)h(-)f(1])h +(=)g('\\0';)386 339 y(})338 443 y(if)g(\(!t\))386 495 +y(strcpy)f(\(line,)g("quit"\);)338 598 y(if)h(\(line[0]\))386 +650 y({)434 702 y(char)f(*expansion;)434 754 y(int)g(result;)434 +858 y(result)g(=)g(history_expand)f(\(line,)h(&expansion\);)434 +910 y(if)g(\(result\))481 962 y(fprintf)g(\(stderr,)g("\045s\\n",)g +(expansion\);)434 1065 y(if)g(\(result)g(<)h(0)g(||)f(result)g(==)h +(2\))481 1117 y({)529 1169 y(free)f(\(expansion\);)529 +1221 y(continue;)481 1273 y(})434 1377 y(add_history)f(\(expansion\);) +434 1429 y(strncpy)h(\(line,)g(expansion,)f(sizeof)h(\(line\))g(-)h +(1\);)434 1480 y(free)f(\(expansion\);)386 1532 y(})338 +1636 y(if)h(\(strcmp)f(\(line,)g("quit"\))g(==)g(0\))386 +1688 y(done)g(=)h(1;)338 1740 y(else)f(if)h(\(strcmp)f(\(line,)g +("save"\))g(==)h(0\))386 1792 y(write_history)e(\("history_file"\);)338 +1844 y(else)h(if)h(\(strcmp)f(\(line,)g("read"\))g(==)h(0\))386 +1896 y(read_history)e(\("history_file"\);)338 1947 y(else)h(if)h +(\(strcmp)f(\(line,)g("list"\))g(==)h(0\))386 1999 y({)434 +2051 y(register)e(HIST_ENTRY)h(**the_list;)434 2103 y(register)f(int)i +(i;)434 2207 y(the_list)e(=)i(history_list)e(\(\);)434 +2259 y(if)h(\(the_list\))481 2311 y(for)h(\(i)f(=)h(0;)g(the_list[i];)e +(i++\))529 2363 y(printf)h(\("\045d:)g(\045s\\n",)g(i)h(+)g +(history_base,)e(the_list[i]->line\);)386 2414 y(})338 +2466 y(else)h(if)h(\(strncmp)f(\(line,)g("delete",)g(6\))g(==)h(0\))386 +2518 y({)434 2570 y(int)f(which;)434 2622 y(if)g(\(\(sscanf)g(\(line)g +(+)h(6,)f("\045d",)h(&which\)\))e(==)i(1\))p eop +%%Page: 10 12 +10 11 bop 75 -58 a Fm(10)1324 b(GNU)15 b(History)g(Library)481 +183 y Fl({)529 235 y(HIST_ENTRY)23 b(*entry)g(=)g(remove_history)f +(\(which\);)529 287 y(if)i(\(!entry\))577 339 y(fprintf)f(\(stderr,)f +("No)i(such)f(entry)g(\045d\\n",)g(which\);)529 391 y(else)577 +443 y({)625 495 y(free)g(\(entry->line\);)625 546 y(free)g(\(entry\);) +577 598 y(})481 650 y(})434 702 y(else)481 754 y({)529 +806 y(fprintf)g(\(stderr,)g("non-numeric)f(arg)h(given)h(to)f +(`delete'\\n"\);)481 858 y(})386 910 y(})290 962 y(})195 +1013 y(})p eop +%%Page: 11 13 +11 12 bop 75 -58 a Fm(App)q(endix)17 b(A:)e(Concept)g(Index)1196 +b(11)75 183 y Fi(App)r(endix)25 b(A)41 b(Concept)27 b(Index)137 +359 y Fc(\(Index)14 b(is)f(nonexisten)o(t\))p eop +%%Page: 12 14 +12 13 bop 75 -58 a Fm(12)1324 b(GNU)15 b(History)g(Library)p +eop +%%Page: 13 15 +13 14 bop 75 -58 a Fm(App)q(endix)17 b(B:)e(F)l(unction)h(and)g(V)l +(ariable)g(Index)919 b(13)75 183 y Fi(App)r(endix)25 +b(B)41 b(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26 +b(Index)137 359 y Fc(\(Index)14 b(is)f(nonexisten)o(t\))p +eop +%%Page: 14 16 +14 15 bop 75 -58 a Fm(14)1324 b(GNU)15 b(History)g(Library)p +eop +%%Page: -1 17 +-1 16 bop 1862 -58 a Fm(i)75 183 y Fi(T)-7 b(able)27 +b(of)f(Con)n(ten)n(ts)75 354 y Fk(1)67 b(Using)22 b(History)h(In)n +(teractiv)n(ely)9 b Fb(.)k(.)d(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)h(.)31 b Fk(1)224 423 y Fm(1.1)45 b(History)15 +b(Expansion)5 b Fa(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)19 b Fm(1)374 478 y(1.1.1)44 +b(Ev)o(en)o(t)14 b(Designators)e Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)26 b Fm(1)374 532 y(1.1.2)44 b(W)l(ord)15 +b(Designators)5 b Fa(.)h(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)19 b Fm(2)374 587 y(1.1.3)44 b(Mo)q(di\014ers)t Fa(.)8 +b(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)19 b Fm(2)75 708 y Fk(2)67 b(Programming)23 +b(with)g(GNU)f(History)16 b Fb(.)10 b(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f +(.)g(.)38 b Fk(3)224 777 y Fm(2.1)45 b(In)o(tro)q(duction)16 +b(to)f(History)10 b Fa(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)24 b Fm(3)224 832 y(2.2)45 b(History)15 +b(Storage)c Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 b Fm(3)224 886 +y(2.3)45 b(History)15 b(F)l(unctions)d Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h +(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)26 +b Fm(4)374 941 y(2.3.1)44 b(Initializing)18 b(History)d(and)h(State)e +(Managemen)o(t)g Fa(.)7 b(.)h(.)g(.)f(.)h(.)f(.)29 b +Fm(4)374 996 y(2.3.2)44 b(History)15 b(List)h(Managemen)o(t)d +Fa(.)7 b(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)29 b Fm(4)374 1051 y(2.3.3)44 +b(Information)15 b(Ab)q(out)g(the)h(History)f(List)c +Fa(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 +b Fm(5)374 1106 y(2.3.4)44 b(Mo)o(ving)15 b(Around)g(the)g(History)g +(List)c Fa(.)d(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)25 b Fm(5)374 1160 y(2.3.5)44 b(Searc)o(hing)16 +b(the)f(History)g(List)7 b Fa(.)h(.)g(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 +b Fm(5)374 1215 y(2.3.6)44 b(Managing)15 b(the)g(History)g(File)6 +b Fa(.)i(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)20 b Fm(6)374 1270 y(2.3.7)44 +b(History)15 b(Expansion)9 b Fa(.)f(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)24 b Fm(6)224 1325 y(2.4)45 b(History)15 b(V)l(ariables)6 +b Fa(.)j(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)21 b Fm(7)224 1380 y(2.5)45 b(History)15 +b(Programming)f(Example)7 b Fa(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 +b Fm(8)75 1501 y Fk(App)r(endix)i(A)67 b(Concept)22 b(Index)17 +b Fb(.)10 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g +(.)38 b Fk(11)75 1636 y(App)r(endix)24 b(B)67 b(F)-6 +b(unction)25 b(and)e(V)-6 b(ariable)24 b(Index)16 b Fb(.)10 +b(.)g(.)g(.)38 b Fk(13)p eop +%%Page: -2 18 +-2 17 bop 75 -58 a Fm(ii)1346 b(GNU)15 b(History)g(Library)p +eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/readline/doc/history_toc.html b/readline/doc/history_toc.html new file mode 100644 index 00000000000..7e271c01271 --- /dev/null +++ b/readline/doc/history_toc.html @@ -0,0 +1,51 @@ + + + + +GNU History Library - Table of Contents + + +

    GNU History Library

    +

    Edition 2.1, for History Library Version 2.1.

    +

    March 1996

    +
    Brian Fox, Free Software Foundation
    +
    Chet Ramey, Case Western Reserve University
    +

    +


    +

    +


    +This document was generated on 2 April 1998 using the +texi2html +translator version 1.51.

    + + diff --git a/readline/doc/hstech.texinfo b/readline/doc/hstech.texinfo index c3fe3f6a11f..54100908407 100644 --- a/readline/doc/hstech.texinfo +++ b/readline/doc/hstech.texinfo @@ -1,8 +1,8 @@ @ignore This file documents the user interface to the GNU History library. -Copyright (C) 1988, 1991 Free Software Foundation, Inc. -Authored by Brian Fox. +Copyright (C) 1988, 1991, 1994, 1996 Free Software Foundation, Inc. +Authored by Brian Fox and Chet Ramey. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on @@ -26,8 +26,9 @@ into another language, under the above conditions for modified versions. @node Programming with GNU History @chapter Programming with GNU History -This chapter describes how to interface the GNU History Library with -programs that you write. It should be considered a technical guide. +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, @pxref{Using History Interactively}. @@ -42,32 +43,35 @@ History Interactively}. @node Introduction to History @section Introduction to History -Many programs read input from the user a line at a time. The GNU history +Many programs read input from the user a line at a time. The GNU History library is able to keep track of those lines, associate arbitrary data with -each line, and utilize information from previous lines in making up new +each line, and utilize information from previous lines in composing new ones. -The programmer using the History library has available to him functions -for remembering lines on a history stack, associating arbitrary data -with a line, removing lines from the stack, searching through the stack +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 -on the stack directly. In addition, a history @dfn{expansion} function -is available which provides for a consistent user interface across many +in the list directly. In addition, a history @dfn{expansion} function +is available which provides for a consistent user interface across different programs. -The end-user using programs written with the History library has the -benifit of a consistent user interface, with a set of well-known +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 used by @code{Csh}. +the history substitution provided by @code{csh}. If the programmer desires, he can use the Readline library, which includes some history manipulation by default, and has the added -advantage of Emacs style command line editing. +advantage of command line editing. @node History Storage @section History Storage +The history list is an array of history entries. A history entry is +declared as follows: + @example typedef struct _hist_entry @{ char *line; @@ -75,179 +79,378 @@ typedef struct _hist_entry @{ @} HIST_ENTRY; @end example +The history list itself might therefore be declared as + +@example +HIST_ENTRY **the_history_list; +@end example + +The state of the History library is encapsulated into a single structure: + +@example +/* 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; +@end example + +If the flags member includes @code{HS_STIFLED}, the history has been +stifled. + @node History Functions @section History Functions This section describes the calling sequence for the various functions present in GNU History. -@defun {void using_history} () +@menu +* Initializing History and State Management:: Functions to call when you + want to use history in a + program. +* History List Management:: Functions used to manage the list + of history entries. +* Information About the History List:: Functions returning information about + the history list. +* Moving Around the History List:: Functions used to change the position + in the history list. +* Searching the History List:: Functions to search the history list + for entries containing a string. +* Managing the History File:: Functions that read and write a file + containing the history list. +* History Expansion:: Functions to perform csh-like history + expansion. +@end menu + +@node Initializing History and State Management +@subsection Initializing History and State Management + +This section describes functions used to initialize and manage +the state of the History library when you want to use the history +functions in your program. + +@deftypefun void using_history () Begin a session in which the history functions might be used. This -just initializes the interactive variables. -@end defun +initializes the interactive variables. +@end deftypefun + +@deftypefun {HISTORY_STATE *} history_get_history_state () +Return a structure describing the current state of the input history. +@end deftypefun + +@deftypefun void history_set_history_state (HISTORY_STATE *state) +Set the state of the history list according to @var{state}. +@end deftypefun + +@node History List Management +@subsection History List Management -@defun {void add_history} (char *string) +These functions manage individual entries on the history list, or set +parameters managing the list itself. + +@deftypefun void add_history (char *string) Place @var{string} at the end of the history list. The associated data field (if any) is set to @code{NULL}. -@end defun - -@defun {int where_history} () -Returns the number which says what history element we are now looking -at. -@end defun - -@defun {int history_set_pos} (int pos) -Set the position in the history list to @var{pos}. -@end defun - -@defun {int history_search_pos} (char *string, int direction, int pos) -Search for @var{string} in the history list, starting at @var{pos}, an -absolute index into the list. @var{direction}, if negative, says to search -backwards from @var{pos}, else forwards. Returns the absolute index of -the history element where @var{string} was found, or -1 otherwise. -@end defun - -@defun {HIST_ENTRY *remove_history} (); -Remove history element @var{which} from the history. The removed -element is returned to you so you can free the line, data, +@end deftypefun + +@deftypefun {HIST_ENTRY *} remove_history (int which) +Remove history entry at offset @var{which} from the history. The +removed element is returned so you can free the line, data, and containing structure. -@end defun +@end deftypefun -@defun {void stifle_history} (int max) -Stifle the history list, remembering only @var{max} number of entries. -@end defun +@deftypefun {HIST_ENTRY *} replace_history_entry (int which, char *line, char *data) +Make the history entry at offset @var{which} have @var{line} and @var{data}. +This returns the old entry so you can dispose of the data. In the case +of an invalid @var{which}, a @code{NULL} pointer is returned. +@end deftypefun -@defun {int unstifle_history} (); +@deftypefun void clear_history () +Clear the history list by deleting all the entries. +@end deftypefun + +@deftypefun void stifle_history (int max) +Stifle the history list, remembering only the last @var{max} entries. +@end deftypefun + +@deftypefun int unstifle_history () Stop stifling the history. This returns the previous amount the -history was stifled by. The value is positive if the history was +history was stifled. The value is positive if the history was stifled, negative if it wasn't. -@end defun +@end deftypefun + +@deftypefun int history_is_stifled () +Returns non-zero if the history is stifled, zero if it is not. +@end deftypefun + +@node Information About the History List +@subsection Information About the History List -@defun {int read_history} (char *filename) +These functions return information about the entire history list or +individual list entries. + +@deftypefun {HIST_ENTRY **} history_list () +Return a @code{NULL} terminated array of @code{HIST_ENTRY} which is the +current input history. Element 0 of this list is the beginning of time. +If there is no history, return @code{NULL}. +@end deftypefun + +@deftypefun int where_history () +Returns the offset of the current history element. +@end deftypefun + +@deftypefun {HIST_ENTRY *} current_history () +Return the history entry at the current position, as determined by +@code{where_history ()}. If there is no entry there, return a @code{NULL} +pointer. +@end deftypefun + +@deftypefun {HIST_ENTRY *} history_get (int offset) +Return the history entry at position @var{offset}, starting from +@code{history_base}. If there is no entry there, or if @var{offset} +is greater than the history length, return a @code{NULL} pointer. +@end deftypefun + +@deftypefun int history_total_bytes () +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. +@end deftypefun + +@node Moving Around the History List +@subsection Moving Around the History List + +These functions allow the current index into the history list to be +set or changed. + +@deftypefun int history_set_pos (int pos) +Set the position in the history list to @var{pos}, an absolute index +into the list. +@end deftypefun + +@deftypefun {HIST_ENTRY *} previous_history () +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} pointer. +@end deftypefun + +@deftypefun {HIST_ENTRY *} next_history () +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} pointer. +@end deftypefun + +@node Searching the History List +@subsection Searching the History List +@cindex History Searching + +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 @dfn{anchored}, +meaning that the string must match at the beginning of the history entry. +@cindex anchored search + +@deftypefun int history_search (char *string, int direction) +Search the history for @var{string}, starting at the current history +offset. If @var{direction} < 0, then the search is through previous entries, +else through subsequent. If @var{string} is found, then +the current history index is set to that history entry, and the value +returned is the offset in the line of the entry where +@var{string} was found. Otherwise, nothing is changed, and a -1 is +returned. +@end deftypefun + +@deftypefun int history_search_prefix (char *string, int direction) +Search the history for @var{string}, starting at the current history +offset. The search is anchored: matching lines must begin with +@var{string}. If @var{direction} < 0, then the search is through previous +entries, else through subsequent. If @var{string} is found, then the +current history index is set to that entry, and the return value is 0. +Otherwise, nothing is changed, and a -1 is returned. +@end deftypefun + +@deftypefun int history_search_pos (char *string, int direction, int pos) +Search for @var{string} in the history list, starting at @var{pos}, an +absolute index into the list. If @var{direction} is negative, the search +proceeds backward from @var{pos}, otherwise forward. Returns the absolute +index of the history element where @var{string} was found, or -1 otherwise. +@end deftypefun + +@node Managing the History File +@subsection Managing the History File + +The History library can read the history from and write it to a file. +This section documents the functions for managing a history file. + +@deftypefun int read_history (char *filename) Add the contents of @var{filename} to the history list, a line at a time. If @var{filename} is @code{NULL}, then read from @file{~/.history}. Returns 0 if successful, or errno if not. -@end defun +@end deftypefun -@defun {int read_history_range} (char *filename, int from, int to) +@deftypefun int read_history_range (char *filename, int from, int to) Read a range of lines from @var{filename}, adding them to the history list. -Start reading at the @var{from}'th line and end at the @var{to}'th. If +Start reading at line @var{from} and end at @var{to}. If @var{from} is zero, start at the beginning. If @var{to} is less than @var{from}, then read until the end of the file. If @var{filename} is @code{NULL}, then read from @file{~/.history}. Returns 0 if successful, or @code{errno} if not. -@end defun +@end deftypefun -@defun {int write_history} (char *filename) -Append the current history to @var{filename}. If @var{filename} is -@code{NULL}, then append the history list to @file{~/.history}. Values +@deftypefun int write_history (char *filename) +Write the current history to @var{filename}, overwriting @var{filename} +if necessary. If @var{filename} is +@code{NULL}, then write the history list to @file{~/.history}. Values returned are as in @code{read_history ()}. -@end defun +@end deftypefun -@defun {int append_history} (int nelements, char *filename) -Append @var{nelement} entries to @var{filename}. The entries appended -are from the end of the list minus @var{nelements} up to the end of the -list. -@end defun +@deftypefun int append_history (int nelements, char *filename) +Append the last @var{nelements} of the history list to @var{filename}. +@end deftypefun -@defun {HIST_ENTRY *replace_history_entry} () -Make the history entry at @var{which} have @var{line} and @var{data}. -This returns the old entry so you can dispose of the data. In the case -of an invalid @var{which}, a @code{NULL} pointer is returned. -@end defun - -@defun {HIST_ENTRY *current_history} () -Return the history entry at the current position, as determined by -@code{history_offset}. If there is no entry there, return a @code{NULL} -pointer. -@end defun - -@defun {HIST_ENTRY *previous_history} () -Back up @var{history_offset} to the previous history entry, and return a -pointer to that entry. If there is no previous entry, return a -@code{NULL} pointer. -@end defun +@deftypefun int history_truncate_file (char *filename, int nlines) +Truncate the history file @var{filename}, leaving only the last +@var{nlines} lines. +@end deftypefun -@defun {HIST_ENTRY *next_history} () -Move @code{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} pointer. -@end defun - -@defun {HIST_ENTRY **history_list} () -Return a @code{NULL} terminated array of @code{HIST_ENTRY} which is the -current input history. Element 0 of this list is the beginning of time. -If there is no history, return @code{NULL}. -@end defun +@node History Expansion +@subsection History Expansion -@defun {int history_search} (char *string, int direction) -Search the history for @var{string}, starting at @code{history_offset}. -If @var{direction} < 0, then the search is through previous entries, -else through subsequent. If @var{string} is found, then -@code{current_history ()} is the history entry, and the value of this -function is the offset in the line of that history entry that the -@var{string} was found in. Otherwise, nothing is changed, and a -1 is -returned. -@end defun +These functions implement @code{csh}-like history expansion. -@defun {int history_expand} (char *string, char **output) +@deftypefun int history_expand (char *string, char **output) Expand @var{string}, placing the result into @var{output}, a pointer -to a string. Returns: +to a string (@pxref{History Interaction}). Returns: @table @code @item 0 If no expansions took place (or, if the only change in the text was the de-slashifying of the history expansion -character), +character); @item 1 -if expansions did take place, or +if expansions did take place; @item -1 -if there was an error in expansion. +if there was an error in expansion; +@item 2 +if the returned line should only be displayed, but not executed, +as with the @code{:p} modifier (@pxref{Modifiers}). @end table If an error ocurred in expansion, then @var{output} contains a descriptive error message. -@end defun +@end deftypefun -@defun {char *history_arg_extract} (int first, int last, char *string) +@deftypefun {char *} history_arg_extract (int first, int last, char *string) Extract a string segment consisting of the @var{first} through @var{last} -arguments present in @var{string}. Arguments are broken up as in -the GNU Bash shell. -@end defun - -@defun {int history_total_bytes} (); -Return the number of bytes that the primary history entries are using. -This just adds up the lengths of @code{the_history->lines}. -@end defun +arguments present in @var{string}. Arguments are broken up as in Bash. +@end deftypefun + +@deftypefun {char *} get_history_event (char *string, int *cindex, int qchar) +Returns the text of the history event beginning at @var{string} + +@var{*cindex}. @var{*cindex} is modified to point to after the event +specifier. At function entry, @var{cindex} points to the index into +@var{string} where the history event specification begins. @var{qchar} +is a character that is allowed to end the event specification in addition +to the ``normal'' terminating characters. +@end deftypefun + +@deftypefun {char **} history_tokenize (char *string) +Return an array of tokens parsed out of @var{string}, much as the +shell might. The tokens are split on white space and on the +characters @code{()<>;&|$}, and shell quoting conventions are +obeyed. +@end deftypefun @node History Variables @section History Variables -This section describes the variables in GNU History that are externally -visible. - -@defvar {int history_base} -For convenience only. You set this when interpreting history commands. -It is the logical offset of the first history element. -@end defvar +This section describes the externally visible variables exported by +the GNU History Library. + +@deftypevar int history_base +The logical offset of the first entry in the history list. +@end deftypevar + +@deftypevar int history_length +The number of entries currently stored in the history list. +@end deftypevar + +@deftypevar int max_input_history +The maximum number of history entries. This must be changed using +@code{stifle_history ()}. +@end deftypevar + +@deftypevar char history_expansion_char +The character that starts a history event. The default is @samp{!}. +@end deftypevar + +@deftypevar char history_subst_char +The character that invokes word substitution if found at the start of +a line. The default is @samp{^}. +@end deftypevar + +@deftypevar char history_comment_char +During tokenization, if this character is seen as the first character +of a word, then it and all subsequent characters up to a newline are +ignored, suppressing history expansion for the remainder of the line. +This is disabled by default. +@end deftypevar + +@deftypevar {char *} history_no_expand_chars +The list of characters which inhibit history expansion if found immediately +following @var{history_expansion_char}. The default is whitespace and +@samp{=}. +@end deftypevar + +@deftypevar {char *} history_search_delimiter_chars +The list of additional characters which can delimit a history search +string, in addition to whitespace, @samp{:} and @samp{?} in the case of +a substring search. The default is empty. +@end deftypevar + +@deftypevar int history_quotes_inhibit_expansion +If non-zero, single-quoted words are not scanned for the history expansion +character. The default value is 0. +@end deftypevar + +@deftypevar {Function *} history_inhibit_expansion_function +This should be set to the address of a function that takes two arguments: +a @code{char *} (@var{string}) and an integer index into that string (@var{i}). +It should return a non-zero value if the history expansion starting at +@var{string[i]} should not be performed; zero if the expansion should +be done. +It is intended for use by applications like Bash that use the history +expansion character for additional purposes. +By default, this variable is set to NULL. +@end deftypevar @node History Programming Example @section History Programming Example -The following snippet of code demonstrates simple use of the GNU History -Library. +The following program demonstrates simple use of the GNU History Library. @smallexample main () @{ char line[1024], *t; - int done = 0; + int len, done = 0; line[0] = 0; + using_history (); while (!done) @{ - fprintf (stdout, "history%% "); - t = gets (line); + 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"); @@ -257,37 +460,41 @@ main () char *expansion; int result; - using_history (); - result = history_expand (line, &expansion); - strcpy (line, expansion); - free (expansion); if (result) - fprintf (stderr, "%s\n", line); + fprintf (stderr, "%s\n", expansion); - if (result < 0) - continue; + if (result < 0 || result == 2) + @{ + free (expansion); + continue; + @} - add_history (line); + add_history (expansion); + strncpy (line, expansion, sizeof (line) - 1); + free (expansion); @} - if (strcmp (line, "quit") == 0) done = 1; - if (strcmp (line, "save") == 0) write_history (0); - if (strcmp (line, "read") == 0) read_history (0); - if (strcmp (line, "list") == 0) + 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 = history_list (); + register HIST_ENTRY **the_list; register int i; + the_list = history_list (); if (the_list) for (i = 0; the_list[i]; i++) - fprintf (stdout, "%d: %s\n", - i + history_base, the_list[i]->line); + printf ("%d: %s\n", i + history_base, the_list[i]->line); @} - if (strncmp (line, "delete", strlen ("delete")) == 0) + else if (strncmp (line, "delete", 6) == 0) @{ int which; - if ((sscanf (line + strlen ("delete"), "%d", &which)) == 1) + if ((sscanf (line + 6, "%d", &which)) == 1) @{ HIST_ENTRY *entry = remove_history (which); if (!entry) @@ -306,6 +513,3 @@ main () @} @} @end smallexample - - - diff --git a/readline/doc/hsuser.texinfo b/readline/doc/hsuser.texinfo index cda0a688c74..76cb63b1eee 100644 --- a/readline/doc/hsuser.texinfo +++ b/readline/doc/hsuser.texinfo @@ -1,8 +1,8 @@ @ignore This file documents the user interface to the GNU History library. -Copyright (C) 1988, 1991 Free Software Foundation, Inc. -Authored by Brian Fox. +Copyright (C) 1988, 1991, 1996 Free Software Foundation, Inc. +Authored by Brian Fox and Chet Ramey. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on @@ -26,36 +26,236 @@ into another language, under the above conditions for modified versions. @node Using History Interactively @chapter Using History Interactively +@ifset BashFeatures +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 other programs, +see the GNU Readline Library Manual. +@end ifset +@ifclear BashFeatures 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, @pxref{Programming with GNU History}. +@end ifclear +@ifset BashFeatures +@menu +* Bash History Facilities:: How Bash lets you manipulate your command + history. +* Bash History Builtins:: The Bash builtin commands that manipulate + the command history. +* History Interaction:: What it feels like using History as a user. +@end menu +@end ifset +@ifclear BashFeatures @menu * History Interaction:: What it feels like using History as a user. @end menu +@end ifclear + +@ifset BashFeatures +@node Bash History Facilities +@section Bash History Facilities +@cindex command history +@cindex history list + +When the @samp{-o history} option to the @code{set} builtin +is enabled (@pxref{The Set Builtin}), +the shell provides access to the @var{command history}, +the list of commands previously typed. The text of the last +@code{HISTSIZE} +commands (default 500) is saved in a history list. The shell +stores each command in the history list prior to parameter and +variable expansion +but after history expansion is performed, subject to the +values of the shell variables +@code{HISTIGNORE} and @code{HISTCONTROL}. +When the shell starts up, the history is initialized from the +file named by the @code{HISTFILE} variable (default @file{~/.bash_history}). +@code{HISTFILE} is truncated, if necessary, to contain no more than +the number of lines specified by the value of the @code{HISTFILESIZE} +variable. When an interactive shell exits, the last +@code{HISTSIZE} lines are copied from the history list to @code{HISTFILE}. +If the @code{histappend} shell option is set (@pxref{Bash Builtins}), +the lines are appended to the history file, +otherwise the history file is overwritten. +If @code{HISTFILE} +is unset, or if the history file is unwritable, the history is +not saved. After saving the history, the history file is truncated +to contain no more than @code{$HISTFILESIZE} +lines. If @code{HISTFILESIZE} is not set, no truncation is performed. + +The builtin command @code{fc} may be used to list or edit and re-execute +a portion of the history list. +The @code{history} builtin can be used to display or modify the history +list and manipulate the history file. +When using the command-line editing, search commands +are available in each editing mode that provide access to the +history list. + +The shell allows control over which commands are saved on the history +list. The @code{HISTCONTROL} and @code{HISTIGNORE} +variables may be set to cause the shell to save only a subset of the +commands entered. +The @code{cmdhist} +shell option, if enabled, causes the shell to attempt to save each +line of a multi-line command in the same history entry, adding +semicolons where necessary to preserve syntactic correctness. +The @code{lithist} +shell option causes the shell to save the command with embedded newlines +instead of semicolons. +@xref{Bash Builtins}, for a description of @code{shopt}. + +@node Bash History Builtins +@section Bash History Builtins +@cindex history builtins + +Bash provides two builtin commands that allow you to manipulate the +history list and history file. + +@table @code + +@item fc +@btindex fc +@example +@code{fc [-e @var{ename}] [-nlr] [@var{first}] [@var{last}]} +@code{fc -s [@var{pat}=@var{rep}] [@var{command}]} +@end example + +Fix Command. In the first form, a range of commands from @var{first} to +@var{last} is selected from the history list. Both @var{first} and +@var{last} may be specified as a string (to locate the most recent +command beginning with that string) or as a number (an index into the +history list, where a negative number is used as an offset from the +current command number). If @var{last} is not specified it is set to +@var{first}. If @var{first} is not specified it is set to the previous +command for editing and @minus{}16 for listing. If the @samp{-l} flag is +given, the commands are listed on standard output. The @samp{-n} flag +suppresses the command numbers when listing. The @samp{-r} flag +reverses the order of the listing. Otherwise, the editor given by +@var{ename} is invoked on a file containing those commands. If +@var{ename} is not given, the value of the following variable expansion +is used: @code{$@{FCEDIT:-$@{EDITOR:-vi@}@}}. This says to use the +value of the @code{FCEDIT} variable if set, or the value of the +@code{EDITOR} variable if that is set, or @code{vi} if neither is set. +When editing is complete, the edited commands are echoed and executed. + +In the second form, @var{command} is re-executed after each instance +of @var{pat} in the selected command is replaced by @var{rep}. + +A useful alias to use with the @code{fc} command is @code{r='fc -s'}, so +that typing @samp{r cc} runs the last command beginning with @code{cc} +and typing @samp{r} re-executes the last command (@pxref{Aliases}). + +@item history +@btindex history +@example +history [-c] [@var{n}] +history [-anrw] [@var{filename}] +history -ps @var{arg} +@end example + +Display the history list with line numbers. Lines prefixed with +with a @samp{*} have been modified. An argument of @var{n} says +to list only the last @var{n} lines. Options, if supplied, have +the following meanings: + +@table @code +@item -w +Write out the current history to the history file. + +@item -r +Read the current history file and append its contents to +the history list. + +@item -a +Append the new +history lines (history lines entered since the beginning of the +current Bash session) to the history file. + +@item -n +Append the history lines not already read from the history file +to the current history list. These are lines appended to the history +file since the beginning of the current Bash session. + +@item -c +Clear the history list. This may be combined +with the other options to replace the history list completely. + +@item -s +The @var{arg}s are added to the end of +the history list as a single entry. + +@item -p +Perform history substitution on the @var{arg}s and display the result +on the standard output, without storing the results in the history list. +@end table + +When the @samp{-w}, @samp{-r}, @samp{-a}, or @samp{-n} option is +used, if @var{filename} +is given, then it is used as the history file. If not, then +the value of the @code{HISTFILE} variable is used. + +@end table +@end ifset @node History Interaction -@section History Interaction -@cindex expansion +@section History Expansion +@cindex history expansion The History library provides a history expansion feature that is similar -to the history expansion in Csh. The following text describes the sytax -that you use to manipulate the history information. +to the history expansion provided by @code{csh}. This section +describes the syntax used to manipulate the history information. + +History expansions introduce words from the history list into +the input stream, making it easy to repeat commands, insert the +arguments to a previous command into the current input line, or +fix errors in previous commands quickly. History expansion takes place in two parts. The first is to determine -which line from the previous history should be used during substitution. +which line from the history list should be used during substitution. The second is to select portions of that line for inclusion into the -current one. The line selected from the previous history is called the +current one. The line selected from the history is called the @dfn{event}, and the portions of that line that are acted upon are -called @dfn{words}. The line is broken into words in the same fashion -that the Bash shell does, so that several English (or Unix) words -surrounded by quotes are considered as one word. +called @dfn{words}. Various @dfn{modifiers} are available to manipulate +the selected words. The line is broken into words in the same fashion +that Bash does, so that several words +surrounded by quotes are considered one word. +History expansions are introduced by the appearance of the +history expansion character, which is @samp{!} by default. +@ifset BashFeatures +Only @samp{\} and @samp{'} may be used to escape the history expansion +character. +@end ifset + +@ifset BashFeatures +Several shell options settable with the @code{shopt} +builtin (@pxref{Bash Builtins}) may be used to tailor +the behavior of history expansion. If the +@code{histverify} shell option is enabled, and Readline +is being used, history substitutions are not immediately passed to +the shell parser. +Instead, the expanded line is reloaded into the Readline +editing buffer for further modification. +If Readline is being used, and the @code{histreedit} +shell option is enabled, a failed history expansion will be +reloaded into the Readline editing buffer for correction. +The @samp{-p} option to the @code{history} builtin command +may be used to see what a history expansion will do before using it. +The @samp{-s} option to the @code{history} builtin may be used to +add commands to the end of the history list without actually executing +them, so that they are available for subsequent recall. +This is most useful in conjunction with Readline. + +The shell allows control of the various characters used by the +history expansion mechanism with the @code{histchars} variable. +@end ifset @menu * Event Designators:: How to specify which history line to use. * Word Designators:: Specifying which words are of interest. -* Modifiers:: Modifying the results of susbstitution. +* Modifiers:: Modifying the results of substitution. @end menu @node Event Designators @@ -64,90 +264,135 @@ surrounded by quotes are considered as one word. An event designator is a reference to a command line entry in the history list. +@cindex history events @table @asis @item @code{!} -Start a history subsititution, except when followed by a space, tab, or -the end of the line... @key{=} or @key{(}. +Start a history substitution, except when followed by a space, tab, +the end of the line, @samp{=} or @samp{(}. -@item @code{!!} -Refer to the previous command. This is a synonym for @code{!-1}. - -@item @code{!n} +@item @code{!@var{n}} Refer to command line @var{n}. -@item @code{!-n} -Refer to the command line @var{n} lines back. +@item @code{!-@var{n}} +Refer to the command @var{n} lines back. -@item @code{!string} +@item @code{!!} +Refer to the previous command. This is a synonym for @samp{!-1}. + +@item @code{!@var{string}} Refer to the most recent command starting with @var{string}. -@item @code{!?string}[@code{?}] -Refer to the most recent command containing @var{string}. +@item @code{!?@var{string}[?]} +Refer to the most recent command containing @var{string}. The trailing +@samp{?} may be omitted if the @var{string} is followed immediately by +a newline. + +@item @code{^@var{string1}^@var{string2}^} +Quick Substitution. Repeat the last command, replacing @var{string1} +with @var{string2}. Equivalent to +@code{!!:s/@var{string1}/@var{string2}/}. + +@item @code{!#} +The entire command line typed so far. @end table @node Word Designators @subsection Word Designators -A @key{:} separates the event specification from the word designator. It -can be omitted if the word designator begins with a @key{^}, @key{$}, -@key{*} or @key{%}. Words are numbered from the beginning of the line, -with the first word being denoted by a 0 (zero). +Word designators are used to select desired words from the event. +A @samp{:} separates the event specification from the word designator. It +may be omitted if the word designator begins with a @samp{^}, @samp{$}, +@samp{*}, @samp{-}, or @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. @table @code @item 0 (zero) -The zero'th word. For many applications, this is the command word. +The @code{0}th word. For many applications, this is the command word. -@item n -The @var{n}'th word. +@item @var{n} +The @var{n}th word. @item ^ -The first argument. that is, word 1. +The first argument; that is, word 1. @item $ The last argument. @item % -The word matched by the most recent @code{?string?} search. +The word matched by the most recent @samp{?@var{string}?} search. -@item x-y -A range of words; @code{-@var{y}} Abbreviates @code{0-@var{y}}. +@item @var{x}-@var{y} +A range of words; @samp{-@var{y}} abbreviates @samp{0-@var{y}}. @item * -All of the words, excepting the zero'th. This is a synonym for @code{1-$}. -It is not an error to use @key{*} if there is just one word in the event. -The empty string is returned in that case. +All of the words, except the @code{0}th. This is a synonym for @samp{1-$}. +It is not an error to use @samp{*} if there is just one word in the event; +the empty string is returned in that case. + +@item @var{x}* +Abbreviates @samp{@var{x}-$} + +@item @var{x}- +Abbreviates @samp{@var{x}-$} like @samp{@var{x}*}, but omits the last word. @end table +If a word designator is supplied without an event specification, the +previous command is used as the event. + @node Modifiers @subsection Modifiers After the optional word designator, you can add a sequence of one or more -of the following modifiers, each preceded by a @key{:}. +of the following modifiers, each preceded by a @samp{:}. @table @code -@item # -The entire command line typed so far. This means the current command, -not the previous command, so it really isn't a word designator, and doesn't -belong in this section. - @item h Remove a trailing pathname component, leaving only the head. +@item t +Remove all leading pathname components, leaving the tail. + @item r -Remove a trailing suffix of the form @samp{.}@var{suffix}, leaving the basename. +Remove a trailing suffix of the form @samp{.@var{suffix}}, leaving +the basename. @item e -Remove all but the suffix. - -@item t -Remove all leading pathname components, leaving the tail. +Remove all but the trailing suffix. @item p Print the new command but do not execute it. + +@ifset BashFeatures +@item q +Quote the substituted words, escaping further substitutions. + +@item x +Quote the substituted words as with @samp{q}, +but break into words at spaces, tabs, and newlines. +@end ifset + +@item s/@var{old}/@var{new}/ +Substitute @var{new} for the first occurrence of @var{old} in the +event line. Any delimiter may be used in place of @samp{/}. +The delimiter may be quoted in @var{old} and @var{new} +with a single backslash. If @samp{&} appears in @var{new}, +it is replaced by @var{old}. A single backslash will quote +the @samp{&}. The final delimiter is optional if it is the last +character on the input line. + +@item & +Repeat the previous substitution. + +@item g +Cause changes to be applied over the entire event line. Used in +conjunction with @samp{s}, as in @code{gs/@var{old}/@var{new}/}, +or with @samp{&}. + @end table diff --git a/readline/doc/readline.0 b/readline/doc/readline.0 new file mode 100644 index 00000000000..c925d529cb5 --- /dev/null +++ b/readline/doc/readline.0 @@ -0,0 +1,1122 @@ + + + +READLINE(3) READLINE(3) + + +NNAAMMEE + readline - get a line from a user with editing + +SSYYNNOOPPSSIISS + ##iinncclluuddee <> + ##iinncclluuddee <> + + cchhaarr **rreeaaddlliinnee ((pprroommpptt)) + cchhaarr **pprroommpptt;; + +CCOOPPYYRRIIGGHHTT + Readline is Copyright (C) 1989, 1991, 1993, 1995, 1996 by + the Free Software Foundation, Inc. + +DDEESSCCRRIIPPTTIIOONN + rreeaaddlliinnee will read a line from the terminal and return it, + using pprroommpptt as a prompt. If pprroommpptt is null, no prompt is + issued. The line returned is allocated with _m_a_l_l_o_c(3), so + the caller must free it when finished. The line returned + has the final newline removed, so only the text of the + line remains. + + rreeaaddlliinnee offers editing capabilities while the user is + entering the line. By default, the line editing commands + are similar to those of emacs. A vi-style line editing + interface is also available. + +RREETTUURRNN VVAALLUUEE + rreeaaddlliinnee returns the text of the line read. A blank line + returns the empty string. If EEOOFF is encountered while + reading a line, and the line is empty, NNUULLLL is returned. + If an EEOOFF is read with a non-empty line, it is treated as + a newline. + +NNOOTTAATTIIOONN + An emacs-style notation is used to denote keystrokes. + Control keys are denoted by C-_k_e_y, e.g., C-n means Con- + trol-N. Similarly, _m_e_t_a keys are denoted by M-_k_e_y, so M-x + means Meta-X. (On keyboards without a _m_e_t_a key, M-_x means + ESC _x, i.e., press the Escape key then the _x key. This + makes ESC the _m_e_t_a _p_r_e_f_i_x. The combination M-C-_x means + ESC-Control-_x, or press the Escape key then hold the Con- + trol key while pressing the _x key.) + + Readline commands may be given numeric _a_r_g_u_m_e_n_t_s, which + normally act as a repeat count. Sometimes, however, it is + the sign of the argument that is significant. Passing a + negative argument to a command that acts in the forward + direction (e.g., kkiillll--lliinnee) causes that command to act in + a backward direction. Commands whose behavior with argu- + ments deviates from this are noted. + + When a command is described as _k_i_l_l_i_n_g text, the text + deleted is saved for possible future retrieval (_y_a_n_k_i_n_g). + + + +GNU 1998 Feb 19 1 + + + + + +READLINE(3) READLINE(3) + + + The killed text is saved in a _k_i_l_l _r_i_n_g. Consecutive + kills cause the text to be accumulated into one unit, + which can be yanked all at once. Commands which do not + kill text separate the chunks of text on the kill ring. + +IINNIITTIIAALLIIZZAATTIIOONN FFIILLEE + Readline is customized by putting commands in an initial- + ization file (the _i_n_p_u_t_r_c file). The name of this file is + taken from the value of the IINNPPUUTTRRCC environment variable. + If that variable is unset, the default is _~_/_._i_n_p_u_t_r_c. + When a program which uses the readline library starts up, + the init file is read, and the key bindings and variables + are set. There are only a few basic constructs allowed in + the readline init file. Blank lines are ignored. Lines + beginning with a ## are comments. Lines beginning with a $$ + indicate conditional constructs. Other lines denote key + bindings and variable settings. Each program using this + library may add its own commands and bindings. + + For example, placing + + M-Control-u: universal-argument + or + C-Meta-u: universal-argument + into the _i_n_p_u_t_r_c would make M-C-u execute the readline + command _u_n_i_v_e_r_s_a_l_-_a_r_g_u_m_e_n_t. + + The following symbolic character names are recognized + while processing key bindings: _R_U_B_O_U_T, _D_E_L, _E_S_C, _L_F_D, _N_E_W_- + _L_I_N_E, _R_E_T, _R_E_T_U_R_N, _S_P_C, _S_P_A_C_E, and _T_A_B. In addition to + command names, readline allows keys to be bound to a + string that is inserted when the key is pressed (a _m_a_c_r_o). + + + KKeeyy BBiinnddiinnggss + The syntax for controlling key bindings in the _i_n_p_u_t_r_c + file is simple. All that is required is the name of the + command or the text of a macro and a key sequence to which + it should be bound. The name may be specified in one of + two ways: as a symbolic key name, possibly with _M_e_t_a_- or + _C_o_n_t_r_o_l_- prefixes, or as a key sequence. When using the + form kkeeyynnaammee:_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, _k_e_y_n_a_m_e is the name + of a key spelled out in English. For example: + + Control-u: universal-argument + Meta-Rubout: backward-kill-word + Control-o: ">&output" + + In the above example, _C_-_u is bound to the function uunniivveerr-- + ssaall--aarrgguummeenntt, _M_-_D_E_L is bound to the function bbaacckk-- + wwaarrdd--kkiillll--wwoorrdd, and _C_-_o is bound to run the macro + expressed on the right hand side (that is, to insert the + text _>_&_o_u_t_p_u_t into the line). + + + + +GNU 1998 Feb 19 2 + + + + + +READLINE(3) READLINE(3) + + + In the second form, ""kkeeyysseeqq"":_f_u_n_c_t_i_o_n_-_n_a_m_e or _m_a_c_r_o, kkeeyy-- + sseeqq differs from kkeeyynnaammee above in that strings denoting an + entire key sequence may be specified by placing the + sequence within double quotes. Some GNU Emacs style key + escapes can be used, as in the following example. + + "\C-u": universal-argument + "\C-x\C-r": re-read-init-file + "\e[11~": "Function Key 1" + + In this example, _C_-_u is again bound to the function uunnii-- + vveerrssaall--aarrgguummeenntt. _C_-_x _C_-_r is bound to the function + rree--rreeaadd--iinniitt--ffiillee, and _E_S_C _[ _1 _1 _~ is bound to insert the + text FFuunnccttiioonn KKeeyy 11. The full set of GNU Emacs style + escape sequences is + \\CC-- control prefix + \\MM-- meta prefix + \\ee an escape character + \\\\ backslash + \\"" literal " + \\'' literal ' + + In addition to the GNU Emacs style escape sequences, a + second set of backslash escapes is available: + \\aa alert (bell) + \\bb backspace + \\dd delete + \\ff form feed + \\nn newline + \\rr carriage return + \\tt horizontal tab + \\vv vertical tab + \\_n_n_n the character whose ASCII code is the octal + value _n_n_n (one to three digits) + \\xx_n_n_n the character whose ASCII code is the hex- + adecimal value _n_n_n (one to three digits) + + When entering the text of a macro, single or double quotes + should be used to indicate a macro definition. Unquoted + text is assumed to be a function name. In the macro body, + the backslash escapes described above are expanded. Back- + slash will quote any other character in the macro text, + including " and '. + + BBaasshh allows the current readline key bindings to be dis- + played or modified with the bbiinndd builtin command. The + editing mode may be switched during interactive use by + using the --oo option to the sseett builtin command. Other + programs using this library provide similar mechanisms. + The _i_n_p_u_t_r_c file may be edited and re-read if a program + does not provide any other means to incorporate new bind- + ings. + + + + + +GNU 1998 Feb 19 3 + + + + + +READLINE(3) READLINE(3) + + + VVaarriiaabblleess + Readline has variables that can be used to further cus- + tomize its behavior. A variable may be set in the _i_n_p_u_t_r_c + file with a statement of the form + + sseett _v_a_r_i_a_b_l_e_-_n_a_m_e _v_a_l_u_e + + Except where noted, readline variables can take the values + OOnn or OOffff. The variables and their default values are: + + bbeellll--ssttyyllee ((aauuddiibbllee)) + Controls what happens when readline wants to ring + the terminal bell. If set to nnoonnee, readline never + rings the bell. If set to vviissiibbllee, readline uses a + visible bell if one is available. If set to aauuddii-- + bbllee, readline attempts to ring the terminal's bell. + ccoommmmeenntt--bbeeggiinn ((````##'''')) + The string that is inserted in vvii mode when the + iinnsseerrtt--ccoommmmeenntt command is executed. This command + is bound to MM--## in emacs mode and to ## in vi com- + mand mode. + ccoommpplleettiioonn--iiggnnoorree--ccaassee ((OOffff)) + If set to OOnn, readline performs filename matching + and completion in a case-insensitive fashion. + ccoommpplleettiioonn--qquueerryy--iitteemmss ((110000)) + This determines when the user is queried about + viewing the number of possible completions gener- + ated by the ppoossssiibbllee--ccoommpplleettiioonnss command. It may + be set to any integer value greater than or equal + to zero. If the number of possible completions is + greater than or equal to the value of this vari- + able, the user is asked whether or not he wishes to + view them; otherwise they are simply listed on the + terminal. + ccoonnvveerrtt--mmeettaa ((OOnn)) + If set to OOnn, readline will convert characters with + the eighth bit set to an ASCII key sequence by + stripping the eighth bit and prepending an escape + character (in effect, using escape as the _m_e_t_a _p_r_e_- + _f_i_x). + ddiissaabbllee--ccoommpplleettiioonn ((OOffff)) + If set to OOnn, readline will inhibit word comple- + tion. Completion characters will be inserted into + the line as if they had been mapped to sseellff--iinnsseerrtt. + eeddiittiinngg--mmooddee ((eemmaaccss)) + Controls whether readline begins with a set of key + bindings similar to _e_m_a_c_s or _v_i. eeddiittiinngg--mmooddee can + be set to either eemmaaccss or vvii. + eennaabbllee--kkeeyyppaadd ((OOffff)) + When set to OOnn, readline will try to enable the + application keypad when it is called. Some systems + need this to enable the arrow keys. + eexxppaanndd--ttiillddee ((OOffff)) + If set to oonn, tilde expansion is performed when + + + +GNU 1998 Feb 19 4 + + + + + +READLINE(3) READLINE(3) + + + readline attempts word completion. + hhoorriizzoonnttaall--ssccrroollll--mmooddee ((OOffff)) + When set to OOnn, makes readline use a single line + for display, scrolling the input horizontally on a + single screen line when it becomes longer than the + screen width rather than wrapping to a new line. + kkeeyymmaapp ((eemmaaccss)) + Set the current readline keymap. The set of legal + keymap names is _e_m_a_c_s_, _e_m_a_c_s_-_s_t_a_n_d_a_r_d_, _e_m_a_c_s_-_m_e_t_a_, + _e_m_a_c_s_-_c_t_l_x_, _v_i_, _v_i_-_m_o_v_e_, _v_i_-_c_o_m_m_a_n_d, and _v_i_-_i_n_s_e_r_t. + _v_i is equivalent to _v_i_-_c_o_m_m_a_n_d; _e_m_a_c_s is equivalent + to _e_m_a_c_s_-_s_t_a_n_d_a_r_d. The default value is _e_m_a_c_s; the + value of eeddiittiinngg--mmooddee also affects the default + keymap. + mmaarrkk--ddiirreeccttoorriieess ((OOnn)) + If set to OOnn, complete>)) + Move to the end of the input history, i.e., the + line currently being entered. + rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((CC--rr)) + Search backward starting at the current line and + moving `up' through the history as necessary. This + is an incremental search. + ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((CC--ss)) + Search forward starting at the current line and + moving `down' through the history as necessary. + This is an incremental search. + nnoonn--iinnccrreemmeennttaall--rreevveerrssee--sseeaarrcchh--hhiissttoorryy ((MM--pp)) + Search backward through the history starting at the + current line using a non-incremental search for a + string supplied by the user. + nnoonn--iinnccrreemmeennttaall--ffoorrwwaarrdd--sseeaarrcchh--hhiissttoorryy ((MM--nn)) + Search forward through the history using a non- + incremental search for a string supplied by the + user. + hhiissttoorryy--sseeaarrcchh--ffoorrwwaarrdd + Search forward through the history for the string + of characters between the start of the current line + and the current cursor position (the _p_o_i_n_t). This + is a non-incremental search. + hhiissttoorryy--sseeaarrcchh--bbaacckkwwaarrdd + Search backward through the history for the string + of characters between the start of the current line + and the point. This is a non-incremental search. + yyaannkk--nntthh--aarrgg ((MM--CC--yy)) + Insert the first argument to the previous command + (usually the second word on the previous line) at + point (the current cursor position). With an argu- + ment _n, insert the _nth word from the previous com- + mand (the words in the previous command begin with + word 0). A negative argument inserts the _nth word + from the end of the previous command. + + + + +GNU 1998 Feb 19 8 + + + + + +READLINE(3) READLINE(3) + + + yyaannkk--llaasstt--aarrgg ((MM--..,, MM--__)) + Insert the last argument to the previous command + (the last word of the previous history entry). + With an argument, behave exactly like yyaannkk--nntthh--aarrgg. + Successive calls to yyaannkk--llaasstt--aarrgg move back through + the history list, inserting the last argument of + each line in turn. + + CCoommmmaannddss ffoorr CChhaannggiinngg TTeexxtt + ddeelleettee--cchhaarr ((CC--dd)) + Delete the character under the cursor. If point is + at the beginning of the line, there are no charac- + ters in the line, and the last character typed was + not bound to BBddeelleettee--cchhaarr, then return EEOOFF. + bbaacckkwwaarrdd--ddeelleettee--cchhaarr ((RRuubboouutt)) + Delete the character behind the cursor. When given + a numeric argument, save the deleted text on the + kill ring. + qquuootteedd--iinnsseerrtt ((CC--qq,, CC--vv)) + Add the next character that you type to the line + verbatim. This is how to insert characters like + CC--qq, for example. + ttaabb--iinnsseerrtt ((MM--TTAABB)) + Insert a tab character. + sseellff--iinnsseerrtt ((aa,, bb,, AA,, 11,, !!,, ......)) + Insert the character typed. + ttrraannssppoossee--cchhaarrss ((CC--tt)) + Drag the character before point forward over the + character at point. Point moves forward as well. + If point is at the end of the line, then transpose + the two characters before point. Negative argu- + ments don't work. + ttrraannssppoossee--wwoorrddss ((MM--tt)) + Drag the word behind the cursor past the word in + front of the cursor moving the cursor over that + word as well. + uuppccaassee--wwoorrdd ((MM--uu)) + Uppercase the current (or following) word. With a + negative argument, uppercase the previous word, but + do not move point. + ddoowwnnccaassee--wwoorrdd ((MM--ll)) + Lowercase the current (or following) word. With a + negative argument, lowercase the previous word, but + do not move point. + ccaappiittaalliizzee--wwoorrdd ((MM--cc)) + Capitalize the current (or following) word. With a + negative argument, capitalize the previous word, + but do not move point. + + KKiilllliinngg aanndd YYaannkkiinngg + kkiillll--lliinnee ((CC--kk)) + Kill the text from the current cursor position to + the end of the line. + + + + +GNU 1998 Feb 19 9 + + + + + +READLINE(3) READLINE(3) + + + bbaacckkwwaarrdd--kkiillll--lliinnee ((CC--xx RRuubboouutt)) + Kill backward to the beginning of the line. + uunniixx--lliinnee--ddiissccaarrdd ((CC--uu)) + Kill backward from point to the beginning of the + line. The killed text is saved on the kill-ring. + kkiillll--wwhhoollee--lliinnee + Kill all characters on the current line, no matter + where the cursor is. + kkiillll--wwoorrdd ((MM--dd)) + Kill from the cursor to the end of the current + word, or if between words, to the end of the next + word. Word boundaries are the same as those used + by ffoorrwwaarrdd--wwoorrdd. + bbaacckkwwaarrdd--kkiillll--wwoorrdd ((MM--RRuubboouutt)) + Kill the word behind the cursor. Word boundaries + are the same as those used by bbaacckkwwaarrdd--wwoorrdd. + uunniixx--wwoorrdd--rruubboouutt ((CC--ww)) + Kill the word behind the cursor, using white space + as a word boundary. The word boundaries are dif- + ferent from bbaacckkwwaarrdd--kkiillll--wwoorrdd. + ddeelleettee--hhoorriizzoonnttaall--ssppaaccee ((MM--\\)) + Delete all spaces and tabs around point. + kkiillll--rreeggiioonn + Kill the text between the point and _m_a_r_k (saved + cursor position). This text is referred to as the + _r_e_g_i_o_n. + ccooppyy--rreeggiioonn--aass--kkiillll + Copy the text in the region to the kill buffer. + ccooppyy--bbaacckkwwaarrdd--wwoorrdd + Copy the word before point to the kill buffer. The + word boundaries are the same as bbaacckkwwaarrdd--wwoorrdd. + ccooppyy--ffoorrwwaarrdd--wwoorrdd + Copy the word following point to the kill buffer. + The word boundaries are the same as ffoorrwwaarrdd--wwoorrdd. + yyaannkk ((CC--yy)) + Yank the top of the kill ring into the buffer at + the cursor. + yyaannkk--ppoopp ((MM--yy)) + Rotate the kill ring, and yank the new top. Only + works following yyaannkk or yyaannkk--ppoopp. + + NNuummeerriicc AArrgguummeennttss + ddiiggiitt--aarrgguummeenntt ((MM--00,, MM--11,, ......,, MM----)) + Add this digit to the argument already accumulat- + ing, or start a new argument. M-- starts a nega- + tive argument. + uunniivveerrssaall--aarrgguummeenntt + This is another way to specify an argument. If + this command is followed by one or more digits, + optionally with a leading minus sign, those digits + define the argument. If the command is followed by + digits, executing uunniivveerrssaall--aarrgguummeenntt again ends the + numeric argument, but is otherwise ignored. As a + special case, if this command is immediately + + + +GNU 1998 Feb 19 10 + + + + + +READLINE(3) READLINE(3) + + + followed by a character that is neither a digit or + minus sign, the argument count for the next command + is multiplied by four. The argument count is ini- + tially one, so executing this function the first + time makes the argument count four, a second time + makes the argument count sixteen, and so on. + + CCoommpplleettiinngg + ccoommpplleettee ((TTAABB)) + Attempt to perform completion on the text before + point. The actual completion performed is applica- + tion-specific. BBaasshh, for instance, attempts com- + pletion treating the text as a variable (if the + text begins with $$), username (if the text begins + with ~~), hostname (if the text begins with @@), or + command (including aliases and functions) in turn. + If none of these produces a match, filename comple- + tion is attempted. GGddbb, on the other hand, allows + completion of program functions and variables, and + only attempts filename completion under certain + circumstances. + ppoossssiibbllee--ccoommpplleettiioonnss ((MM--??)) + List the possible completions of the text before + point. + iinnsseerrtt--ccoommpplleettiioonnss ((MM--**)) + Insert all completions of the text before point + that would have been generated by ppoossssiibbllee--ccoommppllee-- + ttiioonnss. + mmeennuu--ccoommpplleettee + Similar to ccoommpplleettee, but replaces the word to be + completed with a single match from the list of pos- + sible completions. Repeated execution of mmeennuu--ccoomm-- + pplleettee steps through the list of possible comple- + tions, inserting each match in turn. At the end of + the list of completions, the bell is rung and the + original text is restored. An argument of _n moves + _n positions forward in the list of matches; a nega- + tive argument may be used to move backward through + the list. This command is intended to be bound to + TTAABB, but is unbound by default. + + KKeeyybbooaarrdd MMaaccrrooss + ssttaarrtt--kkbbdd--mmaaccrroo ((CC--xx (()) + Begin saving the characters typed into the current + keyboard macro. + eenndd--kkbbdd--mmaaccrroo ((CC--xx )))) + Stop saving the characters typed into the current + keyboard macro and store the definition. + ccaallll--llaasstt--kkbbdd--mmaaccrroo ((CC--xx ee)) + Re-execute the last keyboard macro defined, by mak- + ing the characters in the macro appear as if typed + at the keyboard. + + + + + +GNU 1998 Feb 19 11 + + + + + +READLINE(3) READLINE(3) + + + MMiisscceellllaanneeoouuss + rree--rreeaadd--iinniitt--ffiillee ((CC--xx CC--rr)) + Read in the contents of the _i_n_p_u_t_r_c file, and + incorporate any bindings or variable assignments + found there. + aabboorrtt ((CC--gg)) + Abort the current editing command and ring the ter- + minal's bell (subject to the setting of + bbeellll--ssttyyllee). + ddoo--uuppppeerrccaassee--vveerrssiioonn ((MM--aa,, MM--bb,, MM--_x,, ......)) + If the metafied character _x is lowercase, run the + command that is bound to the corresponding upper- + case character. + pprreeffiixx--mmeettaa ((EESSCC)) + Metafy the next character typed. EESSCC ff is equiva- + lent to MMeettaa--ff. + uunnddoo ((CC--__,, CC--xx CC--uu)) + Incremental undo, separately remembered for each + line. + rreevveerrtt--lliinnee ((MM--rr)) + Undo all changes made to this line. This is like + executing the uunnddoo command enough times to return + the line to its initial state. + ttiillddee--eexxppaanndd ((MM--~~)) + Perform tilde expansion on the current word. + sseett--mmaarrkk ((CC--@@,, MM--<>)) + Set the mark to the current point. If a numeric + argument is supplied, the mark is set to that posi- + tion. + eexxcchhaannggee--ppooiinntt--aanndd--mmaarrkk ((CC--xx CC--xx)) + Swap the point with the mark. The current cursor + position is set to the saved position, and the old + cursor position is saved as the mark. + cchhaarraacctteerr--sseeaarrcchh ((CC--]])) + A character is read and point is moved to the next + occurrence of that character. A negative count + searches for previous occurrences. + cchhaarraacctteerr--sseeaarrcchh--bbaacckkwwaarrdd ((MM--CC--]])) + A character is read and point is moved to the pre- + vious occurrence of that character. A negative + count searches for subsequent occurrences. + iinnsseerrtt--ccoommmmeenntt ((MM--##)) + The value of the readline ccoommmmeenntt--bbeeggiinn variable is + inserted at the beginning of the current line, and + the line is accepted as if a newline had been + typed. This makes the current line a shell com- + ment. + dduummpp--ffuunnccttiioonnss + Print all of the functions and their key bindings + to the readline output stream. If a numeric argu- + ment is supplied, the output is formatted in such a + way that it can be made part of an _i_n_p_u_t_r_c file. + dduummpp--vvaarriiaabblleess + Print all of the settable variables and their + + + +GNU 1998 Feb 19 12 + + + + + +READLINE(3) READLINE(3) + + + values to the readline output stream. If a numeric + argument is supplied, the output is formatted in + such a way that it can be made part of an _i_n_p_u_t_r_c + file. + dduummpp--mmaaccrrooss + Print all of the readline key sequences bound to + macros and the strings they ouput. If a numeric + argument is supplied, the output is formatted in + such a way that it can be made part of an _i_n_p_u_t_r_c + file. + eemmaaccss--eeddiittiinngg--mmooddee ((CC--ee)) + When in vvii editing mode, this causes a switch to + eemmaaccss editing mode. + vvii--eeddiittiinngg--mmooddee ((MM--CC--jj)) + When in eemmaaccss editing mode, this causes a switch to + vvii editing mode. + +DDEEFFAAUULLTT KKEEYY BBIINNDDIINNGGSS + The following is a list of the default emacs and vi bind- + ings. Characters with the 8th bit set are written as + M-, and are referred to as _m_e_t_a_f_i_e_d characters. + The printable ASCII characters not mentioned in the list + of emacs standard bindings are bound to the _s_e_l_f_-_i_n_s_e_r_t + function, which just inserts the given character into the + input line. In vi insertion mode, all characters not + specifically mentioned are bound to _s_e_l_f_-_i_n_s_e_r_t. Charac- + ters assigned to signal generation by _s_t_t_y(1) or the ter- + minal driver, such as C-Z or C-C, retain that function. + Upper and lower case _m_e_t_a_f_i_e_d characters are bound to the + same function in the emacs mode meta keymap. The remain- + ing characters are unbound, which causes readline to ring + the bell (subject to the setting of the bbeellll--ssttyyllee vari- + able). + + EEmmaaccss MMooddee + Emacs Standard bindings + + "C-@" set-mark + "C-A" beginning-of-line + "C-B" backward-char + "C-D" delete-char + "C-E" end-of-line + "C-F" forward-char + "C-G" abort + "C-H" backward-delete-char + "C-I" complete + "C-J" accept-line + "C-K" kill-line + "C-L" clear-screen + "C-M" accept-line + "C-N" next-history + "C-P" previous-history + "C-Q" quoted-insert + "C-R" reverse-search-history + + + +GNU 1998 Feb 19 13 + + + + + +READLINE(3) READLINE(3) + + + "C-S" forward-search-history + "C-T" transpose-chars + "C-U" unix-line-discard + "C-V" quoted-insert + "C-W" unix-word-rubout + "C-Y" yank + "C-]" character-search + "C-_" undo + " " to "/" self-insert + "0" to "9" self-insert + ":" to "~" self-insert + "C-?" backward-delete-char + + Emacs Meta bindings + + "M-C-G" abort + "M-C-H" backward-kill-word + "M-C-I" tab-insert + "M-C-J" vi-editing-mode + "M-C-M" vi-editing-mode + "M-C-R" revert-line + "M-C-Y" yank-nth-arg + "M-C-[" complete + "M-C-]" character-search-backward + "M-space" set-mark + "M-#" insert-comment + "M-&" tilde-expand + "M-*" insert-completions + "M--" digit-argument + "M-." yank-last-arg + "M-0" digit-argument + "M-1" digit-argument + "M-2" digit-argument + "M-3" digit-argument + "M-4" digit-argument + "M-5" digit-argument + "M-6" digit-argument + "M-7" digit-argument + "M-8" digit-argument + "M-9" digit-argument + "M-<" beginning-of-history + "M-=" possible-completions + "M->" end-of-history + "M-?" possible-completions + "M-B" backward-word + "M-C" capitalize-word + "M-D" kill-word + "M-F" forward-word + "M-L" downcase-word + "M-N" non-incremental-forward-search-history + "M-P" non-incremental-reverse-search-history + "M-R" revert-line + "M-T" transpose-words + "M-U" upcase-word + + + +GNU 1998 Feb 19 14 + + + + + +READLINE(3) READLINE(3) + + + "M-Y" yank-pop + "M-\" delete-horizontal-space + "M-~" tilde-expand + "M-C-?" backward-delete-word + "M-_" yank-last-arg + + Emacs Control-X bindings + + "C-XC-G" abort + "C-XC-R" re-read-init-file + "C-XC-U" undo + "C-XC-X" exchange-point-and-mark + "C-X(" start-kbd-macro + "C-X)" end-kbd-macro + "C-XE" call-last-kbd-macro + "C-XC-?" backward-kill-line + + + VVII MMooddee bbiinnddiinnggss + VI Insert Mode functions + + "C-D" vi-eof-maybe + "C-H" backward-delete-char + "C-I" complete + "C-J" accept-line + "C-M" accept-line + "C-R" reverse-search-history + "C-S" forward-search-history + "C-T" transpose-chars + "C-U" unix-line-discard + "C-V" quoted-insert + "C-W" unix-word-rubout + "C-Y" yank + "C-[" vi-movement-mode + "C-_" undo + " " to "~" self-insert + "C-?" backward-delete-char + + VI Command Mode functions + + "C-D" vi-eof-maybe + "C-E" emacs-editing-mode + "C-G" abort + "C-H" backward-char + "C-J" accept-line + "C-K" kill-line + "C-L" clear-screen + "C-M" accept-line + "C-N" next-history + "C-P" previous-history + "C-Q" quoted-insert + "C-R" reverse-search-history + "C-S" forward-search-history + "C-T" transpose-chars + + + +GNU 1998 Feb 19 15 + + + + + +READLINE(3) READLINE(3) + + + "C-U" unix-line-discard + "C-V" quoted-insert + "C-W" unix-word-rubout + "C-Y" yank + " " forward-char + "#" insert-comment + "$" end-of-line + "%" vi-match + "&" vi-tilde-expand + "*" vi-complete + "+" next-history + "," vi-char-search + "-" previous-history + "." vi-redo + "/" vi-search + "0" beginning-of-line + "1" to "9" vi-arg-digit + ";" vi-char-search + "=" vi-complete + "?" vi-search + "A" vi-append-eol + "B" vi-prev-word + "C" vi-change-to + "D" vi-delete-to + "E" vi-end-word + "F" vi-char-search + "G" vi-fetch-history + "I" vi-insert-beg + "N" vi-search-again + "P" vi-put + "R" vi-replace + "S" vi-subst + "T" vi-char-search + "U" revert-line + "W" vi-next-word + "X" backward-delete-char + "Y" vi-yank-to + "\" vi-complete + "^" vi-first-print + "_" vi-yank-arg + "`" vi-goto-mark + "a" vi-append-mode + "b" vi-prev-word + "c" vi-change-to + "d" vi-delete-to + "e" vi-end-word + "f" vi-char-search + "h" backward-char + "i" vi-insertion-mode + "j" next-history + "k" prev-history + "l" forward-char + "m" vi-set-mark + "n" vi-search-again + + + +GNU 1998 Feb 19 16 + + + + + +READLINE(3) READLINE(3) + + + "p" vi-put + "r" vi-change-char + "s" vi-subst + "t" vi-char-search + "u" undo + "w" vi-next-word + "x" vi-delete + "y" vi-yank-to + "|" vi-column + "~" vi-change-case + +SSEEEE AALLSSOO + _T_h_e _G_n_u _R_e_a_d_l_i_n_e _L_i_b_r_a_r_y, Brian Fox and Chet Ramey + _T_h_e _G_n_u _H_i_s_t_o_r_y _L_i_b_r_a_r_y, Brian Fox and Chet Ramey + _b_a_s_h(1) + +FFIILLEESS + _~_/_._i_n_p_u_t_r_c + Individual rreeaaddlliinnee initialization file + +AAUUTTHHOORRSS + Brian Fox, Free Software Foundation (primary author) + bfox@ai.MIT.Edu + + Chet Ramey, Case Western Reserve University + chet@ins.CWRU.Edu + +BBUUGG RREEPPOORRTTSS + If you find a bug in rreeaaddlliinnee,, you should report it. But + first, you should make sure that it really is a bug, and + that it appears in the latest version of the rreeaaddlliinnee + library that you have. + + Once you have determined that a bug actually exists, mail + a bug report to _b_u_g_-_r_e_a_d_l_i_n_e@_g_n_u_._o_r_g. If you have a fix, + you are welcome to mail that as well! Suggestions and + `philosophical' bug reports may be mailed to _b_u_g_-_r_e_a_d_- + _l_i_n_e@_g_n_u_._o_r_g or posted to the Usenet newsgroup + ggnnuu..bbaasshh..bbuugg. + + Comments and bug reports concerning this manual page + should be directed to _c_h_e_t_@_i_n_s_._C_W_R_U_._E_d_u. + +BBUUGGSS + It's too big and too slow. + + + + + + + + + + + + +GNU 1998 Feb 19 17 + + diff --git a/readline/doc/readline.dvi b/readline/doc/readline.dvi new file mode 100644 index 0000000000000000000000000000000000000000..d8491dc0cb0011b9c90ad6e4c2cb72c6a5efc294 GIT binary patch literal 185100 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 literal 0 HcmV?d00001 diff --git a/readline/doc/readline.html b/readline/doc/readline.html new file mode 100644 index 00000000000..c708eb07fd1 --- /dev/null +++ b/readline/doc/readline.html @@ -0,0 +1,3482 @@ + + + + +GNU Readline Library + + +

    GNU Readline Library

    +

    Edition 2.2, for Readline Library Version 2.1.

    +

    September 1997

    +
    Brian Fox, Free Software Foundation
    +
    Chet Ramey, Case Western Reserve University
    +

    +


    + +

    +@dircategory Libraries +@direntry +* Readline: (readline). The GNU readline library API + +

    + +

    +This document describes the GNU Readline Library, a utility which aids +in the consistency of user interface across discrete programs that need +to provide a command line interface. + +

    +

    +Published by the Free Software Foundation
    +675 Massachusetts Avenue,
    +Cambridge, MA 02139 USA + +

    +

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

    +

    +Permission is granted to copy 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. + +

    +

    +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. + +

    +

    +Copyright (C) 1989, 1991 Free Software Foundation, Inc. + +

    + + + +

    Command Line Editing

    + +

    +This chapter describes the basic features of the GNU +command line editing interface. + +

    + + + +

    Introduction to Line Editing

    + +

    +The following paragraphs describe the notation used to represent +keystrokes. + +

    +

    +The text C-k is read as `Control-K' and describes the character +produced when the k key is pressed while the Control key +is depressed. + +

    +

    +The text M-k is read as `Meta-K' and describes the character +produced when the meta key (if you have one) is depressed, and the k +key is pressed. If you do not have a meta key, the identical keystroke +can be generated by typing ESC first, and then typing k. +Either process is known as metafying the k key. + +

    +

    +The text M-C-k is read as `Meta-Control-k' and describes the +character produced by metafying C-k. + +

    +

    +In addition, several keys have their own names. Specifically, +DEL, ESC, LFD, SPC, RET, and TAB all +stand for themselves when seen in this text, or in an init file +(@xref{Readline Init File}). + +

    + + +

    Readline Interaction

    +

    + + +

    +

    +Often during an interactive session you type in a long line of text, +only to notice that the first word on the line is misspelled. The +Readline library gives you a set of commands for manipulating the text +as you type it in, allowing you to just fix your typo, and not forcing +you to retype the majority of the line. Using these editing commands, +you move the cursor to the place that needs correction, and delete or +insert the text of the corrections. Then, when you are satisfied with +the line, you simply press RETURN. You do not have to be at the +end of the line to press RETURN; the entire line is accepted +regardless of the location of the cursor within the line. + +

    + + + +

    Readline Init File Syntax

    + +

    +There are only a few basic constructs allowed in the +Readline init file. Blank lines are ignored. +Lines beginning with a `#' are comments. +Lines beginning with a `$' indicate conditional +constructs (see section Conditional Init Constructs). Other lines +denote variable settings and key bindings. + +

    +
    + +
    Variable Settings +
    +You can modify the run-time behavior of Readline by +altering the values of variables in Readline +using the set command within the init file. Here is how to +change from the default Emacs-like key binding to use +vi line editing commands: + + +
    +set editing-mode vi
    +
    + +A great deal of run-time behavior is changeable with the following +variables. + +
    + +
    bell-style +
    + +Controls what happens when Readline wants to ring the terminal bell. +If set to `none', Readline never rings the bell. If set to +`visible', Readline uses a visible bell if one is available. +If set to `audible' (the default), Readline attempts to ring +the terminal's bell. + +
    comment-begin +
    + +The string to insert at the beginning of the line when the +insert-comment command is executed. The default value +is "#". + +
    completion-ignore-case +
    +If set to `on', Readline performs filename matching and completion +in a case-insensitive fashion. +The default value is `off'. + +
    completion-query-items +
    + +The number of possible completions that determines when the user is +asked whether he wants to see the list of possibilities. If the +number of possible completions is greater than this value, +Readline will ask the user whether or not he wishes to view +them; otherwise, they are simply listed. The default limit is +100. + +
    convert-meta +
    + +If set to `on', Readline will convert characters with the +eighth bit set to an ASCII key sequence by stripping the eighth +bit and prepending an ESC character, converting them to a +meta-prefixed key sequence. The default value is `on'. + +
    disable-completion +
    + +If set to `On', Readline will inhibit word completion. +Completion characters will be inserted into the line as if they had +been mapped to self-insert. The default is `off'. + +
    editing-mode +
    + +The editing-mode variable controls which default set of +key bindings is used. By default, Readline starts up in Emacs editing +mode, where the keystrokes are most similar to Emacs. This variable can be +set to either `emacs' or `vi'. + +
    enable-keypad +
    + +When set to `on', Readline will try to enable the application +keypad when it is called. Some systems need this to enable the +arrow keys. The default is `off'. + +
    expand-tilde +
    + +If set to `on', tilde expansion is performed when Readline +attempts word completion. The default is `off'. + +
    horizontal-scroll-mode +
    + +This variable can be set to either `on' or `off'. Setting it +to `on' means that the text of the lines being edited will scroll +horizontally on a single screen line when they are longer than the width +of the screen, instead of wrapping onto a new screen line. By default, +this variable is set to `off'. + +
    keymap +
    + +Sets Readline's idea of the current keymap for key binding commands. +Acceptable keymap names are +emacs, +emacs-standard, +emacs-meta, +emacs-ctlx, +vi, +vi-command, and +vi-insert. +vi is equivalent to vi-command; emacs is +equivalent to emacs-standard. The default value is emacs. +The value of the editing-mode variable also affects the +default keymap. + +
    mark-directories +
    +If set to `on', completed directory names have a slash +appended. The default is `on'. + +
    mark-modified-lines +
    + +This variable, when set to `on', causes Readline to display an +asterisk (`*') at the start of history lines which have been modified. +This variable is `off' by default. + +
    input-meta +
    + + +If set to `on', Readline will enable eight-bit input (it +will not strip the eighth bit from the characters it reads), +regardless of what the terminal claims it can support. The +default value is `off'. The name meta-flag is a +synonym for this variable. + +
    output-meta +
    + +If set to `on', Readline will display characters with the +eighth bit set directly rather than as a meta-prefixed escape +sequence. The default is `off'. + +
    print-completions-horizontally +
    +If set to `on', Readline will display completions with matches +sorted horizontally in alphabetical order, rather than down the screen. +The default is `off'. + +
    show-all-if-ambiguous +
    + +This alters the default behavior of the completion functions. If +set to `on', +words which have more than one possible completion cause the +matches to be listed immediately instead of ringing the bell. +The default value is `off'. + +
    visible-stats +
    + +If set to `on', a character denoting a file's type +is appended to the filename when listing possible +completions. The default is `off'. + +
    + +
    Key Bindings +
    +The syntax for controlling key bindings in the init file is +simple. First you have to know the name of the command that you +want to change. The following sections contain tables of the command +name, the default keybinding, if any, and a short description of what +the command does. + +Once you know the name of the command, simply place the name of the key +you wish to bind the command to, a colon, and then the name of the +command on a line in the init file. The name of the key +can be expressed in different ways, depending on which is most +comfortable for you. + +
    + +
    keyname: function-name or macro +
    +keyname is the name of a key spelled out in English. For example: + +
    +Control-u: universal-argument
    +Meta-Rubout: backward-kill-word
    +Control-o: "> output"
    +
    + +In the above example, C-u is bound to the function +universal-argument, and C-o is bound to run the macro +expressed on the right hand side (that is, to insert the text +`> output' into the line). + +
    "keyseq": function-name or macro +
    +keyseq differs from keyname above in that strings +denoting an entire key sequence can be specified, by placing +the key sequence in double quotes. Some GNU Emacs style key +escapes can be used, as in the following example, but the +special character names are not recognized. + + +
    +"\C-u": universal-argument
    +"\C-x\C-r": re-read-init-file
    +"\e[11~": "Function Key 1"
    +
    + +In the above example, C-u is bound to the function +universal-argument (just as it was in the first example), +`C-x C-r' is bound to the function re-read-init-file, +and `ESC [ 1 1 ~' is bound to insert +the text `Function Key 1'. + +
    + +The following GNU Emacs style escape sequences are available when +specifying key sequences: + +
    + +
    \C- +
    +control prefix +
    \M- +
    +meta prefix +
    \e +
    +an escape character +
    \\ +
    +backslash +
    \" +
    +" +
    \' +
    +' +
    + +In addition to the GNU Emacs style escape sequences, a second +set of backslash escapes is available: + +
    + +
    \a +
    +alert (bell) +
    \b +
    +backspace +
    \d +
    +delete +
    \f +
    +form feed +
    \n +
    +newline +
    \r +
    +carriage return +
    \t +
    +horizontal tab +
    \v +
    +vertical tab +
    \nnn +
    +the character whose ASCII code is the octal value nnn +(one to three digits) +
    \xnnn +
    +the character whose ASCII code is the hexadecimal value nnn +(one to three digits) +
    + +When entering the text of a macro, single or double quotes must +be used to indicate a macro definition. +Unquoted text is assumed to be a function name. +In the macro body, the backslash escapes described above are expanded. +Backslash will quote any other character in the macro text, +including `"' and `''. +For example, the following binding will make `C-x \' +insert a single `\' into the line: + +
    +"\C-x\\": "\\"
    +
    + +
    + + + +

    Conditional Init Constructs

    + +

    +Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key +bindings and variable settings to be performed as the result +of tests. There are four parser directives used. + +

    +
    + +
    $if +
    +The $if construct allows bindings to be made based on the +editing mode, the terminal being used, or the application using +Readline. The text of the test extends to the end of the line; +no characters are required to isolate it. + +
    + +
    mode +
    +The mode= form of the $if directive is used to test +whether Readline is in emacs or vi mode. +This may be used in conjunction +with the `set keymap' command, for instance, to set bindings in +the emacs-standard and emacs-ctlx keymaps only if +Readline is starting out in emacs mode. + +
    term +
    +The term= form may be used to include terminal-specific +key bindings, perhaps to bind the key sequences output by the +terminal's function keys. The word on the right side of the +`=' is tested against both the full name of the terminal and +the portion of the terminal name before the first `-'. This +allows sun to match both sun and sun-cmd, +for instance. + +
    application +
    +The application construct is used to include +application-specific settings. Each program using the Readline +library sets the application name, and you can test for it. +This could be used to bind key sequences to functions useful for +a specific program. For instance, the following command adds a +key sequence that quotes the current or previous word in Bash: + +
    +$if Bash
    +# Quote the current or previous word
    +"\C-xq": "\eb\"\ef\""
    +$endif
    +
    + +
    + +
    $endif +
    +This command, as seen in the previous example, terminates an +$if command. + +
    $else +
    +Commands in this branch of the $if directive are executed if +the test fails. + +
    $include +
    +This directive takes a single filename as an argument and reads commands +and bindings from that file. + +
    +$include /etc/inputrc
    +
    + +
    + + + +

    Sample Init File

    + +

    +Here is an example of an inputrc file. This illustrates key +binding, variable assignment, and conditional syntax. + +

    + +
    +# This file controls the behaviour of line input editing for
    +# programs that use the Gnu Readline library.  Existing programs
    +# include FTP, Bash, and Gdb.
    +#
    +# You can re-read the inputrc file with C-x C-r.
    +# Lines beginning with '#' are comments.
    +#
    +# First, include any systemwide bindings and variable assignments from
    +# /etc/Inputrc
    +$include /etc/Inputrc
    +
    +#
    +# Set various bindings for emacs mode.
    +
    +set editing-mode emacs 
    +
    +$if mode=emacs
    +
    +Meta-Control-h:	backward-kill-word	Text after the function name is ignored
    +
    +#
    +# Arrow keys in keypad mode
    +#
    +#"\M-OD":        backward-char
    +#"\M-OC":        forward-char
    +#"\M-OA":        previous-history
    +#"\M-OB":        next-history
    +#
    +# Arrow keys in ANSI mode
    +#
    +"\M-[D":        backward-char
    +"\M-[C":        forward-char
    +"\M-[A":        previous-history
    +"\M-[B":        next-history
    +#
    +# Arrow keys in 8 bit keypad mode
    +#
    +#"\M-\C-OD":       backward-char
    +#"\M-\C-OC":       forward-char
    +#"\M-\C-OA":       previous-history
    +#"\M-\C-OB":       next-history
    +#
    +# Arrow keys in 8 bit ANSI mode
    +#
    +#"\M-\C-[D":       backward-char
    +#"\M-\C-[C":       forward-char
    +#"\M-\C-[A":       previous-history
    +#"\M-\C-[B":       next-history
    +
    +C-q: quoted-insert
    +
    +$endif
    +
    +# An old-style binding.  This happens to be the default.
    +TAB: complete
    +
    +# Macros that are convenient for shell interaction
    +$if Bash
    +# edit the path
    +"\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f"
    +# prepare to type a quoted word -- insert open and close double quotes
    +# and move to just after the open quote
    +"\C-x\"": "\"\"\C-b"
    +# insert a backslash (testing backslash escapes in sequences and macros)
    +"\C-x\\": "\\"
    +# Quote the current or previous word
    +"\C-xq": "\eb\"\ef\""
    +# Add a binding to refresh the line, which is unbound
    +"\C-xr": redraw-current-line
    +# Edit variable on current line.
    +"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y="
    +$endif
    +
    +# use a visible bell if one is available
    +set bell-style visible
    +
    +# don't strip characters to 7 bits when reading
    +set input-meta on
    +
    +# allow iso-latin1 characters to be inserted rather than converted to
    +# prefix-meta sequences
    +set convert-meta off
    +
    +# display characters with the eighth bit set directly rather than
    +# as meta-prefixed characters
    +set output-meta on
    +
    +# if there are more than 150 possible completions for a word, ask the
    +# user if he wants to see all of them
    +set completion-query-items 150
    +
    +# For FTP
    +$if Ftp
    +"\C-xg": "get \M-?"
    +"\C-xt": "put \M-?"
    +"\M-.": yank-last-arg
    +$endif
    +
    + + + +

    Bindable Readline Commands

    + +

    +This section describes Readline commands that may be bound to key +sequences. + +

    + + +

    Commands For Moving

    +
    + +
    beginning-of-line (C-a) +
    + +Move to the start of the current line. + +
    end-of-line (C-e) +
    + +Move to the end of the line. + +
    forward-char (C-f) +
    + +Move forward a character. + +
    backward-char (C-b) +
    + +Move back a character. + +
    forward-word (M-f) +
    + +Move forward to the end of the next word. Words are composed of +letters and digits. + +
    backward-word (M-b) +
    + +Move back to the start of this, or the previous, word. Words are +composed of letters and digits. + +
    clear-screen (C-l) +
    + +Clear the screen and redraw the current line, +leaving the current line at the top of the screen. + +
    redraw-current-line () +
    + +Refresh the current line. By default, this is unbound. + +
    + + + +

    Commands For Manipulating The History

    + +
    + +
    accept-line (Newline, Return) +
    + +Accept the line regardless of where the cursor is. If this line is +non-empty, add it to the history list. If this line was a history +line, then restore the history line to its original state. + +
    previous-history (C-p) +
    + +Move `up' through the history list. + +
    next-history (C-n) +
    + +Move `down' through the history list. + +
    beginning-of-history (M-<) +
    + +Move to the first line in the history. + +
    end-of-history (M->) +
    + +Move to the end of the input history, i.e., the line currently +being entered. + +
    reverse-search-history (C-r) +
    + +Search backward starting at the current line and moving `up' through +the history as necessary. This is an incremental search. + +
    forward-search-history (C-s) +
    + +Search forward starting at the current line and moving `down' through +the the history as necessary. This is an incremental search. + +
    non-incremental-reverse-search-history (M-p) +
    + +Search backward starting at the current line and moving `up' +through the history as necessary using a non-incremental search +for a string supplied by the user. + +
    non-incremental-forward-search-history (M-n) +
    + +Search forward starting at the current line and moving `down' +through the the history as necessary using a non-incremental search +for a string supplied by the user. + +
    history-search-forward () +
    + +Search forward through the history for the string of characters +between the start of the current line and the current cursor +position (the point). This is a non-incremental search. By +default, this command is unbound. + +
    history-search-backward () +
    + +Search backward through the history for the string of characters +between the start of the current line and the point. This +is a non-incremental search. By default, this command is unbound. + +
    yank-nth-arg (M-C-y) +
    + +Insert the first argument to the previous command (usually +the second word on the previous line). With an argument n, +insert the nth word from the previous command (the words +in the previous command begin with word 0). A negative argument +inserts the nth word from the end of the previous command. + +
    yank-last-arg (M-., M-_) +
    + +Insert last argument to the previous command (the last word of the +previous history entry). With an +argument, behave exactly like yank-nth-arg. +Successive calls to yank-last-arg move back through the history +list, inserting the last argument of each line in turn. + +
    + + + +

    Commands For Changing Text

    + +
    + +
    delete-char (C-d) +
    + +Delete the character under the cursor. If the cursor is at the +beginning of the line, there are no characters in the line, and +the last character typed was not bound to delete-char, then +return EOF. + +
    backward-delete-char (Rubout) +
    + +Delete the character behind the cursor. A numeric argument means +to kill the characters instead of deleting them. + +
    quoted-insert (C-q, C-v) +
    + +Add the next character typed to the line verbatim. This is +how to insert key sequences like C-q, for example. + +
    tab-insert (M-TAB) +
    + +Insert a tab character. + +
    self-insert (a, b, A, 1, !, ...) +
    + +Insert yourself. + +
    transpose-chars (C-t) +
    + +Drag the character before the cursor forward over +the character at the cursor, moving the +cursor forward as well. If the insertion point +is at the end of the line, then this +transposes the last two characters of the line. +Negative arguments don't work. + +
    transpose-words (M-t) +
    + +Drag the word behind the cursor past the word in front of the cursor +moving the cursor over that word as well. + +
    upcase-word (M-u) +
    + +Uppercase the current (or following) word. With a negative argument, +uppercase the previous word, but do not move the cursor. + +
    downcase-word (M-l) +
    + +Lowercase the current (or following) word. With a negative argument, +lowercase the previous word, but do not move the cursor. + +
    capitalize-word (M-c) +
    + +Capitalize the current (or following) word. With a negative argument, +capitalize the previous word, but do not move the cursor. + +
    + + + +

    Killing And Yanking

    + +
    + +
    kill-line (C-k) +
    + +Kill the text from the current cursor position to the end of the line. + +
    backward-kill-line (C-x Rubout) +
    + +Kill backward to the beginning of the line. + +
    unix-line-discard (C-u) +
    + +Kill backward from the cursor to the beginning of the current line. +The killed text is saved on the kill-ring. + +
    kill-whole-line () +
    + +Kill all characters on the current line, no matter where the +cursor is. By default, this is unbound. + +
    kill-word (M-d) +
    + +Kill from the cursor to the end of the current word, or if between +words, to the end of the next word. Word boundaries are the same +as forward-word. + +
    backward-kill-word (M-DEL) +
    + +Kill the word behind the cursor. Word boundaries are the same +as backward-word. + +
    unix-word-rubout (C-w) +
    + +Kill the word behind the cursor, using white space as a word +boundary. The killed text is saved on the kill-ring. + +
    delete-horizontal-space () +
    + +Delete all spaces and tabs around point. By default, this is unbound. + +
    kill-region () +
    + +Kill the text between the point and the mark (saved +cursor position). This text is referred to as the region. +By default, this command is unbound. + +
    copy-region-as-kill () +
    + +Copy the text in the region to the kill buffer, so it can be yanked +right away. By default, this command is unbound. + +
    copy-backward-word () +
    + +Copy the word before point to the kill buffer. +The word boundaries are the same as backward-word. +By default, this command is unbound. + +
    copy-forward-word () +
    + +Copy the word following point to the kill buffer. +The word boundaries are the same as forward-word. +By default, this command is unbound. + +
    yank (C-y) +
    + +Yank the top of the kill ring into the buffer at the current +cursor position. + +
    yank-pop (M-y) +
    + +Rotate the kill-ring, and yank the new top. You can only do this if +the prior command is yank or yank-pop. +
    + + + +

    Specifying Numeric Arguments

    +
    + +
    digit-argument (M-0, M-1, ... M--) +
    + +Add this digit to the argument already accumulating, or start a new +argument. M-- starts a negative argument. + +
    universal-argument () +
    + +This is another way to specify an argument. +If this command is followed by one or more digits, optionally with a +leading minus sign, those digits define the argument. +If the command is followed by digits, executing universal-argument +again ends the numeric argument, but is otherwise ignored. +As a special case, if this command is immediately followed by a +character that is neither a digit or minus sign, the argument count +for the next command is multiplied by four. +The argument count is initially one, so executing this function the +first time makes the argument count four, a second time makes the +argument count sixteen, and so on. +By default, this is not bound to a key. +
    + + + +

    Letting Readline Type For You

    + +
    + +
    complete (TAB) +
    + +Attempt to do completion on the text before the cursor. This is +application-specific. Generally, if you are typing a filename +argument, you can do filename completion; if you are typing a command, +you can do command completion; if you are typing in a symbol to GDB, you +can do symbol name completion; if you are typing in a variable to Bash, +you can do variable name completion, and so on. + +
    possible-completions (M-?) +
    + +List the possible completions of the text before the cursor. + +
    insert-completions (M-*) +
    + +Insert all completions of the text before point that would have +been generated by possible-completions. + +
    menu-complete () +
    + +Similar to complete, but replaces the word to be completed +with a single match from the list of possible completions. +Repeated execution of menu-complete steps through the list +of possible completions, inserting each match in turn. +At the end of the list of completions, the bell is rung and the +original text is restored. +An argument of n moves n positions forward in the list +of matches; a negative argument may be used to move backward +through the list. +This command is intended to be bound to TAB, but is unbound +by default. + +
    + + + +

    Keyboard Macros

    +
    + +
    start-kbd-macro (C-x () +
    + +Begin saving the characters typed into the current keyboard macro. + +
    end-kbd-macro (C-x )) +
    + +Stop saving the characters typed into the current keyboard macro +and save the definition. + +
    call-last-kbd-macro (C-x e) +
    + +Re-execute the last keyboard macro defined, by making the characters +in the macro appear as if typed at the keyboard. + +
    + + + +

    Some Miscellaneous Commands

    +
    + +
    re-read-init-file (C-x C-r) +
    + +Read in the contents of the inputrc file, and incorporate +any bindings or variable assignments found there. + +
    abort (C-g) +
    + +Abort the current editing command and +ring the terminal's bell (subject to the setting of +bell-style). + +
    do-uppercase-version (M-a, M-b, M-x, ...) +
    + +If the metafied character x is lowercase, run the command +that is bound to the corresponding uppercase character. + +
    prefix-meta (ESC) +
    + +Make the next character typed be metafied. This is for keyboards +without a meta key. Typing `ESC f' is equivalent to typing +`M-f'. + +
    undo (C-_, C-x C-u) +
    + +Incremental undo, separately remembered for each line. + +
    revert-line (M-r) +
    + +Undo all changes made to this line. This is like executing the undo +command enough times to get back to the beginning. + +
    tilde-expand (M-~) +
    + +Perform tilde expansion on the current word. + +
    set-mark (C-@) +
    + +Set the mark to the current point. If a +numeric argument is supplied, the mark is set to that position. + +
    exchange-point-and-mark (C-x C-x) +
    + +Swap the point with the mark. The current cursor position is set to +the saved position, and the old cursor position is saved as the mark. + +
    character-search (C-]) +
    + +A character is read and point is moved to the next occurrence of that +character. A negative count searches for previous occurrences. + +
    character-search-backward (M-C-]) +
    + +A character is read and point is moved to the previous occurrence +of that character. A negative count searches for subsequent +occurrences. + +
    insert-comment (M-#) +
    + +The value of the comment-begin +variable is inserted at the beginning of the current line, +and the line is accepted as if a newline had been typed. + +
    dump-functions () +
    + +Print all of the functions and their key bindings to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. + +
    dump-variables () +
    + +Print all of the settable variables and their values to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. + +
    dump-macros () +
    + +Print all of the Readline key sequences bound to macros and the +strings they ouput. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an inputrc file. This command is unbound by default. + +
    + + + +

    Readline vi Mode

    + +

    +While the Readline library does not have a full set of vi +editing functions, it does contain enough to allow simple editing +of the line. The Readline vi mode behaves as specified in +the POSIX 1003.2 standard. + +

    +

    +In order to switch interactively between emacs and vi +editing modes, use the command M-C-j (toggle-editing-mode). +The Readline default is emacs mode. + +

    +

    +When you enter a line in vi mode, you are already placed in +`insertion' mode, as if you had typed an `i'. Pressing ESC +switches you into `command' mode, where you can edit the text of the +line with the standard vi movement keys, move to previous +history lines with `k' and subsequent lines with `j', and +so forth. + +

    + + + +

    Programming with GNU Readline

    + +

    +This chapter describes the interface between the GNU Readline Library and +other programs. If you are a programmer, and you wish to include the +features found in GNU Readline +such as completion, line editing, and interactive history manipulation +in your own programs, this section is for you. + +

    + + + +

    Basic Behavior

    + +

    +Many programs provide a command line interface, such as mail, +ftp, and sh. For such programs, the default behaviour of +Readline is sufficient. This section describes how to use Readline in +the simplest way possible, perhaps to replace calls in your code to +gets() or fgets (). + +

    +

    + + +The function readline () prints a prompt and then reads and returns +a single line of text from the user. The line readline +returns is allocated with malloc (); you should free () +the line when you are done with it. The declaration for readline +in ANSI C is + +

    + +
    +char *readline (char *prompt);
    +
    + +

    +So, one might say + +

    +char *line = readline ("Enter a line: ");
    +
    + +

    +in order to read a line of text from the user. +The line returned has the final newline removed, so only the +text remains. + +

    +

    +If readline encounters an EOF while reading the line, and the +line is empty at that point, then (char *)NULL is returned. +Otherwise, the line is ended just as if a newline had been typed. + +

    +

    +If you want the user to be able to get at the line later, (with +C-p for example), you must call add_history () to save the +line away in a history list of such lines. + +

    + +
    +add_history (line);
    +
    + +

    +For full details on the GNU History Library, see the associated manual. + +

    +

    +It is preferable to avoid saving empty lines on the history list, since +users rarely have a burning need to reuse a blank line. Here is +a function which usefully replaces the standard gets () library +function, and has the advantage of no static buffer to overflow: + +

    + +
    +/* A static variable for holding the line. */
    +static char *line_read = (char *)NULL;
    +
    +/* Read a string, and return a pointer to it.  Returns NULL on EOF. */
    +char *
    +rl_gets ()
    +{
    +  /* If the buffer has already been allocated, return the memory
    +     to the free pool. */
    +  if (line_read)
    +    {
    +      free (line_read);
    +      line_read = (char *)NULL;
    +    }
    +
    +  /* Get a line from the user. */
    +  line_read = readline ("");
    +
    +  /* If the line has any text in it, save it on the history. */
    +  if (line_read && *line_read)
    +    add_history (line_read);
    +
    +  return (line_read);
    +}
    +
    + +

    +This function gives the user the default behaviour of TAB +completion: completion on file names. If you do not want Readline to +complete on filenames, you can change the binding of the TAB key +with rl_bind_key (). + +

    + +
    +int rl_bind_key (int key, int (*function)());
    +
    + +

    +rl_bind_key () takes two arguments: key is the character that +you want to bind, and function is the address of the function to +call when key is pressed. Binding TAB to rl_insert () +makes TAB insert itself. +rl_bind_key () returns non-zero if key is not a valid +ASCII character code (between 0 and 255). + +

    +

    +Thus, to disable the default TAB behavior, the following suffices: + +

    +rl_bind_key ('\t', rl_insert);
    +
    + +

    +This code should be executed once at the start of your program; you +might write a function called initialize_readline () which +performs this and other desired initializations, such as installing +custom completers (see section Custom Completers). + +

    + + +

    Custom Functions

    + +

    +Readline provides many functions for manipulating the text of +the line, but it isn't possible to anticipate the needs of all +programs. This section describes the various functions and variables +defined within the Readline library which allow a user program to add +customized functionality to Readline. + +

    + + + +

    The Function Type

    + +

    +For readabilty, we declare a new type of object, called +Function. A Function is a C function which +returns an int. The type declaration for Function is: + +

    +

    +typedef int Function (); + +

    +

    +The reason for declaring this new type is to make it easier to write +code describing pointers to C functions. Let us say we had a variable +called func which was a pointer to a function. Instead of the +classic C declaration + +

    +

    +int (*)()func; + +

    +

    +we may write + +

    +

    +Function *func; + +

    +

    +Similarly, there are + +

    + +
    +typedef void VFunction ();
    +typedef char *CPFunction (); and
    +typedef char **CPPFunction ();
    +
    + +

    +for functions returning no value, pointer to char, and +pointer to pointer to char, respectively. + +

    + + +

    Writing a New Function

    + +

    +In order to write new functions for Readline, you need to know the +calling conventions for keyboard-invoked functions, and the names of the +variables that describe the current state of the line read so far. + +

    +

    +The calling sequence for a command foo looks like + +

    + +
    +foo (int count, int key)
    +
    + +

    +where count is the numeric argument (or 1 if defaulted) and +key is the key that invoked this function. + +

    +

    +It is completely up to the function as to what should be done with the +numeric argument. Some functions use it as a repeat count, some +as a flag, and others to choose alternate behavior (refreshing the current +line as opposed to refreshing the screen, for example). Some choose to +ignore it. In general, if a +function uses the numeric argument as a repeat count, it should be able +to do something useful with both negative and positive arguments. +At the very least, it should be aware that it can be passed a +negative argument. + +

    + + +

    Readline Variables

    + +

    +These variables are available to function writers. + +

    +

    +

    +
    Variable: char * rl_line_buffer +
    +This is the line gathered so far. You are welcome to modify the +contents of the line, but see section Allowing Undoing. +
    + +

    +

    +

    +
    Variable: int rl_point +
    +The offset of the current cursor position in rl_line_buffer +(the point). +
    + +

    +

    +

    +
    Variable: int rl_end +
    +The number of characters present in rl_line_buffer. When +rl_point is at the end of the line, rl_point and +rl_end are equal. +
    + +

    +

    +

    +
    Variable: int rl_mark +
    +The mark (saved position) in the current line. If set, the mark +and point define a region. +
    + +

    +

    +

    +
    Variable: int rl_done +
    +Setting this to a non-zero value causes Readline to return the current +line immediately. +
    + +

    +

    +

    +
    Variable: int rl_pending_input +
    +Setting this to a value makes it the next keystroke read. This is a +way to stuff a single character into the input stream. +
    + +

    +

    +

    +
    Variable: char * rl_prompt +
    +The prompt Readline uses. This is set from the argument to +readline (), and should not be assigned to directly. +
    + +

    +

    +

    +
    Variable: char * rl_library_version +
    +The version number of this revision of the library. +
    + +

    +

    +

    +
    Variable: char * rl_terminal_name +
    +The terminal type, used for initialization. +
    + +

    +

    +

    +
    Variable: char * rl_readline_name +
    +This variable is set to a unique name by each application using Readline. +The value allows conditional parsing of the inputrc file +(see section Conditional Init Constructs). +
    + +

    +

    +

    +
    Variable: FILE * rl_instream +
    +The stdio stream from which Readline reads input. +
    + +

    +

    +

    +
    Variable: FILE * rl_outstream +
    +The stdio stream to which Readline performs output. +
    + +

    +

    +

    +
    Variable: Function * rl_startup_hook +
    +If non-zero, this is the address of a function to call just +before readline prints the first prompt. +
    + +

    +

    +

    +
    Variable: Function * rl_event_hook +
    +If non-zero, this is the address of a function to call periodically +when readline is waiting for terminal input. +
    + +

    +

    +

    +
    Variable: Function * rl_getc_function +
    +If non-zero, readline will call indirectly through this pointer +to get a character from the input stream. By default, it is set to +rl_getc, the default readline character input function +(see section Utility Functions). +
    + +

    +

    +

    +
    Variable: VFunction * rl_redisplay_function +
    +If non-zero, readline will call indirectly through this pointer +to update the display with the current contents of the editing buffer. +By default, it is set to rl_redisplay, the default readline +redisplay function (see section Redisplay). +
    + +

    +

    +

    +
    Variable: Keymap rl_executing_keymap +
    +This variable is set to the keymap (see section Selecting a Keymap) in which the +currently executing readline function was found. +
    + +

    +

    +

    +
    Variable: Keymap rl_binding_keymap +
    +This variable is set to the keymap (see section Selecting a Keymap) in which the +last key binding occurred. +
    + +

    + + +

    Readline Convenience Functions

    + + + +

    Naming a Function

    + +

    +The user can dynamically change the bindings of keys while using +Readline. This is done by representing the function with a descriptive +name. The user is able to type the descriptive name when referring to +the function. Thus, in an init file, one might find + +

    + +
    +Meta-Rubout:	backward-kill-word
    +
    + +

    +This binds the keystroke Meta-Rubout to the function +descriptively named backward-kill-word. You, as the +programmer, should bind the functions you write to descriptive names as +well. Readline provides a function for doing that: + +

    +

    +

    +
    Function: int rl_add_defun (char *name, Function *function, int key) +
    +Add name to the list of named functions. Make function be +the function that gets called. If key is not -1, then bind it to +function using rl_bind_key (). +
    + +

    +

    +Using this function alone is sufficient for most applications. It is +the recommended way to add a few functions to the default functions that +Readline has built in. If you need to do something other +than adding a function to Readline, you may need to use the +underlying functions described below. + +

    + + +

    Selecting a Keymap

    + +

    +Key bindings take place on a keymap. The keymap is the +association between the keys that the user types and the functions that +get run. You can make your own keymaps, copy existing keymaps, and tell +Readline which keymap to use. + +

    +

    +

    +
    Function: Keymap rl_make_bare_keymap () +
    +Returns a new, empty keymap. The space for the keymap is allocated with +malloc (); you should free () it when you are done. +
    + +

    +

    +

    +
    Function: Keymap rl_copy_keymap (Keymap map) +
    +Return a new keymap which is a copy of map. +
    + +

    +

    +

    +
    Function: Keymap rl_make_keymap () +
    +Return a new keymap with the printing characters bound to rl_insert, +the lowercase Meta characters bound to run their equivalents, and +the Meta digits bound to produce numeric arguments. +
    + +

    +

    +

    +
    Function: void rl_discard_keymap (Keymap keymap) +
    +Free the storage associated with keymap. +
    + +

    +

    +Readline has several internal keymaps. These functions allow you to +change which keymap is active. + +

    +

    +

    +
    Function: Keymap rl_get_keymap () +
    +Returns the currently active keymap. +
    + +

    +

    +

    +
    Function: void rl_set_keymap (Keymap keymap) +
    +Makes keymap the currently active keymap. +
    + +

    +

    +

    +
    Function: Keymap rl_get_keymap_by_name (char *name) +
    +Return the keymap matching name. name is one which would +be supplied in a set keymap inputrc line (@xref{Readline Init File}). +
    + +

    +

    +

    +
    Function: char * rl_get_keymap_name (Keymap keymap) +
    +Return the name matching keymap. name is one which would +be supplied in a set keymap inputrc line (@xref{Readline Init File}). +
    + +

    + + +

    Binding Keys

    + +

    +You associate keys with functions through the keymap. Readline has +several internal keymaps: emacs_standard_keymap, +emacs_meta_keymap, emacs_ctlx_keymap, +vi_movement_keymap, and vi_insertion_keymap. +emacs_standard_keymap is the default, and the examples in +this manual assume that. + +

    +

    +These functions manage key bindings. + +

    +

    +

    +
    Function: int rl_bind_key (int key, Function *function) +
    +Binds key to function in the currently active keymap. +Returns non-zero in the case of an invalid key. +
    + +

    +

    +

    +
    Function: int rl_bind_key_in_map (int key, Function *function, Keymap map) +
    +Bind key to function in map. Returns non-zero in the case +of an invalid key. +
    + +

    +

    +

    +
    Function: int rl_unbind_key (int key) +
    +Bind key to the null function in the currently active keymap. +Returns non-zero in case of error. +
    + +

    +

    +

    +
    Function: int rl_unbind_key_in_map (int key, Keymap map) +
    +Bind key to the null function in map. +Returns non-zero in case of error. +
    + +

    +

    +

    +
    Function: int rl_unbind_function_in_map (Function *function, Keymap map) +
    +Unbind all keys that execute function in map. +
    + +

    +

    +

    +
    Function: int rl_unbind_command_in_map (char *command, Keymap map) +
    +Unbind all keys that are bound to command in map. +
    + +

    +

    +

    +
    Function: int rl_generic_bind (int type, char *keyseq, char *data, Keymap map) +
    +Bind the key sequence represented by the string keyseq to the arbitrary +pointer data. type says what kind of data is pointed to by +data; this can be a function (ISFUNC), a macro +(ISMACR), or a keymap (ISKMAP). This makes new keymaps as +necessary. The initial keymap in which to do bindings is map. +
    + +

    +

    +

    +
    Function: int rl_parse_and_bind (char *line) +
    +Parse line as if it had been read from the inputrc file and +perform any key bindings and variable assignments found +(@xref{Readline Init File}). +
    + +

    +

    +

    +
    Function: int rl_read_init_file (char *filename) +
    +Read keybindings and variable assignments from filename +(@xref{Readline Init File}). +
    + +

    + + +

    Associating Function Names and Bindings

    + +

    +These functions allow you to find out what keys invoke named functions +and the functions invoked by a particular key sequence. + +

    +

    +

    +
    Function: Function * rl_named_function (char *name) +
    +Return the function with name name. +
    + +

    +

    +

    +
    Function: Function * rl_function_of_keyseq (char *keyseq, Keymap map, int *type) +
    +Return the function invoked by keyseq in keymap map. +If map is NULL, the current keymap is used. If type is +not NULL, the type of the object is returned in it (one of ISFUNC, +ISKMAP, or ISMACR). +
    + +

    +

    +

    +
    Function: char ** rl_invoking_keyseqs (Function *function) +
    +Return an array of strings representing the key sequences used to +invoke function in the current keymap. +
    + +

    +

    +

    +
    Function: char ** rl_invoking_keyseqs_in_map (Function *function, Keymap map) +
    +Return an array of strings representing the key sequences used to +invoke function in the keymap map. +
    + +

    +

    +

    +
    Function: void rl_function_dumper (int readable) +
    +Print the readline function names and the key sequences currently +bound to them to rl_outstream. If readable is non-zero, +the list is formatted in such a way that it can be made part of an +inputrc file and re-read. +
    + +

    +

    +

    +
    Function: void rl_list_funmap_names () +
    +Print the names of all bindable Readline functions to rl_outstream. +
    + +

    + + +

    Allowing Undoing

    + +

    +Supporting the undo command is a painless thing, and makes your +functions much more useful. It is certainly easy to try +something if you know you can undo it. I could use an undo function for +the stock market. + +

    +

    +If your function simply inserts text once, or deletes text once, and +uses rl_insert_text () or rl_delete_text () to do it, then +undoing is already done for you automatically. + +

    +

    +If you do multiple insertions or multiple deletions, or any combination +of these operations, you should group them together into one operation. +This is done with rl_begin_undo_group () and +rl_end_undo_group (). + +

    +

    +The types of events that can be undone are: + +

    + +
    +enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; 
    +
    + +

    +Notice that UNDO_DELETE means to insert some text, and +UNDO_INSERT means to delete some text. That is, the undo code +tells undo what to undo, not how to undo it. UNDO_BEGIN and +UNDO_END are tags added by rl_begin_undo_group () and +rl_end_undo_group (). + +

    +

    +

    +
    Function: int rl_begin_undo_group () +
    +Begins saving undo information in a group construct. The undo +information usually comes from calls to rl_insert_text () and +rl_delete_text (), but could be the result of calls to +rl_add_undo (). +
    + +

    +

    +

    +
    Function: int rl_end_undo_group () +
    +Closes the current undo group started with rl_begin_undo_group +(). There should be one call to rl_end_undo_group () +for each call to rl_begin_undo_group (). +
    + +

    +

    +

    +
    Function: void rl_add_undo (enum undo_code what, int start, int end, char *text) +
    +Remember how to undo an event (according to what). The affected +text runs from start to end, and encompasses text. +
    + +

    +

    +

    +
    Function: void free_undo_list () +
    +Free the existing undo list. +
    + +

    +

    +

    +
    Function: int rl_do_undo () +
    +Undo the first thing on the undo list. Returns 0 if there was +nothing to undo, non-zero if something was undone. +
    + +

    +

    +Finally, if you neither insert nor delete text, but directly modify the +existing text (e.g., change its case), call rl_modifying () +once, just before you modify the text. You must supply the indices of +the text range that you are going to modify. + +

    +

    +

    +
    Function: int rl_modifying (int start, int end) +
    +Tell Readline to save the text between start and end as a +single undo unit. It is assumed that you will subsequently modify +that text. +
    + +

    + + +

    Redisplay

    + +

    +

    +
    Function: void rl_redisplay () +
    +Change what's displayed on the screen to reflect the current contents +of rl_line_buffer. +
    + +

    +

    +

    +
    Function: int rl_forced_update_display () +
    +Force the line to be updated and redisplayed, whether or not +Readline thinks the screen display is correct. +
    + +

    +

    +

    +
    Function: int rl_on_new_line () +
    +Tell the update routines that we have moved onto a new (empty) line, +usually after ouputting a newline. +
    + +

    +

    +

    +
    Function: int rl_reset_line_state () +
    +Reset the display state to a clean state and redisplay the current line +starting on a new line. +
    + +

    +

    +

    +
    Function: int rl_message (va_alist) +
    +The arguments are a string as would be supplied to printf. The +resulting string is displayed in the echo area. The echo area +is also used to display numeric arguments and search strings. +
    + +

    +

    +

    +
    Function: int rl_clear_message () +
    +Clear the message in the echo area. +
    + +

    + + +

    Modifying Text

    + +

    +

    +
    Function: int rl_insert_text (char *text) +
    +Insert text into the line at the current cursor position. +
    + +

    +

    +

    +
    Function: int rl_delete_text (int start, int end) +
    +Delete the text between start and end in the current line. +
    + +

    +

    +

    +
    Function: char * rl_copy_text (int start, int end) +
    +Return a copy of the text between start and end in +the current line. +
    + +

    +

    +

    +
    Function: int rl_kill_text (int start, int end) +
    +Copy the text between start and end in the current line +to the kill ring, appending or prepending to the last kill if the +last command was a kill command. The text is deleted. +If start is less than end, +the text is appended, otherwise prepended. If the last command was +not a kill, a new kill ring slot is used. +
    + +

    + + +

    Utility Functions

    + +

    +

    +
    Function: int rl_read_key () +
    +Return the next character available. This handles input inserted into +the input stream via pending input (see section Readline Variables) +and rl_stuff_char (), macros, and characters read from the keyboard. +
    + +

    +

    +

    +
    Function: int rl_getc (FILE *) +
    +Return the next character available from the keyboard. +
    + +

    +

    +

    +
    Function: int rl_stuff_char (int c) +
    +Insert c into the Readline input stream. It will be "read" +before Readline attempts to read characters from the terminal with +rl_read_key (). +
    + +

    +

    +

    +
    Function: rl_extend_line_buffer (int len) +
    +Ensure that rl_line_buffer has enough space to hold len +characters, possibly reallocating it if necessary. +
    + +

    +

    +

    +
    Function: int rl_initialize () +
    +Initialize or re-initialize Readline's internal state. +
    + +

    +

    +

    +
    Function: int rl_reset_terminal (char *terminal_name) +
    +Reinitialize Readline's idea of the terminal settings using +terminal_name as the terminal type (e.g., vt100). +
    + +

    +

    +

    +
    Function: int alphabetic (int c) +
    +Return 1 if c is an alphabetic character. +
    + +

    +

    +

    +
    Function: int numeric (int c) +
    +Return 1 if c is a numeric character. +
    + +

    +

    +

    +
    Function: int ding () +
    +Ring the terminal bell, obeying the setting of bell-style. +
    + +

    +

    +The following are implemented as macros, defined in chartypes.h. + +

    +

    +

    +
    Function: int uppercase_p (int c) +
    +Return 1 if c is an uppercase alphabetic character. +
    + +

    +

    +

    +
    Function: int lowercase_p (int c) +
    +Return 1 if c is a lowercase alphabetic character. +
    + +

    +

    +

    +
    Function: int digit_p (int c) +
    +Return 1 if c is a numeric character. +
    + +

    +

    +

    +
    Function: int to_upper (int c) +
    +If c is a lowercase alphabetic character, return the corresponding +uppercase character. +
    + +

    +

    +

    +
    Function: int to_lower (int c) +
    +If c is an uppercase alphabetic character, return the corresponding +lowercase character. +
    + +

    +

    +

    +
    Function: int digit_value (int c) +
    +If c is a number, return the value it represents. +
    + +

    + + +

    Alternate Interface

    + +

    +An alternate interface is available to plain readline(). Some +applications need to interleave keyboard I/O with file, device, or +window system I/O, typically by using a main loop to select() +on various file descriptors. To accomodate this need, readline can +also be invoked as a `callback' function from an event loop. There +are functions available to make this easy. + +

    +

    +

    +
    Function: void rl_callback_handler_install (char *prompt, Vfunction *lhandler) +
    +Set up the terminal for readline I/O and display the initial +expanded value of prompt. Save the value of lhandler to +use as a callback when a complete line of input has been entered. +
    + +

    +

    +

    +
    Function: void rl_callback_read_char () +
    +Whenever an application determines that keyboard input is available, it +should call rl_callback_read_char(), which will read the next +character from the current input source. If that character completes the +line, rl_callback_read_char will invoke the lhandler +function saved by rl_callback_handler_install to process the +line. EOF is indicated by calling lhandler with a +NULL line. +
    + +

    +

    +

    +
    Function: void rl_callback_handler_remove () +
    +Restore the terminal to its initial state and remove the line handler. +This may be called from within a callback as well as independently. +
    + +

    + + +

    An Example

    + +

    +Here is a function which changes lowercase characters to their uppercase +equivalents, and uppercase characters to lowercase. If +this function was bound to `M-c', then typing `M-c' would +change the case of the character under point. Typing `M-1 0 M-c' +would change the case of the following 10 characters, leaving the cursor on +the last character changed. + +

    + +
    +/* Invert the case of the COUNT following characters. */
    +int
    +invert_case_line (count, key)
    +     int count, key;
    +{
    +  register int start, end, i;
    +
    +  start = rl_point;
    +
    +  if (rl_point >= rl_end)
    +    return (0);
    +
    +  if (count < 0)
    +    {
    +      direction = -1;
    +      count = -count;
    +    }
    +  else
    +    direction = 1;
    +      
    +  /* Find the end of the range to modify. */
    +  end = start + (count * direction);
    +
    +  /* Force it to be within range. */
    +  if (end > rl_end)
    +    end = rl_end;
    +  else if (end < 0)
    +    end = 0;
    +
    +  if (start == end)
    +    return (0);
    +
    +  if (start > end)
    +    {
    +      int temp = start;
    +      start = end;
    +      end = temp;
    +    }
    +
    +  /* Tell readline that we are modifying the line, so it will save
    +     the undo information. */
    +  rl_modifying (start, end);
    +
    +  for (i = start; i != end; i++)
    +    {
    +      if (uppercase_p (rl_line_buffer[i]))
    +        rl_line_buffer[i] = to_lower (rl_line_buffer[i]);
    +      else if (lowercase_p (rl_line_buffer[i]))
    +        rl_line_buffer[i] = to_upper (rl_line_buffer[i]);
    +    }
    +  /* Move point to on top of the last character changed. */
    +  rl_point = (direction == 1) ? end - 1 : start;
    +  return (0);
    +}
    +
    + + + +

    Custom Completers

    + +

    +Typically, a program that reads commands from the user has a way of +disambiguating commands and data. If your program is one of these, then +it can provide completion for commands, data, or both. +The following sections describe how your program and Readline +cooperate to provide this service. + +

    + + + +

    How Completing Works

    + +

    +In order to complete some text, the full list of possible completions +must be available. That is, it is not possible to accurately +expand a partial word without knowing all of the possible words +which make sense in that context. The Readline library provides +the user interface to completion, and two of the most common +completion functions: filename and username. For completing other types +of text, you must write your own completion function. This section +describes exactly what such functions must do, and provides an example. + +

    +

    +There are three major functions used to perform completion: + +

    + +
      +
    1. + +The user-interface function rl_complete (). This function is +called with the same arguments as other Readline +functions intended for interactive use: count and +invoking_key. It isolates the word to be completed and calls +completion_matches () to generate a list of possible completions. +It then either lists the possible completions, inserts the possible +completions, or actually performs the +completion, depending on which behavior is desired. + +
    2. + +The internal function completion_matches () uses your +generator function to generate the list of possible matches, and +then returns the array of these matches. You should place the address +of your generator function in rl_completion_entry_function. + +
    3. + +The generator function is called repeatedly from +completion_matches (), returning a string each time. The +arguments to the generator function are text and state. +text is the partial word to be completed. state is zero the +first time the function is called, allowing the generator to perform +any necessary initialization, and a positive non-zero integer for +each subsequent call. When the generator function returns +(char *)NULL this signals completion_matches () that there are +no more possibilities left. Usually the generator function computes the +list of possible completions when state is zero, and returns them +one at a time on subsequent calls. Each string the generator function +returns as a match must be allocated with malloc(); Readline +frees the strings when it has finished with them. + +
    + +

    +

    +
    Function: int rl_complete (int ignore, int invoking_key) +
    +Complete the word at or before point. You have supplied the function +that does the initial simple matching selection algorithm (see +completion_matches ()). The default is to do filename completion. +
    + +

    +

    +

    +
    Variable: Function * rl_completion_entry_function +
    +This is a pointer to the generator function for completion_matches +(). If the value of rl_completion_entry_function is +(Function *)NULL then the default filename generator function, +filename_completion_function (), is used. +
    + +

    + + +

    Completion Functions

    + +

    +Here is the complete list of callable completion functions present in +Readline. + +

    +

    +

    +
    Function: int rl_complete_internal (int what_to_do) +
    +Complete the word at or before point. what_to_do says what to do +with the completion. A value of `?' means list the possible +completions. `TAB' means do standard completion. `*' means +insert all of the possible completions. `!' means to display +all of the possible completions, if there is more than one, as well as +performing partial completion. +
    + +

    +

    +

    +
    Function: int rl_complete (int ignore, int invoking_key) +
    +Complete the word at or before point. You have supplied the function +that does the initial simple matching selection algorithm (see +completion_matches () and rl_completion_entry_function). +The default is to do filename +completion. This calls rl_complete_internal () with an +argument depending on invoking_key. +
    + +

    +

    +

    +
    Function: int rl_possible_completions (int count, int invoking_key)) +
    +List the possible completions. See description of rl_complete +(). This calls rl_complete_internal () with an argument of +`?'. +
    + +

    +

    +

    +
    Function: int rl_insert_completions (int count, int invoking_key)) +
    +Insert the list of possible completions into the line, deleting the +partially-completed word. See description of rl_complete (). +This calls rl_complete_internal () with an argument of `*'. +
    + +

    +

    +

    +
    Function: char ** completion_matches (char *text, CPFunction *entry_func) +
    +Returns an array of (char *) which is a list of completions for +text. If there are no completions, returns (char **)NULL. +The first entry in the returned array is the substitution for text. +The remaining entries are the possible completions. The array is +terminated with a NULL pointer. + +

    +

    +entry_func is a function of two args, and returns a +(char *). The first argument is text. The second is a +state argument; it is zero on the first call, and non-zero on subsequent +calls. entry_func returns a NULL pointer to the caller +when there are no more matches. +

    + +

    +

    +

    +
    Function: char * filename_completion_function (char *text, int state) +
    +A generator function for filename completion in the general case. Note +that completion in Bash is a little different because of all +the pathnames that must be followed when looking up completions for a +command. The Bash source is a useful reference for writing custom +completion functions. +
    + +

    +

    +

    +
    Function: char * username_completion_function (char *text, int state) +
    +A completion generator for usernames. text contains a partial +username preceded by a random character (usually `~'). As with all +completion generators, state is zero on the first call and non-zero +for subsequent calls. +
    + +

    + + +

    Completion Variables

    + +

    +

    +
    Variable: Function * rl_completion_entry_function +
    +A pointer to the generator function for completion_matches (). +NULL means to use filename_entry_function (), the default +filename completer. +
    + +

    +

    +

    +
    Variable: CPPFunction * rl_attempted_completion_function +
    +A pointer to an alternative function to create matches. +The function is called with text, start, and end. +start and end are indices in rl_line_buffer saying +what the boundaries of text are. If this function exists and +returns NULL, or if this variable is set to NULL, then +rl_complete () will call the value of +rl_completion_entry_function to generate matches, otherwise the +array of strings returned will be used. +
    + +

    +

    +

    +
    Variable: CPFunction * rl_filename_quoting_function +
    +A pointer to a function that will quote a filename in an application- +specific fashion. This is called if filename completion is being +attempted and one of the characters in rl_filename_quote_characters +appears in a completed filename. The function is called with +text, match_type, and quote_pointer. The text +is the filename to be quoted. The match_type is either +SINGLE_MATCH, if there is only one completion match, or +MULT_MATCH. Some functions use this to decide whether or not to +insert a closing quote character. The quote_pointer is a pointer +to any opening quote character the user typed. Some functions choose +to reset this character. +
    + +

    +

    +

    +
    Variable: CPFunction * rl_filename_dequoting_function +
    +A pointer to a function that will remove application-specific quoting +characters from a filename before completion is attempted, so those +characters do not interfere with matching the text against names in +the filesystem. It is called with text, the text of the word +to be dequoted, and quote_char, which is the quoting character +that delimits the filename (usually `'' or `"'). If +quote_char is zero, the filename was not in an embedded string. +
    + +

    +

    +

    +
    Variable: Function * rl_char_is_quoted_p +
    +A pointer to a function to call that determines whether or not a specific +character in the line buffer is quoted, according to whatever quoting +mechanism the program calling readline uses. The function is called with +two arguments: text, the text of the line, and index, the +index of the character in the line. It is used to decide whether a +character found in rl_completer_word_break_characters should be +used to break words for the completer. +
    + +

    +

    +

    +
    Variable: int rl_completion_query_items +
    +Up to this many items will be displayed in response to a +possible-completions call. After that, we ask the user if she is sure +she wants to see them all. The default value is 100. +
    + +

    +

    +

    +
    Variable: char * rl_basic_word_break_characters +
    +The basic list of characters that signal a break between words for the +completer routine. The default value of this variable is the characters +which break words for completion in Bash, i.e., +" \t\n\"\\'`@$><=;|&{(". +
    + +

    +

    +

    +
    Variable: char * rl_basic_quote_characters +
    +List of quote characters which can cause a word break. +
    + +

    +

    +

    +
    Variable: char * rl_completer_word_break_characters +
    +The list of characters that signal a break between words for +rl_complete_internal (). The default list is the value of +rl_basic_word_break_characters. +
    + +

    +

    +

    +
    Variable: char * rl_completer_quote_characters +
    +List of characters which can be used to quote a substring of the line. +Completion occurs on the entire substring, and within the substring +rl_completer_word_break_characters are treated as any other character, +unless they also appear within this list. +
    + +

    +

    +

    +
    Variable: char * rl_filename_quote_characters +
    +A list of characters that cause a filename to be quoted by the completer +when they appear in a completed filename. The default is the null string. +
    + +

    +

    +

    +
    Variable: char * rl_special_prefixes +
    +The list of characters that are word break characters, but should be +left in text when it is passed to the completion function. +Programs can use this to help determine what kind of completing to do. +For instance, Bash sets this variable to "$@" so that it can complete +shell variables and hostnames. +
    + +

    +

    +

    +
    Variable: int rl_completion_append_character +
    +When a single completion alternative matches at the end of the command +line, this character is appended to the inserted completion text. The +default is a space character (` '). Setting this to the null +character (`\0') prevents anything being appended automatically. +This can be changed in custom completion functions to +provide the "most sensible word separator character" according to +an application-specific command line syntax specification. +
    + +

    +

    +

    +
    Variable: int rl_ignore_completion_duplicates +
    +If non-zero, then disallow duplicates in the matches. Default is 1. +
    + +

    +

    +

    +
    Variable: int rl_filename_completion_desired +
    +Non-zero means that the results of the matches are to be treated as +filenames. This is always zero on entry, and can only be changed +within a completion entry generator function. If it is set to a non-zero +value, directory names have a slash appended and Readline attempts to +quote completed filenames if they contain any embedded word break +characters. +
    + +

    +

    +

    +
    Variable: int rl_filename_quoting_desired +
    +Non-zero means that the results of the matches are to be quoted using +double quotes (or an application-specific quoting mechanism) if the +completed filename contains any characters in +rl_filename_quote_chars. This is always non-zero +on entry, and can only be changed within a completion entry generator +function. The quoting is effected via a call to the function pointed to +by rl_filename_quoting_function. +
    + +

    +

    +

    +
    Variable: int rl_inhibit_completion +
    +If this variable is non-zero, completion is inhibit<ed. The completion +character will be inserted as any other bound to self-insert. +
    + +

    +

    +

    +
    Variable: Function * rl_ignore_some_completions_function +
    +This function, if defined, is called by the completer when real filename +completion is done, after all the matching names have been generated. +It is passed a NULL terminated array of matches. +The first element (matches[0]) is the +maximal substring common to all matches. This function can +re-arrange the list of matches as required, but each element deleted +from the array must be freed. +
    + +

    +

    +

    +
    Variable: Function * rl_directory_completion_hook +
    +This function, if defined, is allowed to modify the directory portion +of filenames Readline completes. It is called with the address of a +string (the current directory name) as an argument. It could be used +to expand symbolic links or shell variables in pathnames. +
    + +

    + + +

    A Short Completion Example

    + +

    +Here is a small application demonstrating the use of the GNU Readline +library. It is called fileman, and the source code resides in +`examples/fileman.c'. This sample application provides +completion of command names, line editing features, and access to the +history list. + +

    + +
    +/* fileman.c -- A tiny application which demonstrates how to use the
    +   GNU Readline library.  This application interactively allows users
    +   to manipulate files and their modes. */
    +
    +#include <stdio.h>
    +#include <sys/types.h>
    +#include <sys/file.h>
    +#include <sys/stat.h>
    +#include <sys/errno.h>
    +
    +#include <readline/readline.h>
    +#include <readline/history.h>
    +
    +extern char *getwd ();
    +extern char *xmalloc ();
    +
    +/* The names of functions that actually do the manipulation. */
    +int com_list (), com_view (), com_rename (), com_stat (), com_pwd ();
    +int com_delete (), com_help (), com_cd (), com_quit ();
    +
    +/* A structure which contains information on the commands this program
    +   can understand. */
    +
    +typedef struct {
    +  char *name;			/* User printable name of the function. */
    +  Function *func;		/* Function to call to do the job. */
    +  char *doc;			/* Documentation for this function.  */
    +} COMMAND;
    +
    +COMMAND commands[] = {
    +  { "cd", com_cd, "Change to directory DIR" },
    +  { "delete", com_delete, "Delete FILE" },
    +  { "help", com_help, "Display this text" },
    +  { "?", com_help, "Synonym for `help'" },
    +  { "list", com_list, "List files in DIR" },
    +  { "ls", com_list, "Synonym for `list'" },
    +  { "pwd", com_pwd, "Print the current working directory" },
    +  { "quit", com_quit, "Quit using Fileman" },
    +  { "rename", com_rename, "Rename FILE to NEWNAME" },
    +  { "stat", com_stat, "Print out statistics on FILE" },
    +  { "view", com_view, "View the contents of FILE" },
    +  { (char *)NULL, (Function *)NULL, (char *)NULL }
    +};
    +
    +/* Forward declarations. */
    +char *stripwhite ();
    +COMMAND *find_command ();
    +
    +/* The name of this program, as taken from argv[0]. */
    +char *progname;
    +
    +/* When non-zero, this global means the user is done using this program. */
    +int done;
    +
    +char *
    +dupstr (s)
    +     int s;
    +{
    +  char *r;
    +
    +  r = xmalloc (strlen (s) + 1);
    +  strcpy (r, s);
    +  return (r);
    +}
    +
    +main (argc, argv)
    +     int argc;
    +     char **argv;
    +{
    +  char *line, *s;
    +
    +  progname = argv[0];
    +
    +  initialize_readline ();	/* Bind our completer. */
    +
    +  /* Loop reading and executing lines until the user quits. */
    +  for ( ; done == 0; )
    +    {
    +      line = readline ("FileMan: ");
    +
    +      if (!line)
    +        break;
    +
    +      /* Remove leading and trailing whitespace from the line.
    +         Then, if there is anything left, add it to the history list
    +         and execute it. */
    +      s = stripwhite (line);
    +
    +      if (*s)
    +        {
    +          add_history (s);
    +          execute_line (s);
    +        }
    +
    +      free (line);
    +    }
    +  exit (0);
    +}
    +
    +/* Execute a command line. */
    +int
    +execute_line (line)
    +     char *line;
    +{
    +  register int i;
    +  COMMAND *command;
    +  char *word;
    +
    +  /* Isolate the command word. */
    +  i = 0;
    +  while (line[i] && whitespace (line[i]))
    +    i++;
    +  word = line + i;
    +
    +  while (line[i] && !whitespace (line[i]))
    +    i++;
    +
    +  if (line[i])
    +    line[i++] = '\0';
    +
    +  command = find_command (word);
    +
    +  if (!command)
    +    {
    +      fprintf (stderr, "%s: No such command for FileMan.\n", word);
    +      return (-1);
    +    }
    +
    +  /* Get argument to command, if any. */
    +  while (whitespace (line[i]))
    +    i++;
    +
    +  word = line + i;
    +
    +  /* Call the function. */
    +  return ((*(command->func)) (word));
    +}
    +
    +/* Look up NAME as the name of a command, and return a pointer to that
    +   command.  Return a NULL pointer if NAME isn't a command name. */
    +COMMAND *
    +find_command (name)
    +     char *name;
    +{
    +  register int i;
    +
    +  for (i = 0; commands[i].name; i++)
    +    if (strcmp (name, commands[i].name) == 0)
    +      return (&commands[i]);
    +
    +  return ((COMMAND *)NULL);
    +}
    +
    +/* Strip whitespace from the start and end of STRING.  Return a pointer
    +   into STRING. */
    +char *
    +stripwhite (string)
    +     char *string;
    +{
    +  register char *s, *t;
    +
    +  for (s = string; whitespace (*s); s++)
    +    ;
    +    
    +  if (*s == 0)
    +    return (s);
    +
    +  t = s + strlen (s) - 1;
    +  while (t > s && whitespace (*t))
    +    t--;
    +  *++t = '\0';
    +
    +  return s;
    +}
    +
    +/* **************************************************************** */
    +/*                                                                  */
    +/*                  Interface to Readline Completion                */
    +/*                                                                  */
    +/* **************************************************************** */
    +
    +char *command_generator ();
    +char **fileman_completion ();
    +
    +/* Tell the GNU Readline library how to complete.  We want to try to complete
    +   on command names if this is the first word in the line, or on filenames
    +   if not. */
    +initialize_readline ()
    +{
    +  /* Allow conditional parsing of the ~/.inputrc file. */
    +  rl_readline_name = "FileMan";
    +
    +  /* Tell the completer that we want a crack first. */
    +  rl_attempted_completion_function = (CPPFunction *)fileman_completion;
    +}
    +
    +/* Attempt to complete on the contents of TEXT.  START and END bound the
    +   region of rl_line_buffer that contains the word to complete.  TEXT is
    +   the word to complete.  We can use the entire contents of rl_line_buffer
    +   in case we want to do some simple parsing.  Return the array of matches,
    +   or NULL if there aren't any. */
    +char **
    +fileman_completion (text, start, end)
    +     char *text;
    +     int start, end;
    +{
    +  char **matches;
    +
    +  matches = (char **)NULL;
    +
    +  /* If this word is at the start of the line, then it is a command
    +     to complete.  Otherwise it is the name of a file in the current
    +     directory. */
    +  if (start == 0)
    +    matches = completion_matches (text, command_generator);
    +
    +  return (matches);
    +}
    +
    +/* Generator function for command completion.  STATE lets us know whether
    +   to start from scratch; without any state (i.e. STATE == 0), then we
    +   start at the top of the list. */
    +char *
    +command_generator (text, state)
    +     char *text;
    +     int state;
    +{
    +  static int list_index, len;
    +  char *name;
    +
    +  /* If this is a new word to complete, initialize now.  This includes
    +     saving the length of TEXT for efficiency, and initializing the index
    +     variable to 0. */
    +  if (!state)
    +    {
    +      list_index = 0;
    +      len = strlen (text);
    +    }
    +
    +  /* Return the next name which partially matches from the command list. */
    +  while (name = commands[list_index].name)
    +    {
    +      list_index++;
    +
    +      if (strncmp (name, text, len) == 0)
    +        return (dupstr(name));
    +    }
    +
    +  /* If no names matched, then return NULL. */
    +  return ((char *)NULL);
    +}
    +
    +/* **************************************************************** */
    +/*                                                                  */
    +/*                       FileMan Commands                           */
    +/*                                                                  */
    +/* **************************************************************** */
    +
    +/* String to pass to system ().  This is for the LIST, VIEW and RENAME
    +   commands. */
    +static char syscom[1024];
    +
    +/* List the file(s) named in arg. */
    +com_list (arg)
    +     char *arg;
    +{
    +  if (!arg)
    +    arg = "";
    +
    +  sprintf (syscom, "ls -FClg %s", arg);
    +  return (system (syscom));
    +}
    +
    +com_view (arg)
    +     char *arg;
    +{
    +  if (!valid_argument ("view", arg))
    +    return 1;
    +
    +  sprintf (syscom, "more %s", arg);
    +  return (system (syscom));
    +}
    +
    +com_rename (arg)
    +     char *arg;
    +{
    +  too_dangerous ("rename");
    +  return (1);
    +}
    +
    +com_stat (arg)
    +     char *arg;
    +{
    +  struct stat finfo;
    +
    +  if (!valid_argument ("stat", arg))
    +    return (1);
    +
    +  if (stat (arg, &finfo) == -1)
    +    {
    +      perror (arg);
    +      return (1);
    +    }
    +
    +  printf ("Statistics for `%s':\n", arg);
    +
    +  printf ("%s has %d link%s, and is %d byte%s in length.\n", arg,
    +          finfo.st_nlink,
    +          (finfo.st_nlink == 1) ? "" : "s",
    +          finfo.st_size,
    +          (finfo.st_size == 1) ? "" : "s");
    +  printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime));
    +  printf ("      Last access at: %s", ctime (&finfo.st_atime));
    +  printf ("    Last modified at: %s", ctime (&finfo.st_mtime));
    +  return (0);
    +}
    +
    +com_delete (arg)
    +     char *arg;
    +{
    +  too_dangerous ("delete");
    +  return (1);
    +}
    +
    +/* Print out help for ARG, or for all of the commands if ARG is
    +   not present. */
    +com_help (arg)
    +     char *arg;
    +{
    +  register int i;
    +  int printed = 0;
    +
    +  for (i = 0; commands[i].name; i++)
    +    {
    +      if (!*arg || (strcmp (arg, commands[i].name) == 0))
    +        {
    +          printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
    +          printed++;
    +        }
    +    }
    +
    +  if (!printed)
    +    {
    +      printf ("No commands match `%s'.  Possibilties are:\n", arg);
    +
    +      for (i = 0; commands[i].name; i++)
    +        {
    +          /* Print in six columns. */
    +          if (printed == 6)
    +            {
    +              printed = 0;
    +              printf ("\n");
    +            }
    +
    +          printf ("%s\t", commands[i].name);
    +          printed++;
    +        }
    +
    +      if (printed)
    +        printf ("\n");
    +    }
    +  return (0);
    +}
    +
    +/* Change to the directory ARG. */
    +com_cd (arg)
    +     char *arg;
    +{
    +  if (chdir (arg) == -1)
    +    {
    +      perror (arg);
    +      return 1;
    +    }
    +
    +  com_pwd ("");
    +  return (0);
    +}
    +
    +/* Print out the current working directory. */
    +com_pwd (ignore)
    +     char *ignore;
    +{
    +  char dir[1024], *s;
    +
    +  s = getwd (dir);
    +  if (s == 0)
    +    {
    +      printf ("Error getting pwd: %s\n", dir);
    +      return 1;
    +    }
    +
    +  printf ("Current directory is %s\n", dir);
    +  return 0;
    +}
    +
    +/* The user wishes to quit using this program.  Just set DONE non-zero. */
    +com_quit (arg)
    +     char *arg;
    +{
    +  done = 1;
    +  return (0);
    +}
    +
    +/* Function which tells you that you can't do this. */
    +too_dangerous (caller)
    +     char *caller;
    +{
    +  fprintf (stderr,
    +           "%s: Too dangerous for me to distribute.  Write it yourself.\n",
    +           caller);
    +}
    +
    +/* Return non-zero if ARG is a valid argument for CALLER, else print
    +   an error message and return zero. */
    +int
    +valid_argument (caller, arg)
    +     char *caller, *arg;
    +{
    +  if (!arg || !*arg)
    +    {
    +      fprintf (stderr, "%s: Argument required.\n", caller);
    +      return (0);
    +    }
    +
    +  return (1);
    +}
    +
    + + + +

    Concept Index

    +

    +

    i

    + +
  • interaction, readline +
  • +

    r

    + +
  • readline, function +
  • + +

    + + +

    Function and Variable Index

    +

    +

    (

    + +
  • (int +
  • +

    a

    + +
  • abort (C-g) +
  • accept-line (Newline, Return) +
  • alphabetic +
  • +

    b

    + +
  • backward-char (C-b) +
  • backward-delete-char (Rubout) +
  • backward-kill-line (C-x Rubout) +
  • backward-kill-word (M-DEL) +
  • backward-word (M-b) +
  • beginning-of-history (M-&#60;) +
  • beginning-of-line (C-a) +
  • bell-style +
  • +

    c

    + +
  • call-last-kbd-macro (C-x e) +
  • capitalize-word (M-c) +
  • character-search (C-]) +
  • character-search-backward (M-C-]) +
  • clear-screen (C-l) +
  • comment-begin +
  • complete (TAB) +
  • completion-query-items +
  • completion_matches +
  • convert-meta +
  • copy-backward-word () +
  • copy-forward-word () +
  • copy-region-as-kill () +
  • +

    d

    + +
  • delete-char (C-d) +
  • delete-horizontal-space () +
  • digit-argument (M-0, M-1, ... M--) +
  • digit_p +
  • digit_value +
  • ding +
  • disable-completion +
  • do-uppercase-version (M-a, M-b, M-x, ...) +
  • downcase-word (M-l) +
  • dump-functions () +
  • dump-macros () +
  • dump-variables () +
  • +

    e

    + +
  • editing-mode +
  • enable-keypad +
  • end-kbd-macro (C-x )) +
  • end-of-history (M-&#62;) +
  • end-of-line (C-e) +
  • exchange-point-and-mark (C-x C-x) +
  • expand-tilde +
  • +

    f

    + +
  • filename_completion_function +
  • forward-char (C-f) +
  • forward-search-history (C-s) +
  • forward-word (M-f) +
  • free_undo_list +
  • +

    h

    + +
  • history-search-backward () +
  • history-search-forward () +
  • horizontal-scroll-mode +
  • +

    i

    + +
  • input-meta +
  • insert-comment (M-#) +
  • insert-completions (M-*) +
  • +

    k

    + +
  • keymap +
  • kill-line (C-k) +
  • kill-region () +
  • kill-whole-line () +
  • kill-word (M-d) +
  • +

    l

    + +
  • lowercase_p +
  • +

    m

    + +
  • mark-modified-lines +
  • menu-complete () +
  • meta-flag +
  • +

    n

    + +
  • next-history (C-n) +
  • non-incremental-forward-search-history (M-n) +
  • non-incremental-reverse-search-history (M-p) +
  • numeric +
  • +

    o

    + +
  • output-meta +
  • +

    p

    + +
  • possible-completions (M-?) +
  • prefix-meta (ESC) +
  • previous-history (C-p) +
  • +

    q

    + +
  • quoted-insert (C-q, C-v) +
  • +

    r

    + +
  • re-read-init-file (C-x C-r) +
  • readline +
  • redraw-current-line () +
  • reverse-search-history (C-r) +
  • revert-line (M-r) +
  • rl_add_defun +
  • rl_add_undo +
  • rl_attempted_completion_function +
  • rl_basic_quote_characters +
  • rl_basic_word_break_characters +
  • rl_begin_undo_group +
  • rl_bind_key +
  • rl_bind_key_in_map +
  • rl_binding_keymap +
  • rl_callback_handler_install +
  • rl_callback_handler_remove +
  • rl_callback_read_char +
  • rl_char_is_quoted_p +
  • rl_clear_message +
  • rl_complete, rl_complete +
  • rl_complete_internal +
  • rl_completer_quote_characters +
  • rl_completer_word_break_characters +
  • rl_completion_append_character +
  • rl_completion_entry_function, rl_completion_entry_function +
  • rl_completion_query_items +
  • rl_copy_keymap +
  • rl_copy_text +
  • rl_delete_text +
  • rl_directory_completion_hook +
  • rl_discard_keymap +
  • rl_do_undo +
  • rl_done +
  • rl_end +
  • rl_end_undo_group +
  • rl_event_hook +
  • rl_executing_keymap +
  • rl_filename_completion_desired +
  • rl_filename_dequoting_function +
  • rl_filename_quote_characters +
  • rl_filename_quoting_desired +
  • rl_filename_quoting_function +
  • rl_forced_update_display +
  • rl_function_dumper +
  • rl_function_of_keyseq +
  • rl_generic_bind +
  • rl_get_keymap +
  • rl_get_keymap_by_name +
  • rl_get_keymap_name +
  • rl_getc +
  • rl_getc_function +
  • rl_ignore_completion_duplicates +
  • rl_ignore_some_completions_function +
  • rl_inhibit_completion +
  • rl_initialize +
  • rl_insert_completions +
  • rl_insert_text +
  • rl_instream +
  • rl_invoking_keyseqs +
  • rl_invoking_keyseqs_in_map +
  • rl_kill_text +
  • rl_library_version +
  • rl_line_buffer +
  • rl_list_funmap_names +
  • rl_make_bare_keymap +
  • rl_make_keymap +
  • rl_mark +
  • rl_message +
  • rl_modifying +
  • rl_named_function +
  • rl_on_new_line +
  • rl_outstream +
  • rl_parse_and_bind +
  • rl_pending_input +
  • rl_point +
  • rl_possible_completions +
  • rl_prompt +
  • rl_read_init_file +
  • rl_read_key +
  • rl_readline_name +
  • rl_redisplay +
  • rl_redisplay_function +
  • rl_reset_line_state +
  • rl_reset_terminal +
  • rl_set_keymap +
  • rl_special_prefixes +
  • rl_startup_hook +
  • rl_stuff_char +
  • rl_terminal_name +
  • rl_unbind_command_in_map +
  • rl_unbind_function_in_map +
  • rl_unbind_key +
  • rl_unbind_key_in_map +
  • +

    s

    + +
  • self-insert (a, b, A, 1, !, ...) +
  • set-mark (C-@) +
  • show-all-if-ambiguous +
  • start-kbd-macro (C-x () +
  • +

    t

    + +
  • tab-insert (M-TAB) +
  • tilde-expand (M-~) +
  • to_lower +
  • to_upper +
  • transpose-chars (C-t) +
  • transpose-words (M-t) +
  • +

    u

    + +
  • undo (C-_, C-x C-u) +
  • universal-argument () +
  • unix-line-discard (C-u) +
  • unix-word-rubout (C-w) +
  • upcase-word (M-u) +
  • uppercase_p +
  • username_completion_function +
  • +

    v

    + +
  • visible-stats +
  • +

    y

    + +
  • yank (C-y) +
  • yank-last-arg (M-., M-_) +
  • yank-nth-arg (M-C-y) +
  • yank-pop (M-y) +
  • + +

    +


    +This document was generated on 2 April 1998 using the +texi2html +translator version 1.51.

    + + diff --git a/readline/doc/readline.info b/readline/doc/readline.info index a93489f3d6d..251ca9e56b5 100644 --- a/readline/doc/readline.info +++ b/readline/doc/readline.info @@ -1,15 +1,20 @@ -Info file readline.info, produced by Makeinfo, -*- Text -*- from input -file rlman.texinfo. +This is Info file readline.info, produced by Makeinfo version 1.67 from +the input file /usr/homes/chet/src/bash/readline-2.2/doc/rlman.texinfo. + +INFO-DIR-SECTION Libraries +START-INFO-DIR-ENTRY +* Readline: (readline). The GNU readline library API +END-INFO-DIR-ENTRY This document describes the GNU Readline Library, a utility which -aids in the consistency of user interface across discrete programs -that need to provide a command line interface. +aids in the consistency of user interface across discrete programs that +need to provide a command line interface. Copyright (C) 1988, 1991 Free Software Foundation, Inc. - Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice pare +preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that @@ -22,14 +27,14 @@ versions, except that this permission notice may be stated in a translation approved by the Foundation.  -File: readline.info, Node: Top, Next: Command Line Editing, Prev: (DIR), Up: (DIR) +File: readline.info, Node: Top, Next: Command Line Editing, Up: (dir) GNU Readline Library ******************** This document describes the GNU Readline Library, a utility which -aids in the consistency of user interface across discrete programs -that need to provide a command line interface. +aids in the consistency of user interface across discrete programs that +need to provide a command line interface. * Menu: @@ -45,13 +50,18 @@ File: readline.info, Node: Command Line Editing, Next: Programming with GNU Re Command Line Editing ******************** - This text describes GNU's command line editing interface. + This chapter describes the basic features of the GNU command line +editing interface. * Menu: * Introduction and Notation:: Notation used in this text. * Readline Interaction:: The minimum set of commands for editing a line. * Readline Init File:: Customizing Readline from a user's view. +* Bindable Readline Commands:: A description of most of the Readline commands + available for binding +* Readline vi Mode:: A short description of how to make Readline + behave like the vi editor.  File: readline.info, Node: Introduction and Notation, Next: Readline Interaction, Up: Command Line Editing @@ -59,24 +69,25 @@ File: readline.info, Node: Introduction and Notation, Next: Readline Interacti Introduction to Line Editing ============================ - The following paragraphs describe the notation we use to represent + The following paragraphs describe the notation used to represent keystrokes. - The text C-k is read as `Control-K' and describes the character -produced when the Control key is depressed and the k key is struck. + The text is read as `Control-K' and describes the character +produced when the key is pressed while the Control key is depressed. - The text M-k is read as `Meta-K' and describes the character -produced when the meta key (if you have one) is depressed, and the k -key is struck. If you do not have a meta key, the identical keystroke -can be generated by typing ESC first, and then typing k. Either -process is known as "metafying" the k key. + The text is read as `Meta-K' and describes the character +produced when the meta key (if you have one) is depressed, and the +key is pressed. If you do not have a meta key, the identical keystroke +can be generated by typing first, and then typing . Either +process is known as "metafying" the key. - The text M-C-k is read as `Meta-Control-k' and describes the -character produced by "metafying" C-k. + The text is read as `Meta-Control-k' and describes the +character produced by "metafying" . - In addition, several keys have their own names. Specifically, DEL, -ESC, LFD, SPC, RET, and TAB all stand for themselves when seen in this -text, or in an init file (*note Readline Init File::., for more info). + In addition, several keys have their own names. Specifically, +, , , , , and all stand for themselves +when seen in this text, or in an init file (*note Readline Init +File::.).  File: readline.info, Node: Readline Interaction, Next: Readline Init File, Prev: Introduction and Notation, Up: Command Line Editing @@ -91,9 +102,9 @@ as you type it in, allowing you to just fix your typo, and not forcing you to retype the majority of the line. Using these editing commands, you move the cursor to the place that needs correction, and delete or insert the text of the corrections. Then, when you are satisfied with -the line, you simply press RETURN. You do not have to be at the end -of the line to press RETURN; the entire line is accepted regardless of -the location of the cursor within the line. +the line, you simply press . You do not have to be at the end +of the line to press ; the entire line is accepted regardless +of the location of the cursor within the line. * Menu: @@ -101,6 +112,7 @@ the location of the cursor within the line. * Readline Movement Commands:: Moving about the input line. * Readline Killing Commands:: How to delete text, and how to get it back! * Readline Arguments:: Giving numeric arguments to commands. +* Searching:: Searching through previous lines.  File: readline.info, Node: Readline Bare Essentials, Next: Readline Movement Commands, Up: Readline Interaction @@ -109,42 +121,42 @@ Readline Bare Essentials ------------------------ In order to enter characters into the line, simply type them. The -typed character appears where the cursor was, and then the cursor -moves one space to the right. If you mistype a character, you can use -DEL to back up, and delete the mistyped character. +typed character appears where the cursor was, and then the cursor moves +one space to the right. If you mistype a character, you can use your +erase character to back up and delete the mistyped character. Sometimes you may miss typing a character that you wanted to type, and not notice your error until you have typed several other -characters. In that case, you can type C-b to move the cursor to the -left, and then correct your mistake. Aftwerwards, you can move the -cursor to the right with C-f. +characters. In that case, you can type to move the cursor to the +left, and then correct your mistake. Afterwards, you can move the +cursor to the right with . When you add text in the middle of a line, you will notice that -characters to the right of the cursor get `pushed over' to make room +characters to the right of the cursor are `pushed over' to make room for the text that you have inserted. Likewise, when you delete text -behind the cursor, characters to the right of the cursor get `pulled -back' to fill in the blank space created by the removal of the text. -A list of the basic bare essentials for editing the text of an input -line follows. +behind the cursor, characters to the right of the cursor are `pulled +back' to fill in the blank space created by the removal of the text. A +list of the basic bare essentials for editing the text of an input line +follows. -C-b + Move back one character. -C-f + Move forward one character. -DEL + Delete the character to the left of the cursor. -C-d + Delete the character underneath the cursor. Printing characters - Insert itself into the line at the cursor. + Insert the character into the line at the cursor. -C-_ - Undo the last thing that you did. You can undo all the way back - to an empty line. + + Undo the last editing command. You can undo all the way back to an + empty line.  File: readline.info, Node: Readline Movement Commands, Next: Readline Killing Commands, Prev: Readline Bare Essentials, Up: Readline Interaction @@ -154,28 +166,29 @@ Readline Movement Commands The above table describes the most basic possible keystrokes that you need in order to do editing of the input line. For your -convenience, many other commands have been added in addition to C-b, -C-f, C-d, and DEL. Here are some commands for moving more rapidly +convenience, many other commands have been added in addition to , +, , and . Here are some commands for moving more rapidly about the line. -C-a + Move to the start of the line. -C-e + Move to the end of the line. -M-f - Move forward a word. + + Move forward a word, where a word is composed of letters and + digits. -M-b + Move backward a word. -C-l + Clear the screen, reprinting the current line at the top. - Notice how C-f moves forward a character, while M-f moves forward a -word. It is a loose convention that control keystrokes operate on -characters while meta keystrokes operate on words. + Notice how moves forward a character, while moves +forward a word. It is a loose convention that control keystrokes +operate on characters while meta keystrokes operate on words.  File: readline.info, Node: Readline Killing Commands, Next: Readline Arguments, Prev: Readline Movement Commands, Up: Readline Interaction @@ -183,53 +196,49 @@ File: readline.info, Node: Readline Killing Commands, Next: Readline Arguments Readline Killing Commands ------------------------- - The act of "cutting" text means to delete the text from the line, -and to save away the deleted text for later use, just as if you had -cut the text out of the line with a pair of scissors. There is a - "Killing" text means to delete the text from the line, but to save -it away for later use, usually by "yanking" it back into the line. If -the description for a command says that it `kills' text, then you can -be sure that you can get the text back in a different (or the same) -place later. +it away for later use, usually by "yanking" (re-inserting) it back into +the line. If the description for a command says that it `kills' text, +then you can be sure that you can get the text back in a different (or +the same) place later. + + When you use a kill command, the text is saved in a "kill-ring". +Any number of consecutive kills save all of the killed text together, so +that when you yank it back, you get it all. The kill ring is not line +specific; the text that you killed on a previously typed line is +available to be yanked back later, when you are typing another line. Here is the list of commands for killing text. -C-k + Kill the text from the current cursor position to the end of the line. -M-d + Kill from the cursor to the end of the current word, or if between words, to the end of the next word. -M-DEL - Kill fromthe cursor the start of the previous word, or if between + + Kill from the cursor the start of the previous word, or if between words, to the start of the previous word. -C-w + Kill from the cursor to the previous whitespace. This is - different than M-DEL because the word boundaries differ. + different than because the word boundaries differ. - And, here is how to "yank" the text back into the line. Yanking is + Here is how to "yank" the text back into the line. Yanking means to +copy the most-recently-killed text from the kill buffer. -C-y + Yank the most recently killed text back into the buffer at the cursor. -M-y + Rotate the kill-ring, and yank the new top. You can only do this - if the prior command is C-y or M-y. - - When you use a kill command, the text is saved in a "kill-ring". -Any number of consecutive kills save all of the killed text together, -so that when you yank it back, you get it in one clean sweep. The kill -ring is not line specific; the text that you killed on a previously -typed line is available to be yanked back later, when you are typing -another line. + if the prior command is or .  -File: readline.info, Node: Readline Arguments, Prev: Readline Killing Commands, Up: Readline Interaction +File: readline.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction Readline Arguments ------------------ @@ -239,121 +248,479 @@ argument acts as a repeat count, other times it is the sign of the argument that is significant. If you pass a negative argument to a command which normally acts in a forward direction, that command will act in a backward direction. For example, to kill text back to the -start of the line, you might type M-- C-k. +start of the line, you might type `M-- C-k'. The general way to pass numeric arguments to a command is to type -meta digits before the command. If the first `digit' you type is a -minus sign (-), then the sign of the argument will be negative. Once -you have typed one meta digit to get the argument started, you can type -the remainder of the digits, and then the command. For example, to -give the C-d command an argument of 10, you could type M-1 0 C-d. +meta digits before the command. If the first `digit' typed is a minus +sign (<->), then the sign of the argument will be negative. Once you +have typed one meta digit to get the argument started, you can type the +remainder of the digits, and then the command. For example, to give +the command an argument of 10, you could type `M-1 0 C-d'. + + +File: readline.info, Node: Searching, Prev: Readline Arguments, Up: Readline Interaction + +Searching for Commands in the History +------------------------------------- + + Readline provides commands for searching through the command history +for lines containing a specified string. There are two search modes: +INCREMENTAL and NON-INCREMENTAL. + + Incremental searches begin before the user has finished typing the +search string. As each character of the search string is typed, +Readline displays the next entry from the history matching the string +typed so far. An incremental search requires only as many characters +as needed to find the desired history entry. The character is +used to terminate an incremental search. will also terminate the +search. will abort an incremental search and restore the +original line. When the search is terminated, the history entry +containing the search string becomes the current line. To find other +matching entries in the history list, type or as +appropriate. This will search backward or forward in the history for +the next entry matching the search string typed so far. Any other key +sequence bound to a Readline command will terminate the search and +execute that command. For instance, a will terminate the search +and accept the line, thereby executing the command from the history +list. + + Non-incremental searches read the entire search string before +starting to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line.  -File: readline.info, Node: Readline Init File, Prev: Readline Interaction, Up: Command Line Editing +File: readline.info, Node: Readline Init File, Next: Bindable Readline Commands, Prev: Readline Interaction, Up: Command Line Editing Readline Init File ================== - Although the Readline library comes with a set of Emacs-like -keybindings, it is possible that you would like to use a different set -of keybindings. You can customize programs that use Readline by -putting commands in an "init" file in your home directory. The name -of this file is `~/.inputrc'. + Although the Readline library comes with a set of `emacs'-like +keybindings installed by default, it is possible to use a different set +of keybindings. Any user can customize programs that use Readline by +putting commands in an "inputrc" file in his home directory. The name +of this file is taken from the value of the environment variable +`INPUTRC'. If that variable is unset, the default is `~/.inputrc'. - When a program which uses the Readline library starts up, the -`~/.inputrc' file is read, and the keybindings are set. + When a program which uses the Readline library starts up, the init +file is read, and the key bindings are set. In addition, the `C-x C-r' command re-reads this init file, thus incorporating any changes that you might have made to it. * Menu: -* Readline Init Syntax:: Syntax for the commands in `~/.inputrc'. -* Readline Vi Mode:: Switching to `vi' mode in Readline. +* Readline Init File Syntax:: Syntax for the commands in the inputrc file. + +* Conditional Init Constructs:: Conditional key bindings in the inputrc file. + +* Sample Init File:: An example inputrc file.  -File: readline.info, Node: Readline Init Syntax, Next: Readline Vi Mode, Up: Readline Init File +File: readline.info, Node: Readline Init File Syntax, Next: Conditional Init Constructs, Up: Readline Init File -Readline Init Syntax --------------------- +Readline Init File Syntax +------------------------- - There are only four constructs allowed in the `~/.inputrc' file: + There are only a few basic constructs allowed in the Readline init +file. Blank lines are ignored. Lines beginning with a `#' are +comments. Lines beginning with a `$' indicate conditional constructs +(*note Conditional Init Constructs::.). Other lines denote variable +settings and key bindings. Variable Settings - You can change the state of a few variables in Readline. You do - this by using the `set' command within the init file. Here is - how you would specify that you wish to use Vi line editing - commands: + You can modify the run-time behavior of Readline by altering the + values of variables in Readline using the `set' command within the + init file. Here is how to change from the default Emacs-like key + binding to use `vi' line editing commands: set editing-mode vi - Right now, there are only a few variables which can be set; so - few in fact, that we just iterate them here: + A great deal of run-time behavior is changeable with the following + variables. + + `bell-style' + Controls what happens when Readline wants to ring the + terminal bell. If set to `none', Readline never rings the + bell. If set to `visible', Readline uses a visible bell if + one is available. If set to `audible' (the default), + Readline attempts to ring the terminal's bell. + + `comment-begin' + The string to insert at the beginning of the line when the + `insert-comment' command is executed. The default value is + `"#"'. + + `completion-ignore-case' + If set to `on', Readline performs filename matching and + completion in a case-insensitive fashion. The default value + is `off'. + + `completion-query-items' + The number of possible completions that determines when the + user is asked whether he wants to see the list of + possibilities. If the number of possible completions is + greater than this value, Readline will ask the user whether + or not he wishes to view them; otherwise, they are simply + listed. The default limit is `100'. + + `convert-meta' + If set to `on', Readline will convert characters with the + eighth bit set to an ASCII key sequence by stripping the + eighth bit and prepending an character, converting them + to a meta-prefixed key sequence. The default value is `on'. + + `disable-completion' + If set to `On', Readline will inhibit word completion. + Completion characters will be inserted into the line as if + they had been mapped to `self-insert'. The default is `off'. `editing-mode' - The `editing-mode' variable controls which editing mode you - are using. By default, GNU Readline starts up in Emacs - editing mode, where the keystrokes are most similar to - Emacs. This variable can either be set to `emacs' or `vi'. + The `editing-mode' variable controls which default set of key + bindings is used. By default, Readline starts up in Emacs + editing mode, where the keystrokes are most similar to Emacs. + This variable can be set to either `emacs' or `vi'. + + `enable-keypad' + When set to `on', Readline will try to enable the application + keypad when it is called. Some systems need this to enable + the arrow keys. The default is `off'. + + `expand-tilde' + If set to `on', tilde expansion is performed when Readline + attempts word completion. The default is `off'. `horizontal-scroll-mode' - This variable can either be set to `On' or `Off'. Setting it - to `On' means that the text of the lines that you edit will + This variable can be set to either `on' or `off'. Setting it + to `on' means that the text of the lines being edited will scroll horizontally on a single screen line when they are - larger than the width of the screen, instead of wrapping - onto a new screen line. By default, this variable is set to - `Off'. + longer than the width of the screen, instead of wrapping onto + a new screen line. By default, this variable is set to `off'. + + `keymap' + Sets Readline's idea of the current keymap for key binding + commands. Acceptable `keymap' names are `emacs', + `emacs-standard', `emacs-meta', `emacs-ctlx', `vi', + `vi-command', and `vi-insert'. `vi' is equivalent to + `vi-command'; `emacs' is equivalent to `emacs-standard'. The + default value is `emacs'. The value of the `editing-mode' + variable also affects the default keymap. + + `mark-directories' + If set to `on', completed directory names have a slash + appended. The default is `on'. `mark-modified-lines' - This variable when set to `On', says to display an asterisk - (`*') at the starts of history lines which have been - modified. This variable is off by default. - - `prefer-visible-bell' - If this variable is set to `On' it means to use a visible - bell if one is available, rather than simply ringing the - terminal bell. By default, the value is `Off'. + This variable, when set to `on', causes Readline to display an + asterisk (`*') at the start of history lines which have been + modified. This variable is `off' by default. + + `input-meta' + If set to `on', Readline will enable eight-bit input (it will + not strip the eighth bit from the characters it reads), + regardless of what the terminal claims it can support. The + default value is `off'. The name `meta-flag' is a synonym + for this variable. + + `output-meta' + If set to `on', Readline will display characters with the + eighth bit set directly rather than as a meta-prefixed escape + sequence. The default is `off'. + + `print-completions-horizontally' + If set to `on', Readline will display completions with matches + sorted horizontally in alphabetical order, rather than down + the screen. The default is `off'. + + `show-all-if-ambiguous' + This alters the default behavior of the completion functions. + If set to `on', words which have more than one possible + completion cause the matches to be listed immediately instead + of ringing the bell. The default value is `off'. + + `visible-stats' + If set to `on', a character denoting a file's type is + appended to the filename when listing possible completions. + The default is `off'. Key Bindings - The syntax for controlling keybindings in the `~/.inputrc' file is + The syntax for controlling key bindings in the init file is simple. First you have to know the name of the command that you - want to change. The following pages contain tables of the - command name, the default keybinding, and a short description of - what the command does. + want to change. The following sections contain tables of the + command name, the default keybinding, if any, and a short + description of what the command does. Once you know the name of the command, simply place the name of the key you wish to bind the command to, a colon, and then the - name of the command on a line in the `~/.inputrc' file. The name - of the key can be expressed in different ways, depending on which - is most comfortable for you. + name of the command on a line in the init file. The name of the + key can be expressed in different ways, depending on which is most + comfortable for you. KEYNAME: FUNCTION-NAME or MACRO KEYNAME is the name of a key spelled out in English. For example: - Control-u: universal-argument Meta-Rubout: backward-kill-word - Control-o: ">&output" + Control-o: "> output" - In the above example, `C-u' is bound to the function - `universal-argument', and `C-o' is bound to run the macro + In the above example, is bound to the function + `universal-argument', and is bound to run the macro expressed on the right hand side (that is, to insert the text - `>&output' into the line). + `> output' into the line). "KEYSEQ": FUNCTION-NAME or MACRO - KEYSEQ differs from KEYNAME above in that strings denoting - an entire key sequence can be specified. Simply place the - key sequence in double quotes. GNU Emacs style key escapes - can be used, as in the following example: + KEYSEQ differs from KEYNAME above in that strings denoting an + entire key sequence can be specified, by placing the key + sequence in double quotes. Some GNU Emacs style key escapes + can be used, as in the following example, but the special + character names are not recognized. "\C-u": universal-argument "\C-x\C-r": re-read-init-file "\e[11~": "Function Key 1" - In the above example, `C-u' is bound to the function + In the above example, is bound to the function `universal-argument' (just as it was in the first example), - `C-x C-r' is bound to the function `re-read-init-file', and - `ESC [ 1 1 ~' is bound to insert the text `Function Key 1'. + ` ' is bound to the function `re-read-init-file', + and ` <[> <1> <1> <~>' is bound to insert the text + `Function Key 1'. + + The following GNU Emacs style escape sequences are available when + specifying key sequences: + + `\C-' + control prefix + + `\M-' + meta prefix + + `\e' + an escape character + + `\\' + backslash + + `\"' + <"> + + `\'' + <'> + + In addition to the GNU Emacs style escape sequences, a second set + of backslash escapes is available: + + `\a' + alert (bell) + + `\b' + backspace + + `\d' + delete + + `\f' + form feed + + `\n' + newline + + `\r' + carriage return + + `\t' + horizontal tab + + `\v' + vertical tab + + `\NNN' + the character whose ASCII code is the octal value NNN (one to + three digits) + + `\xNNN' + the character whose ASCII code is the hexadecimal value NNN + (one to three digits) + + When entering the text of a macro, single or double quotes must be + used to indicate a macro definition. Unquoted text is assumed to + be a function name. In the macro body, the backslash escapes + described above are expanded. Backslash will quote any other + character in the macro text, including `"' and `''. For example, + the following binding will make `C-x \' insert a single `\' into + the line: + "\C-x\\": "\\" + + +File: readline.info, Node: Conditional Init Constructs, Next: Sample Init File, Prev: Readline Init File Syntax, Up: Readline Init File + +Conditional Init Constructs +--------------------------- + + Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key bindings +and variable settings to be performed as the result of tests. There +are four parser directives used. + +`$if' + The `$if' construct allows bindings to be made based on the + editing mode, the terminal being used, or the application using + Readline. The text of the test extends to the end of the line; no + characters are required to isolate it. + + `mode' + The `mode=' form of the `$if' directive is used to test + whether Readline is in `emacs' or `vi' mode. This may be + used in conjunction with the `set keymap' command, for + instance, to set bindings in the `emacs-standard' and + `emacs-ctlx' keymaps only if Readline is starting out in + `emacs' mode. + + `term' + The `term=' form may be used to include terminal-specific key + bindings, perhaps to bind the key sequences output by the + terminal's function keys. The word on the right side of the + `=' is tested against both the full name of the terminal and + the portion of the terminal name before the first `-'. This + allows `sun' to match both `sun' and `sun-cmd', for instance. + + `application' + The APPLICATION construct is used to include + application-specific settings. Each program using the + Readline library sets the APPLICATION NAME, and you can test + for it. This could be used to bind key sequences to + functions useful for a specific program. For instance, the + following command adds a key sequence that quotes the current + or previous word in Bash: + $if Bash + # Quote the current or previous word + "\C-xq": "\eb\"\ef\"" + $endif + +`$endif' + This command, as seen in the previous example, terminates an `$if' + command. + +`$else' + Commands in this branch of the `$if' directive are executed if the + test fails. + +`$include' + This directive takes a single filename as an argument and reads + commands and bindings from that file. + $include /etc/inputrc + + +File: readline.info, Node: Sample Init File, Prev: Conditional Init Constructs, Up: Readline Init File + +Sample Init File +---------------- + + Here is an example of an inputrc file. This illustrates key +binding, variable assignment, and conditional syntax. + + + # This file controls the behaviour of line input editing for + # programs that use the Gnu Readline library. Existing programs + # include FTP, Bash, and Gdb. + # + # You can re-read the inputrc file with C-x C-r. + # Lines beginning with '#' are comments. + # + # First, include any systemwide bindings and variable assignments from + # /etc/Inputrc + $include /etc/Inputrc + + # + # Set various bindings for emacs mode. + + set editing-mode emacs + + $if mode=emacs + + Meta-Control-h: backward-kill-word Text after the function name is ignored + + # + # Arrow keys in keypad mode + # + #"\M-OD": backward-char + #"\M-OC": forward-char + #"\M-OA": previous-history + #"\M-OB": next-history + # + # Arrow keys in ANSI mode + # + "\M-[D": backward-char + "\M-[C": forward-char + "\M-[A": previous-history + "\M-[B": next-history + # + # Arrow keys in 8 bit keypad mode + # + #"\M-\C-OD": backward-char + #"\M-\C-OC": forward-char + #"\M-\C-OA": previous-history + #"\M-\C-OB": next-history + # + # Arrow keys in 8 bit ANSI mode + # + #"\M-\C-[D": backward-char + #"\M-\C-[C": forward-char + #"\M-\C-[A": previous-history + #"\M-\C-[B": next-history + + C-q: quoted-insert + + $endif + + # An old-style binding. This happens to be the default. + TAB: complete + + # Macros that are convenient for shell interaction + $if Bash + # edit the path + "\C-xp": "PATH=${PATH}\e\C-e\C-a\ef\C-f" + # prepare to type a quoted word -- insert open and close double quotes + # and move to just after the open quote + "\C-x\"": "\"\"\C-b" + # insert a backslash (testing backslash escapes in sequences and macros) + "\C-x\\": "\\" + # Quote the current or previous word + "\C-xq": "\eb\"\ef\"" + # Add a binding to refresh the line, which is unbound + "\C-xr": redraw-current-line + # Edit variable on current line. + "\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" + $endif + + # use a visible bell if one is available + set bell-style visible + + # don't strip characters to 7 bits when reading + set input-meta on + + # allow iso-latin1 characters to be inserted rather than converted to + # prefix-meta sequences + set convert-meta off + + # display characters with the eighth bit set directly rather than + # as meta-prefixed characters + set output-meta on + + # if there are more than 150 possible completions for a word, ask the + # user if he wants to see all of them + set completion-query-items 150 + + # For FTP + $if Ftp + "\C-xg": "get \M-?" + "\C-xt": "put \M-?" + "\M-.": yank-last-arg + $endif + + +File: readline.info, Node: Bindable Readline Commands, Next: Readline vi Mode, Prev: Readline Init File, Up: Command Line Editing + +Bindable Readline Commands +========================== * Menu: @@ -363,13 +730,17 @@ Key Bindings * Commands For Killing:: Commands for killing and yanking. * Numeric Arguments:: Specifying numeric arguments, repeat counts. * Commands For Completion:: Getting Readline to do the typing for you. -* Miscellaneous Commands:: Other miscillaneous commands. +* Keyboard Macros:: Saving and re-executing typed characters +* Miscellaneous Commands:: Other miscellaneous commands. + + This section describes Readline commands that may be bound to key +sequences.  -File: readline.info, Node: Commands For Moving, Next: Commands For History, Up: Readline Init Syntax +File: readline.info, Node: Commands For Moving, Next: Commands For History, Up: Bindable Readline Commands Commands For Moving -................... +------------------- `beginning-of-line (C-a)' Move to the start of the current line. @@ -384,25 +755,30 @@ Commands For Moving Move back a character. `forward-word (M-f)' - Move forward to the end of the next word. + Move forward to the end of the next word. Words are composed of + letters and digits. `backward-word (M-b)' - Move back to the start of this, or the previous, word. + Move back to the start of this, or the previous, word. Words are + composed of letters and digits. `clear-screen (C-l)' - Clear the screen leaving the current line at the top of the - screen. + Clear the screen and redraw the current line, leaving the current + line at the top of the screen. + +`redraw-current-line ()' + Refresh the current line. By default, this is unbound.  -File: readline.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Readline Init Syntax +File: readline.info, Node: Commands For History, Next: Commands For Text, Prev: Commands For Moving, Up: Bindable Readline Commands Commands For Manipulating The History -..................................... +------------------------------------- `accept-line (Newline, Return)' - Accept the line regardless of where the cursor is. If this line - is non-empty, add it to the history list. If this line was a - history line, then restore the history line to its original state. + Accept the line regardless of where the cursor is. If this line is + non-empty, add it to the history list. If this line was a history + line, then restore the history line to its original state. `previous-history (C-p)' Move `up' through the history list. @@ -414,8 +790,8 @@ Commands For Manipulating The History Move to the first line in the history. `end-of-history (M->)' - Move to the end of the input history, i.e., the line you are - entering! + Move to the end of the input history, i.e., the line currently + being entered. `reverse-search-history (C-r)' Search backward starting at the current line and moving `up' @@ -423,26 +799,63 @@ Commands For Manipulating The History `forward-search-history (C-s)' Search forward starting at the current line and moving `down' - through the the history as neccessary. + through the the history as necessary. This is an incremental + search. + +`non-incremental-reverse-search-history (M-p)' + Search backward starting at the current line and moving `up' + through the history as necessary using a non-incremental search + for a string supplied by the user. + +`non-incremental-forward-search-history (M-n)' + Search forward starting at the current line and moving `down' + through the the history as necessary using a non-incremental search + for a string supplied by the user. + +`history-search-forward ()' + Search forward through the history for the string of characters + between the start of the current line and the current cursor + position (the POINT). This is a non-incremental search. By + default, this command is unbound. + +`history-search-backward ()' + Search backward through the history for the string of characters + between the start of the current line and the point. This is a + non-incremental search. By default, this command is unbound. + +`yank-nth-arg (M-C-y)' + Insert the first argument to the previous command (usually the + second word on the previous line). With an argument N, insert the + Nth word from the previous command (the words in the previous + command begin with word 0). A negative argument inserts the Nth + word from the end of the previous command. + +`yank-last-arg (M-., M-_)' + Insert last argument to the previous command (the last word of the + previous history entry). With an argument, behave exactly like + `yank-nth-arg'. Successive calls to `yank-last-arg' move back + through the history list, inserting the last argument of each line + in turn.  -File: readline.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Readline Init Syntax +File: readline.info, Node: Commands For Text, Next: Commands For Killing, Prev: Commands For History, Up: Bindable Readline Commands Commands For Changing Text -.......................... +-------------------------- `delete-char (C-d)' Delete the character under the cursor. If the cursor is at the - beginning of the line, and there are no characters in the line, - and the last character typed was not C-d, then return EOF. + beginning of the line, there are no characters in the line, and + the last character typed was not bound to `delete-char', then + return `EOF'. `backward-delete-char (Rubout)' - Delete the character behind the cursor. A numeric arg says to - kill the characters instead of deleting them. + Delete the character behind the cursor. A numeric argument means + to kill the characters instead of deleting them. `quoted-insert (C-q, C-v)' - Add the next character that you type to the line verbatim. This - is how to insert things like C-q for example. + Add the next character typed to the line verbatim. This is how to + insert key sequences like , for example. `tab-insert (M-TAB)' Insert a tab character. @@ -451,10 +864,10 @@ Commands For Changing Text Insert yourself. `transpose-chars (C-t)' - Drag the character before point forward over the character at - point. Point moves forward as well. If point is at the end of - the line, then transpose the two characters before point. - Negative args don't work. + Drag the character before the cursor forward over the character at + the cursor, moving the cursor forward as well. If the insertion + point is at the end of the line, then this transposes the last two + characters of the line. Negative arguments don't work. `transpose-words (M-t)' Drag the word behind the cursor past the word in front of the @@ -462,139 +875,258 @@ Commands For Changing Text `upcase-word (M-u)' Uppercase the current (or following) word. With a negative - argument, do the previous word, but do not move point. + argument, uppercase the previous word, but do not move the cursor. `downcase-word (M-l)' Lowercase the current (or following) word. With a negative - argument, do the previous word, but do not move point. + argument, lowercase the previous word, but do not move the cursor. `capitalize-word (M-c)' - Uppercase the current (or following) word. With a negative - argument, do the previous word, but do not move point. + Capitalize the current (or following) word. With a negative + argument, capitalize the previous word, but do not move the cursor.  -File: readline.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Readline Init Syntax +File: readline.info, Node: Commands For Killing, Next: Numeric Arguments, Prev: Commands For Text, Up: Bindable Readline Commands Killing And Yanking -................... +------------------- `kill-line (C-k)' Kill the text from the current cursor position to the end of the line. -`backward-kill-line ()' - Kill backward to the beginning of the line. This is normally - unbound. +`backward-kill-line (C-x Rubout)' + Kill backward to the beginning of the line. + +`unix-line-discard (C-u)' + Kill backward from the cursor to the beginning of the current line. + The killed text is saved on the kill-ring. + +`kill-whole-line ()' + Kill all characters on the current line, no matter where the + cursor is. By default, this is unbound. `kill-word (M-d)' Kill from the cursor to the end of the current word, or if between - words, to the end of the next word. + words, to the end of the next word. Word boundaries are the same + as `forward-word'. `backward-kill-word (M-DEL)' - Kill the word behind the cursor. - -`unix-line-discard (C-u)' - Do what C-u used to do in Unix line input. We save the killed - text on the kill-ring, though. + Kill the word behind the cursor. Word boundaries are the same as + `backward-word'. `unix-word-rubout (C-w)' - Do what C-w used to do in Unix line input. The killed text is - saved on the kill-ring. This is different than - backward-kill-word because the word boundaries differ. + Kill the word behind the cursor, using white space as a word + boundary. The killed text is saved on the kill-ring. + +`delete-horizontal-space ()' + Delete all spaces and tabs around point. By default, this is + unbound. + +`kill-region ()' + Kill the text between the point and the *mark* (saved cursor + position). This text is referred to as the REGION. By default, + this command is unbound. + +`copy-region-as-kill ()' + Copy the text in the region to the kill buffer, so it can be yanked + right away. By default, this command is unbound. + +`copy-backward-word ()' + Copy the word before point to the kill buffer. The word + boundaries are the same as `backward-word'. By default, this + command is unbound. + +`copy-forward-word ()' + Copy the word following point to the kill buffer. The word + boundaries are the same as `forward-word'. By default, this + command is unbound. `yank (C-y)' - Yank the top of the kill ring into the buffer at point. + Yank the top of the kill ring into the buffer at the current + cursor position. `yank-pop (M-y)' Rotate the kill-ring, and yank the new top. You can only do this if the prior command is yank or yank-pop.  -File: readline.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Readline Init Syntax +File: readline.info, Node: Numeric Arguments, Next: Commands For Completion, Prev: Commands For Killing, Up: Bindable Readline Commands Specifying Numeric Arguments -............................ +---------------------------- `digit-argument (M-0, M-1, ... M--)' - Add this digit to the argument already accumulating, or start a - new argument. M-- starts a negative argument. + Add this digit to the argument already accumulating, or start a new + argument. starts a negative argument. `universal-argument ()' - Do what C-u does in emacs. By default, this is not bound. + This is another way to specify an argument. If this command is + followed by one or more digits, optionally with a leading minus + sign, those digits define the argument. If the command is + followed by digits, executing `universal-argument' again ends the + numeric argument, but is otherwise ignored. As a special case, if + this command is immediately followed by a character that is + neither a digit or minus sign, the argument count for the next + command is multiplied by four. The argument count is initially + one, so executing this function the first time makes the argument + count four, a second time makes the argument count sixteen, and so + on. By default, this is not bound to a key.  -File: readline.info, Node: Commands For Completion, Next: Miscellaneous Commands, Prev: Numeric Arguments, Up: Readline Init Syntax +File: readline.info, Node: Commands For Completion, Next: Keyboard Macros, Prev: Numeric Arguments, Up: Bindable Readline Commands Letting Readline Type For You -............................. +----------------------------- `complete (TAB)' - Attempt to do completion on the text before point. This is - implementation defined. Generally, if you are typing a filename + Attempt to do completion on the text before the cursor. This is + application-specific. Generally, if you are typing a filename argument, you can do filename completion; if you are typing a - command, you can do command completion, if you are typing in a - symbol to GDB, you can do symbol name completion, if you are - typing in a variable to Bash, you can do variable name - completion... + command, you can do command completion; if you are typing in a + symbol to GDB, you can do symbol name completion; if you are + typing in a variable to Bash, you can do variable name completion, + and so on. `possible-completions (M-?)' - List the possible completions of the text before point. + List the possible completions of the text before the cursor. + +`insert-completions (M-*)' + Insert all completions of the text before point that would have + been generated by `possible-completions'. + +`menu-complete ()' + Similar to `complete', but replaces the word to be completed with + a single match from the list of possible completions. Repeated + execution of `menu-complete' steps through the list of possible + completions, inserting each match in turn. At the end of the list + of completions, the bell is rung and the original text is restored. + An argument of N moves N positions forward in the list of matches; + a negative argument may be used to move backward through the list. + This command is intended to be bound to `TAB', but is unbound by + default. + + +File: readline.info, Node: Keyboard Macros, Next: Miscellaneous Commands, Prev: Commands For Completion, Up: Bindable Readline Commands + +Keyboard Macros +--------------- + +`start-kbd-macro (C-x ()' + Begin saving the characters typed into the current keyboard macro. + +`end-kbd-macro (C-x ))' + Stop saving the characters typed into the current keyboard macro + and save the definition. + +`call-last-kbd-macro (C-x e)' + Re-execute the last keyboard macro defined, by making the + characters in the macro appear as if typed at the keyboard.  -File: readline.info, Node: Miscellaneous Commands, Prev: Commands For Completion, Up: Readline Init Syntax +File: readline.info, Node: Miscellaneous Commands, Prev: Keyboard Macros, Up: Bindable Readline Commands Some Miscellaneous Commands -........................... +--------------------------- `re-read-init-file (C-x C-r)' - Read in the contents of your `~/.inputrc' file, and incorporate - any bindings found there. + Read in the contents of the inputrc file, and incorporate any + bindings or variable assignments found there. `abort (C-g)' - Ding! Stops things. + Abort the current editing command and ring the terminal's bell + (subject to the setting of `bell-style'). -`do-uppercase-version (M-a, M-b, ...)' - Run the command that is bound to your uppercase brother. +`do-uppercase-version (M-a, M-b, M-X, ...)' + If the metafied character X is lowercase, run the command that is + bound to the corresponding uppercase character. `prefix-meta (ESC)' - Make the next character that you type be metafied. This is for - people without a meta key. Typing `ESC f' is equivalent to typing - `M-f'. + Make the next character typed be metafied. This is for keyboards + without a meta key. Typing `ESC f' is equivalent to typing `M-f'. -`undo (C-_)' +`undo (C-_, C-x C-u)' Incremental undo, separately remembered for each line. `revert-line (M-r)' - Undo all changes made to this line. This is like typing the + Undo all changes made to this line. This is like executing the `undo' command enough times to get back to the beginning. +`tilde-expand (M-~)' + Perform tilde expansion on the current word. + +`set-mark (C-@)' + Set the mark to the current point. If a numeric argument is + supplied, the mark is set to that position. + +`exchange-point-and-mark (C-x C-x)' + Swap the point with the mark. The current cursor position is set + to the saved position, and the old cursor position is saved as the + mark. + +`character-search (C-])' + A character is read and point is moved to the next occurrence of + that character. A negative count searches for previous + occurrences. + +`character-search-backward (M-C-])' + A character is read and point is moved to the previous occurrence + of that character. A negative count searches for subsequent + occurrences. + +`insert-comment (M-#)' + The value of the `comment-begin' variable is inserted at the + beginning of the current line, and the line is accepted as if a + newline had been typed. + +`dump-functions ()' + Print all of the functions and their key bindings to the Readline + output stream. If a numeric argument is supplied, the output is + formatted in such a way that it can be made part of an INPUTRC + file. This command is unbound by default. + +`dump-variables ()' + Print all of the settable variables and their values to the + Readline output stream. If a numeric argument is supplied, the + output is formatted in such a way that it can be made part of an + INPUTRC file. This command is unbound by default. + +`dump-macros ()' + Print all of the Readline key sequences bound to macros and the + strings they ouput. If a numeric argument is supplied, the output + is formatted in such a way that it can be made part of an INPUTRC + file. This command is unbound by default. +  -File: readline.info, Node: Readline Vi Mode, Prev: Readline Init Syntax, Up: Readline Init File +File: readline.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing -Readline Vi Mode ----------------- +Readline vi Mode +================ - While the Readline library does not have a full set of Vi editing + While the Readline library does not have a full set of `vi' editing functions, it does contain enough to allow simple editing of the line. +The Readline `vi' mode behaves as specified in the POSIX 1003.2 +standard. - In order to switch interactively between Emacs and Vi editing -modes, use the command M-C-j (toggle-editing-mode). + In order to switch interactively between `emacs' and `vi' editing +modes, use the command M-C-j (toggle-editing-mode). The Readline +default is `emacs' mode. - When you enter a line in Vi mode, you are already placed in -`insertion' mode, as if you had typed an `i'. Pressing ESC switches -you into `edit' mode, where you can edit the text of the line with the -standard Vi movement keys, move to previous history lines with `k', -and following lines with `j', and so forth. + When you enter a line in `vi' mode, you are already placed in +`insertion' mode, as if you had typed an `i'. Pressing switches +you into `command' mode, where you can edit the text of the line with +the standard `vi' movement keys, move to previous history lines with +`k' and subsequent lines with `j', and so forth. This document describes the GNU Readline Library, a utility for aiding in the consitency of user interface across discrete programs that need to provide a command line interface. - Copyright (C) 1988 Free Software Foundation, Inc. + Copyright (C) 1988, 1994, 1996 Free Software Foundation, Inc. - Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -pare preserved on all copies. + Permission is granted to make and distribute verbatim copies of this +manual provided the copyright notice and this permission notice pare +preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that @@ -612,75 +1144,75 @@ File: readline.info, Node: Programming with GNU Readline, Next: Concept Index, Programming with GNU Readline ***************************** - This manual describes the interface between the GNU Readline -Library and user programs. If you are a programmer, and you wish to -include the features found in GNU Readline in your own programs, such -as completion, line editing, and interactive history manipulation, -this documentation is for you. + This chapter describes the interface between the GNU Readline +Library and other programs. If you are a programmer, and you wish to +include the features found in GNU Readline such as completion, line +editing, and interactive history manipulation in your own programs, +this section is for you. * Menu: -* Default Behaviour:: Using the default behaviour of Readline. +* Basic Behavior:: Using the default behavior of Readline. * Custom Functions:: Adding your own functions to Readline. +* Readline Variables:: Variables accessible to custom + functions. +* Readline Convenience Functions:: Functions which Readline supplies to + aid in writing your own * Custom Completers:: Supplanting or supplementing Readline's completion functions.  -File: readline.info, Node: Default Behaviour, Next: Custom Functions, Up: Programming with GNU Readline +File: readline.info, Node: Basic Behavior, Next: Custom Functions, Up: Programming with GNU Readline -Default Behaviour -================= +Basic Behavior +============== Many programs provide a command line interface, such as `mail', `ftp', and `sh'. For such programs, the default behaviour of Readline is sufficient. This section describes how to use Readline in the -simplest way possible, perhaps to replace calls in your code to `gets -()'. +simplest way possible, perhaps to replace calls in your code to +`gets()' or `fgets ()'. - The function `readline' prints a prompt and then reads and returns -a single line of text from the user. The line which `readline ()' -returns is allocated with `malloc ()'; you should `free ()' the line -when you are done with it. The declaration for `readline' in ANSI C is + The function `readline ()' prints a prompt and then reads and returns +a single line of text from the user. The line `readline' returns is +allocated with `malloc ()'; you should `free ()' the line when you are +done with it. The declaration for `readline' in ANSI C is `char *readline (char *PROMPT);' - So, one might say - +So, one might say `char *line = readline ("Enter a line: ");' - in order to read a line of text from the user. - - The line which is returned has the final newline removed, so only -the text of the line remains. +in order to read a line of text from the user. The line returned has +the final newline removed, so only the text remains. - If readline encounters an `EOF' while reading the line, and the -line is empty at that point, then `(char *)NULL' is returned. -Otherwise, the line is ended just as if a newline was typed. + If `readline' encounters an `EOF' while reading the line, and the +line is empty at that point, then `(char *)NULL' is returned. +Otherwise, the line is ended just as if a newline had been typed. - If you want the user to be able to get at the line later, (with C-p -for example), you must call `add_history ()' to save the line away in -a "history" list of such lines. + If you want the user to be able to get at the line later, (with + for example), you must call `add_history ()' to save the line +away in a "history" list of such lines. `add_history (line)'; - For full details on the GNU History Library, see the associated -manual. +For full details on the GNU History Library, see the associated manual. - It is polite to avoid saving empty lines on the history list, since -it is rare than someone has a burning need to reuse a blank line. -Here is a function which usefully replaces the standard `gets ()' -library function: + It is preferable to avoid saving empty lines on the history list, +since users rarely have a burning need to reuse a blank line. Here is +a function which usefully replaces the standard `gets ()' library +function, and has the advantage of no static buffer to overflow: /* A static variable for holding the line. */ static char *line_read = (char *)NULL; /* Read a string, and return a pointer to it. Returns NULL on EOF. */ char * - do_gets () + rl_gets () { /* If the buffer has already been allocated, return the memory to the free pool. */ - if (line_read != (char *)NULL) + if (line_read) { free (line_read); line_read = (char *)NULL; @@ -696,58 +1228,53 @@ library function: return (line_read); } - The above code gives the user the default behaviour of TAB -completion: completion on file names. If you do not want readline to -complete on filenames, you can change the binding of the TAB key with + This function gives the user the default behaviour of +completion: completion on file names. If you do not want Readline to +complete on filenames, you can change the binding of the key with `rl_bind_key ()'. - `int rl_bind_key (int KEY, (int (*)())FUNCTION);' + `int rl_bind_key (int KEY, int (*FUNCTION)());' - `rl_bind_key ()' takes 2 arguments; KEY is the character that you -want to bind, and FUNCTION is the address of the function to run when -KEY is pressed. Binding TAB to `rl_insert ()' makes TAB just insert -itself. - - `rl_bind_key ()' returns non-zero if KEY is not a valid ASCII + `rl_bind_key ()' takes two arguments: KEY is the character that you +want to bind, and FUNCTION is the address of the function to call when +KEY is pressed. Binding to `rl_insert ()' makes insert +itself. `rl_bind_key ()' returns non-zero if KEY is not a valid ASCII character code (between 0 and 255). + Thus, to disable the default behavior, the following suffices: `rl_bind_key ('\t', rl_insert);' This code should be executed once at the start of your program; you might write a function called `initialize_readline ()' which performs this and other desired initializations, such as installing custom -completers, etc. +completers (*note Custom Completers::.).  -File: readline.info, Node: Custom Functions, Next: Custom Completers, Prev: Default Behaviour, Up: Programming with GNU Readline +File: readline.info, Node: Custom Functions, Next: Readline Variables, Prev: Basic Behavior, Up: Programming with GNU Readline Custom Functions ================ - Readline provides a great many functions for manipulating the text -of the line. But it isn't possible to anticipate the needs of all -programs. This section describes the various functions and variables -defined in within the Readline library which allow a user program to -add customized functionality to Readline. + Readline provides many functions for manipulating the text of the +line, but it isn't possible to anticipate the needs of all programs. +This section describes the various functions and variables defined +within the Readline library which allow a user program to add +customized functionality to Readline. * Menu: * The Function Type:: C declarations to make code readable. -* Function Naming:: How to give a function you write a name. -* Keymaps:: Making keymaps. -* Binding Keys:: Changing Keymaps. * Function Writing:: Variables and calling conventions. -* Allowing Undoing:: How to make your functions undoable.  -File: readline.info, Node: The Function Type, Next: Function Naming, Up: Custom Functions +File: readline.info, Node: The Function Type, Next: Function Writing, Up: Custom Functions The Function Type ----------------- - For the sake of readabilty, we declare a new type of object, called -"Function". A `Function' is a C language function which returns an -`int'. The type declaration for `Function' is: + For readabilty, we declare a new type of object, called "Function". +A `Function' is a C function which returns an `int'. The type +declaration for `Function' is: `typedef int Function ();' @@ -758,12 +1285,148 @@ C declaration `int (*)()func;' - we have +we may write `Function *func;' +Similarly, there are + + typedef void VFunction (); + typedef char *CPFunction (); and + typedef char **CPPFunction (); + +for functions returning no value, `pointer to char', and `pointer to +pointer to char', respectively. +  -File: readline.info, Node: Function Naming, Next: Keymaps, Prev: The Function Type, Up: Custom Functions +File: readline.info, Node: Function Writing, Prev: The Function Type, Up: Custom Functions + +Writing a New Function +---------------------- + + In order to write new functions for Readline, you need to know the +calling conventions for keyboard-invoked functions, and the names of the +variables that describe the current state of the line read so far. + + The calling sequence for a command `foo' looks like + + `foo (int count, int key)' + +where COUNT is the numeric argument (or 1 if defaulted) and KEY is the +key that invoked this function. + + It is completely up to the function as to what should be done with +the numeric argument. Some functions use it as a repeat count, some as +a flag, and others to choose alternate behavior (refreshing the current +line as opposed to refreshing the screen, for example). Some choose to +ignore it. In general, if a function uses the numeric argument as a +repeat count, it should be able to do something useful with both +negative and positive arguments. At the very least, it should be aware +that it can be passed a negative argument. + + +File: readline.info, Node: Readline Variables, Next: Readline Convenience Functions, Prev: Custom Functions, Up: Programming with GNU Readline + +Readline Variables +================== + + These variables are available to function writers. + + - Variable: char * rl_line_buffer + This is the line gathered so far. You are welcome to modify the + contents of the line, but see *Note Allowing Undoing::. + + - Variable: int rl_point + The offset of the current cursor position in `rl_line_buffer' (the + *point*). + + - Variable: int rl_end + The number of characters present in `rl_line_buffer'. When + `rl_point' is at the end of the line, `rl_point' and `rl_end' are + equal. + + - Variable: int rl_mark + The mark (saved position) in the current line. If set, the mark + and point define a *region*. + + - Variable: int rl_done + Setting this to a non-zero value causes Readline to return the + current line immediately. + + - Variable: int rl_pending_input + Setting this to a value makes it the next keystroke read. This is + a way to stuff a single character into the input stream. + + - Variable: char * rl_prompt + The prompt Readline uses. This is set from the argument to + `readline ()', and should not be assigned to directly. + + - Variable: char * rl_library_version + The version number of this revision of the library. + + - Variable: char * rl_terminal_name + The terminal type, used for initialization. + + - Variable: char * rl_readline_name + This variable is set to a unique name by each application using + Readline. The value allows conditional parsing of the inputrc file + (*note Conditional Init Constructs::.). + + - Variable: FILE * rl_instream + The stdio stream from which Readline reads input. + + - Variable: FILE * rl_outstream + The stdio stream to which Readline performs output. + + - Variable: Function * rl_startup_hook + If non-zero, this is the address of a function to call just before + `readline' prints the first prompt. + + - Variable: Function * rl_event_hook + If non-zero, this is the address of a function to call periodically + when readline is waiting for terminal input. + + - Variable: Function * rl_getc_function + If non-zero, `readline' will call indirectly through this pointer + to get a character from the input stream. By default, it is set to + `rl_getc', the default `readline' character input function (*note + Utility Functions::.). + + - Variable: VFunction * rl_redisplay_function + If non-zero, `readline' will call indirectly through this pointer + to update the display with the current contents of the editing + buffer. By default, it is set to `rl_redisplay', the default + `readline' redisplay function (*note Redisplay::.). + + - Variable: Keymap rl_executing_keymap + This variable is set to the keymap (*note Keymaps::.) in which the + currently executing readline function was found. + + - Variable: Keymap rl_binding_keymap + This variable is set to the keymap (*note Keymaps::.) in which the + last key binding occurred. + + +File: readline.info, Node: Readline Convenience Functions, Next: Custom Completers, Prev: Readline Variables, Up: Programming with GNU Readline + +Readline Convenience Functions +============================== + +* Menu: + +* Function Naming:: How to give a function you write a name. +* Keymaps:: Making keymaps. +* Binding Keys:: Changing Keymaps. +* Associating Function Names and Bindings:: Translate function names to + key sequences. +* Allowing Undoing:: How to make your functions undoable. +* Redisplay:: Functions to control line display. +* Modifying Text:: Functions to modify `rl_line_buffer'. +* Utility Functions:: Generally useful functions and hooks. +* Alternate Interface:: Using Readline in a `callback' fashion. + + +File: readline.info, Node: Function Naming, Next: Keymaps, Up: Readline Convenience Functions Naming a Function ----------------- @@ -775,179 +1438,394 @@ the function. Thus, in an init file, one might find Meta-Rubout: backward-kill-word - This binds the keystroke Meta-Rubout to the function + This binds the keystroke to the function *descriptively* named `backward-kill-word'. You, as the programmer, -should bind the functions you write to descriptive names as well. +should bind the functions you write to descriptive names as well. Readline provides a function for doing that: - * Function: rl_add_defun (CHAR *NAME, FUNCTION *FUNCTION, INT KEY) + - Function: int rl_add_defun (char *name, Function *function, int key) Add NAME to the list of named functions. Make FUNCTION be the function that gets called. If KEY is not -1, then bind it to FUNCTION using `rl_bind_key ()'. - Using this function alone is sufficient for most applications. It -is the recommended way to add a few functions to the default functions -that Readline has built in already. If you need to do more or -different things than adding a function to Readline, you may need to -use the underlying functions described below. + Using this function alone is sufficient for most applications. It is +the recommended way to add a few functions to the default functions that +Readline has built in. If you need to do something other than adding a +function to Readline, you may need to use the underlying functions +described below.  -File: readline.info, Node: Keymaps, Next: Binding Keys, Prev: Function Naming, Up: Custom Functions +File: readline.info, Node: Keymaps, Next: Binding Keys, Prev: Function Naming, Up: Readline Convenience Functions Selecting a Keymap ------------------ Key bindings take place on a "keymap". The keymap is the association between the keys that the user types and the functions that -get run. You can make your own keymaps, copy existing keymaps, and -tell Readline which keymap to use. +get run. You can make your own keymaps, copy existing keymaps, and tell +Readline which keymap to use. - * Function: Keymap rl_make_bare_keymap () + - Function: Keymap rl_make_bare_keymap () Returns a new, empty keymap. The space for the keymap is allocated with `malloc ()'; you should `free ()' it when you are done. - * Function: Keymap rl_copy_keymap (KEYMAP MAP) + - Function: Keymap rl_copy_keymap (Keymap map) Return a new keymap which is a copy of MAP. - * Function: Keymap rl_make_keymap () + - Function: Keymap rl_make_keymap () Return a new keymap with the printing characters bound to rl_insert, the lowercase Meta characters bound to run their equivalents, and the Meta digits bound to produce numeric arguments. + - Function: void rl_discard_keymap (Keymap keymap) + Free the storage associated with KEYMAP. + + Readline has several internal keymaps. These functions allow you to +change which keymap is active. + + - Function: Keymap rl_get_keymap () + Returns the currently active keymap. + + - Function: void rl_set_keymap (Keymap keymap) + Makes KEYMAP the currently active keymap. + + - Function: Keymap rl_get_keymap_by_name (char *name) + Return the keymap matching NAME. NAME is one which would be + supplied in a `set keymap' inputrc line (*note Readline Init + File::.). + + - Function: char * rl_get_keymap_name (Keymap keymap) + Return the name matching KEYMAP. NAME is one which would be + supplied in a `set keymap' inputrc line (*note Readline Init + File::.). +  -File: readline.info, Node: Binding Keys, Next: Function Writing, Prev: Keymaps, Up: Custom Functions +File: readline.info, Node: Binding Keys, Next: Associating Function Names and Bindings, Prev: Keymaps, Up: Readline Convenience Functions Binding Keys ------------ - You associate keys with functions through the keymap. Here are -functions for doing that. + You associate keys with functions through the keymap. Readline has +several internal keymaps: `emacs_standard_keymap', `emacs_meta_keymap', +`emacs_ctlx_keymap', `vi_movement_keymap', and `vi_insertion_keymap'. +`emacs_standard_keymap' is the default, and the examples in this manual +assume that. - * Function: int rl_bind_key (INT KEY, FUNCTION *FUNCTION) - Binds KEY to FUNCTION in the currently selected keymap. Returns + These functions manage key bindings. + + - Function: int rl_bind_key (int key, Function *function) + Binds KEY to FUNCTION in the currently active keymap. Returns non-zero in the case of an invalid KEY. - * Function: int rl_bind_key_in_map (INT KEY, FUNCTION *FUNCTION, - KEYMAP MAP) + - Function: int rl_bind_key_in_map (int key, Function *function, + Keymap map) Bind KEY to FUNCTION in MAP. Returns non-zero in the case of an invalid KEY. - * Function: int rl_unbind_key (INT KEY) - Make KEY do nothing in the currently selected keymap. Returns - non-zero in case of error. + - Function: int rl_unbind_key (int key) + Bind KEY to the null function in the currently active keymap. + Returns non-zero in case of error. + + - Function: int rl_unbind_key_in_map (int key, Keymap map) + Bind KEY to the null function in MAP. Returns non-zero in case of + error. - * Function: int rl_unbind_key_in_map (INT KEY, KEYMAP MAP) - Make KEY be bound to the null function in MAP. Returns non-zero - in case of error. + - Function: int rl_unbind_function_in_map (Function *function, Keymap + map) + Unbind all keys that execute FUNCTION in MAP. - * Function: rl_generic_bind (INT TYPE, CHAR *KEYSEQ, CHAR *DATA, - KEYMAP MAP) + - Function: int rl_unbind_command_in_map (char *command, Keymap map) + Unbind all keys that are bound to COMMAND in MAP. + + - Function: int rl_generic_bind (int type, char *keyseq, char *data, + Keymap map) Bind the key sequence represented by the string KEYSEQ to the - arbitrary pointer DATA. TYPE says what kind of data is pointed - to by DATA; right now this can be a function (`ISFUNC'), a macro - (`ISMACR'), or a keymap (`ISKMAP'). This makes new keymaps as - necessary. The initial place to do bindings is in MAP. + arbitrary pointer DATA. TYPE says what kind of data is pointed to + by DATA; this can be a function (`ISFUNC'), a macro (`ISMACR'), or + a keymap (`ISKMAP'). This makes new keymaps as necessary. The + initial keymap in which to do bindings is MAP. - -File: readline.info, Node: Function Writing, Next: Allowing Undoing, Prev: Binding Keys, Up: Custom Functions + - Function: int rl_parse_and_bind (char *line) + Parse LINE as if it had been read from the `inputrc' file and + perform any key bindings and variable assignments found (*note + Readline Init File::.). -Writing a New Function ----------------------- + - Function: int rl_read_init_file (char *filename) + Read keybindings and variable assignments from FILENAME (*note + Readline Init File::.). - In order to write new functions for Readline, you need to know the -calling conventions for keyboard invoked functions, and the names of -the variables that describe the current state of the line gathered so -far. + +File: readline.info, Node: Associating Function Names and Bindings, Next: Allowing Undoing, Prev: Binding Keys, Up: Readline Convenience Functions - * Variable: char *rl_line_buffer - This is the line gathered so far. You are welcome to modify the - contents of this, but see Undoing, below. +Associating Function Names and Bindings +--------------------------------------- - * Variable: int rl_point - The offset of the current cursor position in RL_LINE_BUFFER. + These functions allow you to find out what keys invoke named +functions and the functions invoked by a particular key sequence. - * Variable: int rl_end - The number of characters present in `rl_line_buffer'. When - `rl_point' is at the end of the line, then `rl_point' and - `rl_end' are equal. + - Function: Function * rl_named_function (char *name) + Return the function with name NAME. - The calling sequence for a command `foo' looks like + - Function: Function * rl_function_of_keyseq (char *keyseq, Keymap + map, int *type) + Return the function invoked by KEYSEQ in keymap MAP. If MAP is + NULL, the current keymap is used. If TYPE is not NULL, the type + of the object is returned in it (one of `ISFUNC', `ISKMAP', or + `ISMACR'). - `foo (int count, int key)' + - Function: char ** rl_invoking_keyseqs (Function *function) + Return an array of strings representing the key sequences used to + invoke FUNCTION in the current keymap. - where COUNT is the numeric argument (or 1 if defaulted) and KEY is -the key that invoked this function. + - Function: char ** rl_invoking_keyseqs_in_map (Function *function, + Keymap map) + Return an array of strings representing the key sequences used to + invoke FUNCTION in the keymap MAP. - It is completely up to the function as to what should be done with -the numeric argument; some functions use it as a repeat count, other -functions as a flag, and some choose to ignore it. In general, if a -function uses the numeric argument as a repeat count, it should be able -to do something useful with a negative argument as well as a positive -argument. At the very least, it should be aware that it can be passed -a negative argument. + - Function: void rl_function_dumper (int readable) + Print the readline function names and the key sequences currently + bound to them to `rl_outstream'. If READABLE is non-zero, the + list is formatted in such a way that it can be made part of an + `inputrc' file and re-read. + + - Function: void rl_list_funmap_names () + Print the names of all bindable Readline functions to + `rl_outstream'.  -File: readline.info, Node: Allowing Undoing, Prev: Function Writing, Up: Custom Functions +File: readline.info, Node: Allowing Undoing, Next: Redisplay, Prev: Associating Function Names and Bindings, Up: Readline Convenience Functions Allowing Undoing ---------------- - Supporting the undo command is a painless thing to do, and makes -your functions much more useful to the end user. It is certainly easy -to try something if you know you can undo it. I could use an undo -function for the stock market. + Supporting the undo command is a painless thing, and makes your +functions much more useful. It is certainly easy to try something if +you know you can undo it. I could use an undo function for the stock +market. - If your function simply inserts text once, or deletes text once, -and it calls `rl_insert_text ()' or `rl_delete_text ()' to do it, then -undoing is already done for you automatically, and you can safely skip -this section. + If your function simply inserts text once, or deletes text once, and +uses `rl_insert_text ()' or `rl_delete_text ()' to do it, then undoing +is already done for you automatically. If you do multiple insertions or multiple deletions, or any combination of these operations, you should group them together into -one operation. This can be done with `rl_begin_undo_group ()' and +one operation. This is done with `rl_begin_undo_group ()' and `rl_end_undo_group ()'. - * Function: rl_begin_undo_group () + The types of events that can be undone are: + + enum undo_code { UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END }; + + Notice that `UNDO_DELETE' means to insert some text, and +`UNDO_INSERT' means to delete some text. That is, the undo code tells +undo what to undo, not how to undo it. `UNDO_BEGIN' and `UNDO_END' are +tags added by `rl_begin_undo_group ()' and `rl_end_undo_group ()'. + + - Function: int rl_begin_undo_group () Begins saving undo information in a group construct. The undo information usually comes from calls to `rl_insert_text ()' and - `rl_delete_text ()', but they could be direct calls to + `rl_delete_text ()', but could be the result of calls to `rl_add_undo ()'. - * Function: rl_end_undo_group () + - Function: int rl_end_undo_group () Closes the current undo group started with `rl_begin_undo_group - ()'. There should be exactly one call to `rl_end_undo_group ()' - for every call to `rl_begin_undo_group ()'. + ()'. There should be one call to `rl_end_undo_group ()' for each + call to `rl_begin_undo_group ()'. + + - Function: void rl_add_undo (enum undo_code what, int start, int end, + char *text) + Remember how to undo an event (according to WHAT). The affected + text runs from START to END, and encompasses TEXT. + + - Function: void free_undo_list () + Free the existing undo list. + + - Function: int rl_do_undo () + Undo the first thing on the undo list. Returns `0' if there was + nothing to undo, non-zero if something was undone. Finally, if you neither insert nor delete text, but directly modify -the existing text (e.g. change its case), you call `rl_modifying ()' -once, just before you modify the text. You must supply the indices of -the text range that you are going to modify. +the existing text (e.g., change its case), call `rl_modifying ()' once, +just before you modify the text. You must supply the indices of the +text range that you are going to modify. - * Function: rl_modifying (INT START, INT END) + - Function: int rl_modifying (int start, int end) Tell Readline to save the text between START and END as a single - undo unit. It is assumed that subsequent to this call you will - modify that range of text in some way. + undo unit. It is assumed that you will subsequently modify that + text. + + +File: readline.info, Node: Redisplay, Next: Modifying Text, Prev: Allowing Undoing, Up: Readline Convenience Functions + +Redisplay +--------- + + - Function: void rl_redisplay () + Change what's displayed on the screen to reflect the current + contents of `rl_line_buffer'. + + - Function: int rl_forced_update_display () + Force the line to be updated and redisplayed, whether or not + Readline thinks the screen display is correct. + + - Function: int rl_on_new_line () + Tell the update routines that we have moved onto a new (empty) + line, usually after ouputting a newline. + + - Function: int rl_reset_line_state () + Reset the display state to a clean state and redisplay the current + line starting on a new line. + + - Function: int rl_message (va_alist) + The arguments are a string as would be supplied to `printf'. The + resulting string is displayed in the "echo area". The echo area + is also used to display numeric arguments and search strings. + + - Function: int rl_clear_message () + Clear the message in the echo area. + + +File: readline.info, Node: Modifying Text, Next: Utility Functions, Prev: Redisplay, Up: Readline Convenience Functions + +Modifying Text +-------------- + + - Function: int rl_insert_text (char *text) + Insert TEXT into the line at the current cursor position. + + - Function: int rl_delete_text (int start, int end) + Delete the text between START and END in the current line. + + - Function: char * rl_copy_text (int start, int end) + Return a copy of the text between START and END in the current + line. + + - Function: int rl_kill_text (int start, int end) + Copy the text between START and END in the current line to the + kill ring, appending or prepending to the last kill if the last + command was a kill command. The text is deleted. If START is + less than END, the text is appended, otherwise prepended. If the + last command was not a kill, a new kill ring slot is used. + + +File: readline.info, Node: Utility Functions, Next: Alternate Interface, Prev: Modifying Text, Up: Readline Convenience Functions + +Utility Functions +----------------- + + - Function: int rl_read_key () + Return the next character available. This handles input inserted + into the input stream via PENDING INPUT (*note Readline + Variables::.) and `rl_stuff_char ()', macros, and characters read + from the keyboard. + + - Function: int rl_getc (FILE *) + Return the next character available from the keyboard. + + - Function: int rl_stuff_char (int c) + Insert C into the Readline input stream. It will be "read" before + Readline attempts to read characters from the terminal with + `rl_read_key ()'. + + - Function: rl_extend_line_buffer (int len) + Ensure that `rl_line_buffer' has enough space to hold LEN + characters, possibly reallocating it if necessary. + + - Function: int rl_initialize () + Initialize or re-initialize Readline's internal state. + + - Function: int rl_reset_terminal (char *terminal_name) + Reinitialize Readline's idea of the terminal settings using + TERMINAL_NAME as the terminal type (e.g., `vt100'). + + - Function: int alphabetic (int c) + Return 1 if C is an alphabetic character. + + - Function: int numeric (int c) + Return 1 if C is a numeric character. + + - Function: int ding () + Ring the terminal bell, obeying the setting of `bell-style'. + + The following are implemented as macros, defined in `chartypes.h'. + + - Function: int uppercase_p (int c) + Return 1 if C is an uppercase alphabetic character. + + - Function: int lowercase_p (int c) + Return 1 if C is a lowercase alphabetic character. + + - Function: int digit_p (int c) + Return 1 if C is a numeric character. + + - Function: int to_upper (int c) + If C is a lowercase alphabetic character, return the corresponding + uppercase character. + + - Function: int to_lower (int c) + If C is an uppercase alphabetic character, return the corresponding + lowercase character. + + - Function: int digit_value (int c) + If C is a number, return the value it represents. + + +File: readline.info, Node: Alternate Interface, Prev: Utility Functions, Up: Readline Convenience Functions + +Alternate Interface +------------------- + + An alternate interface is available to plain `readline()'. Some +applications need to interleave keyboard I/O with file, device, or +window system I/O, typically by using a main loop to `select()' on +various file descriptors. To accomodate this need, readline can also +be invoked as a `callback' function from an event loop. There are +functions available to make this easy. + + - Function: void rl_callback_handler_install (char *prompt, Vfunction + *lhandler) + Set up the terminal for readline I/O and display the initial + expanded value of PROMPT. Save the value of LHANDLER to use as a + callback when a complete line of input has been entered. + + - Function: void rl_callback_read_char () + Whenever an application determines that keyboard input is + available, it should call `rl_callback_read_char()', which will + read the next character from the current input source. If that + character completes the line, `rl_callback_read_char' will invoke + the LHANDLER function saved by `rl_callback_handler_install' to + process the line. `EOF' is indicated by calling LHANDLER with a + `NULL' line. + + - Function: void rl_callback_handler_remove () + Restore the terminal to its initial state and remove the line + handler. This may be called from within a callback as well as + independently. An Example ---------- - Here is a function which changes lowercase characters to the -uppercase equivalents, and uppercase characters to the lowercase -equivalents. If this function was bound to `M-c', then typing `M-c' -would change the case of the character under point. Typing `10 M-c' -would change the case of the following 10 characters, leaving the -cursor on the last character changed. + Here is a function which changes lowercase characters to their +uppercase equivalents, and uppercase characters to lowercase. If this +function was bound to `M-c', then typing `M-c' would change the case of +the character under point. Typing `M-1 0 M-c' would change the case of +the following 10 characters, leaving the cursor on the last character +changed. /* Invert the case of the COUNT following characters. */ + int invert_case_line (count, key) int count, key; { - register int start, end; + register int start, end, i; start = rl_point; + if (rl_point >= rl_end) + return (0); + if (count < 0) { direction = -1; @@ -963,7 +1841,10 @@ cursor on the last character changed. if (end > rl_end) end = rl_end; else if (end < 0) - end = -1; + end = 0; + + if (start == end) + return (0); if (start > end) { @@ -972,35 +1853,33 @@ cursor on the last character changed. end = temp; } - if (start == end) - return; - - /* Tell readline that we are modifying the line, so save the undo - information. */ + /* Tell readline that we are modifying the line, so it will save + the undo information. */ rl_modifying (start, end); - for (; start != end; start += direction) + for (i = start; i != end; i++) { - if (uppercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = to_lower (rl_line_buffer[start]); - else if (lowercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = to_upper (rl_line_buffer[start]); + if (uppercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = to_lower (rl_line_buffer[i]); + else if (lowercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = to_upper (rl_line_buffer[i]); } /* Move point to on top of the last character changed. */ - rl_point = end - direction; + rl_point = (direction == 1) ? end - 1 : start; + return (0); }  -File: readline.info, Node: Custom Completers, Prev: Custom Functions, Up: Programming with GNU Readline +File: readline.info, Node: Custom Completers, Prev: Readline Convenience Functions, Up: Programming with GNU Readline Custom Completers ================= Typically, a program that reads commands from the user has a way of -disambiguating commands and data. If your program is one of these, -then it can provide completion for either commands, or data, or both -commands and data. The following sections describe how your program -and Readline cooperate to provide this service to end users. +disambiguating commands and data. If your program is one of these, then +it can provide completion for commands, data, or both. The following +sections describe how your program and Readline cooperate to provide +this service. * Menu: @@ -1015,26 +1894,25 @@ File: readline.info, Node: How Completing Works, Next: Completion Functions, How Completing Works -------------------- - In order to complete some text, the full list of possible -completions must be available. That is to say, it is not possible to -accurately expand a partial word without knowing what all of the -possible words that make sense in that context are. The GNU Readline -library provides the user interface to completion, and additionally, -two of the most common completion functions; filename and username. -For completing other types of text, you must write your own completion -function. This section describes exactly what those functions must -do, and provides an example function. + In order to complete some text, the full list of possible completions +must be available. That is, it is not possible to accurately expand a +partial word without knowing all of the possible words which make sense +in that context. The Readline library provides the user interface to +completion, and two of the most common completion functions: filename +and username. For completing other types of text, you must write your +own completion function. This section describes exactly what such +functions must do, and provides an example. There are three major functions used to perform completion: 1. The user-interface function `rl_complete ()'. This function is - called interactively with the same calling conventions as other - functions in readline intended for interactive use; i.e. COUNT, - and INVOKING-KEY. It isolates the word to be completed and calls - `completion_matches ()' to generate a list of possible - completions. It then either lists the possible completions or - actually performs the completion, depending on which behaviour is - desired. + called with the same arguments as other Readline functions + intended for interactive use: COUNT and INVOKING_KEY. It + isolates the word to be completed and calls `completion_matches + ()' to generate a list of possible completions. It then either + lists the possible completions, inserts the possible completions, + or actually performs the completion, depending on which behavior + is desired. 2. The internal function `completion_matches ()' uses your "generator" function to generate the list of possible matches, and @@ -1046,27 +1924,28 @@ do, and provides an example function. `completion_matches ()', returning a string each time. The arguments to the generator function are TEXT and STATE. TEXT is the partial word to be completed. STATE is zero the first time - the function is called, and a positive non-zero integer for each + the function is called, allowing the generator to perform any + necessary initialization, and a positive non-zero integer for each subsequent call. When the generator function returns `(char *)NULL' this signals `completion_matches ()' that there are no - more possibilities left. + more possibilities left. Usually the generator function computes + the list of possible completions when STATE is zero, and returns + them one at a time on subsequent calls. Each string the generator + function returns as a match must be allocated with `malloc()'; + Readline frees the strings when it has finished with them. - * Function: rl_complete (INT IGNORE, INT INVOKING_KEY) - Complete the word at or before point. You have supplied the - function that does the initial simple matching selection - algorithm (see `completion_matches ()'). The default is to do - filename completion. - Note that `rl_complete ()' has the identical calling conventions as -any other key-invokable function; this is because by default it is -bound to the `TAB' key. + - Function: int rl_complete (int ignore, int invoking_key) + Complete the word at or before point. You have supplied the + function that does the initial simple matching selection algorithm + (see `completion_matches ()'). The default is to do filename + completion. - * Variable: Function *rl_completion_entry_function - This is a pointer to the generator function for - `completion_matches ()'. If the value of - `rl_completion_entry_function' is `(Function *)NULL' then the - default filename generator function is used, namely - `filename_entry_function ()'. + - Variable: Function * rl_completion_entry_function + This is a pointer to the generator function for `completion_matches + ()'. If the value of `rl_completion_entry_function' is `(Function + *)NULL' then the default filename generator function, + `filename_completion_function ()', is used.  File: readline.info, Node: Completion Functions, Next: Completion Variables, Prev: How Completing Works, Up: Custom Completers @@ -1074,50 +1953,60 @@ File: readline.info, Node: Completion Functions, Next: Completion Variables, Completion Functions -------------------- - Here is the complete list of callable completion functions present -in Readline. + Here is the complete list of callable completion functions present in +Readline. - * Function: rl_complete_internal (INT WHAT_TO_DO) + - Function: int rl_complete_internal (int what_to_do) Complete the word at or before point. WHAT_TO_DO says what to do with the completion. A value of `?' means list the possible completions. `TAB' means do standard completion. `*' means - insert all of the possible completions. + insert all of the possible completions. `!' means to display all + of the possible completions, if there is more than one, as well as + performing partial completion. - * Function: rl_complete (INT IGNORE, INT INVOKING_KEY) + - Function: int rl_complete (int ignore, int invoking_key) Complete the word at or before point. You have supplied the - function that does the initial simple matching selection - algorithm (see `completion_matches ()'). The default is to do - filename completion. This just calls `rl_complete_internal ()' - with an argument of `TAB'. + function that does the initial simple matching selection algorithm + (see `completion_matches ()' and `rl_completion_entry_function'). + The default is to do filename completion. This calls + `rl_complete_internal ()' with an argument depending on + INVOKING_KEY. - * Function: rl_possible_completions () + - Function: int rl_possible_completions (int count, int invoking_key)) List the possible completions. See description of `rl_complete - ()'. This just calls `rl_complete_internal ()' with an argument - of `?'. + ()'. This calls `rl_complete_internal ()' with an argument of `?'. - * Function: char **completion_matches (CHAR *TEXT, CHAR - *(*ENTRY_FUNCTION) ()) + - Function: int rl_insert_completions (int count, int invoking_key)) + Insert the list of possible completions into the line, deleting the + partially-completed word. See description of `rl_complete ()'. + This calls `rl_complete_internal ()' with an argument of `*'. + + - Function: char ** completion_matches (char *text, CPFunction + *entry_func) Returns an array of `(char *)' which is a list of completions for TEXT. If there are no completions, returns `(char **)NULL'. The - first entry in the returned array is the substitution for TEXT. + first entry in the returned array is the substitution for TEXT. The remaining entries are the possible completions. The array is terminated with a `NULL' pointer. - ENTRY_FUNCTION is a function of two args, and returns a `(char - *)'. The first argument is TEXT. The second is a state - argument; it is zero on the first call, and non-zero on subsequent - calls. It returns a `NULL' pointer to the caller when there are + ENTRY_FUNC is a function of two args, and returns a `(char *)'. + The first argument is TEXT. The second is a state argument; it is + zero on the first call, and non-zero on subsequent calls. + ENTRY_FUNC returns a `NULL' pointer to the caller when there are no more matches. - * Function: char *filename_completion_function (CHAR *TEXT, INT STATE) + - Function: char * filename_completion_function (char *text, int state) A generator function for filename completion in the general case. - Note that completion in the Bash shell is a little different - because of all the pathnames that must be followed when looking - up the completion for a command. + Note that completion in Bash is a little different because of all + the pathnames that must be followed when looking up completions + for a command. The Bash source is a useful reference for writing + custom completion functions. - * Function: char *username_completion_function (CHAR *TEXT, INT STATE) + - Function: char * username_completion_function (char *text, int state) A completion generator for usernames. TEXT contains a partial - username preceded by a random character (usually `~'). + username preceded by a random character (usually `~'). As with all + completion generators, STATE is zero on the first call and non-zero + for subsequent calls.  File: readline.info, Node: Completion Variables, Next: A Short Completion Example, Prev: Completion Functions, Up: Custom Completers @@ -1125,58 +2014,138 @@ File: readline.info, Node: Completion Variables, Next: A Short Completion Exam Completion Variables -------------------- - * Variable: Function *rl_completion_entry_function - A pointer to the generator function for `completion_matches ()'. + - Variable: Function * rl_completion_entry_function + A pointer to the generator function for `completion_matches ()'. `NULL' means to use `filename_entry_function ()', the default filename completer. - * Variable: Function *rl_attempted_completion_function + - Variable: CPPFunction * rl_attempted_completion_function A pointer to an alternative function to create matches. The function is called with TEXT, START, and END. START and END are indices in `rl_line_buffer' saying what the boundaries of TEXT - are. If this function exists and returns `NULL' then - `rl_complete ()' will call the value of - `rl_completion_entry_function' to generate matches, otherwise the - array of strings returned will be used. - - * Variable: int rl_completion_query_items + are. If this function exists and returns `NULL', or if this + variable is set to `NULL', then `rl_complete ()' will call the + value of `rl_completion_entry_function' to generate matches, + otherwise the array of strings returned will be used. + + - Variable: CPFunction * rl_filename_quoting_function + A pointer to a function that will quote a filename in an + application- specific fashion. This is called if filename + completion is being attempted and one of the characters in + `rl_filename_quote_characters' appears in a completed filename. + The function is called with TEXT, MATCH_TYPE, and QUOTE_POINTER. + The TEXT is the filename to be quoted. The MATCH_TYPE is either + `SINGLE_MATCH', if there is only one completion match, or + `MULT_MATCH'. Some functions use this to decide whether or not to + insert a closing quote character. The QUOTE_POINTER is a pointer + to any opening quote character the user typed. Some functions + choose to reset this character. + + - Variable: CPFunction * rl_filename_dequoting_function + A pointer to a function that will remove application-specific + quoting characters from a filename before completion is attempted, + so those characters do not interfere with matching the text + against names in the filesystem. It is called with TEXT, the text + of the word to be dequoted, and QUOTE_CHAR, which is the quoting + character that delimits the filename (usually `'' or `"'). If + QUOTE_CHAR is zero, the filename was not in an embedded string. + + - Variable: Function * rl_char_is_quoted_p + A pointer to a function to call that determines whether or not a + specific character in the line buffer is quoted, according to + whatever quoting mechanism the program calling readline uses. The + function is called with two arguments: TEXT, the text of the line, + and INDEX, the index of the character in the line. It is used to + decide whether a character found in + `rl_completer_word_break_characters' should be used to break words + for the completer. + + - Variable: int rl_completion_query_items Up to this many items will be displayed in response to a possible-completions call. After that, we ask the user if she is sure she wants to see them all. The default value is 100. - * Variable: char *rl_basic_word_break_characters - The basic list of characters that signal a break between words - for the completer routine. The contents of this variable is what - breaks words in the Bash shell, i.e. " \t\n\"\\'`@$><=;|&{(". + - Variable: char * rl_basic_word_break_characters + The basic list of characters that signal a break between words for + the completer routine. The default value of this variable is the + characters which break words for completion in Bash, i.e., `" + \t\n\"\\'`@$><=;|&{("'. - * Variable: char *rl_completer_word_break_characters + - Variable: char * rl_basic_quote_characters + List of quote characters which can cause a word break. + + - Variable: char * rl_completer_word_break_characters The list of characters that signal a break between words for - `rl_complete_internal ()'. The default list is the contents of + `rl_complete_internal ()'. The default list is the value of `rl_basic_word_break_characters'. - * Variable: char *rl_special_prefixes - The list of characters that are word break characters, but should - be left in TEXT when it is passed to the completion function. - Programs can use this to help determine what kind of completing - to do. + - Variable: char * rl_completer_quote_characters + List of characters which can be used to quote a substring of the + line. Completion occurs on the entire substring, and within the + substring `rl_completer_word_break_characters' are treated as any + other character, unless they also appear within this list. - * Variable: int rl_ignore_completion_duplicates + - Variable: char * rl_filename_quote_characters + A list of characters that cause a filename to be quoted by the + completer when they appear in a completed filename. The default + is the null string. + + - Variable: char * rl_special_prefixes + The list of characters that are word break characters, but should + be left in TEXT when it is passed to the completion function. + Programs can use this to help determine what kind of completing to + do. For instance, Bash sets this variable to "$@" so that it can + complete shell variables and hostnames. + + - Variable: int rl_completion_append_character + When a single completion alternative matches at the end of the + command line, this character is appended to the inserted + completion text. The default is a space character (` '). Setting + this to the null character (`\0') prevents anything being appended + automatically. This can be changed in custom completion functions + to provide the "most sensible word separator character" according + to an application-specific command line syntax specification. + + - Variable: int rl_ignore_completion_duplicates If non-zero, then disallow duplicates in the matches. Default is 1. - * Variable: int rl_filename_completion_desired - Non-zero means that the results of the matches are to be treated - as filenames. This is *always* zero on entry, and can only be - changed within a completion entry generator function. - - * Variable: Function *rl_ignore_some_completions_function + - Variable: int rl_filename_completion_desired + Non-zero means that the results of the matches are to be treated as + filenames. This is *always* zero on entry, and can only be changed + within a completion entry generator function. If it is set to a + non-zero value, directory names have a slash appended and Readline + attempts to quote completed filenames if they contain any embedded + word break characters. + + - Variable: int rl_filename_quoting_desired + Non-zero means that the results of the matches are to be quoted + using double quotes (or an application-specific quoting mechanism) + if the completed filename contains any characters in + `rl_filename_quote_chars'. This is *always* non-zero on entry, + and can only be changed within a completion entry generator + function. The quoting is effected via a call to the function + pointed to by `rl_filename_quoting_function'. + + - Variable: int rl_inhibit_completion + If this variable is non-zero, completion is inhibit - #include - #include #include #include #include #include + #include + #include + + extern char *getwd (); + extern char *xmalloc (); + /* The names of functions that actually do the manipulation. */ int com_list (), com_view (), com_rename (), com_stat (), com_pwd (); int com_delete (), com_help (), com_cd (), com_quit (); @@ -1210,9 +2182,9 @@ history list. can understand. */ typedef struct { - char *name; /* User printable name of the function. */ - Function *func; /* Function to call to do the job. */ - char *doc; /* Documentation for this function. */ + char *name; /* User printable name of the function. */ + Function *func; /* Function to call to do the job. */ + char *doc; /* Documentation for this function. */ } COMMAND; COMMAND commands[] = { @@ -1230,65 +2202,78 @@ history list. { (char *)NULL, (Function *)NULL, (char *)NULL } }; + /* Forward declarations. */ + char *stripwhite (); + COMMAND *find_command (); + /* The name of this program, as taken from argv[0]. */ char *progname; /* When non-zero, this global means the user is done using this program. */ - int done = 0; + int done; + + char * + dupstr (s) + int s; + { + char *r; + + r = xmalloc (strlen (s) + 1); + strcpy (r, s); + return (r); + } main (argc, argv) int argc; char **argv; { + char *line, *s; + progname = argv[0]; - initialize_readline (); /* Bind our completer. */ + initialize_readline (); /* Bind our completer. */ /* Loop reading and executing lines until the user quits. */ - while (!done) + for ( ; done == 0; ) { - char *line; - line = readline ("FileMan: "); if (!line) - { - done = 1; /* Encountered EOF at top level. */ - } - else - { - /* Remove leading and trailing whitespace from the line. - Then, if there is anything left, add it to the history list - and execute it. */ - stripwhite (line); + break; - if (*line) - { - add_history (line); - execute_line (line); - } + /* Remove leading and trailing whitespace from the line. + Then, if there is anything left, add it to the history list + and execute it. */ + s = stripwhite (line); + + if (*s) + { + add_history (s); + execute_line (s); } - if (line) - free (line); + free (line); } exit (0); } /* Execute a command line. */ + int execute_line (line) char *line; { register int i; - COMMAND *find_command (), *command; + COMMAND *command; char *word; /* Isolate the command word. */ i = 0; - while (line[i] && !whitespace (line[i])) + while (line[i] && whitespace (line[i])) i++; + word = line + i; - word = line; + while (line[i] && !whitespace (line[i])) + i++; if (line[i]) line[i++] = '\0'; @@ -1298,7 +2283,7 @@ history list. if (!command) { fprintf (stderr, "%s: No such command for FileMan.\n", word); - return; + return (-1); } /* Get argument to command, if any. */ @@ -1308,7 +2293,7 @@ history list. word = line + i; /* Call the function. */ - (*(command->func)) (word); + return ((*(command->func)) (word)); } /* Look up NAME as the name of a command, and return a pointer to that @@ -1326,24 +2311,26 @@ history list. return ((COMMAND *)NULL); } - /* Strip whitespace from the start and end of STRING. */ + /* Strip whitespace from the start and end of STRING. Return a pointer + into STRING. */ + char * stripwhite (string) char *string; { - register int i = 0; + register char *s, *t; - while (whitespace (string[i])) - i++; - - if (i) - strcpy (string, string + i); + for (s = string; whitespace (*s); s++) + ; - i = strlen (string) - 1; + if (*s == 0) + return (s); - while (i > 0 && whitespace (string[i])) - i--; + t = s + strlen (s) - 1; + while (t > s && whitespace (*t)) + t--; + *++t = '\0'; - string[++i] = '\0'; + return s; } /* **************************************************************** */ @@ -1352,31 +2339,32 @@ history list. /* */ /* **************************************************************** */ + char *command_generator (); + char **fileman_completion (); + /* Tell the GNU Readline library how to complete. We want to try to complete on command names if this is the first word in the line, or on filenames if not. */ initialize_readline () { - char **fileman_completion (); - /* Allow conditional parsing of the ~/.inputrc file. */ rl_readline_name = "FileMan"; /* Tell the completer that we want a crack first. */ - rl_attempted_completion_function = (Function *)fileman_completion; + rl_attempted_completion_function = (CPPFunction *)fileman_completion; } - /* Attempt to complete on the contents of TEXT. START and END show the - region of TEXT that contains the word to complete. We can use the - entire line in case we want to do some simple parsing. Return the - array of matches, or NULL if there aren't any. */ + /* Attempt to complete on the contents of TEXT. START and END bound the + region of rl_line_buffer that contains the word to complete. TEXT is + the word to complete. We can use the entire contents of rl_line_buffer + in case we want to do some simple parsing. Return the array of matches, + or NULL if there aren't any. */ char ** fileman_completion (text, start, end) char *text; int start, end; { char **matches; - char *command_generator (); matches = (char **)NULL; @@ -1415,7 +2403,7 @@ history list. list_index++; if (strncmp (name, text, len) == 0) - return (name); + return (dupstr(name)); } /* If no names matched, then return NULL. */ @@ -1437,26 +2425,27 @@ history list. char *arg; { if (!arg) - arg = "*"; + arg = ""; sprintf (syscom, "ls -FClg %s", arg); - system (syscom); + return (system (syscom)); } com_view (arg) char *arg; { if (!valid_argument ("view", arg)) - return; + return 1; - sprintf (syscom, "cat %s | more", arg); - system (syscom); + sprintf (syscom, "more %s", arg); + return (system (syscom)); } com_rename (arg) char *arg; { too_dangerous ("rename"); + return (1); } com_stat (arg) @@ -1465,27 +2454,32 @@ history list. struct stat finfo; if (!valid_argument ("stat", arg)) - return; + return (1); if (stat (arg, &finfo) == -1) { perror (arg); - return; + return (1); } printf ("Statistics for `%s':\n", arg); - printf ("%s has %d link%s, and is %d bytes in length.\n", arg, - finfo.st_nlink, (finfo.st_nlink == 1) ? "" : "s", finfo.st_size); - printf (" Created on: %s", ctime (&finfo.st_ctime)); - printf (" Last access at: %s", ctime (&finfo.st_atime)); - printf ("Last modified at: %s", ctime (&finfo.st_mtime)); + printf ("%s has %d link%s, and is %d byte%s in length.\n", arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + finfo.st_size, + (finfo.st_size == 1) ? "" : "s"); + printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); + printf (" Last access at: %s", ctime (&finfo.st_atime)); + printf (" Last modified at: %s", ctime (&finfo.st_mtime)); + return (0); } com_delete (arg) char *arg; { too_dangerous ("delete"); + return (1); } /* Print out help for ARG, or for all of the commands if ARG is @@ -1525,6 +2519,7 @@ history list. if (printed) printf ("\n"); } + return (0); } /* Change to the directory ARG. */ @@ -1532,20 +2527,30 @@ history list. char *arg; { if (chdir (arg) == -1) - perror (arg); + { + perror (arg); + return 1; + } com_pwd (""); + return (0); } /* Print out the current working directory. */ com_pwd (ignore) char *ignore; { - char dir[1024]; + char dir[1024], *s; - (void) getwd (dir); + s = getwd (dir); + if (s == 0) + { + printf ("Error getting pwd: %s\n", dir); + return 1; + } printf ("Current directory is %s\n", dir); + return 0; } /* The user wishes to quit using this program. Just set DONE non-zero. */ @@ -1553,6 +2558,7 @@ history list. char *arg; { done = 1; + return (0); } /* Function which tells you that you can't do this. */ @@ -1587,8 +2593,15 @@ Concept Index * Menu: -* interaction, readline: Readline Interaction. -* readline, function: Default Behaviour. +* command editing: Readline Bare Essentials. +* editing command lines: Readline Bare Essentials. +* initialization file, readline: Readline Init File. +* interaction, readline: Readline Interaction. +* kill ring: Readline Killing Commands. +* killing text: Readline Killing Commands. +* notation, readline: Readline Bare Essentials. +* readline, function: Basic Behavior. +* yanking text: Readline Killing Commands.  File: readline.info, Node: Function and Variable Index, Prev: Concept Index, Up: Top @@ -1598,123 +2611,244 @@ Function and Variable Index * Menu: -* Function *rl_attempted_completion_function: Completion Variables. -* Function *rl_completion_entry_function: Completion Variables. -* Function *rl_completion_entry_function: How Completing Works. -* Function *rl_ignore_some_completions_function: Completion Variables. -* Keymap rl_copy_keymap: Keymaps. -* Keymap rl_make_bare_keymap: Keymaps. -* Keymap rl_make_keymap: Keymaps. -* abort (C-g): Miscellaneous Commands. -* accept-line (Newline, Return): Commands For History. -* backward-char (C-b): Commands For Moving. -* backward-delete-char (Rubout): Commands For Text. -* backward-kill-line (): Commands For Killing. -* backward-kill-word (M-DEL): Commands For Killing. -* backward-word (M-b): Commands For Moving. -* beginning-of-history (M-<): Commands For History. -* beginning-of-line (C-a): Commands For Moving. -* capitalize-word (M-c): Commands For Text. -* char **completion_matches: Completion Functions. -* char *filename_completion_function: Completion Functions. -* char *rl_basic_word_break_characters: Completion Variables. -* char *rl_completer_word_break_characters: Completion Variables. -* char *rl_line_buffer: Function Writing. -* char *rl_special_prefixes: Completion Variables. -* char *username_completion_function: Completion Functions. -* clear-screen (C-l): Commands For Moving. -* complete (TAB): Commands For Completion. -* delete-char (C-d): Commands For Text. -* digit-argument (M-0, M-1, ... M--): Numeric Arguments. -* do-uppercase-version (M-a, M-b, ...): Miscellaneous Commands. -* downcase-word (M-l): Commands For Text. -* editing-mode: Readline Init Syntax. -* end-of-history (M->): Commands For History. -* end-of-line (C-e): Commands For Moving. -* forward-char (C-f): Commands For Moving. -* forward-search-history (C-s): Commands For History. -* forward-word (M-f): Commands For Moving. -* horizontal-scroll-mode: Readline Init Syntax. -* int rl_bind_key: Binding Keys. -* int rl_bind_key_in_map: Binding Keys. -* int rl_completion_query_items: Completion Variables. -* int rl_end: Function Writing. -* int rl_filename_completion_desired: Completion Variables. -* int rl_ignore_completion_duplicates: Completion Variables. -* int rl_point: Function Writing. -* int rl_unbind_key: Binding Keys. -* int rl_unbind_key_in_map: Binding Keys. -* kill-line (C-k): Commands For Killing. -* kill-word (M-d): Commands For Killing. -* mark-modified-lines: Readline Init Syntax. -* next-history (C-n): Commands For History. -* possible-completions (M-?): Commands For Completion. -* prefer-visible-bell: Readline Init Syntax. -* prefix-meta (ESC): Miscellaneous Commands. -* previous-history (C-p): Commands For History. -* quoted-insert (C-q, C-v): Commands For Text. -* re-read-init-file (C-x C-r): Miscellaneous Commands. -* readline (): Default Behaviour. -* reverse-search-history (C-r): Commands For History. -* revert-line (M-r): Miscellaneous Commands. -* rl_add_defun: Function Naming. -* rl_begin_undo_group: Allowing Undoing. -* rl_bind_key (): Default Behaviour. -* rl_complete: How Completing Works. -* rl_complete: Completion Functions. -* rl_complete_internal: Completion Functions. -* rl_end_undo_group: Allowing Undoing. -* rl_generic_bind: Binding Keys. -* rl_modifying: Allowing Undoing. -* rl_possible_completions: Completion Functions. -* self-insert (a, b, A, 1, !, ...): Commands For Text. -* tab-insert (M-TAB): Commands For Text. -* transpose-chars (C-t): Commands For Text. -* transpose-words (M-t): Commands For Text. -* undo (C-_): Miscellaneous Commands. -* universal-argument (): Numeric Arguments. -* unix-line-discard (C-u): Commands For Killing. -* unix-word-rubout (C-w): Commands For Killing. -* upcase-word (M-u): Commands For Text. -* yank (C-y): Commands For Killing. -* yank-pop (M-y): Commands For Killing. +* (: Utility Functions. +* abort (C-g): Miscellaneous Commands. +* accept-line (Newline, Return): Commands For History. +* alphabetic: Utility Functions. +* backward-char (C-b): Commands For Moving. +* backward-delete-char (Rubout): Commands For Text. +* backward-kill-line (C-x Rubout): Commands For Killing. +* backward-kill-word (M-DEL): Commands For Killing. +* backward-word (M-b): Commands For Moving. +* beginning-of-history (M-<): Commands For History. +* beginning-of-line (C-a): Commands For Moving. +* bell-style: Readline Init File Syntax. +* call-last-kbd-macro (C-x e): Keyboard Macros. +* capitalize-word (M-c): Commands For Text. +* character-search (C-]): Miscellaneous Commands. +* character-search-backward (M-C-]): Miscellaneous Commands. +* clear-screen (C-l): Commands For Moving. +* comment-begin: Readline Init File Syntax. +* complete (TAB): Commands For Completion. +* completion-query-items: Readline Init File Syntax. +* completion_matches: Completion Functions. +* convert-meta: Readline Init File Syntax. +* copy-backward-word (): Commands For Killing. +* copy-forward-word (): Commands For Killing. +* copy-region-as-kill (): Commands For Killing. +* delete-char (C-d): Commands For Text. +* delete-horizontal-space (): Commands For Killing. +* digit-argument (M-0, M-1, ... M--): Numeric Arguments. +* digit_p: Utility Functions. +* digit_value: Utility Functions. +* ding: Utility Functions. +* disable-completion: Readline Init File Syntax. +* do-uppercase-version (M-a, M-b, M-X, ...): Miscellaneous Commands. +* downcase-word (M-l): Commands For Text. +* dump-functions (): Miscellaneous Commands. +* dump-macros (): Miscellaneous Commands. +* dump-variables (): Miscellaneous Commands. +* editing-mode: Readline Init File Syntax. +* enable-keypad: Readline Init File Syntax. +* end-kbd-macro (C-x )): Keyboard Macros. +* end-of-history (M->): Commands For History. +* end-of-line (C-e): Commands For Moving. +* exchange-point-and-mark (C-x C-x): Miscellaneous Commands. +* expand-tilde: Readline Init File Syntax. +* filename_completion_function: Completion Functions. +* forward-char (C-f): Commands For Moving. +* forward-search-history (C-s): Commands For History. +* forward-word (M-f): Commands For Moving. +* free_undo_list: Allowing Undoing. +* history-search-backward (): Commands For History. +* history-search-forward (): Commands For History. +* horizontal-scroll-mode: Readline Init File Syntax. +* input-meta: Readline Init File Syntax. +* insert-comment (M-#): Miscellaneous Commands. +* insert-completions (M-*): Commands For Completion. +* keymap: Readline Init File Syntax. +* kill-line (C-k): Commands For Killing. +* kill-region (): Commands For Killing. +* kill-whole-line (): Commands For Killing. +* kill-word (M-d): Commands For Killing. +* lowercase_p: Utility Functions. +* mark-modified-lines: Readline Init File Syntax. +* menu-complete (): Commands For Completion. +* meta-flag: Readline Init File Syntax. +* next-history (C-n): Commands For History. +* non-incremental-forward-search-history (M-n): Commands For History. +* non-incremental-reverse-search-history (M-p): Commands For History. +* numeric: Utility Functions. +* output-meta: Readline Init File Syntax. +* possible-completions (M-?): Commands For Completion. +* prefix-meta (ESC): Miscellaneous Commands. +* previous-history (C-p): Commands For History. +* quoted-insert (C-q, C-v): Commands For Text. +* re-read-init-file (C-x C-r): Miscellaneous Commands. +* readline: Basic Behavior. +* redraw-current-line (): Commands For Moving. +* reverse-search-history (C-r): Commands For History. +* revert-line (M-r): Miscellaneous Commands. +* rl_add_defun: Function Naming. +* rl_add_undo: Allowing Undoing. +* rl_attempted_completion_function: Completion Variables. +* rl_basic_quote_characters: Completion Variables. +* rl_basic_word_break_characters: Completion Variables. +* rl_begin_undo_group: Allowing Undoing. +* rl_bind_key: Binding Keys. +* rl_bind_key_in_map: Binding Keys. +* rl_binding_keymap: Readline Variables. +* rl_callback_handler_install: Alternate Interface. +* rl_callback_handler_remove: Alternate Interface. +* rl_callback_read_char: Alternate Interface. +* rl_char_is_quoted_p: Completion Variables. +* rl_clear_message: Redisplay. +* rl_complete <1>: How Completing Works. +* rl_complete: Completion Functions. +* rl_complete_internal: Completion Functions. +* rl_completer_quote_characters: Completion Variables. +* rl_completer_word_break_characters: Completion Variables. +* rl_completion_append_character: Completion Variables. +* rl_completion_entry_function <1>: How Completing Works. +* rl_completion_entry_function: Completion Variables. +* rl_completion_query_items: Completion Variables. +* rl_copy_keymap: Keymaps. +* rl_copy_text: Modifying Text. +* rl_delete_text: Modifying Text. +* rl_directory_completion_hook: Completion Variables. +* rl_discard_keymap: Keymaps. +* rl_do_undo: Allowing Undoing. +* rl_done: Readline Variables. +* rl_end: Readline Variables. +* rl_end_undo_group: Allowing Undoing. +* rl_event_hook: Readline Variables. +* rl_executing_keymap: Readline Variables. +* rl_filename_completion_desired: Completion Variables. +* rl_filename_dequoting_function: Completion Variables. +* rl_filename_quote_characters: Completion Variables. +* rl_filename_quoting_desired: Completion Variables. +* rl_filename_quoting_function: Completion Variables. +* rl_forced_update_display: Redisplay. +* rl_function_dumper: Associating Function Names and Bindings. +* rl_function_of_keyseq: Associating Function Names and Bindings. +* rl_generic_bind: Binding Keys. +* rl_get_keymap: Keymaps. +* rl_get_keymap_by_name: Keymaps. +* rl_get_keymap_name: Keymaps. +* rl_getc: Utility Functions. +* rl_getc_function: Readline Variables. +* rl_ignore_completion_duplicates: Completion Variables. +* rl_ignore_some_completions_function: Completion Variables. +* rl_inhibit_completion: Completion Variables. +* rl_initialize: Utility Functions. +* rl_insert_completions: Completion Functions. +* rl_insert_text: Modifying Text. +* rl_instream: Readline Variables. +* rl_invoking_keyseqs: Associating Function Names and Bindings. +* rl_invoking_keyseqs_in_map: Associating Function Names and Bindings. +* rl_kill_text: Modifying Text. +* rl_library_version: Readline Variables. +* rl_line_buffer: Readline Variables. +* rl_list_funmap_names: Associating Function Names and Bindings. +* rl_make_bare_keymap: Keymaps. +* rl_make_keymap: Keymaps. +* rl_mark: Readline Variables. +* rl_message: Redisplay. +* rl_modifying: Allowing Undoing. +* rl_named_function: Associating Function Names and Bindings. +* rl_on_new_line: Redisplay. +* rl_outstream: Readline Variables. +* rl_parse_and_bind: Binding Keys. +* rl_pending_input: Readline Variables. +* rl_point: Readline Variables. +* rl_possible_completions: Completion Functions. +* rl_prompt: Readline Variables. +* rl_read_init_file: Binding Keys. +* rl_read_key: Utility Functions. +* rl_readline_name: Readline Variables. +* rl_redisplay: Redisplay. +* rl_redisplay_function: Readline Variables. +* rl_reset_line_state: Redisplay. +* rl_reset_terminal: Utility Functions. +* rl_set_keymap: Keymaps. +* rl_special_prefixes: Completion Variables. +* rl_startup_hook: Readline Variables. +* rl_stuff_char: Utility Functions. +* rl_terminal_name: Readline Variables. +* rl_unbind_command_in_map: Binding Keys. +* rl_unbind_function_in_map: Binding Keys. +* rl_unbind_key: Binding Keys. +* rl_unbind_key_in_map: Binding Keys. +* self-insert (a, b, A, 1, !, ...): Commands For Text. +* set-mark (C-@): Miscellaneous Commands. +* show-all-if-ambiguous: Readline Init File Syntax. +* start-kbd-macro (C-x (): Keyboard Macros. +* tilde-expand (M-~): Miscellaneous Commands. +* to_lower: Utility Functions. +* to_upper: Utility Functions. +* transpose-chars (C-t): Commands For Text. +* transpose-words (M-t): Commands For Text. +* undo (C-_, C-x C-u): Miscellaneous Commands. +* universal-argument (): Numeric Arguments. +* unix-line-discard (C-u): Commands For Killing. +* unix-word-rubout (C-w): Commands For Killing. +* upcase-word (M-u): Commands For Text. +* uppercase_p: Utility Functions. +* username_completion_function: Completion Functions. +* visible-stats: Readline Init File Syntax. +* yank (C-y): Commands For Killing. +* yank-last-arg (M-., M-_): Commands For History. +* yank-nth-arg (M-C-y): Commands For History. +* yank-pop (M-y): Commands For Killing.  Tag Table: -Node: Top998 -Node: Command Line Editing1611 -Node: Introduction and Notation2034 -Node: Readline Interaction3056 -Node: Readline Bare Essentials4195 -Node: Readline Movement Commands5703 -Node: Readline Killing Commands6594 -Node: Readline Arguments8438 -Node: Readline Init File9390 -Node: Readline Init Syntax10218 -Node: Commands For Moving14208 -Node: Commands For History14838 -Node: Commands For Text15913 -Node: Commands For Killing17581 -Node: Numeric Arguments18708 -Node: Commands For Completion19152 -Node: Miscellaneous Commands19876 -Node: Readline Vi Mode20718 -Node: Programming with GNU Readline22328 -Node: Default Behaviour23033 -Node: Custom Functions26258 -Node: The Function Type27057 -Node: Function Naming27690 -Node: Keymaps28942 -Node: Binding Keys29857 -Node: Function Writing31158 -Node: Allowing Undoing32599 -Node: Custom Completers36101 -Node: How Completing Works36849 -Node: Completion Functions39664 -Node: Completion Variables42000 -Node: A Short Completion Example44772 -Node: Concept Index56398 -Node: Function and Variable Index56687 +Node: Top1177 +Node: Command Line Editing1776 +Node: Introduction and Notation2427 +Node: Readline Interaction3466 +Node: Readline Bare Essentials4659 +Node: Readline Movement Commands6200 +Node: Readline Killing Commands7166 +Node: Readline Arguments8882 +Node: Searching9857 +Node: Readline Init File11440 +Node: Readline Init File Syntax12487 +Node: Conditional Init Constructs21353 +Node: Sample Init File23792 +Node: Bindable Readline Commands26962 +Node: Commands For Moving27713 +Node: Commands For History28561 +Node: Commands For Text31313 +Node: Commands For Killing33099 +Node: Numeric Arguments35249 +Node: Commands For Completion36376 +Node: Keyboard Macros37862 +Node: Miscellaneous Commands38421 +Node: Readline vi Mode41225 +Node: Programming with GNU Readline42983 +Node: Basic Behavior43852 +Node: Custom Functions47178 +Node: The Function Type47779 +Node: Function Writing48624 +Node: Readline Variables49708 +Node: Readline Convenience Functions52796 +Node: Function Naming53527 +Node: Keymaps54755 +Node: Binding Keys56469 +Node: Associating Function Names and Bindings58677 +Node: Allowing Undoing60255 +Node: Redisplay62840 +Node: Modifying Text63911 +Node: Utility Functions64822 +Node: Alternate Interface66941 +Node: Custom Completers70235 +Node: How Completing Works70956 +Node: Completion Functions73952 +Node: Completion Variables76967 +Node: A Short Completion Example84119 +Node: Concept Index96425 +Node: Function and Variable Index97179  End Tag Table diff --git a/readline/doc/readline.ps b/readline/doc/readline.ps new file mode 100644 index 00000000000..ef8e8e9a705 --- /dev/null +++ b/readline/doc/readline.ps @@ -0,0 +1,4946 @@ +%!PS-Adobe-2.0 +%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software +%%Title: readline.dvi +%%Pages: 54 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%DocumentPaperSizes: A4 +%%EndComments +%DVIPSCommandLine: dvips -D 300 -o readline.ps readline.dvi +%DVIPSParameters: dpi=300, comments removed +%DVIPSSource: TeX output 1998.04.02:1444 +%%BeginProcSet: tex.pro +/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N +/X{S N}B /TR{translate}N /isls false N /vsize 11 72 mul N /hsize 8.5 72 +mul N /landplus90{false}def /@rigin{isls{[0 landplus90{1 -1}{-1 1} +ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale +isls{landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div +hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul +TR[matrix currentmatrix{dup dup round sub abs 0.00001 lt{round}if} +forall round exch round exch]setmatrix}N /@landscape{/isls true N}B +/@manualfeed{statusdict /manualfeed true put}B /@copies{/#copies X}B +/FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{ +/nn 8 dict N nn begin /FontType 3 N /FontMatrix fntrx N /FontBBox FBB N +string /base X array /BitMaps X /BuildChar{CharBuilder}N /Encoding IE N +end dup{/foo setfont}2 array copy cvx N load 0 nn put /ctr 0 N[}B /df{ +/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0] +N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data dup +length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{ +128 ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub +get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data +dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N +/rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup +/base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx +0 ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff +setcachedevice ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff +.1 sub]{ch-image}imagemask restore}B /D{/cc X dup type /stringtype ne{]} +if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{dup dup +length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N}B /I{ +cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin +0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul +add .99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore userdict +/eop-hook known{eop-hook}if showpage}N /@start{userdict /start-hook +known{start-hook}if pop /VResolution X /Resolution X 1000 div /DVImag X +/IE 256 array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for +65781.76 div /vsize X 65781.76 div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 +0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X /rulex X V}B /V +{}B /RV statusdict begin /product where{pop product dup length 7 ge{0 7 +getinterval dup(Display)eq exch 0 4 getinterval(NeXT)eq or}{pop false} +ifelse}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale rulex ruley false +RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR rulex ruley scale 1 1 +false RMat{BDot}imagemask grestore}}ifelse B /QV{gsave newpath transform +round exch round exch itransform moveto rulex 0 rlineto 0 ruley neg +rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N /tail +{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} +B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{ +4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{ +p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p +a}B /bos{/SS save N}B /eos{SS restore}B end +%%EndProcSet +TeXDict begin 39158280 55380996 1000 300 300 (readline.dvi) +@start /Fa 1 47 df<70F8F8F0E005057B840E>46 D E /Fb 1 +47 df<0E003F007F807F80FF80FF80FF007E003C000909798815>46 +D E /Fc 1 59 df<60F0F06004047D830B>58 D E /Fd 53 127 +df<60F0F0F0F0F0F0F0F0F0F0F0F0F0600000000060F0F0600417789614>33 +D<071C00071C00071C00071C00071C00FFFF80FFFF807FFF800E38000E38000E38000E38 +000E38000E38000E38007FFF80FFFF80FFFF801C70001C70001C70001C70001C70001117 +7F9614>35 D<0180038006000C001C0018003800700070007000E000E000E000E000E000 +E000E000E000E000700070007000380018001C000C00060003800180091D799914>40 +D<80C0603038181C0E0E0E0707070707070707070E0E0E1C18383060C080081D7C9914> +I<038003800380638CF39E7FFC3FF80FE00FE03FF87FFCF39E638C0380038003800F107E +9214>I<70F8FCFC7C0C1830E0C0060A798414>44 DI<70F8 +F8F8700505798414>I<07C00FE01C7038383018701C701CE00EE00EE00EE00EE00EE00E +E00EE00EE00E701C701C383838381C700FE007C00F177E9614>48 +D<0300030007000F003F00F7004700070007000700070007000700070007000700070007 +000700070007007FF07FF00C177C9614>I<0006001E003E00F801F003C00F801F003C00 +F800F000F8003C001F000F8003C001F000F8003E001E00060F157E9514>60 +D62 D<1FE03FF8701CE00EE00E400E003C007000E001C003 +800380038003800300000000000000000003000780078003000F177E9614>I<01E007F0 +0E38181C38FC71FC731E771EEE0EEE0EEE0EEE0EEE0EEE0EEE0E771C731871F038E01806 +0E1E07F801F00F177E9614>I<01C00003E00003E0000360000360000770000770000770 +000770000630000E38000E38000E38000E38001C1C001FFC001FFC001C1C001C1C00380E +00380E00FE3F80FE3F8011177F9614>II<01F1 +8007FF800E1F801C0780380780700380700380700380E00000E00000E00000E00000E000 +00E00000E000007003807003807003803807001C07000E0E0007FC0001F00011177F9614 +>III76 +DII82 D<0FCC1FFC307C603CE01CE01CE01CE00070007E003FE0 +0FF001F8001C001E000E600EE00EE00EF01CF838FFF0C7E00F177E9614>I<7FFF80FFFF +80E1C380E1C380E1C380E1C38001C00001C00001C00001C00001C00001C00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C0000FF8000FF80011177F9614>I93 +D95 D<1FC0007FF000707800201800001C00001C0007FC00 +1FFC003C1C00701C00E01C00E01C00E01C00707C003FFF800F8F8011107E8F14>97 +DI<03F80FFE1C0E380470006000E000E000E000E00060007000380E1C1E0FFC03 +F00F107E8F14>I<007E00007E00000E00000E00000E00000E00000E0007CE000FFE001C +3E00301E00700E00E00E00E00E00E00E00E00E00E00E00E00E00700E00301E00383E001F +EFC007CFC012177F9614>I<07E00FF01C38301C700CE00EE00EFFFEFFFEE00060007000 +380E1C1E0FFC03F00F107E8F14>I<00FC01FE038E07040700070007007FFEFFFE070007 +000700070007000700070007000700070007000700FFF8FFF80F177F9614>I<07CF001F +FF80383B80301800701C00701C00701C003018003838003FF00037C0007000007000003F +F8001FFC003FFE00700F00E00380E00380E00380E003807007003C1E001FFC0007F00011 +197F8F14>II<06000F000F0006000000000000000000FF00FF00070007000700 +070007000700070007000700070007000700FFF8FFF80D187C9714>I107 +DI +II<07C01FF03C78701C701CE00EE00EE00E +E00EE00EE00E701C783C3C781FF007C00F107E8F14>II<03E7000FF700 +1C1F00300F00700F00E00700E00700E00700E00700E00700E00700700F00300F001C3F00 +0FF70007C700000700000700000700000700000700000700003FE0003FE013187F8F14> +II<0FD83FF86038C038C038F0007F803FF0 +07F8001C6006E006F006F81CFFF8CFE00F107E8F14>I<06000E000E000E000E007FFCFF +FC0E000E000E000E000E000E000E000E000E0E0E0E0E0E0E1C07F801F00F157F9414>I< +FC3F00FC3F001C07001C07001C07001C07001C07001C07001C07001C07001C07001C0700 +1C07001C1F000FFFE003E7E01310808F14>III<7E3F007E3F001E3C000E7800077000 +07E00003E00001C00003C00003E0000770000E78000E38001C1C00FE3F80FE3F8011107F +8F14>II<3FFF7FFF700E701C7038007000E001C0038007000E001C0738 +077007FFFFFFFF10107F8F14>I<1C103F38E7E041C00D047D9614>126 +D E /Fe 2 121 df<7070F06004047D830B>46 D<3FC7E007838007020003840003C800 +01D80000F00000E00000F00001F000013800023800041C00081E00381E00FC3FC013107F +8F14>120 D E /Ff 38 123 df<00FE000381000601800E03801C01001C00001C00001C +00001C00001C0000FFFF801C03801C03801C03801C03801C03801C03801C03801C03801C +03801C03801C03801C03801C03801C0380FF8FF0141A809915>12 +D<00FF800383800603800E03801C03801C03801C03801C03801C03801C0380FFFF801C03 +801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03 +801C0380FF9FF0141A809915>I<60F0F07010101020204040040B7D830B>44 +DI<03000700FF00070007000700070007000700070007000700 +070007000700070007000700070007000700070007007FF80D187D9713>49 +D<0F80106020304038803CC01CE01C401C003C003800380070006000C001800100020004 +040804100430083FF87FF8FFF80E187E9713>I<07E01838201C601E700E201E001E001C +001C0038007007E00038001C000E000F000FE00FE00FC00F400E601C183807E010187F97 +13>I<001800180038007800F800B8013802380238043808381838103820384038C038FF +FF00380038003800380038003803FF10187F9713>I<30183FF03FE03F80200020002000 +200020002FC03060203000380018001C001C401CE01CE01C80184038403030E00F800E18 +7E9713>I<01F807040C06180E300E300070006000E000E3E0E418E80CF00EE006E007E0 +07E007600760077006300E180C0C3807E010187F9713>I<40007FFF7FFE7FFE40048008 +80108010002000400040008001800100030003000700060006000E000E000E000E000E00 +040010197E9813>I<07E01818300C2006600660067006780C3E181F3007C003E00CF830 +7C601E600FC007C003C003C00360022004181807E010187F9713>I<07E01C303018700C +600EE006E006E007E007E0076007700F3017182707C700070006000E000C700C70186030 +30600F8010187F9713>I<1FC000387000383800101C00001C00001C0003FC001E1C0038 +1C00701C00E01C00E01C80E01C80E03C80705F801F8F0011107F8F13>97 +DI<07F81C1C381C70087000E000E000E000E000E000E000 +7000700438081C1807E00E107F8F11>I<003F0000070000070000070000070000070000 +070000070000070000070003E7000C1700180F00300700700700E00700E00700E00700E0 +0700E00700E00700600700700700380F001C370007C7E0131A7F9915>I<07C01C303018 +7018600CE00CFFFCE000E000E000E0006000700438081C1807E00E107F8F11>I<01F007 +180E381C101C001C001C001C001C001C00FFC01C001C001C001C001C001C001C001C001C +001C001C001C001C001C00FF800D1A80990C>I<0FCF0018718030300070380070380070 +38007038003030001860002FC0006000006000007000003FF0003FFC001FFE00600F00C0 +0300C00300C00300C00300600600381C0007E00011187F8F13>II<183C3C18000000000000FC1C1C1C1C1C1C1C1C1C1C1C1C1C1CFF081A80990A>I< +FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C1FC01C0F00 +1C0C001C18001C20001C40001CE0001DE0001E70001C78001C38001C1C001C1E001C0F00 +1C0F80FF9FE0131A809914>107 DI +II<07E01C38300C700E6006E007E007E007 +E007E007E0076006700E381C1C3807E010107F8F13>II<03E1000C1300180B00 +300F00700700E00700E00700E00700E00700E00700E00700700700700700380F001C3700 +07C700000700000700000700000700000700000700003FE013177F8F14>II<1F20 +60E04020C020C020F0007F003FC01FE000F080708030C030C020F0408F800C107F8F0F> +I<0800080008000800180018003800FFC038003800380038003800380038003800382038 +203820382018201C4007800B177F960F>I +IIIIII E /Fg 2 42 df<00E001C00380078007000F001E001E001C003C00 +3C0038007800780078007000F000F000F000F000F000F000F000F000F000F000F000F000 +F000F000700078007800780038003C003C001C001E001E000F0007000780038001C000E0 +0B2E7CA112>40 DI +E /Fh 28 123 df<000FF83F00007FFDFFC001FC1FE3E003F03FC7E007E03FC7E00FC03F +87E00FC03F83C00FC01F80000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80 +00FFFFFFFC00FFFFFFFC000FC01F80000FC01F80000FC01F80000FC01F80000FC01F8000 +0FC01F80000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80000F +C01F80000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80007FF8FFF8007FF8 +FFF80023237FA221>11 D<0007F800007FFC0001FC0E0003F01F0007E03F000FC03F000F +C03F000FC03F000FC01E000FC00C000FC000000FC000000FC0FF80FFFFFF80FFFFFF800F +C01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800F +C01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F800FC01F807F +F8FFF07FF8FFF01C237FA220>I<00180030006000C001C00380078007000F001E001E00 +3E003C003C007C007C007C007800F800F800F800F800F800F800F800F800F800F800F800 +F800F80078007C007C007C003C003C003E001E001E000F0007000780038001C000C00060 +003000180D317BA416>40 D<07FE00001FFF80003F07E0003F03F0003F01F0003F01F800 +1E01F8000001F8000001F800003FF80003FDF8001F81F8003E01F8007C01F800F801F800 +F801F800F801F800F801F8007C02F8007E0CF8001FF87F8007E03F8019167E951C>97 +DI<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC00 +00FC0000FC0000FC00007C00007E00007E00003E00181F00300FC06007FFC000FF001516 +7E9519>I<0001FF000001FF0000003F0000003F0000003F0000003F0000003F0000003F +0000003F0000003F0000003F0000003F0000003F0000FE3F0007FFBF000FC1FF001F007F +003E003F007E003F007C003F007C003F00FC003F00FC003F00FC003F00FC003F00FC003F +00FC003F00FC003F007C003F007E003F003E003F001F007F000F81FF0007FF3FE001FC3F +E01B237EA220>I<00FE0007FF800F83C01E01E03E00F07E00F07C00F87C0078FC0078FF +FFF8FFFFF8FC0000FC0000FC00007C00007C00003E00183E00181F00300F80E003FFC000 +FF0015167E951A>I<001F8000FFE001F1F003E3F007E3F00FC3F00FC1E00FC0000FC000 +0FC0000FC0000FC0000FC000FFFE00FFFE000FC0000FC0000FC0000FC0000FC0000FC000 +0FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC000 +7FFC007FFC0014237EA212>I<00FE0F8003FF9FC00F83E3C01F01F3C01E00F0003E00F8 +003E00F8003E00F8003E00F8003E00F8001E00F0001F01F0000F83E0000BFF800008FE00 +0018000000180000001C0000001FFFE0001FFFFC000FFFFF0007FFFF001FFFFF807C001F +C078000FC0F80007C0F80007C0F80007C07C000F803E001F001F807E000FFFFC0001FFE0 +001A217F951D>II<1E003F007F807F807F807F803F001E00000000000000000000 +000000FF80FF801F801F801F801F801F801F801F801F801F801F801F801F801F801F801F +801F801F801F80FFF0FFF00C247EA30F>I107 DIII<00FF0007FFE00F81F01F00F83E007C7C003E7C003E7C003EFC00 +3FFC003FFC003FFC003FFC003FFC003FFC003F7C003E7E007E3E007C1F00F80F81F007FF +E000FF0018167E951D>II<00FE030007FF07000FC1CF001F00DF003F007F007E003F007E003F007C003F00FC00 +3F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F007E003F007E003F003E00 +7F001F00FF000FC1FF0007FF3F0000FC3F0000003F0000003F0000003F0000003F000000 +3F0000003F0000003F0000003F000001FFE00001FFE01B207E951E>II<07F9801FFF80 +380780700380F00180F00180F80000FF0000FFF8007FFE003FFF001FFF8007FF80003FC0 +C007C0C003C0E003C0E003C0F00380FC0F00EFFE00C3F80012167E9517>I<0180000180 +000180000180000380000380000780000780000F80003F8000FFFF00FFFF001F80001F80 +001F80001F80001F80001F80001F80001F80001F80001F80001F80001F81801F81801F81 +801F81801F81800F83000FC30007FE0001F80011207F9F16>III< +FFF3FF83FCFFF3FF83FC1F807C00E00FC07C00C00FC03E00C00FE03E01C007E07F018007 +E07F018003F07F030003F0CF830003F8CF870001F9CFC60001F987C60000FD87EC0000FF +03EC0000FF03FC00007F03F800007E01F800003E01F000003C00F000003C00F000001800 +600026167F9529>III<7FFFF07FFFF07C07E0700FC060 +1FC0E01F80C03F00C07F00C07E0000FC0001FC0003F80003F03007E0300FE0300FC0701F +80703F80603F00E07E03E0FFFFE0FFFFE014167E9519>I E /Fi +29 122 df<00E00000E00000E00000E00000E000F0E1E0FCE7E07EEFC01FFF0007FC0001 +F00007FC001FFF007EEFC0FCE7E0F0E1E000E00000E00000E00000E00000E00013157D99 +1A>42 D<007C3801FF3807FFF80F83F81E00F81C00783800783800387000387000387000 +00E00000E00000E00000E00000E00000E00000E00000E000007000007000387000383800 +383800381C00701E00F00F83E007FFC001FF80007C00151E7E9D1A>67 +D69 D<7FFFFCFFFFFC7FFFFC +0E001C0E001C0E001C0E001C0E001C0E00000E00000E03800E03800E03800FFF800FFF80 +0FFF800E03800E03800E03800E00000E00000E00000E00000E00000E00000E00000E0000 +7FE000FFE0007FE000161E7F9D1A>I73 D<7F03F8FF87FC7F03F81C01E01C03C01C03801C07001C0F001C1E001C1C00 +1C38001C78001CF0001CF8001DF8001FDC001F9C001F0E001E0F001E07001C07801C0380 +1C01C01C01C01C00E01C00E01C00707F00FCFF81FE7F00FC171E7F9D1A>75 +D<7FE000FFF0007FE0000E00000E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E001C0E00 +1C0E001C0E001C0E001C7FFFFCFFFFFC7FFFFC161E7F9D1A>I80 D86 D<7FFFC0FFFFE0FFFFE07FFFC013047D7E1A>95 D<1FF0003FFC007FFE0078 +0F00300700000380000380007F8007FF801FFF803F8380780380700380E00380E00380E0 +0380700780780F803FFFFC1FFDFC07F0FC16157D941A>97 DI<00FF8003FFC00FFFE01F01E03C00C078000070000070 +0000E00000E00000E00000E00000E000007000007000007800703C00701F01F00FFFE003 +FFC000FE0014157D941A>I<001FC0001FC0001FC00001C00001C00001C00001C00001C0 +0001C001F1C007FDC00FFFC01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0 +E001C0E001C0E001C07003C07003C03807C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A> +I<01F80007FF000FFF801E07C03C01C07800E07000E0E00070E00070FFFFF0FFFFF0FFFF +F0E000007000007000007800703C00701F01F00FFFE003FF8000FE0014157D941A>I<00 +07E0001FF0003FF800787800F03000E00000E00000E00000E0007FFFF0FFFFF0FFFFF000 +E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000 +E00000E00000E0003FFF807FFFC03FFF80151E7F9D1A>I104 D<01C00003E00003E00003E00001C000000000000000 +0000000000000000007FE0007FE0007FE00000E00000E00000E00000E00000E00000E000 +00E00000E00000E00000E00000E00000E00000E00000E00000E0007FFF80FFFFC07FFF80 +121F7C9E1A>I108 +D<7CE0E000FFFBF8007FFFF8001F1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C +001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C +007F1F1F00FF9F9F807F1F1F00191580941A>II<01F00007FC001FFF003E0F803C07807803C0 +7001C0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F80 +1FFF0007FC0001F00013157D941A>II<7F81F8FF8FFC7F9FFE03FE1E03F80C03E00003E00003C00003 +80000380000380000380000380000380000380000380000380000380007FFF00FFFF007F +FF0017157F941A>114 D<0180000380000380000380000380000380000380007FFFE0FF +FFE0FFFFE003800003800003800003800003800003800003800003800003800003800003 +807003807003807003807001C1E001FFE000FF80003F00141C7F9B1A>116 +DI<7F +C7FCFFC7FE7FC7FC0E00E00E00E00E00E00701C00701C00701C003838003838003838001 +C70001C70001C70000EE0000EE0000EE00007C00007C0000380017157F941A>I<7FC7F8 +7FCFFC7FC7F80703C003838003C70001EF0000FE00007C00007800003800007C0000EE00 +01EE0001C7000383800783C00701C07FC7FCFFC7FE7FC7FC17157F941A>120 +D<7FC7FCFFC7FE7FC7FC0E00E00E00E00700E00701C00781C00381C003838001C38001C3 +8001C70000E70000E70000E600006600006E00003C00003C00003C000038000038000038 +0000780000700030700078E00071E0007FC0003F80001E000017207F941A>I +E /Fj 1 59 df<70F8F8F87005057C840D>58 D E /Fk 6 102 df<06000F001F800F80 +0F800380070007000F000E003C007C00F0006000090E769B18>39 +D<7FFFC0FFFFE0FFFFE07FFFC013047C8F18>45 D<003E1800FFB801FFF807C1F8078078 +0E00781E00781C0070380030380000700000700000700000E00000E00000E00000E00000 +E00000E00000E000C07001C07001C07003C03807803C0F001FFE000FFC0003F000151C7C +9B18>67 D<07E01F800FE03FC007E03F8003B02E0003B06E0003B06E0003B0CE000730DC +000731DC0007319C0007319C0007339C0007331C000E3338000E3738000E3638000E3E38 +000E3C38000E1838001C0070001C0070001C0070001C0070001C0070001C007000FE03F8 +00FF03FC00FE03F8001A1C7F9B18>77 D<6000F000F000F000F8007800780078007C003C +003C003C003E001E001E001E001F000F000F000F000F8007800780078007C003C003C003 +C003C003E001E001E001E001F000F000600C24789F18>92 D<00F80007FE000FFF001F07 +803C03807801C07001C0E001C0E001C0FFFFC0FFFFC0FFFF80E00000E00000E003007007 +80780F003FFE001FFC0007F00012147B9318>101 D E /Fl 52 122 +df<3C7EFFFFFFFF7E3C08087C8711>46 D<007F800003FFF00007E1F8000F807C001F00 +3E003F003F003E001F007E001F807E001F807E001F807E001F80FE001FC0FE001FC0FE00 +1FC0FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0FE00 +1FC0FE001FC07E001F807E001F807E001F807E001F803F003F003F003F001F003E000F80 +7C0007E1F80003FFF000007F80001A237EA21F>48 D<001C00003C0000FC00FFFC00FFFC +0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC +0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC +0000FC0000FC0000FC0000FC007FFFFC7FFFFC16237CA21F>I<01FF0007FFC01E07F038 +03F86001FC7C00FEFE00FEFE00FFFE007FFE007F7C007F3800FF0000FF0000FE0000FE00 +01FC0001F80003F00007E0000780000F00001E00003C0000700000E00301C00303800707 +00060600060FFFFE1FFFFE3FFFFE7FFFFCFFFFFCFFFFFC18237DA21F>I<01FF0007FFE0 +1E03F03801F83C01FC7E00FE7E00FE7E00FE3E00FE1C01FE0001FC0001FC0003F80007F0 +000FC001FF0001FF000007E00001F00001F80000FC0000FE0000FF0000FF1000FF7C00FF +FE00FFFE00FFFE00FEFE00FE7C01FC7001F83E07F00FFFC001FF0018237DA21F>I<0000 +380000007800000078000000F8000001F8000003F8000007F8000006F800000CF800001C +F8000038F8000030F8000060F80000E0F80001C0F8000180F8000300F8000700F8000E00 +F8001C00F8001800F8003000F8007000F800E000F800FFFFFFC0FFFFFFC00001F8000001 +F8000001F8000001F8000001F8000001F8000001F800007FFFC0007FFFC01A237EA21F> +I<18000C1F007C1FFFF81FFFF01FFFE01FFFC01FFF801FFC001800001800001800001800 +0018000018FF001BFFE01F03F01C00F80800FC00007E00007E00007E00007F00007F7800 +7FFC007FFC007FFC007FFC007EF8007E6000FC7000FC3801F81E07E007FFC001FE001823 +7DA21F>I<001FC0007FF001F03803E00C07803E0F807E1F007E3F007E3F007E7E003C7E +00007E00007E0000FE3FC0FE7FF0FE80F8FF80FCFF007CFF007EFE007EFE007FFE007FFE +007FFE007F7E007F7E007F7E007F7E007F3E007E3F007E1F007C0F80F807C1F003FFC000 +7F0018237DA21F>I<300000003C0000003FFFFFC03FFFFFC03FFFFF807FFFFF007FFFFE +007FFFFC006000180060001800E0003000C0006000C000C0000001800000018000000300 +0000060000000E0000000E0000001C0000001C0000003C0000003C000000780000007800 +0000F8000000F8000000F8000000F8000001F8000001F8000001F8000001F8000001F800 +0001F8000000F00000006000001A257DA41F>I<00FF8003FFE00F01F81C007C38003C38 +001E78001E78001E7C001E7E001E7F803C7FE03C3FF8781FFDF01FFFC00FFFC003FFE003 +FFF80FFFFC1E1FFC3C07FE7803FE7800FFF0003FF0001FF0000FF0000FF0000FF0000E78 +000E78001C3C00381F80F007FFE001FF0018237DA21F>I<00FF0003FFC00F83E01F00F0 +3F00F87E007C7E007C7E007EFE007EFE007EFE007EFE007FFE007FFE007FFE007F7E007F +7E00FF3E00FF3F01FF1F017F0FFE7F03FC7F00007F00007E00007E3C007E7E00FC7E00FC +7E00F87E00F07C01F03003E01C0F800FFF0003F80018237DA21F>I<00001C0000000000 +1C00000000003E00000000003E00000000003E00000000007F00000000007F0000000000 +FF8000000000FF8000000000FF80000000019FC0000000019FC0000000031FE000000003 +0FE0000000070FF00000000607F00000000607F00000000C07F80000000C03F80000001C +03FC0000001801FC0000001801FC0000003000FE0000003000FE0000007FFFFF0000007F +FFFF000000E0007F800000C0003F800000C0003F80000180003FC0000180001FC0000380 +001FE0000300000FE0000300000FE00007000007F000FFF000FFFF80FFF000FFFF802925 +7EA42E>65 DI<0000FF8008000FFFF018003FC03C7800FE00 +06F801F80003F803F00001F807E00000F80FC00000781FC00000783F800000383F800000 +387F800000187F000000187F00000018FF00000000FF00000000FF00000000FF00000000 +FF00000000FF00000000FF00000000FF00000000FF000000007F000000007F000000187F +800000183F800000183F800000181FC00000300FC000003007E000006003F00000C001F8 +00018000FE000700003FC01E00000FFFF8000000FFC00025257DA42C>I69 DI72 +DI75 DI< +FFF8000000FFF8FFFC000001FFF803FC000001FE00037E0000037E00037E0000037E0003 +7E0000037E00033F0000067E00033F0000067E00031F80000C7E00031F80000C7E00030F +C000187E00030FC000187E000307E000307E000307E000307E000307E000307E000303F0 +00607E000303F000607E000301F800C07E000301F800C07E000300FC01807E000300FC01 +807E0003007E03007E0003007E03007E0003007E03007E0003003F06007E0003003F0600 +7E0003001F8C007E0003001F8C007E0003000FD8007E0003000FD8007E00030007F0007E +00030007F0007E00030007F0007E00030003E0007E00078003E0007E00FFFC01C01FFFF8 +FFFC01C01FFFF835257EA43A>II82 D<00FF008007FFE3800F80F7801E001F803C000F807800078078000380F80003 +80F8000180F8000180FC000180FC000000FF0000007FE000007FFE00003FFFE0003FFFF8 +001FFFFE0007FFFF0003FFFF80007FFF800003FFC000003FC000000FE0000007E0000007 +E0C00003E0C00003E0C00003E0C00003C0E00003C0F00007C0F8000780FC000F00FFC03E +00E3FFF800803FE0001B257DA422>I<7FFFFFFFF87FFFFFFFF87E00FE01F87800FE0078 +7000FE00386000FE00186000FE0018E000FE001CE000FE000CC000FE000CC000FE000CC0 +00FE000CC000FE000C0000FE00000000FE00000000FE00000000FE00000000FE00000000 +FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE +00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 +000000FE000000FFFFFE0000FFFFFE0026247EA32B>II< +FFFF8001FFE0FFFF8001FFE007F800001C0003F80000180003F80000180003FC00003800 +01FC0000300001FE0000700000FE0000600000FF00006000007F0000C000007F8000C000 +003F80018000003F80018000003FC0038000001FC0030000001FE0070000000FE0060000 +000FF00600000007F00C00000007F00C00000003F81800000003F81800000003FC380000 +0001FC3000000001FE7000000000FE6000000000FF60000000007FC0000000007FC00000 +00003F80000000003F80000000003F80000000001F00000000001F00000000000E000000 +00000E0000002B257FA42E>II89 D<07FF00001FFFE0003E03F0003F00F8003F00FC003F007E001E007E000000 +7E0000007E0000007E00001FFE0003FE7E000FC07E001F007E003E007E007E007E00FC00 +7E00FC007E00FC007E00FC00BE007E01BE003F073E001FFE1FE007F00FE01B187E971E> +97 DI<007FE003FFF807C07C1F80FC1F00FC3F00FC +7E00787E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00007E00007F0000 +3F000C1F800C1FC01807E07003FFE0007F0016187E971B>I<0000FFC00000FFC000000F +C000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000F +C000000FC000000FC0007F0FC003FFCFC00FE0FFC01F803FC03F000FC03F000FC07E000F +C07E000FC0FE000FC0FE000FC0FE000FC0FE000FC0FE000FC0FE000FC0FE000FC0FE000F +C07E000FC07E000FC03F000FC03F001FC01F803FC00FC0EFC003FFCFFC00FE0FFC1E267E +A522>I<007F0003FFC007C1F00F80F81F00F83F007C7E007C7E007EFE007EFE007EFFFF +FEFFFFFEFE0000FE0000FE00007E00007E00007E00063F00061F000C0F801807E07003FF +E0007F8017187E971C>I<001FC0007FF001F8F003E1F807E1F807C1F80FC0F00FC0000F +C0000FC0000FC0000FC0000FC0000FC000FFFF00FFFF000FC0000FC0000FC0000FC0000F +C0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000F +C0000FC0000FC0000FC000FFFE00FFFE0015267EA513>I<01FF07C007FFDFE00F83F1E0 +1F01F1E03E00F8007E00FC007E00FC007E00FC007E00FC007E00FC007E00FC003E00F800 +1F01F0000F83E0000FFFC00011FF00003000000030000000380000003C0000003FFFE000 +1FFFFC001FFFFE000FFFFF001FFFFF803C003F8078000FC0F80007C0F80007C0F80007C0 +F80007C07C000F803E001F001F807E0007FFF80000FFC0001B247E971F>II<0F001F803FC03FC03FC03FC01F800F0000000000000000000000 +000000007FC07FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC0 +0FC00FC00FC00FC00FC00FC0FFF8FFF80D277EA611>I107 DIII<007F800003FFF00007C0F8001F807E003F003F +003F003F007E001F807E001F80FE001FC0FE001FC0FE001FC0FE001FC0FE001FC0FE001F +C0FE001FC0FE001FC07E001F807E001F803F003F003F003F001F807E000FC0FC0003FFF0 +00007F80001A187E971F>II114 D<07F8C01FFFC03C07C07001C0 +F000C0F000C0F000C0FC0000FF80007FFC007FFE003FFF800FFFC003FFC0001FE00003E0 +C001E0C001E0E001E0E001C0F003C0FC0780EFFF00C3FC0013187E9718>I<00C00000C0 +0000C00000C00001C00001C00001C00003C00007C0000FC0001FC000FFFFC0FFFFC00FC0 +000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0 +600FC0600FC0600FC0600FC0600FC06007E0C007E1C001FF80007E0013237FA218>IIIIII +E /Fm 28 122 df<0003E0001C1800381800703C00E03C00E03801C00001C00001C00001 +C00001C0000380007FFFF00380700380700380700380700700E00700E00700E00700E007 +00E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FF0FF016207E9F +19>12 D45 D<07FFFFF800F80078007800380078001800F00018 +00F0000800F0000800F0000800F0000800F0000801E0080001E0080001E0080001E01800 +01E0380001FFF80003C0300003C0100003C0100003C0100003C0100003C0000007800000 +07800000078000000780000007800000078000000F0000000F800000FFFC00001D1F7E9E +1E>70 D<07FF803FE000F8001F000078000C00007800180000F000200000F000400000F0 +00800000F001000000F002000000F008000001E010000001E020000001E060000001E0F0 +000001E1F0000001E4F8000003C878000003D07C000003E03C000003C03E000003C01E00 +0003C01F000007800F000007800F80000780078000078007C000078003C000078003E000 +0F0001E0000F8003F000FFF00FFE00231F7E9E23>75 D<07F8000C0C001E06001E07001C +070000070000070000070000FF0007C7001E07003C0E00780E00F00E10F00E10F00E10F0 +1E10F02E20784F401F878014147D9317>97 D<0700003F00000F00000700000700000E00 +000E00000E00000E00000E00000E00001C00001C7C001D83001E01801C01C01C00E03800 +E03800F03800F03800F03800F03800F07001E07001E07001C07003C0700380700700E80E +00CC380083E00014207B9F19>I<00FE000383000E07801C0780380700380000780000F0 +0000F00000F00000F00000E00000E00000E00000F00000F001007002003804001C180007 +E00011147D9314>I<0000380001F8000078000038000038000070000070000070000070 +0000700000700000E000FCE00382E00601E01C01E03C00E03801C07801C0F001C0F001C0 +F001C0F001C0E00380E00380E00380E00380F00380700780380F001C378007C7E015207D +9F19>I<00F800070E000E07001C0700380380780380700380F00380F00380FFFF80F000 +00E00000E00000E00000E00000F001007002003004001C180007E00011147D9314>I<00 +07C0001C600030F00060F000E0E000C00001C00001C00001C00001C00001C0000380003F +FC000380000380000380000380000700000700000700000700000700000700000E00000E +00000E00000E00000E00000E00001C00001E0000FFC00014207F9F0E>I<00000E003E11 +00E1A301C1C20381E00780E00701E00F01E00F01E00F01E00703C007038007870004FC00 +0800000800001800001C00000FFF000FFFC00FFFE01800F0300030600030C00030C00030 +C000306000603000C01C070007FC00181F809417>I<00E00007E00001E00000E00000E0 +0001C00001C00001C00001C00001C00001C000038000038F800390E003A0E003C0600380 +600780E00700E00700E00700E00700E00700E00E01C00E01C00E01C00E01C00E01C00E01 +C01C03801E03C0FF8FF014207E9F19>I<01C003E003E003C00180000000000000000000 +00000003801F800780038003800700070007000700070007000E000E000E000E000E000E +001C001E00FF800B1F7F9E0C>I<00E00007E00001E00000E00000E00001C00001C00001 +C00001C00001C00001C0000380000381FC0380F00380C003818003810007040007080007 +1800073800077C00071C000E1C000E0E000E0E000E0F000E07000E07801C03801E07C0FF +8FF016207E9F18>107 D<00E007E001E000E000E001C001C001C001C001C001C0038003 +8003800380038003800700070007000700070007000E000E000E000E000E000E001C001E +00FF800B207F9F0C>I<0387C07C001F9861860007A072070003C0340300038038030007 +80780700070070070007007007000700700700070070070007007007000E00E00E000E00 +E00E000E00E00E000E00E00E000E00E00E000E00E00E001C01C01C001E01E01E00FFCFFC +FFC022147E9326>I<038F801F90E007A0E003C0600380600780E00700E00700E00700E0 +0700E00700E00E01C00E01C00E01C00E01C00E01C00E01C01C03801E03C0FF8FF014147E +9319>I<00FC000387000E01801C00C03800E03800E07000F0F000F0F000F0F000F0F000 +F0E001E0E001E0E001C0E003C0F00380700700380E001C1C0007E00014147D9317>I<00 +E3E00007EC380000F01C0000E00E0000E00F0001C0070001C0078001C0078001C0078001 +C0078001C0078003800F0003800F0003800E0003801E0003801C00038038000740700007 +61C000071F00000700000007000000070000000E0000000E0000000E0000000E0000001E +000000FFC00000191D809319>I<00FC200382600702601E01E03C01E03801C07801C0F0 +01C0F001C0F001C0F001C0E00380E00380F00380F00380F00780700780380F001C370007 +C700000700000700000700000E00000E00000E00000E00001E0000FFC0131D7D9318>I< +038E001FB38007C78003C7800383000780000700000700000700000700000700000E0000 +0E00000E00000E00000E00000E00001C00001E0000FFC00011147E9312>I<01F9060708 +031803180138023C001F001FF007FC01FE001F40074003400360036006F004C81887E010 +147F9312>I<0080010001000100030007000F001E00FFF80E000E000E000E001C001C00 +1C001C001C001C00380038103810381038103820382018400F800D1C7C9B12>I<1C0380 +FC1F803C07801C03801C0380380700380700380700380700380700380700700E00700E00 +700E00700E00701E00701E00703C00305E001F9F8011147B9319>III<1FF0FF03C07801C07001C04000E0C000E180007300007600003C00003C00001C0000 +2E00004E000087000107000203800403800C01C03C03E0FE07FC18147F9318>I<0FF83F +8001E00E0001C00C0001C0080001E0080000E0100000E0300000E0200000E04000007040 +0000708000007080000071000000390000003A0000003E0000003C000000380000001800 +00001000000010000000200000002000000040000070C00000F0800000F1000000E60000 +0078000000191D809318>I E /Fn 38 124 df<60F0F070101020204040040A7D960A> +39 D45 D<06000E00FE000E000E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E00FFE00B157D9412>49 +D<001000003800003800003800005C00005C00005C00008E00008E00008E000107000107 +0002038002038002038007FFC00401C00401C00800E00800E01800F03800F0FE03FE1717 +7F961A>65 DI<00FC100383300E00B01C0070380030300030700010600010E000 +10E00000E00000E00000E00000E00000E000106000107000103000203800201C00400E00 +8003830000FC0014177E9619>IIII76 +DII80 +D82 D<0FC4302C601C400CC004C004C004E00070007F003FE00FF801FC001C000E +0006800680068006C004E008D81087E00F177E9614>I<7FFFF860381840380840380880 +380480380480380400380000380000380000380000380000380000380000380000380000 +380000380000380000380000380000380003FF8016177F9619>II91 +D<3FC0706070302038003803F81E3830387038E039E039E07970FF1F1E100E7F8D12>97 +DI<003E00000E00000E00000E00000E00000E00000E00000E00000E0007CE001C +3E00300E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E00182E0007 +CF8011177F9614>100 D<0FC0186030307038E018FFF8E000E000E00060007008301018 +3007C00D0E7F8D10>I<03E006700E701C201C001C001C001C001C00FF801C001C001C00 +1C001C001C001C001C001C001C001C001C007F800C1780960B>I<0F9E18E33060707070 +707070306018C02F80200060003FE03FF83FFC600EC006C006C006600C38380FE010157F +8D12>I<0300078007800300000000000000000000001F80038003800380038003800380 +0380038003800380038003800380038003804380E300E7007C00091D82960B>106 +DII<07C018303018600C600CE00EE00EE00EE00EE00E701C3018 +183007C00F0E7F8D12>111 DI<07C2001C2600381E00700E00600E00E00E00E00E00E00E00E00E0060 +0E00700E00301E001C2E0007CE00000E00000E00000E00000E00000E00003F8011147F8D +13>I +I<1F4060C0C040C040E000FF007F801FC001E080608060C060E0C09F000B0E7F8D0E>I< +080008000800180018003800FFC038003800380038003800380038003840384038403840 +1C800F000A147F930E>II +119 DII123 D E /Fo +2 106 df<00800180030003000300060006000C000C000C001800180018003000300060 +0060006000C000C000600060006000300030001800180018000C000C000C000600060003 +00030003000180008009267D9B0F>104 DI +E /Fp 8 89 df<0007F008003C0C1800E0033801C000B8078000780F0000380E0000381E +0000183C0000183C0000087C0000087800000878000000F8000000F8000000F8000000F8 +000000F8000000F8000000F8001FFF780000F8780000787C0000783C0000783C0000781E +0000780E0000780F0000780780007801C000B800E00118003C0E080007F00020217C9F27 +>71 D73 +D78 D<001FE0000070380001C00E +0003800700070003800F0003C01E0001E03C0000F03C0000F07C0000F87C0000F8780000 +78F800007CF800007CF800007CF800007CF800007CF800007CF800007CF800007CF80000 +7C780000787C0000F87C0000F83C0000F03E0001F01E0001E00F0003C007000380038007 +0001E01E0000703800001FE0001E217C9F26>II<03F0200C0C601803E03000E06000E0600060E00060E00020E00020E000 +20F00000F800007C00007F80003FFC001FFF0007FF8001FFC0000FE00003E00001E00000 +F0000070800070800070800070800070C00060C000E0E000C0F80180C6030081FC001421 +7C9F1C>83 D85 +D<7FF807FE000FE001F00007C001C00003E000800001E001000001F002000000F8060000 +0078040000003C080000003E180000001F100000000F200000000FC000000007C0000000 +03C000000001E000000003F000000006F80000000478000000087C000000183E00000010 +1E000000201F000000400F800000C0078000008003C000010003E000030001F000070000 +F0001F8001F800FFC007FF80211F7E9E25>88 D E /Fq 34 121 +df<0001C0000003C000000FC000007FC0001FFFC000FFFFC000FFBFC000E03FC000003F +C000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003F +C000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003F +C000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003F +C000003FC000003FC000003FC000003FC000003FC000003FC000003FC0007FFFFFF07FFF +FFF07FFFFFF01C2E7AAD28>49 D<003FE00001FFFE0007FFFF800F80FFC01E003FE03800 +1FF07C000FF87E0007FCFF0007FCFF8007FEFF8007FEFF8003FEFF8003FE7F0003FE3E00 +07FE000007FE000007FC000007FC00000FF800000FF800000FF000001FE000001FC00000 +3F8000007F0000007E000000F8000001F0000003E0000007C000000F0000001E000E003C +000E0038000E0070001E00E0001C01C0001C0300003C07FFFFFC0FFFFFFC1FFFFFFC3FFF +FFFC7FFFFFF8FFFFFFF8FFFFFFF8FFFFFFF81F2E7CAD28>I<000003FF80018000003FFF +F003800001FFFFFC07800007FF003F0F80001FF800079F80003FC00001FF8000FF800000 +FF8001FE0000007F8003FC0000003F8007FC0000001F8007F80000000F800FF00000000F +801FF000000007801FF000000007803FE000000007803FE000000003807FE00000000380 +7FE000000003807FC000000000007FC00000000000FFC00000000000FFC00000000000FF +C00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0 +0000000000FFC000000000007FC000000000007FC000000000007FE000000000007FE000 +000003803FE000000003803FE000000003801FF000000003801FF000000007800FF00000 +00070007F8000000070007FC0000000E0003FC0000001E0001FE0000001C0000FF800000 +7800003FC00000F000001FF80003E0000007FF003F80000001FFFFFE000000003FFFF800 +00000003FF80000031317CB03A>67 D69 +DI<000003FF00030000007FFFF007000001FFFFFC0F0000 +07FF007E1F00001FF0000FBF00007FC00003FF0000FF800001FF0001FE0000007F0003FC +0000007F0007FC0000003F000FF80000001F000FF00000001F001FF00000000F001FF000 +00000F003FE000000007003FE000000007007FE000000007007FE000000007007FC00000 +000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000000 +0000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC000000000 +00FFC00007FFFFF87FC00007FFFFF87FE00007FFFFF87FE0000001FF003FE0000001FF00 +3FE0000001FF001FF0000001FF001FF0000001FF000FF0000001FF000FF8000001FF0007 +FC000001FF0003FC000001FF0001FE000001FF0000FF800001FF00007FC00003FF00001F +F800077F000007FF003E3F000001FFFFFC1F0000007FFFF00F00000003FF80030035317C +B03F>I73 +D76 D78 D80 +D82 D<7FFFFFFFFFFF007FFFFFFFFFFF007FFFFFFFFFFF007FC00FF801FF007E000F +F8003F007C000FF8001F0078000FF8000F0078000FF8000F0070000FF8000700F0000FF8 +000780F0000FF8000780F0000FF8000780E0000FF8000380E0000FF8000380E0000FF800 +0380E0000FF8000380E0000FF800038000000FF800000000000FF800000000000FF80000 +0000000FF800000000000FF800000000000FF800000000000FF800000000000FF8000000 +00000FF800000000000FF800000000000FF800000000000FF800000000000FF800000000 +000FF800000000000FF800000000000FF800000000000FF800000000000FF80000000000 +0FF800000000000FF800000000000FF800000000000FF800000000000FF800000000000F +F800000000000FF800000000000FF800000000000FF800000000000FF8000000007FFFFF +FF0000007FFFFFFF0000007FFFFFFF000031307DAF38>84 DII<00FFF0000003FFFF00000F803F80000FC00F +E0001FE007F0001FE007F0001FE003F8000FC003FC00078003FC00000003FC00000003FC +00000003FC00000003FC000000FFFC00001FFFFC0000FFE3FC0003FC03FC000FF003FC00 +1FC003FC003FC003FC007F8003FC007F8003FC00FF0003FC00FF0003FC00FF0003FC00FF +0007FC00FF0007FC007F800DFC003FC01DFE001FE078FFF007FFE07FF000FF803FF02420 +7E9F27>97 D<01F8000000FFF8000000FFF8000000FFF80000000FF800000007F8000000 +07F800000007F800000007F800000007F800000007F800000007F800000007F800000007 +F800000007F800000007F800000007F800000007F800000007F83FE00007F8FFFC0007FB +E07F0007FF001F8007FE000FC007FC000FE007F80007F007F80007F807F80007F807F800 +03FC07F80003FC07F80003FC07F80003FE07F80003FE07F80003FE07F80003FE07F80003 +FE07F80003FE07F80003FE07F80003FE07F80003FC07F80003FC07F80003FC07F80007F8 +07F80007F807F80007F007FC000FE007FE000FC007E7003F8007C3C0FE000780FFF80007 +003FC00027327EB12D>I<000FFF00007FFFC001FC01F003F003F007E007F80FE007F81F +C007F83FC003F03FC001E07F8000007F8000007F800000FF800000FF800000FF800000FF +800000FF800000FF800000FF800000FF8000007F8000007F8000007F8000003FC0001C3F +C0001C1FC000380FE0003807E0007003F001E001FC07C0007FFF00000FF8001E207D9F24 +>I<0000000FC0000007FFC0000007FFC0000007FFC00000007FC00000003FC00000003F +C00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0 +0000003FC00000003FC00000003FC00000003FC00007F83FC0003FFF3FC000FE07BFC003 +F801FFC007E0007FC00FE0007FC01FC0003FC03FC0003FC03FC0003FC07F80003FC07F80 +003FC07F80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF80003FC0FF8000 +3FC0FF80003FC0FF80003FC07F80003FC07F80003FC07F80003FC03FC0003FC03FC0003F +C01FC0003FC00FE0007FC007E000FFC003F003FFE001FC0F3FFE007FFE3FFE000FF03FFE +27327DB12D>I<000FFC00007FFF8001FC0FC003F003E007E001F00FE001F81FC000FC3F +C000FE3FC000FE7F80007E7F80007F7F80007FFF80007FFF80007FFFFFFFFFFFFFFFFFFF +800000FF800000FF800000FF8000007F8000007F8000007F8000003FC000071FC000071F +C0000E0FE0000E07F0001C03F8007800FE03E0003FFFC00007FE0020207E9F25>I<0001 +FE00000FFF80001FC3C0007F07E000FE0FF001FE0FF001FC0FF003FC0FF003FC07E003FC +018003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0000FFFF +FC00FFFFFC00FFFFFC0003FC000003FC000003FC000003FC000003FC000003FC000003FC +000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC +000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC +000003FC00007FFFF0007FFFF0007FFFF0001C327EB119>I<001FF007C000FFFE3FE001 +F83F79F007E00FC3F00FE00FE1F00FC007E0E01FC007F0001FC007F0003FC007F8003FC0 +07F8003FC007F8003FC007F8003FC007F8001FC007F0001FC007F0000FC007E0000FE00F +E00007E00FC00003F83F000006FFFE00000E1FF000000E000000001E000000001E000000 +001F000000001F800000001FFFFF80000FFFFFF0000FFFFFFC0007FFFFFE0003FFFFFF00 +03FFFFFF800FFFFFFFC03F00007FC07E00001FE07C00000FE0FC000007E0FC000007E0FC +000007E0FC000007E07E00000FC03E00000F803F00001F800FC0007E0007F803FC0001FF +FFF000001FFF0000242F7E9F28>I<01F8000000FFF8000000FFF8000000FFF80000000F +F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8 +00000007F800000007F800000007F800000007F800000007F800000007F800000007F807 +F80007F83FFE0007F8783F0007F8C03F8007F9801FC007FB001FC007FE001FE007FC001F +E007FC001FE007FC001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0 +07F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007 +F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0FFFF +C3FFFFFFFFC3FFFFFFFFC3FFFF28327DB12D>I<03C00007E0000FF0001FF8001FF8001F +F8001FF8000FF00007E00003C00000000000000000000000000000000000000000000000 +000000000001F8007FF8007FF8007FF80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F800FFFF80FFFF80FFFF8011337DB217>I< +01F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F800 +07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 +07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 +07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800FFFFC0 +FFFFC0FFFFC012327DB117>108 D<03F007F8001FE000FFF03FFE00FFF800FFF0783F01 +E0FC00FFF0C03F8300FE000FF1801FC6007F0007F3001FCC007F0007F6001FF8007F8007 +FC001FF0007F8007FC001FF0007F8007FC001FF0007F8007F8001FE0007F8007F8001FE0 +007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007 +F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0 +007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007 +F8001FE0007F8007F8001FE0007F8007F8001FE0007F8007F8001FE0007F80FFFFC3FFFF +0FFFFCFFFFC3FFFF0FFFFCFFFFC3FFFF0FFFFC3E207D9F43>I<03F007F800FFF03FFE00 +FFF0783F00FFF0C03F800FF1801FC007F3001FC007F6001FE007FC001FE007FC001FE007 +FC001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8 +001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F800 +1FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE0FFFFC3FFFFFFFFC3FF +FFFFFFC3FFFF28207D9F2D>I<0007FC0000007FFFC00001FC07F00003F001F80007E000 +FC000FC0007E001FC0007F003FC0007F803F80003F807F80003FC07F80003FC07F80003F +C0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0FF80003FE0 +FF80003FE07F80003FC07F80003FC07F80003FC03FC0007F803FC0007F801FC0007F000F +E000FE0007E000FC0003F803F80001FE0FF000007FFFC0000007FC000023207E9F28>I< +01F83FE000FFF8FFFC00FFFBE07F00FFFF003F8007FE001FC007FC000FE007F8000FF007 +F80007F807F80007F807F80007FC07F80003FC07F80003FC07F80003FE07F80003FE07F8 +0003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FE07F80003FC07F800 +07FC07F80007FC07F80007F807F80007F807F8000FF007FC000FE007FE001FC007FF003F +8007FBC0FE0007F8FFF80007F83FC00007F800000007F800000007F800000007F8000000 +07F800000007F800000007F800000007F800000007F800000007F800000007F8000000FF +FFC00000FFFFC00000FFFFC00000272E7E9F2D>I<03F03F00FFF07FC0FFF1C3E0FFF187 +E00FF30FF007F60FF007F60FF007FC07E007FC03C007FC000007FC000007F8000007F800 +0007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F800 +0007F8000007F8000007F8000007F8000007F8000007F8000007F80000FFFFE000FFFFE0 +00FFFFE0001C207E9F21>114 D<01FF860007FFFE001F00FE003C003E0078001E007800 +0E00F8000E00F8000E00F8000E00FC000000FF800000FFFC00007FFFC0003FFFF0003FFF +F8001FFFFC0007FFFE0001FFFF00003FFF000000FF8000003F8060001F80E0000F80E000 +0F80F0000F80F0000F00F8000F00FC001E00FE001C00FF807800F3FFF000C07F80001920 +7D9F20>I<001C0000001C0000001C0000001C0000001C0000003C0000003C0000003C00 +00007C0000007C000000FC000001FC000003FC000007FC00001FFFFE00FFFFFE00FFFFFE +0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00 +0003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC038003FC03 +8003FC038003FC038003FC038003FC038003FC038001FC038001FC070000FE0700007F0E +00003FFC000007F000192E7FAD1F>I<01F80007E0FFF803FFE0FFF803FFE0FFF803FFE0 +0FF8003FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007 +F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8 +001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8001FE007F8003FE007F800 +3FE003F8007FE003F8007FE001FC00DFF000FE039FFF007FFF1FFF000FFC1FFF28207D9F +2D>I119 D<7FFF807FFC7FFF807FFC7FFF807FFC03 +FC000F0001FE001E0000FF003C0000FF803800007FC07800003FC0F000001FE1E000000F +F3C000000FFF80000007FF00000003FE00000001FE00000000FF00000000FF80000000FF +C0000001FFC0000003DFE00000078FF00000078FF800000F07FC00001E03FE00003C01FE +00007800FF0000F000FF8001E0007FC003E0003FE0FFFC01FFFFFFFC01FFFFFFFC01FFFF +28207F9F2B>I E /Fr 1 14 df<0000FF00000007FFE000001F00F8000078001E0000E0 +000700018000018003000000C006000000600C000000300C000000301800000018300000 +000C300000000C6000000006600000000660000000066000000006C000000003C0000000 +03C000000003C000000003C000000003C000000003C000000003C000000003C000000003 +6000000006600000000660000000066000000006300000000C300000000C18000000180C +000000300C00000030060000006003000000C0018000018000E00007000078001E00001F +00F8000007FFE0000000FF0000282B7EA02D>13 D E /Fs 55 122 +df<0006000C00180038007000E001E003C003C0078007800F800F001F001F003E003E00 +3E007E007E007E007C007C00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00FC00 +FC00FC007C007C007E007E007E003E003E003E001F001F000F000F800780078003C003C0 +01E000E0007000380018000C00060F3C7AAC1A>40 D<3C007F00FF80FF80FFC0FFC0FFC0 +7FC03EC000C000C00180018001800300030006000E001C00380010000A157B8813>44 +D<1C007F007F00FF80FF80FF807F007F001C0009097B8813>46 D<000E00001E00007E00 +07FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 +00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 +00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00FFFFFEFFFFFEFFFFFE +17277BA622>49 D<00FF800007FFF0000FFFFC001E03FE003800FF807C003F80FE003FC0 +FF001FC0FF001FE0FF000FE0FF000FE07E000FE03C001FE000001FE000001FC000001FC0 +00003F8000003F0000007E000000FC000000F8000001F0000003E00000078000000F0000 +001E0000003C00E0007000E000E000E001C001C0038001C0060001C00FFFFFC01FFFFFC0 +3FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007 +FFFC000F81FE001F007F003F807F003F803F803F803F803F803F801F803F801F003F8000 +007F0000007F0000007E000000FC000001F8000007F00000FFC00000FFC0000001F80000 +007E0000003F0000003F8000001FC000001FC000001FE000001FE03C001FE07E001FE0FF +001FE0FF001FE0FF001FC0FF003FC0FE003F807C007F003F01FE001FFFFC0007FFF00000 +FF80001B277DA622>I<00000F0000000F0000001F0000003F0000007F000000FF000001 +FF000001FF000003BF0000073F00000E3F00001C3F00003C3F0000383F0000703F0000E0 +3F0001C03F0003803F0007803F0007003F000E003F001C003F0038003F0070003F00F000 +3F00FFFFFFF8FFFFFFF8FFFFFFF800007F0000007F0000007F0000007F0000007F000000 +7F0000007F0000007F00001FFFF8001FFFF8001FFFF81D277EA622>I<180003001F801F +001FFFFE001FFFFC001FFFF8001FFFF0001FFFC0001FFF00001C0000001C0000001C0000 +001C0000001C0000001C0000001C0000001C7FC0001DFFF8001F80FC001E003F0008003F +0000001F8000001FC000001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001F +E0FE001FE0FE001FC0FC001FC078003F8078003F803C007F001F01FE000FFFFC0003FFF0 +0000FF80001B277DA622>I<380000003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE0 +7FFFFFC07FFFFF807FFFFF0070000E0070000E0070001C00E0003800E0007000E000E000 +0001C0000001C000000380000007800000070000000F0000001F0000001E0000003E0000 +003E0000007E0000007C0000007C000000FC000000FC000000FC000000FC000001FC0000 +01FC000001FC000001FC000001FC000001FC000001FC000000F80000007000001C297CA8 +22>55 D<007F800001FFF00007FFF8000FC0FC001F803E003F001F007E001F807E001F80 +7E000F80FE000FC0FE000FC0FE000FC0FE000FE0FE000FE0FE000FE0FE000FE0FE000FE0 +7E001FE07E001FE03F003FE01F002FE00F80CFE007FF8FE001FF0FE000080FE000000FC0 +00000FC000000FC000001F803E001F807F001F807F003F007F003E007F007E007E00FC00 +3E03F8001FFFE0000FFF800001FE00001B277DA622>57 D<000007800000000007800000 +00000FC0000000000FC0000000000FC0000000001FE0000000001FE0000000003FF00000 +00003FF0000000003FF00000000077F80000000077F800000000F7FC00000000E3FC0000 +0000E3FC00000001C1FE00000001C1FE00000003C1FF0000000380FF0000000380FF0000 +0007007F80000007007F8000000F007FC000000E003FC000000E003FC000001C001FE000 +001C001FE000003FFFFFF000003FFFFFF000003FFFFFF00000700007F80000700007F800 +00F00007FC0000E00003FC0001E00003FE0001C00001FE0001C00001FE0003C00001FF00 +FFFE003FFFFCFFFE003FFFFCFFFE003FFFFC2E297EA833>65 DI<00007FE0030007FFFC07001FFFFF +0F007FF00F9F00FF0001FF01FC0000FF03F800007F07F000003F0FE000001F1FC000001F +1FC000000F3F8000000F3F800000077F800000077F800000077F00000000FF00000000FF +00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00 +0000007F000000007F800000007F800000073F800000073F800000071FC00000071FC000 +000E0FE000000E07F000001C03F800003C01FC00007800FF0001F0007FF007C0001FFFFF +800007FFFE0000007FF00028297CA831>IIII<00007FE003000007FFFC0700001FFFFF0F00007FF00F9F0000 +FF0001FF0001FC0000FF0003F800007F0007F000003F000FE000001F001FC000001F001F +C000000F003F8000000F003F80000007007F80000007007F80000007007F0000000000FF +0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF +0000000000FF0000000000FF0000FFFFF87F0000FFFFF87F8000FFFFF87F800000FF003F +800000FF003F800000FF001FC00000FF001FC00000FF000FE00000FF0007F00000FF0003 +F80000FF0001FC0000FF0000FF0001FF00007FF007FF00001FFFFF9F000007FFFE0F0000 +007FF003002D297CA835>III75 +DIII<0000FFC00000000FFFFC0000003F807F000000FE001FC00001F800 +07E00003F00003F00007E00001F8000FE00001FC001FC00000FE001FC00000FE003F8000 +007F003F8000007F007F8000007F807F0000003F807F0000003F807F0000003F80FF0000 +003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000 +003FC0FF0000003FC0FF0000003FC0FF0000003FC07F0000003F807F8000007F807F8000 +007F803F8000007F003F8000007F001FC00000FE001FC00000FE000FE00001FC0007F000 +03F80003F80007F00001FC000FE00000FE001FC000003FC0FF0000000FFFFC00000000FF +C000002A297CA833>II<0000FFC00000000FFFFC0000003FC0FF000000FE001FC00001FC000FE000 +03F00003F00007F00003F8000FE00001FC001FC00000FE001FC00000FE003F8000007F00 +3F8000007F007F8000007F807F8000007F807F0000003F807F0000003F80FF0000003FC0 +FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0 +FF0000003FC0FF0000003FC0FF0000003FC07F0000003F807F8000007F807F8000007F80 +3F8000007F003F8000007F001FC00000FE001FC03E00FE000FE07F81FC0007E0C1C1F800 +03F18063F00001F98067E00000FF803FC000003FC07F0000000FFFFC00000000FFF800C0 +0000003C00C00000001E00C00000001E01C00000001F83C00000001FFFC00000000FFF80 +0000000FFF800000000FFF0000000007FF0000000003FE0000000001FC0000000000F800 +2A357CA833>II<00FF806003FFF0E00FFFF8E01F80FDE03F001FE03E0007E07C0003E0 +7C0003E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FFC000007FFC0000 +7FFFE0003FFFF8001FFFFE001FFFFF0007FFFF8003FFFFC000FFFFC0000FFFE000007FE0 +00001FF000000FF0000007F0E00003F0E00003F0E00003F0E00003F0F00003E0F00003E0 +F80007E0FC0007C0FF000F80FFE03F80E3FFFE00E1FFFC00C01FF0001C297CA825>I<7F +FFFFFFFF807FFFFFFFFF807FFFFFFFFF807F807F807F807C007F800F8078007F80078078 +007F80078070007F800380F0007F8003C0F0007F8003C0E0007F8001C0E0007F8001C0E0 +007F8001C0E0007F8001C0E0007F8001C000007F80000000007F80000000007F80000000 +007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000 +007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000 +007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000 +007F80000000FFFFFFC00000FFFFFFC00000FFFFFFC0002A287EA72F>IIII89 D<03FF80000FFFF0001F01FC003F80FE003F807F003F80 +3F003F803F801F003F8000003F8000003F8000003F8000003F80003FFF8001FC3F800FE0 +3F801F803F803F003F807E003F80FC003F80FC003F80FC003F80FC003F80FC005F807E00 +DF803F839FFC1FFE0FFC03FC03FC1E1B7E9A21>97 DI<003FF00001FFFC0003F03E000FC07F001F807F +003F007F003F007F007F003E007E0000007E000000FE000000FE000000FE000000FE0000 +00FE000000FE000000FE0000007E0000007E0000007F0000003F0003803F8003801F8007 +000FE00E0003F83C0001FFF800003FC000191B7E9A1E>I<00007FF000007FF000007FF0 +000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0 +000007F0000007F0000007F0003F87F001FFF7F007F03FF00FC00FF01F8007F03F0007F0 +3F0007F07E0007F07E0007F07E0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0 +FE0007F0FE0007F0FE0007F07E0007F07E0007F03F0007F03F0007F01F800FF00FC01FF0 +07E07FFF01FFE7FF007F87FF202A7EA925>I<003FC00001FFF00003E07C000F803E001F +801F001F001F003F000F807E000F807E000FC07E000FC0FE0007C0FE0007C0FFFFFFC0FF +FFFFC0FE000000FE000000FE0000007E0000007E0000007F0000003F0001C01F0001C00F +80038007C0070003F01E0000FFFC00003FE0001A1B7E9A1F>I<0007F8003FFC007E3E01 +FC7F03F87F03F07F07F07F07F03E07F00007F00007F00007F00007F00007F00007F000FF +FFC0FFFFC0FFFFC007F00007F00007F00007F00007F00007F00007F00007F00007F00007 +F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0007F +FF807FFF807FFF80182A7EA915>I<00FF80F003FFE3F80FC1FE1C1F007C7C3F007E7C3E +003E107E003F007E003F007E003F007E003F007E003F007E003F003E003E003F007E001F +007C000FC1F8000BFFE00018FF80001800000038000000380000003C0000003FFFF8003F +FFFF001FFFFFC00FFFFFE007FFFFF01FFFFFF03C0007F07C0001F8F80000F8F80000F8F8 +0000F8F80000F87C0001F07C0001F03F0007E00FC01F8007FFFF00007FF0001E287E9A22 +>II<07000F +801FC03FE03FE03FE01FC00F8007000000000000000000000000000000FFE0FFE0FFE00F +E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F +E00FE00FE0FFFEFFFEFFFE0F2B7EAA12>I +108 DII<003FE00001FFFC0003F0 +7E000FC01F801F800FC03F0007E03F0007E07E0003F07E0003F07E0003F0FE0003F8FE00 +03F8FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE0003F87E0003F07E0003F03F00 +07E03F0007E01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22>II114 +D<03FE300FFFF03E03F07800F07000F0F00070F00070F80070FE0000FFE0007FFF007FFF +C03FFFE01FFFF007FFF800FFF80007FC0000FCE0007CE0003CF0003CF00038F80038FC00 +70FF01E0E7FFC0C1FF00161B7E9A1B>I<00E00000E00000E00000E00001E00001E00001 +E00003E00003E00007E0000FE0001FFFE0FFFFE0FFFFE00FE0000FE0000FE0000FE0000F +E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0700FE0700FE0700F +E0700FE0700FE0700FE07007F0E003F0C001FF80007F0014267FA51A>I +IIIII E /Ft 90 +127 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F870000000000070F8F8F870051C779B +18>33 D<4010E038F078E038E038E038E038E038E038E038E038E038E03860300D0E7B9C +18>I<030600078F00078F00078F00078F00078F00078F007FFFC0FFFFE0FFFFE07FFFC0 +0F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FFFFE07FFFC01E3C001E3C00 +1E3C001E3C001E3C001E3C000C1800131C7E9B18>I<00C00001C00001C00001C00003F0 +000FFC003FFE007DCF0071C700E1C380E1C780E1C780E1C780F1C00079C0003FC0001FE0 +000FF80001FC0001DE0001CF0001C70061C380F1C380F1C380E1C380E1C70071C70079DE +003FFE001FF80007E00001C00001C00001C00000C00011247D9F18>I<3803007C07807C +0780EE0F80EE0F00EE0F00EE1F00EE1E00EE1E00EE3E007C3C007C3C00387C0000780000 +780000F80000F00001F00001E00001E00003E00003C00003C00007C0000783800787C00F +87C00F0EE00F0EE01F0EE01E0EE01E0EE03E0EE03C07C03C07C018038013247E9F18>I< +01C00007E0000FF0000E70001C38001C38001C38001C38001C73F81CF3F81CE3F80FC1C0 +0FC3800F83800F03801F07003F87007B8E0071CE00E1FC00E0FC00E07C00E07870E07870 +70FE707FFFE03FC7E00F03C0151C7F9B18>I<387C7C7E3E0E0E0E1C1C38F8F0C0070E78 +9B18>I<007000F001E003C007800F001E001C00380038007000700070007000E000E000 +E000E000E000E000E000E0007000700070007000380038001C001E000F00078003C001F0 +00F000700C24799F18>I<6000F00078003C001E000F000780038001C001C000E000E000 +E000E00070007000700070007000700070007000E000E000E000E001C001C0038007800F +001E003C007800F00060000C247C9F18>I<01C00001C00001C00001C00041C100F1C780 +FDDF807FFF001FFC0007F00007F0001FFC007FFF00FDDF80F1C78041C10001C00001C000 +01C00001C00011147D9718>I<00600000F00000F00000F00000F00000F00000F00000F0 +007FFFC0FFFFE0FFFFE07FFFC000F00000F00000F00000F00000F00000F00000F0000060 +0013147E9718>I<1C3E7E7F3F1F070E1E7CF860080C788518>I<7FFFC0FFFFE0FFFFE07F +FFC013047E8F18>I<3078FCFC78300606778518>I<000300000780000780000F80000F00 +001F00001E00001E00003E00003C00007C0000780000780000F80000F00001F00001E000 +03E00003C00003C00007C0000780000F80000F00000F00001F00001E00003E00003C0000 +3C00007C0000780000F80000F00000F0000060000011247D9F18>I<01F00007FC000FFE +001F1F001C07003803807803C07001C07001C0E000E0E000E0E000E0E000E0E000E0E000 +E0E000E0E000E0E000E0F001E07001C07001C07803C03803801C07001F1F000FFE0007FC +0001F000131C7E9B18>I<01800380038007800F803F80FF80FB80438003800380038003 +800380038003800380038003800380038003800380038003807FFCFFFE7FFC0F1C7B9B18 +>I<03F0000FFE003FFF007C0F807003C0E001C0F000E0F000E06000E00000E00000E000 +01C00001C00003C0000780000F00001E00003C0000780000F00001E00007C0000F80001E +00E03C00E07FFFE0FFFFE07FFFE0131C7E9B18>I<001F00003F0000770000770000E700 +01E70001C7000387000787000707000E07001E07003C0700380700780700F00700FFFFF8 +FFFFF8FFFFF8000700000700000700000700000700000700007FF0007FF0007FF0151C7F +9B18>52 D<3FFF803FFF803FFF8038000038000038000038000038000038000038000038 +00003BF8003FFE003FFF003C07803003C00001C00000E00000E06000E0F000E0F000E0E0 +01C07003C07C0F803FFF001FFC0003F000131C7E9B18>I<007E0001FF0007FF800F83C0 +1E03C01C03C0380180380000700000700000E1F800E7FE00FFFF00FE0780F803C0F001C0 +F000E0E000E0F000E07000E07000E07000E03801C03C03C01E07800FFF0007FE0001F800 +131C7E9B18>II<03F8000FFE001F +FF003E0F803803807001C07001C07001C07001C03803803C07801FFF0007FC000FFE001F +1F003C07807001C0F001E0E000E0E000E0E000E0E000E07001C07803C03E0F801FFF000F +FE0003F800131C7E9B18>I<3078FCFC783000000000000000003078FCFC783006147793 +18>58 D<183C7E7E3C180000000000000000183C7E7E3E1E0E1C3C78F060071A789318> +I<0000C00003E00007E0001FC0003F8000FE0001FC0007F0000FE0003F80007F0000FC00 +00FC00007F00003F80000FE00007F00001FC0000FE00003F80001FC00007E00003E00000 +C013187E9918>I<7FFFC0FFFFE0FFFFE07FFFC00000000000000000000000007FFFC0FF +FFE0FFFFE07FFFC0130C7E9318>I<600000F80000FC00007F00003F80000FE00007F000 +01FC0000FE00003F80001FC00007E00007E0001FC0003F8000FE0001FC0007F0000FE000 +3F80007F0000FC0000F8000060000013187E9918>I<0FF0003FFC007FFF00700F00F003 +80F00380600780000F00003E00007C0001F00001E00003C00003C00003C00003C00003C0 +0003800000000000000000000000000000000003800007C00007C00007C000038000111C +7D9B18>I<007C0001FE0007FF000F87801E03C03C1DC0387FC070FFE071E3E071C1E0E1 +C1E0E380E0E380E0E380E0E380E0E380E0E380E0E1C1C071C1C071E3C070FF80387F003C +1C001E00E00F83E007FFC001FF80007E00131C7E9B18>I<00700000F80000F80000D800 +00D80001DC0001DC0001DC00018C00038E00038E00038E00038E00070700070700070700 +0707000707000FFF800FFF800FFF800E03801C01C01C01C01C01C07F07F0FF07F87F07F0 +151C7F9B18>I<7FFC00FFFF007FFF801C03C01C01C01C00E01C00E01C00E01C00E01C01 +E01C01C01C07C01FFF801FFF001FFFC01C03C01C00E01C00F01C00701C00701C00701C00 +701C00F01C00E01C03E07FFFC0FFFF807FFE00141C7F9B18>I<00F8E003FEE007FFE00F +07E01E03E03C01E03800E07000E07000E0700000E00000E00000E00000E00000E00000E0 +0000E00000E000007000007000E07000E03800E03C00E01E01C00F07C007FF8003FE0000 +F800131C7E9B18>I<7FF800FFFE007FFF001C0F801C03C01C03C01C01E01C00E01C00E0 +1C00F01C00701C00701C00701C00701C00701C00701C00701C00701C00F01C00E01C00E0 +1C01E01C01C01C03C01C0F807FFF00FFFE007FF800141C7F9B18>III<01F1C003FDC0 +0FFFC01F0FC01C03C03803C03801C07001C07001C0700000E00000E00000E00000E00000 +E00000E00FF0E01FF0E00FF07001C07001C07003C03803C03803C01C07C01F0FC00FFFC0 +03FDC001F1C0141C7E9B18>I<7F07F0FF8FF87F07F01C01C01C01C01C01C01C01C01C01 +C01C01C01C01C01C01C01C01C01FFFC01FFFC01FFFC01C01C01C01C01C01C01C01C01C01 +C01C01C01C01C01C01C01C01C01C01C07F07F0FF8FF87F07F0151C7F9B18>I<7FFF00FF +FF807FFF0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001 +C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0007F +FF00FFFF807FFF00111C7D9B18>I<01FFC001FFC001FFC0000E00000E00000E00000E00 +000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E00F00E00F00E00F03C007FFC003FF0000FC000121C7D9B18>I<7F07 +F0FF87F87F07F01C03C01C07801C07001C0E001C1E001C3C001C38001C70001CF0001DF0 +001DF0001FB8001FB8001F1C001E1C001C0E001C0E001C07001C07001C03801C03801C01 +C07F03F0FF87F87F03F0151C7F9B18>II< +FC01F8FE03F8FE03F83B06E03B06E03B06E03B06E03B8EE03B8EE0398CE0398CE039DCE0 +39DCE039DCE038D8E038D8E038F8E03870E03870E03800E03800E03800E03800E03800E0 +3800E0FE03F8FE03F8FE03F8151C7F9B18>I<7E07F0FF0FF87F07F01D81C01D81C01D81 +C01DC1C01CC1C01CC1C01CE1C01CE1C01CE1C01C61C01C71C01C71C01C31C01C39C01C39 +C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0DC07F07C0FF87C07F03C0151C7F9B18 +>I<0FFE003FFF807FFFC07803C07001C0F001E0E000E0E000E0E000E0E000E0E000E0E0 +00E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E070 +01C07C07C07FFFC03FFF800FFE00131C7E9B18>II<0FFE003FFF807FFFC07803C07001C0F001E0E000E0E000E0E000E0E000E0E000 +E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E070E0E070E0F079 +E07039C0783FC07FFFC03FFF800FFE00000F000007800007800003C00001C00001C01322 +7E9B18>I<7FF800FFFE007FFF001C0F801C03801C03C01C01C01C01C01C01C01C03C01C +03801C0F801FFF001FFE001FFE001C0F001C07001C03801C03801C03801C03801C03801C +039C1C039C1C039C7F01F8FF81F87F00F0161C7F9B18>I<03F1C01FFFC03FFFC07C0FC0 +7003C0E001C0E001C0E001C0E000007000007800003F00001FF00007FE0000FF00000F80 +0003C00001C00000E00000E06000E0E000E0E001E0F001C0F80780FFFF80FFFE00E7F800 +131C7E9B18>I<7FFFF8FFFFF8FFFFF8E07038E07038E07038E070380070000070000070 +000070000070000070000070000070000070000070000070000070000070000070000070 +0000700000700000700007FF0007FF0007FF00151C7F9B18>IIII<7F0FE07F9FE07F0FE00E07000F0700070E00078E00039C0003 +DC0001F80001F80000F80000F00000700000F00000F80001FC0001DC00039E00038E0007 +0F000707000E07800E03801E03C07F07F0FF07F87F07F0151C7F9B18>II91 D<600000F00000F00000F80000780000 +7C00003C00003C00003E00001E00001F00000F00000F00000F800007800007C00003C000 +03C00003E00001E00001F00000F00000F800007800007800007C00003C00003E00001E00 +001E00001F00000F00000F8000078000078000030011247D9F18>II<7F +FFC0FFFFE0FFFFE07FFFC013047E7F18>95 D<061E3E387070E0E0E0F8FC7C7C38070E78 +9E18>I<0FF0001FFC003FFE003C0F0018070000038000038000FF8007FF801FFF807F03 +80780380E00380E00380E00380F00780780F803FFFF81FFDF807F0F815147E9318>I<7E +0000FE00007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00FC1E00F +80E00F00700E00700E00380E00380E00380E00380E00380E00380F00700F00700F80E00F +C1E00FFFC00EFF80063E00151C809B18>I<01FE0007FF001FFF803E0780380300700000 +700000E00000E00000E00000E00000E00000E000007000007001C03801C03E03C01FFF80 +07FF0001FC0012147D9318>I<001F80003F80001F800003800003800003800003800003 +8003E3800FFB801FFF803C1F80380F80700780700380E00380E00380E00380E00380E003 +80E00380700780700780380F803C1F801FFFF00FFBF803E3F0151C7E9B18>I<01F00007 +FC001FFE003E0F00380780700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0E0000070 +00007001C03801C03E07C01FFF8007FF0001F80012147D9318>I<001F80007FC000FFE0 +00E1E001C0C001C00001C00001C0007FFFC0FFFFC0FFFFC001C00001C00001C00001C000 +01C00001C00001C00001C00001C00001C00001C00001C00001C00001C0007FFF007FFF00 +7FFF00131C7F9B18>I<01E1F007FFF80FFFF81E1E301C0E003807003807003807003807 +003807001C0E001E1E001FFC001FF80039E0003800001C00001FFE001FFFC03FFFE07801 +F0700070E00038E00038E00038E000387800F07E03F01FFFC00FFF8001FC00151F7F9318 +>I<7E0000FE00007E00000E00000E00000E00000E00000E00000E3E000EFF800FFFC00F +C1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E +00E00E00E07FC7FCFFE7FE7FC7FC171C809B18>I<038007C007C007C003800000000000 +0000007FC0FFC07FC001C001C001C001C001C001C001C001C001C001C001C001C001C001 +C0FFFFFFFFFFFF101D7C9C18>I<0038007C007C007C003800000000000000000FFC0FFC +0FFC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001C6038F078FFF07FE03F800E277E9C18>I<7E0000FE00007E0000 +0E00000E00000E00000E00000E00000E3FF00E3FF00E3FF00E07800E0F000E1E000E3C00 +0E78000EF0000FF8000FFC000F9C000F0E000E0F000E07000E03800E03C07FC7F8FFC7F8 +7FC7F8151C7F9B18>III<7E3E00FEFF807FFFC00FC1C0 +0F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0 +0E00E07FC7FCFFE7FE7FC7FC1714809318>I<01F0000FFE001FFF003E0F803803807001 +C07001C0E000E0E000E0E000E0E000E0E000E0F001E07001C07803C03C07803E0F801FFF +000FFE0001F00013147E9318>I<7E3E00FEFF807FFFC00FC1E00F80E00F00700E00700E +00380E00380E00380E00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF800E +3E000E00000E00000E00000E00000E00000E00000E00007FC000FFE0007FC000151E8093 +18>I<01F38007FB801FFF803E1F80380F80700780700780E00380E00380E00380E00380 +E00380E00380700780700780380F803C1F801FFF800FFB8003E380000380000380000380 +000380000380000380000380001FF0003FF8001FF0151E7E9318>II<07F7003FFF007FFF00780F00E0 +0700E00700E007007C00007FE0001FFC0003FE00001F00600780E00380E00380F00380F8 +0F00FFFF00FFFC00E7F00011147D9318>I<0180000380000380000380000380007FFFC0 +FFFFC0FFFFC0038000038000038000038000038000038000038000038000038000038040 +0380E00380E00380E001C1C001FFC000FF80003E0013197F9818>I<7E07E0FE0FE07E07 +E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00 +E00E01E00F03E007FFFC03FFFE01FCFC1714809318>I<7F8FF0FF8FF87F8FF01C01C00E +03800E03800E0380070700070700070700078F00038E00038E00038E0001DC0001DC0001 +DC0000F80000F80000700015147F9318>II<7F8FF07F9FF07F8FF00F0700078E00039E0001DC0001F8 +0000F80000700000F00000F80001DC00039E00038E000707000E07807F8FF0FF8FF87F8F +F015147F9318>I<7F8FF0FF8FF87F8FF00E01C00E03800E038007038007070007070003 +8700038700038E0001CE0001CE0001CC0000CC0000DC0000780000780000780000700000 +700000700000F00000E00079E0007BC0007F80003F00001E0000151E7F9318>I<3FFFF0 +7FFFF07FFFF07001E07003C0700780000F00001E00003C0000F80001F00003C000078000 +0F00701E00703C0070780070FFFFF0FFFFF0FFFFF014147F9318>I<0007E0001FE0007F +E000780000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0001E0007FC000FF8000FF80007FC00001E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E000007800007FE0001FE00007E013247E9F18>I<60 +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F06004 +24769F18>I<7C0000FF0000FFC00003C00000E00000E00000E00000E00000E00000E000 +00E00000E00000E00000E00000E00000F000007FC0003FE0003FE0007FC000F00000E000 +00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00003C000FFC000 +FF00007C000013247E9F18>I<060C1F1E3FBEFBF8F1F060C00F067C9B18>I +E /Fu 77 123 df<001F83E000F06E3001C078780380F8780300F0300700700007007000 +0700700007007000070070000700700007007000FFFFFF80070070000700700007007000 +070070000700700007007000070070000700700007007000070070000700700007007000 +0700700007007000070070000700700007007000070070003FE3FF001D20809F1B>11 +D<003F0000E0C001C0C00381E00701E00701E00700000700000700000700000700000700 +00FFFFE00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700 +E00700E00700E00700E00700E00700E00700E00700E03FC3FC1620809F19>I<003FE000 +E0E001C1E00381E00700E00700E00700E00700E00700E00700E00700E00700E0FFFFE007 +00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E007 +00E00700E00700E00700E00700E00700E03FE7FC1620809F19>I<001F81F80000F04F04 +0001C07C06000380F80F000300F00F000700F00F00070070000007007000000700700000 +070070000007007000000700700000FFFFFFFF0007007007000700700700070070070007 +007007000700700700070070070007007007000700700700070070070007007007000700 +700700070070070007007007000700700700070070070007007007000700700700070070 +07003FE3FE3FE02320809F26>I<7038F87CFC7EFC7E743A040204020402080408041008 +1008201040200F0E7F9F17>34 D<00400000400003F0000C4E0010410020408060408040 +4040C041C0C043C0C043C0E04180E040007040007C40003FC0001FF8000FFC0003FE0000 +7F00004F800043800041C00041C0F040C0F040C0F040C08040C080408040418020410030 +42000C4C0003F00000400000400000400012257EA117>36 D<70F8FCFC74040404080810 +102040060E7C9F0D>39 D<0040008001000300060004000C001800180038003000300070 +006000600060006000E000E000E000E000E000E000E000E000E000E000E000E000600060 +00600060007000300030003800180018000C000400060003000100008000400A2E7BA112 +>I<8000400020003000180008000C000600060007000300030003800180018001800180 +01C001C001C001C001C001C001C001C001C001C001C001C0018001800180018003800300 +03000700060006000C000800180030002000400080000A2E7EA112>I<70F0F8F8780808 +08101010202040050E7C840D>44 DI<70F8F8F87005057C840D> +I<0000400000C0000180000180000180000300000300000300000600000600000C00000C +00000C0000180000180000180000300000300000600000600000600000C00000C00000C0 +000180000180000180000300000300000600000600000600000C00000C00000C00001800 +00180000300000300000300000600000600000600000C00000C00000122D7EA117>I<03 +F0000E1C001C0E00180600380700700380700380700380700380F003C0F003C0F003C0F0 +03C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C070038070038070 +03807807803807001806001C0E000E1C0003F000121F7E9D17>I<008003800F80F38003 +800380038003800380038003800380038003800380038003800380038003800380038003 +800380038003800380038007C0FFFE0F1E7C9D17>I<03F0000C1C00100E002007004007 +80800780F007C0F803C0F803C0F803C02007C00007C0000780000780000F00000E00001C +0000380000700000600000C0000180000300000600400C00401800401000803FFF807FFF +80FFFF80121E7E9D17>I<03F0000C1C00100E00200F00780F80780780780780380F8000 +0F80000F00000F00001E00001C0000700007F000003C00000E00000F0000078000078000 +07C02007C0F807C0F807C0F807C0F00780400780400F00200E00183C0007F000121F7E9D +17>I<000600000600000E00000E00001E00002E00002E00004E00008E00008E00010E00 +020E00020E00040E00080E00080E00100E00200E00200E00400E00C00E00FFFFF0000E00 +000E00000E00000E00000E00000E00000E0000FFE0141E7F9D17>I<1803001FFE001FFC +001FF8001FE00010000010000010000010000010000010000011F000161C00180E001007 +001007800003800003800003C00003C00003C07003C0F003C0F003C0E003804003804007 +00200600100C0008380007E000121F7E9D17>I<007C000182000701000E03800C078018 +0780380300380000780000700000700000F1F000F21C00F40600F80700F80380F80380F0 +03C0F003C0F003C0F003C0F003C07003C07003C07003803803803807001807000C0E0006 +1C0001F000121F7E9D17>I<4000007FFFE07FFFC07FFFC0400080800100800100800200 +00040000040000080000100000100000200000200000600000600000E00000C00001C000 +01C00001C00001C00003C00003C00003C00003C00003C00003C00003C000018000131F7E +9D17>I<03F0000C0C001006003003002001806001806001806001807001807803003E03 +003F06001FC8000FF00003F80007FC000C7E00103F00300F806007806001C0C001C0C000 +C0C000C0C000C0C000806001802001001002000C0C0003F000121F7E9D17>I<03F0000E +18001C0C00380600380700700700700380F00380F00380F003C0F003C0F003C0F003C0F0 +03C07007C07007C03807C0180BC00E13C003E3C000038000038000038000070030070078 +0600780E00700C002018001070000FC000121F7E9D17>I<70F8F8F87000000000000000 +00000070F8F8F87005147C930D>I<70F8F8F8700000000000000000000070F0F8F87808 +0808101010202040051D7C930D>I<000100000003800000038000000380000007C00000 +07C0000007C0000009E0000009E0000009E0000010F0000010F0000010F0000020780000 +2078000020780000403C0000403C0000C03E0000801E0000801E0001FFFF0001000F0001 +000F00020007800200078002000780040003C0040003C00C0003C01E0003E0FF801FFE1F +207F9F22>65 DI<000FE0100038 +1C3000E0027003C00170078000F00F0000701E0000701E0000303C0000303C0000107C00 +001078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F800 +0000F8000000780000007C0000103C0000103C0000101E0000201E0000200F0000200780 +004003C0008000E0030000380C00000FF0001C217E9F21>IIII<000FE01000381C3000E0027003C0 +0170078000F00F0000701E0000701E0000303C0000303C0000107C00001078000010F800 +0000F8000000F8000000F8000000F8000000F8000000F8000000F8003FFEF80001F07800 +00F07C0000F03C0000F03C0000F01E0000F01E0000F00F0000F0078000F003C0017000E0 +023000380C10000FF0001F217E9F24>II +I75 DIII<001FE0000070380001C00E000380 +0700070003800F0003C01E0001E03C0000F03C0000F07C0000F87C0000F878000078F800 +007CF800007CF800007CF800007CF800007CF800007CF800007CF800007CF800007C7800 +00787C0000F87C0000F83C0000F03E0001F01E0001E00F0003C0070003800380070001E0 +1E0000703800001FE0001E217E9F23>II82 +D<03F0400C0CC01803C03001C06000C06000C0E000C0E00040E00040E00040F00000F800 +007C00007F80003FF8001FFF0007FF8000FFC0001FE00003E00001E00000F00000708000 +70800070800070800070C00060C000E0E000C0F80180C6030081FC0014217E9F19>I<7F +FFFFE0780F01E0600F0060400F0020400F0020C00F0030800F0010800F0010800F001080 +0F0010000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000 +0F0000000F0000001F800003FFFC001C1F7E9E21>IIII89 D91 +D<080410082010201040204020804080408040B85CFC7EFC7E7C3E381C0F0E7A9F17>I< +FFFF03030303030303030303030303030303030303030303030303030303030303030303 +03030303030303FFFF082D80A10D>I<081020204040808080B8FCFC7C38060E7D9F0D> +96 D<1FE000303000781800781C00300E00000E00000E00000E0000FE00078E001E0E00 +380E00780E00F00E10F00E10F00E10F01E10781E103867200F83C014147E9317>I<1C00 +00FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C +001D87001E01801E00C01C00E01C00701C00701C00781C00781C00781C00781C00781C00 +781C00701C00F01C00E01E00C01A0180198700107C0015207E9F19>I<01FC000706001C +0F00380F00380600780000700000F00000F00000F00000F00000F00000F0000070000078 +00003800803800801C010007060001F80011147F9314>I<0001C0000FC00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C00001C001F1C0070DC00C03C01801C0 +3801C07801C07001C0F001C0F001C0F001C0F001C0F001C0F001C07001C07001C03801C0 +1803C00C03C0070DC001F1F815207F9F19>I<03F0000E1C001C0E003807003807007007 +00700380F00380F00380FFFF80F00000F00000F000007000007000003800803800801C01 +0007060001F80011147F9314>I<007C01C6030F070F0E060E000E000E000E000E000E00 +0E00FFF00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 +0E000E007FE01020809F0E>I<0000E003E3300E3C301C1C30380E00780F00780F00780F +00780F00780F00380E001C1C001E380033E0002000002000003000003000003FFE001FFF +801FFFC03001E0600070C00030C00030C00030C000306000603000C01C038003FC00141F +7F9417>I<1C0000FC00001C00001C00001C00001C00001C00001C00001C00001C00001C +00001C00001C7C001C86001D03001E03801E03801C03801C03801C03801C03801C03801C +03801C03801C03801C03801C03801C03801C03801C03801C0380FF8FF014207E9F19>I< +38007C007C007C0038000000000000000000000000001C00FC001C001C001C001C001C00 +1C001C001C001C001C001C001C001C001C001C001C001C00FF80091F7F9E0C>I<00E001 +F001F001F000E0000000000000000000000000007007F000F00070007000700070007000 +700070007000700070007000700070007000700070007000700070007000706070F060F0 +C061803F000C28829E0E>I<1C0000FC00001C00001C00001C00001C00001C00001C0000 +1C00001C00001C00001C00001C1FE01C07801C06001C04001C08001C10001C20001C6000 +1CE0001DF0001E70001C38001C3C001C1C001C0E001C0F001C07001C07801C07C0FF9FF0 +14207E9F18>I<1C00FC001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF8009 +207F9F0C>I<1C3E03E000FCC30C30001D039038001E01E01C001E01E01C001C01C01C00 +1C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C +01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF802114 +7E9326>I<1C7C00FC86001D03001E03801E03801C03801C03801C03801C03801C03801C +03801C03801C03801C03801C03801C03801C03801C03801C0380FF8FF014147E9319>I< +01F800070E001C03803801C03801C07000E07000E0F000F0F000F0F000F0F000F0F000F0 +F000F07000E07000E03801C03801C01C0380070E0001F80014147F9317>I<1C7C00FD87 +001E01801E01C01C00E01C00F01C00701C00781C00781C00781C00781C00781C00781C00 +701C00F01C00E01E01C01E03801D87001C7C001C00001C00001C00001C00001C00001C00 +001C00001C0000FF8000151D7E9319>I<01F040070CC00E02C01C03C03801C07801C070 +01C0F001C0F001C0F001C0F001C0F001C0F001C07001C07801C03801C01C03C00C05C007 +09C001F1C00001C00001C00001C00001C00001C00001C00001C00001C0000FF8151D7F93 +18>I<1CF0FD181E3C1E3C1E181C001C001C001C001C001C001C001C001C001C001C001C +001C001C00FFC00E147E9312>I<0FC830386018C008C008C008E0007C003FE01FF007F8 +003C800E8006C006C006C004E00CD81887E00F147F9312>I<020002000200060006000E +000E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E +040E040708030801F00E1C7F9B12>I<1C0380FC1F801C03801C03801C03801C03801C03 +801C03801C03801C03801C03801C03801C03801C03801C03801C03801C07800C0780061B +8003E3F014147E9319>IIIII<7FFF700E600E401C40384078407000E001E001C00380078007010E011E011C033802 +7006700EFFFE10147F9314>I E /Fv 14 122 df<0000001FFC0000C000000003FFFFC0 +01C00000001FFFFFF003C00000007FFFFFFC07C0000001FFFC00FE0FC0000007FFC0001F +9FC000000FFE000007FFC000003FF8000003FFC000007FF0000000FFC00000FFE0000000 +7FC00001FFC00000007FC00001FF800000003FC00003FF000000001FC00007FE00000000 +1FC0000FFE000000000FC0000FFC000000000FC0001FFC0000000007C0001FFC00000000 +07C0003FF80000000007C0003FF80000000003C0003FF80000000003C0007FF800000000 +03C0007FF80000000003C0007FF0000000000000007FF000000000000000FFF000000000 +000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000000000 +000000FFF000000000000000FFF000000000000000FFF000000000000000FFF000000000 +000000FFF000000000000000FFF000001FFFFFFF807FF000001FFFFFFF807FF000001FFF +FFFF807FF800001FFFFFFF807FF800000001FFC0003FF800000001FFC0003FF800000001 +FFC0003FF800000001FFC0001FFC00000001FFC0001FFC00000001FFC0000FFE00000001 +FFC0000FFE00000001FFC00007FF00000001FFC00003FF00000001FFC00001FF80000001 +FFC00001FFC0000001FFC00000FFE0000001FFC000007FF0000003FFC000003FFC000003 +FFC000000FFF000007FFC0000007FFC0001FBFC0000001FFFC00FF1FC00000007FFFFFFE +0FC00000001FFFFFF803C000000003FFFFE000C0000000001FFE00000000413D7BBB4C> +71 D76 +D78 +D82 D85 D<003FFE00000001FFFFE0000007FFFFF800000F +E007FC00000FF001FE00001FF800FF00001FF8007F80001FF8007FC0001FF8003FC0000F +F0003FE00007E0003FE00003C0003FE0000000003FE0000000003FE0000000003FE00000 +00003FE0000000FFFFE000001FFFFFE000007FF83FE00003FF803FE00007FC003FE0000F +F0003FE0001FE0003FE0003FE0003FE0007FC0003FE0007FC0003FE000FF80003FE000FF +80003FE000FF80003FE000FF80003FE000FF80007FE0007FC0007FE0007FC000DFE0003F +E0039FF0001FF80F0FFFE007FFFE0FFFE001FFFC07FFE0003FE000FFE02B267DA52F>97 +D<00FE00000000FFFE00000000FFFE00000000FFFE00000000FFFE0000000007FE000000 +0003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE000000 +0003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE000000 +0003FE0000000003FE0000000003FE0000000003FE0000000003FE01FF000003FE1FFFF0 +0003FE7FFFFC0003FEFC03FE0003FFF000FF0003FFC0003F8003FF00001FC003FE00001F +E003FE00000FF003FE00000FF803FE00000FF803FE000007FC03FE000007FC03FE000007 +FC03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007 +FE03FE000007FE03FE000007FE03FE000007FE03FE000007FC03FE000007FC03FE000007 +FC03FE00000FFC03FE00000FF803FE00000FF003FE00001FF003FF00001FE003FF80003F +C003FFC0007F8003F9E000FF0003F0FC07FE0003F07FFFF80003E01FFFE00003C003FE00 +002F3C7DBB36>I<000000003F800000003FFF800000003FFF800000003FFF800000003F +FF8000000001FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 +FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000 +FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000FF80 +FF80000FFFF0FF80003FFFFCFF8000FFC03FFF8001FE000FFF8003FC0003FF8007F80001 +FF800FF00000FF801FF00000FF803FE00000FF803FE00000FF807FE00000FF807FC00000 +FF807FC00000FF807FC00000FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC00000 +FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC00000FF807FC00000 +FF807FC00000FF807FC00000FF803FE00000FF803FE00000FF801FE00000FF800FF00001 +FF8007F80003FF8003F80007FF8001FE001FFFC000FF807EFFFE007FFFF8FFFE000FFFE0 +FFFE0001FF00FFFE2F3C7DBB36>100 D<0001FF8000000FFFF000007FFFFC0000FF81FE +0003FE007F8007F8003F800FF0001FC00FF0000FE01FE0000FE03FE0000FF03FE00007F0 +7FC00007F07FC00007F87FC00007F8FFC00007F8FFC00007F8FFFFFFFFF8FFFFFFFFF8FF +FFFFFFF8FFC0000000FFC0000000FFC0000000FFC00000007FC00000007FC00000007FC0 +0000003FE00000003FE00000781FE00000781FF00000780FF00000F007F80001F003FC00 +03E001FE000FC000FFC07F80003FFFFE00000FFFF8000000FFC00025267DA52C>I<01E0 +0007F8000FFC000FFC001FFE001FFE001FFE001FFE000FFC000FFC0007F80001E0000000 +0000000000000000000000000000000000000000000000000000000000000000FE007FFE +007FFE007FFE007FFE0007FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE00FFFFF0FFFFF0FFFFF0FFFF +F0143D7DBC1A>105 D<00FE00FFFE00FFFE00FFFE00FFFE0007FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE00FFFF +F8FFFFF8FFFFF8FFFFF8153C7DBB1A>108 D<01FC00FF8000FFFC03FFF000FFFC0FFFF8 +00FFFC1E03FC00FFFC3801FE0007FC6001FF0003FCC000FF0003FDC000FF8003FD8000FF +8003FF0000FF8003FF0000FF8003FF0000FF8003FE0000FF8003FE0000FF8003FE0000FF +8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF +8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF +8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF +8003FE0000FF80FFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFE2F267CA536 +>110 D<01FC03F000FFFC0FFC00FFFC1FFF00FFFC3C3F80FFFC707F8007FCE0FFC003FC +C0FFC003FD80FFC003FD80FFC003FF807F8003FF003F0003FF001E0003FF00000003FE00 +000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE0000 +0003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE000000 +03FE00000003FE00000003FE00000003FE00000003FE00000003FE000000FFFFFC0000FF +FFFC0000FFFFFC0000FFFFFC000022267DA528>114 D +121 D E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin +%%PaperSize: A4 + +%%EndSetup +%%Page: 1 1 +1 0 bop 75 693 a Fv(GNU)33 b(Readline)h(Library)p 75 +743 1800 17 v 936 791 a Fu(Edition)17 b(2.2,)c(for)i +Ft(Readline)f(Library)g Fu(V)l(ersion)i(2.1.)1559 845 +y(Septem)o(b)q(er)g(1997)75 2467 y Fs(Brian)23 b(F)-6 +b(o)n(x,)23 b(F)-6 b(ree)23 b(Soft)n(w)n(are)f(F)-6 b(oundation)75 +2534 y(Chet)22 b(Ramey)-6 b(,)23 b(Case)e(W)-6 b(estern)23 +b(Reserv)n(e)f(Univ)n(ersit)n(y)p 75 2570 1800 9 v eop +%%Page: 2 2 +2 1 bop 75 250 a Fu(This)14 b(do)q(cumen)o(t)h(describ)q(es)g(the)f +(GNU)g(Readline)i(Library)l(,)e(a)g(utilit)o(y)h(whic)o(h)f(aids)g(in)h +(the)f(consistency)75 305 y(of)h(user)g(in)o(terface)h(across)e +(discrete)i(programs)e(that)h(need)h(to)e(pro)o(vide)i(a)f(command)g +(line)i(in)o(terface.)75 373 y(Published)g(b)o(y)f(the)f(F)l(ree)g +(Soft)o(w)o(are)f(F)l(oundation)75 427 y(675)g(Massac)o(h)o(usetts)g +(Av)o(en)o(ue,)75 482 y(Cam)o(bridge,)h(MA)g(02139)f(USA)75 +549 y(P)o(ermission)j(is)f(gran)o(ted)g(to)f(mak)o(e)h(and)g +(distribute)i(v)o(erbatim)d(copies)i(of)f(this)h(man)o(ual)f(pro)o +(vided)h(the)75 604 y(cop)o(yrigh)o(t)e(notice)h(and)f(this)h(p)q +(ermission)g(notice)g(are)f(preserv)o(ed)h(on)f(all)h(copies.)75 +671 y(P)o(ermission)c(is)h(gran)o(ted)e(to)g(cop)o(y)h(and)g +(distribute)h(mo)q(di\014ed)g(v)o(ersions)f(of)f(this)h(man)o(ual)g +(under)h(the)f(con-)75 726 y(ditions)k(for)e(v)o(erbatim)h(cop)o(ying,) +g(pro)o(vided)h(that)e(the)h(en)o(tire)h(resulting)g(deriv)o(ed)g(w)o +(ork)e(is)h(distributed)75 781 y(under)h(the)f(terms)g(of)g(a)f(p)q +(ermission)j(notice)f(iden)o(tical)h(to)e(this)g(one.)75 +848 y(P)o(ermission)i(is)g(gran)o(ted)f(to)g(cop)o(y)h(and)f +(distribute)i(translations)f(of)f(this)h(man)o(ual)g(in)o(to)f(another) +g(lan-)75 903 y(guage,)e(under)h(the)f(ab)q(o)o(v)o(e)g(conditions)i +(for)d(mo)q(di\014ed)j(v)o(ersions,)e(except)h(that)f(this)h(p)q +(ermission)g(notice)75 958 y(ma)o(y)f(b)q(e)i(stated)f(in)h(a)f +(translation)g(appro)o(v)o(ed)g(b)o(y)g(the)g(F)l(oundation.)75 +2661 y(Cop)o(yrigh)o(t)301 2660 y(c)289 2661 y Fr(\015)g +Fu(1989,)f(1991)g(F)l(ree)h(Soft)o(w)o(are)f(F)l(oundation,)h(Inc.)p +eop +%%Page: 1 3 +1 2 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077 +b(1)75 183 y Fq(1)41 b(Command)28 b(Line)e(Editing)137 +294 y Fu(This)16 b(c)o(hapter)f(describ)q(es)i(the)e(basic)h(features)f +(of)g(the)g Fp(GNU)g Fu(command)g(line)i(editing)f(in)o(terface.)75 +419 y Fs(1.1)33 b(In)n(tro)r(duction)24 b(to)e(Line)i(Editing)137 +514 y Fu(The)16 b(follo)o(wing)g(paragraphs)e(describ)q(e)j(the)e +(notation)g(used)h(to)e(represen)o(t)i(k)o(eystrok)o(es.)137 +580 y(The)h(text)327 578 y Fo(h)p 339 552 56 2 v 339 +580 a Fn(C-k)p 339 587 V 393 578 a Fo(i)424 580 y Fu(is)f(read)g(as)g +(`Con)o(trol-K')f(and)h(describ)q(es)i(the)e(c)o(haracter)g(pro)q +(duced)h(when)f(the)1831 578 y Fo(h)p 1844 552 19 2 v +1844 580 a Fn(k)p 1844 587 V 1860 578 a Fo(i)75 634 y +Fu(k)o(ey)f(is)h(pressed)g(while)g(the)f(Con)o(trol)g(k)o(ey)g(is)h +(depressed.)137 700 y(The)g(text)325 698 y Fo(h)p 337 +672 63 2 v 337 700 a Fn(M-k)p 337 708 V 398 698 a Fo(i)428 +700 y Fu(is)f(read)g(as)g(`Meta-K')f(and)h(describ)q(es)i(the)e(c)o +(haracter)g(pro)q(duced)h(when)f(the)h(meta)75 755 y(k)o(ey)d(\(if)h(y) +o(ou)f(ha)o(v)o(e)g(one\))g(is)h(depressed,)g(and)g(the)922 +753 y Fo(h)p 935 727 19 2 v 935 755 a Fn(k)p 935 763 +V 951 753 a Fo(i)979 755 y Fu(k)o(ey)g(is)f(pressed.)20 +b(If)14 b(y)o(ou)f(do)g(not)g(ha)o(v)o(e)g(a)g(meta)g(k)o(ey)l(,)75 +810 y(the)k(iden)o(tical)i(k)o(eystrok)o(e)d(can)h(b)q(e)h(generated)f +(b)o(y)g(t)o(yping)1110 808 y Fo(h)p 1122 782 70 2 v +1122 810 a Fn(ESC)p 1122 818 V 1189 808 a Fo(i)1221 810 +y Fm(\014rst)p Fu(,)f(and)i(then)f(t)o(yping)1668 808 +y Fo(h)p 1681 782 19 2 v 1681 810 a Fn(k)p 1681 818 V +1697 808 a Fo(i)1712 810 y Fu(.)26 b(Either)75 865 y(pro)q(cess)15 +b(is)h(kno)o(wn)f(as)g Fm(metafying)k Fu(the)773 863 +y Fo(h)p 785 837 V 785 865 a Fn(k)p 785 873 V 802 863 +a Fo(i)832 865 y Fu(k)o(ey)l(.)137 931 y(The)h(text)334 +929 y Fo(h)p 347 903 100 2 v 347 931 a Fn(M-C-k)p 347 +938 V 444 929 a Fo(i)479 931 y Fu(is)g(read)g(as)f(`Meta-Con)o(trol-k') +f(and)i(describ)q(es)h(the)f(c)o(haracter)f(pro)q(duced)i(b)o(y)75 +986 y Fm(metafying)291 984 y Fo(h)p 303 958 56 2 v 303 +986 a Fn(C-k)p 303 993 V 357 984 a Fo(i)372 986 y Fu(.)137 +1052 y(In)e(addition,)h(sev)o(eral)f(k)o(eys)f(ha)o(v)o(e)g(their)h(o)o +(wn)f(names.)30 b(Sp)q(eci\014cally)l(,)1384 1050 y Fo(h)p +1396 1024 73 2 v 1396 1052 a Fn(DEL)p 1396 1059 V 1467 +1050 a Fo(i)1482 1052 y Fu(,)1514 1050 y Fo(h)p 1526 +1024 70 2 v 1526 1052 a Fn(ESC)p 1526 1059 V 1593 1050 +a Fo(i)1608 1052 y Fu(,)1640 1050 y Fo(h)p 1652 1024 +72 2 v 1652 1052 a Fn(LFD)p 1652 1059 V 1722 1050 a Fo(i)1737 +1052 y Fu(,)1768 1050 y Fo(h)p 1780 1024 70 2 v 1780 +1052 a Fn(SPC)p 1780 1059 V 1847 1050 a Fo(i)1862 1052 +y Fu(,)75 1104 y Fo(h)p 87 1078 76 2 v 87 1106 a Fn(RET)p +87 1114 V 160 1104 a Fo(i)175 1106 y Fu(,)23 b(and)306 +1104 y Fo(h)p 318 1078 74 2 v 318 1106 a Fn(T)m(AB)p +318 1114 V 390 1104 a Fo(i)427 1106 y Fu(all)f(stand)g(for)f(themselv)o +(es)h(when)h(seen)f(in)g(this)g(text,)h(or)e(in)i(an)e(init)i(\014le)g +(\(see)75 1161 y(Section)16 b(1.3)e([Readline)j(Init)g(File],)e(page)g +(3\).)75 1286 y Fs(1.2)33 b(Readline)23 b(In)n(teraction)137 +1381 y Fu(Often)13 b(during)h(an)e(in)o(teractiv)o(e)h(session)g(y)o +(ou)g(t)o(yp)q(e)f(in)i(a)e(long)h(line)h(of)e(text,)h(only)g(to)f +(notice)h(that)f(the)75 1436 y(\014rst)k(w)o(ord)f(on)h(the)h(line)h +(is)e(missp)q(elled.)26 b(The)16 b(Readline)j(library)e(giv)o(es)f(y)o +(ou)g(a)g(set)g(of)g(commands)g(for)75 1491 y(manipulating)g(the)f +(text)g(as)f(y)o(ou)h(t)o(yp)q(e)g(it)g(in,)g(allo)o(wing)h(y)o(ou)f +(to)f(just)h(\014x)g(y)o(our)f(t)o(yp)q(o,)g(and)h(not)g(forcing)75 +1545 y(y)o(ou)f(to)f(ret)o(yp)q(e)h(the)g(ma)s(jorit)o(y)f(of)h(the)g +(line.)21 b(Using)15 b(these)f(editing)h(commands,)f(y)o(ou)g(mo)o(v)o +(e)f(the)h(cursor)75 1600 y(to)i(the)i(place)g(that)e(needs)i +(correction,)g(and)f(delete)h(or)f(insert)g(the)h(text)e(of)h(the)g +(corrections.)26 b(Then,)75 1655 y(when)16 b(y)o(ou)f(are)h +(satis\014ed)g(with)g(the)f(line,)i(y)o(ou)e(simply)i(press)1160 +1653 y Fo(h)p 1172 1627 155 2 v 1172 1655 a Fn(RETURN)p +1172 1663 V 1324 1653 a Fo(i)1339 1655 y Fu(.)k(Y)l(ou)16 +b(do)f(not)g(ha)o(v)o(e)g(to)g(b)q(e)i(at)75 1710 y(the)g(end)g(of)f +(the)g(line)i(to)e(press)634 1708 y Fo(h)p 646 1682 V +646 1710 a Fn(RETURN)p 646 1717 V 798 1708 a Fo(i)813 +1710 y Fu(;)g(the)h(en)o(tire)g(line)h(is)f(accepted)g(regardless)g(of) +f(the)g(lo)q(cation)75 1765 y(of)f(the)g(cursor)g(within)h(the)g(line.) +75 1873 y Fl(1.2.1)30 b(Readline)20 b(Bare)g(Essen)n(tials)137 +1968 y Fu(In)12 b(order)g(to)f(en)o(ter)g(c)o(haracters)g(in)o(to)g +(the)h(line,)h(simply)g(t)o(yp)q(e)f(them.)18 b(The)12 +b(t)o(yp)q(ed)g(c)o(haracter)f(app)q(ears)75 2023 y(where)16 +b(the)h(cursor)f(w)o(as,)f(and)h(then)h(the)f(cursor)g(mo)o(v)o(es)g +(one)g(space)g(to)g(the)g(righ)o(t.)23 b(If)17 b(y)o(ou)f(mist)o(yp)q +(e)g(a)75 2077 y(c)o(haracter,)e(y)o(ou)h(can)g(use)h(y)o(our)f(erase)g +(c)o(haracter)f(to)h(bac)o(k)g(up)g(and)h(delete)g(the)f(mist)o(yp)q +(ed)h(c)o(haracter.)137 2143 y(Sometimes)j(y)o(ou)f(ma)o(y)g(miss)h(t)o +(yping)g(a)f(c)o(haracter)g(that)f(y)o(ou)i(w)o(an)o(ted)f(to)f(t)o(yp) +q(e,)i(and)g(not)f(notice)75 2198 y(y)o(our)c(error)f(un)o(til)i(y)o +(ou)f(ha)o(v)o(e)g(t)o(yp)q(ed)g(sev)o(eral)h(other)e(c)o(haracters.)19 +b(In)c(that)e(case,)h(y)o(ou)g(can)g(t)o(yp)q(e)1739 +2196 y Fo(h)p 1751 2170 57 2 v 1751 2198 a Fn(C-b)p 1751 +2206 V 1806 2196 a Fo(i)1835 2198 y Fu(to)75 2253 y(mo)o(v)o(e)h(the)h +(cursor)g(to)f(the)h(left,)g(and)g(then)h(correct)e(y)o(our)h(mistak)o +(e.)21 b(Afterw)o(ards,)15 b(y)o(ou)h(can)g(mo)o(v)o(e)f(the)75 +2308 y(cursor)g(to)f(the)i(righ)o(t)f(with)559 2306 y +Fo(h)p 571 2280 49 2 v 571 2308 a Fn(C-f)p 571 2315 V +617 2306 a Fo(i)632 2308 y Fu(.)137 2374 y(When)i(y)o(ou)f(add)g(text)g +(in)h(the)g(middle)h(of)e(a)f(line,)j(y)o(ou)e(will)i(notice)f(that)f +(c)o(haracters)f(to)h(the)g(righ)o(t)75 2428 y(of)e(the)g(cursor)g(are) +g(`pushed)h(o)o(v)o(er')f(to)f(mak)o(e)h(ro)q(om)g(for)f(the)i(text)f +(that)f(y)o(ou)h(ha)o(v)o(e)g(inserted.)21 b(Lik)o(ewise,)75 +2483 y(when)e(y)o(ou)g(delete)h(text)e(b)q(ehind)j(the)e(cursor,)g(c)o +(haracters)f(to)g(the)h(righ)o(t)f(of)g(the)h(cursor)g(are)f(`pulled)75 +2538 y(bac)o(k')d(to)h(\014ll)h(in)g(the)f(blank)g(space)h(created)f(b) +o(y)f(the)h(remo)o(v)m(al)g(of)g(the)g(text.)21 b(A)16 +b(list)h(of)e(the)h(basic)h(bare)75 2593 y(essen)o(tials)f(for)f +(editing)h(the)f(text)g(of)g(an)g(input)h(line)h(follo)o(ws.)75 +2668 y Fo(h)p 87 2642 57 2 v 87 2670 a Fn(C-b)p 87 2678 +V 142 2668 a Fo(i)315 2670 y Fu(Mo)o(v)o(e)d(bac)o(k)h(one)h(c)o +(haracter.)p eop +%%Page: 2 4 +2 3 bop 75 -58 a Fu(2)1322 b(GNU)15 b(Readline)i(Library)75 +181 y Fo(h)p 87 155 49 2 v 87 183 a Fn(C-f)p 87 191 V +133 181 a Fo(i)315 183 y Fu(Mo)o(v)o(e)d(forw)o(ard)g(one)h(c)o +(haracter.)75 258 y Fo(h)p 87 232 73 2 v 87 260 a Fn(DEL)p +87 268 V 158 258 a Fo(i)315 260 y Fu(Delete)h(the)f(c)o(haracter)g(to)f +(the)h(left)h(of)f(the)g(cursor.)75 335 y Fo(h)p 87 309 +57 2 v 87 337 a Fn(C-d)p 87 344 V 142 335 a Fo(i)315 +337 y Fu(Delete)h(the)f(c)o(haracter)g(underneath)h(the)f(cursor.)75 +413 y(Prin)o(ting)h(c)o(haracters)315 468 y(Insert)f(the)h(c)o +(haracter)e(in)o(to)h(the)h(line)h(at)d(the)h(cursor.)75 +543 y Fo(h)p 87 517 50 2 v 87 545 a Fn(C-)p 126 545 11 +2 v 87 553 50 2 v 135 543 a Fo(i)315 545 y Fu(Undo)i(the)g(last)f +(editing)i(command.)25 b(Y)l(ou)17 b(can)g(undo)g(all)g(the)g(w)o(a)o +(y)f(bac)o(k)h(to)f(an)g(empt)o(y)315 600 y(line.)75 +707 y Fl(1.2.2)30 b(Readline)20 b(Mo)n(v)n(emen)n(t)i(Commands)137 +802 y Fu(The)17 b(ab)q(o)o(v)o(e)e(table)i(describ)q(es)g(the)f(most)g +(basic)g(p)q(ossible)i(k)o(eystrok)o(es)d(that)g(y)o(ou)h(need)h(in)g +(order)f(to)75 857 y(do)e(editing)h(of)f(the)g(input)h(line.)22 +b(F)l(or)13 b(y)o(our)h(con)o(v)o(enience,)h(man)o(y)f(other)f +(commands)h(ha)o(v)o(e)g(b)q(een)h(added)75 912 y(in)f(addition)g(to) +356 910 y Fo(h)p 368 884 57 2 v 368 912 a Fn(C-b)p 368 +919 V 423 910 a Fo(i)438 912 y Fu(,)464 910 y Fo(h)p +476 884 49 2 v 476 912 a Fn(C-f)p 476 919 V 522 910 a +Fo(i)537 912 y Fu(,)563 910 y Fo(h)p 575 884 57 2 v 575 +912 a Fn(C-d)p 575 919 V 629 910 a Fo(i)644 912 y Fu(,)f(and)756 +910 y Fo(h)p 768 884 73 2 v 768 912 a Fn(DEL)p 768 919 +V 839 910 a Fo(i)854 912 y Fu(.)19 b(Here)13 b(are)g(some)g(commands)f +(for)g(mo)o(ving)h(more)g(rapidly)75 966 y(ab)q(out)i(the)g(line.)75 +1041 y Fo(h)p 87 1015 55 2 v 87 1043 a Fn(C-a)p 87 1051 +V 140 1041 a Fo(i)315 1043 y Fu(Mo)o(v)o(e)f(to)h(the)g(start)f(of)h +(the)g(line.)75 1118 y Fo(h)p 87 1092 53 2 v 87 1120 +a Fn(C-e)p 87 1127 V 138 1118 a Fo(i)315 1120 y Fu(Mo)o(v)o(e)f(to)h +(the)g(end)h(of)f(the)g(line.)75 1194 y Fo(h)p 87 1168 +55 2 v 87 1196 a Fn(M-f)p 87 1204 V 140 1194 a Fo(i)315 +1196 y Fu(Mo)o(v)o(e)f(forw)o(ard)g(a)h(w)o(ord,)f(where)i(a)e(w)o(ord) +h(is)h(comp)q(osed)f(of)g(letters)g(and)h(digits.)75 +1271 y Fo(h)p 87 1245 64 2 v 87 1273 a Fn(M-b)p 87 1281 +V 149 1271 a Fo(i)315 1273 y Fu(Mo)o(v)o(e)e(bac)o(kw)o(ard)h(a)g(w)o +(ord.)75 1348 y Fo(h)p 87 1322 48 2 v 87 1350 a Fn(C-l)p +87 1358 V 132 1348 a Fo(i)315 1350 y Fu(Clear)g(the)h(screen,)f(reprin) +o(ting)h(the)f(curren)o(t)g(line)i(at)e(the)g(top.)137 +1427 y(Notice)d(ho)o(w)368 1425 y Fo(h)p 380 1399 49 +2 v 380 1427 a Fn(C-f)p 380 1434 V 426 1425 a Fo(i)452 +1427 y Fu(mo)o(v)o(es)f(forw)o(ard)f(a)i(c)o(haracter,)f(while)1105 +1425 y Fo(h)p 1117 1399 55 2 v 1117 1427 a Fn(M-f)p 1117 +1434 V 1170 1425 a Fo(i)1197 1427 y Fu(mo)o(v)o(es)f(forw)o(ard)h(a)g +(w)o(ord.)18 b(It)12 b(is)g(a)g(lo)q(ose)75 1481 y(con)o(v)o(en)o(tion) +j(that)f(con)o(trol)h(k)o(eystrok)o(es)f(op)q(erate)h(on)f(c)o +(haracters)h(while)h(meta)e(k)o(eystrok)o(es)g(op)q(erate)h(on)75 +1536 y(w)o(ords.)75 1644 y Fl(1.2.3)30 b(Readline)20 +b(Killing)h(Commands)137 1739 y Fm(Killing)26 b Fu(text)18 +b(means)g(to)g(delete)i(the)f(text)f(from)g(the)h(line,)i(but)d(to)g +(sa)o(v)o(e)g(it)h(a)o(w)o(a)o(y)e(for)h(later)h(use,)75 +1793 y(usually)h(b)o(y)e Fm(y)o(anking)k Fu(\(re-inserting\))d(it)g +(bac)o(k)f(in)o(to)g(the)h(line.)31 b(If)18 b(the)h(description)g(for)f +(a)g(command)75 1848 y(sa)o(ys)e(that)f(it)i(`kills')g(text,)f(then)h +(y)o(ou)f(can)h(b)q(e)g(sure)f(that)g(y)o(ou)g(can)h(get)f(the)g(text)g +(bac)o(k)g(in)i(a)e(di\013eren)o(t)75 1903 y(\(or)e(the)i(same\))e +(place)i(later.)137 1969 y(When)c(y)o(ou)g(use)g(a)f(kill)i(command,)f +(the)g(text)f(is)h(sa)o(v)o(ed)f(in)i(a)e Fm(kill-ring)p +Fu(.)21 b(An)o(y)12 b(n)o(um)o(b)q(er)g(of)f(consecutiv)o(e)75 +2023 y(kills)17 b(sa)o(v)o(e)e(all)h(of)f(the)h(killed)i(text)d +(together,)f(so)h(that)g(when)h(y)o(ou)f(y)o(ank)g(it)h(bac)o(k,)f(y)o +(ou)g(get)g(it)h(all.)22 b(The)75 2078 y(kill)c(ring)f(is)f(not)g(line) +i(sp)q(eci\014c;)g(the)e(text)g(that)f(y)o(ou)h(killed)j(on)d(a)g +(previously)h(t)o(yp)q(ed)g(line)h(is)e(a)o(v)m(ailable)75 +2133 y(to)f(b)q(e)g(y)o(ank)o(ed)g(bac)o(k)h(later,)e(when)i(y)o(ou)f +(are)g(t)o(yping)g(another)g(line.)137 2199 y(Here)h(is)f(the)h(list)g +(of)e(commands)h(for)g(killing)j(text.)75 2274 y Fo(h)p +87 2247 56 2 v 87 2276 a Fn(C-k)p 87 2283 V 141 2274 +a Fo(i)315 2276 y Fu(Kill)f(the)f(text)e(from)h(the)g(curren)o(t)g +(cursor)g(p)q(osition)h(to)f(the)g(end)h(of)f(the)g(line.)75 +2350 y Fo(h)p 87 2324 64 2 v 87 2352 a Fn(M-d)p 87 2360 +V 149 2350 a Fo(i)315 2352 y Fu(Kill)h(from)d(the)i(cursor)e(to)h(the)g +(end)g(of)g(the)g(curren)o(t)g(w)o(ord,)f(or)h(if)g(b)q(et)o(w)o(een)g +(w)o(ords,)g(to)f(the)315 2407 y(end)j(of)f(the)g(next)g(w)o(ord.)75 +2482 y Fo(h)p 87 2456 118 2 v 87 2484 a Fn(M-DEL)p 87 +2491 V 202 2482 a Fo(i)315 2484 y Fu(Kill)i(from)d(the)g(cursor)h(the)f +(start)g(of)g(the)g(previous)i(w)o(ord,)d(or)h(if)h(b)q(et)o(w)o(een)g +(w)o(ords,)f(to)g(the)315 2539 y(start)g(of)h(the)g(previous)h(w)o +(ord.)75 2613 y Fo(h)p 87 2587 63 2 v 87 2615 a Fn(C-w)p +87 2623 V 148 2613 a Fo(i)315 2615 y Fu(Kill)i(from)d(the)h(cursor)g +(to)f(the)h(previous)h(whitespace.)22 b(This)17 b(is)f(di\013eren)o(t)g +(than)1733 2613 y Fo(h)p 1745 2587 118 2 v 1745 2615 +a Fn(M-DEL)p 1745 2623 V 1860 2613 a Fo(i)315 2670 y +Fu(b)q(ecause)g(the)f(w)o(ord)g(b)q(oundaries)h(di\013er.)p +eop +%%Page: 3 5 +3 4 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077 +b(3)137 183 y(Here)21 b(is)h(ho)o(w)e(to)g Fm(y)o(ank)j +Fu(the)e(text)f(bac)o(k)h(in)o(to)g(the)f(line.)39 b(Y)l(anking)21 +b(means)g(to)f(cop)o(y)h(the)g(most-)75 238 y(recen)o(tly-killed)d +(text)d(from)f(the)i(kill)h(bu\013er.)75 322 y Fo(h)p +87 296 56 2 v 87 324 a Fn(C-y)p 87 331 V 141 322 a Fo(i)315 +324 y Fu(Y)l(ank)e(the)h(most)e(recen)o(tly)i(killed)h(text)e(bac)o(k)g +(in)o(to)g(the)h(bu\013er)f(at)f(the)i(cursor.)75 405 +y Fo(h)p 87 379 63 2 v 87 407 a Fn(M-y)p 87 415 V 148 +405 a Fo(i)315 407 y Fu(Rotate)h(the)g(kill-ring,)j(and)d(y)o(ank)g +(the)h(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f(this)h(if)f(the)h +(prior)315 462 y(command)d(is)568 460 y Fo(h)p 580 434 +56 2 v 580 462 a Fn(C-y)p 580 470 V 634 460 a Fo(i)664 +462 y Fu(or)719 460 y Fo(h)p 732 434 63 2 v 732 462 a +Fn(M-y)p 732 470 V 792 460 a Fo(i)807 462 y Fu(.)75 582 +y Fl(1.2.4)30 b(Readline)20 b(Argumen)n(ts)137 682 y +Fu(Y)l(ou)15 b(can)g(pass)f(n)o(umeric)i(argumen)o(ts)e(to)g(Readline)i +(commands.)k(Sometimes)15 b(the)g(argumen)o(t)e(acts)75 +737 y(as)20 b(a)g(rep)q(eat)g(coun)o(t,)h(other)f(times)g(it)h(is)g +(the)f Fm(sign)h Fu(of)f(the)g(argumen)o(t)f(that)h(is)h(signi\014can)o +(t.)36 b(If)20 b(y)o(ou)75 792 y(pass)d(a)f(negativ)o(e)h(argumen)o(t)f +(to)g(a)g(command)h(whic)o(h)h(normally)f(acts)f(in)i(a)e(forw)o(ard)g +(direction,)i(that)75 847 y(command)g(will)h(act)e(in)i(a)e(bac)o(kw)o +(ard)g(direction.)28 b(F)l(or)17 b(example,)i(to)e(kill)j(text)d(bac)o +(k)g(to)g(the)h(start)e(of)75 902 y(the)f(line,)i(y)o(ou)e(migh)o(t)g +(t)o(yp)q(e)g(`)p Ft(M--)f(C-k)p Fu('.)137 973 y(The)h(general)f(w)o(a) +o(y)f(to)h(pass)g(n)o(umeric)h(argumen)o(ts)e(to)g(a)h(command)g(is)h +(to)e(t)o(yp)q(e)h(meta)g(digits)h(b)q(efore)75 1027 +y(the)h(command.)23 b(If)16 b(the)g(\014rst)g(`digit')g(t)o(yp)q(ed)g +(is)h(a)f(min)o(us)g(sign)h(\()1194 1025 y Fo(h)p 1206 +999 12 2 v 1206 1027 a Fn(-)p 1206 1035 V 1215 1025 a +Fo(i)1230 1027 y Fu(\),)f(then)g(the)g(sign)h(of)f(the)g(argumen)o(t)75 +1082 y(will)g(b)q(e)f(negativ)o(e.)k(Once)c(y)o(ou)f(ha)o(v)o(e)g(t)o +(yp)q(ed)g(one)h(meta)e(digit)i(to)f(get)f(the)h(argumen)o(t)g +(started,)f(y)o(ou)h(can)75 1137 y(t)o(yp)q(e)19 b(the)g(remainder)g +(of)f(the)h(digits,)h(and)f(then)g(the)g(command.)30 +b(F)l(or)18 b(example,)i(to)e(giv)o(e)h(the)1793 1135 +y Fo(h)p 1805 1109 57 2 v 1805 1137 a Fn(C-d)p 1805 1145 +V 1860 1135 a Fo(i)75 1192 y Fu(command)c(an)g(argumen)o(t)g(of)f(10,)h +(y)o(ou)f(could)j(t)o(yp)q(e)e(`)p Ft(M-1)f(0)h(C-d)p +Fu('.)75 1312 y Fl(1.2.5)30 b(Searc)n(hing)21 b(for)f(Commands)h(in)f +(the)h(History)137 1412 y Fu(Readline)e(pro)o(vides)d(commands)g(for)g +(searc)o(hing)g(through)g(the)g(command)g(history)g(for)g(lines)i(con-) +75 1467 y(taining)e(a)f(sp)q(eci\014ed)i(string.)j(There)c(are)e(t)o(w) +o(o)g(searc)o(h)h(mo)q(des:)20 b Fm(incremen)o(tal)e +Fu(and)e Fm(non-incremen)o(tal)p Fu(.)137 1538 y(Incremen)o(tal)e +(searc)o(hes)f(b)q(egin)h(b)q(efore)f(the)g(user)g(has)g(\014nished)h +(t)o(yping)f(the)g(searc)o(h)g(string.)19 b(As)13 b(eac)o(h)75 +1593 y(c)o(haracter)k(of)g(the)h(searc)o(h)g(string)f(is)h(t)o(yp)q +(ed,)h(Readline)h(displa)o(ys)e(the)g(next)g(en)o(try)f(from)g(the)h +(history)75 1648 y(matc)o(hing)e(the)g(string)g(t)o(yp)q(ed)h(so)e +(far.)22 b(An)17 b(incremen)o(tal)g(searc)o(h)f(requires)h(only)f(as)g +(man)o(y)g(c)o(haracters)75 1702 y(as)j(needed)h(to)f(\014nd)g(the)h +(desired)g(history)f(en)o(try)l(.)31 b(The)1084 1700 +y Fo(h)p 1096 1674 70 2 v 1096 1702 a Fn(ESC)p 1096 1710 +V 1163 1700 a Fo(i)1197 1702 y Fu(c)o(haracter)18 b(is)i(used)f(to)g +(terminate)g(an)75 1757 y(incremen)o(tal)13 b(searc)o(h.)472 +1755 y Fo(h)p 484 1729 49 2 v 484 1757 a Fn(C-j)p 484 +1765 V 530 1755 a Fo(i)556 1757 y Fu(will)g(also)f(terminate)f(the)h +(searc)o(h.)1158 1755 y Fo(h)p 1170 1729 55 2 v 1170 +1757 a Fn(C-g)p 1170 1765 V 1223 1755 a Fo(i)1249 1757 +y Fu(will)h(ab)q(ort)e(an)h(incremen)o(tal)g(searc)o(h)75 +1812 y(and)17 b(restore)f(the)g(original)i(line.)25 b(When)17 +b(the)g(searc)o(h)f(is)h(terminated,)g(the)g(history)f(en)o(try)g(con)o +(taining)75 1867 y(the)i(searc)o(h)g(string)g(b)q(ecomes)g(the)g +(curren)o(t)g(line.)30 b(T)l(o)18 b(\014nd)g(other)g(matc)o(hing)g(en)o +(tries)g(in)h(the)f(history)75 1922 y(list,)g(t)o(yp)q(e)270 +1920 y Fo(h)p 282 1894 52 2 v 282 1922 a Fn(C-s)p 282 +1929 V 331 1920 a Fo(i)363 1922 y Fu(or)420 1920 y Fo(h)p +432 1894 51 2 v 432 1922 a Fn(C-r)p 432 1929 V 481 1920 +a Fo(i)513 1922 y Fu(as)e(appropriate.)25 b(This)18 b(will)g(searc)o(h) +f(bac)o(kw)o(ard)f(or)h(forw)o(ard)e(in)j(the)f(history)75 +1976 y(for)e(the)g(next)h(en)o(try)f(matc)o(hing)h(the)f(searc)o(h)h +(string)f(t)o(yp)q(ed)h(so)f(far.)20 b(An)o(y)c(other)f(k)o(ey)g +(sequence)i(b)q(ound)75 2031 y(to)12 b(a)h(Readline)i(command)e(will)i +(terminate)d(the)i(searc)o(h)e(and)h(execute)h(that)e(command.)19 +b(F)l(or)13 b(instance,)75 2086 y(a)112 2084 y Fo(h)p +124 2058 76 2 v 124 2086 a Fn(RET)p 124 2094 V 197 2084 +a Fo(i)226 2086 y Fu(will)j(terminate)e(the)g(searc)o(h)g(and)h(accept) +f(the)g(line,)i(thereb)o(y)e(executing)h(the)g(command)f(from)75 +2141 y(the)h(history)g(list.)137 2212 y(Non-incremen)o(tal)25 +b(searc)o(hes)e(read)h(the)f(en)o(tire)h(searc)o(h)f(string)g(b)q +(efore)h(starting)f(to)f(searc)o(h)i(for)75 2267 y(matc)o(hing)d +(history)h(lines.)39 b(The)22 b(searc)o(h)f(string)g(ma)o(y)g(b)q(e)h +(t)o(yp)q(ed)f(b)o(y)h(the)f(user)h(or)e(b)q(e)i(part)f(of)g(the)75 +2322 y(con)o(ten)o(ts)15 b(of)f(the)i(curren)o(t)f(line.)75 +2460 y Fs(1.3)33 b(Readline)23 b(Init)h(File)137 2560 +y Fu(Although)18 b(the)g(Readline)i(library)e(comes)g(with)f(a)h(set)f +(of)g Ft(emacs)p Fu(-lik)o(e)h(k)o(eybindings)i(installed)f(b)o(y)75 +2615 y(default,)13 b(it)g(is)g(p)q(ossible)h(to)e(use)g(a)g(di\013eren) +o(t)h(set)f(of)g(k)o(eybindings.)21 b(An)o(y)12 b(user)h(can)f +(customize)h(programs)75 2670 y(that)g(use)i(Readline)h(b)o(y)e +(putting)g(commands)g(in)h(an)f Fm(inputrc)j Fu(\014le)e(in)g(his)g +(home)f(directory)l(.)20 b(The)14 b(name)p eop +%%Page: 4 6 +4 5 bop 75 -58 a Fu(4)1322 b(GNU)15 b(Readline)i(Library)75 +183 y(of)e(this)h(\014le)h(is)f(tak)o(en)f(from)g(the)g(v)m(alue)i(of)e +(the)h(en)o(vironmen)o(t)g(v)m(ariable)h Ft(INPUTRC)p +Fu(.)j(If)c(that)e(v)m(ariable)j(is)75 238 y(unset,)e(the)g(default)h +(is)g(`)p Ft(~/.inputrc)p Fu('.)137 310 y(When)f(a)g(program)f(whic)o +(h)h(uses)g(the)g(Readline)i(library)f(starts)d(up,)i(the)g(init)h +(\014le)g(is)f(read,)g(and)g(the)75 364 y(k)o(ey)g(bindings)i(are)e +(set.)137 436 y(In)f(addition,)h(the)e Ft(C-x)i(C-r)e +Fu(command)g(re-reads)h(this)g(init)g(\014le,)h(th)o(us)e(incorp)q +(orating)h(an)o(y)f(c)o(hanges)75 491 y(that)h(y)o(ou)h(migh)o(t)g(ha)o +(v)o(e)g(made)g(to)g(it.)75 612 y Fl(1.3.1)30 b(Readline)20 +b(Init)g(File)h(Syn)n(tax)137 712 y Fu(There)c(are)g(only)g(a)g(few)f +(basic)i(constructs)e(allo)o(w)o(ed)i(in)f(the)g(Readline)i(init)f +(\014le.)26 b(Blank)18 b(lines)g(are)75 767 y(ignored.)36 +b(Lines)22 b(b)q(eginning)h(with)d(a)h(`)p Ft(#)p Fu(')e(are)h(commen)o +(ts.)35 b(Lines)22 b(b)q(eginning)h(with)e(a)f(`)p Ft($)p +Fu(')f(indicate)75 822 y(conditional)c(constructs)f(\(see)g(Section)g +(1.3.2)f([Conditional)h(Init)h(Constructs],)e(page)h(7\).)k(Other)c +(lines)75 877 y(denote)h(v)m(ariable)i(settings)e(and)h(k)o(ey)f +(bindings.)75 963 y(V)l(ariable)h(Settings)315 1018 y(Y)l(ou)k(can)h +(mo)q(dify)g(the)f(run-time)h(b)q(eha)o(vior)g(of)e(Readline)k(b)o(y)d +(altering)h(the)f(v)m(alues)h(of)315 1073 y(v)m(ariables)13 +b(in)g(Readline)i(using)d(the)g Ft(set)g Fu(command)g(within)h(the)f +(init)h(\014le.)20 b(Here)13 b(is)f(ho)o(w)g(to)315 1127 +y(c)o(hange)e(from)g(the)g(default)h(Emacs-lik)o(e)g(k)o(ey)f(binding)i +(to)e(use)g Ft(vi)g Fu(line)i(editing)g(commands:)435 +1194 y Ft(set)23 b(editing-mode)g(vi)315 1263 y Fu(A)15 +b(great)g(deal)g(of)g(run-time)h(b)q(eha)o(vior)g(is)g(c)o(hangeable)g +(with)f(the)h(follo)o(wing)f(v)m(ariables.)315 1347 y +Ft(bell-style)555 1402 y Fu(Con)o(trols)21 b(what)h(happ)q(ens)h(when)f +(Readline)i(w)o(an)o(ts)d(to)g(ring)i(the)f(termi-)555 +1457 y(nal)d(b)q(ell.)32 b(If)19 b(set)f(to)g(`)p Ft(none)p +Fu(',)g(Readline)j(nev)o(er)e(rings)g(the)f(b)q(ell.)32 +b(If)19 b(set)g(to)555 1512 y(`)p Ft(visible)p Fu(',)c(Readline)j(uses) +f(a)f(visible)j(b)q(ell)g(if)e(one)f(is)h(a)o(v)m(ailable.)26 +b(If)16 b(set)h(to)555 1567 y(`)p Ft(audible)p Fu(')g(\(the)h +(default\),)i(Readline)h(attempts)d(to)g(ring)h(the)g(terminal's)555 +1621 y(b)q(ell.)315 1705 y Ft(comment-begin)555 1760 +y Fu(The)c(string)f(to)g(insert)i(at)d(the)i(b)q(eginning)i(of)d(the)h +(line)h(when)f(the)g Ft(insert-)555 1815 y(comment)f +Fu(command)h(is)h(executed.)21 b(The)15 b(default)h(v)m(alue)g(is)g +Ft("#")p Fu(.)315 1899 y Ft(completion-ignore-case)555 +1954 y Fu(If)e(set)f(to)g(`)p Ft(on)p Fu(',)g(Readline)j(p)q(erforms)d +(\014lename)i(matc)o(hing)f(and)g(completion)555 2009 +y(in)i(a)f(case-insensitiv)o(e)i(fashion.)k(The)15 b(default)h(v)m +(alue)g(is)g(`)p Ft(off)p Fu('.)315 2093 y Ft(completion-query-items) +555 2148 y Fu(The)d(n)o(um)o(b)q(er)h(of)e(p)q(ossible)j(completions)g +(that)d(determines)i(when)g(the)f(user)555 2202 y(is)21 +b(ask)o(ed)g(whether)g(he)h(w)o(an)o(ts)d(to)i(see)g(the)g(list)h(of)e +(p)q(ossibilitie)q(s.)40 b(If)21 b(the)555 2257 y(n)o(um)o(b)q(er)14 +b(of)f(p)q(ossible)i(completions)f(is)g(greater)f(than)g(this)h(v)m +(alue,)h(Readline)555 2312 y(will)g(ask)e(the)g(user)h(whether)f(or)g +(not)g(he)g(wishes)h(to)f(view)h(them;)f(otherwise,)555 +2367 y(they)i(are)g(simply)i(listed.)k(The)15 b(default)h(limit)h(is)e +Ft(100)p Fu(.)315 2451 y Ft(convert-meta)555 2506 y Fu(If)c(set)g(to)g +(`)p Ft(on)p Fu(',)f(Readline)j(will)g(con)o(v)o(ert)d(c)o(haracters)h +(with)g(the)g(eigh)o(th)h(bit)f(set)555 2560 y(to)i(an)h(ASCI)q(I)h(k)o +(ey)e(sequence)i(b)o(y)f(stripping)g(the)g(eigh)o(th)g(bit)g(and)g +(prep)q(end-)555 2615 y(ing)j(an)695 2613 y Fo(h)p 708 +2587 70 2 v 708 2615 a Fn(ESC)p 708 2623 V 775 2613 a +Fo(i)805 2615 y Fu(c)o(haracter,)f(con)o(v)o(erting)f(them)h(to)g(a)f +(meta-pre\014xed)i(k)o(ey)f(se-)555 2670 y(quence.)21 +b(The)15 b(default)h(v)m(alue)h(is)e(`)p Ft(on)p Fu('.)p +eop +%%Page: 5 7 +5 6 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077 +b(5)315 183 y Ft(disable-completion)555 238 y Fu(If)19 +b(set)f(to)f(`)p Ft(On)p Fu(',)h(Readline)j(will)f(inhibit)g(w)o(ord)e +(completion.)30 b(Completion)555 293 y(c)o(haracters)12 +b(will)j(b)q(e)f(inserted)g(in)o(to)f(the)g(line)h(as)f(if)h(they)f +(had)g(b)q(een)h(mapp)q(ed)555 348 y(to)h Ft(self-insert)p +Fu(.)j(The)d(default)h(is)g(`)p Ft(off)p Fu('.)315 446 +y Ft(editing-mode)555 501 y Fu(The)f Ft(editing-mode)d +Fu(v)m(ariable)k(con)o(trols)e(whic)o(h)h(default)g(set)f(of)g(k)o(ey)g +(bind-)555 556 y(ings)f(is)g(used.)20 b(By)12 b(default,)i(Readline)g +(starts)e(up)h(in)g(Emacs)f(editing)i(mo)q(de,)555 611 +y(where)h(the)f(k)o(eystrok)o(es)g(are)g(most)g(similar)i(to)d(Emacs.) +20 b(This)15 b(v)m(ariable)h(can)555 665 y(b)q(e)g(set)f(to)f(either)i +(`)p Ft(emacs)p Fu(')e(or)h(`)p Ft(vi)p Fu('.)315 764 +y Ft(enable-keypad)555 819 y Fu(When)d(set)f(to)h(`)p +Ft(on)p Fu(',)e(Readline)k(will)g(try)d(to)g(enable)i(the)f +(application)h(k)o(eypad)555 873 y(when)h(it)f(is)h(called.)21 +b(Some)13 b(systems)g(need)h(this)g(to)f(enable)h(the)g(arro)o(w)e(k)o +(eys.)555 928 y(The)j(default)h(is)g(`)p Ft(off)p Fu('.)315 +1027 y Ft(expand-tilde)555 1082 y Fu(If)e(set)g(to)f(`)p +Ft(on)p Fu(',)f(tilde)k(expansion)e(is)h(p)q(erformed)f(when)g +(Readline)i(attempts)555 1136 y(w)o(ord)f(completion.)21 +b(The)15 b(default)h(is)f(`)p Ft(off)p Fu('.)315 1235 +y Ft(horizontal-scroll-mode)555 1290 y Fu(This)k(v)m(ariable)g(can)f(b) +q(e)g(set)g(to)f(either)i(`)p Ft(on)p Fu(')e(or)g(`)p +Ft(off)p Fu('.)27 b(Setting)19 b(it)f(to)f(`)p Ft(on)p +Fu(')555 1344 y(means)c(that)f(the)i(text)e(of)h(the)g(lines)i(b)q +(eing)f(edited)g(will)h(scroll)f(horizon)o(tally)555 +1399 y(on)i(a)f(single)i(screen)g(line)g(when)g(they)f(are)f(longer)h +(than)g(the)g(width)g(of)g(the)555 1454 y(screen,)e(instead)f(of)g +(wrapping)g(on)o(to)f(a)h(new)g(screen)h(line.)21 b(By)13 +b(default,)h(this)555 1509 y(v)m(ariable)j(is)e(set)g(to)g(`)p +Ft(off)p Fu('.)315 1607 y Ft(keymap)114 b Fu(Sets)17 +b(Readline's)j(idea)e(of)f(the)h(curren)o(t)g(k)o(eymap)f(for)g(k)o(ey) +g(binding)j(com-)555 1662 y(mands.)41 b(Acceptable)23 +b Ft(keymap)f Fu(names)g(are)f Ft(emacs)p Fu(,)i Ft(emacs-standard)p +Fu(,)555 1717 y Ft(emacs-meta)p Fu(,)15 b Ft(emacs-ctlx)p +Fu(,)h Ft(vi)p Fu(,)g Ft(vi-command)p Fu(,)g(and)h Ft(vi-insert)p +Fu(.)23 b Ft(vi)16 b Fu(is)555 1772 y(equiv)m(alen)o(t)e(to)f +Ft(vi-command)p Fu(;)e Ft(emacs)h Fu(is)i(equiv)m(alen)o(t)g(to)e +Ft(emacs-standard)p Fu(.)555 1827 y(The)f(default)h(v)m(alue)g(is)f +Ft(emacs)p Fu(.)18 b(The)11 b(v)m(alue)i(of)d(the)h Ft(editing-mode)f +Fu(v)m(ariable)555 1881 y(also)15 b(a\013ects)g(the)g(default)h(k)o +(eymap.)315 1980 y Ft(mark-directories)555 2035 y Fu(If)j(set)g(to)g(`) +p Ft(on)p Fu(',)f(completed)i(directory)g(names)f(ha)o(v)o(e)f(a)h +(slash)h(app)q(ended.)555 2089 y(The)15 b(default)h(is)g(`)p +Ft(on)p Fu('.)315 2188 y Ft(mark-modified-lines)555 2243 +y Fu(This)j(v)m(ariable,)g(when)g(set)e(to)h(`)p Ft(on)p +Fu(',)f(causes)h(Readline)i(to)d(displa)o(y)i(an)f(as-)555 +2298 y(terisk)f(\(`)p Ft(*)p Fu('\))e(at)i(the)f(start)g(of)h(history)f +(lines)j(whic)o(h)e(ha)o(v)o(e)g(b)q(een)h(mo)q(di\014ed.)555 +2352 y(This)e(v)m(ariable)g(is)g(`)p Ft(off)p Fu(')e(b)o(y)h(default.) +315 2451 y Ft(input-meta)555 2506 y Fu(If)h(set)g(to)f(`)p +Ft(on)p Fu(',)f(Readline)k(will)g(enable)f(eigh)o(t-bit)f(input)h(\(it) +f(will)h(not)f(strip)555 2560 y(the)f(eigh)o(th)g(bit)h(from)e(the)h(c) +o(haracters)f(it)i(reads\),)e(regardless)h(of)f(what)h(the)555 +2615 y(terminal)21 b(claims)g(it)f(can)g(supp)q(ort.)34 +b(The)20 b(default)h(v)m(alue)g(is)g(`)p Ft(off)p Fu('.)33 +b(The)555 2670 y(name)15 b Ft(meta-flag)f Fu(is)i(a)f(synon)o(ym)g(for) +f(this)i(v)m(ariable.)p eop +%%Page: 6 8 +6 7 bop 75 -58 a Fu(6)1322 b(GNU)15 b(Readline)i(Library)315 +183 y Ft(output-meta)555 238 y Fu(If)h(set)f(to)g(`)p +Ft(on)p Fu(',)g(Readline)j(will)g(displa)o(y)f(c)o(haracters)d(with)j +(the)e(eigh)o(th)h(bit)555 293 y(set)g(directly)i(rather)d(than)h(as)g +(a)g(meta-pre\014xed)h(escap)q(e)g(sequence.)30 b(The)555 +348 y(default)16 b(is)f(`)p Ft(off)p Fu('.)315 435 y +Ft(print-completions-horizont)o(ally)555 489 y Fu(If)d(set)g(to)f(`)p +Ft(on)p Fu(',)h(Readline)i(will)f(displa)o(y)h(completions)f(with)f +(matc)o(hes)f(sorted)555 544 y(horizon)o(tally)23 b(in)f(alphab)q +(etical)i(order,)f(rather)e(than)g(do)o(wn)h(the)g(screen.)555 +599 y(The)15 b(default)h(is)g(`)p Ft(off)p Fu('.)315 +686 y Ft(show-all-if-ambiguous)555 741 y Fu(This)g(alters)e(the)i +(default)f(b)q(eha)o(vior)h(of)e(the)h(completion)h(functions.)21 +b(If)15 b(set)555 796 y(to)e(`)p Ft(on)p Fu(',)g(w)o(ords)g(whic)o(h)h +(ha)o(v)o(e)g(more)f(than)g(one)h(p)q(ossible)i(completion)f(cause)555 +850 y(the)20 b(matc)o(hes)f(to)f(b)q(e)j(listed)f(immediately)h +(instead)f(of)f(ringing)i(the)e(b)q(ell.)555 905 y(The)c(default)h(v)m +(alue)h(is)e(`)p Ft(off)p Fu('.)315 992 y Ft(visible-stats)555 +1047 y Fu(If)h(set)g(to)f(`)p Ft(on)p Fu(',)g(a)h(c)o(haracter)f +(denoting)h(a)g(\014le's)h(t)o(yp)q(e)f(is)g(app)q(ended)i(to)d(the)555 +1102 y(\014lename)h(when)g(listing)h(p)q(ossible)g(completions.)j(The)c +(default)g(is)f(`)p Ft(off)p Fu('.)75 1189 y(Key)h(Bindings)315 +1244 y(The)e(syn)o(tax)f(for)g(con)o(trolling)i(k)o(ey)f(bindings)i(in) +e(the)g(init)h(\014le)g(is)f(simple.)21 b(First)14 b(y)o(ou)f(ha)o(v)o +(e)315 1298 y(to)19 b(kno)o(w)f(the)i(name)f(of)g(the)g(command)g(that) +f(y)o(ou)h(w)o(an)o(t)f(to)h(c)o(hange.)32 b(The)19 b(follo)o(wing)315 +1353 y(sections)f(con)o(tain)h(tables)f(of)f(the)h(command)g(name,)g +(the)g(default)h(k)o(eybinding,)h(if)e(an)o(y)l(,)315 +1408 y(and)d(a)g(short)g(description)i(of)d(what)h(the)g(command)g(do)q +(es.)315 1479 y(Once)j(y)o(ou)g(kno)o(w)e(the)i(name)f(of)g(the)h +(command,)f(simply)i(place)g(the)e(name)h(of)f(the)g(k)o(ey)315 +1534 y(y)o(ou)c(wish)h(to)f(bind)i(the)f(command)f(to,)g(a)g(colon,)h +(and)g(then)f(the)h(name)f(of)h(the)f(command)315 1588 +y(on)19 b(a)g(line)i(in)f(the)g(init)g(\014le.)34 b(The)19 +b(name)h(of)e(the)i(k)o(ey)f(can)h(b)q(e)g(expressed)g(in)g(di\013eren) +o(t)315 1643 y(w)o(a)o(ys,)14 b(dep)q(ending)j(on)e(whic)o(h)h(is)g +(most)e(comfortable)h(for)g(y)o(ou.)315 1730 y Fm(k)o(eyname)s +Fu(:)k Fm(function-name)g Fu(or)c Fm(macro)555 1785 y(k)o(eyname)i +Fu(is)e(the)f(name)h(of)f(a)g(k)o(ey)g(sp)q(elled)j(out)d(in)h +(English.)21 b(F)l(or)13 b(example:)675 1853 y Ft(Control-u:)22 +b(universal-argument)675 1905 y(Meta-Rubout:)g(backward-kill-word)675 +1957 y(Control-o:)g(">)i(output")555 2028 y Fu(In)19 +b(the)f(ab)q(o)o(v)o(e)g(example,)1023 2026 y Fo(h)p +1035 2000 57 2 v 1035 2028 a Fn(C-u)p 1035 2035 V 1090 +2026 a Fo(i)1123 2028 y Fu(is)h(b)q(ound)g(to)f(the)g(function)h +Ft(universal-)555 2082 y(argument)p Fu(,)g(and)872 2080 +y Fo(h)p 884 2054 55 2 v 884 2082 a Fn(C-o)p 884 2090 +V 937 2080 a Fo(i)971 2082 y Fu(is)h(b)q(ound)g(to)f(run)h(the)f(macro) +g(expressed)h(on)g(the)555 2137 y(righ)o(t)13 b(hand)h(side)h(\(that)e +(is,)h(to)f(insert)h(the)g(text)f(`)p Ft(>)h(output)p +Fu(')f(in)o(to)g(the)h(line\).)315 2224 y Ft(")p Fm(k)o(eyseq)q +Ft(")p Fu(:)20 b Fm(function-name)e Fu(or)d Fm(macro)555 +2279 y(k)o(eyseq)i Fu(di\013ers)e(from)g Fm(k)o(eyname)j +Fu(ab)q(o)o(v)o(e)d(in)i(that)d(strings)i(denoting)g(an)f(en-)555 +2334 y(tire)i(k)o(ey)g(sequence)h(can)f(b)q(e)g(sp)q(eci\014ed,)i(b)o +(y)e(placing)h(the)f(k)o(ey)g(sequence)h(in)555 2389 +y(double)c(quotes.)19 b(Some)13 b(GNU)g(Emacs)f(st)o(yle)h(k)o(ey)g +(escap)q(es)g(can)g(b)q(e)h(used,)f(as)555 2443 y(in)18 +b(the)f(follo)o(wing)g(example,)h(but)f(the)g(sp)q(ecial)i(c)o +(haracter)d(names)h(are)f(not)555 2498 y(recognized.)675 +2566 y Ft("\\C-u":)23 b(universal-argument)675 2618 y("\\C-x\\C-r":)f +(re-read-init-file)675 2670 y("\\e[11~":)h("Function)f(Key)i(1")p +eop +%%Page: 7 9 +7 8 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077 +b(7)555 183 y(In)19 b(the)f(ab)q(o)o(v)o(e)g(example,)1023 +181 y Fo(h)p 1035 155 57 2 v 1035 183 a Fn(C-u)p 1035 +191 V 1090 181 a Fo(i)1123 183 y Fu(is)h(b)q(ound)g(to)f(the)g +(function)h Ft(universal-)555 238 y(argument)9 b Fu(\(just)h(as)h(it)g +(w)o(as)e(in)j(the)e(\014rst)h(example\),)g(`)1463 236 +y Fo(h)p 1475 210 56 2 v 1475 238 a Fn(C-x)p 1475 246 +V 1529 236 a Fo(i)k(h)p 1571 210 51 2 v 1571 238 a Fn(C-r)p +1571 246 V 1620 236 a Fo(i)1635 238 y Fu(')10 b(is)h(b)q(ound)h(to)555 +293 y(the)k(function)i Ft(re-read-init-file)p Fu(,)c(and)i(`)1351 +291 y Fo(h)p 1363 265 70 2 v 1363 293 a Fn(ESC)p 1363 +301 V 1430 291 a Fo(i)f(h)p 1472 265 10 2 v 1472 293 +a Fn([)p 1472 301 V 1480 291 a Fo(i)g(h)p 1522 265 18 +2 v 1522 293 a Fn(1)p 1522 301 V 1538 291 a Fo(i)g(h)p +1580 265 V 1580 293 a Fn(1)p 1580 301 V 1595 291 a Fo(i)g(h)p +1637 265 24 2 v 1637 293 a Ft(~)p 1637 301 V 1659 291 +a Fo(i)1674 293 y Fu(')h(is)h(b)q(ound)555 348 y(to)e(insert)g(the)g +(text)g(`)p Ft(Function)f(Key)h(1)p Fu('.)315 427 y(The)e(follo)o(wing) +h(GNU)f(Emacs)f(st)o(yle)h(escap)q(e)h(sequences)g(are)f(a)o(v)m +(ailable)i(when)e(sp)q(ecifying)315 482 y(k)o(ey)i(sequences:)315 +561 y Fk(\\C-)168 b Fu(con)o(trol)15 b(pre\014x)315 640 +y Fk(\\M-)168 b Fu(meta)15 b(pre\014x)315 719 y Fk(\\e)192 +b Fu(an)15 b(escap)q(e)h(c)o(haracter)315 798 y Fk(\\\\)192 +b Fu(bac)o(kslash)315 877 y Fk(\\)p Ft(")555 875 y Fo(h)p +567 849 V 567 877 a Ft(")p 567 885 V 589 875 a Fo(i)315 +956 y Fk(\\')555 954 y Fo(h)p 567 928 10 2 v 567 956 +a Fn(')p 567 964 V 575 954 a Fo(i)315 1035 y Fu(In)13 +b(addition)g(to)f(the)g(GNU)h(Emacs)f(st)o(yle)g(escap)q(e)h +(sequences,)h(a)e(second)h(set)f(of)g(bac)o(kslash)315 +1090 y(escap)q(es)k(is)g(a)o(v)m(ailable:)315 1169 y +Ft(\\a)192 b Fu(alert)15 b(\(b)q(ell\))315 1248 y Ft(\\b)192 +b Fu(bac)o(kspace)315 1327 y Ft(\\d)g Fu(delete)315 1407 +y Ft(\\f)g Fu(form)14 b(feed)315 1486 y Ft(\\n)192 b +Fu(newline)315 1565 y Ft(\\r)g Fu(carriage)15 b(return)315 +1644 y Ft(\\t)192 b Fu(horizon)o(tal)16 b(tab)315 1723 +y Ft(\\v)192 b Fu(v)o(ertical)16 b(tab)315 1802 y Ft(\\)p +Fm(nnn)141 b Fu(the)12 b(c)o(haracter)f(whose)h(ASCI)q(I)h(co)q(de)g +(is)f(the)g(o)q(ctal)g(v)m(alue)h Fm(nnn)g Fu(\(one)f(to)f(three)555 +1857 y(digits\))315 1936 y Ft(\\x)p Fm(nnn)117 b Fu(the)14 +b(c)o(haracter)f(whose)h(ASCI)q(I)h(co)q(de)f(is)g(the)g(hexadecimal)i +(v)m(alue)f Fm(nnn)f Fu(\(one)555 1991 y(to)h(three)g(digits\))315 +2070 y(When)k(en)o(tering)g(the)g(text)f(of)g(a)h(macro,)f(single)i(or) +e(double)i(quotes)f(m)o(ust)f(b)q(e)h(used)h(to)315 2125 +y(indicate)12 b(a)f(macro)f(de\014nition.)20 b(Unquoted)11 +b(text)f(is)i(assumed)e(to)h(b)q(e)g(a)f(function)i(name.)18 +b(In)315 2180 y(the)11 b(macro)f(b)q(o)q(dy)l(,)i(the)f(bac)o(kslash)g +(escap)q(es)g(describ)q(ed)i(ab)q(o)o(v)o(e)d(are)g(expanded.)20 +b(Bac)o(kslash)315 2234 y(will)i(quote)d(an)o(y)h(other)g(c)o(haracter) +f(in)i(the)f(macro)f(text,)h(including)j(`)p Ft(")p Fu(')c(and)h(`)p +Ft(')p Fu('.)34 b(F)l(or)315 2289 y(example,)14 b(the)f(follo)o(wing)g +(binding)i(will)g(mak)o(e)d(`)p Ft(C-x)i(\\)p Fu(')f(insert)g(a)g +(single)h(`)p Ft(\\)p Fu(')e(in)o(to)h(the)g(line:)435 +2353 y Ft("\\C-x\\\\":)23 b("\\\\")75 2464 y Fl(1.3.2)30 +b(Conditional)20 b(Init)g(Constructs)137 2560 y Fu(Readline)g(implemen) +o(ts)f(a)f(facilit)o(y)g(similar)h(in)g(spirit)f(to)f(the)h +(conditional)h(compilation)g(features)75 2615 y(of)e(the)g(C)g(prepro)q +(cessor)g(whic)o(h)i(allo)o(ws)e(k)o(ey)g(bindings)i(and)f(v)m(ariable) +g(settings)f(to)g(b)q(e)h(p)q(erformed)f(as)75 2670 y(the)e(result)h +(of)f(tests.)k(There)c(are)g(four)g(parser)g(directiv)o(es)h(used.)p +eop +%%Page: 8 10 +8 9 bop 75 -58 a Fu(8)1322 b(GNU)15 b(Readline)i(Library)75 +183 y Ft($if)168 b Fu(The)16 b Ft($if)f Fu(construct)g(allo)o(ws)h +(bindings)i(to)d(b)q(e)h(made)g(based)g(on)f(the)h(editing)h(mo)q(de,)f +(the)315 238 y(terminal)k(b)q(eing)g(used,)g(or)f(the)g(application)i +(using)e(Readline.)34 b(The)19 b(text)g(of)f(the)i(test)315 +293 y(extends)c(to)e(the)h(end)h(of)f(the)g(line;)i(no)e(c)o(haracters) +f(are)h(required)i(to)d(isolate)i(it.)315 373 y Ft(mode)144 +b Fu(The)11 b Ft(mode=)e Fu(form)h(of)g(the)h Ft($if)f +Fu(directiv)o(e)h(is)g(used)g(to)f(test)g(whether)h(Readline)555 +427 y(is)k(in)h Ft(emacs)e Fu(or)g Ft(vi)g Fu(mo)q(de.)20 +b(This)c(ma)o(y)e(b)q(e)h(used)g(in)h(conjunction)g(with)f(the)555 +482 y(`)p Ft(set)f(keymap)p Fu(')f(command,)g(for)h(instance,)g(to)f +(set)h(bindings)h(in)g(the)f Ft(emacs-)555 537 y(standard)d +Fu(and)i Ft(emacs-ctlx)e Fu(k)o(eymaps)h(only)i(if)f(Readline)h(is)f +(starting)f(out)555 592 y(in)k Ft(emacs)f Fu(mo)q(de.)315 +671 y Ft(term)144 b Fu(The)14 b Ft(term=)e Fu(form)h(ma)o(y)g(b)q(e)h +(used)g(to)f(include)j(terminal-sp)q(eci\014c)g(k)o(ey)d(bind-)555 +726 y(ings,)19 b(p)q(erhaps)g(to)e(bind)i(the)g(k)o(ey)e(sequences)j +(output)e(b)o(y)g(the)g(terminal's)555 781 y(function)13 +b(k)o(eys.)18 b(The)13 b(w)o(ord)e(on)h(the)g(righ)o(t)g(side)g(of)g +(the)g(`)p Ft(=)p Fu(')f(is)h(tested)g(against)555 836 +y(b)q(oth)j(the)g(full)i(name)e(of)f(the)h(terminal)h(and)f(the)g(p)q +(ortion)h(of)e(the)h(terminal)555 891 y(name)i(b)q(efore)g(the)g +(\014rst)f(`)p Ft(-)p Fu('.)24 b(This)17 b(allo)o(ws)g +Ft(sun)f Fu(to)g(matc)o(h)h(b)q(oth)f Ft(sun)h Fu(and)555 +945 y Ft(sun-cmd)p Fu(,)d(for)g(instance.)315 1025 y +Ft(application)555 1080 y Fu(The)d Fm(application)i Fu(construct)e(is)g +(used)h(to)e(include)j(application-sp)q(eci)q(\014c)h(set-)555 +1135 y(tings.)19 b(Eac)o(h)12 b(program)f(using)j(the)e(Readline)j +(library)e(sets)f(the)g Fm(application)555 1189 y(name)p +Fu(,)17 b(and)f(y)o(ou)h(can)f(test)g(for)g(it.)24 b(This)18 +b(could)f(b)q(e)g(used)g(to)f(bind)i(k)o(ey)f(se-)555 +1244 y(quences)c(to)e(functions)i(useful)g(for)e(a)h(sp)q(eci\014c)i +(program.)j(F)l(or)12 b(instance,)h(the)555 1299 y(follo)o(wing)i +(command)f(adds)g(a)f(k)o(ey)h(sequence)h(that)f(quotes)f(the)i(curren) +o(t)e(or)555 1354 y(previous)j(w)o(ord)e(in)i(Bash:)675 +1418 y Ft($if)23 b(Bash)675 1470 y(#)h(Quote)f(the)g(current)g(or)h +(previous)f(word)675 1522 y("\\C-xq":)g("\\eb\\"\\ef\\"")675 +1574 y($endif)75 1654 y($endif)96 b Fu(This)16 b(command,)e(as)h(seen)h +(in)g(the)f(previous)h(example,)g(terminates)f(an)g Ft($if)f +Fu(command.)75 1733 y Ft($else)120 b Fu(Commands)15 b(in)h(this)f +(branc)o(h)h(of)e(the)i Ft($if)e Fu(directiv)o(e)j(are)e(executed)h(if) +g(the)f(test)g(fails.)75 1813 y Ft($include)48 b Fu(This)14 +b(directiv)o(e)i(tak)o(es)d(a)g(single)i(\014lename)g(as)f(an)f +(argumen)o(t)g(and)h(reads)g(commands)g(and)315 1868 +y(bindings)j(from)e(that)f(\014le.)435 1932 y Ft($include)23 +b(/etc/inputrc)75 2044 y Fl(1.3.3)30 b(Sample)20 b(Init)h(File)137 +2140 y Fu(Here)16 b(is)g(an)f(example)h(of)f(an)h(inputrc)g(\014le.)22 +b(This)16 b(illustrates)g(k)o(ey)g(binding,)h(v)m(ariable)f(assignmen)o +(t,)75 2195 y(and)f(conditional)i(syn)o(tax.)p eop +%%Page: 9 11 +9 10 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1077 +b(9)195 235 y Ft(#)24 b(This)f(file)g(controls)g(the)h(behaviour)e(of)i +(line)f(input)g(editing)g(for)195 287 y(#)h(programs)e(that)i(use)f +(the)h(Gnu)f(Readline)g(library.)47 b(Existing)22 b(programs)195 +339 y(#)i(include)f(FTP,)g(Bash,)g(and)h(Gdb.)195 391 +y(#)195 443 y(#)g(You)f(can)h(re-read)f(the)g(inputrc)g(file)g(with)h +(C-x)f(C-r.)195 495 y(#)h(Lines)f(beginning)g(with)g('#')g(are)h +(comments.)195 546 y(#)195 598 y(#)g(First,)f(include)g(any)g +(systemwide)g(bindings)f(and)i(variable)f(assignments)f(from)195 +650 y(#)i(/etc/Inputrc)195 702 y($include)f(/etc/Inputrc)195 +806 y(#)195 858 y(#)h(Set)f(various)g(bindings)g(for)g(emacs)g(mode.) +195 962 y(set)g(editing-mode)g(emacs)195 1065 y($if)g(mode=emacs)195 +1169 y(Meta-Control-h:)46 b(backward-kill-word)21 b(Text)i(after)h(the) +f(function)g(name)g(is)h(ignored)p 1986 1179 21 38 v +195 1273 a(#)195 1325 y(#)g(Arrow)f(keys)g(in)h(keypad)f(mode)195 +1377 y(#)195 1429 y(#"\\M-OD":)190 b(backward-char)195 +1480 y(#"\\M-OC":)g(forward-char)195 1532 y(#"\\M-OA":)g +(previous-history)195 1584 y(#"\\M-OB":)g(next-history)195 +1636 y(#)195 1688 y(#)24 b(Arrow)f(keys)g(in)h(ANSI)f(mode)195 +1740 y(#)195 1792 y("\\M-[D":)190 b(backward-char)195 +1844 y("\\M-[C":)g(forward-char)195 1896 y("\\M-[A":)g +(previous-history)195 1947 y("\\M-[B":)g(next-history)195 +1999 y(#)195 2051 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(keypad)g(mode) +195 2103 y(#)195 2155 y(#"\\M-\\C-OD":)165 b(backward-char)195 +2207 y(#"\\M-\\C-OC":)g(forward-char)195 2259 y(#"\\M-\\C-OA":)g +(previous-history)195 2311 y(#"\\M-\\C-OB":)g(next-history)195 +2363 y(#)195 2414 y(#)24 b(Arrow)f(keys)g(in)h(8)g(bit)f(ANSI)g(mode) +195 2466 y(#)195 2518 y(#"\\M-\\C-[D":)165 b(backward-char)195 +2570 y(#"\\M-\\C-[C":)g(forward-char)195 2622 y(#"\\M-\\C-[A":)g +(previous-history)p eop +%%Page: 10 12 +10 11 bop 75 -58 a Fu(10)1299 b(GNU)15 b(Readline)i(Library)195 +183 y Ft(#"\\M-\\C-[B":)165 b(next-history)195 287 y(C-q:)23 +b(quoted-insert)195 391 y($endif)195 495 y(#)h(An)f(old-style)g +(binding.)47 b(This)23 b(happens)g(to)g(be)h(the)f(default.)195 +546 y(TAB:)g(complete)195 650 y(#)h(Macros)f(that)g(are)h(convenient)e +(for)h(shell)h(interaction)195 702 y($if)f(Bash)195 754 +y(#)h(edit)f(the)g(path)195 806 y("\\C-xp":)g +("PATH=${PATH}\\e\\C-e\\C-a\\)o(ef\\C-f")195 858 y(#)h(prepare)f(to)g +(type)h(a)f(quoted)g(word)h(--)f(insert)g(open)h(and)f(close)g(double)g +(quotes)195 910 y(#)h(and)f(move)g(to)h(just)f(after)h(the)f(open)g +(quote)195 962 y("\\C-x\\"":)g("\\"\\"\\C-b")195 1013 +y(#)h(insert)f(a)g(backslash)g(\(testing)g(backslash)g(escapes)f(in)i +(sequences)f(and)g(macros\))195 1065 y("\\C-x\\\\":)g("\\\\")195 +1117 y(#)h(Quote)f(the)g(current)g(or)h(previous)f(word)195 +1169 y("\\C-xq":)g("\\eb\\"\\ef\\"")195 1221 y(#)h(Add)f(a)h(binding)f +(to)g(refresh)g(the)h(line,)f(which)g(is)h(unbound)195 +1273 y("\\C-xr":)f(redraw-current-line)195 1325 y(#)h(Edit)f(variable)g +(on)g(current)g(line.)195 1377 y("\\M-\\C-v":)f +("\\C-a\\C-k$\\C-y\\M-\\C-e\\C-a\\C-y=)o(")195 1429 y($endif)195 +1532 y(#)i(use)f(a)h(visible)f(bell)g(if)h(one)f(is)h(available)195 +1584 y(set)f(bell-style)g(visible)195 1688 y(#)h(don't)f(strip)g +(characters)g(to)g(7)h(bits)f(when)h(reading)195 1740 +y(set)f(input-meta)g(on)195 1844 y(#)h(allow)f(iso-latin1)f(characters) +h(to)g(be)h(inserted)f(rather)g(than)g(converted)g(to)195 +1896 y(#)h(prefix-meta)e(sequences)195 1947 y(set)h(convert-meta)g(off) +195 2051 y(#)h(display)f(characters)f(with)h(the)h(eighth)f(bit)g(set)h +(directly)f(rather)g(than)195 2103 y(#)h(as)f(meta-prefixed)f +(characters)195 2155 y(set)h(output-meta)g(on)195 2259 +y(#)h(if)f(there)g(are)h(more)f(than)h(150)f(possible)g(completions)f +(for)i(a)f(word,)h(ask)f(the)195 2311 y(#)h(user)f(if)h(he)f(wants)g +(to)h(see)f(all)h(of)f(them)195 2363 y(set)g(completion-query-items)e +(150)195 2466 y(#)j(For)f(FTP)195 2518 y($if)g(Ftp)195 +2570 y("\\C-xg":)g("get)g(\\M-?")195 2622 y("\\C-xt":)g("put)g(\\M-?")p +eop +%%Page: 11 13 +11 12 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055 +b(11)195 183 y Ft("\\M-.":)23 b(yank-last-arg)195 235 +y($endif)75 369 y Fs(1.4)33 b(Bindable)24 b(Readline)f(Commands)137 +467 y Fu(This)16 b(section)g(describ)q(es)h(Readline)g(commands)e(that) +g(ma)o(y)f(b)q(e)i(b)q(ound)g(to)f(k)o(ey)g(sequences.)75 +583 y Fl(1.4.1)30 b(Commands)21 b(F)-5 b(or)19 b(Mo)n(ving)75 +695 y Ft(beginning-of-line)13 b(\(C-a\))315 749 y Fu(Mo)o(v)o(e)h(to)h +(the)g(start)f(of)h(the)g(curren)o(t)g(line.)75 831 y +Ft(end-of-line)f(\(C-e\))315 886 y Fu(Mo)o(v)o(e)g(to)h(the)g(end)h(of) +f(the)g(line.)75 967 y Ft(forward-char)f(\(C-f\))315 +1022 y Fu(Mo)o(v)o(e)g(forw)o(ard)g(a)h(c)o(haracter.)75 +1104 y Ft(backward-char)e(\(C-b\))315 1159 y Fu(Mo)o(v)o(e)h(bac)o(k)h +(a)g(c)o(haracter.)75 1240 y Ft(forward-word)f(\(M-f\))315 +1295 y Fu(Mo)o(v)o(e)g(forw)o(ard)g(to)g(the)i(end)g(of)e(the)h(next)h +(w)o(ord.)j(W)l(ords)c(are)f(comp)q(osed)i(of)f(letters)g(and)315 +1350 y(digits.)75 1431 y Ft(backward-word)e(\(M-b\))315 +1486 y Fu(Mo)o(v)o(e)i(bac)o(k)h(to)g(the)g(start)f(of)h(this,)g(or)g +(the)g(previous,)h(w)o(ord.)22 b(W)l(ords)16 b(are)g(comp)q(osed)g(of) +315 1541 y(letters)f(and)h(digits.)75 1623 y Ft(clear-screen)e(\(C-l\)) +315 1677 y Fu(Clear)f(the)h(screen)g(and)f(redra)o(w)g(the)g(curren)o +(t)g(line,)i(lea)o(ving)g(the)e(curren)o(t)g(line)i(at)e(the)g(top)315 +1732 y(of)i(the)g(screen.)75 1814 y Ft(redraw-current-line)e(\(\))315 +1869 y Fu(Refresh)j(the)f(curren)o(t)g(line.)22 b(By)15 +b(default,)h(this)f(is)h(un)o(b)q(ound.)75 1985 y Fl(1.4.2)30 +b(Commands)21 b(F)-5 b(or)19 b(Manipulating)i(The)f(History)75 +2096 y Ft(accept-line)14 b(\(Newline,)g(Return\))315 +2151 y Fu(Accept)h(the)g(line)i(regardless)e(of)g(where)g(the)g(cursor) +f(is.)20 b(If)c(this)f(line)h(is)g(non-empt)o(y)l(,)f(add)315 +2206 y(it)f(to)g(the)g(history)g(list.)20 b(If)14 b(this)h(line)g(w)o +(as)e(a)h(history)g(line,)i(then)e(restore)f(the)h(history)g(line)315 +2261 y(to)h(its)g(original)h(state.)75 2342 y Ft(previous-history)d +(\(C-p\))315 2397 y Fu(Mo)o(v)o(e)h(`up')h(through)g(the)g(history)g +(list.)75 2479 y Ft(next-history)f(\(C-n\))315 2534 y +Fu(Mo)o(v)o(e)g(`do)o(wn')g(through)h(the)h(history)f(list.)75 +2615 y Ft(beginning-of-history)d(\(M-<\))315 2670 y Fu(Mo)o(v)o(e)i(to) +h(the)g(\014rst)g(line)i(in)f(the)f(history)l(.)p eop +%%Page: 12 14 +12 13 bop 75 -58 a Fu(12)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Ft(end-of-history)c(\(M->\))315 238 y Fu(Mo)o(v)o(e)h(to)h(the)g +(end)h(of)f(the)g(input)h(history)l(,)f(i.e.,)g(the)g(line)i(curren)o +(tly)f(b)q(eing)g(en)o(tered.)75 324 y Ft(reverse-search-history)c +(\(C-r\))315 379 y Fu(Searc)o(h)k(bac)o(kw)o(ard)e(starting)h(at)g(the) +h(curren)o(t)f(line)j(and)d(mo)o(ving)h(`up')f(through)g(the)h(his-)315 +433 y(tory)e(as)h(necessary)l(.)20 b(This)c(is)g(an)f(incremen)o(tal)h +(searc)o(h.)75 519 y Ft(forward-search-history)c(\(C-s\))315 +574 y Fu(Searc)o(h)j(forw)o(ard)e(starting)h(at)h(the)f(curren)o(t)h +(line)h(and)f(mo)o(ving)g(`do)o(wn')f(through)g(the)h(the)315 +629 y(history)g(as)g(necessary)l(.)20 b(This)c(is)g(an)f(incremen)o +(tal)h(searc)o(h.)75 715 y Ft(non-incremental-reverse-se)o(arch-hi)o +(story)c(\(M-p\))315 769 y Fu(Searc)o(h)k(bac)o(kw)o(ard)e(starting)h +(at)g(the)h(curren)o(t)f(line)j(and)d(mo)o(ving)h(`up')f(through)g(the) +h(his-)315 824 y(tory)h(as)h(necessary)g(using)h(a)e(non-incremen)o +(tal)j(searc)o(h)e(for)f(a)h(string)g(supplied)i(b)o(y)e(the)315 +879 y(user.)75 965 y Ft(non-incremental-forward-se)o(arch-hi)o(story)12 +b(\(M-n\))315 1019 y Fu(Searc)o(h)j(forw)o(ard)e(starting)h(at)h(the)f +(curren)o(t)h(line)h(and)f(mo)o(ving)g(`do)o(wn')f(through)g(the)h(the) +315 1074 y(history)e(as)g(necessary)h(using)g(a)f(non-incremen)o(tal)i +(searc)o(h)e(for)g(a)g(string)g(supplied)j(b)o(y)d(the)315 +1129 y(user.)75 1215 y Ft(history-search-forward)f(\(\))315 +1270 y Fu(Searc)o(h)21 b(forw)o(ard)e(through)i(the)f(history)h(for)f +(the)h(string)g(of)f(c)o(haracters)g(b)q(et)o(w)o(een)h(the)315 +1324 y(start)15 b(of)h(the)h(curren)o(t)f(line)i(and)e(the)h(curren)o +(t)f(cursor)g(p)q(osition)i(\(the)e Fm(p)q(oin)o(t)q +Fu(\).)23 b(This)17 b(is)g(a)315 1379 y(non-incremen)o(tal)g(searc)o +(h.)i(By)d(default,)f(this)h(command)f(is)h(un)o(b)q(ound.)75 +1465 y Ft(history-search-backward)c(\(\))315 1520 y Fu(Searc)o(h)18 +b(bac)o(kw)o(ard)e(through)h(the)h(history)f(for)g(the)g(string)h(of)f +(c)o(haracters)f(b)q(et)o(w)o(een)i(the)315 1575 y(start)e(of)h(the)h +(curren)o(t)g(line)h(and)e(the)h(p)q(oin)o(t.)28 b(This)18 +b(is)g(a)f(non-incremen)o(tal)i(searc)o(h.)27 b(By)315 +1629 y(default,)15 b(this)h(command)f(is)h(un)o(b)q(ound.)75 +1715 y Ft(yank-nth-arg)e(\(M-C-y\))315 1770 y Fu(Insert)f(the)g +(\014rst)g(argumen)o(t)f(to)g(the)i(previous)f(command)g(\(usually)h +(the)f(second)h(w)o(ord)e(on)315 1825 y(the)i(previous)i(line\).)21 +b(With)14 b(an)h(argumen)o(t)e Fm(n)p Fu(,)i(insert)f(the)h +Fm(n)p Fu(th)f(w)o(ord)g(from)g(the)g(previous)315 1879 +y(command)f(\(the)h(w)o(ords)f(in)h(the)g(previous)g(command)g(b)q +(egin)h(with)f(w)o(ord)e(0\).)19 b(A)14 b(negativ)o(e)315 +1934 y(argumen)o(t)g(inserts)i(the)f Fm(n)p Fu(th)h(w)o(ord)e(from)h +(the)g(end)h(of)e(the)i(previous)g(command.)75 2020 y +Ft(yank-last-arg)d(\(M-.,)i(M-_\))315 2075 y Fu(Insert)j(last)f +(argumen)o(t)g(to)g(the)g(previous)i(command)e(\(the)g(last)h(w)o(ord)f +(of)g(the)g(previous)315 2130 y(history)e(en)o(try\).)20 +b(With)15 b(an)g(argumen)o(t,)g(b)q(eha)o(v)o(e)g(exactly)h(lik)o(e)g +Ft(yank-nth-arg)p Fu(.)j(Succes-)315 2184 y(siv)o(e)f(calls)g(to)f +Ft(yank-last-arg)e Fu(mo)o(v)o(e)i(bac)o(k)g(through)g(the)g(history)g +(list,)i(inserting)f(the)315 2239 y(last)d(argumen)o(t)g(of)f(eac)o(h)i +(line)g(in)g(turn.)75 2363 y Fl(1.4.3)30 b(Commands)21 +b(F)-5 b(or)19 b(Changing)i(T)-5 b(ext)75 2481 y Ft(delete-char)14 +b(\(C-d\))315 2536 y Fu(Delete)j(the)f(c)o(haracter)g(under)h(the)f +(cursor.)23 b(If)16 b(the)h(cursor)f(is)h(at)e(the)i(b)q(eginning)h(of) +e(the)315 2591 y(line,)j(there)e(are)g(no)g(c)o(haracters)f(in)i(the)g +(line,)h(and)e(the)g(last)g(c)o(haracter)g(t)o(yp)q(ed)g(w)o(as)f(not) +315 2646 y(b)q(ound)g(to)f Ft(delete-char)p Fu(,)e(then)j(return)f +Ft(EOF)p Fu(.)p eop +%%Page: 13 15 +13 14 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055 +b(13)75 183 y Ft(backward-delete-char)12 b(\(Rubout\))315 +238 y Fu(Delete)k(the)f(c)o(haracter)f(b)q(ehind)j(the)f(cursor.)j(A)c +(n)o(umeric)h(argumen)o(t)e(means)i(to)e(kill)j(the)315 +293 y(c)o(haracters)d(instead)i(of)f(deleting)i(them.)75 +378 y Ft(quoted-insert)c(\(C-q,)i(C-v\))315 432 y Fu(Add)j(the)f(next)g +(c)o(haracter)g(t)o(yp)q(ed)g(to)f(the)i(line)g(v)o(erbatim.)26 +b(This)18 b(is)f(ho)o(w)g(to)g(insert)g(k)o(ey)315 487 +y(sequences)f(lik)o(e)605 485 y Fo(h)p 617 459 56 2 v +617 487 a Fn(C-q)p 617 495 V 671 485 a Fo(i)685 487 y +Fu(,)f(for)g(example.)75 572 y Ft(tab-insert)f(\(M-TAB\))315 +627 y Fu(Insert)h(a)g(tab)g(c)o(haracter.)75 712 y Ft(self-insert)f +(\(a,)g(b,)h(A,)g(1,)g(!,)g(...\))315 766 y Fu(Insert)g(y)o(ourself.)75 +851 y Ft(transpose-chars)e(\(C-t\))315 906 y Fu(Drag)i(the)h(c)o +(haracter)f(b)q(efore)h(the)h(cursor)e(forw)o(ard)g(o)o(v)o(er)g(the)h +(c)o(haracter)f(at)h(the)g(cursor,)315 961 y(mo)o(ving)i(the)f(cursor)h +(forw)o(ard)e(as)i(w)o(ell.)28 b(If)18 b(the)g(insertion)h(p)q(oin)o(t) +f(is)g(at)f(the)h(end)h(of)e(the)315 1016 y(line,)c(then)e(this)h +(transp)q(oses)e(the)h(last)g(t)o(w)o(o)f(c)o(haracters)g(of)h(the)g +(line.)20 b(Negativ)o(e)11 b(argumen)o(ts)315 1070 y(don't)k(w)o(ork.) +75 1155 y Ft(transpose-words)e(\(M-t\))315 1210 y Fu(Drag)j(the)h(w)o +(ord)f(b)q(ehind)k(the)d(cursor)f(past)h(the)g(w)o(ord)g(in)g(fron)o(t) +g(of)f(the)h(cursor)g(mo)o(ving)315 1265 y(the)e(cursor)g(o)o(v)o(er)g +(that)f(w)o(ord)g(as)h(w)o(ell.)75 1350 y Ft(upcase-word)f(\(M-u\))315 +1404 y Fu(Upp)q(ercase)j(the)f(curren)o(t)g(\(or)f(follo)o(wing\))h(w)o +(ord.)22 b(With)16 b(a)g(negativ)o(e)g(argumen)o(t,)f(upp)q(er-)315 +1459 y(case)g(the)g(previous)h(w)o(ord,)f(but)g(do)g(not)g(mo)o(v)o(e)f +(the)i(cursor.)75 1544 y Ft(downcase-word)d(\(M-l\))315 +1599 y Fu(Lo)o(w)o(ercase)d(the)h(curren)o(t)g(\(or)f(follo)o(wing\))h +(w)o(ord.)17 b(With)11 b(a)g(negativ)o(e)g(argumen)o(t,)f(lo)o(w)o +(ercase)315 1654 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o +(v)o(e)f(the)h(cursor.)75 1738 y Ft(capitalize-word)e(\(M-c\))315 +1793 y Fu(Capitalize)f(the)f(curren)o(t)f(\(or)g(follo)o(wing\))h(w)o +(ord.)18 b(With)11 b(a)f(negativ)o(e)h(argumen)o(t,)f(capitalize)315 +1848 y(the)15 b(previous)h(w)o(ord,)e(but)i(do)f(not)g(mo)o(v)o(e)f +(the)h(cursor.)75 1970 y Fl(1.4.4)30 b(Killing)20 b(And)h(Y)-5 +b(anking)75 2087 y Ft(kill-line)14 b(\(C-k\))315 2142 +y Fu(Kill)j(the)f(text)e(from)h(the)g(curren)o(t)g(cursor)g(p)q +(osition)h(to)f(the)g(end)h(of)f(the)g(line.)75 2226 +y Ft(backward-kill-line)e(\(C-x)h(Rubout\))315 2281 y +Fu(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g(line.) +75 2366 y Ft(unix-line-discard)e(\(C-u\))315 2421 y Fu(Kill)18 +b(bac)o(kw)o(ard)d(from)g(the)h(cursor)g(to)f(the)h(b)q(eginning)i(of)e +(the)g(curren)o(t)g(line.)24 b(The)16 b(killed)315 2476 +y(text)f(is)g(sa)o(v)o(ed)g(on)g(the)h(kill-ring.)75 +2560 y Ft(kill-whole-line)d(\(\))315 2615 y Fu(Kill)h(all)e(c)o +(haracters)f(on)g(the)g(curren)o(t)h(line,)h(no)f(matter)e(where)h(the) +h(cursor)f(is.)19 b(By)12 b(default,)315 2670 y(this)k(is)f(un)o(b)q +(ound.)p eop +%%Page: 14 16 +14 15 bop 75 -58 a Fu(14)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Ft(kill-word)d(\(M-d\))315 238 y Fu(Kill)i(from)d(the)i(cursor)e +(to)h(the)g(end)g(of)g(the)g(curren)o(t)g(w)o(ord,)f(or)h(if)g(b)q(et)o +(w)o(een)g(w)o(ords,)g(to)f(the)315 293 y(end)j(of)f(the)g(next)g(w)o +(ord.)k(W)l(ord)c(b)q(oundaries)i(are)e(the)g(same)g(as)g +Ft(forward-word)p Fu(.)75 372 y Ft(backward-kill-word)e(\(M-DEL\))315 +426 y Fu(Kill)18 b(the)d(w)o(ord)g(b)q(ehind)j(the)d(cursor.)20 +b(W)l(ord)c(b)q(oundaries)g(are)f(the)h(same)f(as)g Ft(backward-)315 +481 y(word)p Fu(.)75 560 y Ft(unix-word-rubout)e(\(C-w\))315 +615 y Fu(Kill)20 b(the)d(w)o(ord)g(b)q(ehind)j(the)d(cursor,)h(using)g +(white)g(space)g(as)f(a)g(w)o(ord)g(b)q(oundary)l(.)28 +b(The)315 670 y(killed)17 b(text)e(is)h(sa)o(v)o(ed)f(on)g(the)g +(kill-ring.)75 749 y Ft(delete-horizontal-space)d(\(\))315 +803 y Fu(Delete)k(all)g(spaces)f(and)h(tabs)e(around)i(p)q(oin)o(t.)k +(By)15 b(default,)h(this)f(is)h(un)o(b)q(ound.)75 882 +y Ft(kill-region)e(\(\))315 937 y Fu(Kill)h(the)e(text)f(b)q(et)o(w)o +(een)h(the)g(p)q(oin)o(t)g(and)g(the)g Fm(mark)i Fu(\(sa)o(v)o(ed)d +(cursor)g(p)q(osition\).)20 b(This)13 b(text)315 992 +y(is)j(referred)f(to)g(as)f(the)i Fm(region)p Fu(.)k(By)15 +b(default,)h(this)f(command)g(is)h(un)o(b)q(ound.)75 +1071 y Ft(copy-region-as-kill)d(\(\))315 1125 y Fu(Cop)o(y)j(the)i +(text)e(in)i(the)f(region)g(to)g(the)g(kill)h(bu\013er,)f(so)g(it)g +(can)g(b)q(e)h(y)o(ank)o(ed)f(righ)o(t)g(a)o(w)o(a)o(y)l(.)315 +1180 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q(ound.)75 +1259 y Ft(copy-backward-word)d(\(\))315 1314 y Fu(Cop)o(y)19 +b(the)g(w)o(ord)g(b)q(efore)g(p)q(oin)o(t)h(to)e(the)i(kill)h +(bu\013er.)32 b(The)19 b(w)o(ord)g(b)q(oundaries)h(are)f(the)315 +1369 y(same)c(as)g Ft(backward-word)p Fu(.)j(By)d(default,)g(this)h +(command)f(is)h(un)o(b)q(ound.)75 1448 y Ft(copy-forward-word)d(\(\)) +315 1502 y Fu(Cop)o(y)i(the)h(w)o(ord)e(follo)o(wing)j(p)q(oin)o(t)f +(to)f(the)g(kill)j(bu\013er.)i(The)c(w)o(ord)f(b)q(oundaries)i(are)e +(the)315 1557 y(same)g(as)g Ft(forward-word)p Fu(.)j(By)d(default,)h +(this)f(command)g(is)h(un)o(b)q(ound.)75 1636 y Ft(yank)f(\(C-y\))315 +1691 y Fu(Y)l(ank)g(the)h(top)f(of)f(the)i(kill)h(ring)e(in)o(to)g(the) +h(bu\013er)f(at)f(the)i(curren)o(t)f(cursor)g(p)q(osition.)75 +1770 y Ft(yank-pop)f(\(M-y\))315 1824 y Fu(Rotate)j(the)g(kill-ring,)j +(and)d(y)o(ank)g(the)h(new)f(top.)26 b(Y)l(ou)17 b(can)h(only)g(do)f +(this)h(if)f(the)h(prior)315 1879 y(command)d(is)h(y)o(ank)f(or)f(y)o +(ank-p)q(op.)75 1990 y Fl(1.4.5)30 b(Sp)r(ecifying)20 +b(Numeric)h(Argumen)n(ts)75 2098 y Ft(digit-argument)13 +b(\(M-0,)i(M-1,)f(...)h(M--\))315 2153 y Fu(Add)f(this)g(digit)g(to)f +(the)h(argumen)o(t)e(already)i(accum)o(ulating,)g(or)f(start)f(a)h(new) +h(argumen)o(t.)315 2206 y Fo(h)p 327 2180 50 2 v 327 +2208 a Fn(M{)p 327 2215 V 375 2206 a Fo(i)405 2208 y +Fu(starts)g(a)h(negativ)o(e)g(argumen)o(t.)75 2286 y +Ft(universal-argument)e(\(\))315 2341 y Fu(This)g(is)h(another)e(w)o(a) +o(y)g(to)g(sp)q(ecify)i(an)f(argumen)o(t.)18 b(If)13 +b(this)g(command)g(is)g(follo)o(w)o(ed)g(b)o(y)g(one)315 +2396 y(or)h(more)h(digits,)g(optionally)h(with)f(a)g(leading)h(min)o +(us)f(sign,)g(those)g(digits)g(de\014ne)h(the)f(ar-)315 +2451 y(gumen)o(t.)k(If)c(the)g(command)f(is)h(follo)o(w)o(ed)g(b)o(y)g +(digits,)g(executing)g Ft(universal-argument)315 2506 +y Fu(again)h(ends)g(the)g(n)o(umeric)h(argumen)o(t,)e(but)h(is)h +(otherwise)f(ignored.)22 b(As)16 b(a)g(sp)q(ecial)h(case,)315 +2560 y(if)g(this)g(command)f(is)h(immediately)h(follo)o(w)o(ed)f(b)o(y) +f(a)g(c)o(haracter)g(that)g(is)h(neither)g(a)f(digit)315 +2615 y(or)d(min)o(us)i(sign,)f(the)g(argumen)o(t)g(coun)o(t)f(for)h +(the)g(next)g(command)g(is)g(m)o(ultiplied)j(b)o(y)d(four.)315 +2670 y(The)19 b(argumen)o(t)f(coun)o(t)g(is)h(initially)j(one,)d(so)f +(executing)i(this)f(function)h(the)e(\014rst)h(time)p +eop +%%Page: 15 17 +15 16 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055 +b(15)315 183 y(mak)o(es)15 b(the)h(argumen)o(t)f(coun)o(t)h(four,)f(a)h +(second)g(time)g(mak)o(es)g(the)g(argumen)o(t)f(coun)o(t)g(six-)315 +238 y(teen,)g(and)g(so)g(on.)20 b(By)15 b(default,)h(this)f(is)h(not)f +(b)q(ound)h(to)f(a)g(k)o(ey)l(.)75 341 y Fl(1.4.6)30 +b(Letting)20 b(Readline)g(T)n(yp)r(e)h(F)-5 b(or)19 b(Y)-5 +b(ou)75 444 y Ft(complete)14 b(\(TAB\))315 499 y Fu(A)o(ttempt)j(to)g +(do)h(completion)g(on)g(the)g(text)f(b)q(efore)h(the)g(cursor.)27 +b(This)18 b(is)g(application-)315 554 y(sp)q(eci\014c.)k(Generally)l(,) +15 b(if)g(y)o(ou)g(are)f(t)o(yping)h(a)g(\014lename)g(argumen)o(t,)f(y) +o(ou)g(can)h(do)g(\014lename)315 609 y(completion;)h(if)g(y)o(ou)f(are) +g(t)o(yping)h(a)f(command,)f(y)o(ou)h(can)h(do)f(command)g(completion;) +h(if)315 663 y(y)o(ou)i(are)g(t)o(yping)g(in)h(a)f(sym)o(b)q(ol)h(to)e +(GDB,)h(y)o(ou)g(can)g(do)g(sym)o(b)q(ol)h(name)f(completion;)i(if)315 +718 y(y)o(ou)13 b(are)g(t)o(yping)g(in)h(a)f(v)m(ariable)h(to)f(Bash,)g +(y)o(ou)g(can)g(do)g(v)m(ariable)h(name)f(completion,)i(and)315 +773 y(so)g(on.)75 847 y Ft(possible-completions)d(\(M-?\))315 +902 y Fu(List)k(the)f(p)q(ossible)i(completions)f(of)f(the)g(text)g(b)q +(efore)h(the)f(cursor.)75 976 y Ft(insert-completions)e(\(M-*\))315 +1030 y Fu(Insert)j(all)g(completions)g(of)f(the)g(text)g(b)q(efore)h(p) +q(oin)o(t)f(that)g(w)o(ould)h(ha)o(v)o(e)f(b)q(een)h(generated)315 +1085 y(b)o(y)f Ft(possible-completions)p Fu(.)75 1159 +y Ft(menu-complete)e(\(\))315 1214 y Fu(Similar)g(to)f +Ft(complete)p Fu(,)f(but)h(replaces)h(the)f(w)o(ord)f(to)g(b)q(e)i +(completed)f(with)h(a)e(single)j(matc)o(h)315 1269 y(from)k(the)h(list) +h(of)e(p)q(ossible)j(completions.)32 b(Rep)q(eated)20 +b(execution)g(of)f Ft(menu-complete)315 1323 y Fu(steps)h(through)g +(the)g(list)h(of)f(p)q(ossible)i(completions,)g(inserting)f(eac)o(h)f +(matc)o(h)f(in)i(turn.)315 1378 y(A)o(t)c(the)g(end)h(of)f(the)h(list)g +(of)f(completions,)i(the)e(b)q(ell)j(is)e(rung)f(and)h(the)f(original)i +(text)d(is)315 1433 y(restored.)26 b(An)17 b(argumen)o(t)g(of)g +Fm(n)g Fu(mo)o(v)o(es)g Fm(n)g Fu(p)q(ositions)h(forw)o(ard)e(in)i(the) +g(list)g(of)f(matc)o(hes;)315 1488 y(a)j(negativ)o(e)g(argumen)o(t)f +(ma)o(y)g(b)q(e)i(used)f(to)f(mo)o(v)o(e)h(bac)o(kw)o(ard)f(through)g +(the)h(list.)35 b(This)315 1543 y(command)15 b(is)h(in)o(tended)g(to)f +(b)q(e)h(b)q(ound)g(to)f Ft(TAB)p Fu(,)f(but)h(is)h(un)o(b)q(ound)g(b)o +(y)f(default.)75 1646 y Fl(1.4.7)30 b(Keyb)r(oard)20 +b(Macros)75 1749 y Ft(start-kbd-macro)13 b(\(C-x)i(\(\))315 +1804 y Fu(Begin)h(sa)o(ving)f(the)h(c)o(haracters)e(t)o(yp)q(ed)i(in)o +(to)f(the)g(curren)o(t)g(k)o(eyb)q(oard)g(macro.)75 1878 +y Ft(end-kbd-macro)e(\(C-x)i(\)\))315 1932 y Fu(Stop)f(sa)o(ving)f(the) +h(c)o(haracters)f(t)o(yp)q(ed)h(in)o(to)f(the)h(curren)o(t)g(k)o(eyb)q +(oard)f(macro)g(and)h(sa)o(v)o(e)f(the)315 1987 y(de\014nition.)75 +2061 y Ft(call-last-kbd-macro)g(\(C-x)h(e\))315 2116 +y Fu(Re-execute)19 b(the)f(last)f(k)o(eyb)q(oard)h(macro)f(de\014ned,)i +(b)o(y)e(making)h(the)g(c)o(haracters)e(in)j(the)315 +2171 y(macro)14 b(app)q(ear)i(as)f(if)g(t)o(yp)q(ed)h(at)e(the)i(k)o +(eyb)q(oard.)75 2274 y Fl(1.4.8)30 b(Some)20 b(Miscellaneous)h +(Commands)75 2377 y Ft(re-read-init-file)13 b(\(C-x)h(C-r\))315 +2432 y Fu(Read)e(in)g(the)f(con)o(ten)o(ts)g(of)f(the)i(inputrc)g +(\014le,)g(and)g(incorp)q(orate)f(an)o(y)g(bindings)i(or)e(v)m(ariable) +315 2487 y(assignmen)o(ts)k(found)h(there.)75 2560 y +Ft(abort)e(\(C-g\))315 2615 y Fu(Ab)q(ort)f(the)g(curren)o(t)h(editing) +g(command)f(and)h(ring)f(the)h(terminal's)f(b)q(ell)i(\(sub)s(ject)e +(to)g(the)315 2670 y(setting)i(of)g Ft(bell-style)p Fu(\).)p +eop +%%Page: 16 18 +16 17 bop 75 -58 a Fu(16)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Ft(do-uppercase-version)12 b(\(M-a,)j(M-b,)f(M-)p +Fm(x)p Ft(,)h Fj(:)8 b(:)g(:)n Ft(\))315 238 y Fu(If)14 +b(the)g(meta\014ed)g(c)o(haracter)f Fm(x)k Fu(is)d(lo)o(w)o(ercase,)g +(run)g(the)g(command)f(that)h(is)g(b)q(ound)h(to)e(the)315 +293 y(corresp)q(onding)j(upp)q(ercase)g(c)o(haracter.)75 +372 y Ft(prefix-meta)e(\(ESC\))315 427 y Fu(Mak)o(e)j(the)i(next)f(c)o +(haracter)f(t)o(yp)q(ed)i(b)q(e)g(meta\014ed.)28 b(This)19 +b(is)g(for)e(k)o(eyb)q(oards)h(without)g(a)315 482 y(meta)d(k)o(ey)l(.) +20 b(T)o(yping)15 b(`)p Ft(ESC)g(f)p Fu(')f(is)i(equiv)m(alen)o(t)h(to) +d(t)o(yping)i(`)p Ft(M-f)p Fu('.)75 561 y Ft(undo)f(\(C-_,)f(C-x)h +(C-u\))315 616 y Fu(Incremen)o(tal)h(undo,)f(separately)h(remem)o(b)q +(ered)g(for)e(eac)o(h)h(line.)75 695 y Ft(revert-line)f(\(M-r\))315 +750 y Fu(Undo)j(all)g(c)o(hanges)g(made)f(to)g(this)h(line.)26 +b(This)17 b(is)g(lik)o(e)h(executing)f(the)g Ft(undo)f +Fu(command)315 805 y(enough)g(times)f(to)g(get)f(bac)o(k)h(to)g(the)g +(b)q(eginning.)75 884 y Ft(tilde-expand)f(\(M-~\))315 +939 y Fu(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o +(ord.)75 1018 y Ft(set-mark)f(\(C-@\))315 1073 y Fu(Set)g(the)f(mark)g +(to)g(the)h(curren)o(t)g(p)q(oin)o(t.)19 b(If)14 b(a)g(n)o(umeric)g +(argumen)o(t)f(is)h(supplied,)i(the)e(mark)315 1128 y(is)i(set)f(to)f +(that)h(p)q(osition.)75 1207 y Ft(exchange-point-and-mark)d(\(C-x)j +(C-x\))315 1262 y Fu(Sw)o(ap)g(the)h(p)q(oin)o(t)g(with)g(the)g(mark.)k +(The)c(curren)o(t)f(cursor)h(p)q(osition)g(is)g(set)g(to)f(the)g(sa)o +(v)o(ed)315 1317 y(p)q(osition,)h(and)f(the)h(old)f(cursor)g(p)q +(osition)h(is)g(sa)o(v)o(ed)f(as)g(the)g(mark.)75 1396 +y Ft(character-search)e(\(C-]\))315 1451 y Fu(A)f(c)o(haracter)g(is)h +(read)g(and)f(p)q(oin)o(t)h(is)g(mo)o(v)o(ed)f(to)g(the)g(next)h(o)q +(ccurrence)g(of)f(that)g(c)o(haracter.)315 1506 y(A)j(negativ)o(e)h +(coun)o(t)f(searc)o(hes)g(for)f(previous)i(o)q(ccurrences.)75 +1585 y Ft(character-search-backward)c(\(M-C-]\))315 1640 +y Fu(A)22 b(c)o(haracter)g(is)h(read)f(and)h(p)q(oin)o(t)g(is)g(mo)o(v) +o(ed)f(to)g(the)g(previous)h(o)q(ccurrence)h(of)e(that)315 +1695 y(c)o(haracter.)d(A)c(negativ)o(e)h(coun)o(t)f(searc)o(hes)g(for)f +(subsequen)o(t)i(o)q(ccurrences.)75 1774 y Ft(insert-comment)d(\(M-#\)) +315 1829 y Fu(The)19 b(v)m(alue)i(of)e(the)g Ft(comment-begin)e +Fu(v)m(ariable)k(is)f(inserted)g(at)e(the)i(b)q(eginning)h(of)e(the)315 +1884 y(curren)o(t)c(line,)i(and)e(the)g(line)i(is)f(accepted)g(as)e(if) +i(a)f(newline)i(had)f(b)q(een)g(t)o(yp)q(ed.)75 1963 +y Ft(dump-functions)d(\(\))315 2018 y Fu(Prin)o(t)g(all)h(of)f(the)g +(functions)h(and)g(their)g(k)o(ey)f(bindings)i(to)d(the)i(Readline)h +(output)e(stream.)315 2073 y(If)j(a)g(n)o(umeric)g(argumen)o(t)f(is)i +(supplied,)h(the)e(output)f(is)i(formatted)d(in)j(suc)o(h)f(a)g(w)o(a)o +(y)f(that)315 2128 y(it)g(can)h(b)q(e)g(made)f(part)f(of)h(an)g +Fm(inputrc)k Fu(\014le.)i(This)16 b(command)f(is)h(un)o(b)q(ound)g(b)o +(y)f(default.)75 2207 y Ft(dump-variables)e(\(\))315 +2262 y Fu(Prin)o(t)e(all)g(of)f(the)h(settable)g(v)m(ariables)h(and)f +(their)g(v)m(alues)h(to)e(the)h(Readline)i(output)d(stream.)315 +2317 y(If)16 b(a)g(n)o(umeric)g(argumen)o(t)f(is)i(supplied,)h(the)e +(output)f(is)i(formatted)d(in)j(suc)o(h)f(a)g(w)o(a)o(y)f(that)315 +2371 y(it)g(can)h(b)q(e)g(made)f(part)f(of)h(an)g Fm(inputrc)k +Fu(\014le.)i(This)16 b(command)f(is)h(un)o(b)q(ound)g(b)o(y)f(default.) +75 2451 y Ft(dump-macros)f(\(\))315 2506 y Fu(Prin)o(t)j(all)h(of)e +(the)h(Readline)i(k)o(ey)e(sequences)h(b)q(ound)g(to)e(macros)g(and)h +(the)g(strings)g(they)315 2560 y(ouput.)30 b(If)19 b(a)f(n)o(umeric)i +(argumen)o(t)d(is)i(supplied,)j(the)c(output)h(is)g(formatted)e(in)i +(suc)o(h)g(a)315 2615 y(w)o(a)o(y)14 b(that)g(it)i(can)f(b)q(e)g(made)g +(part)g(of)f(an)h Fm(inputrc)k Fu(\014le.)i(This)15 b(command)g(is)h +(un)o(b)q(ound)g(b)o(y)315 2670 y(default.)p eop +%%Page: 17 19 +17 18 bop 75 -58 a Fu(Chapter)15 b(1:)k(Command)c(Line)i(Editing)1055 +b(17)75 183 y Fs(1.5)33 b(Readline)23 b(vi)h(Mo)r(de)137 +280 y Fu(While)13 b(the)f(Readline)j(library)d(do)q(es)g(not)g(ha)o(v)o +(e)f(a)h(full)h(set)f(of)f Ft(vi)g Fu(editing)j(functions,)f(it)f(do)q +(es)g(con)o(tain)75 334 y(enough)17 b(to)g(allo)o(w)g(simple)h(editing) +h(of)d(the)i(line.)27 b(The)17 b(Readline)i Ft(vi)e Fu(mo)q(de)g(b)q +(eha)o(v)o(es)g(as)g(sp)q(eci\014ed)i(in)75 389 y(the)c +Fp(POSIX)h Fu(1003.2)d(standard.)137 456 y(In)i(order)g(to)f(switc)o(h) +g(in)o(teractiv)o(ely)i(b)q(et)o(w)o(een)f Ft(emacs)e +Fu(and)i Ft(vi)f Fu(editing)i(mo)q(des,)f(use)f(the)h(command)75 +511 y(M-C-j)g(\(toggle-editing-mo)q(de\).)21 b(The)15 +b(Readline)j(default)d(is)h Ft(emacs)f Fu(mo)q(de.)137 +578 y(When)h(y)o(ou)e(en)o(ter)h(a)g(line)i(in)e Ft(vi)g +Fu(mo)q(de,)g(y)o(ou)g(are)f(already)i(placed)g(in)g(`insertion')f(mo)q +(de,)g(as)g(if)g(y)o(ou)75 633 y(had)e(t)o(yp)q(ed)h(an)f(`)p +Ft(i)p Fu('.)18 b(Pressing)608 631 y Fo(h)p 620 605 70 +2 v 620 633 a Fn(ESC)p 620 641 V 687 631 a Fo(i)715 633 +y Fu(switc)o(hes)13 b(y)o(ou)g(in)o(to)g(`command')f(mo)q(de,)i(where)f +(y)o(ou)g(can)g(edit)h(the)75 688 y(text)i(of)h(the)g(line)h(with)g +(the)f(standard)f Ft(vi)h Fu(mo)o(v)o(emen)o(t)f(k)o(eys,)g(mo)o(v)o(e) +g(to)h(previous)g(history)g(lines)i(with)75 743 y(`)p +Ft(k)p Fu(')14 b(and)i(subsequen)o(t)f(lines)i(with)f(`)p +Ft(j)p Fu(',)e(and)h(so)g(forth.)p eop +%%Page: 18 20 +18 19 bop 75 -58 a Fu(18)1299 b(GNU)15 b(Readline)i(Library)p +eop +%%Page: 19 21 +19 20 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(19)75 183 y Fq(2)41 b(Programming)28 +b(with)e(GNU)i(Readline)137 305 y Fu(This)16 b(c)o(hapter)f(describ)q +(es)i(the)f(in)o(terface)g(b)q(et)o(w)o(een)f(the)h(GNU)f(Readline)j +(Library)e(and)f(other)g(pro-)75 360 y(grams.)38 b(If)22 +b(y)o(ou)f(are)g(a)g(programmer,)h(and)f(y)o(ou)g(wish)i(to)d(include)k +(the)e(features)f(found)h(in)g(GNU)75 414 y(Readline)16 +b(suc)o(h)e(as)f(completion,)h(line)h(editing,)g(and)f(in)o(teractiv)o +(e)g(history)f(manipulation)i(in)g(y)o(our)d(o)o(wn)75 +469 y(programs,)i(this)h(section)h(is)g(for)e(y)o(ou.)75 +602 y Fs(2.1)33 b(Basic)22 b(Beha)n(vior)137 700 y Fu(Man)o(y)15 +b(programs)f(pro)o(vide)i(a)f(command)g(line)i(in)o(terface,)e(suc)o(h) +h(as)f Ft(mail)p Fu(,)f Ft(ftp)p Fu(,)h(and)g Ft(sh)p +Fu(.)20 b(F)l(or)15 b(suc)o(h)75 754 y(programs,)e(the)h(default)h(b)q +(eha)o(viour)g(of)f(Readline)j(is)d(su\016cien)o(t.)21 +b(This)14 b(section)h(describ)q(es)h(ho)o(w)e(to)g(use)75 +809 y(Readline)19 b(in)g(the)e(simplest)h(w)o(a)o(y)e(p)q(ossible,)j(p) +q(erhaps)f(to)f(replace)h(calls)g(in)g(y)o(our)f(co)q(de)h(to)e +Ft(gets\(\))g Fu(or)75 864 y Ft(fgets)e(\(\))p Fu(.)137 +933 y(The)j(function)h Ft(readline)c(\(\))j Fu(prin)o(ts)g(a)g(prompt)f +(and)h(then)g(reads)g(and)g(returns)g(a)g(single)h(line)g(of)75 +988 y(text)12 b(from)f(the)i(user.)19 b(The)12 b(line)i +Ft(readline)d Fu(returns)h(is)h(allo)q(cated)g(with)g +Ft(malloc)h(\(\))p Fu(;)e(y)o(ou)g(should)i Ft(free)75 +1042 y(\(\))h Fu(the)g(line)i(when)f(y)o(ou)f(are)f(done)i(with)g(it.)k +(The)15 b(declaration)h(for)f Ft(readline)f Fu(in)i(ANSI)g(C)f(is)195 +1108 y Ft(char)23 b(*readline)g(\(char)g(*)p Fm(prompt)q +Ft(\);)75 1177 y Fu(So,)15 b(one)g(migh)o(t)g(sa)o(y)195 +1243 y Ft(char)23 b(*line)g(=)h(readline)f(\("Enter)g(a)h(line:)f("\);) +75 1312 y Fu(in)12 b(order)f(to)g(read)h(a)f(line)i(of)e(text)g(from)f +(the)i(user.)19 b(The)11 b(line)j(returned)d(has)h(the)f(\014nal)h +(newline)i(remo)o(v)o(ed,)75 1366 y(so)h(only)h(the)f(text)g(remains.) +137 1435 y(If)21 b Ft(readline)e Fu(encoun)o(ters)h(an)g +Ft(EOF)g Fu(while)i(reading)f(the)f(line,)j(and)d(the)h(line)g(is)g +(empt)o(y)f(at)g(that)75 1490 y(p)q(oin)o(t,)15 b(then)g +Ft(\(char)f(*\)NULL)g Fu(is)h(returned.)21 b(Otherwise,)15 +b(the)g(line)h(is)f(ended)h(just)e(as)h(if)g(a)f(newline)j(had)75 +1545 y(b)q(een)f(t)o(yp)q(ed.)137 1614 y(If)d(y)o(ou)g(w)o(an)o(t)f +(the)h(user)g(to)f(b)q(e)i(able)g(to)e(get)g(at)h(the)g(line)h(later,)f +(\(with)1325 1612 y Fo(h)p 1338 1586 57 2 v 1338 1614 +a Fn(C-p)p 1338 1621 V 1392 1612 a Fo(i)1420 1614 y Fu(for)f +(example\),)i(y)o(ou)f(m)o(ust)75 1668 y(call)j Ft(add_history)e(\(\))h +Fu(to)f(sa)o(v)o(e)h(the)g(line)i(a)o(w)o(a)o(y)d(in)i(a)f +Fm(history)k Fu(list)d(of)e(suc)o(h)i(lines.)195 1734 +y Ft(add_history)22 b(\(line\);)75 1803 y Fu(F)l(or)15 +b(full)h(details)g(on)f(the)h(GNU)f(History)g(Library)l(,)g(see)h(the)f +(asso)q(ciated)g(man)o(ual.)137 1872 y(It)h(is)g(preferable)h(to)e(a)o +(v)o(oid)g(sa)o(ving)h(empt)o(y)f(lines)i(on)f(the)g(history)f(list,)i +(since)f(users)g(rarely)g(ha)o(v)o(e)f(a)75 1927 y(burning)h(need)g(to) +e(reuse)h(a)g(blank)g(line.)22 b(Here)15 b(is)g(a)g(function)g(whic)o +(h)h(usefully)h(replaces)e(the)g(standard)75 1981 y Ft(gets)g(\(\))f +Fu(library)i(function,)g(and)g(has)f(the)g(adv)m(an)o(tage)f(of)h(no)g +(static)g(bu\013er)h(to)e(o)o(v)o(er\015o)o(w:)195 2047 +y Ft(/*)24 b(A)f(static)g(variable)g(for)h(holding)e(the)i(line.)f(*/) +195 2099 y(static)g(char)g(*line_read)g(=)h(\(char)f(*\)NULL;)195 +2203 y(/*)h(Read)f(a)h(string,)f(and)g(return)g(a)h(pointer)f(to)g(it.) +48 b(Returns)22 b(NULL)i(on)f(EOF.)h(*/)195 2255 y(char)f(*)195 +2307 y(rl_gets)g(\(\))195 2359 y({)243 2411 y(/*)g(If)h(the)f(buffer)g +(has)h(already)f(been)g(allocated,)g(return)g(the)g(memory)314 +2462 y(to)h(the)f(free)h(pool.)f(*/)243 2514 y(if)g(\(line_read\))290 +2566 y({)338 2618 y(free)g(\(line_read\);)338 2670 y(line_read)g(=)h +(\(char)f(*\)NULL;)p eop +%%Page: 20 22 +20 21 bop 75 -58 a Fu(20)1299 b(GNU)15 b(Readline)i(Library)290 +183 y Ft(})243 287 y(/*)23 b(Get)h(a)f(line)h(from)f(the)h(user.)f(*/) +243 339 y(line_read)f(=)i(readline)f(\(""\);)243 443 +y(/*)g(If)h(the)f(line)h(has)f(any)h(text)f(in)g(it,)h(save)f(it)h(on)f +(the)h(history.)f(*/)243 495 y(if)g(\(line_read)g(&&)g(*line_read\))290 +546 y(add_history)g(\(line_read\);)243 650 y(return)g(\(line_read\);) +195 702 y(})137 771 y Fu(This)13 b(function)f(giv)o(es)h(the)e(user)h +(the)g(default)h(b)q(eha)o(viour)g(of)1169 769 y Fo(h)p +1181 742 74 2 v 1181 771 a Fn(T)m(AB)p 1181 778 V 1253 +769 a Fo(i)1280 771 y Fu(completion:)19 b(completion)13 +b(on)f(\014le)75 825 y(names.)20 b(If)c(y)o(ou)f(do)g(not)g(w)o(an)o(t) +f(Readline)k(to)c(complete)j(on)e(\014lenames,)h(y)o(ou)f(can)g(c)o +(hange)h(the)f(binding)75 880 y(of)g(the)205 878 y Fo(h)p +217 852 V 217 880 a Fn(T)m(AB)p 217 888 V 289 878 a Fo(i)319 +880 y Fu(k)o(ey)g(with)h Ft(rl_bind_key)d(\(\))p Fu(.)195 +946 y Ft(int)23 b(rl_bind_key)g(\(int)g Fm(k)o(ey)p Ft(,)h(int)f(\(*)p +Fm(function)p Ft(\)\(\)\);)137 1014 y(rl_bind_key)14 +b(\(\))h Fu(tak)o(es)g(t)o(w)o(o)g(argumen)o(ts:)20 b +Fm(k)o(ey)f Fu(is)d(the)g(c)o(haracter)f(that)g(y)o(ou)g(w)o(an)o(t)g +(to)g(bind,)i(and)75 1069 y Fm(function)i Fu(is)f(the)g(address)g(of)g +(the)g(function)g(to)g(call)h(when)f Fm(k)o(ey)k Fu(is)c(pressed.)29 +b(Binding)1628 1067 y Fo(h)p 1641 1041 V 1641 1069 a +Fn(T)m(AB)p 1641 1076 V 1712 1067 a Fo(i)1745 1069 y +Fu(to)17 b Ft(rl_)75 1124 y(insert)d(\(\))i Fu(mak)o(es)433 +1122 y Fo(h)p 446 1096 V 446 1124 a Fn(T)m(AB)p 446 1131 +V 517 1122 a Fo(i)548 1124 y Fu(insert)g(itself.)22 b +Ft(rl_bind_key)13 b(\(\))i Fu(returns)h(non-zero)g(if)g +Fm(k)o(ey)j Fu(is)d(not)f(a)g(v)m(alid)75 1178 y(ASCI)q(I)h(c)o +(haracter)f(co)q(de)h(\(b)q(et)o(w)o(een)f(0)g(and)g(255\).)137 +1247 y(Th)o(us,)g(to)g(disable)h(the)g(default)703 1245 +y Fo(h)p 716 1219 V 716 1247 a Fn(T)m(AB)p 716 1254 V +787 1245 a Fo(i)817 1247 y Fu(b)q(eha)o(vior,)g(the)f(follo)o(wing)h +(su\016ces:)195 1312 y Ft(rl_bind_key)22 b(\('\\t',)h(rl_insert\);)137 +1381 y Fu(This)14 b(co)q(de)g(should)g(b)q(e)g(executed)g(once)g(at)e +(the)h(start)f(of)h(y)o(our)g(program;)f(y)o(ou)h(migh)o(t)g(write)g(a) +g(func-)75 1435 y(tion)i(called)h Ft(initialize_readline)d(\(\))h +Fu(whic)o(h)i(p)q(erforms)e(this)h(and)g(other)g(desired)g +(initializations,)75 1490 y(suc)o(h)h(as)e(installing)k(custom)c +(completers)i(\(see)f(Section)h(2.5)f([Custom)f(Completers],)g(page)h +(30\).)75 1622 y Fs(2.2)33 b(Custom)21 b(F)-6 b(unctions)137 +1719 y Fu(Readline)15 b(pro)o(vides)e(man)o(y)e(functions)i(for)f +(manipulating)i(the)e(text)g(of)g(the)g(line,)i(but)e(it)h(isn't)f(p)q +(ossi-)75 1774 y(ble)i(to)f(an)o(ticipate)h(the)f(needs)h(of)f(all)h +(programs.)k(This)13 b(section)h(describ)q(es)h(the)e(v)m(arious)h +(functions)g(and)75 1829 y(v)m(ariables)g(de\014ned)h(within)f(the)f +(Readline)j(library)d(whic)o(h)h(allo)o(w)g(a)e(user)h(program)f(to)h +(add)g(customized)75 1884 y(functionalit)o(y)j(to)f(Readline.)75 +1998 y Fl(2.2.1)30 b(The)20 b(F)-5 b(unction)20 b(T)n(yp)r(e)137 +2095 y Fu(F)l(or)f(readabilt)o(y)l(,)h(w)o(e)f(declare)h(a)f(new)g(t)o +(yp)q(e)g(of)g(ob)s(ject,)g(called)i Fm(F)l(unction)p +Fu(.)32 b(A)19 b Ft(Function)f Fu(is)h(a)g(C)75 2150 +y(function)d(whic)o(h)g(returns)f(an)g Ft(int)p Fu(.)20 +b(The)15 b(t)o(yp)q(e)g(declaration)h(for)f Ft(Function)f +Fu(is:)75 2218 y Ft(typedef)g(int)h(Function)f(\(\);)137 +2287 y Fu(The)21 b(reason)g(for)f(declaring)i(this)g(new)f(t)o(yp)q(e)g +(is)g(to)g(mak)o(e)f(it)h(easier)g(to)g(write)g(co)q(de)g(describing)75 +2342 y(p)q(oin)o(ters)16 b(to)f(C)g(functions.)21 b(Let)16 +b(us)f(sa)o(y)g(w)o(e)g(had)h(a)f(v)m(ariable)i(called)g +Fm(func)i Fu(whic)o(h)d(w)o(as)e(a)i(p)q(oin)o(ter)f(to)g(a)75 +2396 y(function.)21 b(Instead)15 b(of)g(the)g(classic)i(C)e +(declaration)137 2465 y Ft(int)g(\(*\)\(\)func;)75 2533 +y Fu(w)o(e)g(ma)o(y)f(write)137 2602 y Ft(Function)g(*func;)75 +2670 y Fu(Similarly)l(,)j(there)e(are)p eop +%%Page: 21 23 +21 22 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(21)195 183 y Ft(typedef)23 b(void)g(VFunction)g(\(\);) +195 235 y(typedef)g(char)g(*CPFunction)g(\(\);)g Fu(and)195 +287 y Ft(typedef)g(char)g(**CPPFunction)f(\(\);)75 353 +y Fu(for)17 b(functions)h(returning)g(no)f(v)m(alue,)h +Ft(pointer)d(to)g(char)p Fu(,)h(and)i Ft(pointer)c(to)h(pointer)f(to)h +(char)p Fu(,)i(re-)75 408 y(sp)q(ectiv)o(ely)l(.)75 517 +y Fl(2.2.2)30 b(W)-5 b(riting)20 b(a)h(New)f(F)-5 b(unction)137 +612 y Fu(In)17 b(order)f(to)f(write)h(new)h(functions)g(for)e +(Readline,)j(y)o(ou)e(need)h(to)e(kno)o(w)h(the)g(calling)i(con)o(v)o +(en)o(tions)75 667 y(for)g(k)o(eyb)q(oard-in)o(v)o(ok)o(ed)h +(functions,)g(and)g(the)f(names)h(of)f(the)g(v)m(ariables)i(that)d +(describ)q(e)k(the)d(curren)o(t)75 722 y(state)c(of)h(the)g(line)i +(read)e(so)g(far.)137 788 y(The)h(calling)h(sequence)f(for)f(a)f +(command)i Ft(foo)e Fu(lo)q(oks)i(lik)o(e)195 851 y Ft(foo)23 +b(\(int)h(count,)f(int)g(key\))75 917 y Fu(where)18 b +Fm(coun)o(t)h Fu(is)f(the)g(n)o(umeric)h(argumen)o(t)e(\(or)h(1)f(if)i +(defaulted\))f(and)g Fm(k)o(ey)k Fu(is)d(the)f(k)o(ey)g(that)f(in)o(v)o +(ok)o(ed)75 972 y(this)f(function.)137 1038 y(It)c(is)g(completely)h +(up)f(to)f(the)g(function)i(as)e(to)g(what)g(should)h(b)q(e)g(done)g +(with)g(the)g(n)o(umeric)g(argumen)o(t.)75 1093 y(Some)20 +b(functions)h(use)f(it)g(as)g(a)g(rep)q(eat)g(coun)o(t,)g(some)g(as)g +(a)f(\015ag,)i(and)f(others)g(to)f(c)o(ho)q(ose)h(alternate)75 +1148 y(b)q(eha)o(vior)i(\(refreshing)g(the)g(curren)o(t)f(line)j(as)d +(opp)q(osed)h(to)f(refreshing)i(the)e(screen,)j(for)d(example\).)75 +1203 y(Some)c(c)o(ho)q(ose)f(to)g(ignore)h(it.)24 b(In)18 +b(general,)f(if)g(a)f(function)h(uses)g(the)g(n)o(umeric)h(argumen)o(t) +d(as)i(a)f(rep)q(eat)75 1258 y(coun)o(t,)e(it)g(should)h(b)q(e)f(able)h +(to)e(do)h(something)h(useful)g(with)f(b)q(oth)g(negativ)o(e)g(and)g(p) +q(ositiv)o(e)h(argumen)o(ts.)75 1312 y(A)o(t)g(the)g(v)o(ery)g(least,)g +(it)g(should)h(b)q(e)g(a)o(w)o(are)e(that)h(it)g(can)g(b)q(e)h(passed)g +(a)f(negativ)o(e)g(argumen)o(t.)75 1438 y Fs(2.3)33 b(Readline)23 +b(V)-6 b(ariables)137 1533 y Fu(These)16 b(v)m(ariables)g(are)f(a)o(v)m +(ailable)i(to)e(function)h(writers.)1661 1622 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 1622 18 3 v 21 w(line)p +395 1622 V 23 w(bu\013er)195 1677 y Fu(This)c(is)f(the)h(line)h +(gathered)e(so)f(far.)19 b(Y)l(ou)c(are)f(w)o(elcome)g(to)g(mo)q(dify)g +(the)h(con)o(ten)o(ts)e(of)h(the)195 1732 y(line,)i(but)g(see)f +(Section)h(2.4.5)e([Allo)o(wing)i(Undoing],)f(page)g(25.)1661 +1821 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 1821 +V 21 w(p)r(oin)n(t)195 1876 y Fu(The)15 b(o\013set)g(of)f(the)i(curren) +o(t)f(cursor)g(p)q(osition)h(in)g Ft(rl_line_buffer)d +Fu(\(the)i Fm(p)q(oin)o(t)q Fu(\).)1661 1965 y(V)l(ariable)-1749 +b Fi(int)20 b Fh(rl)p 215 1965 V 21 w(end)195 2019 y +Fu(The)e(n)o(um)o(b)q(er)g(of)f(c)o(haracters)g(presen)o(t)h(in)g +Ft(rl_line_buffer)p Fu(.)26 b(When)18 b Ft(rl_point)e +Fu(is)j(at)195 2074 y(the)c(end)h(of)f(the)g(line,)i +Ft(rl_point)d Fu(and)h Ft(rl_end)f Fu(are)h(equal.)1661 +2163 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 2163 +V 21 w(mark)195 2218 y Fu(The)14 b(mark)e(\(sa)o(v)o(ed)h(p)q +(osition\))h(in)g(the)g(curren)o(t)f(line.)21 b(If)14 +b(set,)f(the)h(mark)e(and)i(p)q(oin)o(t)g(de\014ne)195 +2273 y(a)h Fm(region)p Fu(.)1661 2362 y(V)l(ariable)-1749 +b Fi(int)20 b Fh(rl)p 215 2362 V 21 w(done)195 2417 y +Fu(Setting)j(this)g(to)f(a)h(non-zero)g(v)m(alue)h(causes)f(Readline)i +(to)d(return)h(the)g(curren)o(t)f(line)195 2471 y(immediately)l(.)1661 +2560 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 2560 +V 21 w(p)r(ending)p 436 2560 V 20 w(input)195 2615 y +Fu(Setting)15 b(this)h(to)f(a)f(v)m(alue)j(mak)o(es)d(it)i(the)f(next)g +(k)o(eystrok)o(e)f(read.)20 b(This)c(is)f(a)g(w)o(a)o(y)f(to)h(stu\013) +195 2670 y(a)g(single)h(c)o(haracter)f(in)o(to)g(the)g(input)i(stream.) +p eop +%%Page: 22 24 +22 23 bop 75 -58 a Fu(22)1299 b(GNU)15 b(Readline)i(Library)1661 +183 y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286 +183 18 3 v 21 w(prompt)195 238 y Fu(The)14 b(prompt)f(Readline)j(uses.) +k(This)14 b(is)g(set)g(from)f(the)g(argumen)o(t)g(to)g +Ft(readline)h(\(\))p Fu(,)g(and)195 293 y(should)i(not)f(b)q(e)h +(assigned)g(to)e(directly)l(.)1661 399 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 399 V 21 w(library)p 475 +399 V 22 w(v)n(ersion)195 453 y Fu(The)c(v)o(ersion)h(n)o(um)o(b)q(er)f +(of)g(this)h(revision)g(of)f(the)g(library)l(.)1661 559 +y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286 559 +V 21 w(terminal)p 518 559 V 21 w(name)195 614 y Fu(The)c(terminal)h(t)o +(yp)q(e,)f(used)h(for)f(initialization.)1661 720 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 720 V 21 w(readline)p +505 720 V 22 w(name)195 774 y Fu(This)d(v)m(ariable)h(is)f(set)f(to)g +(a)g(unique)i(name)f(b)o(y)f(eac)o(h)g(application)j(using)e(Readline.) +23 b(The)195 829 y(v)m(alue)12 b(allo)o(ws)e(conditional)i(parsing)f +(of)f(the)g(inputrc)h(\014le)h(\(see)e(Section)h(1.3.2)e([Conditional) +195 884 y(Init)16 b(Constructs],)e(page)h(7\).)1661 990 +y(V)l(ariable)-1749 b Fi(FILE)20 b(*)f Fh(rl)p 286 990 +V 21 w(instream)195 1044 y Fu(The)c(stdio)h(stream)e(from)h(whic)o(h)h +(Readline)h(reads)e(input.)1661 1150 y(V)l(ariable)-1749 +b Fi(FILE)20 b(*)f Fh(rl)p 286 1150 V 21 w(outstream)195 +1205 y Fu(The)c(stdio)h(stream)e(to)h(whic)o(h)h(Readline)h(p)q +(erforms)e(output.)1661 1311 y(V)l(ariable)-1749 b Fi(Function)20 +b(*)g Fh(rl)p 391 1311 V 21 w(startup)p 595 1311 V 20 +w(ho)r(ok)195 1365 y Fu(If)15 b(non-zero,)f(this)h(is)g(the)f(address)h +(of)e(a)h(function)i(to)d(call)j(just)e(b)q(efore)h Ft(readline)e +Fu(prin)o(ts)195 1420 y(the)i(\014rst)g(prompt.)1661 +1526 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p +391 1526 V 21 w(ev)n(en)n(t)p 544 1526 V 22 w(ho)r(ok)195 +1581 y Fu(If)d(non-zero,)f(this)h(is)f(the)h(address)f(of)g(a)g +(function)h(to)f(call)h(p)q(erio)q(dically)j(when)c(readline)195 +1636 y(is)g(w)o(aiting)f(for)g(terminal)h(input.)1661 +1741 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p +391 1741 V 21 w(getc)p 514 1741 V 21 w(function)195 1796 +y Fu(If)13 b(non-zero,)g Ft(readline)e Fu(will)k(call)e(indirectly)i +(through)d(this)h(p)q(oin)o(ter)g(to)f(get)g(a)h(c)o(haracter)195 +1851 y(from)i(the)i(input)g(stream.)22 b(By)16 b(default,)h(it)f(is)h +(set)f(to)f Ft(rl_getc)p Fu(,)g(the)h(default)h Ft(readline)195 +1906 y Fu(c)o(haracter)d(input)j(function)f(\(see)f(Section)h(2.4.8)e +([Utilit)o(y)h(F)l(unctions],)h(page)f(27\).)1661 2011 +y(V)l(ariable)-1749 b Fi(VFunction)20 b(*)g Fh(rl)p 417 +2011 V 21 w(redispla)n(y)p 661 2011 V 22 w(function)195 +2066 y Fu(If)g(non-zero,)h Ft(readline)d Fu(will)j(call)g(indirectly)h +(through)d(this)h(p)q(oin)o(ter)h(to)e(up)q(date)h(the)195 +2121 y(displa)o(y)h(with)f(the)g(curren)o(t)g(con)o(ten)o(ts)g(of)f +(the)h(editing)i(bu\013er.)34 b(By)20 b(default,)h(it)g(is)f(set)195 +2176 y(to)f Ft(rl_redisplay)p Fu(,)f(the)i(default)g +Ft(readline)e Fu(redispla)o(y)j(function)f(\(see)f(Section)i(2.4.6)195 +2231 y([Redispla)o(y],)16 b(page)f(26\).)1661 2336 y(V)l(ariable)-1749 +b Fi(Keymap)20 b Fh(rl)p 293 2336 V 21 w(executing)p +551 2336 V 22 w(k)n(eymap)195 2391 y Fu(This)g(v)m(ariable)g(is)f(set)g +(to)f(the)h(k)o(eymap)g(\(see)g(Section)h(2.4.2)d([Keymaps],)i(page)g +(23\))f(in)195 2446 y(whic)o(h)e(the)f(curren)o(tly)h(executing)g +(readline)h(function)f(w)o(as)f(found.)1661 2552 y(V)l(ariable)-1749 +b Fi(Keymap)20 b Fh(rl)p 293 2552 V 21 w(binding)p 501 +2552 V 22 w(k)n(eymap)195 2606 y Fu(This)g(v)m(ariable)g(is)f(set)g(to) +f(the)h(k)o(eymap)g(\(see)g(Section)h(2.4.2)d([Keymaps],)i(page)g(23\)) +f(in)195 2661 y(whic)o(h)e(the)f(last)g(k)o(ey)h(binding)h(o)q +(ccurred.)p eop +%%Page: 23 25 +23 24 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(23)75 183 y Fs(2.4)33 b(Readline)23 b(Con)n(v)n +(enience)g(F)-6 b(unctions)75 331 y Fl(2.4.1)30 b(Naming)20 +b(a)g(F)-5 b(unction)137 430 y Fu(The)20 b(user)g(can)g(dynamically)i +(c)o(hange)e(the)g(bindings)i(of)d(k)o(eys)h(while)h(using)g(Readline.) +36 b(This)20 b(is)75 485 y(done)f(b)o(y)f(represen)o(ting)h(the)g +(function)g(with)g(a)f(descriptiv)o(e)i(name.)29 b(The)19 +b(user)f(is)h(able)h(to)d(t)o(yp)q(e)i(the)75 540 y(descriptiv)o(e)e +(name)e(when)h(referring)f(to)g(the)g(function.)21 b(Th)o(us,)14 +b(in)i(an)f(init)i(\014le,)f(one)f(migh)o(t)g(\014nd)195 +607 y Ft(Meta-Rubout:)46 b(backward-kill-word)137 678 +y Fu(This)20 b(binds)h(the)f(k)o(eystrok)o(e)659 676 +y Fo(h)p 671 650 209 2 v 671 678 a Fn(Meta-Rub)q(out)p +671 685 V 878 676 a Fo(i)912 678 y Fu(to)f(the)h(function)g +Fm(descriptiv)o(ely)25 b Fu(named)20 b Ft(backward-)75 +733 y(kill-word)p Fu(.)29 b(Y)l(ou,)19 b(as)f(the)h(programmer,)f +(should)i(bind)f(the)g(functions)h(y)o(ou)e(write)h(to)e(descriptiv)o +(e)75 787 y(names)e(as)g(w)o(ell.)21 b(Readline)c(pro)o(vides)f(a)f +(function)h(for)e(doing)i(that:)1650 886 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 886 18 3 v 21 w(add)p 328 886 +V 20 w(defun)i Fg(\()p Ft(char)14 b(*name,)g(Function)g(*function,)g +(int)h(key)p Fg(\))195 941 y Fu(Add)i Fm(name)h Fu(to)e(the)g(list)h +(of)e(named)i(functions.)23 b(Mak)o(e)15 b Fm(function)i +Fu(b)q(e)g(the)f(function)h(that)195 995 y(gets)e(called.)21 +b(If)16 b Fm(k)o(ey)j Fu(is)c(not)g(-1,)g(then)g(bind)i(it)e(to)g +Fm(function)h Fu(using)g Ft(rl_bind_key)d(\(\))p Fu(.)137 +1094 y(Using)j(this)f(function)h(alone)g(is)f(su\016cien)o(t)h(for)f +(most)f(applications.)21 b(It)15 b(is)h(the)f(recommended)h(w)o(a)o(y) +75 1149 y(to)d(add)h(a)f(few)g(functions)h(to)f(the)h(default)g +(functions)g(that)f(Readline)j(has)d(built)i(in.)20 b(If)14 +b(y)o(ou)f(need)h(to)f(do)75 1204 y(something)k(other)g(than)f(adding)i +(a)e(function)i(to)e(Readline,)j(y)o(ou)e(ma)o(y)f(need)i(to)e(use)h +(the)g(underlying)75 1258 y(functions)f(describ)q(ed)h(b)q(elo)o(w.)75 +1377 y Fl(2.4.2)30 b(Selecting)20 b(a)h(Keymap)137 1476 +y Fu(Key)16 b(bindings)i(tak)o(e)c(place)j(on)e(a)g Fm(k)o(eymap)p +Fu(.)21 b(The)15 b(k)o(eymap)h(is)f(the)h(asso)q(ciation)g(b)q(et)o(w)o +(een)g(the)f(k)o(eys)75 1531 y(that)f(the)g(user)g(t)o(yp)q(es)g(and)h +(the)f(functions)h(that)f(get)g(run.)19 b(Y)l(ou)c(can)f(mak)o(e)g(y)o +(our)g(o)o(wn)f(k)o(eymaps,)h(cop)o(y)75 1586 y(existing)i(k)o(eymaps,) +f(and)g(tell)h(Readline)i(whic)o(h)e(k)o(eymap)f(to)f(use.)1650 +1684 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 +1684 V 21 w(mak)n(e)p 445 1684 V 20 w(bare)p 575 1684 +V 20 w(k)n(eymap)j Fg(\(\))195 1739 y Fu(Returns)d(a)f(new,)i(empt)o(y) +e(k)o(eymap.)32 b(The)20 b(space)g(for)e(the)i(k)o(eymap)f(is)h(allo)q +(cated)h(with)195 1794 y Ft(malloc)14 b(\(\))p Fu(;)h(y)o(ou)g(should)h +Ft(free)e(\(\))h Fu(it)h(when)g(y)o(ou)e(are)h(done.)1650 +1892 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 +1892 V 21 w(cop)n(y)p 428 1892 V 21 w(k)n(eymap)j Fg(\()p +Ft(Keymap)14 b(map)p Fg(\))195 1947 y Fu(Return)i(a)f(new)g(k)o(eymap)g +(whic)o(h)h(is)g(a)f(cop)o(y)g(of)g Fm(map)p Fu(.)1650 +2046 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 +2046 V 21 w(mak)n(e)p 445 2046 V 20 w(k)n(eymap)j Fg(\(\))195 +2101 y Fu(Return)15 b(a)f(new)h(k)o(eymap)f(with)h(the)g(prin)o(ting)h +(c)o(haracters)d(b)q(ound)j(to)e(rl)p 1443 2101 14 2 +v 17 w(insert,)g(the)h(lo)o(w-)195 2155 y(ercase)21 b(Meta)f(c)o +(haracters)g(b)q(ound)i(to)f(run)g(their)g(equiv)m(alen)o(ts,)j(and)d +(the)g(Meta)f(digits)195 2210 y(b)q(ound)c(to)f(pro)q(duce)h(n)o +(umeric)g(argumen)o(ts.)1650 2309 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 2309 18 3 v 21 w(discard)p +441 2309 V 21 w(k)n(eymap)i Fg(\()p Ft(Keymap)14 b(keymap)p +Fg(\))195 2363 y Fu(F)l(ree)h(the)h(storage)d(asso)q(ciated)j(with)f +Fm(k)o(eymap)p Fu(.)137 2462 y(Readline)25 b(has)e(sev)o(eral)g(in)o +(ternal)g(k)o(eymaps.)42 b(These)23 b(functions)g(allo)o(w)g(y)o(ou)f +(to)g(c)o(hange)h(whic)o(h)75 2517 y(k)o(eymap)15 b(is)h(activ)o(e.) +1650 2615 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p +293 2615 V 21 w(get)p 391 2615 V 21 w(k)n(eymap)i Fg(\(\))195 +2670 y Fu(Returns)16 b(the)f(curren)o(tly)h(activ)o(e)f(k)o(eymap.)p +eop +%%Page: 24 26 +24 25 bop 75 -58 a Fu(24)1299 b(GNU)15 b(Readline)i(Library)1650 +183 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 183 +18 3 v 21 w(set)p 333 183 V 21 w(k)n(eymap)i Fg(\()p +Ft(Keymap)14 b(keymap)p Fg(\))195 238 y Fu(Mak)o(es)g +Fm(k)o(eymap)j Fu(the)e(curren)o(tly)h(activ)o(e)f(k)o(eymap.)1650 +336 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 +336 V 21 w(get)p 391 336 V 21 w(k)n(eymap)p 605 336 V +20 w(b)n(y)p 685 336 V 21 w(name)i Fg(\()p Ft(char)14 +b(*name)p Fg(\))195 391 y Fu(Return)h(the)f(k)o(eymap)g(matc)o(hing)h +Fm(name)p Fu(.)k Fm(name)e Fu(is)e(one)g(whic)o(h)g(w)o(ould)f(b)q(e)h +(supplied)i(in)e(a)195 446 y Ft(set)g(keymap)f Fu(inputrc)i(line)h +(\(see)e(Section)h(1.3)f([Readline)i(Init)f(File],)f(page)g(3\).)1650 +544 y(F)l(unction)-1749 b Fi(char)20 b(*)f Fh(rl)p 286 +544 V 21 w(get)p 384 544 V 21 w(k)n(eymap)p 598 544 V +20 w(name)i Fg(\()p Ft(Keymap)14 b(keymap)p Fg(\))195 +599 y Fu(Return)h(the)f(name)h(matc)o(hing)f Fm(k)o(eymap)p +Fu(.)19 b Fm(name)e Fu(is)e(one)g(whic)o(h)g(w)o(ould)f(b)q(e)h +(supplied)i(in)e(a)195 654 y Ft(set)g(keymap)f Fu(inputrc)i(line)h +(\(see)e(Section)h(1.3)f([Readline)i(Init)f(File],)f(page)g(3\).)75 +772 y Fl(2.4.3)30 b(Binding)20 b(Keys)137 871 y Fu(Y)l(ou)j(asso)q +(ciate)f(k)o(eys)g(with)h(functions)g(through)f(the)g(k)o(eymap.)41 +b(Readline)25 b(has)d(sev)o(eral)h(in)o(ter-)75 926 y(nal)h(k)o +(eymaps:)35 b Ft(emacs_standard_keymap)p Fu(,)22 b Ft +(emacs_meta_keymap)p Fu(,)g Ft(emacs_ctlx_keymap)p Fu(,)g +Ft(vi_)75 981 y(movement_keymap)p Fu(,)e(and)i Ft(vi_insertion_keymap)p +Fu(.)35 b Ft(emacs_standard_keymap)18 b Fu(is)k(the)f(default,)75 +1036 y(and)15 b(the)h(examples)g(in)g(this)f(man)o(ual)h(assume)f +(that.)137 1106 y(These)h(functions)g(manage)e(k)o(ey)i(bindings.)1650 +1204 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1204 +V 21 w(bind)p 347 1204 V 21 w(k)n(ey)k Fg(\()p Ft(int)14 +b(key,)h(Function)f(*function)p Fg(\))195 1259 y Fu(Binds)i +Fm(k)o(ey)j Fu(to)14 b Fm(function)h Fu(in)h(the)f(curren)o(tly)g +(activ)o(e)g(k)o(eymap.)20 b(Returns)15 b(non-zero)g(in)h(the)195 +1314 y(case)f(of)g(an)g(in)o(v)m(alid)j Fm(k)o(ey)p Fu(.)1650 +1412 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1412 +V 21 w(bind)p 347 1412 V 21 w(k)n(ey)p 452 1412 V 21 +w(in)p 520 1412 V 22 w(map)h Fg(\()p Ft(int)14 b(key,)h(Function)f +(*function,)283 1467 y(Keymap)g(map)p Fg(\))195 1521 +y Fu(Bind)i Fm(k)o(ey)j Fu(to)c Fm(function)h Fu(in)g +Fm(map)p Fu(.)k(Returns)15 b(non-zero)h(in)g(the)f(case)g(of)g(an)g(in) +o(v)m(alid)j Fm(k)o(ey)p Fu(.)1650 1620 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1620 V 21 w(un)n(bind)p 409 +1620 V 21 w(k)n(ey)k Fg(\()p Ft(int)14 b(key)p Fg(\))195 +1674 y Fu(Bind)g Fm(k)o(ey)j Fu(to)c(the)g(n)o(ull)i(function)f(in)g +(the)f(curren)o(tly)h(activ)o(e)f(k)o(eymap.)19 b(Returns)14 +b(non-zero)195 1729 y(in)i(case)f(of)g(error.)1650 1827 +y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1827 V +21 w(un)n(bind)p 409 1827 V 21 w(k)n(ey)p 514 1827 V +21 w(in)p 582 1827 V 22 w(map)h Fg(\()p Ft(int)14 b(key,)h(Keymap)f +(map)p Fg(\))195 1882 y Fu(Bind)i Fm(k)o(ey)j Fu(to)c(the)g(n)o(ull)i +(function)f(in)g Fm(map)p Fu(.)k(Returns)15 b(non-zero)h(in)g(case)f +(of)g(error.)1650 1980 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 1980 V 21 w(un)n(bind)p 409 1980 V 21 w(function)p +635 1980 V 21 w(in)p 703 1980 V 21 w(map)h Fg(\()p Ft(Function)14 +b(*function,)283 2035 y(Keymap)g(map)p Fg(\))195 2090 +y Fu(Un)o(bind)j(all)f(k)o(eys)f(that)f(execute)i Fm(function)g +Fu(in)g Fm(map)p Fu(.)1650 2188 y(F)l(unction)-1749 b +Fi(int)20 b Fh(rl)p 215 2188 V 21 w(un)n(bind)p 409 2188 +V 21 w(command)p 674 2188 V 17 w(in)p 738 2188 V 22 w(map)h +Fg(\()p Ft(char)14 b(*command,)g(Keymap)283 2243 y(map)p +Fg(\))195 2298 y Fu(Un)o(bind)j(all)f(k)o(eys)f(that)f(are)h(b)q(ound)h +(to)f Fm(command)i Fu(in)f Fm(map)p Fu(.)1650 2396 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 2396 V 21 w(generic)p 413 2396 +V 21 w(bind)j Fg(\()p Ft(int)15 b(type,)f(char)h(*keyseq,)f(char)h +(*data,)283 2451 y(Keymap)f(map)p Fg(\))195 2506 y Fu(Bind)g(the)f(k)o +(ey)g(sequence)i(represen)o(ted)e(b)o(y)g(the)g(string)g +Fm(k)o(eyseq)h Fu(to)f(the)g(arbitrary)f(p)q(oin)o(ter)195 +2560 y Fm(data)p Fu(.)19 b Fm(t)o(yp)q(e)e Fu(sa)o(ys)c(what)h(kind)i +(of)e(data)f(is)i(p)q(oin)o(ted)g(to)f(b)o(y)g Fm(data)p +Fu(;)g(this)h(can)f(b)q(e)h(a)f(function)195 2615 y(\()p +Ft(ISFUNC)p Fu(\),)f(a)h(macro)g(\()p Ft(ISMACR)p Fu(\),)f(or)i(a)f(k)o +(eymap)h(\()p Ft(ISKMAP)p Fu(\).)j(This)d(mak)o(es)f(new)h(k)o(eymaps) +195 2670 y(as)g(necessary)l(.)20 b(The)c(initial)h(k)o(eymap)e(in)h +(whic)o(h)g(to)e(do)i(bindings)h(is)e Fm(map)p Fu(.)p +eop +%%Page: 25 27 +25 26 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(25)1650 183 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 183 18 3 v 21 w(parse)p 369 183 V 19 w(and)p +480 183 V 21 w(bind)j Fg(\()p Ft(char)14 b(*line)p Fg(\))195 +238 y Fu(P)o(arse)k Fm(line)23 b Fu(as)c(if)g(it)g(had)g(b)q(een)h +(read)e(from)h(the)f Ft(inputrc)g Fu(\014le)i(and)f(p)q(erform)g(an)o +(y)f(k)o(ey)195 293 y(bindings)i(and)e(v)m(ariable)i(assignmen)o(ts)d +(found)i(\(see)f(Section)h(1.3)e([Readline)j(Init)f(File],)195 +348 y(page)c(3\).)1650 449 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 449 V 21 w(read)p 346 449 V 20 w(init)p +450 449 V 22 w(\014le)k Fg(\()p Ft(char)14 b(*filename)p +Fg(\))195 504 y Fu(Read)25 b(k)o(eybindings)i(and)e(v)m(ariable)h +(assignmen)o(ts)e(from)g Fm(\014lename)29 b Fu(\(see)24 +b(Section)i(1.3)195 559 y([Readline)17 b(Init)f(File],)g(page)f(3\).)75 +680 y Fl(2.4.4)30 b(Asso)r(ciating)20 b(F)-5 b(unction)20 +b(Names)h(and)f(Bindings)137 781 y Fu(These)11 b(functions)h(allo)o(w)e +(y)o(ou)h(to)f(\014nd)h(out)f(what)g(k)o(eys)h(in)o(v)o(ok)o(e)f(named) +h(functions)h(and)e(the)h(functions)75 836 y(in)o(v)o(ok)o(ed)k(b)o(y)h +(a)e(particular)i(k)o(ey)f(sequence.)1650 937 y(F)l(unction)-1749 +b Fi(Function)20 b(*)g Fh(rl)p 391 937 V 21 w(named)p +579 937 V 19 w(function)j Fg(\()p Ft(char)14 b(*name)p +Fg(\))195 992 y Fu(Return)i(the)f(function)h(with)g(name)f +Fm(name)p Fu(.)1650 1093 y(F)l(unction)-1749 b Fi(Function)20 +b(*)g Fh(rl)p 391 1093 V 21 w(function)p 617 1093 V 21 +w(of)p 685 1093 V 19 w(k)n(eyseq)k Fg(\()p Ft(char)15 +b(*keyseq,)f(Keymap)283 1148 y(map,)g(int)h(*type)p Fg(\))195 +1203 y Fu(Return)j(the)f(function)g(in)o(v)o(ok)o(ed)g(b)o(y)g +Fm(k)o(eyseq)h Fu(in)g(k)o(eymap)f Fm(map)p Fu(.)25 b(If)17 +b Fm(map)h Fu(is)f(NULL,)h(the)195 1258 y(curren)o(t)13 +b(k)o(eymap)g(is)h(used.)20 b(If)14 b Fm(t)o(yp)q(e)i +Fu(is)e(not)f(NULL,)h(the)f(t)o(yp)q(e)g(of)g(the)h(ob)s(ject)f(is)h +(returned)195 1313 y(in)i(it)f(\(one)g(of)g Ft(ISFUNC)p +Fu(,)f Ft(ISKMAP)p Fu(,)g(or)h Ft(ISMACR)p Fu(\).)1650 +1414 y(F)l(unction)-1749 b Fi(char)20 b(**)f Fh(rl)p +312 1414 V 21 w(in)n(v)n(oking)p 541 1414 V 23 w(k)n(eyseqs)k +Fg(\()p Ft(Function)14 b(*function)p Fg(\))195 1469 y +Fu(Return)i(an)f(arra)o(y)f(of)h(strings)g(represen)o(ting)h(the)g(k)o +(ey)f(sequences)h(used)g(to)f(in)o(v)o(ok)o(e)g Fm(func-)195 +1524 y(tion)g Fu(in)h(the)g(curren)o(t)f(k)o(eymap.)1650 +1625 y(F)l(unction)-1749 b Fi(char)20 b(**)f Fh(rl)p +312 1625 V 21 w(in)n(v)n(oking)p 541 1625 V 23 w(k)n(eyseqs)p +750 1625 V 21 w(in)p 818 1625 V 22 w(map)i Fg(\()p Ft(Function)14 +b(*function,)283 1680 y(Keymap)g(map)p Fg(\))195 1735 +y Fu(Return)i(an)f(arra)o(y)f(of)h(strings)g(represen)o(ting)h(the)g(k) +o(ey)f(sequences)h(used)g(to)f(in)o(v)o(ok)o(e)g Fm(func-)195 +1789 y(tion)g Fu(in)h(the)g(k)o(eymap)f Fm(map)p Fu(.)1650 +1891 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1891 +V 21 w(function)p 467 1891 V 21 w(dump)r(er)g Fg(\()p +Ft(int)15 b(readable)p Fg(\))195 1946 y Fu(Prin)o(t)k(the)h(readline)g +(function)g(names)g(and)f(the)g(k)o(ey)g(sequences)i(curren)o(tly)e(b)q +(ound)i(to)195 2000 y(them)16 b(to)f Ft(rl_outstream)p +Fu(.)k(If)d Fm(readable)j Fu(is)d(non-zero,)g(the)g(list)g(is)g +(formatted)f(in)h(suc)o(h)g(a)195 2055 y(w)o(a)o(y)e(that)h(it)g(can)g +(b)q(e)h(made)g(part)e(of)h(an)g Ft(inputrc)f Fu(\014le)i(and)g +(re-read.)1650 2157 y(F)l(unction)-1749 b Fi(void)20 +b Fh(rl)p 241 2157 V 21 w(list)p 337 2157 V 22 w(funmap)p +550 2157 V 18 w(names)h Fg(\(\))195 2211 y Fu(Prin)o(t)15 +b(the)g(names)h(of)e(all)j(bindable)g(Readline)g(functions)f(to)f +Ft(rl_outstream)p Fu(.)75 2333 y Fl(2.4.5)30 b(Allo)n(wing)21 +b(Undoing)137 2434 y Fu(Supp)q(orting)14 b(the)g(undo)f(command)g(is)h +(a)f(painless)h(thing,)g(and)f(mak)o(es)g(y)o(our)f(functions)i(m)o(uc) +o(h)f(more)75 2489 y(useful.)28 b(It)17 b(is)h(certainly)h(easy)e(to)g +(try)g(something)g(if)h(y)o(ou)f(kno)o(w)g(y)o(ou)h(can)f(undo)h(it.)27 +b(I)18 b(could)g(use)g(an)75 2543 y(undo)e(function)g(for)e(the)i(sto)q +(c)o(k)e(mark)o(et.)137 2615 y(If)g(y)o(our)e(function)i(simply)h +(inserts)f(text)e(once,)i(or)e(deletes)j(text)d(once,)i(and)f(uses)h +Ft(rl_insert_text)75 2670 y(\(\))h Fu(or)g Ft(rl_delete_text)e(\(\))i +Fu(to)f(do)h(it,)g(then)h(undoing)g(is)g(already)f(done)h(for)f(y)o(ou) +f(automatically)l(.)p eop +%%Page: 26 28 +26 27 bop 75 -58 a Fu(26)1299 b(GNU)15 b(Readline)i(Library)137 +183 y(If)11 b(y)o(ou)f(do)g(m)o(ultiple)i(insertions)f(or)f(m)o +(ultiple)i(deletions,)g(or)e(an)o(y)g(com)o(bination)h(of)f(these)g(op) +q(erations,)75 238 y(y)o(ou)19 b(should)h(group)e(them)h(together)g(in) +o(to)g(one)g(op)q(eration.)31 b(This)20 b(is)f(done)h(with)f +Ft(rl_begin_undo_)75 293 y(group)14 b(\(\))h Fu(and)h +Ft(rl_end_undo_group)d(\(\))p Fu(.)137 360 y(The)j(t)o(yp)q(es)f(of)g +(ev)o(en)o(ts)g(that)f(can)h(b)q(e)h(undone)g(are:)195 +425 y Ft(enum)23 b(undo_code)g({)h(UNDO_DELETE,)e(UNDO_INSERT,)g +(UNDO_BEGIN,)g(UNDO_END)h(};)137 492 y Fu(Notice)16 b(that)e +Ft(UNDO_DELETE)g Fu(means)h(to)g(insert)g(some)g(text,)f(and)i +Ft(UNDO_INSERT)d Fu(means)i(to)g(delete)75 547 y(some)d(text.)18 +b(That)12 b(is,)h(the)f(undo)g(co)q(de)h(tells)g(undo)g(what)e(to)h +(undo,)h(not)f(ho)o(w)f(to)h(undo)g(it.)19 b Ft(UNDO_BEGIN)75 +602 y Fu(and)c Ft(UNDO_END)f Fu(are)h(tags)g(added)g(b)o(y)h +Ft(rl_begin_undo_group)c(\(\))j Fu(and)g Ft(rl_end_undo_group)e(\(\))p +Fu(.)1650 694 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p +215 694 18 3 v 21 w(b)r(egin)p 372 694 V 20 w(undo)p +517 694 V 20 w(group)h Fg(\(\))195 749 y Fu(Begins)e(sa)o(ving)g(undo)g +(information)f(in)i(a)e(group)g(construct.)29 b(The)19 +b(undo)g(information)195 804 y(usually)f(comes)f(from)f(calls)h(to)g +Ft(rl_insert_text)c(\(\))j Fu(and)h Ft(rl_delete_text)c(\(\))p +Fu(,)k(but)195 858 y(could)f(b)q(e)g(the)f(result)h(of)f(calls)h(to)f +Ft(rl_add_undo)e(\(\))p Fu(.)1650 951 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 951 V 21 w(end)p 326 951 V +20 w(undo)p 471 951 V 20 w(group)h Fg(\(\))195 1005 y +Fu(Closes)c(the)g(curren)o(t)g(undo)h(group)e(started)h(with)g +Ft(rl_begin_undo_group)c(\(\))p Fu(.)25 b(There)195 1060 +y(should)17 b(b)q(e)f(one)f(call)i(to)e Ft(rl_end_undo_group)e(\(\))i +Fu(for)g(eac)o(h)g(call)i(to)e Ft(rl_begin_undo_)195 +1115 y(group)f(\(\))p Fu(.)1650 1207 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 1207 V 21 w(add)p 354 1207 +V 20 w(undo)i Fg(\()p Ft(enum)14 b(undo_code)g(what,)g(int)h(start,)g +(int)f(end,)283 1262 y(char)g(*text)p Fg(\))195 1317 +y Fu(Remem)o(b)q(er)j(ho)o(w)f(to)f(undo)i(an)f(ev)o(en)o(t)g +(\(according)h(to)e Fm(what)q Fu(\).)23 b(The)16 b(a\013ected)g(text)g +(runs)195 1372 y(from)e Fm(start)h Fu(to)g Fm(end)p Fu(,)g(and)h +(encompasses)f Fm(text)p Fu(.)1650 1464 y(F)l(unction)-1749 +b Fi(void)20 b Fh(free)p 296 1464 V 20 w(undo)p 441 1464 +V 20 w(list)k Fg(\(\))195 1519 y Fu(F)l(ree)15 b(the)h(existing)g(undo) +f(list.)1650 1611 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p +215 1611 V 21 w(do)p 297 1611 V 20 w(undo)i Fg(\(\))195 +1666 y Fu(Undo)16 b(the)g(\014rst)f(thing)h(on)g(the)f(undo)h(list.)22 +b(Returns)17 b Ft(0)e Fu(if)h(there)g(w)o(as)f(nothing)h(to)f(undo,)195 +1721 y(non-zero)g(if)h(something)g(w)o(as)e(undone.)137 +1813 y(Finally)l(,)j(if)f(y)o(ou)f(neither)i(insert)f(nor)f(delete)i +(text,)e(but)g(directly)i(mo)q(dify)f(the)g(existing)g(text)g(\(e.g.,) +75 1868 y(c)o(hange)i(its)h(case\),)g(call)g Ft(rl_modifying)14 +b(\(\))k Fu(once,)h(just)f(b)q(efore)h(y)o(ou)f(mo)q(dify)h(the)f +(text.)29 b(Y)l(ou)19 b(m)o(ust)75 1923 y(supply)d(the)g(indices)h(of)e +(the)g(text)g(range)g(that)f(y)o(ou)h(are)g(going)g(to)g(mo)q(dify)l(.) +1650 2015 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +2015 V 21 w(mo)r(difying)h Fg(\()p Ft(int)15 b(start,)f(int)h(end)p +Fg(\))195 2070 y Fu(T)l(ell)i(Readline)i(to)c(sa)o(v)o(e)g(the)i(text)e +(b)q(et)o(w)o(een)h Fm(start)g Fu(and)g Fm(end)j Fu(as)c(a)h(single)h +(undo)g(unit.)23 b(It)195 2125 y(is)16 b(assumed)f(that)g(y)o(ou)f +(will)j(subsequen)o(tly)g(mo)q(dify)e(that)g(text.)75 +2237 y Fl(2.4.6)30 b(Redispla)n(y)1650 2358 y Fu(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 2358 V 21 w(redispla)n(y)k +Fg(\(\))195 2413 y Fu(Change)19 b(what's)f(displa)o(y)o(ed)i(on)f(the)f +(screen)i(to)e(re\015ect)h(the)g(curren)o(t)g(con)o(ten)o(ts)f(of)g +Ft(rl_)195 2468 y(line_buffer)p Fu(.)1650 2560 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 2560 V 21 w(forced)p 390 2560 +V 20 w(up)r(date)p 584 2560 V 20 w(displa)n(y)k Fg(\(\))195 +2615 y Fu(F)l(orce)17 b(the)f(line)j(to)d(b)q(e)i(up)q(dated)f(and)g +(redispla)o(y)o(ed,)h(whether)f(or)g(not)f(Readline)j(thinks)195 +2670 y(the)c(screen)h(displa)o(y)g(is)g(correct.)p eop +%%Page: 27 29 +27 28 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(27)1650 183 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 183 18 3 v 21 w(on)p 297 183 V 20 w(new)p +416 183 V 21 w(line)k Fg(\(\))195 238 y Fu(T)l(ell)17 +b(the)f(up)q(date)g(routines)g(that)f(w)o(e)g(ha)o(v)o(e)g(mo)o(v)o(ed) +g(on)o(to)g(a)g(new)h(\(empt)o(y\))f(line,)i(usually)195 +293 y(after)d(ouputting)i(a)f(newline.)1650 380 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 380 V 21 w(reset)p 357 380 +V 20 w(line)p 465 380 V 23 w(state)j Fg(\(\))195 434 +y Fu(Reset)17 b(the)f(displa)o(y)h(state)f(to)f(a)h(clean)h(state)f +(and)g(redispla)o(y)h(the)g(curren)o(t)f(line)i(starting)195 +489 y(on)d(a)g(new)g(line.)1650 576 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 576 V 21 w(message)g Fg(\()p +Ft(va_alist)p Fg(\))195 631 y Fu(The)h(argumen)o(ts)f(are)g(a)g(string) +h(as)f(w)o(ould)h(b)q(e)g(supplied)i(to)d Ft(printf)p +Fu(.)35 b(The)21 b(resulting)195 686 y(string)h(is)g(displa)o(y)o(ed)h +(in)g(the)f Fm(ec)o(ho)g(area)p Fu(.)39 b(The)23 b(ec)o(ho)f(area)f(is) +h(also)g(used)h(to)e(displa)o(y)195 740 y(n)o(umeric)16 +b(argumen)o(ts)e(and)i(searc)o(h)f(strings.)1650 827 +y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 827 V 21 +w(clear)p 354 827 V 21 w(message)h Fg(\(\))195 882 y +Fu(Clear)15 b(the)h(message)e(in)i(the)g(ec)o(ho)f(area.)75 +989 y Fl(2.4.7)30 b(Mo)r(difying)20 b(T)-5 b(ext)1650 +1105 y Fu(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +1105 V 21 w(insert)p 378 1105 V 21 w(text)k Fg(\()p Ft(char)14 +b(*text)p Fg(\))195 1159 y Fu(Insert)h Fm(text)h Fu(in)o(to)f(the)h +(line)g(at)f(the)g(curren)o(t)g(cursor)g(p)q(osition.)1650 +1246 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1246 +V 21 w(delete)p 383 1246 V 22 w(text)k Fg(\()p Ft(int)14 +b(start,)h(int)f(end)p Fg(\))195 1301 y Fu(Delete)i(the)f(text)g(b)q +(et)o(w)o(een)g Fm(start)g Fu(and)h Fm(end)h Fu(in)f(the)g(curren)o(t)f +(line.)1650 1388 y(F)l(unction)-1749 b Fi(char)20 b(*)f +Fh(rl)p 286 1388 V 21 w(cop)n(y)p 421 1388 V 21 w(text)24 +b Fg(\()p Ft(int)14 b(start,)h(int)g(end)p Fg(\))195 +1443 y Fu(Return)h(a)f(cop)o(y)g(of)g(the)g(text)f(b)q(et)o(w)o(een)i +Fm(start)f Fu(and)g Fm(end)j Fu(in)e(the)f(curren)o(t)g(line.)1650 +1529 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1529 +V 21 w(kill)p 311 1529 V 23 w(text)k Fg(\()p Ft(int)14 +b(start,)h(int)g(end)p Fg(\))195 1584 y Fu(Cop)o(y)j(the)h(text)f(b)q +(et)o(w)o(een)h Fm(start)f Fu(and)h Fm(end)i Fu(in)e(the)g(curren)o(t)f +(line)i(to)e(the)h(kill)h(ring,)g(ap-)195 1639 y(p)q(ending)15 +b(or)f(prep)q(ending)h(to)e(the)h(last)f(kill)j(if)e(the)g(last)f +(command)h(w)o(as)f(a)g(kill)i(command.)195 1694 y(The)j(text)f(is)h +(deleted.)28 b(If)18 b Fm(start)f Fu(is)h(less)g(than)f +Fm(end)p Fu(,)i(the)e(text)g(is)h(app)q(ended,)i(otherwise)195 +1749 y(prep)q(ended.)i(If)15 b(the)g(last)h(command)f(w)o(as)f(not)h(a) +g(kill,)h(a)f(new)h(kill)h(ring)e(slot)g(is)h(used.)75 +1855 y Fl(2.4.8)30 b(Utilit)n(y)21 b(F)-5 b(unctions)1650 +1971 y Fu(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +1971 V 21 w(read)p 346 1971 V 20 w(k)n(ey)k Fg(\(\))195 +2026 y Fu(Return)14 b(the)g(next)g(c)o(haracter)e(a)o(v)m(ailable.)22 +b(This)14 b(handles)h(input)f(inserted)h(in)o(to)e(the)h(input)195 +2081 y(stream)k(via)g Fm(p)q(ending)j(input)f Fu(\(see)f(Section)g(2.3) +f([Readline)i(V)l(ariables],)g(page)e(21\))g(and)195 +2136 y Ft(rl_stuff_char)13 b(\(\))p Fu(,)i(macros,)f(and)h(c)o +(haracters)g(read)g(from)f(the)i(k)o(eyb)q(oard.)1650 +2222 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2222 +V 21 w(getc)j Fg(\()p Ft(FILE)14 b(*)p Fg(\))195 2277 +y Fu(Return)i(the)f(next)g(c)o(haracter)g(a)o(v)m(ailable)i(from)d(the) +h(k)o(eyb)q(oard.)1650 2364 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 2364 V 21 w(stu\013)p 346 2364 V 20 w(c)n(har)j +Fg(\()p Ft(int)15 b(c)p Fg(\))195 2419 y Fu(Insert)22 +b Fm(c)i Fu(in)o(to)e(the)g(Readline)i(input)f(stream.)38 +b(It)22 b(will)h(b)q(e)f Ft(")p Fu(read)p Ft(")g Fu(b)q(efore)g +(Readline)195 2474 y(attempts)14 b(to)h(read)g(c)o(haracters)f(from)h +(the)g(terminal)h(with)f Ft(rl_read_key)f(\(\))p Fu(.)1650 +2560 y(F)l(unction)-1749 b Fi(rl_extend_line_buffer)22 +b Fh(\(in)n(t)j Ft(len)p Fg(\))195 2615 y Fu(Ensure)14 +b(that)e Ft(rl_line_buffer)g Fu(has)h(enough)h(space)f(to)g(hold)h +Fm(len)h Fu(c)o(haracters,)d(p)q(ossibly)195 2670 y(reallo)q(cating)k +(it)g(if)f(necessary)l(.)p eop +%%Page: 28 30 +28 29 bop 75 -58 a Fu(28)1299 b(GNU)15 b(Readline)i(Library)1650 +183 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 183 +18 3 v 21 w(initiali)q(z)q(e)26 b Fg(\(\))195 238 y Fu(Initialize)18 +b(or)d(re-initialize)j(Readline's)f(in)o(ternal)f(state.)1650 +328 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 328 +V 21 w(reset)p 357 328 V 20 w(terminal)j Fg(\()p Ft(char)15 +b(*terminal_name)p Fg(\))195 383 y Fu(Reinitializ)q(e)h(Readline's)g +(idea)e(of)f(the)h(terminal)g(settings)g(using)g Fm(terminal)p +1501 383 14 2 v 17 w(name)j Fu(as)c(the)195 437 y(terminal)j(t)o(yp)q +(e)f(\(e.g.,)f Ft(vt100)p Fu(\).)1650 527 y(F)l(unction)-1749 +b Fi(int)20 b Fh(alphab)r(etic)k Fg(\()p Ft(int)14 b(c)p +Fg(\))195 582 y Fu(Return)i(1)f(if)g Fm(c)j Fu(is)e(an)f(alphab)q(etic) +i(c)o(haracter.)1650 671 y(F)l(unction)-1749 b Fi(int)20 +b Fh(n)n(umeric)i Fg(\()p Ft(int)15 b(c)p Fg(\))195 726 +y Fu(Return)h(1)f(if)g Fm(c)j Fu(is)e(a)f(n)o(umeric)h(c)o(haracter.) +1650 816 y(F)l(unction)-1749 b Fi(int)20 b Fh(ding)i +Fg(\(\))195 871 y Fu(Ring)16 b(the)f(terminal)h(b)q(ell,)h(ob)q(eying)f +(the)g(setting)f(of)g Ft(bell-style)p Fu(.)137 960 y(The)h(follo)o +(wing)g(are)f(implemen)o(ted)h(as)f(macros,)f(de\014ned)j(in)f +Ft(chartypes.h)p Fu(.)1650 1050 y(F)l(unction)-1749 b +Fi(int)20 b Fh(upp)r(ercase)p 426 1050 18 3 v 19 w(p)j +Fg(\()p Ft(int)14 b(c)p Fg(\))195 1105 y Fu(Return)i(1)f(if)g +Fm(c)j Fu(is)e(an)f(upp)q(ercase)i(alphab)q(etic)f(c)o(haracter.)1650 +1195 y(F)l(unction)-1749 b Fi(int)20 b Fh(lo)n(w)n(ercase)p +409 1195 V 22 w(p)i Fg(\()p Ft(int)15 b(c)p Fg(\))195 +1249 y Fu(Return)h(1)f(if)g Fm(c)j Fu(is)e(a)f(lo)o(w)o(ercase)g +(alphab)q(etic)i(c)o(haracter.)1650 1339 y(F)l(unction)-1749 +b Fi(int)20 b Fh(digit)p 289 1339 V 22 w(p)i Fg(\()p +Ft(int)15 b(c)p Fg(\))195 1394 y Fu(Return)h(1)f(if)g +Fm(c)j Fu(is)e(a)f(n)o(umeric)h(c)o(haracter.)1650 1484 +y(F)l(unction)-1749 b Fi(int)20 b Fh(to)p 227 1484 V +20 w(upp)r(er)i Fg(\()p Ft(int)14 b(c)p Fg(\))195 1538 +y Fu(If)21 b Fm(c)i Fu(is)e(a)g(lo)o(w)o(ercase)f(alphab)q(etic)i(c)o +(haracter,)f(return)g(the)f(corresp)q(onding)i(upp)q(ercase)195 +1593 y(c)o(haracter.)1650 1683 y(F)l(unction)-1749 b +Fi(int)20 b Fh(to)p 227 1683 V 20 w(lo)n(w)n(er)k Fg(\()p +Ft(int)15 b(c)p Fg(\))195 1738 y Fu(If)j Fm(c)j Fu(is)e(an)f(upp)q +(ercase)h(alphab)q(etic)h(c)o(haracter,)e(return)g(the)g(corresp)q +(onding)h(lo)o(w)o(ercase)195 1792 y(c)o(haracter.)1650 +1882 y(F)l(unction)-1749 b Fi(int)20 b Fh(digit)p 289 +1882 V 22 w(v)m(alue)j Fg(\()p Ft(int)15 b(c)p Fg(\))195 +1937 y Fu(If)g Fm(c)k Fu(is)c(a)g(n)o(um)o(b)q(er,)g(return)g(the)h(v)m +(alue)g(it)g(represen)o(ts.)75 2046 y Fl(2.4.9)30 b(Alternate)20 +b(In)n(terface)137 2142 y Fu(An)j(alternate)f(in)o(terface)h(is)g(a)o +(v)m(ailable)h(to)d(plain)j Ft(readline\(\))p Fu(.)40 +b(Some)22 b(applications)i(need)g(to)75 2197 y(in)o(terlea)o(v)o(e)15 +b(k)o(eyb)q(oard)f(I/O)h(with)g(\014le,)h(device,)f(or)f(windo)o(w)h +(system)f(I/O,)h(t)o(ypically)h(b)o(y)e(using)h(a)g(main)75 +2252 y(lo)q(op)f(to)g Ft(select\(\))e Fu(on)i(v)m(arious)g(\014le)h +(descriptors.)20 b(T)l(o)14 b(accomo)q(date)f(this)h(need,)h(readline)g +(can)f(also)g(b)q(e)75 2306 y(in)o(v)o(ok)o(ed)i(as)f(a)g(`callbac)o +(k')h(function)h(from)d(an)i(ev)o(en)o(t)f(lo)q(op.)22 +b(There)16 b(are)f(functions)h(a)o(v)m(ailable)i(to)c(mak)o(e)75 +2361 y(this)i(easy)l(.)1650 2451 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 2451 V 21 w(callbac)n(k)p +458 2451 V 23 w(handler)p 670 2451 V 21 w(install)25 +b Fg(\()p Ft(char)14 b(*prompt,)g(Vfunction)283 2506 +y(*lhandler)p Fg(\))195 2560 y Fu(Set)i(up)h(the)g(terminal)g(for)f +(readline)i(I/O)e(and)h(displa)o(y)g(the)g(initial)h(expanded)g(v)m +(alue)f(of)195 2615 y Fm(prompt)p Fu(.)24 b(Sa)o(v)o(e)17 +b(the)g(v)m(alue)h(of)e Fm(lhandler)22 b Fu(to)17 b(use)g(as)f(a)h +(callbac)o(k)h(when)f(a)g(complete)g(line)195 2670 y(of)e(input)h(has)f +(b)q(een)h(en)o(tered.)p eop +%%Page: 29 31 +29 30 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(29)1650 183 y(F)l(unction)-1749 b Fi(void)20 +b Fh(rl)p 241 183 18 3 v 21 w(callbac)n(k)p 458 183 V +23 w(read)p 591 183 V 20 w(c)n(har)j Fg(\(\))195 238 +y Fu(Whenev)o(er)14 b(an)f(application)i(determines)f(that)f(k)o(eyb)q +(oard)g(input)h(is)g(a)o(v)m(ailable,)h(it)f(should)195 +293 y(call)20 b Ft(rl_callback_read_char\(\))p Fu(,)c(whic)o(h)k(will)g +(read)f(the)g(next)g(c)o(haracter)f(from)g(the)195 348 +y(curren)o(t)25 b(input)h(source.)48 b(If)25 b(that)g(c)o(haracter)f +(completes)h(the)g(line,)k Ft(rl_callback_)195 402 y(read_char)14 +b Fu(will)k(in)o(v)o(ok)o(e)e(the)f Fm(lhandler)21 b +Fu(function)c(sa)o(v)o(ed)e(b)o(y)h Ft(rl_callback_handler_)195 +457 y(install)g Fu(to)h(pro)q(cess)g(the)g(line.)27 b +Ft(EOF)17 b Fu(is)h(indicated)g(b)o(y)f(calling)i Fm(lhandler)j +Fu(with)c(a)f Ft(NULL)195 512 y Fu(line.)1650 609 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 609 V 21 w(callbac)n(k)p 458 +609 V 23 w(handler)p 670 609 V 21 w(remo)n(v)n(e)i Fg(\(\))195 +664 y Fu(Restore)15 b(the)g(terminal)g(to)g(its)g(initial)i(state)d +(and)h(remo)o(v)o(e)f(the)h(line)h(handler.)21 b(This)16 +b(ma)o(y)195 719 y(b)q(e)g(called)h(from)d(within)j(a)d(callbac)o(k)j +(as)d(w)o(ell)j(as)d(indep)q(enden)o(tly)m(.)75 835 y +Fl(2.4.10)29 b(An)21 b(Example)137 934 y Fu(Here)f(is)g(a)f(function)i +(whic)o(h)f(c)o(hanges)f(lo)o(w)o(ercase)h(c)o(haracters)e(to)h(their)h +(upp)q(ercase)h(equiv)m(alen)o(ts,)75 989 y(and)e(upp)q(ercase)i(c)o +(haracters)d(to)h(lo)o(w)o(ercase.)31 b(If)20 b(this)f(function)h(w)o +(as)f(b)q(ound)h(to)f(`)p Ft(M-c)p Fu(',)f(then)i(t)o(yping)75 +1044 y(`)p Ft(M-c)p Fu(')12 b(w)o(ould)h(c)o(hange)h(the)f(case)g(of)g +(the)g(c)o(haracter)g(under)g(p)q(oin)o(t.)20 b(T)o(yping)14 +b(`)p Ft(M-1)g(0)h(M-c)p Fu(')d(w)o(ould)i(c)o(hange)75 +1098 y(the)h(case)g(of)g(the)h(follo)o(wing)f(10)g(c)o(haracters,)f +(lea)o(ving)i(the)f(cursor)g(on)g(the)h(last)f(c)o(haracter)f(c)o +(hanged.)195 1165 y Ft(/*)24 b(Invert)f(the)g(case)g(of)h(the)f(COUNT)h +(following)e(characters.)h(*/)195 1217 y(int)195 1269 +y(invert_case_line)f(\(count,)h(key\))314 1321 y(int)h(count,)f(key;) +195 1373 y({)243 1425 y(register)f(int)i(start,)f(end,)g(i;)243 +1528 y(start)g(=)h(rl_point;)243 1632 y(if)f(\(rl_point)g(>=)h +(rl_end\))290 1684 y(return)f(\(0\);)243 1788 y(if)g(\(count)g(<)h(0\)) +290 1840 y({)338 1892 y(direction)f(=)h(-1;)338 1944 +y(count)f(=)h(-count;)290 1995 y(})243 2047 y(else)290 +2099 y(direction)f(=)h(1;)243 2203 y(/*)f(Find)h(the)f(end)h(of)f(the)h +(range)f(to)g(modify.)g(*/)243 2255 y(end)g(=)h(start)f(+)h(\(count)f +(*)h(direction\);)243 2359 y(/*)f(Force)g(it)h(to)g(be)f(within)g +(range.)g(*/)243 2411 y(if)g(\(end)h(>)f(rl_end\))290 +2462 y(end)h(=)g(rl_end;)243 2514 y(else)f(if)h(\(end)f(<)h(0\))290 +2566 y(end)g(=)g(0;)243 2670 y(if)f(\(start)g(==)h(end\))p +eop +%%Page: 30 32 +30 31 bop 75 -58 a Fu(30)1299 b(GNU)15 b(Readline)i(Library)290 +183 y Ft(return)23 b(\(0\);)243 287 y(if)g(\(start)g(>)h(end\))290 +339 y({)338 391 y(int)g(temp)f(=)h(start;)338 443 y(start)f(=)h(end;) +338 495 y(end)g(=)f(temp;)290 546 y(})243 650 y(/*)g(Tell)h(readline)e +(that)i(we)f(are)h(modifying)e(the)i(line,)f(so)h(it)f(will)h(save)314 +702 y(the)g(undo)f(information.)f(*/)243 754 y(rl_modifying)g(\(start,) +h(end\);)243 858 y(for)g(\(i)h(=)f(start;)h(i)f(!=)h(end;)f(i++\))290 +910 y({)338 962 y(if)h(\(uppercase_p)e(\(rl_line_buffer[i]\)\))386 +1013 y(rl_line_buffer[i])f(=)j(to_lower)f(\(rl_line_buffer[i]\);)338 +1065 y(else)g(if)h(\(lowercase_p)e(\(rl_line_buffer[i]\)\))386 +1117 y(rl_line_buffer[i])f(=)j(to_upper)f(\(rl_line_buffer[i]\);)290 +1169 y(})243 1221 y(/*)g(Move)h(point)f(to)g(on)h(top)f(of)h(the)f +(last)h(character)e(changed.)h(*/)243 1273 y(rl_point)f(=)i +(\(direction)f(==)g(1\))h(?)g(end)f(-)h(1)g(:)f(start;)243 +1325 y(return)g(\(0\);)195 1377 y(})75 1509 y Fs(2.5)33 +b(Custom)21 b(Completers)137 1607 y Fu(T)o(ypically)l(,)e(a)d(program)f +(that)h(reads)h(commands)f(from)g(the)h(user)f(has)h(a)f(w)o(a)o(y)g +(of)g(disam)o(biguating)75 1662 y(commands)i(and)f(data.)27 +b(If)18 b(y)o(our)f(program)g(is)h(one)g(of)f(these,)i(then)f(it)g(can) +f(pro)o(vide)i(completion)g(for)75 1717 y(commands,)14 +b(data,)g(or)g(b)q(oth.)20 b(The)15 b(follo)o(wing)g(sections)g +(describ)q(e)h(ho)o(w)e(y)o(our)g(program)g(and)h(Readline)75 +1771 y(co)q(op)q(erate)g(to)g(pro)o(vide)g(this)h(service.)75 +1887 y Fl(2.5.1)30 b(Ho)n(w)21 b(Completing)f(W)-5 b(orks)137 +1984 y Fu(In)18 b(order)f(to)f(complete)i(some)f(text,)g(the)g(full)i +(list)e(of)g(p)q(ossible)i(completions)f(m)o(ust)f(b)q(e)h(a)o(v)m +(ailable.)75 2039 y(That)e(is,)i(it)f(is)h(not)f(p)q(ossible)h(to)f +(accurately)g(expand)h(a)e(partial)i(w)o(ord)e(without)h(kno)o(wing)g +(all)h(of)f(the)75 2094 y(p)q(ossible)i(w)o(ords)e(whic)o(h)h(mak)o(e)f +(sense)h(in)h(that)d(con)o(text.)26 b(The)18 b(Readline)i(library)e +(pro)o(vides)g(the)g(user)75 2149 y(in)o(terface)f(to)f(completion,)i +(and)e(t)o(w)o(o)g(of)g(the)h(most)f(common)g(completion)i(functions:) +23 b(\014lename)18 b(and)75 2204 y(username.)h(F)l(or)10 +b(completing)i(other)e(t)o(yp)q(es)h(of)f(text,)h(y)o(ou)g(m)o(ust)f +(write)h(y)o(our)f(o)o(wn)h(completion)g(function.)75 +2258 y(This)16 b(section)g(describ)q(es)g(exactly)g(what)f(suc)o(h)g +(functions)h(m)o(ust)f(do,)f(and)i(pro)o(vides)f(an)h(example.)137 +2327 y(There)g(are)f(three)g(ma)s(jor)f(functions)i(used)f(to)g(p)q +(erform)g(completion:)100 2396 y(1.)29 b(The)21 b(user-in)o(terface)g +(function)g Ft(rl_complete)14 b(\(\))p Fu(.)35 b(This)21 +b(function)g(is)g(called)h(with)f(the)f(same)165 2451 +y(argumen)o(ts)c(as)g(other)h(Readline)i(functions)f(in)o(tended)g(for) +e(in)o(teractiv)o(e)i(use:)23 b Fm(coun)o(t)18 b Fu(and)f +Fm(in)o(v)o(ok-)165 2506 y(ing)p 228 2506 14 2 v 17 w(k)o(ey)p +Fu(.)34 b(It)20 b(isolates)g(the)g(w)o(ord)f(to)h(b)q(e)g(completed)h +(and)f(calls)h Ft(completion_matches)13 b(\(\))20 b Fu(to)165 +2560 y(generate)f(a)f(list)i(of)e(p)q(ossible)j(completions.)32 +b(It)18 b(then)i(either)f(lists)h(the)f(p)q(ossible)h(completions,)165 +2615 y(inserts)g(the)f(p)q(ossible)j(completions,)f(or)e(actually)h(p)q +(erforms)f(the)h(completion,)h(dep)q(ending)h(on)165 +2670 y(whic)o(h)16 b(b)q(eha)o(vior)g(is)f(desired.)p +eop +%%Page: 31 33 +31 32 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(31)100 183 y(2.)29 b(The)11 b(in)o(ternal)g(function)g +Ft(completion_matches)i(\(\))d Fu(uses)h(y)o(our)e Fm(generator)k +Fu(function)e(to)f(generate)165 238 y(the)16 b(list)h(of)f(p)q(ossible) +i(matc)o(hes,)d(and)h(then)h(returns)f(the)g(arra)o(y)f(of)g(these)i +(matc)o(hes.)22 b(Y)l(ou)16 b(should)165 293 y(place)g(the)f(address)h +(of)e(y)o(our)h(generator)f(function)i(in)g Ft +(rl_completion_entry_function)p Fu(.)100 356 y(3.)29 +b(The)19 b(generator)e(function)j(is)f(called)h(rep)q(eatedly)f(from)f +Ft(completion_matches)13 b(\(\))p Fu(,)18 b(returning)165 +411 y(a)e(string)g(eac)o(h)h(time.)24 b(The)17 b(argumen)o(ts)e(to)h +(the)g(generator)g(function)h(are)f Fm(text)h Fu(and)g +Fm(state)p Fu(.)22 b Fm(text)165 466 y Fu(is)17 b(the)f(partial)g(w)o +(ord)f(to)h(b)q(e)h(completed.)23 b Fm(state)18 b Fu(is)e(zero)g(the)g +(\014rst)g(time)g(the)g(function)h(is)g(called,)165 520 +y(allo)o(wing)f(the)e(generator)g(to)g(p)q(erform)h(an)o(y)f(necessary) +h(initialization,)j(and)d(a)f(p)q(ositiv)o(e)i(non-zero)165 +575 y(in)o(teger)i(for)f(eac)o(h)g(subsequen)o(t)h(call.)28 +b(When)18 b(the)g(generator)f(function)h(returns)f Ft(\(char)e(*\)NULL) +165 630 y Fu(this)h(signals)h Ft(completion_matches)c(\(\))i +Fu(that)g(there)h(are)g(no)g(more)f(p)q(ossibilitie)q(s)j(left.)23 +b(Usually)165 685 y(the)c(generator)g(function)h(computes)g(the)f(list) +h(of)f(p)q(ossible)i(completions)g(when)e Fm(state)j +Fu(is)d(zero,)165 740 y(and)13 b(returns)g(them)f(one)h(at)f(a)h(time)g +(on)g(subsequen)o(t)g(calls.)20 b(Eac)o(h)13 b(string)f(the)h +(generator)f(function)165 794 y(returns)k(as)f(a)h(matc)o(h)f(m)o(ust)h +(b)q(e)g(allo)q(cated)h(with)g Ft(malloc\(\))p Fu(;)d(Readline)19 +b(frees)d(the)g(strings)f(when)165 849 y(it)g(has)h(\014nished)g(with)g +(them.)1650 929 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p +215 929 18 3 v 21 w(complete)j Fg(\()p Ft(int)14 b(ignore,)g(int)h +(invoking_key)p Fg(\))195 984 y Fu(Complete)20 b(the)g(w)o(ord)f(at)g +(or)g(b)q(efore)h(p)q(oin)o(t.)34 b(Y)l(ou)20 b(ha)o(v)o(e)f(supplied)j +(the)e(function)h(that)195 1038 y(do)q(es)15 b(the)g(initial)h(simple)h +(matc)o(hing)d(selection)i(algorithm)f(\(see)f Ft(completion_matches) +195 1093 y(\(\))p Fu(\).)19 b(The)d(default)f(is)h(to)f(do)g +(\014lename)h(completion.)1661 1173 y(V)l(ariable)-1749 +b Fi(Function)20 b(*)g Fh(rl)p 391 1173 V 21 w(completion)p +686 1173 V 21 w(en)n(try)p 839 1173 V 21 w(function)195 +1228 y Fu(This)c(is)f(a)g(p)q(oin)o(ter)g(to)g(the)g(generator)f +(function)i(for)e Ft(completion_matches)f(\(\))p Fu(.)20 +b(If)15 b(the)195 1283 y(v)m(alue)21 b(of)e Ft +(rl_completion_entry_functio)o(n)e Fu(is)j Ft(\(Function)14 +b(*\)NULL)19 b Fu(then)h(the)f(de-)195 1337 y(fault)11 +b(\014lename)h(generator)d(function,)j Ft(filename_completion_function) +g(\(\))p Fu(,)f(is)g(used.)75 1437 y Fl(2.5.2)30 b(Completion)20 +b(F)-5 b(unctions)137 1529 y Fu(Here)16 b(is)f(the)h(complete)g(list)g +(of)e(callable)k(completion)e(functions)g(presen)o(t)f(in)h(Readline.) +1650 1609 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +1609 V 21 w(complete)p 460 1609 V 21 w(in)n(ternal)k +Fg(\()p Ft(int)15 b(what_to_do)p Fg(\))195 1664 y Fu(Complete)k(the)f +(w)o(ord)g(at)g(or)g(b)q(efore)g(p)q(oin)o(t.)30 b Fm(what)p +1105 1664 14 2 v 16 w(to)p 1162 1664 V 16 w(do)21 b Fu(sa)o(ys)c(what)h +(to)g(do)g(with)h(the)195 1718 y(completion.)33 b(A)19 +b(v)m(alue)h(of)f(`)p Ft(?)p Fu(')f(means)h(list)h(the)f(p)q(ossible)i +(completions.)33 b(`)p Ft(TAB)p Fu(')18 b(means)195 1773 +y(do)g(standard)g(completion.)30 b(`)p Ft(*)p Fu(')18 +b(means)g(insert)g(all)i(of)d(the)i(p)q(ossible)h(completions.)30 +b(`)p Ft(!)p Fu(')195 1828 y(means)17 b(to)f(displa)o(y)i(all)g(of)e +(the)h(p)q(ossible)i(completions,)f(if)f(there)g(is)g(more)g(than)f +(one,)h(as)195 1883 y(w)o(ell)f(as)f(p)q(erforming)h(partial)f +(completion.)1650 1963 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 1963 18 3 v 21 w(complete)j Fg(\()p Ft(int)14 +b(ignore,)g(int)h(invoking_key)p Fg(\))195 2017 y Fu(Complete)20 +b(the)g(w)o(ord)f(at)g(or)g(b)q(efore)h(p)q(oin)o(t.)34 +b(Y)l(ou)20 b(ha)o(v)o(e)f(supplied)j(the)e(function)h(that)195 +2072 y(do)q(es)15 b(the)g(initial)h(simple)h(matc)o(hing)d(selection)i +(algorithm)f(\(see)f Ft(completion_matches)195 2127 y(\(\))h +Fu(and)h Ft(rl_completion_entry_functi)o(on)p Fu(\).)i(The)e(default)g +(is)g(to)f(do)g(\014lename)i(com-)195 2182 y(pletion.)k(This)15 +b(calls)g Ft(rl_complete_internal)e(\(\))h Fu(with)h(an)f(argumen)o(t)f +(dep)q(ending)k(on)195 2237 y Fm(in)o(v)o(oking)p 364 +2237 14 2 v 17 w(k)o(ey)p Fu(.)1650 2316 y(F)l(unction)-1749 +b Fi(int)19 b Fh(rl)p 214 2316 18 3 v 21 w(p)r(ossible)p +432 2316 V 20 w(completions)k Fg(\()p Ft(int)15 b(count,)f(int)h +(invoking_key)p Fg(\)\))195 2371 y Fu(List)k(the)f(p)q(ossible)i +(completions.)29 b(See)19 b(description)h(of)d Ft(rl_complete)d(\(\))p +Fu(.)28 b(This)19 b(calls)195 2426 y Ft(rl_complete_internal)12 +b(\(\))j Fu(with)h(an)f(argumen)o(t)f(of)h(`)p Ft(?)p +Fu('.)1650 2506 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p +215 2506 V 21 w(insert)p 378 2506 V 21 w(completions)j +Fg(\()p Ft(int)14 b(count,)g(int)h(invoking_key)p Fg(\)\))195 +2560 y Fu(Insert)24 b(the)h(list)f(of)g(p)q(ossible)i(completions)f(in) +o(to)f(the)g(line,)k(deleting)e(the)e(partially-)195 +2615 y(completed)16 b(w)o(ord.)j(See)c(description)i(of)d +Ft(rl_complete)g(\(\))p Fu(.)19 b(This)d(calls)g Ft(rl_complete_)195 +2670 y(internal)e(\(\))h Fu(with)g(an)h(argumen)o(t)e(of)h(`)p +Ft(*)p Fu('.)p eop +%%Page: 32 34 +32 33 bop 75 -58 a Fu(32)1299 b(GNU)15 b(Readline)i(Library)1650 +183 y(F)l(unction)-1749 b Fi(char)20 b(**)f Fh(completion)p +547 183 18 3 v 21 w(matc)n(hes)j Fg(\()p Ft(char)15 b(*text,)f +(CPFunction)283 238 y(*entry_func)p Fg(\))195 293 y Fu(Returns)f(an)f +(arra)o(y)f(of)h Ft(\(char)j(*\))d Fu(whic)o(h)h(is)g(a)f(list)h(of)f +(completions)i(for)e Fm(text)p Fu(.)18 b(If)13 b(there)f(are)195 +348 y(no)17 b(completions,)g(returns)g Ft(\(char)d(**\)NULL)p +Fu(.)23 b(The)17 b(\014rst)f(en)o(try)g(in)i(the)e(returned)h(arra)o(y) +195 402 y(is)c(the)h(substitution)f(for)g Fm(text)p Fu(.)18 +b(The)13 b(remaining)i(en)o(tries)e(are)f(the)i(p)q(ossible)g +(completions.)195 457 y(The)h(arra)o(y)f(is)i(terminated)g(with)f(a)g +Ft(NULL)g Fu(p)q(oin)o(ter.)195 522 y Fm(en)o(try)p 302 +522 14 2 v 16 w(func)g Fu(is)d(a)f(function)h(of)g(t)o(w)o(o)e(args,)h +(and)g(returns)h(a)f Ft(\(char)k(*\))p Fu(.)j(The)12 +b(\014rst)f(argumen)o(t)195 577 y(is)j Fm(text)p Fu(.)19 +b(The)14 b(second)g(is)g(a)f(state)f(argumen)o(t;)h(it)h(is)g(zero)f +(on)h(the)f(\014rst)g(call,)i(and)f(non-zero)195 632 +y(on)g(subsequen)o(t)g(calls.)21 b Fm(en)o(try)p 714 +632 V 16 w(func)c Fu(returns)d(a)f Ft(NULL)h Fu(p)q(oin)o(ter)g(to)f +(the)h(caller)h(when)g(there)195 686 y(are)g(no)g(more)g(matc)o(hes.) +1650 771 y(F)l(unction)-1749 b Fi(char)20 b(*)f Fh(\014lename)p +455 771 18 3 v 20 w(completion)p 749 771 V 21 w(function)k +Fg(\()p Ft(char)15 b(*text,)f(int)283 826 y(state)p Fg(\))195 +881 y Fu(A)19 b(generator)g(function)h(for)f(\014lename)h(completion)h +(in)f(the)f(general)h(case.)33 b(Note)19 b(that)195 936 +y(completion)e(in)f(Bash)f(is)h(a)f(little)i(di\013eren)o(t)f(b)q +(ecause)g(of)f(all)h(the)g(pathnames)f(that)g(m)o(ust)195 +991 y(b)q(e)i(follo)o(w)o(ed)g(when)g(lo)q(oking)h(up)f(completions)h +(for)e(a)g(command.)24 b(The)17 b(Bash)g(source)f(is)195 +1045 y(a)f(useful)h(reference)g(for)f(writing)g(custom)g(completion)h +(functions.)1650 1130 y(F)l(unction)-1749 b Fi(char)20 +b(*)f Fh(username)p 487 1130 V 19 w(completion)p 780 +1130 V 21 w(function)k Fg(\()p Ft(char)14 b(*text,)g(int)283 +1185 y(state)p Fg(\))195 1240 y Fu(A)k(completion)g(generator)f(for)g +(usernames.)28 b Fm(text)18 b Fu(con)o(tains)f(a)h(partial)g(username)g +(pre-)195 1295 y(ceded)f(b)o(y)f(a)g(random)f(c)o(haracter)h(\(usually) +h(`)p Ft(~)p Fu('\).)k(As)16 b(with)g(all)h(completion)g(generators,) +195 1350 y Fm(state)g Fu(is)f(zero)f(on)g(the)g(\014rst)g(call)h(and)g +(non-zero)f(for)g(subsequen)o(t)h(calls.)75 1454 y Fl(2.5.3)30 +b(Completion)20 b(V)-5 b(ariables)1661 1569 y Fu(V)l(ariable)-1749 +b Fi(Function)20 b(*)g Fh(rl)p 391 1569 V 21 w(completion)p +686 1569 V 21 w(en)n(try)p 839 1569 V 21 w(function)195 +1623 y Fu(A)c(p)q(oin)o(ter)h(to)e(the)i(generator)e(function)i(for)e +Ft(completion_matches)e(\(\))p Fu(.)22 b Ft(NULL)16 b +Fu(means)195 1678 y(to)f(use)g Ft(filename_entry_function)d(\(\))p +Fu(,)j(the)g(default)h(\014lename)g(completer.)1661 1763 +y(V)l(ariable)-1749 b Fi(CPPFunction)21 b(*)e Fh(rl)p +469 1763 V 21 w(attempted)p 749 1763 V 20 w(completion)p +1043 1763 V 21 w(function)195 1818 y Fu(A)d(p)q(oin)o(ter)h(to)f(an)g +(alternativ)o(e)h(function)g(to)f(create)g(matc)o(hes.)23 +b(The)16 b(function)i(is)e(called)195 1873 y(with)f Fm(text)p +Fu(,)g Fm(start)p Fu(,)e(and)i Fm(end)p Fu(.)21 b Fm(start)15 +b Fu(and)g Fm(end)i Fu(are)e(indices)i(in)f Ft(rl_line_buffer)d +Fu(sa)o(ying)195 1927 y(what)22 b(the)h(b)q(oundaries)h(of)e +Fm(text)h Fu(are.)42 b(If)23 b(this)g(function)h(exists)f(and)f +(returns)h Ft(NULL)p Fu(,)195 1982 y(or)c(if)h(this)g(v)m(ariable)h(is) +f(set)g(to)e Ft(NULL)p Fu(,)i(then)g Ft(rl_complete)14 +b(\(\))19 b Fu(will)i(call)g(the)f(v)m(alue)g(of)195 +2037 y Ft(rl_completion_entry_functi)o(on)14 b Fu(to)j(generate)g(matc) +o(hes,)g(otherwise)g(the)g(arra)o(y)f(of)195 2092 y(strings)f(returned) +h(will)h(b)q(e)e(used.)1661 2177 y(V)l(ariable)-1749 +b Fi(CPFunction)21 b(*)e Fh(rl)p 443 2177 V 21 w(\014lename)p +672 2177 V 20 w(quoting)p 881 2177 V 21 w(function)195 +2232 y Fu(A)g(p)q(oin)o(ter)g(to)f(a)h(function)g(that)g(will)h(quote)f +(a)f(\014lename)i(in)g(an)e(application-)j(sp)q(eci\014c)195 +2286 y(fashion.)33 b(This)20 b(is)g(called)h(if)f(\014lename)g +(completion)h(is)f(b)q(eing)g(attempted)f(and)h(one)f(of)195 +2341 y(the)13 b(c)o(haracters)f(in)h Ft(rl_filename_quote_characte)o +(rs)d Fu(app)q(ears)i(in)i(a)e(completed)i(\014le-)195 +2396 y(name.)29 b(The)18 b(function)h(is)g(called)h(with)e +Fm(text)p Fu(,)g Fm(matc)o(h)p 1144 2396 14 2 v 16 w(t)o(yp)q(e)p +Fu(,)h(and)f Fm(quote)p 1480 2396 V 16 w(p)q(oin)o(ter)p +Fu(.)30 b(The)195 2451 y Fm(text)17 b Fu(is)h(the)f(\014lename)h(to)e +(b)q(e)h(quoted.)25 b(The)17 b Fm(matc)o(h)p 1115 2451 +V 16 w(t)o(yp)q(e)i Fu(is)f(either)f Ft(SINGLE_MATCH)p +Fu(,)e(if)195 2506 y(there)j(is)g(only)h(one)f(completion)h(matc)o(h,)f +(or)f Ft(MULT_MATCH)p Fu(.)27 b(Some)18 b(functions)g(use)h(this)195 +2560 y(to)13 b(decide)i(whether)f(or)g(not)f(to)g(insert)h(a)f(closing) +i(quote)f(c)o(haracter.)k(The)c Fm(quote)p 1600 2560 +V 16 w(p)q(oin)o(ter)195 2615 y Fu(is)20 b(a)g(p)q(oin)o(ter)g(to)f(an) +o(y)g(op)q(ening)i(quote)e(c)o(haracter)g(the)h(user)g(t)o(yp)q(ed.)34 +b(Some)19 b(functions)195 2670 y(c)o(ho)q(ose)c(to)g(reset)g(this)g(c)o +(haracter.)p eop +%%Page: 33 35 +33 34 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(33)1661 183 y(V)l(ariable)-1749 b Fi(CPFunction)21 +b(*)e Fh(rl)p 443 183 18 3 v 21 w(\014lename)p 672 183 +V 20 w(dequoting)p 939 183 V 21 w(function)195 238 y +Fu(A)14 b(p)q(oin)o(ter)g(to)e(a)i(function)g(that)f(will)i(remo)o(v)o +(e)e(application-sp)q(eci\014c)k(quoting)d(c)o(haracters)195 +293 y(from)21 b(a)g(\014lename)h(b)q(efore)f(completion)i(is)f +(attempted,)g(so)f(those)g(c)o(haracters)f(do)h(not)195 +348 y(in)o(terfere)e(with)f(matc)o(hing)h(the)f(text)g(against)g(names) +g(in)h(the)f(\014lesystem.)30 b(It)19 b(is)f(called)195 +402 y(with)g Fm(text)p Fu(,)g(the)g(text)g(of)g(the)g(w)o(ord)f(to)g(b) +q(e)i(dequoted,)g(and)f Fm(quote)p 1381 402 14 2 v 16 +w(c)o(har)p Fu(,)g(whic)o(h)h(is)g(the)195 457 y(quoting)e(c)o +(haracter)f(that)g(delimits)i(the)f(\014lename)h(\(usually)f(`)p +Ft(')p Fu(')f(or)g(`)p Ft(")p Fu('\).)23 b(If)17 b Fm(quote)p +1657 457 V 16 w(c)o(har)195 512 y Fu(is)f(zero,)e(the)i(\014lename)g(w) +o(as)e(not)h(in)h(an)f(em)o(b)q(edded)i(string.)1661 +611 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p +391 611 18 3 v 21 w(c)n(har)p 519 611 V 20 w(is)p 577 +611 V 22 w(quoted)p 770 611 V 20 w(p)195 665 y Fu(A)c(p)q(oin)o(ter)g +(to)f(a)h(function)g(to)g(call)g(that)g(determines)g(whether)g(or)g +(not)f(a)g(sp)q(eci\014c)j(c)o(har-)195 720 y(acter)12 +b(in)i(the)f(line)i(bu\013er)e(is)g(quoted,)g(according)h(to)e(whatev)o +(er)g(quoting)h(mec)o(hanism)h(the)195 775 y(program)e(calling)j +(readline)g(uses.)20 b(The)13 b(function)h(is)g(called)h(with)f(t)o(w)o +(o)e(argumen)o(ts:)18 b Fm(text)p Fu(,)195 830 y(the)11 +b(text)g(of)g(the)g(line,)i(and)f Fm(index)p Fu(,)g(the)g(index)g(of)f +(the)g(c)o(haracter)g(in)h(the)f(line.)20 b(It)11 b(is)h(used)g(to)195 +884 y(decide)20 b(whether)e(a)g(c)o(haracter)g(found)h(in)g +Ft(rl_completer_word_break_)o(charact)o(ers)195 939 y +Fu(should)d(b)q(e)g(used)g(to)e(break)i(w)o(ords)e(for)h(the)g +(completer.)1661 1038 y(V)l(ariable)-1749 b Fi(int)20 +b Fh(rl)p 215 1038 V 21 w(completion)p 510 1038 V 21 +w(query)p 673 1038 V 21 w(items)195 1093 y Fu(Up)d(to)e(this)i(man)o(y) +f(items)h(will)h(b)q(e)f(displa)o(y)o(ed)g(in)g(resp)q(onse)g(to)f(a)g +(p)q(ossible-completions)195 1147 y(call.)26 b(After)16 +b(that,)g(w)o(e)h(ask)f(the)h(user)g(if)g(she)g(is)h(sure)e(she)i(w)o +(an)o(ts)d(to)h(see)h(them)g(all.)26 b(The)195 1202 y(default)16 +b(v)m(alue)g(is)g(100.)1661 1301 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 1301 V 21 w(basic)p 430 +1301 V 21 w(w)n(ord)p 575 1301 V 21 w(break)p 736 1301 +V 20 w(c)n(haracters)195 1356 y Fu(The)13 b(basic)h(list)f(of)g(c)o +(haracters)f(that)g(signal)i(a)e(break)h(b)q(et)o(w)o(een)g(w)o(ords)f +(for)g(the)h(completer)195 1410 y(routine.)20 b(The)c(default)g(v)m +(alue)g(of)f(this)g(v)m(ariable)i(is)f(the)f(c)o(haracters)g(whic)o(h)h +(break)f(w)o(ords)195 1465 y(for)g(completion)h(in)g(Bash,)f(i.e.,)g +Ft(")g(\\t\\n\\"\\\\'`@$><=;|&{\(")p Fu(.)1661 1564 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 1564 V 21 w(basic)p 430 +1564 V 21 w(quote)p 590 1564 V 21 w(c)n(haracters)195 +1618 y Fu(List)d(of)f(quote)g(c)o(haracters)f(whic)o(h)i(can)f(cause)h +(a)f(w)o(ord)f(break.)1661 1717 y(V)l(ariable)-1749 b +Fi(char)20 b(*)f Fh(rl)p 286 1717 V 21 w(completer)p +555 1717 V 21 w(w)n(ord)p 700 1717 V 20 w(break)p 860 +1717 V 20 w(c)n(haracters)195 1772 y Fu(The)j(list)g(of)f(c)o +(haracters)g(that)g(signal)h(a)g(break)f(b)q(et)o(w)o(een)h(w)o(ords)f +(for)g Ft(rl_complete_)195 1827 y(internal)14 b(\(\))p +Fu(.)k(The)10 b(default)h(list)g(is)g(the)f(v)m(alue)h(of)f +Ft(rl_basic_word_break_charac)o(ters)p Fu(.)p 1909 1831 +21 36 v 1661 1925 a(V)l(ariable)-1749 b Fi(char)20 b(*)f +Fh(rl)p 286 1925 18 3 v 21 w(completer)p 555 1925 V 21 +w(quote)p 715 1925 V 21 w(c)n(haracters)195 1980 y Fu(List)11 +b(of)g(c)o(haracters)f(whic)o(h)h(can)g(b)q(e)h(used)f(to)g(quote)f(a)h +(substring)g(of)f(the)h(line.)20 b(Completion)195 2035 +y(o)q(ccurs)c(on)g(the)g(en)o(tire)g(substring,)g(and)g(within)h(the)e +(substring)h Ft(rl_completer_word_)195 2089 y(break_characters)d +Fu(are)h(treated)g(as)h(an)o(y)f(other)g(c)o(haracter,)g(unless)i(they) +f(also)g(app)q(ear)195 2144 y(within)h(this)g(list.)1661 +2243 y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286 +2243 V 21 w(\014lename)p 515 2243 V 20 w(quote)p 674 +2243 V 21 w(c)n(haracters)195 2298 y Fu(A)d(list)g(of)g(c)o(haracters)e +(that)h(cause)h(a)g(\014lename)h(to)e(b)q(e)h(quoted)g(b)o(y)f(the)h +(completer)g(when)195 2352 y(they)f(app)q(ear)h(in)g(a)f(completed)h +(\014lename.)21 b(The)15 b(default)h(is)g(the)f(n)o(ull)i(string.)1661 +2451 y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286 +2451 V 21 w(sp)r(ecial)p 473 2451 V 22 w(pre\014xes)195 +2506 y Fu(The)14 b(list)h(of)e(c)o(haracters)g(that)g(are)g(w)o(ord)g +(break)h(c)o(haracters,)f(but)h(should)g(b)q(e)h(left)f(in)g +Fm(text)195 2560 y Fu(when)19 b(it)g(is)g(passed)f(to)g(the)h +(completion)g(function.)31 b(Programs)17 b(can)h(use)h(this)g(to)f +(help)195 2615 y(determine)e(what)e(kind)i(of)e(completing)i(to)e(do.) +19 b(F)l(or)14 b(instance,)h(Bash)g(sets)f(this)i(v)m(ariable)195 +2670 y(to)f Ft(")p Fu($)p Ft(@")f Fu(so)h(that)f(it)i(can)f(complete)h +(shell)h(v)m(ariables)f(and)g(hostnames.)p eop +%%Page: 34 36 +34 35 bop 75 -58 a Fu(34)1299 b(GNU)15 b(Readline)i(Library)1661 +183 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 183 +18 3 v 21 w(completion)p 510 183 V 21 w(app)r(end)p 715 +183 V 19 w(c)n(haracter)195 238 y Fu(When)15 b(a)e(single)j(completion) +f(alternativ)o(e)f(matc)o(hes)g(at)g(the)g(end)h(of)e(the)i(command)f +(line,)195 293 y(this)20 b(c)o(haracter)e(is)i(app)q(ended)h(to)d(the)i +(inserted)g(completion)g(text.)31 b(The)20 b(default)g(is)f(a)195 +348 y(space)14 b(c)o(haracter)f(\(`)i('\).)j(Setting)c(this)h(to)e(the) +h(n)o(ull)h(c)o(haracter)e(\(`)p Ft(\\0)p Fu('\))f(prev)o(en)o(ts)i(an) +o(ything)195 402 y(b)q(eing)24 b(app)q(ended)g(automatically)l(.)42 +b(This)23 b(can)g(b)q(e)g(c)o(hanged)f(in)i(custom)e(completion)195 +457 y(functions)15 b(to)e(pro)o(vide)i(the)f(\\most)f(sensible)j(w)o +(ord)d(separator)g(c)o(haracter")g(according)i(to)195 +512 y(an)g(application-sp)q(eci\014)q(c)j(command)d(line)i(syn)o(tax)d +(sp)q(eci\014cation.)1661 599 y(V)l(ariable)-1749 b Fi(int)20 +b Fh(rl)p 215 599 V 21 w(ignore)p 391 599 V 20 w(completion)p +685 599 V 21 w(duplicates)195 654 y Fu(If)15 b(non-zero,)h(then)f +(disallo)o(w)h(duplicates)h(in)f(the)g(matc)o(hes.)j(Default)c(is)h(1.) +1661 741 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 +741 V 21 w(\014lename)p 444 741 V 20 w(completion)p 738 +741 V 21 w(desired)195 796 y Fu(Non-zero)15 b(means)g(that)g(the)g +(results)h(of)f(the)g(matc)o(hes)g(are)f(to)h(b)q(e)h(treated)f(as)f +(\014lenames.)195 851 y(This)e(is)h Fm(alw)o(a)o(ys)f +Fu(zero)g(on)g(en)o(try)l(,)g(and)g(can)f(only)i(b)q(e)f(c)o(hanged)g +(within)h(a)e(completion)i(en)o(try)195 905 y(generator)f(function.)20 +b(If)14 b(it)f(is)h(set)f(to)g(a)g(non-zero)g(v)m(alue,)i(directory)e +(names)h(ha)o(v)o(e)f(a)g(slash)195 960 y(app)q(ended)k(and)f(Readline) +h(attempts)e(to)f(quote)i(completed)g(\014lenames)g(if)g(they)g(con)o +(tain)195 1015 y(an)o(y)f(em)o(b)q(edded)i(w)o(ord)d(break)h(c)o +(haracters.)1661 1102 y(V)l(ariable)-1749 b Fi(int)20 +b Fh(rl)p 215 1102 V 21 w(\014lename)p 444 1102 V 20 +w(quoting)p 653 1102 V 21 w(desired)195 1157 y Fu(Non-zero)c(means)f +(that)g(the)h(results)g(of)g(the)f(matc)o(hes)h(are)f(to)g(b)q(e)h +(quoted)g(using)h(double)195 1212 y(quotes)12 b(\(or)f(an)g +(application-sp)q(eci)q(\014c)k(quoting)d(mec)o(hanism\))g(if)g(the)g +(completed)h(\014lename)195 1267 y(con)o(tains)f(an)o(y)g(c)o +(haracters)g(in)h Ft(rl_filename_quote_chars)p Fu(.)j(This)c(is)h +Fm(alw)o(a)o(ys)h Fu(non-zero)195 1321 y(on)d(en)o(try)l(,)g(and)h(can) +f(only)h(b)q(e)g(c)o(hanged)f(within)h(a)f(completion)i(en)o(try)d +(generator)g(function.)195 1376 y(The)16 b(quoting)h(is)g(e\013ected)f +(via)h(a)e(call)j(to)d(the)i(function)g(p)q(oin)o(ted)g(to)e(b)o(y)i +Ft(rl_filename_)195 1431 y(quoting_function)p Fu(.)1661 +1518 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 1518 +V 21 w(inhibit)p 399 1518 V 23 w(completion)195 1573 +y Fu(If)15 b(this)f(v)m(ariable)i(is)f(non-zero,)f(completion)i(is)f +(inhibit)p Ft(<)p Fu(ed.)22 b(The)14 b(completion)i(c)o(haracter)195 +1628 y(will)h(b)q(e)f(inserted)g(as)f(an)o(y)f(other)h(b)q(ound)h(to)f +Ft(self-insert)p Fu(.)1661 1715 y(V)l(ariable)-1749 b +Fi(Function)20 b(*)g Fh(rl)p 391 1715 V 21 w(ignore)p +567 1715 V 20 w(some)p 714 1715 V 19 w(completions)p +1030 1715 V 21 w(function)195 1770 y Fu(This)15 b(function,)g(if)f +(de\014ned,)i(is)e(called)i(b)o(y)e(the)h(completer)f(when)h(real)g +(\014lename)g(comple-)195 1824 y(tion)k(is)g(done,)g(after)f(all)i(the) +f(matc)o(hing)f(names)h(ha)o(v)o(e)f(b)q(een)i(generated.)30 +b(It)19 b(is)g(passed)195 1879 y(a)h Ft(NULL)f Fu(terminated)h(arra)o +(y)f(of)g(matc)o(hes.)34 b(The)20 b(\014rst)g(elemen)o(t)h(\()p +Ft(matches[0])p Fu(\))c(is)k(the)195 1934 y(maximal)e(substring)f +(common)g(to)g(all)h(matc)o(hes.)29 b(This)19 b(function)g(can)f +(re-arrange)g(the)195 1989 y(list)h(of)e(matc)o(hes)h(as)f(required,)i +(but)f(eac)o(h)g(elemen)o(t)h(deleted)g(from)e(the)h(arra)o(y)f(m)o +(ust)g(b)q(e)195 2044 y(freed.)1661 2131 y(V)l(ariable)-1749 +b Fi(Function)20 b(*)g Fh(rl)p 391 2131 V 21 w(directory)p +639 2131 V 21 w(completion)p 934 2131 V 21 w(ho)r(ok)195 +2185 y Fu(This)13 b(function,)h(if)g(de\014ned,)g(is)f(allo)o(w)o(ed)h +(to)e(mo)q(dify)h(the)g(directory)g(p)q(ortion)g(of)g(\014lenames)195 +2240 y(Readline)k(completes.)j(It)15 b(is)g(called)h(with)f(the)g +(address)g(of)f(a)g(string)h(\(the)f(curren)o(t)h(direc-)195 +2295 y(tory)f(name\))g(as)h(an)f(argumen)o(t.)19 b(It)c(could)h(b)q(e)f +(used)h(to)e(expand)h(sym)o(b)q(olic)h(links)g(or)e(shell)195 +2350 y(v)m(ariables)j(in)f(pathnames.)75 2457 y Fl(2.5.4)30 +b(A)21 b(Short)f(Completion)g(Example)137 2552 y Fu(Here)11 +b(is)f(a)g(small)h(application)h(demonstrating)e(the)g(use)h(of)e(the)i +(GNU)f(Readline)i(library)l(.)19 b(It)11 b(is)f(called)75 +2606 y Ft(fileman)p Fu(,)17 b(and)h(the)g(source)g(co)q(de)g(resides)h +(in)f(`)p Ft(examples/fileman.c)p Fu('.)25 b(This)18 +b(sample)g(application)75 2661 y(pro)o(vides)c(completion)g(of)e +(command)h(names,)g(line)i(editing)g(features,)d(and)i(access)f(to)f +(the)h(history)h(list.)p eop +%%Page: 35 37 +35 36 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(35)195 183 y Ft(/*)24 b(fileman.c)e(--)i(A)g(tiny)f +(application)f(which)h(demonstrates)g(how)g(to)h(use)f(the)267 +235 y(GNU)g(Readline)g(library.)46 b(This)24 b(application)e +(interactively)g(allows)h(users)267 287 y(to)g(manipulate)g(files)g +(and)g(their)g(modes.)h(*/)195 391 y(#include)f()195 +443 y(#include)g()195 495 y(#include)g()195 +546 y(#include)g()195 598 y(#include)g()195 +702 y(#include)g()195 754 y(#include)g +()195 858 y(extern)g(char)g(*getwd)g(\(\);)195 +910 y(extern)g(char)g(*xmalloc)g(\(\);)195 1013 y(/*)h(The)f(names)g +(of)h(functions)e(that)i(actually)f(do)g(the)h(manipulation.)e(*/)195 +1065 y(int)h(com_list)g(\(\),)h(com_view)e(\(\),)i(com_rename)e(\(\),)i +(com_stat)f(\(\),)g(com_pwd)g(\(\);)195 1117 y(int)g(com_delete)g +(\(\),)g(com_help)g(\(\),)h(com_cd)f(\(\),)g(com_quit)g(\(\);)195 +1221 y(/*)h(A)f(structure)g(which)g(contains)g(information)f(on)i(the)f +(commands)g(this)g(program)267 1273 y(can)g(understand.)f(*/)195 +1377 y(typedef)h(struct)g({)243 1429 y(char)g(*name;)g(/*)h(User)f +(printable)g(name)g(of)h(the)f(function.)g(*/)243 1480 +y(Function)f(*func;)i(/*)f(Function)g(to)g(call)h(to)f(do)h(the)f(job.) +h(*/)243 1532 y(char)f(*doc;)g(/*)h(Documentation)e(for)h(this)h +(function.)46 b(*/)195 1584 y(})24 b(COMMAND;)195 1688 +y(COMMAND)f(commands[])f(=)i({)243 1740 y({)f("cd",)h(com_cd,)f +("Change)f(to)i(directory)f(DIR")g(},)243 1792 y({)g("delete",)g +(com_delete,)f("Delete)h(FILE")h(},)243 1844 y({)f("help",)g(com_help,) +g("Display)g(this)g(text")g(},)243 1896 y({)g("?",)h(com_help,)e +("Synonym)h(for)h(`help'")f(},)243 1947 y({)g("list",)g(com_list,)g +("List)g(files)g(in)h(DIR")f(},)243 1999 y({)g("ls",)h(com_list,)e +("Synonym)h(for)g(`list'")g(},)243 2051 y({)g("pwd",)g(com_pwd,)g +("Print)g(the)h(current)f(working)g(directory")f(},)243 +2103 y({)h("quit",)g(com_quit,)g("Quit)g(using)g(Fileman")g(},)243 +2155 y({)g("rename",)g(com_rename,)f("Rename)h(FILE)h(to)f(NEWNAME")g +(},)243 2207 y({)g("stat",)g(com_stat,)g("Print)g(out)g(statistics)g +(on)h(FILE")f(},)243 2259 y({)g("view",)g(com_view,)g("View)g(the)h +(contents)e(of)i(FILE")f(},)243 2311 y({)g(\(char)h(*\)NULL,)f +(\(Function)f(*\)NULL,)h(\(char)g(*\)NULL)g(})195 2363 +y(};)195 2466 y(/*)h(Forward)e(declarations.)h(*/)195 +2518 y(char)g(*stripwhite)g(\(\);)195 2570 y(COMMAND)g(*find_command)f +(\(\);)p eop +%%Page: 36 38 +36 37 bop 75 -58 a Fu(36)1299 b(GNU)15 b(Readline)i(Library)195 +183 y Ft(/*)24 b(The)f(name)g(of)h(this)f(program,)g(as)h(taken)f(from) +g(argv[0].)g(*/)195 235 y(char)g(*progname;)195 339 y(/*)h(When)f +(non-zero,)g(this)g(global)g(means)g(the)h(user)f(is)g(done)h(using)f +(this)g(program.)g(*/)p 1985 349 21 42 v 195 391 a(int)g(done;)195 +495 y(char)g(*)195 546 y(dupstr)g(\(s\))314 598 y(int)h(s;)195 +650 y({)243 702 y(char)f(*r;)243 806 y(r)g(=)h(xmalloc)f(\(strlen)g +(\(s\))g(+)h(1\);)243 858 y(strcpy)f(\(r,)g(s\);)243 +910 y(return)g(\(r\);)195 962 y(})195 1065 y(main)g(\(argc,)g(argv\)) +314 1117 y(int)h(argc;)314 1169 y(char)g(**argv;)195 +1221 y({)243 1273 y(char)f(*line,)g(*s;)243 1377 y(progname)f(=)i +(argv[0];)243 1480 y(initialize_readline)d(\(\);)i(/*)h(Bind)f(our)h +(completer.)e(*/)243 1584 y(/*)h(Loop)h(reading)f(and)g(executing)g +(lines)g(until)g(the)g(user)h(quits.)f(*/)243 1636 y(for)g(\()h(;)g +(done)f(==)h(0;)f(\))290 1688 y({)338 1740 y(line)g(=)h(readline)f +(\("FileMan:)f("\);)338 1844 y(if)i(\(!line\))386 1896 +y(break;)338 1999 y(/*)g(Remove)f(leading)g(and)g(trailing)g +(whitespace)f(from)i(the)f(line.)410 2051 y(Then,)g(if)h(there)f(is)g +(anything)g(left,)g(add)h(it)f(to)h(the)f(history)g(list)410 +2103 y(and)g(execute)g(it.)h(*/)338 2155 y(s)g(=)g(stripwhite)e +(\(line\);)338 2259 y(if)i(\(*s\))386 2311 y({)434 2363 +y(add_history)e(\(s\);)434 2414 y(execute_line)g(\(s\);)386 +2466 y(})338 2570 y(free)h(\(line\);)290 2622 y(})p eop +%%Page: 37 39 +37 38 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(37)243 183 y Ft(exit)23 b(\(0\);)195 +235 y(})195 339 y(/*)h(Execute)e(a)i(command)f(line.)g(*/)195 +391 y(int)195 443 y(execute_line)f(\(line\))314 495 y(char)i(*line;)195 +546 y({)243 598 y(register)e(int)i(i;)243 650 y(COMMAND)f(*command;)243 +702 y(char)g(*word;)243 806 y(/*)g(Isolate)g(the)h(command)f(word.)g +(*/)243 858 y(i)g(=)h(0;)243 910 y(while)f(\(line[i])g(&&)g(whitespace) +g(\(line[i]\)\))290 962 y(i++;)243 1013 y(word)g(=)h(line)f(+)h(i;)243 +1117 y(while)f(\(line[i])g(&&)g(!whitespace)g(\(line[i]\)\))290 +1169 y(i++;)243 1273 y(if)g(\(line[i]\))290 1325 y(line[i++])g(=)h +('\\0';)243 1429 y(command)f(=)g(find_command)g(\(word\);)243 +1532 y(if)g(\(!command\))290 1584 y({)338 1636 y(fprintf)g(\(stderr,)g +("\045s:)g(No)h(such)f(command)g(for)g(FileMan.\\n",)g(word\);)338 +1688 y(return)g(\(-1\);)290 1740 y(})243 1844 y(/*)g(Get)h(argument)f +(to)g(command,)g(if)g(any.)h(*/)243 1896 y(while)f(\(whitespace)f +(\(line[i]\)\))290 1947 y(i++;)243 2051 y(word)h(=)h(line)f(+)h(i;)243 +2155 y(/*)f(Call)h(the)f(function.)g(*/)243 2207 y(return)g +(\(\(*\(command->func\)\))e(\(word\)\);)195 2259 y(})195 +2363 y(/*)j(Look)f(up)g(NAME)h(as)f(the)h(name)f(of)h(a)f(command,)g +(and)h(return)f(a)g(pointer)g(to)h(that)267 2414 y(command.)46 +b(Return)23 b(a)h(NULL)f(pointer)g(if)h(NAME)f(isn't)g(a)h(command)f +(name.)g(*/)195 2466 y(COMMAND)g(*)195 2518 y(find_command)f(\(name\)) +314 2570 y(char)i(*name;)195 2622 y({)p eop +%%Page: 38 40 +38 39 bop 75 -58 a Fu(38)1299 b(GNU)15 b(Readline)i(Library)243 +183 y Ft(register)22 b(int)i(i;)243 287 y(for)f(\(i)h(=)f(0;)h +(commands[i].name;)e(i++\))290 339 y(if)i(\(strcmp)f(\(name,)g +(commands[i].name\))f(==)h(0\))338 391 y(return)g(\(&commands[i]\);)243 +495 y(return)g(\(\(COMMAND)f(*\)NULL\);)195 546 y(})195 +650 y(/*)i(Strip)f(whitespace)f(from)i(the)f(start)g(and)h(end)f(of)h +(STRING.)46 b(Return)24 b(a)f(pointer)267 702 y(into)g(STRING.)g(*/)195 +754 y(char)g(*)195 806 y(stripwhite)f(\(string\))314 +858 y(char)i(*string;)195 910 y({)243 962 y(register)e(char)i(*s,)f +(*t;)243 1065 y(for)g(\(s)h(=)f(string;)g(whitespace)g(\(*s\);)g(s++\)) +290 1117 y(;)243 1221 y(if)g(\(*s)h(==)f(0\))290 1273 +y(return)g(\(s\);)243 1377 y(t)g(=)h(s)g(+)g(strlen)f(\(s\))g(-)h(1;) +243 1429 y(while)f(\(t)g(>)h(s)g(&&)g(whitespace)e(\(*t\)\))290 +1480 y(t--;)243 1532 y(*++t)h(=)h('\\0';)243 1636 y(return)f(s;)195 +1688 y(})195 1792 y(/*)h(***********************)o(*******)o(********)o +(*******)o(*******)o(********)o(****)d(*/)195 1844 y(/*)1575 +b(*/)195 1896 y(/*)429 b(Interface)23 b(to)g(Readline)g(Completion)381 +b(*/)195 1947 y(/*)1575 b(*/)195 1999 y(/*)24 b +(***********************)o(*******)o(********)o(*******)o(*******)o +(********)o(****)d(*/)195 2103 y(char)i(*command_generator)f(\(\);)195 +2155 y(char)h(**fileman_completion)e(\(\);)195 2259 y(/*)j(Tell)f(the)g +(GNU)h(Readline)f(library)f(how)i(to)g(complete.)46 b(We)24 +b(want)f(to)h(try)f(to)h(complete)p 2034 2269 21 42 v +267 2311 a(on)f(command)g(names)g(if)h(this)f(is)h(the)f(first)g(word)h +(in)f(the)h(line,)f(or)h(on)f(filenames)p 1962 2317 21 +35 v 267 2363 a(if)g(not.)g(*/)195 2414 y(initialize_readline)e(\(\)) +195 2466 y({)243 2518 y(/*)i(Allow)g(conditional)g(parsing)g(of)g(the)h +(~/.inputrc)e(file.)h(*/)243 2570 y(rl_readline_name)e(=)j("FileMan";)p +eop +%%Page: 39 41 +39 40 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(39)243 183 y Ft(/*)23 b(Tell)h(the)f(completer)g(that)g +(we)h(want)f(a)h(crack)f(first.)g(*/)243 235 y +(rl_attempted_completion_)o(functio)o(n)e(=)j(\(CPPFunction)e +(*\)fileman_completion;)195 287 y(})195 391 y(/*)i(Attempt)e(to)i +(complete)f(on)g(the)h(contents)f(of)g(TEXT.)47 b(START)23 +b(and)h(END)f(bound)h(the)267 443 y(region)f(of)g(rl_line_buffer)f +(that)h(contains)g(the)h(word)f(to)h(complete.)46 b(TEXT)23 +b(is)267 495 y(the)g(word)g(to)h(complete.)46 b(We)24 +b(can)f(use)h(the)f(entire)g(contents)g(of)h(rl_line_buffer)p +1963 505 21 38 v 267 546 a(in)f(case)g(we)h(want)f(to)h(do)g(some)f +(simple)g(parsing.)47 b(Return)23 b(the)g(array)g(of)h(matches,)p +1986 557 V 267 598 a(or)f(NULL)g(if)h(there)f(aren't)g(any.)h(*/)195 +650 y(char)f(**)195 702 y(fileman_completion)e(\(text,)i(start,)g +(end\))314 754 y(char)h(*text;)314 806 y(int)g(start,)f(end;)195 +858 y({)243 910 y(char)g(**matches;)243 1013 y(matches)g(=)g(\(char)h +(**\)NULL;)243 1117 y(/*)f(If)h(this)f(word)h(is)f(at)h(the)f(start)g +(of)h(the)f(line,)h(then)f(it)g(is)h(a)g(command)314 +1169 y(to)g(complete.)46 b(Otherwise)23 b(it)h(is)f(the)h(name)f(of)h +(a)f(file)h(in)f(the)h(current)314 1221 y(directory.)f(*/)243 +1273 y(if)g(\(start)g(==)h(0\))290 1325 y(matches)f(=)h +(completion_matches)d(\(text,)j(command_generator\);)243 +1429 y(return)f(\(matches\);)195 1480 y(})195 1584 y(/*)h(Generator)e +(function)h(for)g(command)g(completion.)47 b(STATE)23 +b(lets)g(us)h(know)f(whether)p 1938 1594 21 42 v 267 +1636 a(to)g(start)g(from)h(scratch;)e(without)h(any)h(state)f(\(i.e.)g +(STATE)g(==)h(0\),)f(then)h(we)267 1688 y(start)f(at)g(the)h(top)f(of)h +(the)f(list.)g(*/)195 1740 y(char)g(*)195 1792 y(command_generator)f +(\(text,)h(state\))314 1844 y(char)h(*text;)314 1896 +y(int)g(state;)195 1947 y({)243 1999 y(static)f(int)g(list_index,)g +(len;)243 2051 y(char)g(*name;)243 2155 y(/*)g(If)h(this)f(is)h(a)g +(new)f(word)g(to)h(complete,)f(initialize)f(now.)47 b(This)24 +b(includes)314 2207 y(saving)f(the)h(length)f(of)g(TEXT)h(for)f +(efficiency,)g(and)g(initializing)f(the)i(index)p 1938 +2217 21 38 v 314 2259 a(variable)f(to)h(0.)f(*/)243 2311 +y(if)g(\(!state\))290 2363 y({)338 2414 y(list_index)g(=)g(0;)338 +2466 y(len)h(=)f(strlen)g(\(text\);)290 2518 y(})243 +2622 y(/*)g(Return)g(the)h(next)f(name)g(which)h(partially)e(matches)h +(from)g(the)h(command)f(list.)g(*/)p 1985 2632 21 42 +v eop +%%Page: 40 42 +40 41 bop 75 -58 a Fu(40)1299 b(GNU)15 b(Readline)i(Library)243 +183 y Ft(while)23 b(\(name)g(=)h(commands[list_index].name)o(\))290 +235 y({)338 287 y(list_index++;)338 391 y(if)g(\(strncmp)f(\(name,)g +(text,)g(len\))g(==)h(0\))386 443 y(return)f(\(dupstr\(name\)\);)290 +495 y(})243 598 y(/*)g(If)h(no)f(names)h(matched,)e(then)i(return)f +(NULL.)g(*/)243 650 y(return)g(\(\(char)g(*\)NULL\);)195 +702 y(})195 806 y(/*)h(***********************)o(*******)o(********)o +(*******)o(*******)o(********)o(****)d(*/)195 858 y(/*)1575 +b(*/)195 910 y(/*)549 b(FileMan)22 b(Commands)644 b(*/)195 +962 y(/*)1575 b(*/)195 1013 y(/*)24 b(***********************)o +(*******)o(********)o(*******)o(*******)o(********)o(****)d(*/)195 +1117 y(/*)j(String)f(to)g(pass)h(to)f(system)g(\(\).)47 +b(This)24 b(is)f(for)h(the)f(LIST,)g(VIEW)h(and)f(RENAME)267 +1169 y(commands.)f(*/)195 1221 y(static)h(char)g(syscom[1024];)195 +1325 y(/*)h(List)f(the)g(file\(s\))g(named)g(in)h(arg.)f(*/)195 +1377 y(com_list)g(\(arg\))314 1429 y(char)h(*arg;)195 +1480 y({)243 1532 y(if)f(\(!arg\))290 1584 y(arg)h(=)g("";)243 +1688 y(sprintf)f(\(syscom,)f("ls)i(-FClg)f(\045s",)g(arg\);)243 +1740 y(return)g(\(system)g(\(syscom\)\);)195 1792 y(})195 +1896 y(com_view)g(\(arg\))314 1947 y(char)h(*arg;)195 +1999 y({)243 2051 y(if)f(\(!valid_argument)f(\("view",)h(arg\)\))290 +2103 y(return)g(1;)243 2207 y(sprintf)g(\(syscom,)f("more)i(\045s",)f +(arg\);)243 2259 y(return)g(\(system)g(\(syscom\)\);)195 +2311 y(})195 2414 y(com_rename)f(\(arg\))314 2466 y(char)i(*arg;)195 +2518 y({)243 2570 y(too_dangerous)e(\("rename"\);)243 +2622 y(return)h(\(1\);)p eop +%%Page: 41 43 +41 42 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(41)195 183 y Ft(})195 287 y(com_stat)23 +b(\(arg\))314 339 y(char)h(*arg;)195 391 y({)243 443 +y(struct)f(stat)g(finfo;)243 546 y(if)g(\(!valid_argument)f(\("stat",)h +(arg\)\))290 598 y(return)g(\(1\);)243 702 y(if)g(\(stat)g(\(arg,)h +(&finfo\))f(==)g(-1\))290 754 y({)338 806 y(perror)g(\(arg\);)338 +858 y(return)g(\(1\);)290 910 y(})243 1013 y(printf)g(\("Statistics)f +(for)h(`\045s':\\n",)g(arg\);)243 1117 y(printf)g(\("\045s)g(has)h +(\045d)f(link\045s,)g(and)g(is)h(\045d)g(byte\045s)f(in)g(length.\\n",) +g(arg,)434 1169 y(finfo.st_nlink,)434 1221 y(\(finfo.st_nlink)e(==)j +(1\))g(?)f("")h(:)g("s",)434 1273 y(finfo.st_size,)434 +1325 y(\(finfo.st_size)e(==)h(1\))h(?)f("")h(:)g("s"\);)243 +1377 y(printf)f(\("Inode)g(Last)g(Change)g(at:)g(\045s",)h(ctime)f +(\(&finfo.st_ctime\)\);)243 1429 y(printf)g(\(")143 b(Last)23 +b(access)g(at:)g(\045s",)h(ctime)f(\(&finfo.st_atime\)\);)243 +1480 y(printf)g(\(")95 b(Last)23 b(modified)g(at:)g(\045s",)h(ctime)f +(\(&finfo.st_mtime\)\);)243 1532 y(return)g(\(0\);)195 +1584 y(})195 1688 y(com_delete)f(\(arg\))314 1740 y(char)i(*arg;)195 +1792 y({)243 1844 y(too_dangerous)e(\("delete"\);)243 +1896 y(return)h(\(1\);)195 1947 y(})195 2051 y(/*)h(Print)f(out)g(help) +h(for)f(ARG,)g(or)h(for)f(all)h(of)f(the)h(commands)f(if)g(ARG)h(is)267 +2103 y(not)f(present.)g(*/)195 2155 y(com_help)g(\(arg\))314 +2207 y(char)h(*arg;)195 2259 y({)243 2311 y(register)e(int)i(i;)243 +2363 y(int)f(printed)g(=)h(0;)243 2466 y(for)f(\(i)h(=)f(0;)h +(commands[i].name;)e(i++\))290 2518 y({)338 2570 y(if)i(\(!*arg)f(||)g +(\(strcmp)g(\(arg,)g(commands[i].name\))f(==)i(0\)\))386 +2622 y({)p eop +%%Page: 42 44 +42 43 bop 75 -58 a Fu(42)1299 b(GNU)15 b(Readline)i(Library)434 +183 y Ft(printf)23 b(\("\045s\\t\\t\045s.\\n",)e(commands[i].name,)h +(commands[i].doc\);)434 235 y(printed++;)386 287 y(})290 +339 y(})243 443 y(if)h(\(!printed\))290 495 y({)338 546 +y(printf)g(\("No)h(commands)e(match)h(`\045s'.)48 b(Possibilties)22 +b(are:\\n",)h(arg\);)338 650 y(for)h(\(i)f(=)h(0;)g(commands[i].name;)d +(i++\))386 702 y({)434 754 y(/*)i(Print)g(in)h(six)f(columns.)g(*/)434 +806 y(if)g(\(printed)g(==)h(6\))481 858 y({)529 910 y(printed)f(=)h(0;) +529 962 y(printf)f(\("\\n"\);)481 1013 y(})434 1117 y(printf)g +(\("\045s\\t",)f(commands[i].name\);)434 1169 y(printed++;)386 +1221 y(})338 1325 y(if)i(\(printed\))386 1377 y(printf)f(\("\\n"\);)290 +1429 y(})243 1480 y(return)g(\(0\);)195 1532 y(})195 +1636 y(/*)h(Change)f(to)g(the)h(directory)e(ARG.)i(*/)195 +1688 y(com_cd)f(\(arg\))314 1740 y(char)h(*arg;)195 1792 +y({)243 1844 y(if)f(\(chdir)g(\(arg\))h(==)f(-1\))290 +1896 y({)338 1947 y(perror)g(\(arg\);)338 1999 y(return)g(1;)290 +2051 y(})243 2155 y(com_pwd)g(\(""\);)243 2207 y(return)g(\(0\);)195 +2259 y(})195 2363 y(/*)h(Print)f(out)g(the)h(current)f(working)f +(directory.)h(*/)195 2414 y(com_pwd)g(\(ignore\))314 +2466 y(char)h(*ignore;)195 2518 y({)243 2570 y(char)f(dir[1024],)g(*s;) +p eop +%%Page: 43 45 +43 44 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(43)243 183 y Ft(s)23 b(=)h(getwd)f(\(dir\);)243 +235 y(if)g(\(s)h(==)f(0\))290 287 y({)338 339 y(printf)g(\("Error)g +(getting)g(pwd:)g(\045s\\n",)g(dir\);)338 391 y(return)g(1;)290 +443 y(})243 546 y(printf)g(\("Current)f(directory)h(is)h(\045s\\n",)f +(dir\);)243 598 y(return)g(0;)195 650 y(})195 754 y(/*)h(The)f(user)g +(wishes)g(to)h(quit)f(using)g(this)h(program.)46 b(Just)24 +b(set)f(DONE)h(non-zero.)e(*/)p 1961 764 21 42 v 195 +806 a(com_quit)h(\(arg\))314 858 y(char)h(*arg;)195 910 +y({)243 962 y(done)f(=)h(1;)243 1013 y(return)f(\(0\);)195 +1065 y(})195 1169 y(/*)h(Function)e(which)i(tells)f(you)g(that)g(you)h +(can't)f(do)h(this.)f(*/)195 1221 y(too_dangerous)f(\(caller\))314 +1273 y(char)i(*caller;)195 1325 y({)243 1377 y(fprintf)f(\(stderr,)457 +1429 y("\045s:)h(Too)f(dangerous)g(for)g(me)h(to)g(distribute.)46 +b(Write)23 b(it)h(yourself.\\n",)p 1987 1439 V 457 1480 +a(caller\);)195 1532 y(})195 1636 y(/*)g(Return)f(non-zero)f(if)i(ARG)f +(is)h(a)g(valid)f(argument)g(for)g(CALLER,)g(else)g(print)267 +1688 y(an)g(error)g(message)g(and)h(return)f(zero.)g(*/)195 +1740 y(int)195 1792 y(valid_argument)f(\(caller,)h(arg\))314 +1844 y(char)h(*caller,)e(*arg;)195 1896 y({)243 1947 +y(if)h(\(!arg)g(||)h(!*arg\))290 1999 y({)338 2051 y(fprintf)f +(\(stderr,)g("\045s:)g(Argument)g(required.\\n",)f(caller\);)338 +2103 y(return)h(\(0\);)290 2155 y(})243 2259 y(return)g(\(1\);)195 +2311 y(})p eop +%%Page: 44 46 +44 45 bop 75 -58 a Fu(44)1299 b(GNU)15 b(Readline)i(Library)p +eop +%%Page: 45 47 +45 46 bop 75 -58 a Fu(Concept)15 b(Index)1466 b(45)75 +183 y Fq(Concept)27 b(Index)75 359 y Fs(C)75 417 y Ff(command)14 +b(editing)9 b Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 +b Ff(1)75 517 y Fs(E)75 575 y Ff(editing)15 b(command)f(lines)8 +b Fe(.)f(.)f(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(1)75 675 +y Fs(I)75 733 y Ff(initiali)q(zati)q(on)c(\014le,)e(readline)8 +b Fe(.)g(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(3)75 782 y(in)o(teraction,)15 +b(readline)e Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 +b Ff(1)75 882 y Fs(K)75 940 y Ff(kill)15 b(ring)e Fe(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)24 b Ff(2)1012 359 y(killin)q(g)16 b(text)11 +b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)24 b Ff(2)1012 495 y Fs(N)1012 553 y Ff(notation,)15 +b(readline)5 b Fe(.)k(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +19 b Ff(1)1012 688 y Fs(R)1012 747 y Ff(readline,)c(function)6 +b Fe(.)i(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)19 +b Ff(19)1012 882 y Fs(Y)1012 940 y Ff(y)o(anking)c(text)6 +b Fe(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)19 b Ff(2)p eop +%%Page: 46 48 +46 47 bop 75 -58 a Fu(46)1299 b(GNU)15 b(Readline)i(Library)p +eop +%%Page: 47 49 +47 48 bop 75 -58 a Fu(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187 +b(47)75 183 y Fq(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26 +b(Index)75 345 y Fs(\()75 403 y Fd(\(int)10 b Fe(.)c(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)24 b Ff(27)75 513 y Fs(A)75 571 y Fd(abort)11 b(\(C-g\))6 +b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)18 b Ff(15)75 621 y Fd(accept-lin)o(e)10 b(\(Newline)o(,)g(Return\)) +s Fe(.)s(.)c(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 +b Ff(11)75 671 y Fd(alphabetic)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(28)75 +781 y Fs(B)75 839 y Fd(backward-c)o(ha)o(r)10 b(\(C-b\))t +Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(11)75 889 +y Fd(backward-d)o(el)o(ete)o(-c)o(har)9 b(\(Rubout\))f +Fe(.)s(.)e(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 +b Ff(12)75 939 y Fd(backward-k)o(il)o(l-l)o(in)o(e)10 +b(\(C-x)h(Rubout\))e Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +22 b Ff(13)75 989 y Fd(backward-k)o(il)o(l-w)o(or)o(d)10 +b(\(M-DEL\))t Fe(.)s(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)16 b Ff(14)75 1038 y Fd(backward-w)o(or)o(d)10 +b(\(M-b\))t Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(11)75 +1088 y Fd(beginning-)o(of)o(-hi)o(st)o(ory)9 b(\(M-<\))t +Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)16 b Ff(11)75 1138 y Fd(beginning-)o(of)o(-li)o(ne)9 +b(\(C-a\))e Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(11)75 1188 y(b)q(ell-st)o(yle)13 +b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)23 b Ff(4)75 1298 y Fs(C)75 1356 +y Fd(call-last-)o(kb)o(d-m)o(ac)o(ro)9 b(\(C-x)j(e\))6 +b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +18 b Ff(15)75 1406 y Fd(capitalize)o(-w)o(ord)9 b(\(M-c\))f +Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(13)75 1456 y Fd(character-)o(se)o(arc)o +(h)10 b(\(C-]\))f Fe(.)s(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 b Ff(16)75 1506 +y Fd(character-)o(se)o(arc)o(h-)o(bac)o(kwa)o(rd)9 b(\(M-C-]\))s +Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(16)75 +1555 y Fd(clear-scre)o(en)9 b(\(C-l\))c Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)18 b Ff(11)75 1605 y(commen)o(t-b)q(egin)9 b +Fe(.)f(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)21 +b Ff(4)75 1655 y Fd(complete)10 b(\(TAB\))e Fe(.)e(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(15)75 1705 y(completion-query-i)q +(tems)9 b Fe(.)f(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(4)75 +1755 y Fd(completion)p 276 1755 12 2 v 10 w(matches)5 +b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)17 b Ff(32)75 +1804 y(con)o(v)o(ert-meta)11 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(4)75 1854 y Fd(copy-backw)o(ar) +o(d-w)o(or)o(d)10 b(\(\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 +b Ff(14)75 1904 y Fd(copy-forwa)o(rd)o(-wo)o(rd)9 b(\(\))i +Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(14)75 1954 y Fd(copy-regio)o(n-)o +(as-)o(ki)o(ll)9 b(\(\))g Fe(.)c(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 b Ff(14)75 +2064 y Fs(D)75 2122 y Fd(delete-cha)o(r)10 b(\(C-d\))c +Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Ff(12)75 +2172 y Fd(delete-hor)o(iz)o(ont)o(al)o(-sp)o(ace)9 b(\(\))t +Fe(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)16 b Ff(14)75 2222 y Fd(digit-argu)o(me)o(nt)9 b(\(M-0,)i(M-1,)h +(...)f(M--\))t Fe(.)t(.)6 b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)16 +b Ff(14)75 2271 y Fd(digit)p 177 2271 V 12 w(p)10 b Fe(.)c(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 +b Ff(28)75 2321 y Fd(digit)p 177 2321 V 12 w(value)5 +b Fe(.)t(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)18 b Ff(28)75 2371 y Fd(ding)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 +b Ff(28)75 2421 y(disable-comple)q(tion)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(5)75 2471 y Fd(do-upperca)o(se)o(-ve)o +(rs)o(ion)9 b(\(M-a,)i(M-b,)g(M-)p Fe(x)p Fd(,)h Fc(:)6 +b(:)g(:)p Fd(\))j Fe(.)d(.)23 b Ff(16)75 2521 y Fd(downcase-w)o(or)o(d) +10 b(\(M-l\))t Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(13)75 2570 y Fd(dump-funct)o(io)o(ns)9 b(\(\))d +Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 b Ff(16)75 +2620 y Fd(dump-macro)o(s)10 b(\(\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)23 b Ff(16)75 2670 y Fd(dump-varia)o(bl)o(es)9 +b(\(\))d Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 +b Ff(16)1012 345 y Fs(E)1012 403 y Ff(editing-mo)q(de)13 +b Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)23 b Ff(5)1012 453 y(enable-k)o(eypad)13 b Fe(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)22 +b Ff(5)1012 503 y Fd(end-kbd-mac)o(ro)9 b(\(C-x)i(\)\))5 +b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(15)1012 553 y Fd(end-of-hist)o(or)o +(y)10 b(\(M->\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(12)1012 +603 y Fd(end-of-line)9 b(\(C-e\))d Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)20 b Ff(11)1012 652 y Fd(exchange-po)o(in)o(t-a)o(nd)o(-ma)o +(rk)9 b(\(C-x)j(C-x\))7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 +b Ff(16)1012 702 y(expand-tilde)8 b Fe(.)h(.)d(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)20 b Ff(5)1012 +811 y Fs(F)1012 869 y Fd(filename)p 1174 869 V 11 w(completion)p +1385 869 V 11 w(function)s Fe(.)s(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)16 b Ff(32)1012 919 y Fd(forward-cha)o(r)10 +b(\(C-f\))5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 +b Ff(11)1012 969 y Fd(forward-sea)o(rc)o(h-h)o(is)o(tor)o(y)10 +b(\(C-s\))d Fe(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)23 b Ff(12)1012 1019 y Fd(forward-wor)o(d)10 b(\(M-f\))5 +b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 b Ff(11)1012 +1069 y Fd(free)p 1094 1069 V 13 w(undo)p 1187 1069 V +13 w(list)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)17 b Ff(26)1012 1178 y Fs(H)1012 1236 y Fd(history-sea)o(rc)o(h-b)o +(ac)o(kwa)o(rd)9 b(\(\))t Fe(.)c(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(12)1012 1286 y Fd(history-sea)o(rc) +o(h-f)o(or)o(war)o(d)10 b(\(\))5 b Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(12)1012 +1336 y(horizon)o(tal-scrol)q(l-mo)r(de)c Fe(.)6 b(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)24 b Ff(5)1012 1445 y Fs(I)1012 1503 y Ff(input-meta)12 +b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)23 b Ff(5)1012 1553 y Fd(insert-comm)o(en)o(t)10 +b(\(M-#\))f Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(16)1012 +1602 y Fd(insert-comp)o(le)o(tio)o(ns)9 b(\(M-*\))d Fe(.)t(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 +b Ff(15)1012 1712 y Fs(K)1012 1770 y Ff(k)o(eymap)t Fe(.)7 +b(.)g(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)17 b Ff(5)1012 1820 y Fd(kill-line)10 +b(\(C-k\))f Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 +b Ff(13)1012 1869 y Fd(kill-region)9 b(\(\))g Fe(.)e(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(14)1012 1919 y +Fd(kill-whole-)o(li)o(ne)9 b(\(\))c Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)18 b Ff(13)1012 1969 y Fd(kill-word)10 b(\(M-d\))f +Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)22 +b Ff(14)1012 2078 y Fs(L)1012 2136 y Fd(lowercase)p 1194 +2136 V 11 w(p)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)18 b Ff(28)1012 2245 y Fs(M)1012 2303 +y Ff(mark-mo)q(di\014ed-li)q(nes)6 b Fe(.)j(.)d(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)18 b Ff(5)1012 2353 y Fd(menu-comple)o(te)9 +b(\(\))f Fe(.)d(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)21 +b Ff(15)1012 2403 y(meta-\015ag)8 b Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 +b Ff(5)1012 2512 y Fs(N)1012 2570 y Fd(next-histor)o(y)10 +b(\(C-n\))5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)18 +b Ff(11)1012 2620 y Fd(non-increme)o(nt)o(al-)o(fo)o(rwa)o(rd)o(-se)o +(arc)o(h-)o(his)o(to)o(ry)10 b(\(M-n\))1093 2670 y Fe(.)c(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)17 b Ff(12)p eop +%%Page: 48 50 +48 49 bop 75 -58 a Fu(48)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Fd(non-increm)o(en)o(tal)o(-r)o(eve)o(rse)o(-s)o(ear)o(ch)o(-hi)o +(st)o(ory)9 b(\(M-p\))155 233 y Fe(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)16 +b Ff(12)75 283 y Fd(numeric)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b +Ff(28)75 386 y Fs(O)75 444 y Ff(output-meta)7 b Fe(.)g(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 +b Ff(6)75 547 y Fs(P)75 605 y Fd(possible-c)o(om)o(ple)o(ti)o(ons)9 +b(\(M-?\))t Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)16 b Ff(15)75 655 y Fd(prefix-met)o(a)10 +b(\(ESC\))c Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 +b Ff(16)75 704 y Fd(previous-h)o(is)o(tor)o(y)10 b(\(C-p\))f +Fe(.)s(.)d(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)21 b Ff(11)75 807 y Fs(Q)75 865 y +Fd(quoted-ins)o(er)o(t)10 b(\(C-q,)h(C-v\))d Fe(.)e(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)22 +b Ff(13)75 968 y Fs(R)75 1026 y Fd(re-read-in)o(it)o(-fi)o(le)9 +b(\(C-x)i(C-r\))6 b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)18 b Ff(15)75 1076 y Fd(readline)6 +b Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)19 b Ff(19)75 1126 y Fd(redraw-cur)o(re)o(nt-)o(li)o(ne) +9 b(\(\))g Fe(.)c(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)21 b Ff(11)75 1176 y Fd(reverse-se)o(ar) +o(ch-)o(hi)o(sto)o(ry)9 b(\(C-r\))f Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)22 b Ff(12)75 1225 y Fd(revert-lin)o(e)10 +b(\(M-r\))c Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)19 +b Ff(16)75 1275 y Fd(rl)p 117 1275 12 2 v 13 w(add)p +190 1275 V 13 w(defun)6 b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(23)75 1325 y Fd(rl)p 117 +1325 V 13 w(add)p 190 1325 V 13 w(undo)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)20 b Ff(26)75 +1375 y Fd(rl)p 117 1375 V 13 w(attempted)p 310 1375 V +11 w(completion)p 520 1375 V 10 w(function)h Fe(.)6 b(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)24 b Ff(32)75 1425 y Fd(rl)p 117 1425 +V 13 w(basic)p 230 1425 V 13 w(quote)p 343 1425 V 12 +w(character)o(s)13 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(33)75 1474 y Fd(rl)p +117 1474 V 13 w(basic)p 230 1474 V 13 w(word)p 323 1474 +V 12 w(break)p 435 1474 V 12 w(characters)h Fe(.)6 b(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(33)75 1524 y Fd(rl)p +117 1524 V 13 w(begin)p 230 1524 V 13 w(undo)p 323 1524 +V 12 w(group)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 +b Ff(26)75 1574 y Fd(rl)p 117 1574 V 13 w(bind)p 210 +1574 V 13 w(key)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)20 b Ff(24)75 1624 y Fd(rl)p 117 +1624 V 13 w(bind)p 210 1624 V 13 w(key)p 283 1624 V 13 +w(in)p 336 1624 V 13 w(map)t Fe(.)5 b(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)17 b Ff(24)75 1674 y Fd(rl)p 117 1674 V 13 w(binding)p +270 1674 V 12 w(keymap)k Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)23 +b Ff(22)75 1724 y Fd(rl)p 117 1724 V 13 w(callback)p +290 1724 V 11 w(handler)p 441 1724 V 12 w(install)7 b +Fe(.)s(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 +b Ff(28)75 1773 y Fd(rl_callbac)o(k_)o(han)o(dl)o(er_)o(rem)o(ov)o(e)9 +b Fe(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +21 b Ff(29)75 1823 y Fd(rl_callbac)o(k_)o(rea)o(d_)o(cha)o(r)6 +b Fe(.)s(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)19 b Ff(29)75 1873 y Fd(rl)p +117 1873 V 13 w(char)p 210 1873 V 13 w(is)p 263 1873 +V 13 w(quoted)p 396 1873 V 12 w(p)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)18 b Ff(33)75 1923 y Fd(rl)p 117 1923 V 13 w(clear)p +230 1923 V 13 w(message)7 b Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)22 b Ff(27)75 1973 y Fd(rl)p 117 1973 V 13 w(complete)5 +b Fe(.)s(.)h(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)18 b Ff(31)75 2022 y Fd(rl)p 117 2022 V 13 w(complete)p +290 2022 V 11 w(internal)5 b Fe(.)s(.)h(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 +b Ff(31)75 2072 y Fd(rl)p 117 2072 V 13 w(completer)p +310 2072 V 11 w(quote)p 421 2072 V 12 w(characters)f +Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)19 +b Ff(33)75 2122 y Fd(rl)p 117 2122 V 13 w(completer)p +310 2122 V 11 w(word)p 401 2122 V 13 w(break)p 514 2122 +V 12 w(character)o(s)13 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 +b Ff(33)75 2172 y Fd(rl)p 117 2172 V 13 w(completion)p +329 2172 V 11 w(append)p 461 2172 V 11 w(character)f +Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)18 +b Ff(34)75 2222 y Fd(rl)p 117 2222 V 13 w(completion)p +329 2222 V 11 w(entry)p 441 2222 V 12 w(function)j Fe(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(31,)13 +b(32)75 2271 y Fd(rl)p 117 2271 V 13 w(completion)p 329 +2271 V 11 w(query)p 441 2271 V 12 w(items)h Fe(.)6 b(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 +b Ff(33)75 2321 y Fd(rl)p 117 2321 V 13 w(copy)p 210 +2321 V 13 w(keymap)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)17 b Ff(23)75 2371 y Fd(rl)p 117 2371 V 13 +w(copy)p 210 2371 V 13 w(text)6 b Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(27)75 2421 y Fd(rl)p +117 2421 V 13 w(delete)p 250 2421 V 12 w(text)t Fe(.)5 +b(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(27)75 2471 y Fd(rl)p 117 2471 V 13 w(directory)p +310 2471 V 11 w(completion)p 520 2471 V 10 w(hook)i Fe(.)7 +b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 +b Ff(34)75 2521 y Fd(rl)p 117 2521 V 13 w(discard)p 270 +2521 V 12 w(keymap)9 b Fe(.)s(.)d(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 +b Ff(23)75 2570 y Fd(rl)p 117 2570 V 13 w(do)p 170 2570 +V 14 w(undo)9 b Fe(.)t(.)d(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)22 b Ff(26)75 2620 y Fd(rl)p 117 +2620 V 13 w(done)15 b Fe(.)6 b(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)16 b Ff(21)75 +2670 y Fd(rl)p 117 2670 V 13 w(end)h Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 +b Ff(21)1012 183 y Fd(rl)p 1054 183 V 14 w(end)p 1128 +183 V 13 w(undo)p 1221 183 V 12 w(group)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)25 b Ff(26)1012 233 y Fd(rl)p 1054 233 +V 14 w(event)p 1168 233 V 12 w(hook)18 b Fe(.)7 b(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(22)1012 283 y +Fd(rl)p 1054 283 V 14 w(executing)p 1247 283 V 10 w(keymap)e +Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 b Ff(22)1012 333 y +Fd(rl)p 1054 333 V 14 w(filename)p 1228 333 V 11 w(completio)o(n)p +1438 333 V 11 w(desired)16 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)19 b Ff(34)1012 382 y Fd(rl)p 1054 382 +V 14 w(filename)p 1228 382 V 11 w(dequoting)p 1418 382 +V 10 w(function)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)19 b Ff(33)1012 432 y Fd(rl)p 1054 432 V 14 w(filename)p +1228 432 V 11 w(quote)p 1339 432 V 12 w(character)o(s)f +Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 +b Ff(33)1012 482 y Fd(rl)p 1054 482 V 14 w(filename)p +1228 482 V 11 w(quoting)p 1379 482 V 11 w(desired)f Fe(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 +b Ff(34)1012 532 y Fd(rl)p 1054 532 V 14 w(filename)p +1228 532 V 11 w(quoting)p 1379 532 V 11 w(function)18 +b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 +b Ff(32)1012 582 y Fd(rl)p 1054 582 V 14 w(forced)p 1188 +582 V 12 w(update)p 1320 582 V 11 w(display)9 b Fe(.)d(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 +b Ff(26)1012 632 y Fd(rl)p 1054 632 V 14 w(function)p +1228 632 V 11 w(dumper)7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 +b Ff(25)1012 681 y Fd(rl)p 1054 681 V 14 w(function)p +1228 681 V 11 w(of)p 1279 681 V 13 w(keyseq)6 b Fe(.)t(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)19 b Ff(25)1012 731 y Fd(rl)p 1054 731 V 14 w(generic)p +1208 731 V 11 w(bind)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)24 b Ff(24)1012 781 y Fd(rl)p 1054 781 V 14 w(get)p +1128 781 V 13 w(keymap)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)18 b Ff(23)1012 831 y Fd(rl)p 1054 +831 V 14 w(get)p 1128 831 V 13 w(keymap)p 1261 831 V +11 w(by)p 1312 831 V 14 w(name)9 b Fe(.)t(.)d(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)22 +b Ff(24)1012 881 y Fd(rl)p 1054 881 V 14 w(get)p 1128 +881 V 13 w(keymap)p 1261 881 V 11 w(name)9 b Fe(.)d(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)23 b Ff(24)1012 930 y Fd(rl)p 1054 930 V +14 w(getc)8 b Fe(.)e(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)23 b Ff(27)1012 980 y +Fd(rl)p 1054 980 V 14 w(getc)p 1148 980 V 12 w(function)13 +b Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(22)1012 1030 y Fd(rl)p 1054 1030 V 14 w(ignore)p +1188 1030 V 12 w(completi)o(on)p 1399 1030 V 11 w(duplicate)o(s)d +Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)17 +b Ff(34)1012 1080 y Fd(rl)p 1054 1080 V 14 w(ignore)p +1188 1080 V 12 w(some)p 1280 1080 V 12 w(completion)o(s)p +1511 1080 V 11 w(function)j Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)24 +b Ff(34)1012 1130 y Fd(rl)p 1054 1130 V 14 w(inhibit)p +1208 1130 V 11 w(completion)15 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 +b Ff(34)1012 1180 y Fd(rl)p 1054 1180 V 14 w(initializ)o(e)8 +b Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)24 +b Ff(28)1012 1229 y Fd(rl)p 1054 1229 V 14 w(insert)p +1188 1229 V 12 w(completi)o(ons)r Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(31)1012 1279 y Fd(rl)p 1054 1279 V 14 w(insert)p +1188 1279 V 12 w(text)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)17 b Ff(27)1012 1329 y Fd(rl)p 1054 1329 +V 14 w(instream)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)20 b Ff(22)1012 1379 y Fd(rl)p 1054 1379 +V 14 w(invoking)p 1228 1379 V 11 w(keyseqs)6 b Fe(.)s(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)19 b Ff(25)1012 1429 y Fd(rl)p 1054 1429 +V 14 w(invoking)p 1228 1429 V 11 w(keyseqs)p 1379 1429 +V 11 w(in)p 1430 1429 V 14 w(map)9 b Fe(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)24 b Ff(25)1012 +1478 y Fd(rl)p 1054 1478 V 14 w(kill)p 1148 1478 V 12 +w(text)6 b Fe(.)f(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)20 b Ff(27)1012 1528 y Fd(rl)p 1054 1528 V 14 +w(library)p 1208 1528 V 11 w(version)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)23 b Ff(22)1012 1578 y Fd(rl)p 1054 1578 V 14 w(line)p +1148 1578 V 12 w(buffer)17 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)f(.)g(.)g(.)19 b Ff(21)1012 1628 y Fd(rl)p 1054 1628 +V 14 w(list)p 1148 1628 V 12 w(funmap)p 1280 1628 V 12 +w(names)7 b Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(25)1012 +1678 y Fd(rl)p 1054 1678 V 14 w(make)p 1148 1678 V 12 +w(bare)p 1240 1678 V 13 w(keymap)9 b Fe(.)s(.)d(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +22 b Ff(23)1012 1727 y Fd(rl)p 1054 1727 V 14 w(make)p +1148 1727 V 12 w(keymap)t Fe(.)t(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)17 b Ff(23)1012 1777 y Fd(rl)p 1054 1777 +V 14 w(mark)e Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(21)1012 1827 +y Fd(rl)p 1054 1827 V 14 w(message)6 b Fe(.)s(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)19 b Ff(27)1012 +1877 y Fd(rl)p 1054 1877 V 14 w(modifying)s Fe(.)s(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(26)1012 1927 y Fd(rl)p 1054 1927 V 14 w(named)p +1168 1927 V 12 w(function)8 b Fe(.)s(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)22 b Ff(25)1012 1977 y Fd(rl)p 1054 1977 V 14 w(on)p +1108 1977 V 13 w(new)p 1181 1977 V 13 w(line)7 b Fe(.)t(.)f(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(27)1012 2026 +y Fd(rl)p 1054 2026 V 14 w(outstream)15 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(22)1012 2076 +y Fd(rl)p 1054 2076 V 14 w(parse)p 1168 2076 V 12 w(and)p +1240 2076 V 13 w(bind)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +25 b Ff(25)1012 2126 y Fd(rl)p 1054 2126 V 14 w(pending)p +1208 2126 V 11 w(input)14 b Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)17 b Ff(21)1012 2176 y Fd(rl)p 1054 2176 V 14 +w(point)k Fe(.)7 b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)24 b Ff(21)1012 2226 y Fd(rl)p 1054 +2226 V 14 w(possible)p 1228 2226 V 11 w(completio)o(ns)6 +b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)23 b Ff(31)1012 2275 y Fd(rl)p 1054 2275 +V 14 w(prompt)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(22)1012 2325 y Fd(rl)p +1054 2325 V 14 w(read)p 1148 2325 V 12 w(init)p 1240 +2325 V 13 w(file)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)25 +b Ff(25)1012 2375 y Fd(rl)p 1054 2375 V 14 w(read)p 1148 +2375 V 12 w(key)8 b Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)21 b Ff(27)1012 2425 y Fd(rl)p 1054 +2425 V 14 w(readline)p 1228 2425 V 11 w(name)14 b Fe(.)7 +b(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Ff(22)1012 +2475 y Fd(rl)p 1054 2475 V 14 w(redisplay)s Fe(.)s(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(26)1012 2524 y Fd(rl)p 1054 2524 V 14 w(redisplay)p +1247 2524 V 10 w(function)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 +b Ff(22)1012 2574 y Fd(rl)p 1054 2574 V 14 w(reset)p +1168 2574 V 12 w(line)p 1260 2574 V 12 w(state)9 b Fe(.)t(.)d(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)g(.)22 b Ff(27)1012 2624 y Fd(rl)p 1054 2624 +V 14 w(reset)p 1168 2624 V 12 w(terminal)8 b Fe(.)s(.)f(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)22 b Ff(28)p eop +%%Page: 49 51 +49 50 bop 75 -58 a Fu(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187 +b(49)75 183 y Fd(rl)p 117 183 12 2 v 13 w(set)p 190 183 +V 13 w(keymap)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)18 b Ff(24)75 233 y Fd(rl)p 117 233 V 13 w(special)p +270 233 V 12 w(prefixes)g Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)21 +b Ff(33)75 283 y Fd(rl)p 117 283 V 13 w(startup)p 270 +283 V 12 w(hook)16 b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)17 b Ff(22)75 333 y Fd(rl)p 117 333 V 13 w(stuff)p +230 333 V 13 w(char)5 b Fe(.)t(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)18 b Ff(27)75 382 y Fd(rl)p 117 382 V +13 w(terminal)p 290 382 V 11 w(name)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)16 b Ff(22)75 432 y Fd(rl)p 117 432 V +13 w(unbind)p 250 432 V 12 w(command)p 402 432 V 12 w(in)p +454 432 V 13 w(map)5 b Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(24)75 +482 y Fd(rl)p 117 482 V 13 w(unbind)p 250 482 V 12 w(function)p +422 482 V 11 w(in)p 473 482 V 14 w(map)t Fe(.)t(.)6 b(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(24)75 532 y Fd(rl)p 117 532 V 13 w(unbind)p 250 +532 V 12 w(key)5 b Fe(.)g(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)18 b Ff(24)75 582 y Fd(rl)p 117 582 V 13 +w(unbind)p 250 582 V 12 w(key)p 322 582 V 13 w(in)p 375 +582 V 13 w(map)10 b Fe(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 +b Ff(24)75 681 y Fs(S)75 739 y Fd(self-inser)o(t)10 b(\(a,)h(b,)h(A,)g +(1,)g(!,)g(...\))t Fe(.)5 b(.)h(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)17 b Ff(13)75 789 y Fd(set-mark)10 b(\(C-@\))e Fe(.)e(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(16)75 839 +y(sho)o(w-all-if-am)o(biguo)q(us)7 b Fe(.)i(.)d(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)19 b Ff(6)75 889 y Fd(start-kbd-)o(ma)o(cro)9 b(\(C-x)i(\(\))f +Fe(.)c(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)23 b Ff(15)75 989 y Fs(T)75 1047 y Fd(tab-insert)9 +b(\(M-TAB\))c Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 +b Ff(13)75 1096 y Fd(tilde-expa)o(nd)9 b(\(M-~\))c Fe(.)g(.)h(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)18 b Ff(16)75 1146 y Fd(to)p 117 +1146 V 13 w(lower)9 b Fe(.)t(.)d(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 b Ff(28)75 1196 +y Fd(to)p 117 1196 V 13 w(upper)9 b Fe(.)t(.)d(.)g(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)21 b +Ff(28)1012 183 y Fd(transpose-c)o(ha)o(rs)9 b(\(C-t\))f +Fe(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(13)1012 233 y Fd(transpose-w)o(or)o(ds)9 +b(\(M-t\))f Fe(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)23 b Ff(13)1012 347 +y Fs(U)1012 405 y Fd(undo)12 b(\(C-)p 1166 405 V 13 w(,)g(C-x)g(C-u\))5 +b Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)18 b Ff(16)1012 +454 y Fd(universal-a)o(rg)o(ume)o(nt)9 b(\(\))g Fe(.)d(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.) +23 b Ff(14)1012 504 y Fd(unix-line-d)o(is)o(car)o(d)10 +b(\(C-u\))d Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)21 b Ff(13)1012 554 y Fd(unix-word-r)o(ub)o +(out)9 b(\(C-w\))g Fe(.)t(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)22 b Ff(14)1012 +604 y Fd(upcase-word)9 b(\(M-u\))d Fe(.)f(.)h(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)20 b Ff(13)1012 654 y Fd(uppercase)p 1194 654 +V 11 w(p)5 b Fe(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)18 b Ff(28)1012 704 y Fd(username)p 1174 +704 V 11 w(completion)p 1385 704 V 11 w(function)s Fe(.)s(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)16 +b Ff(32)1012 817 y Fs(V)1012 875 y Ff(visible-stats)t +Fe(.)9 b(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)17 b Ff(6)1012 989 y Fs(Y)1012 1047 y Fd(yank)12 +b(\(C-y\))7 b Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f +(.)g(.)g(.)g(.)g(.)20 b Ff(14)1012 1096 y Fd(yank-last-a)o(rg)9 +b(\(M-.,)i(M-)p 1433 1096 V 13 w(\))t Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(12)1012 1146 y Fd(yank-nth-ar)o(g)10 b(\(M-C-y\))e +Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)24 b Ff(12)1012 1196 y Fd(yank-pop)10 +b(\(M-y\))e Fe(.)f(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 +b Ff(14)p eop +%%Page: 50 52 +50 51 bop 75 -58 a Fu(50)1299 b(GNU)15 b(Readline)i(Library)p +eop +%%Page: -1 53 +-1 52 bop 1862 -58 a Fu(i)75 183 y Fq(T)-7 b(able)27 +b(of)f(Con)n(ten)n(ts)75 354 y Fs(1)67 b(Command)22 b(Line)i(Editing)d +Fb(.)10 b(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h +(.)f(.)g(.)g(.)42 b Fs(1)224 423 y Fu(1.1)j(In)o(tro)q(duction)16 +b(to)f(Line)h(Editing)e Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)27 b Fu(1)224 478 y(1.2)45 b(Readline)17 b(In)o(teraction)8 +b Fa(.)g(.)g(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)23 b Fu(1)374 532 y(1.2.1)44 b(Readline)17 +b(Bare)e(Essen)o(tials)f Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 +b Fu(1)374 587 y(1.2.2)44 b(Readline)17 b(Mo)o(v)o(emen)o(t)d(Commands) +7 b Fa(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f +(.)h(.)21 b Fu(2)374 642 y(1.2.3)44 b(Readline)17 b(Killing)h(Commands) +11 b Fa(.)c(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)h(.)f(.)h(.)25 b Fu(2)374 697 y(1.2.4)44 b(Readline)17 +b(Argumen)o(ts)12 b Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 +b Fu(3)374 752 y(1.2.5)44 b(Searc)o(hing)16 b(for)e(Commands)h(in)h +(the)f(History)e Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)27 +b Fu(3)224 806 y(1.3)45 b(Readline)17 b(Init)g(File)e +Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)29 b Fu(3)374 861 y(1.3.1)44 b(Readline)17 +b(Init)f(File)h(Syn)o(tax)7 b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 +b Fu(4)374 916 y(1.3.2)44 b(Conditional)16 b(Init)g(Constructs)5 +b Fa(.)i(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)g(.)f(.)19 b Fu(7)374 971 y(1.3.3)44 b(Sample)16 +b(Init)g(File)11 b Fa(.)e(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)26 b Fu(8)224 1026 y(1.4)45 b(Bindable)17 b(Readline)h +(Commands)6 b Fa(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 +b Fu(11)374 1080 y(1.4.1)44 b(Commands)14 b(F)l(or)h(Mo)o(ving)e +Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 b Fu(11)374 1135 y(1.4.2)44 +b(Commands)14 b(F)l(or)h(Manipulating)i(The)e(History)9 +b Fa(.)e(.)h(.)f(.)h(.)f(.)h(.)24 b Fu(11)374 1190 y(1.4.3)44 +b(Commands)14 b(F)l(or)h(Changing)h(T)l(ext)e Fa(.)8 +b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30 +b Fu(12)374 1245 y(1.4.4)44 b(Killing)18 b(And)e(Y)l(anking)9 +b Fa(.)e(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)24 b Fu(13)374 +1299 y(1.4.5)44 b(Sp)q(ecifying)17 b(Numeric)f(Argumen)o(ts)c +Fa(.)c(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)27 +b Fu(14)374 1354 y(1.4.6)44 b(Letting)15 b(Readline)j(T)o(yp)q(e)d(F)l +(or)g(Y)l(ou)10 b Fa(.)d(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)25 b Fu(15)374 1409 y(1.4.7)44 b(Keyb)q(oard)15 +b(Macros)6 b Fa(.)h(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 +b Fu(15)374 1464 y(1.4.8)44 b(Some)15 b(Miscellaneous)i(Commands)7 +b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +22 b Fu(15)224 1519 y(1.5)45 b(Readline)17 b(vi)f(Mo)q(de)e +Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)28 b Fu(17)75 1640 y Fs(2)67 b(Programming)23 +b(with)g(GNU)f(Readline)12 b Fb(.)f(.)g(.)f(.)g(.)g(.)g(.)h(.)f(.)35 +b Fs(19)224 1708 y Fu(2.1)45 b(Basic)16 b(Beha)o(vior)8 +b Fa(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fu(19)224 1763 y(2.2)45 +b(Custom)14 b(F)l(unctions)7 b Fa(.)i(.)f(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)22 b Fu(20)374 +1818 y(2.2.1)44 b(The)15 b(F)l(unction)h(T)o(yp)q(e)11 +b Fa(.)d(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 b Fu(20)374 +1873 y(2.2.2)44 b(W)l(riting)16 b(a)e(New)i(F)l(unction)6 +b Fa(.)i(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)21 b Fu(21)224 1928 y(2.3)45 +b(Readline)17 b(V)l(ariables)f Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)29 b Fu(21)224 +1982 y(2.4)45 b(Readline)17 b(Con)o(v)o(enience)g(F)l(unctions)7 +b Fa(.)i(.)e(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)23 b Fu(23)374 2037 y(2.4.1)44 +b(Naming)15 b(a)g(F)l(unction)e Fa(.)7 b(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)27 b Fu(23)374 2092 y(2.4.2)44 b(Selecting)17 +b(a)e(Keymap)6 b Fa(.)h(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)21 +b Fu(23)374 2147 y(2.4.3)44 b(Binding)17 b(Keys)5 b Fa(.)j(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)20 b +Fu(24)374 2202 y(2.4.4)44 b(Asso)q(ciating)16 b(F)l(unction)g(Names)f +(and)g(Bindings)8 b Fa(.)h(.)f(.)f(.)h(.)f(.)h(.)23 b +Fu(25)374 2256 y(2.4.5)44 b(Allo)o(wing)16 b(Undoing)f +Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)29 b +Fu(25)374 2311 y(2.4.6)44 b(Redispla)o(y)10 b Fa(.)f(.)f(.)g(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)26 +b Fu(26)374 2366 y(2.4.7)44 b(Mo)q(difying)16 b(T)l(ext)7 +b Fa(.)g(.)g(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.) +f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)22 +b Fu(27)374 2421 y(2.4.8)44 b(Utilit)o(y)16 b(F)l(unctions)e +Fa(.)7 b(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)28 +b Fu(27)374 2475 y(2.4.9)44 b(Alternate)15 b(In)o(terface)5 +b Fa(.)i(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)20 b +Fu(28)374 2530 y(2.4.10)43 b(An)16 b(Example)f Fa(.)8 +b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)30 +b Fu(29)224 2585 y(2.5)45 b(Custom)14 b(Completers)f +Fa(.)8 b(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h +(.)f(.)28 b Fu(30)374 2640 y(2.5.1)44 b(Ho)o(w)14 b(Completing)i(W)l +(orks)10 b Fa(.)d(.)g(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h +(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)25 b Fu(30)p eop +%%Page: -2 54 +-2 53 bop 75 -58 a Fu(ii)1321 b(GNU)15 b(Readline)i(Library)374 +42 y(2.5.2)44 b(Completion)16 b(F)l(unctions)6 b Fa(.)i(.)g(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)h(.)21 b Fu(31)374 96 y(2.5.3)44 b(Completion)16 +b(V)l(ariables)c Fa(.)c(.)f(.)h(.)g(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f +(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)27 +b Fu(32)374 151 y(2.5.4)44 b(A)15 b(Short)g(Completion)h(Example)5 +b Fa(.)j(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.)h(.)f(.) +h(.)f(.)20 b Fu(34)75 272 y Fs(Concept)i(Index)10 b Fb(.)i(.)e(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)33 b Fs(45)75 407 +y(F)-6 b(unction)25 b(and)d(V)-6 b(ariable)24 b(Index)9 +b Fb(.)i(.)f(.)g(.)h(.)f(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)32 b Fs(47)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/readline/doc/readline_toc.html b/readline/doc/readline_toc.html new file mode 100644 index 00000000000..bf6d5d1fc76 --- /dev/null +++ b/readline/doc/readline_toc.html @@ -0,0 +1,77 @@ + + + + +GNU Readline Library - Table of Contents + + +

    GNU Readline Library

    +

    Edition 2.2, for Readline Library Version 2.1.

    +

    September 1997

    +
    Brian Fox, Free Software Foundation
    +
    Chet Ramey, Case Western Reserve University
    +

    +


    +

    +


    +This document was generated on 2 April 1998 using the +texi2html +translator version 1.51.

    + + diff --git a/readline/doc/rlman.texinfo b/readline/doc/rlman.texinfo index f2e7fb6db91..dd6478af5a2 100644 --- a/readline/doc/rlman.texinfo +++ b/readline/doc/rlman.texinfo @@ -6,12 +6,26 @@ @synindex vr fn @setchapternewpage odd +@ignore +last change: Thu Apr 2 14:39:03 EST 1998 +@end ignore + +@set EDITION 2.2 +@set VERSION 2.2 +@set UPDATED 2 April 1998 +@set UPDATE-MONTH April 1998 + +@dircategory Libraries +@direntry +* Readline: (readline). The GNU readline library API +@end direntry + @ifinfo This document describes the GNU Readline Library, a utility which aids in the consistency of user interface across discrete programs that need to provide a command line interface. -Copyright (C) 1988, 1991 Free Software Foundation, Inc. +Copyright (C) 1988, 1991, 1993, 1996, 1998 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -35,13 +49,12 @@ except that this permission notice may be stated in a translation approved by the Foundation. @end ifinfo -@titlepage -@sp 10 -@center @titlefont{GNU Readline Library} -@center Brian Fox -@center Free Software Foundation -@center Version 1.1 -@center April 1991 +@titlepage +@title GNU Readline Library +@subtitle Edition @value{EDITION}, for @code{Readline Library} Version @value{VERSION}. +@subtitle @value{UPDATE-MONTH} +@author Brian Fox, Free Software Foundation +@author Chet Ramey, Case Western Reserve University @page This document describes the GNU Readline Library, a utility which aids @@ -100,4 +113,3 @@ to provide a command line interface. @contents @bye - diff --git a/readline/doc/rltech.texinfo b/readline/doc/rltech.texinfo index 2048b7c29df..bce508717ac 100644 --- a/readline/doc/rltech.texinfo +++ b/readline/doc/rltech.texinfo @@ -8,7 +8,7 @@ This document describes the GNU Readline Library, a utility for aiding in the consitency of user interface across discrete programs that need to provide a command line interface. -Copyright (C) 1988 Free Software Foundation, Inc. +Copyright (C) 1988, 1994, 1996 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice @@ -35,32 +35,36 @@ by the Foundation. @node Programming with GNU Readline @chapter Programming with GNU Readline -This manual describes the interface between the GNU Readline Library and -user programs. If you are a programmer, and you wish to include the -features found in GNU Readline in your own programs, such as completion, -line editing, and interactive history manipulation, this documentation -is for you. +This chapter describes the interface between the GNU Readline Library and +other programs. If you are a programmer, and you wish to include the +features found in GNU Readline +such as completion, line editing, and interactive history manipulation +in your own programs, this section is for you. @menu -* Default Behaviour:: Using the default behaviour of Readline. +* Basic Behavior:: Using the default behavior of Readline. * Custom Functions:: Adding your own functions to Readline. +* Readline Variables:: Variables accessible to custom + functions. +* Readline Convenience Functions:: Functions which Readline supplies to + aid in writing your own * Custom Completers:: Supplanting or supplementing Readline's completion functions. @end menu -@node Default Behaviour -@section Default Behaviour +@node Basic Behavior +@section Basic Behavior Many programs provide a command line interface, such as @code{mail}, @code{ftp}, and @code{sh}. For such programs, the default behaviour of Readline is sufficient. This section describes how to use Readline in the simplest way possible, perhaps to replace calls in your code to -@code{gets ()}. +@code{gets()} or @code{fgets ()}. -@findex readline () +@findex readline @cindex readline, function -The function @code{readline} prints a prompt and then reads and returns -a single line of text from the user. The line which @code{readline ()} +The function @code{readline ()} prints a prompt and then reads and returns +a single line of text from the user. The line @code{readline} returns is allocated with @code{malloc ()}; you should @code{free ()} the line when you are done with it. The declaration for @code{readline} in ANSI C is @@ -69,18 +73,19 @@ in ANSI C is @code{char *readline (char *@var{prompt});} @end example +@noindent So, one might say @example @code{char *line = readline ("Enter a line: ");} @end example +@noindent in order to read a line of text from the user. +The line returned has the final newline removed, so only the +text remains. -The line which is returned has the final newline removed, so only the -text of the line remains. - -If readline encounters an @code{EOF} while reading the line, and the +If @code{readline} encounters an @code{EOF} while reading the line, and the line is empty at that point, then @code{(char *)NULL} is returned. -Otherwise, the line is ended just as if a newline was typed. +Otherwise, the line is ended just as if a newline had been typed. If you want the user to be able to get at the line later, (with @key{C-p} for example), you must call @code{add_history ()} to save the @@ -90,12 +95,13 @@ line away in a @dfn{history} list of such lines. @code{add_history (line)}; @end example +@noindent For full details on the GNU History Library, see the associated manual. -It is polite to avoid saving empty lines on the history list, since it -is rare than someone has a burning need to reuse a blank line. Here is +It is preferable to avoid saving empty lines on the history list, since +users rarely have a burning need to reuse a blank line. Here is a function which usefully replaces the standard @code{gets ()} library -function: +function, and has the advantage of no static buffer to overflow: @example /* A static variable for holding the line. */ @@ -103,11 +109,11 @@ static char *line_read = (char *)NULL; /* Read a string, and return a pointer to it. Returns NULL on EOF. */ char * -do_gets () +rl_gets () @{ /* If the buffer has already been allocated, return the memory to the free pool. */ - if (line_read != (char *)NULL) + if (line_read) @{ free (line_read); line_read = (char *)NULL; @@ -124,24 +130,23 @@ do_gets () @} @end example -The above code gives the user the default behaviour of @key{TAB} -completion: completion on file names. If you do not want readline to +This function gives the user the default behaviour of @key{TAB} +completion: completion on file names. If you do not want Readline to complete on filenames, you can change the binding of the @key{TAB} key with @code{rl_bind_key ()}. -@findex rl_bind_key () @example @code{int rl_bind_key (int @var{key}, int (*@var{function})());} @end example -@code{rl_bind_key ()} takes 2 arguments; @var{key} is the character that +@code{rl_bind_key ()} takes two arguments: @var{key} is the character that you want to bind, and @var{function} is the address of the function to -run when @var{key} is pressed. Binding @key{TAB} to @code{rl_insert ()} -makes @key{TAB} just insert itself. - +call when @var{key} is pressed. Binding @key{TAB} to @code{rl_insert ()} +makes @key{TAB} insert itself. @code{rl_bind_key ()} returns non-zero if @var{key} is not a valid ASCII character code (between 0 and 255). +Thus, to disable the default @key{TAB} behavior, the following suffices: @example @code{rl_bind_key ('\t', rl_insert);} @end example @@ -149,31 +154,27 @@ ASCII character code (between 0 and 255). This code should be executed once at the start of your program; you might write a function called @code{initialize_readline ()} which performs this and other desired initializations, such as installing -custom completers, etc. +custom completers (@pxref{Custom Completers}). @node Custom Functions @section Custom Functions -Readline provides a great many functions for manipulating the text of -the line. But it isn't possible to anticipate the needs of all +Readline provides many functions for manipulating the text of +the line, but it isn't possible to anticipate the needs of all programs. This section describes the various functions and variables -defined in within the Readline library which allow a user program to add +defined within the Readline library which allow a user program to add customized functionality to Readline. @menu * The Function Type:: C declarations to make code readable. -* Function Naming:: How to give a function you write a name. -* Keymaps:: Making keymaps. -* Binding Keys:: Changing Keymaps. * Function Writing:: Variables and calling conventions. -* Allowing Undoing:: How to make your functions undoable. @end menu @node The Function Type @subsection The Function Type -For the sake of readabilty, we declare a new type of object, called -@dfn{Function}. A @code{Function} is a C language function which +For readabilty, we declare a new type of object, called +@dfn{Function}. A @code{Function} is a C function which returns an @code{int}. The type declaration for @code{Function} is: @noindent @@ -186,10 +187,164 @@ classic C declaration @code{int (*)()func;} -we have +@noindent +we may write @code{Function *func;} +@noindent +Similarly, there are + +@example +typedef void VFunction (); +typedef char *CPFunction (); @r{and} +typedef char **CPPFunction (); +@end example + +@noindent +for functions returning no value, @code{pointer to char}, and +@code{pointer to pointer to char}, respectively. + +@node Function Writing +@subsection Writing a New Function + +In order to write new functions for Readline, you need to know the +calling conventions for keyboard-invoked functions, and the names of the +variables that describe the current state of the line read so far. + +The calling sequence for a command @code{foo} looks like + +@example +@code{foo (int count, int key)} +@end example + +@noindent +where @var{count} is the numeric argument (or 1 if defaulted) and +@var{key} is the key that invoked this function. + +It is completely up to the function as to what should be done with the +numeric argument. Some functions use it as a repeat count, some +as a flag, and others to choose alternate behavior (refreshing the current +line as opposed to refreshing the screen, for example). Some choose to +ignore it. In general, if a +function uses the numeric argument as a repeat count, it should be able +to do something useful with both negative and positive arguments. +At the very least, it should be aware that it can be passed a +negative argument. + +@node Readline Variables +@section Readline Variables + +These variables are available to function writers. + +@deftypevar {char *} rl_line_buffer +This is the line gathered so far. You are welcome to modify the +contents of the line, but see @ref{Allowing Undoing}. +@end deftypevar + +@deftypevar int rl_point +The offset of the current cursor position in @code{rl_line_buffer} +(the @emph{point}). +@end deftypevar + +@deftypevar int rl_end +The number of characters present in @code{rl_line_buffer}. When +@code{rl_point} is at the end of the line, @code{rl_point} and +@code{rl_end} are equal. +@end deftypevar + +@deftypevar int rl_mark +The mark (saved position) in the current line. If set, the mark +and point define a @emph{region}. +@end deftypevar + +@deftypevar int rl_done +Setting this to a non-zero value causes Readline to return the current +line immediately. +@end deftypevar + +@deftypevar int rl_pending_input +Setting this to a value makes it the next keystroke read. This is a +way to stuff a single character into the input stream. +@end deftypevar + +@deftypevar {char *} rl_prompt +The prompt Readline uses. This is set from the argument to +@code{readline ()}, and should not be assigned to directly. +@end deftypevar + +@deftypevar {char *} rl_library_version +The version number of this revision of the library. +@end deftypevar + +@deftypevar {char *} rl_terminal_name +The terminal type, used for initialization. +@end deftypevar + +@deftypevar {char *} rl_readline_name +This variable is set to a unique name by each application using Readline. +The value allows conditional parsing of the inputrc file +(@pxref{Conditional Init Constructs}). +@end deftypevar + +@deftypevar {FILE *} rl_instream +The stdio stream from which Readline reads input. +@end deftypevar + +@deftypevar {FILE *} rl_outstream +The stdio stream to which Readline performs output. +@end deftypevar + +@deftypevar {Function *} rl_startup_hook +If non-zero, this is the address of a function to call just +before @code{readline} prints the first prompt. +@end deftypevar + +@deftypevar {Function *} rl_event_hook +If non-zero, this is the address of a function to call periodically +when readline is waiting for terminal input. +@end deftypevar + +@deftypevar {Function *} rl_getc_function +If non-zero, @code{readline} will call indirectly through this pointer +to get a character from the input stream. By default, it is set to +@code{rl_getc}, the default @code{readline} character input function +(@pxref{Utility Functions}). +@end deftypevar + +@deftypevar {VFunction *} rl_redisplay_function +If non-zero, @code{readline} will call indirectly through this pointer +to update the display with the current contents of the editing buffer. +By default, it is set to @code{rl_redisplay}, the default @code{readline} +redisplay function (@pxref{Redisplay}). +@end deftypevar + +@deftypevar {Keymap} rl_executing_keymap +This variable is set to the keymap (@pxref{Keymaps}) in which the +currently executing readline function was found. +@end deftypevar + +@deftypevar {Keymap} rl_binding_keymap +This variable is set to the keymap (@pxref{Keymaps}) in which the +last key binding occurred. +@end deftypevar + +@node Readline Convenience Functions +@section Readline Convenience Functions + +@menu +* Function Naming:: How to give a function you write a name. +* Keymaps:: Making keymaps. +* Binding Keys:: Changing Keymaps. +* Associating Function Names and Bindings:: Translate function names to + key sequences. +* Allowing Undoing:: How to make your functions undoable. +* Redisplay:: Functions to control line display. +* Modifying Text:: Functions to modify @code{rl_line_buffer}. +* Utility Functions:: Generally useful functions and hooks. +* Alternate Interface:: Using Readline in a `callback' fashion. +@end menu + @node Function Naming @subsection Naming a Function @@ -207,16 +362,16 @@ This binds the keystroke @key{Meta-Rubout} to the function programmer, should bind the functions you write to descriptive names as well. Readline provides a function for doing that: -@defun rl_add_defun (char *name, Function *function, int key) +@deftypefun int rl_add_defun (char *name, Function *function, int key) Add @var{name} to the list of named functions. Make @var{function} be the function that gets called. If @var{key} is not -1, then bind it to @var{function} using @code{rl_bind_key ()}. -@end defun +@end deftypefun Using this function alone is sufficient for most applications. It is the recommended way to add a few functions to the default functions that -Readline has built in already. If you need to do more or different -things than adding a function to Readline, you may need to use the +Readline has built in. If you need to do something other +than adding a function to Readline, you may need to use the underlying functions described below. @node Keymaps @@ -227,154 +382,394 @@ association between the keys that the user types and the functions that get run. You can make your own keymaps, copy existing keymaps, and tell Readline which keymap to use. -@defun {Keymap rl_make_bare_keymap} () +@deftypefun Keymap rl_make_bare_keymap () Returns a new, empty keymap. The space for the keymap is allocated with @code{malloc ()}; you should @code{free ()} it when you are done. -@end defun +@end deftypefun -@defun {Keymap rl_copy_keymap} (Keymap map) +@deftypefun Keymap rl_copy_keymap (Keymap map) Return a new keymap which is a copy of @var{map}. -@end defun +@end deftypefun -@defun {Keymap rl_make_keymap} () +@deftypefun Keymap rl_make_keymap () Return a new keymap with the printing characters bound to rl_insert, the lowercase Meta characters bound to run their equivalents, and the Meta digits bound to produce numeric arguments. -@end defun +@end deftypefun + +@deftypefun void rl_discard_keymap (Keymap keymap) +Free the storage associated with @var{keymap}. +@end deftypefun + +Readline has several internal keymaps. These functions allow you to +change which keymap is active. + +@deftypefun Keymap rl_get_keymap () +Returns the currently active keymap. +@end deftypefun + +@deftypefun void rl_set_keymap (Keymap keymap) +Makes @var{keymap} the currently active keymap. +@end deftypefun + +@deftypefun Keymap rl_get_keymap_by_name (char *name) +Return the keymap matching @var{name}. @var{name} is one which would +be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}). +@end deftypefun + +@deftypefun {char *} rl_get_keymap_name (Keymap keymap) +Return the name matching @var{keymap}. @var{name} is one which would +be supplied in a @code{set keymap} inputrc line (@pxref{Readline Init File}). +@end deftypefun @node Binding Keys @subsection Binding Keys -You associate keys with functions through the keymap. Here are -functions for doing that. +You associate keys with functions through the keymap. Readline has +several internal keymaps: @code{emacs_standard_keymap}, +@code{emacs_meta_keymap}, @code{emacs_ctlx_keymap}, +@code{vi_movement_keymap}, and @code{vi_insertion_keymap}. +@code{emacs_standard_keymap} is the default, and the examples in +this manual assume that. -@defun {int rl_bind_key} (int key, Function *function) -Binds @var{key} to @var{function} in the currently selected keymap. +These functions manage key bindings. + +@deftypefun int rl_bind_key (int key, Function *function) +Binds @var{key} to @var{function} in the currently active keymap. Returns non-zero in the case of an invalid @var{key}. -@end defun +@end deftypefun -@defun {int rl_bind_key_in_map} (int key, Function *function, Keymap map) +@deftypefun int rl_bind_key_in_map (int key, Function *function, Keymap map) Bind @var{key} to @var{function} in @var{map}. Returns non-zero in the case of an invalid @var{key}. -@end defun +@end deftypefun -@defun {int rl_unbind_key} (int key) -Make @var{key} do nothing in the currently selected keymap. +@deftypefun int rl_unbind_key (int key) +Bind @var{key} to the null function in the currently active keymap. Returns non-zero in case of error. -@end defun +@end deftypefun -@defun {int rl_unbind_key_in_map} (int key, Keymap map) -Make @var{key} be bound to the null function in @var{map}. +@deftypefun int rl_unbind_key_in_map (int key, Keymap map) +Bind @var{key} to the null function in @var{map}. Returns non-zero in case of error. -@end defun +@end deftypefun + +@deftypefun int rl_unbind_function_in_map (Function *function, Keymap map) +Unbind all keys that execute @var{function} in @var{map}. +@end deftypefun + +@deftypefun int rl_unbind_command_in_map (char *command, Keymap map) +Unbind all keys that are bound to @var{command} in @var{map}. +@end deftypefun -@defun rl_generic_bind (int type, char *keyseq, char *data, Keymap map) +@deftypefun int rl_generic_bind (int type, char *keyseq, char *data, Keymap map) Bind the key sequence represented by the string @var{keyseq} to the arbitrary pointer @var{data}. @var{type} says what kind of data is pointed to by -@var{data}; right now this can be a function (@code{ISFUNC}), a macro +@var{data}; this can be a function (@code{ISFUNC}), a macro (@code{ISMACR}), or a keymap (@code{ISKMAP}). This makes new keymaps as -necessary. The initial place to do bindings is in @var{map}. -@end defun - -@node Function Writing -@subsection Writing a New Function - -In order to write new functions for Readline, you need to know the -calling conventions for keyboard invoked functions, and the names of the -variables that describe the current state of the line gathered so far. - -@defvar {char *rl_line_buffer} -This is the line gathered so far. You are welcome to modify the -contents of this, but see Undoing, below. -@end defvar - -@defvar {int rl_point} -The offset of the current cursor position in @var{rl_line_buffer}. -@end defvar - -@defvar {int rl_end} -The number of characters present in @code{rl_line_buffer}. When -@code{rl_point} is at the end of the line, then @code{rl_point} and -@code{rl_end} are equal. -@end defvar - -The calling sequence for a command @code{foo} looks like - -@example -@code{foo (int count, int key)} -@end example - -where @var{count} is the numeric argument (or 1 if defaulted) and -@var{key} is the key that invoked this function. - -It is completely up to the function as to what should be done with the -numeric argument; some functions use it as a repeat count, other -functions as a flag, and some choose to ignore it. In general, if a -function uses the numeric argument as a repeat count, it should be able -to do something useful with a negative argument as well as a positive -argument. At the very least, it should be aware that it can be passed a -negative argument. +necessary. The initial keymap in which to do bindings is @var{map}. +@end deftypefun + +@deftypefun int rl_parse_and_bind (char *line) +Parse @var{line} as if it had been read from the @code{inputrc} file and +perform any key bindings and variable assignments found +(@pxref{Readline Init File}). +@end deftypefun + +@deftypefun int rl_read_init_file (char *filename) +Read keybindings and variable assignments from @var{filename} +(@pxref{Readline Init File}). +@end deftypefun + +@node Associating Function Names and Bindings +@subsection Associating Function Names and Bindings + +These functions allow you to find out what keys invoke named functions +and the functions invoked by a particular key sequence. + +@deftypefun {Function *} rl_named_function (char *name) +Return the function with name @var{name}. +@end deftypefun + +@deftypefun {Function *} rl_function_of_keyseq (char *keyseq, Keymap map, int *type) +Return the function invoked by @var{keyseq} in keymap @var{map}. +If @var{map} is NULL, the current keymap is used. If @var{type} is +not NULL, the type of the object is returned in it (one of @code{ISFUNC}, +@code{ISKMAP}, or @code{ISMACR}). +@end deftypefun + +@deftypefun {char **} rl_invoking_keyseqs (Function *function) +Return an array of strings representing the key sequences used to +invoke @var{function} in the current keymap. +@end deftypefun + +@deftypefun {char **} rl_invoking_keyseqs_in_map (Function *function, Keymap map) +Return an array of strings representing the key sequences used to +invoke @var{function} in the keymap @var{map}. +@end deftypefun + +@deftypefun void rl_function_dumper (int readable) +Print the readline function names and the key sequences currently +bound to them to @code{rl_outstream}. If @var{readable} is non-zero, +the list is formatted in such a way that it can be made part of an +@code{inputrc} file and re-read. +@end deftypefun + +@deftypefun void rl_list_funmap_names () +Print the names of all bindable Readline functions to @code{rl_outstream}. +@end deftypefun @node Allowing Undoing @subsection Allowing Undoing -Supporting the undo command is a painless thing to do, and makes your -functions much more useful to the end user. It is certainly easy to try +Supporting the undo command is a painless thing, and makes your +functions much more useful. It is certainly easy to try something if you know you can undo it. I could use an undo function for the stock market. -If your function simply inserts text once, or deletes text once, and it -calls @code{rl_insert_text ()} or @code{rl_delete_text ()} to do it, then -undoing is already done for you automatically, and you can safely skip -this section. +If your function simply inserts text once, or deletes text once, and +uses @code{rl_insert_text ()} or @code{rl_delete_text ()} to do it, then +undoing is already done for you automatically. If you do multiple insertions or multiple deletions, or any combination of these operations, you should group them together into one operation. -This can be done with @code{rl_begin_undo_group ()} and +This is done with @code{rl_begin_undo_group ()} and @code{rl_end_undo_group ()}. -@defun rl_begin_undo_group () +The types of events that can be undone are: + +@example +enum undo_code @{ UNDO_DELETE, UNDO_INSERT, UNDO_BEGIN, UNDO_END @}; +@end example + +Notice that @code{UNDO_DELETE} means to insert some text, and +@code{UNDO_INSERT} means to delete some text. That is, the undo code +tells undo what to undo, not how to undo it. @code{UNDO_BEGIN} and +@code{UNDO_END} are tags added by @code{rl_begin_undo_group ()} and +@code{rl_end_undo_group ()}. + +@deftypefun int rl_begin_undo_group () Begins saving undo information in a group construct. The undo information usually comes from calls to @code{rl_insert_text ()} and -@code{rl_delete_text ()}, but they could be direct calls to +@code{rl_delete_text ()}, but could be the result of calls to @code{rl_add_undo ()}. -@end defun +@end deftypefun -@defun rl_end_undo_group () +@deftypefun int rl_end_undo_group () Closes the current undo group started with @code{rl_begin_undo_group -()}. There should be exactly one call to @code{rl_end_undo_group ()} -for every call to @code{rl_begin_undo_group ()}. -@end defun +()}. There should be one call to @code{rl_end_undo_group ()} +for each call to @code{rl_begin_undo_group ()}. +@end deftypefun + +@deftypefun void rl_add_undo (enum undo_code what, int start, int end, char *text) +Remember how to undo an event (according to @var{what}). The affected +text runs from @var{start} to @var{end}, and encompasses @var{text}. +@end deftypefun + +@deftypefun void free_undo_list () +Free the existing undo list. +@end deftypefun + +@deftypefun int rl_do_undo () +Undo the first thing on the undo list. Returns @code{0} if there was +nothing to undo, non-zero if something was undone. +@end deftypefun Finally, if you neither insert nor delete text, but directly modify the -existing text (e.g. change its case), you call @code{rl_modifying ()} +existing text (e.g., change its case), call @code{rl_modifying ()} once, just before you modify the text. You must supply the indices of the text range that you are going to modify. -@defun rl_modifying (int start, int end) +@deftypefun int rl_modifying (int start, int end) Tell Readline to save the text between @var{start} and @var{end} as a -single undo unit. It is assumed that subsequent to this call you will -modify that range of text in some way. -@end defun +single undo unit. It is assumed that you will subsequently modify +that text. +@end deftypefun + +@node Redisplay +@subsection Redisplay + +@deftypefun void rl_redisplay () +Change what's displayed on the screen to reflect the current contents +of @code{rl_line_buffer}. +@end deftypefun + +@deftypefun int rl_forced_update_display () +Force the line to be updated and redisplayed, whether or not +Readline thinks the screen display is correct. +@end deftypefun + +@deftypefun int rl_on_new_line () +Tell the update routines that we have moved onto a new (empty) line, +usually after ouputting a newline. +@end deftypefun + +@deftypefun int rl_reset_line_state () +Reset the display state to a clean state and redisplay the current line +starting on a new line. +@end deftypefun + +@deftypefun int rl_message (va_alist) +The arguments are a string as would be supplied to @code{printf}. The +resulting string is displayed in the @dfn{echo area}. The echo area +is also used to display numeric arguments and search strings. +@end deftypefun + +@deftypefun int rl_clear_message () +Clear the message in the echo area. +@end deftypefun + +@node Modifying Text +@subsection Modifying Text + +@deftypefun int rl_insert_text (char *text) +Insert @var{text} into the line at the current cursor position. +@end deftypefun + +@deftypefun int rl_delete_text (int start, int end) +Delete the text between @var{start} and @var{end} in the current line. +@end deftypefun + +@deftypefun {char *} rl_copy_text (int start, int end) +Return a copy of the text between @var{start} and @var{end} in +the current line. +@end deftypefun + +@deftypefun int rl_kill_text (int start, int end) +Copy the text between @var{start} and @var{end} in the current line +to the kill ring, appending or prepending to the last kill if the +last command was a kill command. The text is deleted. +If @var{start} is less than @var{end}, +the text is appended, otherwise prepended. If the last command was +not a kill, a new kill ring slot is used. +@end deftypefun + +@node Utility Functions +@subsection Utility Functions + +@deftypefun int rl_read_key () +Return the next character available. This handles input inserted into +the input stream via @var{pending input} (@pxref{Readline Variables}) +and @code{rl_stuff_char ()}, macros, and characters read from the keyboard. +@end deftypefun + +@deftypefun int rl_getc (FILE *) +Return the next character available from the keyboard. +@end deftypefun + +@deftypefun int rl_stuff_char (int c) +Insert @var{c} into the Readline input stream. It will be "read" +before Readline attempts to read characters from the terminal with +@code{rl_read_key ()}. +@end deftypefun + +@deftypefun rl_extend_line_buffer (int len) +Ensure that @code{rl_line_buffer} has enough space to hold @var{len} +characters, possibly reallocating it if necessary. +@end deftypefun + +@deftypefun int rl_initialize () +Initialize or re-initialize Readline's internal state. +@end deftypefun + +@deftypefun int rl_reset_terminal (char *terminal_name) +Reinitialize Readline's idea of the terminal settings using +@var{terminal_name} as the terminal type (e.g., @code{vt100}). +@end deftypefun + +@deftypefun int alphabetic (int c) +Return 1 if @var{c} is an alphabetic character. +@end deftypefun + +@deftypefun int numeric (int c) +Return 1 if @var{c} is a numeric character. +@end deftypefun + +@deftypefun int ding () +Ring the terminal bell, obeying the setting of @code{bell-style}. +@end deftypefun + +The following are implemented as macros, defined in @code{chartypes.h}. + +@deftypefun int uppercase_p (int c) +Return 1 if @var{c} is an uppercase alphabetic character. +@end deftypefun + +@deftypefun int lowercase_p (int c) +Return 1 if @var{c} is a lowercase alphabetic character. +@end deftypefun + +@deftypefun int digit_p (int c) +Return 1 if @var{c} is a numeric character. +@end deftypefun + +@deftypefun int to_upper (int c) +If @var{c} is a lowercase alphabetic character, return the corresponding +uppercase character. +@end deftypefun + +@deftypefun int to_lower (int c) +If @var{c} is an uppercase alphabetic character, return the corresponding +lowercase character. +@end deftypefun + +@deftypefun int digit_value (int c) +If @var{c} is a number, return the value it represents. +@end deftypefun + +@node Alternate Interface +@subsection Alternate Interface + +An alternate interface is available to plain @code{readline()}. Some +applications need to interleave keyboard I/O with file, device, or +window system I/O, typically by using a main loop to @code{select()} +on various file descriptors. To accomodate this need, readline can +also be invoked as a `callback' function from an event loop. There +are functions available to make this easy. + +@deftypefun void rl_callback_handler_install (char *prompt, Vfunction *lhandler) +Set up the terminal for readline I/O and display the initial +expanded value of @var{prompt}. Save the value of @var{lhandler} to +use as a callback when a complete line of input has been entered. +@end deftypefun + +@deftypefun void rl_callback_read_char () +Whenever an application determines that keyboard input is available, it +should call @code{rl_callback_read_char()}, which will read the next +character from the current input source. If that character completes the +line, @code{rl_callback_read_char} will invoke the @var{lhandler} +function saved by @code{rl_callback_handler_install} to process the +line. @code{EOF} is indicated by calling @var{lhandler} with a +@code{NULL} line. +@end deftypefun + +@deftypefun void rl_callback_handler_remove () +Restore the terminal to its initial state and remove the line handler. +This may be called from within a callback as well as independently. +@end deftypefun @subsection An Example -Here is a function which changes lowercase characters to the uppercase -equivalents, and uppercase characters to the lowercase equivalents. If +Here is a function which changes lowercase characters to their uppercase +equivalents, and uppercase characters to lowercase. If this function was bound to @samp{M-c}, then typing @samp{M-c} would -change the case of the character under point. Typing @samp{10 M-c} +change the case of the character under point. Typing @samp{M-1 0 M-c} would change the case of the following 10 characters, leaving the cursor on the last character changed. @example /* Invert the case of the COUNT following characters. */ +int invert_case_line (count, key) int count, key; @{ - register int start, end; + register int start, end, i; start = rl_point; + if (rl_point >= rl_end) + return (0); + if (count < 0) @{ direction = -1; @@ -390,7 +785,10 @@ invert_case_line (count, key) if (end > rl_end) end = rl_end; else if (end < 0) - end = -1; + end = 0; + + if (start == end) + return (0); if (start > end) @{ @@ -399,22 +797,20 @@ invert_case_line (count, key) end = temp; @} - if (start == end) - return; - - /* Tell readline that we are modifying the line, so save the undo - information. */ + /* Tell readline that we are modifying the line, so it will save + the undo information. */ rl_modifying (start, end); - for (; start != end; start += direction) + for (i = start; i != end; i++) @{ - if (uppercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = to_lower (rl_line_buffer[start]); - else if (lowercase_p (rl_line_buffer[start])) - rl_line_buffer[start] = to_upper (rl_line_buffer[start]); + if (uppercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = to_lower (rl_line_buffer[i]); + else if (lowercase_p (rl_line_buffer[i])) + rl_line_buffer[i] = to_upper (rl_line_buffer[i]); @} /* Move point to on top of the last character changed. */ - rl_point = end - direction; + rl_point = (direction == 1) ? end - 1 : start; + return (0); @} @end example @@ -423,9 +819,9 @@ invert_case_line (count, key) Typically, a program that reads commands from the user has a way of disambiguating commands and data. If your program is one of these, then -it can provide completion for either commands, or data, or both commands -and data. The following sections describe how your program and Readline -cooperate to provide this service to end users. +it can provide completion for commands, data, or both. +The following sections describe how your program and Readline +cooperate to provide this service. @menu * How Completing Works:: The logic used to do completion. @@ -438,26 +834,26 @@ cooperate to provide this service to end users. @subsection How Completing Works In order to complete some text, the full list of possible completions -must be available. That is to say, it is not possible to accurately -expand a partial word without knowing what all of the possible words -that make sense in that context are. The GNU Readline library provides -the user interface to completion, and additionally, two of the most common -completion functions; filename and username. For completing other types +must be available. That is, it is not possible to accurately +expand a partial word without knowing all of the possible words +which make sense in that context. The Readline library provides +the user interface to completion, and two of the most common +completion functions: filename and username. For completing other types of text, you must write your own completion function. This section -describes exactly what those functions must do, and provides an example -function. +describes exactly what such functions must do, and provides an example. There are three major functions used to perform completion: @enumerate @item The user-interface function @code{rl_complete ()}. This function is -called interactively with the same calling conventions as other -functions in readline intended for interactive use; i.e. @var{count}, -and @var{invoking-key}. It isolates the word to be completed and calls +called with the same arguments as other Readline +functions intended for interactive use: @var{count} and +@var{invoking_key}. It isolates the word to be completed and calls @code{completion_matches ()} to generate a list of possible completions. -It then either lists the possible completions or actually performs the -completion, depending on which behaviour is desired. +It then either lists the possible completions, inserts the possible +completions, or actually performs the +completion, depending on which behavior is desired. @item The internal function @code{completion_matches ()} uses your @@ -470,29 +866,30 @@ The generator function is called repeatedly from @code{completion_matches ()}, returning a string each time. The arguments to the generator function are @var{text} and @var{state}. @var{text} is the partial word to be completed. @var{state} is zero the -first time the function is called, and a positive non-zero integer for -each subsequent call. When the generator function returns @code{(char -*)NULL} this signals @code{completion_matches ()} that there are no more -possibilities left. +first time the function is called, allowing the generator to perform +any necessary initialization, and a positive non-zero integer for +each subsequent call. When the generator function returns +@code{(char *)NULL} this signals @code{completion_matches ()} that there are +no more possibilities left. Usually the generator function computes the +list of possible completions when @var{state} is zero, and returns them +one at a time on subsequent calls. Each string the generator function +returns as a match must be allocated with @code{malloc()}; Readline +frees the strings when it has finished with them. @end enumerate -@defun rl_complete (int ignore, int invoking_key) +@deftypefun int rl_complete (int ignore, int invoking_key) Complete the word at or before point. You have supplied the function that does the initial simple matching selection algorithm (see @code{completion_matches ()}). The default is to do filename completion. -@end defun - -Note that @code{rl_complete ()} has the identical calling conventions as -any other key-invokable function; this is because by default it is bound -to the @samp{TAB} key. +@end deftypefun -@defvar {Function *rl_completion_entry_function} +@deftypevar {Function *} rl_completion_entry_function This is a pointer to the generator function for @code{completion_matches ()}. If the value of @code{rl_completion_entry_function} is -@code{(Function *)NULL} then the default filename generator function is -used, namely @code{filename_entry_function ()}. -@end defvar +@code{(Function *)NULL} then the default filename generator function, +@code{filename_completion_function ()}, is used. +@end deftypevar @node Completion Functions @subsection Completion Functions @@ -500,122 +897,223 @@ used, namely @code{filename_entry_function ()}. Here is the complete list of callable completion functions present in Readline. -@defun rl_complete_internal (int what_to_do) +@deftypefun int rl_complete_internal (int what_to_do) Complete the word at or before point. @var{what_to_do} says what to do with the completion. A value of @samp{?} means list the possible completions. @samp{TAB} means do standard completion. @samp{*} means -insert all of the possible completions. -@end defun +insert all of the possible completions. @samp{!} means to display +all of the possible completions, if there is more than one, as well as +performing partial completion. +@end deftypefun -@defun rl_complete (int ignore, int invoking_key) +@deftypefun int rl_complete (int ignore, int invoking_key) Complete the word at or before point. You have supplied the function that does the initial simple matching selection algorithm (see -@code{completion_matches ()}). The default is to do filename -completion. This just calls @code{rl_complete_internal ()} with an -argument of @samp{TAB}. -@end defun +@code{completion_matches ()} and @code{rl_completion_entry_function}). +The default is to do filename +completion. This calls @code{rl_complete_internal ()} with an +argument depending on @var{invoking_key}. +@end deftypefun -@defun rl_possible_completions () +@deftypefun int rl_possible_completions (int count, int invoking_key)) List the possible completions. See description of @code{rl_complete -()}. This just calls @code{rl_complete_internal ()} with an argument of +()}. This calls @code{rl_complete_internal ()} with an argument of @samp{?}. -@end defun +@end deftypefun -@defun {char **completion_matches} (char *text, char *(*entry_function) ()) +@deftypefun int rl_insert_completions (int count, int invoking_key)) +Insert the list of possible completions into the line, deleting the +partially-completed word. See description of @code{rl_complete ()}. +This calls @code{rl_complete_internal ()} with an argument of @samp{*}. +@end deftypefun + +@deftypefun {char **} completion_matches (char *text, CPFunction *entry_func) Returns an array of @code{(char *)} which is a list of completions for @var{text}. If there are no completions, returns @code{(char **)NULL}. The first entry in the returned array is the substitution for @var{text}. The remaining entries are the possible completions. The array is terminated with a @code{NULL} pointer. -@var{entry_function} is a function of two args, and returns a +@var{entry_func} is a function of two args, and returns a @code{(char *)}. The first argument is @var{text}. The second is a state argument; it is zero on the first call, and non-zero on subsequent -calls. It returns a @code{NULL} pointer to the caller when there are -no more matches. -@end defun +calls. @var{entry_func} returns a @code{NULL} pointer to the caller +when there are no more matches. +@end deftypefun -@defun {char *filename_completion_function} (char *text, int state) +@deftypefun {char *} filename_completion_function (char *text, int state) A generator function for filename completion in the general case. Note -that completion in the Bash shell is a little different because of all -the pathnames that must be followed when looking up the completion for a -command. -@end defun +that completion in Bash is a little different because of all +the pathnames that must be followed when looking up completions for a +command. The Bash source is a useful reference for writing custom +completion functions. +@end deftypefun -@defun {char *username_completion_function} (char *text, int state) +@deftypefun {char *} username_completion_function (char *text, int state) A completion generator for usernames. @var{text} contains a partial -username preceded by a random character (usually @samp{~}). -@end defun +username preceded by a random character (usually @samp{~}). As with all +completion generators, @var{state} is zero on the first call and non-zero +for subsequent calls. +@end deftypefun @node Completion Variables @subsection Completion Variables -@defvar {Function *rl_completion_entry_function} +@deftypevar {Function *} rl_completion_entry_function A pointer to the generator function for @code{completion_matches ()}. @code{NULL} means to use @code{filename_entry_function ()}, the default filename completer. -@end defvar +@end deftypevar -@defvar {Function *rl_attempted_completion_function} +@deftypevar {CPPFunction *} rl_attempted_completion_function A pointer to an alternative function to create matches. The function is called with @var{text}, @var{start}, and @var{end}. @var{start} and @var{end} are indices in @code{rl_line_buffer} saying what the boundaries of @var{text} are. If this function exists and -returns @code{NULL} then @code{rl_complete ()} will call the value of +returns @code{NULL}, or if this variable is set to @code{NULL}, then +@code{rl_complete ()} will call the value of @code{rl_completion_entry_function} to generate matches, otherwise the array of strings returned will be used. -@end defvar - -@defvar {int rl_completion_query_items} +@end deftypevar + +@deftypevar {CPFunction *} rl_filename_quoting_function +A pointer to a function that will quote a filename in an application- +specific fashion. This is called if filename completion is being +attempted and one of the characters in @code{rl_filename_quote_characters} +appears in a completed filename. The function is called with +@var{text}, @var{match_type}, and @var{quote_pointer}. The @var{text} +is the filename to be quoted. The @var{match_type} is either +@code{SINGLE_MATCH}, if there is only one completion match, or +@code{MULT_MATCH}. Some functions use this to decide whether or not to +insert a closing quote character. The @var{quote_pointer} is a pointer +to any opening quote character the user typed. Some functions choose +to reset this character. +@end deftypevar + +@deftypevar {CPFunction *} rl_filename_dequoting_function +A pointer to a function that will remove application-specific quoting +characters from a filename before completion is attempted, so those +characters do not interfere with matching the text against names in +the filesystem. It is called with @var{text}, the text of the word +to be dequoted, and @var{quote_char}, which is the quoting character +that delimits the filename (usually @samp{'} or @samp{"}). If +@var{quote_char} is zero, the filename was not in an embedded string. +@end deftypevar + +@deftypevar {Function *} rl_char_is_quoted_p +A pointer to a function to call that determines whether or not a specific +character in the line buffer is quoted, according to whatever quoting +mechanism the program calling readline uses. The function is called with +two arguments: @var{text}, the text of the line, and @var{index}, the +index of the character in the line. It is used to decide whether a +character found in @code{rl_completer_word_break_characters} should be +used to break words for the completer. +@end deftypevar + +@deftypevar int rl_completion_query_items Up to this many items will be displayed in response to a possible-completions call. After that, we ask the user if she is sure she wants to see them all. The default value is 100. -@end defvar +@end deftypevar -@defvar {char *rl_basic_word_break_characters} +@deftypevar {char *} rl_basic_word_break_characters The basic list of characters that signal a break between words for the -completer routine. The contents of this variable is what breaks words -in the Bash shell, i.e. " \t\n\"\\'`@@$><=;|&@{(". -@end defvar +completer routine. The default value of this variable is the characters +which break words for completion in Bash, i.e., +@code{" \t\n\"\\'`@@$><=;|&@{("}. +@end deftypevar + +@deftypevar {char *} rl_basic_quote_characters +List of quote characters which can cause a word break. +@end deftypevar -@defvar {char *rl_completer_word_break_characters} +@deftypevar {char *} rl_completer_word_break_characters The list of characters that signal a break between words for -@code{rl_complete_internal ()}. The default list is the contents of +@code{rl_complete_internal ()}. The default list is the value of @code{rl_basic_word_break_characters}. -@end defvar +@end deftypevar + +@deftypevar {char *} rl_completer_quote_characters +List of characters which can be used to quote a substring of the line. +Completion occurs on the entire substring, and within the substring +@code{rl_completer_word_break_characters} are treated as any other character, +unless they also appear within this list. +@end deftypevar + +@deftypevar {char *} rl_filename_quote_characters +A list of characters that cause a filename to be quoted by the completer +when they appear in a completed filename. The default is the null string. +@end deftypevar -@defvar {char *rl_special_prefixes} +@deftypevar {char *} rl_special_prefixes The list of characters that are word break characters, but should be left in @var{text} when it is passed to the completion function. Programs can use this to help determine what kind of completing to do. -@end defvar - -@defvar {int rl_ignore_completion_duplicates} +For instance, Bash sets this variable to "$@@" so that it can complete +shell variables and hostnames. +@end deftypevar + +@deftypevar {int} rl_completion_append_character +When a single completion alternative matches at the end of the command +line, this character is appended to the inserted completion text. The +default is a space character (@samp{ }). Setting this to the null +character (@samp{\0}) prevents anything being appended automatically. +This can be changed in custom completion functions to +provide the ``most sensible word separator character'' according to +an application-specific command line syntax specification. +@end deftypevar + +@deftypevar int rl_ignore_completion_duplicates If non-zero, then disallow duplicates in the matches. Default is 1. -@end defvar +@end deftypevar -@defvar {int rl_filename_completion_desired} +@deftypevar int rl_filename_completion_desired Non-zero means that the results of the matches are to be treated as filenames. This is @emph{always} zero on entry, and can only be changed -within a completion entry generator function. -@end defvar - -@defvar {Function *rl_ignore_some_completions_function} +within a completion entry generator function. If it is set to a non-zero +value, directory names have a slash appended and Readline attempts to +quote completed filenames if they contain any embedded word break +characters. +@end deftypevar + +@deftypevar int rl_filename_quoting_desired +Non-zero means that the results of the matches are to be quoted using +double quotes (or an application-specific quoting mechanism) if the +completed filename contains any characters in +@code{rl_filename_quote_chars}. This is @emph{always} non-zero +on entry, and can only be changed within a completion entry generator +function. The quoting is effected via a call to the function pointed to +by @code{rl_filename_quoting_function}. +@end deftypevar + +@deftypevar int rl_inhibit_completion +If this variable is non-zero, completion is inhibit -#include -#include #include #include #include #include +#include +#include + +extern char *getwd (); +extern char *xmalloc (); + /* The names of functions that actually do the manipulation. */ int com_list (), com_view (), com_rename (), com_stat (), com_pwd (); int com_delete (), com_help (), com_cd (), com_quit (); @@ -641,9 +1143,9 @@ int com_delete (), com_help (), com_cd (), com_quit (); can understand. */ typedef struct @{ - char *name; /* User printable name of the function. */ - Function *func; /* Function to call to do the job. */ - char *doc; /* Documentation for this function. */ + char *name; /* User printable name of the function. */ + Function *func; /* Function to call to do the job. */ + char *doc; /* Documentation for this function. */ @} COMMAND; COMMAND commands[] = @{ @@ -661,65 +1163,78 @@ COMMAND commands[] = @{ @{ (char *)NULL, (Function *)NULL, (char *)NULL @} @}; +/* Forward declarations. */ +char *stripwhite (); +COMMAND *find_command (); + /* The name of this program, as taken from argv[0]. */ char *progname; /* When non-zero, this global means the user is done using this program. */ -int done = 0; -@page +int done; + +char * +dupstr (s) + int s; +@{ + char *r; + + r = xmalloc (strlen (s) + 1); + strcpy (r, s); + return (r); +@} + main (argc, argv) int argc; char **argv; @{ + char *line, *s; + progname = argv[0]; - initialize_readline (); /* Bind our completer. */ + initialize_readline (); /* Bind our completer. */ /* Loop reading and executing lines until the user quits. */ - while (!done) + for ( ; done == 0; ) @{ - char *line; - line = readline ("FileMan: "); if (!line) - @{ - done = 1; /* Encountered EOF at top level. */ - @} - else - @{ - /* Remove leading and trailing whitespace from the line. - Then, if there is anything left, add it to the history list - and execute it. */ - stripwhite (line); + break; - if (*line) - @{ - add_history (line); - execute_line (line); - @} + /* Remove leading and trailing whitespace from the line. + Then, if there is anything left, add it to the history list + and execute it. */ + s = stripwhite (line); + + if (*s) + @{ + add_history (s); + execute_line (s); @} - if (line) - free (line); + free (line); @} exit (0); @} /* Execute a command line. */ +int execute_line (line) char *line; @{ register int i; - COMMAND *find_command (), *command; + COMMAND *command; char *word; /* Isolate the command word. */ i = 0; - while (line[i] && !whitespace (line[i])) + while (line[i] && whitespace (line[i])) i++; + word = line + i; - word = line; + while (line[i] && !whitespace (line[i])) + i++; if (line[i]) line[i++] = '\0'; @@ -729,7 +1244,7 @@ execute_line (line) if (!command) @{ fprintf (stderr, "%s: No such command for FileMan.\n", word); - return; + return (-1); @} /* Get argument to command, if any. */ @@ -739,7 +1254,7 @@ execute_line (line) word = line + i; /* Call the function. */ - (*(command->func)) (word); + return ((*(command->func)) (word)); @} /* Look up NAME as the name of a command, and return a pointer to that @@ -757,57 +1272,60 @@ find_command (name) return ((COMMAND *)NULL); @} -/* Strip whitespace from the start and end of STRING. */ +/* Strip whitespace from the start and end of STRING. Return a pointer + into STRING. */ +char * stripwhite (string) char *string; @{ - register int i = 0; - - while (whitespace (string[i])) - i++; + register char *s, *t; - if (i) - strcpy (string, string + i); + for (s = string; whitespace (*s); s++) + ; + + if (*s == 0) + return (s); - i = strlen (string) - 1; + t = s + strlen (s) - 1; + while (t > s && whitespace (*t)) + t--; + *++t = '\0'; - while (i > 0 && whitespace (string[i])) - i--; - - string[++i] = '\0'; + return s; @} -@page + /* **************************************************************** */ /* */ /* Interface to Readline Completion */ /* */ /* **************************************************************** */ +char *command_generator (); +char **fileman_completion (); + /* Tell the GNU Readline library how to complete. We want to try to complete on command names if this is the first word in the line, or on filenames if not. */ initialize_readline () @{ - char **fileman_completion (); - /* Allow conditional parsing of the ~/.inputrc file. */ rl_readline_name = "FileMan"; /* Tell the completer that we want a crack first. */ - rl_attempted_completion_function = (Function *)fileman_completion; + rl_attempted_completion_function = (CPPFunction *)fileman_completion; @} -/* Attempt to complete on the contents of TEXT. START and END show the - region of TEXT that contains the word to complete. We can use the - entire line in case we want to do some simple parsing. Return the - array of matches, or NULL if there aren't any. */ +/* Attempt to complete on the contents of TEXT. START and END bound the + region of rl_line_buffer that contains the word to complete. TEXT is + the word to complete. We can use the entire contents of rl_line_buffer + in case we want to do some simple parsing. Return the array of matches, + or NULL if there aren't any. */ char ** fileman_completion (text, start, end) char *text; int start, end; @{ char **matches; - char *command_generator (); matches = (char **)NULL; @@ -846,13 +1364,13 @@ command_generator (text, state) list_index++; if (strncmp (name, text, len) == 0) - return (name); + return (dupstr(name)); @} /* If no names matched, then return NULL. */ return ((char *)NULL); @} -@page + /* **************************************************************** */ /* */ /* FileMan Commands */ @@ -868,26 +1386,27 @@ com_list (arg) char *arg; @{ if (!arg) - arg = "*"; + arg = ""; sprintf (syscom, "ls -FClg %s", arg); - system (syscom); + return (system (syscom)); @} com_view (arg) char *arg; @{ if (!valid_argument ("view", arg)) - return; + return 1; - sprintf (syscom, "cat %s | more", arg); - system (syscom); + sprintf (syscom, "more %s", arg); + return (system (syscom)); @} com_rename (arg) char *arg; @{ too_dangerous ("rename"); + return (1); @} com_stat (arg) @@ -896,27 +1415,32 @@ com_stat (arg) struct stat finfo; if (!valid_argument ("stat", arg)) - return; + return (1); if (stat (arg, &finfo) == -1) @{ perror (arg); - return; + return (1); @} printf ("Statistics for `%s':\n", arg); - printf ("%s has %d link%s, and is %d bytes in length.\n", arg, - finfo.st_nlink, (finfo.st_nlink == 1) ? "" : "s", finfo.st_size); - printf (" Created on: %s", ctime (&finfo.st_ctime)); - printf (" Last access at: %s", ctime (&finfo.st_atime)); - printf ("Last modified at: %s", ctime (&finfo.st_mtime)); + printf ("%s has %d link%s, and is %d byte%s in length.\n", arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + finfo.st_size, + (finfo.st_size == 1) ? "" : "s"); + printf ("Inode Last Change at: %s", ctime (&finfo.st_ctime)); + printf (" Last access at: %s", ctime (&finfo.st_atime)); + printf (" Last modified at: %s", ctime (&finfo.st_mtime)); + return (0); @} com_delete (arg) char *arg; @{ too_dangerous ("delete"); + return (1); @} /* Print out help for ARG, or for all of the commands if ARG is @@ -956,6 +1480,7 @@ com_help (arg) if (printed) printf ("\n"); @} + return (0); @} /* Change to the directory ARG. */ @@ -963,20 +1488,30 @@ com_cd (arg) char *arg; @{ if (chdir (arg) == -1) - perror (arg); + @{ + perror (arg); + return 1; + @} com_pwd (""); + return (0); @} /* Print out the current working directory. */ com_pwd (ignore) char *ignore; @{ - char dir[1024]; + char dir[1024], *s; - (void) getwd (dir); + s = getwd (dir); + if (s == 0) + @{ + printf ("Error getting pwd: %s\n", dir); + return 1; + @} printf ("Current directory is %s\n", dir); + return 0; @} /* The user wishes to quit using this program. Just set DONE non-zero. */ @@ -984,6 +1519,7 @@ com_quit (arg) char *arg; @{ done = 1; + return (0); @} /* Function which tells you that you can't do this. */ diff --git a/readline/doc/rluser.texinfo b/readline/doc/rluser.texinfo index c6aa4da88da..b2fd060366a 100644 --- a/readline/doc/rluser.texinfo +++ b/readline/doc/rluser.texinfo @@ -5,14 +5,14 @@ @ignore This file documents the end user interface to the GNU command line -editing feautres. It is to be an appendix to manuals for programs which +editing features. It is to be an appendix to manuals for programs which use these features. There is a document entitled "readline.texinfo" which contains both end-user and programmer documentation for the GNU Readline Library. -Copyright (C) 1988 Free Software Foundation, Inc. +Copyright (C) 1988, 1991, 1993, 1996 Free Software Foundation, Inc. -Authored by Brian Fox. +Authored by Brian Fox and Chet Ramey. Permission is granted to process this file through Tex and print the results, provided the printed document carries copying permission notice @@ -33,29 +33,38 @@ Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions. @end ignore +@comment If you are including this manual as an appendix, then set the +@comment variable readline-appendix. + @node Command Line Editing @chapter Command Line Editing -This text describes GNU's command line editing interface. +This chapter describes the basic features of the @sc{GNU} +command line editing interface. @menu * Introduction and Notation:: Notation used in this text. * Readline Interaction:: The minimum set of commands for editing a line. * Readline Init File:: Customizing Readline from a user's view. +* Bindable Readline Commands:: A description of most of the Readline commands + available for binding +* Readline vi Mode:: A short description of how to make Readline + behave like the vi editor. @end menu @node Introduction and Notation @section Introduction to Line Editing -The following paragraphs describe the notation we use to represent +The following paragraphs describe the notation used to represent keystrokes. The text @key{C-k} is read as `Control-K' and describes the character -produced when the Control key is depressed and the @key{k} key is struck. +produced when the @key{k} key is pressed while the Control key +is depressed. The text @key{M-k} is read as `Meta-K' and describes the character produced when the meta key (if you have one) is depressed, and the @key{k} -key is struck. If you do not have a meta key, the identical keystroke +key is pressed. If you do not have a meta key, the identical keystroke can be generated by typing @key{ESC} @i{first}, and then typing @key{k}. Either process is known as @dfn{metafying} the @key{k} key. @@ -65,7 +74,7 @@ character produced by @dfn{metafying} @key{C-k}. In addition, several keys have their own names. Specifically, @key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all stand for themselves when seen in this text, or in an init file -(@pxref{Readline Init File}, for more info). +(@pxref{Readline Init File}). @node Readline Interaction @section Readline Interaction @@ -87,26 +96,30 @@ regardless of the location of the cursor within the line. * Readline Movement Commands:: Moving about the input line. * Readline Killing Commands:: How to delete text, and how to get it back! * Readline Arguments:: Giving numeric arguments to commands. -@end menu +* Searching:: Searching through previous lines. + @end menu @node Readline Bare Essentials @subsection Readline Bare Essentials +@cindex notation, readline +@cindex command editing +@cindex editing command lines In order to enter characters into the line, simply type them. The typed character appears where the cursor was, and then the cursor moves one -space to the right. If you mistype a character, you can use @key{DEL} to -back up, and delete the mistyped character. +space to the right. If you mistype a character, you can use your +erase character to back up and delete the mistyped character. Sometimes you may miss typing a character that you wanted to type, and not notice your error until you have typed several other characters. In that case, you can type @key{C-b} to move the cursor to the left, and then -correct your mistake. Aftwerwards, you can move the cursor to the right +correct your mistake. Afterwards, you can move the cursor to the right with @key{C-f}. When you add text in the middle of a line, you will notice that characters -to the right of the cursor get `pushed over' to make room for the text +to the right of the cursor are `pushed over' to make room for the text that you have inserted. Likewise, when you delete text behind the cursor, -characters to the right of the cursor get `pulled back' to fill in the +characters to the right of the cursor are `pulled back' to fill in the blank space created by the removal of the text. A list of the basic bare essentials for editing the text of an input line follows. @@ -120,9 +133,9 @@ Delete the character to the left of the cursor. @item @key{C-d} Delete the character underneath the cursor. @item @w{Printing characters} -Insert itself into the line at the cursor. +Insert the character into the line at the cursor. @item @key{C-_} -Undo the last thing that you did. You can undo all the way back to an +Undo the last editing command. You can undo all the way back to an empty line. @end table @@ -142,7 +155,7 @@ Move to the start of the line. @item C-e Move to the end of the line. @item M-f -Move forward a word. +Move forward a word, where a word is composed of letters and digits. @item M-b Move backward a word. @item C-l @@ -156,16 +169,24 @@ operate on characters while meta keystrokes operate on words. @node Readline Killing Commands @subsection Readline Killing Commands -The act of @dfn{cutting} text means to delete the text from the line, and -to save away the deleted text for later use, just as if you had cut the -text out of the line with a pair of scissors. There is a +@cindex killing text +@cindex yanking text @dfn{Killing} text means to delete the text from the line, but to save -it away for later use, usually by @dfn{yanking} it back into the line. +it away for later use, usually by @dfn{yanking} (re-inserting) +it back into the line. If the description for a command says that it `kills' text, then you can be sure that you can get the text back in a different (or the same) place later. +When you use a kill command, the text is saved in a @dfn{kill-ring}. +Any number of consecutive kills save all of the killed text together, so +that when you yank it back, you get it all. The kill +ring is not line specific; the text that you killed on a previously +typed line is available to be yanked back later, when you are typing +another line. +@cindex kill ring + Here is the list of commands for killing text. @table @key @@ -177,7 +198,8 @@ Kill from the cursor to the end of the current word, or if between words, to the end of the next word. @item M-DEL -Kill fromthe cursor the start of the previous word, or if between words, to the start of the previous word. +Kill from the cursor the start of the previous word, or if between +words, to the start of the previous word. @item C-w Kill from the cursor to the previous whitespace. This is different than @@ -185,8 +207,8 @@ Kill from the cursor to the previous whitespace. This is different than @end table -And, here is how to @dfn{yank} the text back into the line. Yanking -is +Here is how to @dfn{yank} the text back into the line. Yanking +means to copy the most-recently-killed text from the kill buffer. @table @key @item C-y @@ -197,13 +219,6 @@ Rotate the kill-ring, and yank the new top. You can only do this if the prior command is @key{C-y} or @key{M-y}. @end table -When you use a kill command, the text is saved in a @dfn{kill-ring}. -Any number of consecutive kills save all of the killed text together, so -that when you yank it back, you get it in one clean sweep. The kill -ring is not line specific; the text that you killed on a previously -typed line is available to be yanked back later, when you are typing -another line. - @node Readline Arguments @subsection Readline Arguments @@ -212,95 +227,247 @@ argument acts as a repeat count, other times it is the @i{sign} of the argument that is significant. If you pass a negative argument to a command which normally acts in a forward direction, that command will act in a backward direction. For example, to kill text back to the -start of the line, you might type @key{M--} @key{C-k}. +start of the line, you might type @samp{M-- C-k}. The general way to pass numeric arguments to a command is to type meta -digits before the command. If the first `digit' you type is a minus +digits before the command. If the first `digit' typed is a minus sign (@key{-}), then the sign of the argument will be negative. Once you have typed one meta digit to get the argument started, you can type the remainder of the digits, and then the command. For example, to give -the @key{C-d} command an argument of 10, you could type @key{M-1 0 C-d}. - +the @key{C-d} command an argument of 10, you could type @samp{M-1 0 C-d}. + +@node Searching +@subsection Searching for Commands in the History + +Readline provides commands for searching through the command history +@ifset BashFeatures +(@pxref{Bash History Facilities}) +@end ifset +for lines containing a specified string. +There are two search modes: @var{incremental} and @var{non-incremental}. + +Incremental searches begin before the user has finished typing the +search string. +As each character of the search string is typed, Readline displays +the next entry from the history matching the string typed so far. +An incremental search requires only as many characters as needed to +find the desired history entry. +The @key{ESC} character is used to terminate an incremental search. +@key{C-j} will also terminate the search. +@key{C-g} will abort an incremental search and restore the original line. +When the search is terminated, the history entry containing the +search string becomes the current line. +To find other matching entries in the history list, type @key{C-s} or +@key{C-r} as appropriate. +This will search backward or forward in the history for the next +entry matching the search string typed so far. +Any other key sequence bound to a Readline command will terminate +the search and execute that command. +For instance, a @key{RET} will terminate the search and accept +the line, thereby executing the command from the history list. + +Non-incremental searches read the entire search string before starting +to search for matching history lines. The search string may be +typed by the user or be part of the contents of the current line. @node Readline Init File @section Readline Init File - -Although the Readline library comes with a set of Emacs-like -keybindings, it is possible that you would like to use a different set -of keybindings. You can customize programs that use Readline by putting -commands in an @dfn{init} file in your home directory. The name of this -file is @file{~/.inputrc}. +@cindex initialization file, readline + +Although the Readline library comes with a set of @code{emacs}-like +keybindings installed by default, it is possible to use a different set +of keybindings. +Any user can customize programs that use Readline by putting +commands in an @dfn{inputrc} file in his home directory. +The name of this +@ifset BashFeatures +file is taken from the value of the shell variable @code{INPUTRC}. If +@end ifset +@ifclear BashFeatures +file is taken from the value of the environment variable @code{INPUTRC}. If +@end ifclear +that variable is unset, the default is @file{~/.inputrc}. When a program which uses the Readline library starts up, the -@file{~/.inputrc} file is read, and the keybindings are set. +init file is read, and the key bindings are set. In addition, the @code{C-x C-r} command re-reads this init file, thus incorporating any changes that you might have made to it. @menu -* Readline Init Syntax:: Syntax for the commands in @file{~/.inputrc}. -* Readline Vi Mode:: Switching to @code{vi} mode in Readline. +* Readline Init File Syntax:: Syntax for the commands in the inputrc file. + +* Conditional Init Constructs:: Conditional key bindings in the inputrc file. + +* Sample Init File:: An example inputrc file. @end menu -@node Readline Init Syntax -@subsection Readline Init Syntax +@node Readline Init File Syntax +@subsection Readline Init File Syntax -There are only four constructs allowed in the @file{~/.inputrc} -file: +There are only a few basic constructs allowed in the +Readline init file. Blank lines are ignored. +Lines beginning with a @samp{#} are comments. +Lines beginning with a @samp{$} indicate conditional +constructs (@pxref{Conditional Init Constructs}). Other lines +denote variable settings and key bindings. @table @asis @item Variable Settings -You can change the state of a few variables in Readline. You do this by -using the @code{set} command within the init file. Here is how you -would specify that you wish to use Vi line editing commands: +You can modify the run-time behavior of Readline by +altering the values of variables in Readline +using the @code{set} command within the init file. Here is how to +change from the default Emacs-like key binding to use +@code{vi} line editing commands: @example set editing-mode vi @end example -Right now, there are only a few variables which can be set; so few in -fact, that we just iterate them here: +A great deal of run-time behavior is changeable with the following +variables. @table @code +@item bell-style +@vindex bell-style +Controls what happens when Readline wants to ring the terminal bell. +If set to @samp{none}, Readline never rings the bell. If set to +@samp{visible}, Readline uses a visible bell if one is available. +If set to @samp{audible} (the default), Readline attempts to ring +the terminal's bell. + +@item comment-begin +@vindex comment-begin +The string to insert at the beginning of the line when the +@code{insert-comment} command is executed. The default value +is @code{"#"}. + +@item completion-ignore-case +If set to @samp{on}, Readline performs filename matching and completion +in a case-insensitive fashion. +The default value is @samp{off}. + +@item completion-query-items +@vindex completion-query-items +The number of possible completions that determines when the user is +asked whether he wants to see the list of possibilities. If the +number of possible completions is greater than this value, +Readline will ask the user whether or not he wishes to view +them; otherwise, they are simply listed. The default limit is +@code{100}. + +@item convert-meta +@vindex convert-meta +If set to @samp{on}, Readline will convert characters with the +eighth bit set to an ASCII key sequence by stripping the eighth +bit and prepending an @key{ESC} character, converting them to a +meta-prefixed key sequence. The default value is @samp{on}. + +@item disable-completion +@vindex disable-completion +If set to @samp{On}, Readline will inhibit word completion. +Completion characters will be inserted into the line as if they had +been mapped to @code{self-insert}. The default is @samp{off}. + @item editing-mode @vindex editing-mode -The @code{editing-mode} variable controls which editing mode you are -using. By default, GNU Readline starts up in Emacs editing mode, where -the keystrokes are most similar to Emacs. This variable can either be -set to @code{emacs} or @code{vi}. +The @code{editing-mode} variable controls which default set of +key bindings is used. By default, Readline starts up in Emacs editing +mode, where the keystrokes are most similar to Emacs. This variable can be +set to either @samp{emacs} or @samp{vi}. + +@item enable-keypad +@vindex enable-keypad +When set to @samp{on}, Readline will try to enable the application +keypad when it is called. Some systems need this to enable the +arrow keys. The default is @samp{off}. + +@item expand-tilde +@vindex expand-tilde +If set to @samp{on}, tilde expansion is performed when Readline +attempts word completion. The default is @samp{off}. @item horizontal-scroll-mode @vindex horizontal-scroll-mode -This variable can either be set to @code{On} or @code{Off}. Setting it -to @code{On} means that the text of the lines that you edit will scroll -horizontally on a single screen line when they are larger than the width +This variable can be set to either @samp{on} or @samp{off}. Setting it +to @samp{on} means that the text of the lines being edited will scroll +horizontally on a single screen line when they are longer than the width of the screen, instead of wrapping onto a new screen line. By default, -this variable is set to @code{Off}. +this variable is set to @samp{off}. + +@item keymap +@vindex keymap +Sets Readline's idea of the current keymap for key binding commands. +Acceptable @code{keymap} names are +@code{emacs}, +@code{emacs-standard}, +@code{emacs-meta}, +@code{emacs-ctlx}, +@code{vi}, +@code{vi-command}, and +@code{vi-insert}. +@code{vi} is equivalent to @code{vi-command}; @code{emacs} is +equivalent to @code{emacs-standard}. The default value is @code{emacs}. +The value of the @code{editing-mode} variable also affects the +default keymap. + +@item mark-directories +If set to @samp{on}, completed directory names have a slash +appended. The default is @samp{on}. @item mark-modified-lines @vindex mark-modified-lines -This variable when set to @code{On}, says to display an asterisk -(@samp{*}) at the starts of history lines which have been modified. -This variable is off by default. - -@item prefer-visible-bell -@vindex prefer-visible-bell -If this variable is set to @code{On} it means to use a visible bell if -one is available, rather than simply ringing the terminal bell. By -default, the value is @code{Off}. +This variable, when set to @samp{on}, causes Readline to display an +asterisk (@samp{*}) at the start of history lines which have been modified. +This variable is @samp{off} by default. + +@item input-meta +@vindex input-meta +@vindex meta-flag +If set to @samp{on}, Readline will enable eight-bit input (it +will not strip the eighth bit from the characters it reads), +regardless of what the terminal claims it can support. The +default value is @samp{off}. The name @code{meta-flag} is a +synonym for this variable. + +@item output-meta +@vindex output-meta +If set to @samp{on}, Readline will display characters with the +eighth bit set directly rather than as a meta-prefixed escape +sequence. The default is @samp{off}. + +@item print-completions-horizontally +If set to @samp{on}, Readline will display completions with matches +sorted horizontally in alphabetical order, rather than down the screen. +The default is @samp{off}. + +@item show-all-if-ambiguous +@vindex show-all-if-ambiguous +This alters the default behavior of the completion functions. If +set to @samp{on}, +words which have more than one possible completion cause the +matches to be listed immediately instead of ringing the bell. +The default value is @samp{off}. + +@item visible-stats +@vindex visible-stats +If set to @samp{on}, a character denoting a file's type +is appended to the filename when listing possible +completions. The default is @samp{off}. + @end table @item Key Bindings -The syntax for controlling keybindings in the @file{~/.inputrc} file is -simple. First you have to know the @i{name} of the command that you -want to change. The following pages contain tables of the command name, -the default keybinding, and a short description of what the command -does. +The syntax for controlling key bindings in the init file is +simple. First you have to know the name of the command that you +want to change. The following sections contain tables of the command +name, the default keybinding, if any, and a short description of what +the command does. Once you know the name of the command, simply place the name of the key you wish to bind the command to, a colon, and then the name of the -command on a line in the @file{~/.inputrc} file. The name of the key +command on a line in the init file. The name of the key can be expressed in different ways, depending on which is most comfortable for you. @@ -310,19 +477,20 @@ comfortable for you. @example Control-u: universal-argument Meta-Rubout: backward-kill-word -Control-o: ">&output" +Control-o: "> output" @end example -In the above example, @samp{C-u} is bound to the function -@code{universal-argument}, and @samp{C-o} is bound to run the macro +In the above example, @key{C-u} is bound to the function +@code{universal-argument}, and @key{C-o} is bound to run the macro expressed on the right hand side (that is, to insert the text -@samp{>&output} into the line). +@samp{> output} into the line). @item @w{"@var{keyseq}": @var{function-name} or @var{macro}} -@var{keyseq} differs from @var{keyname} above in that strings denoting -an entire key sequence can be specified. Simply place the key sequence -in double quotes. GNU Emacs style key escapes can be used, as in the -following example: +@var{keyseq} differs from @var{keyname} above in that strings +denoting an entire key sequence can be specified, by placing +the key sequence in double quotes. Some GNU Emacs style key +escapes can be used, as in the following example, but the +special character names are not recognized. @example "\C-u": universal-argument @@ -330,14 +498,248 @@ following example: "\e[11~": "Function Key 1" @end example -In the above example, @samp{C-u} is bound to the function +In the above example, @key{C-u} is bound to the function @code{universal-argument} (just as it was in the first example), -@samp{C-x C-r} is bound to the function @code{re-read-init-file}, and -@samp{ESC [ 1 1 ~} is bound to insert the text @samp{Function Key 1}. +@samp{@key{C-x} @key{C-r}} is bound to the function @code{re-read-init-file}, +and @samp{@key{ESC} @key{[} @key{1} @key{1} @key{~}} is bound to insert +the text @samp{Function Key 1}. @end table + +The following GNU Emacs style escape sequences are available when +specifying key sequences: + +@table @code +@item @kbd{\C-} +control prefix +@item @kbd{\M-} +meta prefix +@item @kbd{\e} +an escape character +@item @kbd{\\} +backslash +@item @kbd{\"} +@key{"} +@item @kbd{\'} +@key{'} +@end table + +In addition to the GNU Emacs style escape sequences, a second +set of backslash escapes is available: + +@table @code +@item \a +alert (bell) +@item \b +backspace +@item \d +delete +@item \f +form feed +@item \n +newline +@item \r +carriage return +@item \t +horizontal tab +@item \v +vertical tab +@item \@var{nnn} +the character whose ASCII code is the octal value @var{nnn} +(one to three digits) +@item \x@var{nnn} +the character whose ASCII code is the hexadecimal value @var{nnn} +(one to three digits) +@end table + +When entering the text of a macro, single or double quotes must +be used to indicate a macro definition. +Unquoted text is assumed to be a function name. +In the macro body, the backslash escapes described above are expanded. +Backslash will quote any other character in the macro text, +including @samp{"} and @samp{'}. +For example, the following binding will make @samp{C-x \} +insert a single @samp{\} into the line: +@example +"\C-x\\": "\\" +@end example + +@end table + +@node Conditional Init Constructs +@subsection Conditional Init Constructs + +Readline implements a facility similar in spirit to the conditional +compilation features of the C preprocessor which allows key +bindings and variable settings to be performed as the result +of tests. There are four parser directives used. + +@table @code +@item $if +The @code{$if} construct allows bindings to be made based on the +editing mode, the terminal being used, or the application using +Readline. The text of the test extends to the end of the line; +no characters are required to isolate it. + +@table @code +@item mode +The @code{mode=} form of the @code{$if} directive is used to test +whether Readline is in @code{emacs} or @code{vi} mode. +This may be used in conjunction +with the @samp{set keymap} command, for instance, to set bindings in +the @code{emacs-standard} and @code{emacs-ctlx} keymaps only if +Readline is starting out in @code{emacs} mode. + +@item term +The @code{term=} form may be used to include terminal-specific +key bindings, perhaps to bind the key sequences output by the +terminal's function keys. The word on the right side of the +@samp{=} is tested against both the full name of the terminal and +the portion of the terminal name before the first @samp{-}. This +allows @code{sun} to match both @code{sun} and @code{sun-cmd}, +for instance. + +@item application +The @var{application} construct is used to include +application-specific settings. Each program using the Readline +library sets the @var{application name}, and you can test for it. +This could be used to bind key sequences to functions useful for +a specific program. For instance, the following command adds a +key sequence that quotes the current or previous word in Bash: +@example +$if Bash +# Quote the current or previous word +"\C-xq": "\eb\"\ef\"" +$endif +@end example +@end table + +@item $endif +This command, as seen in the previous example, terminates an +@code{$if} command. + +@item $else +Commands in this branch of the @code{$if} directive are executed if +the test fails. + +@item $include +This directive takes a single filename as an argument and reads commands +and bindings from that file. +@example +$include /etc/inputrc +@end example @end table +@node Sample Init File +@subsection Sample Init File + +Here is an example of an inputrc file. This illustrates key +binding, variable assignment, and conditional syntax. + +@example +@page +# This file controls the behaviour of line input editing for +# programs that use the Gnu Readline library. Existing programs +# include FTP, Bash, and Gdb. +# +# You can re-read the inputrc file with C-x C-r. +# Lines beginning with '#' are comments. +# +# First, include any systemwide bindings and variable assignments from +# /etc/Inputrc +$include /etc/Inputrc + +# +# Set various bindings for emacs mode. + +set editing-mode emacs + +$if mode=emacs + +Meta-Control-h: backward-kill-word Text after the function name is ignored + +# +# Arrow keys in keypad mode +# +#"\M-OD": backward-char +#"\M-OC": forward-char +#"\M-OA": previous-history +#"\M-OB": next-history +# +# Arrow keys in ANSI mode +# +"\M-[D": backward-char +"\M-[C": forward-char +"\M-[A": previous-history +"\M-[B": next-history +# +# Arrow keys in 8 bit keypad mode +# +#"\M-\C-OD": backward-char +#"\M-\C-OC": forward-char +#"\M-\C-OA": previous-history +#"\M-\C-OB": next-history +# +# Arrow keys in 8 bit ANSI mode +# +#"\M-\C-[D": backward-char +#"\M-\C-[C": forward-char +#"\M-\C-[A": previous-history +#"\M-\C-[B": next-history + +C-q: quoted-insert + +$endif + +# An old-style binding. This happens to be the default. +TAB: complete + +# Macros that are convenient for shell interaction +$if Bash +# edit the path +"\C-xp": "PATH=$@{PATH@}\e\C-e\C-a\ef\C-f" +# prepare to type a quoted word -- insert open and close double quotes +# and move to just after the open quote +"\C-x\"": "\"\"\C-b" +# insert a backslash (testing backslash escapes in sequences and macros) +"\C-x\\": "\\" +# Quote the current or previous word +"\C-xq": "\eb\"\ef\"" +# Add a binding to refresh the line, which is unbound +"\C-xr": redraw-current-line +# Edit variable on current line. +"\M-\C-v": "\C-a\C-k$\C-y\M-\C-e\C-a\C-y=" +$endif + +# use a visible bell if one is available +set bell-style visible + +# don't strip characters to 7 bits when reading +set input-meta on + +# allow iso-latin1 characters to be inserted rather than converted to +# prefix-meta sequences +set convert-meta off + +# display characters with the eighth bit set directly rather than +# as meta-prefixed characters +set output-meta on + +# if there are more than 150 possible completions for a word, ask the +# user if he wants to see all of them +set completion-query-items 150 + +# For FTP +$if Ftp +"\C-xg": "get \M-?" +"\C-xt": "put \M-?" +"\M-.": yank-last-arg +$endif +@end example + +@node Bindable Readline Commands +@section Bindable Readline Commands + @menu * Commands For Moving:: Moving about the line. * Commands For History:: Getting at previous lines. @@ -345,11 +747,15 @@ In the above example, @samp{C-u} is bound to the function * Commands For Killing:: Commands for killing and yanking. * Numeric Arguments:: Specifying numeric arguments, repeat counts. * Commands For Completion:: Getting Readline to do the typing for you. -* Miscellaneous Commands:: Other miscillaneous commands. +* Keyboard Macros:: Saving and re-executing typed characters +* Miscellaneous Commands:: Other miscellaneous commands. @end menu +This section describes Readline commands that may be bound to key +sequences. + @node Commands For Moving -@subsubsection Commands For Moving +@subsection Commands For Moving @ftable @code @item beginning-of-line (C-a) Move to the start of the current line. @@ -364,24 +770,39 @@ Move forward a character. Move back a character. @item forward-word (M-f) -Move forward to the end of the next word. +Move forward to the end of the next word. Words are composed of +letters and digits. @item backward-word (M-b) -Move back to the start of this, or the previous, word. +Move back to the start of this, or the previous, word. Words are +composed of letters and digits. @item clear-screen (C-l) -Clear the screen leaving the current line at the top of the screen. +Clear the screen and redraw the current line, +leaving the current line at the top of the screen. + +@item redraw-current-line () +Refresh the current line. By default, this is unbound. @end ftable @node Commands For History -@subsubsection Commands For Manipulating The History +@subsection Commands For Manipulating The History @ftable @code @item accept-line (Newline, Return) +@ifset BashFeatures +Accept the line regardless of where the cursor is. If this line is +non-empty, add it to the history list according to the setting of +the @code{HISTCONTROL} and @code{HISTIGNORE} variables. +If this line was a history line, then restore the history line to its +original state. +@end ifset +@ifclear BashFeatures Accept the line regardless of where the cursor is. If this line is non-empty, add it to the history list. If this line was a history line, then restore the history line to its original state. +@end ifclear @item previous-history (C-p) Move `up' through the history list. @@ -393,7 +814,8 @@ Move `down' through the history list. Move to the first line in the history. @item end-of-history (M->) -Move to the end of the input history, i.e., the line you are entering! +Move to the end of the input history, i.e., the line currently +being entered. @item reverse-search-history (C-r) Search backward starting at the current line and moving `up' through @@ -401,37 +823,78 @@ the history as necessary. This is an incremental search. @item forward-search-history (C-s) Search forward starting at the current line and moving `down' through -the the history as neccessary. +the the history as necessary. This is an incremental search. + +@item non-incremental-reverse-search-history (M-p) +Search backward starting at the current line and moving `up' +through the history as necessary using a non-incremental search +for a string supplied by the user. + +@item non-incremental-forward-search-history (M-n) +Search forward starting at the current line and moving `down' +through the the history as necessary using a non-incremental search +for a string supplied by the user. + +@item history-search-forward () +Search forward through the history for the string of characters +between the start of the current line and the current cursor +position (the @var{point}). This is a non-incremental search. By +default, this command is unbound. + +@item history-search-backward () +Search backward through the history for the string of characters +between the start of the current line and the point. This +is a non-incremental search. By default, this command is unbound. + +@item yank-nth-arg (M-C-y) +Insert the first argument to the previous command (usually +the second word on the previous line). With an argument @var{n}, +insert the @var{n}th word from the previous command (the words +in the previous command begin with word 0). A negative argument +inserts the @var{n}th word from the end of the previous command. + +@item yank-last-arg (M-., M-_) +Insert last argument to the previous command (the last word of the +previous history entry). With an +argument, behave exactly like @code{yank-nth-arg}. +Successive calls to @code{yank-last-arg} move back through the history +list, inserting the last argument of each line in turn. @end ftable @node Commands For Text -@subsubsection Commands For Changing Text +@subsection Commands For Changing Text @ftable @code @item delete-char (C-d) Delete the character under the cursor. If the cursor is at the -beginning of the line, and there are no characters in the line, and -the last character typed was not C-d, then return EOF. +beginning of the line, there are no characters in the line, and +the last character typed was not bound to @code{delete-char}, then +return @code{EOF}. @item backward-delete-char (Rubout) -Delete the character behind the cursor. A numeric arg says to kill -the characters instead of deleting them. +Delete the character behind the cursor. A numeric argument means +to kill the characters instead of deleting them. @item quoted-insert (C-q, C-v) -Add the next character that you type to the line verbatim. This is -how to insert things like C-q for example. +Add the next character typed to the line verbatim. This is +how to insert key sequences like @key{C-q}, for example. +@ifclear BashFeatures @item tab-insert (M-TAB) Insert a tab character. +@end ifclear @item self-insert (a, b, A, 1, !, ...) Insert yourself. @item transpose-chars (C-t) -Drag the character before point forward over the character at point. -Point moves forward as well. If point is at the end of the line, then -transpose the two characters before point. Negative args don't work. +Drag the character before the cursor forward over +the character at the cursor, moving the +cursor forward as well. If the insertion point +is at the end of the line, then this +transposes the last two characters of the line. +Negative arguments don't work. @item transpose-words (M-t) Drag the word behind the cursor past the word in front of the cursor @@ -439,47 +902,75 @@ moving the cursor over that word as well. @item upcase-word (M-u) Uppercase the current (or following) word. With a negative argument, -do the previous word, but do not move point. +uppercase the previous word, but do not move the cursor. @item downcase-word (M-l) Lowercase the current (or following) word. With a negative argument, -do the previous word, but do not move point. +lowercase the previous word, but do not move the cursor. @item capitalize-word (M-c) -Uppercase the current (or following) word. With a negative argument, -do the previous word, but do not move point. +Capitalize the current (or following) word. With a negative argument, +capitalize the previous word, but do not move the cursor. @end ftable @node Commands For Killing -@subsubsection Killing And Yanking +@subsection Killing And Yanking @ftable @code @item kill-line (C-k) Kill the text from the current cursor position to the end of the line. -@item backward-kill-line () -Kill backward to the beginning of the line. This is normally unbound. +@item backward-kill-line (C-x Rubout) +Kill backward to the beginning of the line. + +@item unix-line-discard (C-u) +Kill backward from the cursor to the beginning of the current line. +The killed text is saved on the kill-ring. + +@item kill-whole-line () +Kill all characters on the current line, no matter where the +cursor is. By default, this is unbound. @item kill-word (M-d) Kill from the cursor to the end of the current word, or if between -words, to the end of the next word. +words, to the end of the next word. Word boundaries are the same +as @code{forward-word}. @item backward-kill-word (M-DEL) -Kill the word behind the cursor. - -@item unix-line-discard (C-u) -Do what C-u used to do in Unix line input. We save the killed text on -the kill-ring, though. +Kill the word behind the cursor. Word boundaries are the same +as @code{backward-word}. @item unix-word-rubout (C-w) -Do what C-w used to do in Unix line input. The killed text is saved -on the kill-ring. This is different than backward-kill-word because -the word boundaries differ. +Kill the word behind the cursor, using white space as a word +boundary. The killed text is saved on the kill-ring. + +@item delete-horizontal-space () +Delete all spaces and tabs around point. By default, this is unbound. + +@item kill-region () +Kill the text between the point and the @emph{mark} (saved +cursor position). This text is referred to as the @var{region}. +By default, this command is unbound. + +@item copy-region-as-kill () +Copy the text in the region to the kill buffer, so it can be yanked +right away. By default, this command is unbound. + +@item copy-backward-word () +Copy the word before point to the kill buffer. +The word boundaries are the same as @code{backward-word}. +By default, this command is unbound. + +@item copy-forward-word () +Copy the word following point to the kill buffer. +The word boundaries are the same as @code{forward-word}. +By default, this command is unbound. @item yank (C-y) -Yank the top of the kill ring into the buffer at point. +Yank the top of the kill ring into the buffer at the current +cursor position. @item yank-pop (M-y) Rotate the kill-ring, and yank the new top. You can only do this if @@ -487,73 +978,284 @@ the prior command is yank or yank-pop. @end ftable @node Numeric Arguments -@subsubsection Specifying Numeric Arguments +@subsection Specifying Numeric Arguments @ftable @code @item digit-argument (M-0, M-1, ... M--) Add this digit to the argument already accumulating, or start a new -argument. M-- starts a negative argument. +argument. @key{M--} starts a negative argument. @item universal-argument () -Do what C-u does in emacs. By default, this is not bound. +This is another way to specify an argument. +If this command is followed by one or more digits, optionally with a +leading minus sign, those digits define the argument. +If the command is followed by digits, executing @code{universal-argument} +again ends the numeric argument, but is otherwise ignored. +As a special case, if this command is immediately followed by a +character that is neither a digit or minus sign, the argument count +for the next command is multiplied by four. +The argument count is initially one, so executing this function the +first time makes the argument count four, a second time makes the +argument count sixteen, and so on. +By default, this is not bound to a key. @end ftable - @node Commands For Completion -@subsubsection Letting Readline Type For You +@subsection Letting Readline Type For You @ftable @code @item complete (TAB) -Attempt to do completion on the text before point. This is -implementation defined. Generally, if you are typing a filename +Attempt to do completion on the text before the cursor. This is +application-specific. Generally, if you are typing a filename argument, you can do filename completion; if you are typing a command, -you can do command completion, if you are typing in a symbol to GDB, you -can do symbol name completion, if you are typing in a variable to Bash, -you can do variable name completion... +you can do command completion; if you are typing in a symbol to GDB, you +can do symbol name completion; if you are typing in a variable to Bash, +you can do variable name completion, and so on. +@ifset BashFeatures +Bash attempts completion treating the text as a variable (if the +text begins with @samp{$}), username (if the text begins with +@samp{~}), hostname (if the text begins with @samp{@@}), or +command (including aliases and functions) in turn. If none +of these produces a match, filename completion is attempted. +@end ifset @item possible-completions (M-?) -List the possible completions of the text before point. +List the possible completions of the text before the cursor. + +@item insert-completions (M-*) +Insert all completions of the text before point that would have +been generated by @code{possible-completions}. + +@item menu-complete () +Similar to @code{complete}, but replaces the word to be completed +with a single match from the list of possible completions. +Repeated execution of @code{menu-complete} steps through the list +of possible completions, inserting each match in turn. +At the end of the list of completions, the bell is rung and the +original text is restored. +An argument of @var{n} moves @var{n} positions forward in the list +of matches; a negative argument may be used to move backward +through the list. +This command is intended to be bound to @code{TAB}, but is unbound +by default. + +@ifset BashFeatures +@item complete-filename (M-/) +Attempt filename completion on the text before point. + +@item possible-filename-completions (C-x /) +List the possible completions of the text before point, +treating it as a filename. + +@item complete-username (M-~) +Attempt completion on the text before point, treating +it as a username. + +@item possible-username-completions (C-x ~) +List the possible completions of the text before point, +treating it as a username. + +@item complete-variable (M-$) +Attempt completion on the text before point, treating +it as a shell variable. + +@item possible-variable-completions (C-x $) +List the possible completions of the text before point, +treating it as a shell variable. + +@item complete-hostname (M-@@) +Attempt completion on the text before point, treating +it as a hostname. + +@item possible-hostname-completions (C-x @@) +List the possible completions of the text before point, +treating it as a hostname. + +@item complete-command (M-!) +Attempt completion on the text before point, treating +it as a command name. Command completion attempts to +match the text against aliases, reserved words, shell +functions, shell builtins, and finally executable filenames, +in that order. + +@item possible-command-completions (C-x !) +List the possible completions of the text before point, +treating it as a command name. + +@item dynamic-complete-history (M-TAB) +Attempt completion on the text before point, comparing +the text against lines from the history list for possible +completion matches. + +@item complete-into-braces (M-@{) +Perform filename completion and return the list of possible completions +enclosed within braces so the list is available to the shell +(@pxref{Brace Expansion}). + +@end ifset +@end ftable + +@node Keyboard Macros +@subsection Keyboard Macros +@ftable @code + +@item start-kbd-macro (C-x () +Begin saving the characters typed into the current keyboard macro. + +@item end-kbd-macro (C-x )) +Stop saving the characters typed into the current keyboard macro +and save the definition. + +@item call-last-kbd-macro (C-x e) +Re-execute the last keyboard macro defined, by making the characters +in the macro appear as if typed at the keyboard. + @end ftable @node Miscellaneous Commands -@subsubsection Some Miscellaneous Commands +@subsection Some Miscellaneous Commands @ftable @code @item re-read-init-file (C-x C-r) -Read in the contents of your @file{~/.inputrc} file, and incorporate -any bindings found there. +Read in the contents of the inputrc file, and incorporate +any bindings or variable assignments found there. @item abort (C-g) -Ding! Stops things. +Abort the current editing command and +ring the terminal's bell (subject to the setting of +@code{bell-style}). -@item do-uppercase-version (M-a, M-b, ...) -Run the command that is bound to your uppercase brother. +@item do-uppercase-version (M-a, M-b, M-@var{x}, @dots{}) +If the metafied character @var{x} is lowercase, run the command +that is bound to the corresponding uppercase character. @item prefix-meta (ESC) -Make the next character that you type be metafied. This is for people +Make the next character typed be metafied. This is for keyboards without a meta key. Typing @samp{ESC f} is equivalent to typing @samp{M-f}. -@item undo (C-_) +@item undo (C-_, C-x C-u) Incremental undo, separately remembered for each line. @item revert-line (M-r) -Undo all changes made to this line. This is like typing the `undo' +Undo all changes made to this line. This is like executing the @code{undo} command enough times to get back to the beginning. -@end ftable - -@node Readline Vi Mode -@subsection Readline Vi Mode -While the Readline library does not have a full set of Vi editing -functions, it does contain enough to allow simple editing of the line. +@item tilde-expand (M-~) +Perform tilde expansion on the current word. + +@item set-mark (C-@@) +Set the mark to the current point. If a +numeric argument is supplied, the mark is set to that position. + +@item exchange-point-and-mark (C-x C-x) +Swap the point with the mark. The current cursor position is set to +the saved position, and the old cursor position is saved as the mark. + +@item character-search (C-]) +A character is read and point is moved to the next occurrence of that +character. A negative count searches for previous occurrences. + +@item character-search-backward (M-C-]) +A character is read and point is moved to the previous occurrence +of that character. A negative count searches for subsequent +occurrences. + +@item insert-comment (M-#) +The value of the @code{comment-begin} +variable is inserted at the beginning of the current line, +and the line is accepted as if a newline had been typed. +@ifset BashFeatures +This makes the current line a shell comment. +@end ifset + +@item dump-functions () +Print all of the functions and their key bindings to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an @var{inputrc} file. This command is unbound by default. + +@item dump-variables () +Print all of the settable variables and their values to the +Readline output stream. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an @var{inputrc} file. This command is unbound by default. + +@item dump-macros () +Print all of the Readline key sequences bound to macros and the +strings they ouput. If a numeric argument is supplied, +the output is formatted in such a way that it can be made part +of an @var{inputrc} file. This command is unbound by default. + +@ifset BashFeatures +@item glob-expand-word (C-x *) +The word before point is treated as a pattern for pathname expansion, +and the list of matching file names is inserted, replacing the word. + +@item glob-list-expansions (C-x g) +The list of expansions that would have been generated by +@code{glob-expand-word} is displayed, and the line is redrawn. + +@item display-shell-version (C-x C-v) +Display version information about the current instance of Bash. + +@item shell-expand-line (M-C-e) +Expand the line as the shell does. +This performs alias and history expansion as well as all of the shell +word expansions (@pxref{Shell Expansions}). + +@item history-expand-line (M-^) +Perform history expansion on the current line. + +@item magic-space () +Perform history expansion on the current line and insert a space +(@pxref{History Interaction}). + +@item alias-expand-line () +Perform alias expansion on the current line (@pxref{Aliases}). + +@item history-and-alias-expand-line () +Perform history and alias expansion on the current line. + +@item insert-last-argument (M-., M-_) +A synonym for @code{yank-last-arg}. + +@item operate-and-get-next (C-o) +Accept the current line for execution and fetch the next line +relative to the current line from the history for editing. Any +argument is ignored. + +@item emacs-editing-mode (C-e) +When in @code{vi} editing mode, this causes a switch back to +@code{emacs} editing mode, as if the command @samp{set -o emacs} had +been executed. + +@end ifset -In order to switch interactively between Emacs and Vi editing modes, use -the command M-C-j (toggle-editing-mode). - -When you enter a line in Vi mode, you are already placed in `insertion' -mode, as if you had typed an `i'. Pressing @key{ESC} switches you into -`edit' mode, where you can edit the text of the line with the standard -Vi movement keys, move to previous history lines with `k', and following -lines with `j', and so forth. +@end ftable +@node Readline vi Mode +@section Readline vi Mode + +While the Readline library does not have a full set of @code{vi} +editing functions, it does contain enough to allow simple editing +of the line. The Readline @code{vi} mode behaves as specified in +the @sc{POSIX} 1003.2 standard. + +@ifset BashFeatures +In order to switch interactively between @code{emacs} and @code{vi} +editing modes, use the @samp{set -o emacs} and @samp{set -o vi} +commands (@pxref{The Set Builtin}). +@end ifset +@ifclear BashFeatures +In order to switch interactively between @code{emacs} and @code{vi} +editing modes, use the command M-C-j (toggle-editing-mode). +@end ifclear +The Readline default is @code{emacs} mode. + +When you enter a line in @code{vi} mode, you are already placed in +`insertion' mode, as if you had typed an @samp{i}. Pressing @key{ESC} +switches you into `command' mode, where you can edit the text of the +line with the standard @code{vi} movement keys, move to previous +history lines with @samp{k} and subsequent lines with @samp{j}, and +so forth. diff --git a/readline/doc/texinfo.tex b/readline/doc/texinfo.tex index 1652c553d66..7d62f26f703 100644 --- a/readline/doc/texinfo.tex +++ b/readline/doc/texinfo.tex @@ -1,6 +1,7 @@ %% TeX macros to handle texinfo files -% Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc. +% Copyright (C) 1985, 86, 88, 90, 91, 92, 93, +% 94, 95, 1996 Free Software Foundation, Inc. %This texinfo.tex file is free software; you can redistribute it and/or %modify it under the terms of the GNU General Public License as @@ -14,77 +15,148 @@ %You should have received a copy of the GNU General Public License %along with this texinfo.tex file; see the file COPYING. If not, write -%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, -%USA. +%to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +%Boston, MA 02111-1307, USA. %In other words, you are welcome to use, share and improve this program. %You are forbidden to forbid anyone else to use, share and improve %what you give them. Help stamp out software-hoarding! -\def\texinfoversion{2.46} + +% Send bug reports to bug-texinfo@prep.ai.mit.edu. +% Please include a *precise* test case in each bug report. + + +% Make it possible to create a .fmt file just by loading this file: +% if the underlying format is not loaded, start by loading it now. +% Added by gildea November 1993. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi + +% This automatically updates the version number based on RCS. +\def\deftexinfoversion$#1: #2 ${\def\texinfoversion{#2}} +\deftexinfoversion$Revision$ \message{Loading texinfo package [Version \texinfoversion]:} -\message{} -% Print the version number if in a .fmt file. -\everyjob{\message{[Texinfo version \texinfoversion]}\message{}} +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}\message{} + \catcode`+=\active \catcode`\_=\active} % Save some parts of plain tex whose names we will redefine. -\let\ptexlbrace=\{ -\let\ptexrbrace=\} -\let\ptexdots=\dots -\let\ptexdot=\. -\let\ptexstar=\* -\let\ptexend=\end -\let\ptexbullet=\bullet \let\ptexb=\b +\let\ptexbullet=\bullet \let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv = \equiv \let\ptexi=\i +\let\ptexlbrace=\{ +\let\ptexrbrace=\} +\let\ptexstar=\* \let\ptext=\t -\let\ptexl=\l -\let\ptexL=\L +\let\ptextilde=\~ + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} +\let\~ = \tie % And make it available as @~. -\def\tie{\penalty 10000\ } % Save plain tex definition of ~. \message{Basics,} \chardef\other=12 +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Set up fixed words for English. +\ifx\putwordChapter\undefined{\gdef\putwordChapter{Chapter}}\fi% +\def\putwordInfo{Info}% +\ifx\putwordSee\undefined{\gdef\putwordSee{See}}\fi% +\ifx\putwordsee\undefined{\gdef\putwordsee{see}}\fi% +\ifx\putwordfile\undefined{\gdef\putwordfile{file}}\fi% +\ifx\putwordpage\undefined{\gdef\putwordpage{page}}\fi% +\ifx\putwordsection\undefined{\gdef\putwordsection{section}}\fi% +\ifx\putwordSection\undefined{\gdef\putwordSection{Section}}\fi% +\ifx\putwordTableofContents\undefined{\gdef\putwordTableofContents{Table of Contents}}\fi% +\ifx\putwordShortContents\undefined{\gdef\putwordShortContents{Short Contents}}\fi% +\ifx\putwordAppendix\undefined{\gdef\putwordAppendix{Appendix}}\fi% + +% Ignore a token. +% +\def\gobble#1{} + \hyphenation{ap-pen-dix} \hyphenation{mini-buf-fer mini-buf-fers} \hyphenation{eshell} % Margin to add to right of even pages, to left of odd pages. -\newdimen \bindingoffset \bindingoffset=0pt -\newdimen \normaloffset \normaloffset=\hoffset +\newdimen \bindingoffset +\newdimen \normaloffset \newdimen\pagewidth \newdimen\pageheight -\pagewidth=\hsize \pageheight=\vsize + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{\tracingcommands2 \tracingstats2 + \tracingpages1 \tracingoutput1 \tracinglostchars1 + \tracingmacros2 \tracingparagraphs1 \tracingrestores1 + \showboxbreadth\maxdimen\showboxdepth\maxdimen +}% %---------------------Begin change----------------------- % +%%%% For @cropmarks command. % Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\cornerlong \newdimen\cornerthick \newdimen \topandbottommargin \newdimen \outerhsize \newdimen \outervsize -\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks +\cornerlong=1pc\cornerthick=.3pt % These set size of cropmarks \outerhsize=7in -\outervsize=9.5in +%\outervsize=9.5in +% Alternative @smallbook page size is 9.25in +\outervsize=9.25in \topandbottommargin=.75in % %---------------------End change----------------------- % \onepageout takes a vbox as an argument. Note that \pagecontents -% does insertions itself, but you have to call it yourself. +% does insertions, but you have to call it yourself. \chardef\PAGE=255 \output={\onepageout{\pagecontents\PAGE}} -\def\onepageout#1{\hoffset=\normaloffset -\ifodd\pageno \advance\hoffset by \bindingoffset -\else \advance\hoffset by -\bindingoffset\fi -{\escapechar=`\\\relax % makes sure backslash is used in output files. -\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}% -{\let\hsize=\pagewidth \makefootline}}}% -\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} +\def\onepageout#1{% + \hoffset=\normaloffset + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + {% + \escapechar = `\\ % use backslash in output files. + \indexdummies + \shipout\vbox{% + {\let\hsize=\pagewidth \makeheadline}% + \pagebody{#1}% + {\let\hsize=\pagewidth \makefootline}% + }% + }% + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} +%%%% For @cropmarks command %%%% % Here is a modification of the main output routine for Near East Publications % This provides right-angle cropmarks at all four corners. @@ -93,8 +165,9 @@ % site of the centerlined box. (P. A. MacKay, 12 November, 1986) % \def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up - \shipout - \vbox to \outervsize{\hsize=\outerhsize +{\escapechar=`\\\relax % makes sure backslash is used in output files. + \shipout + \vbox to \outervsize{\hsize=\outerhsize \vbox{\line{\ewtop\hfill\ewtop}} \nointerlineskip \line{\vbox{\moveleft\cornerthick\nstop} @@ -102,28 +175,33 @@ \vbox{\moveright\cornerthick\nstop}} \vskip \topandbottommargin \centerline{\ifodd\pageno\hskip\bindingoffset\fi - \vbox{ - {\let\hsize=\pagewidth \makeheadline} - \pagebody{#1} - {\let\hsize=\pagewidth \makefootline}} - \ifodd\pageno\else\hskip\bindingoffset\fi} - \vskip \topandbottommargin plus1fill minus1fill + \vbox{ + {\let\hsize=\pagewidth \makeheadline} + \pagebody{#1} + {\let\hsize=\pagewidth \makefootline}} + \ifodd\pageno\else\hskip\bindingoffset\fi} + \vskip \topandbottommargin plus1fill minus1fill \boxmaxdepth\cornerthick \line{\vbox{\moveleft\cornerthick\nsbot} \hfill \vbox{\moveright\cornerthick\nsbot}} \nointerlineskip \vbox{\line{\ewbot\hfill\ewbot}} - } - \advancepageno + }} + \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi} % % Do @cropmarks to get crop marks \def\cropmarks{\let\onepageout=\croppageout } +\newinsert\margin \dimen\margin=\maxdimen + \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1 \unvbox#1 \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} @@ -141,27 +219,82 @@ \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} -% Parse an argument, then pass it to #1. -% The argument can be delimited with [...] or with "..." or braces -% or it can be a whole line. -% #1 should be a macro which expects -% an ordinary undelimited TeX argument. - -\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx} +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg#1{% + \let\next = #1% + \begingroup + \obeylines + \futurelet\temp\parseargx +} +% If the next token is an obeyed space (from an @example environment or +% the like), remove it and recurse. Otherwise, we're done. \def\parseargx{% -\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else% -\aftergroup \parseargline % -\fi \endgroup} + % \obeyedspace is defined far below, after the definition of \sepspaces. + \ifx\obeyedspace\temp + \expandafter\parseargdiscardspace + \else + \expandafter\parseargline + \fi +} +% Remove a single space (as the delimiter token to the macro call). {\obeyspaces % -\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}} + \gdef\parseargdiscardspace {\futurelet\temp\parseargx}} -\gdef\obeyedspace{\ } - -\def\parseargline{\begingroup \obeylines \parsearglinex} {\obeylines % -\gdef\parsearglinex #1^^M{\endgroup \next {#1}}} + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + % + % First remove any @c comment, then any @comment. + % Result of each macro is put in \toks0. + \argremovec #1\c\relax % + \expandafter\argremovecomment \the\toks0 \comment\relax % + % + % Call the caller's macro, saved as \next in \parsearg. + \expandafter\next\expandafter{\the\toks0}% + }% +} + +% Since all \c{,omment} does is throw away the argument, we can let TeX +% do that for us. The \relax here is matched by the \relax in the call +% in \parseargline; it could be more or less anything, its purpose is +% just to delimit the argument to the \c. +\def\argremovec#1\c#2\relax{\toks0 = {#1}} +\def\argremovecomment#1\comment#2\relax{\toks0 = {#1}} + +% \argremovec{,omment} might leave us with trailing spaces, though; e.g., +% @end itemize @c foo +% will have two active spaces as part of the argument with the +% `itemize'. Here we remove all active spaces from #1, and assign the +% result to \toks0. +% +% This loses if there are any *other* active characters besides spaces +% in the argument -- _ ^ +, for example -- since they get expanded. +% Fortunately, Texinfo does not define any such commands. (If it ever +% does, the catcode of the characters in questionwill have to be changed +% here.) But this means we cannot call \removeactivespaces as part of +% \argremovec{,omment}, since @c uses \parsearg, and thus the argument +% that \parsearg gets might well have any character at all in it. +% +\def\removeactivespaces#1{% + \begingroup + \ignoreactivespaces + \edef\temp{#1}% + \global\toks0 = \expandafter{\temp}% + \endgroup +} + +% Change the active space to expand to nothing. +% +\begingroup + \obeyspaces + \gdef\ignoreactivespaces{\obeyspaces\let =\empty} +\endgroup + \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} @@ -173,7 +306,7 @@ \endgroup\fi} % This is not perfect, but it should reduce lossage % @begin foo is the same as @foo, for now. -\newhelp\EMsimple{Type to continue} +\newhelp\EMsimple{Type to continue.} \outer\def\begin{\parsearg\beginxxx} @@ -182,27 +315,50 @@ {\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else \csname #1\endcsname\fi} -%% @end foo executes the definition of \Efoo. -%% foo can be delimited by doublequotes or brackets. - +% @end foo executes the definition of \Efoo. +% \def\end{\parsearg\endxxx} - \def\endxxx #1{% -\expandafter\ifx\csname E#1\endcsname\relax -\expandafter\ifx\csname #1\endcsname\relax -\errmessage{Undefined command @end #1}\else -\errorE{#1}\fi\fi -\csname E#1\endcsname} -\def\errorE#1{ -{\errhelp=\EMsimple \errmessage{@end #1 not within #1 environment}}} + \removeactivespaces{#1}% + \edef\endthing{\the\toks0}% + % + \expandafter\ifx\csname E\endthing\endcsname\relax + \expandafter\ifx\csname \endthing\endcsname\relax + % There's no \foo, i.e., no ``environment'' foo. + \errhelp = \EMsimple + \errmessage{Undefined command `@end \endthing'}% + \else + \unmatchedenderror\endthing + \fi + \else + % Everything's ok; the right environment has been started. + \csname E\endthing\endcsname + \fi +} -% Single-spacing is done by various environments. +% There is an environment #1, but it hasn't been started. Give an error. +% +\def\unmatchedenderror#1{% + \errhelp = \EMsimple + \errmessage{This `@end #1' doesn't have a matching `@#1'}% +} + +% Define the control sequence \E#1 to give an unmatched @end error. +% +\def\defineunmatchedend#1{% + \expandafter\def\csname E#1\endcsname{\unmatchedenderror{#1}}% +} -\newskip\singlespaceskip \singlespaceskip = \baselineskip + +% Single-spacing is done by various environments (specifically, in +% \nonfillstart and \quotations). +\newskip\singlespaceskip \singlespaceskip = 12.5pt \def\singlespace{% -{\advance \baselineskip by -\singlespaceskip -\kern \baselineskip}% -\baselineskip=\singlespaceskip + % Why was this kern here? It messes up equalizing space above and below + % environments. --karl, 6may93 + %{\advance \baselineskip by -\singlespaceskip + %\kern \baselineskip}% + \setleading \singlespaceskip } %% Simple single-character @ commands @@ -211,17 +367,51 @@ % Kludge this until the fonts are right (grr). \def\@{{\tt \char '100}} -% Define @` and @' to be the same as ` and ' -% but suppressing ligatures. -\def\`{{`}} -\def\'{{'}} +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} % Used to generate quoted braces. - \def\mylbrace {{\tt \char '173}} \def\myrbrace {{\tt \char '175}} \let\{=\mylbrace \let\}=\myrbrace +\begingroup + % Definitions to produce actual \{ & \} command in an index. + \catcode`\{ = 12 \catcode`\} = 12 + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\@ = 0 \catcode`\\ = 12 + @gdef@lbracecmd[\{]% + @gdef@rbracecmd[\}]% +@endgroup + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown +% Plain TeX defines: @AA @AE @O @OE @L (and lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ptexi + \else\ifx\temp\jmacro \j + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } @@ -232,14 +422,84 @@ % @. is an end-of-sentence period. \def\.{.\spacefactor=3000 } -% @w prevents a word break -\def\w #1{\hbox{#1}} +% @enddots{} is an end-of-sentence ellipsis. +\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000} -% @group ... @end group forces ... to be all on one page. +% @! is an end-of-sentence bang. +\gdef\!{!\spacefactor=3000 } -\def\group{\begingroup% \inENV ??? -\def \Egroup{\egroup\endgroup} -\vbox\bgroup} +% @? is an end-of-sentence query. +\gdef\?{?\spacefactor=3000 } + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +\def\group{\begingroup + \ifnum\catcode13=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + % + % The \vtop we start below produces a box with normal height and large + % depth; thus, TeX puts \baselineskip glue before it, and (when the + % next line of text is done) \lineskip glue after it. (See p.82 of + % the TeXbook.) Thus, space below is not quite equal to space + % above. But it's pretty close. + \def\Egroup{% + \egroup % End the \vtop. + \endgroup % End the \group. + }% + % + \vtop\bgroup + % We have to put a strut on the last line in case the @group is in + % the midst of an example, rather than completely enclosing it. + % Otherwise, the interline space between the last line of the group + % and the first line afterwards is too small. But we can't put the + % strut in \Egroup, since there it would be on a line by itself. + % Hence this just inserts a strut at the beginning of each line. + \everypar = {\strut}% + % + % Since we have a strut on every line, we don't need any of TeX's + % normal interline spacing. + \offinterlineskip + % + % OK, but now we have to do something about blank + % lines in the input in @example-like environments, which normally + % just turn into \lisppar, which will insert no space now that we've + % turned off the interline space. Simplest is to make them be an + % empty paragraph. + \ifx\par\lisppar + \edef\par{\leavevmode \par}% + % + % Reset ^^M's definition to new definition of \par. + \obeylines + \fi + % + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. @@ -248,13 +508,47 @@ \def\need{\parsearg\needx} -\def\needx #1{\par % -% This method tries to make TeX break the page naturally -% if the depth of the box does not fit. -{\baselineskip=0pt% -\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 -\prevdepth=-1000pt -}} +% Old definition--didn't work. +%\def\needx #1{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000 +%\prevdepth=-1000pt +%}} + +\def\needx#1{% + % Go into vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % Don't add any leading before our big empty box, but allow a page + % break, since the best break might be right here. + \allowbreak + \nointerlineskip + \vtop to #1\mil{\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak +} % @br forces paragraph break @@ -271,22 +565,48 @@ % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin -\def\exdent{\errmessage{@exdent in filled text}} - % @lisp, etc, define \exdent locally from \internalexdent +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount -{\obeyspaces -\gdef\internalexdent{\parsearg\exdentzzz}} +% This defn is used inside fill environments such as @defun. +\def\exdent{\parsearg\exdentyyy} +\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}} -\def\exdentzzz #1{{\advance \leftskip by -\lispnarrowing -\advance \hsize by -\leftskip -\advance \hsize by -\rightskip -\leftline{{\rm#1}}}} +% This defn is used inside nofill environments such as @example. +\def\nofillexdent{\parsearg\nofillexdentyyy} +\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount +\leftline{\hskip\leftskip{\rm#1}}}} -% @include file insert text of that file as input. +% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph. -\def\include{\parsearg\includezzz} -\def\includezzz #1{{\def\thisfile{#1}\input #1 -}} +\def\inmargin#1{% +\strut\vadjust{\nobreak\kern-\strutdepth + \vtop to \strutdepth{\baselineskip\strutdepth\vss + \llap{\rightskip=\inmarginspacing \vbox{\noindent #1}}\null}}} +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} + +%\hbox{{\rm#1}}\hfil\break}} + +% @include file insert text of that file as input. +% Allow normal characters that we make active in the argument (a file name). +\def\include{\begingroup + \catcode`\\=12 + \catcode`~=12 + \catcode`^=12 + \catcode`_=12 + \catcode`|=12 + \catcode`<=12 + \catcode`>=12 + \catcode`+=12 + \parsearg\includezzz} +% Restore active chars for included file. +\def\includezzz#1{\endgroup\begingroup + % Read the included file in a group so nested @include's work. + \def\thisfile{#1}% + \input\thisfile +\endgroup} \def\thisfile{} @@ -300,7 +620,7 @@ % @sp n outputs n lines of vertical space \def\sp{\parsearg\spxxx} -\def\spxxx #1{\par \vskip #1\baselineskip} +\def\spxxx #1{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment @@ -313,6 +633,9 @@ \let\c=\comment +% @paragraphindent is defined for the Info formatting commands only. +\let\paragraphindent=\comment + % Prevent errors for section commands. % Used in @ignore and in failing conditionals. \def\ignoresections{% @@ -342,45 +665,278 @@ \let\titlepage=\relax } -\def\ignore{\begingroup\ignoresections -% Make sure that spaces turn into tokens that match what \ignorexxx wants. -\catcode32=10 -\ignorexxx} -\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces} +% Used in nested conditionals, where we have to parse the Texinfo source +% and so want to turn off most commands, in case they are used +% incorrectly. +% +\def\ignoremorecommands{% + \let\defcodeindex = \relax + \let\defcv = \relax + \let\deffn = \relax + \let\deffnx = \relax + \let\defindex = \relax + \let\defivar = \relax + \let\defmac = \relax + \let\defmethod = \relax + \let\defop = \relax + \let\defopt = \relax + \let\defspec = \relax + \let\deftp = \relax + \let\deftypefn = \relax + \let\deftypefun = \relax + \let\deftypevar = \relax + \let\deftypevr = \relax + \let\defun = \relax + \let\defvar = \relax + \let\defvr = \relax + \let\ref = \relax + \let\xref = \relax + \let\printindex = \relax + \let\pxref = \relax + \let\settitle = \relax + \let\setchapternewpage = \relax + \let\setchapterstyle = \relax + \let\everyheading = \relax + \let\evenheading = \relax + \let\oddheading = \relax + \let\everyfooting = \relax + \let\evenfooting = \relax + \let\oddfooting = \relax + \let\headings = \relax + \let\include = \relax + \let\lowersections = \relax + \let\down = \relax + \let\raisesections = \relax + \let\up = \relax + \let\set = \relax + \let\clear = \relax + \let\item = \relax +} -\def\direntry{\begingroup\direntryxxx} -\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces} +% Ignore @ignore ... @end ignore. +% +\def\ignore{\doignore{ignore}} -% Conditionals to test whether a flag is set. +% Also ignore @ifinfo, @ifhtml, @html, @menu, and @direntry text. +% +\def\ifinfo{\doignore{ifinfo}} +\def\ifhtml{\doignore{ifhtml}} +\def\html{\doignore{html}} +\def\menu{\doignore{menu}} +\def\direntry{\doignore{direntry}} -\outer\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx} +% Also ignore @macro ... @end macro. The user must run texi2dvi, +% which runs makeinfo to do macro expansion. Ignore @unmacro, too. +\def\macro{\doignore{macro}} +\let\unmacro = \comment -\def\ifsetxxx #1{\endgroup -\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail -\else \let\temp=\relax \fi -\temp} -\def\Eifset{} -\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx} -\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces} -\outer\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx} +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory = \comment -\def\ifclearxxx #1{\endgroup -\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax -\else \let\temp=\ifclearfail \fi -\temp} -\def\Eifclear{} -\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx} -\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces} +% Ignore text until a line `@end #1'. +% +\def\doignore#1{\begingroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define a command to swallow text until we reach `@end #1'. + \long\def\doignoretext##1\end #1{\enddoignore}% + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \catcode32 = 10 + % + % And now expand that command. + \doignoretext +} -% Some texinfo constructs that are trivial in tex +% What we do to finish off ignored text. +% +\def\enddoignore{\endgroup\ignorespaces}% + +\newif\ifwarnedobs\warnedobsfalse +\def\obstexwarn{% + \ifwarnedobs\relax\else + % We need to warn folks that they may have trouble with TeX 3.0. + % This uses \immediate\write16 rather than \message to get newlines. + \immediate\write16{} + \immediate\write16{***WARNING*** for users of Unix TeX 3.0!} + \immediate\write16{This manual trips a bug in TeX version 3.0 (tex hangs).} + \immediate\write16{If you are running another version of TeX, relax.} + \immediate\write16{If you are running Unix TeX 3.0, kill this TeX process.} + \immediate\write16{ Then upgrade your TeX installation if you can.} + \immediate\write16{ (See ftp://ftp.gnu.ai.mit.edu/pub/gnu/TeX.README.)} + \immediate\write16{If you are stuck with version 3.0, run the} + \immediate\write16{ script ``tex3patch'' from the Texinfo distribution} + \immediate\write16{ to use a workaround.} + \immediate\write16{} + \global\warnedobstrue + \fi +} + +% **In TeX 3.0, setting text in \nullfont hangs tex. For a +% workaround (which requires the file ``dummy.tfm'' to be installed), +% uncomment the following line: +%%%%%\font\nullfont=dummy\let\obstexwarn=\relax + +% Ignore text, except that we keep track of conditional commands for +% purposes of nesting, up to an `@end #1' command. +% +\def\nestedignore#1{% + \obstexwarn + % We must actually expand the ignored text to look for the @end + % command, so that nested ignore constructs work. Thus, we put the + % text into a \vbox and then do nothing with the result. To minimize + % the change of memory overflow, we follow the approach outlined on + % page 401 of the TeXbook: make the current font be a dummy font. + % + \setbox0 = \vbox\bgroup + % Don't complain about control sequences we have declared \outer. + \ignoresections + % + % Define `@end #1' to end the box, which will in turn undefine the + % @end command again. + \expandafter\def\csname E#1\endcsname{\egroup\ignorespaces}% + % + % We are going to be parsing Texinfo commands. Most cause no + % trouble when they are used incorrectly, but some commands do + % complicated argument parsing or otherwise get confused, so we + % undefine them. + % + % We can't do anything about stray @-signs, unfortunately; + % they'll produce `undefined control sequence' errors. + \ignoremorecommands + % + % Set the current font to be \nullfont, a TeX primitive, and define + % all the font commands to also use \nullfont. We don't use + % dummy.tfm, as suggested in the TeXbook, because not all sites + % might have that installed. Therefore, math mode will still + % produce output, but that should be an extremely small amount of + % stuff compared to the main input. + % + \nullfont + \let\tenrm = \nullfont \let\tenit = \nullfont \let\tensl = \nullfont + \let\tenbf = \nullfont \let\tentt = \nullfont \let\smallcaps = \nullfont + \let\tensf = \nullfont + % Similarly for index fonts (mostly for their use in + % smallexample) + \let\indrm = \nullfont \let\indit = \nullfont \let\indsl = \nullfont + \let\indbf = \nullfont \let\indtt = \nullfont \let\indsc = \nullfont + \let\indsf = \nullfont + % + % Don't complain when characters are missing from the fonts. + \tracinglostchars = 0 + % + % Don't bother to do space factor calculations. + \frenchspacing + % + % Don't report underfull hboxes. + \hbadness = 10000 + % + % Do minimal line-breaking. + \pretolerance = 10000 + % + % Do not execute instructions in @tex + \def\tex{\doignore{tex}} +} + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. Make sure the catcode of space is correct to avoid +% losing inside @example, for instance. +% +\def\set{\begingroup\catcode` =10 \parsearg\setxxx} +\def\setxxx#1{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + \def\temp{#2}% + \ifx\temp\empty \global\expandafter\let\csname SET#1\endcsname = \empty + \else \setzzz{#1}#2\endsetzzz % Remove the trailing space \setxxx inserted. + \fi + \endgroup +} +% Can't use \xdef to pre-expand #2 and save some time, since \temp or +% \next or other control sequences that we've defined might get us into +% an infinite loop. Consider `@set foo @cite{bar}'. +\def\setzzz#1#2 \endsetzzz{\expandafter\gdef\csname SET#1\endcsname{#2}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\def\clear{\parsearg\clearxxx} +\def\clearxxx#1{\global\expandafter\let\csname SET#1\endcsname=\relax} + +% @value{foo} gets the text saved in variable foo. +% +\def\value#1{\expandafter + \ifx\csname SET#1\endcsname\relax + {\{No value for ``#1''\}} + \else \csname SET#1\endcsname \fi} -\def\iftex{} -\def\Eiftex{} -\def\ifinfo{\begingroup\ignoresections\ifinfoxxx} -\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces} +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +\def\ifset{\parsearg\ifsetxxx} +\def\ifsetxxx #1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \expandafter\ifsetfail + \else + \expandafter\ifsetsucceed + \fi +} +\def\ifsetsucceed{\conditionalsucceed{ifset}} +\def\ifsetfail{\nestedignore{ifset}} +\defineunmatchedend{ifset} -\long\def\menu #1\end menu{} +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +\def\ifclear{\parsearg\ifclearxxx} +\def\ifclearxxx #1{% + \expandafter\ifx\csname SET#1\endcsname\relax + \expandafter\ifclearsucceed + \else + \expandafter\ifclearfail + \fi +} +\def\ifclearsucceed{\conditionalsucceed{ifclear}} +\def\ifclearfail{\nestedignore{ifclear}} +\defineunmatchedend{ifclear} + +% @iftex always succeeds; we read the text following, through @end +% iftex). But `@end iftex' should be valid only after an @iftex. +% +\def\iftex{\conditionalsucceed{iftex}} +\defineunmatchedend{iftex} + +% We can't just want to start a group at @iftex (for example) and end it +% at @end iftex, since then @set commands inside the conditional have no +% effect (they'd get reverted at the end of the group). So we must +% define \Eiftex to redefine itself to be its previous value. (We can't +% just define it to fail again with an ``unmatched end'' error, since +% the @ifset might be nested.) +% +\def\conditionalsucceed#1{% + \edef\temp{% + % Remember the current value of \E#1. + \let\nece{prevE#1} = \nece{E#1}% + % + % At the `@end #1', redefine \E#1 to be its previous value. + \def\nece{E#1}{\let\nece{E#1} = \nece{prevE#1}}% + }% + \temp +} + +% We need to expand lots of \csname's, but we don't want to expand the +% control sequences after we've constructed them. +% +\def\nece#1{\expandafter\noexpand\csname#1\endcsname} + +% @asis just yields its argument. Used with @table, for example. +% \def\asis#1{#1} % @math means output in math mode. @@ -389,32 +945,38 @@ % we read the toc file back, the $'s will be normal characters (as they % should be, according to the definition of Texinfo). So we must use a % control sequence to switch into and out of math mode. -% +% % This isn't quite enough for @math to work properly in indices, but it % seems unlikely it will ever be needed there. -% +% \let\implicitmath = $ \def\math#1{\implicitmath #1\implicitmath} +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{\implicitmath\ptexbullet\implicitmath} +\def\minus{\implicitmath-\implicitmath} + \def\node{\ENVcheck\parsearg\nodezzz} \def\nodezzz#1{\nodexxx [#1,]} \def\nodexxx[#1,#2]{\gdef\lastnode{#1}} +\let\nwnode=\node \let\lastnode=\relax \def\donoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\setref{\lastnode}\fi -\let\lastnode=\relax} +\global\let\lastnode=\relax} \def\unnumbnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi -\let\lastnode=\relax} +\global\let\lastnode=\relax} \def\appendixnoderef{\ifx\lastnode\relax\else \expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi -\let\lastnode=\relax} +\global\let\lastnode=\relax} +% @refill is a no-op. \let\refill=\relax - + % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. @@ -427,12 +989,24 @@ \comment % Ignore the actual filename. } +% @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} -\def\inforef #1{\inforefzzz #1,,,,**} -\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}}, - node \samp{\losespace#1{}}} -\def\losespace #1{#1} +% \def\macro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\macroxxx} +% \def\macroxxx#1#2 \end macro{% +% \expandafter\gdef\macrotemp#1{#2}% +% \endgroup} + +%\def\linemacro#1{\begingroup\ignoresections\catcode`\#=6\def\macrotemp{#1}\parsearg\linemacroxxx} +%\def\linemacroxxx#1#2 \end linemacro{% +%\let\parsearg=\relax +%\edef\macrotempx{\csname M\butfirst\expandafter\string\macrotemp\endcsname}% +%\expandafter\xdef\macrotemp{\parsearg\macrotempx}% +%\expandafter\gdef\macrotempx#1{#2}% +%\endgroup} + +%\def\butfirst#1{} + \message{fonts,} @@ -444,90 +1018,136 @@ \def\sf{\fam=\sffam \tensf} \let\li = \sf % Sometimes we call it \li, not \sf. +% We don't need math for this one. +\def\ttsl{\tenttsl} + %% Try out Computer Modern fonts at \magstephalf -\font\textrm=cmr10 scaled \magstephalf -\font\texttt=cmtt10 scaled \magstephalf +\let\mainmagstep=\magstephalf + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +\ifx\bigger\relax +\let\mainmagstep=\magstep1 +\setfont\textrm\rmshape{12}{1000} +\setfont\texttt\ttshape{12}{1000} +\else +\setfont\textrm\rmshape{10}{\mainmagstep} +\setfont\texttt\ttshape{10}{\mainmagstep} +\fi % Instead of cmb10, you many want to use cmbx10. % cmbx10 is a prettier font on its own, but cmb10 % looks better when embedded in a line with cmr10. -\font\textbf=cmb10 scaled \magstephalf -\font\textit=cmti10 scaled \magstephalf -\font\textsl=cmsl10 scaled \magstephalf -\font\textsf=cmss10 scaled \magstephalf -\font\textsc=cmcsc10 scaled \magstephalf -\font\texti=cmmi10 scaled \magstephalf -\font\textsy=cmsy10 scaled \magstephalf +\setfont\textbf\bfshape{10}{\mainmagstep} +\setfont\textit\itshape{10}{\mainmagstep} +\setfont\textsl\slshape{10}{\mainmagstep} +\setfont\textsf\sfshape{10}{\mainmagstep} +\setfont\textsc\scshape{10}{\mainmagstep} +\setfont\textttsl\ttslshape{10}{\mainmagstep} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep % A few fonts for @defun, etc. -\font\defbf=cmbx10 scaled \magstep1 %was 1314 -\font\deftt=cmtt10 scaled \magstep1 +\setfont\defbf\bxshape{10}{\magstep1} %was 1314 +\setfont\deftt\ttshape{10}{\magstep1} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf} -% Fonts for indices and small examples. -% We actually use the slanted font rather than the italic, +% Fonts for indices and small examples (9pt). +% We actually use the slanted font rather than the italic, % because texinfo normally uses the slanted fonts for that. % Do not make many font distinctions in general in the index, since they % aren't very useful. -\font\ninett=cmtt9 -\font\indrm=cmr9 -\font\indit=cmsl9 +\setfont\ninett\ttshape{9}{1000} +\setfont\indrm\rmshape{9}{1000} +\setfont\indit\slshape{9}{1000} \let\indsl=\indit \let\indtt=\ninett +\let\indttsl=\ninett \let\indsf=\indrm \let\indbf=\indrm -\let\indsc=\indrm +\setfont\indsc\scshape{10}{900} \font\indi=cmmi9 \font\indsy=cmsy9 -% Fonts for headings -\font\chaprm=cmbx12 scaled \magstep2 -\font\chapit=cmti12 scaled \magstep2 -\font\chapsl=cmsl12 scaled \magstep2 -\font\chaptt=cmtt12 scaled \magstep2 -\font\chapsf=cmss12 scaled \magstep2 +% Chapter (and unnumbered) fonts (17.28pt). +\setfont\chaprm\rmbshape{12}{\magstep2} +\setfont\chapit\itbshape{10}{\magstep3} +\setfont\chapsl\slbshape{10}{\magstep3} +\setfont\chaptt\ttbshape{12}{\magstep2} +\setfont\chapttsl\ttslshape{10}{\magstep3} +\setfont\chapsf\sfbshape{12}{\magstep2} \let\chapbf=\chaprm -\font\chapsc=cmcsc10 scaled\magstep3 +\setfont\chapsc\scbshape{10}{\magstep3} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 -\font\secrm=cmbx12 scaled \magstep1 -\font\secit=cmti12 scaled \magstep1 -\font\secsl=cmsl12 scaled \magstep1 -\font\sectt=cmtt12 scaled \magstep1 -\font\secsf=cmss12 scaled \magstep1 -\font\secbf=cmbx12 scaled \magstep1 -\font\secsc=cmcsc10 scaled\magstep2 +% Section fonts (14.4pt). +\setfont\secrm\rmbshape{12}{\magstep1} +\setfont\secit\itbshape{10}{\magstep2} +\setfont\secsl\slbshape{10}{\magstep2} +\setfont\sectt\ttbshape{12}{\magstep1} +\setfont\secttsl\ttslshape{10}{\magstep2} +\setfont\secsf\sfbshape{12}{\magstep1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 -% \font\ssecrm=cmbx10 scaled \magstep1 % This size an font looked bad. -% \font\ssecit=cmti10 scaled \magstep1 % The letters were too crowded. -% \font\ssecsl=cmsl10 scaled \magstep1 -% \font\ssectt=cmtt10 scaled \magstep1 -% \font\ssecsf=cmss10 scaled \magstep1 +% \setfont\ssecrm\bxshape{10}{\magstep1} % This size an font looked bad. +% \setfont\ssecit\itshape{10}{\magstep1} % The letters were too crowded. +% \setfont\ssecsl\slshape{10}{\magstep1} +% \setfont\ssectt\ttshape{10}{\magstep1} +% \setfont\ssecsf\sfshape{10}{\magstep1} -%\font\ssecrm=cmb10 scaled 1315 % Note the use of cmb rather than cmbx. -%\font\ssecit=cmti10 scaled 1315 % Also, the size is a little larger than -%\font\ssecsl=cmsl10 scaled 1315 % being scaled magstep1. -%\font\ssectt=cmtt10 scaled 1315 -%\font\ssecsf=cmss10 scaled 1315 +%\setfont\ssecrm\bfshape{10}{1315} % Note the use of cmb rather than cmbx. +%\setfont\ssecit\itshape{10}{1315} % Also, the size is a little larger than +%\setfont\ssecsl\slshape{10}{1315} % being scaled magstep1. +%\setfont\ssectt\ttshape{10}{1315} +%\setfont\ssecsf\sfshape{10}{1315} %\let\ssecbf=\ssecrm -\font\ssecrm=cmbx12 scaled \magstephalf -\font\ssecit=cmti12 scaled \magstephalf -\font\ssecsl=cmsl12 scaled \magstephalf -\font\ssectt=cmtt12 scaled \magstephalf -\font\ssecsf=cmss12 scaled \magstephalf -\font\ssecbf=cmbx12 scaled \magstephalf -\font\ssecsc=cmcsc10 scaled \magstep1 +% Subsection fonts (13.15pt). +\setfont\ssecrm\rmbshape{12}{\magstephalf} +\setfont\ssecit\itbshape{10}{1315} +\setfont\ssecsl\slbshape{10}{1315} +\setfont\ssectt\ttbshape{12}{\magstephalf} +\setfont\ssecttsl\ttslshape{10}{\magstep1} +\setfont\ssecsf\sfbshape{12}{\magstephalf} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{\magstep1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled \magstep1 % The smallcaps and symbol fonts should actually be scaled \magstep1.5, % but that is not a standard magnification. % Fonts for title page: -\font\titlerm = cmbx12 scaled \magstep3 +\setfont\titlerm\rmbshape{12}{\magstep3} \let\authorrm = \secrm % In order for the font changes to affect most math symbols and letters, @@ -535,7 +1155,7 @@ % texinfo doesn't allow for producing subscripts and superscripts, we % don't bother to reset \scriptfont and \scriptscriptfont (which would % also require loading a lot more fonts). -% +% \def\resetmathfonts{% \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf @@ -546,46 +1166,47 @@ % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this so that font changes will continue to work % in math mode, where it is the current \fam that is relevant in most -% cases, not the current. Plain TeX does, for example, -% \def\bf{\fam=\bffam \tenbf} By redefining \tenbf, we obviate the need -% to redefine \bf itself. +% cases, not the current font. Plain TeX does \def\bf{\fam=\bffam +% \tenbf}, for example. By redefining \tenbf, we obviate the need to +% redefine \bf itself. \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc - \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \resetmathfonts} \def\chapfonts{% - \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc - \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy - \resetmathfonts} + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl + \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl - \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\sectt - \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy - \resetmathfonts} + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl + \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc - \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy - \resetmathfonts} + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? \def\indexfonts{% - \let\tenrm=\indrm \let\tenit=\tenit \let\tensl=\indsl + \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc - \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy - \resetmathfonts} + \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy \let\tenttsl=\indttsl + \resetmathfonts \setleading{12pt}} % Set up the default fonts, so we can use them for creating boxes. -% +% \textfonts % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Fonts for short table of contents. -\font\shortcontrm=cmr12 -\font\shortcontbf=cmbx12 -\font\shortcontsl=cmsl12 +\setfont\shortcontrm\rmshape{12}{1000} +\setfont\shortcontbf\bxshape{12}{1000} +\setfont\shortcontsl\slshape{12}{1000} %% Add scribe-like font environments, plus @l for inline lisp (usually sans %% serif) and @ii for TeX italic @@ -604,51 +1225,123 @@ \def\b#1{{\bf #1}} \let\strong=\b -\def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null} -\let\ttfont = \t -%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null} +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +\def\t#1{% + {\tt \rawbackslash \frenchspacing #1}% + \null +} +\let\ttfont=\t \def\samp #1{`\tclose{#1}'\null} -\def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null} +\setfont\smallrm\rmshape{8}{1000} +\font\smallsy=cmsy9 +\def\key#1{{\smallrm\textfont2=\smallsy \leavevmode\hbox{% + \raise0.4pt\hbox{$\langle$}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{$\langle$}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{$\rangle$}}}} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} \def\ctrl #1{{\tt \rawbackslash \hat}#1} \let\file=\samp +\let\url=\samp % perhaps include a hypertex \special eventually +\def\email#1{$\langle${\tt #1}$\rangle$} % @code is a modification of @t, % which makes spaces the same size as normal in the surrounding text. -\newdimen\tclosesave -\newdimen\tcloserm -\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font -\fontdimen2\font=\tcloserm -% prevent breaking lines at hyphens. -\exhyphenpenalty=10000 -\def\ {{\fontdimen2\font=\tclosesave{} }}% - \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null} -\let\code=\tclose +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \frenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in \code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ +\catcode`\-=\active +\catcode`\_=\active +\global\def\code{\begingroup \catcode`\-=\active \let-\codedash \catcode`\_=\active \let_\codeunder \codex} +% The following is used by \doprintindex to insure that long function names +% wrap around. It is necessary for - and _ to be active before the index is +% read from the file, as \entry parses the arguments long before \code is +% ever called. -- mycroft +\global\def\indexbreaks{\catcode`\-=\active \let-\realdash \catcode`\_=\active \let_\realunder} +} + +\def\realdash{-} +\def\realunder{_} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{\normalunderscore\discretionary{}{}{}} +\def\codex #1{\tclose{#1}\endgroup} + %\let\exp=\tclose %Was temporary -% @kbd is like @code, except that if the argument is just one @key command, +% @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. - +% \def\xkey{\key} \def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% -\else\tclose{\look}\fi -\else\tclose{\look}\fi} +\else{\tclose{\ttsl\look}}\fi +\else{\tclose{\ttsl\look}}\fi} + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of % @dmn{}pt. -% +% \def\dmn#1{\thinspace #1} \def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} -\def\l#1{{\li #1}\null} % +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} -\def\r#1{{\rm #1}} % roman font +\def\r#1{{\rm #1}} % roman font % Use of \lowercase was suggested. -\def\sc#1{{\smallcaps#1}} % smallcaps font -\def\ii#1{{\it #1}} % italic font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +% @pounds{} is a sterling sign. +\def\pounds{{\it\$}} + \message{page headings,} @@ -658,10 +1351,13 @@ % First the title page. Must do @settitle before @titlepage. \def\titlefont#1{{\titlerm #1}} -\newtoks\realeverypar \newif\ifseenauthor \newif\iffinishedtitlepage +\def\shorttitlepage{\parsearg\shorttitlepagezzz} +\def\shorttitlepagezzz #1{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + \def\titlepage{\begingroup \parindent=0pt \textfonts \let\subtitlerm=\tenrm % I deinstalled the following change because \cmr12 is undefined. @@ -677,9 +1373,9 @@ % Now you can print the title using @title. \def\title{\parsearg\titlezzz}% \def\titlezzz##1{\leftline{\titlefont{##1}} - % print a rule at the page bottom also. - \finishedtitlepagefalse - \vskip4pt \hrule height 4pt \vskip4pt}% + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt}% % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % @@ -691,13 +1387,13 @@ \def\author{\parsearg\authorzzz}% \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi {\authorfont \leftline{##1}}}% - % + % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else - \finishtitlepage + \finishtitlepage \fi \oldpage \let\page = \oldpage @@ -719,7 +1415,7 @@ } \def\finishtitlepage{% - \vskip4pt \hrule height 2pt + \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } @@ -785,14 +1481,15 @@ % }% unbind the catcode of @. -% @headings double turns headings on for double-sided printing. -% @headings single turns headings on for single-sided printing. -% @headings off turns them off. -% @headings on same as @headings double, retained for compatibility. -% @headings after turns on double-sided headings after this page. -% @headings doubleafter turns on double-sided headings after this page. +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. -% By default, they are off. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} @@ -806,22 +1503,24 @@ % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{ -%\pagealignmacro \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage } +\let\contentsalignmacro = \chappager + % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{ -%\pagealignmacro \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} @@ -832,6 +1531,7 @@ \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} @@ -840,6 +1540,7 @@ \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings @@ -863,6 +1564,7 @@ July\or August\or September\or October\or November\or December\fi \def\settitle{\parsearg\settitlezzz} \def\settitlezzz #1{\gdef\thistitle{#1}} + \message{tables,} % @tabs -- simple alignment @@ -876,7 +1578,7 @@ July\or August\or September\or October\or November\or December\fi %\def\tablinezzz #1{\+#1\cr} %\def\&{&} -% Tables -- @table, @ftable, @item(x), @kitem(x), @xitem(x). +% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in @@ -888,18 +1590,23 @@ July\or August\or September\or October\or November\or December\fi % used internally for \itemindent minus \itemmargin \newdimen\itemmax -% Note @table and @ftable define @item, @itemx, etc., with these defs. +% Note @table, @vtable, and @vtable define @item, @itemx, etc., with +% these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + \def\internalBitem{\smallbreak \parsearg\itemzzz} -\def\internalBitemx{\par \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} -\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz} +\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} \def\internalBkitem{\smallbreak \parsearg\kitemzzz} -\def\internalBkitemx{\par \parsearg\kitemzzz} +\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} \def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% \itemzzz {#1}} @@ -908,19 +1615,53 @@ July\or August\or September\or October\or November\or December\fi \itemzzz {#1}} \def\itemzzz #1{\begingroup % -\advance \hsize by -\rightskip % -\advance \hsize by -\leftskip % -\setbox0=\hbox{\itemfont{#1}}% -\itemindex{#1}% -\parskip=0in % -\noindent % -\ifdim \wd0>\itemmax % -\vadjust{\penalty 10000}% -\hbox to \hsize{\hskip -\tableindent\box0\hss}\ % -\else % -\hbox to 0pt{\hskip -\tableindent\box0\hss}% -\fi % -\endgroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemfont{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % Be sure we are not still in the middle of a paragraph. + %{\parskip = 0in + %\par + %}% + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. Unfortunately + % we can't prevent a possible page break at the following + % \baselineskip glue. + \nobreak + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. Since that + % text will be indented by \tableindent, we make the item text be in + % a zero-width box. + \noindent + \rlap{\hskip -\tableindent\box0}\ignorespaces% + \endgroup% + \itemxneedsnegativevskiptrue% + \fi } \def\item{\errmessage{@item while not in a table}} @@ -942,11 +1683,19 @@ July\or August\or September\or October\or November\or December\fi {\obeylines\obeyspaces% \gdef\ftablex #1^^M{% \tabley\fnitemindex#1 \endtabley -\def\Eftable{\endgraf\endgroup\afterenvbreak}% +\def\Eftable{\endgraf\afterenvbreak\endgroup}% +\let\Etable=\relax}} + +\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex} +{\obeylines\obeyspaces% +\gdef\vtablex #1^^M{% +\tabley\vritemindex#1 \endtabley +\def\Evtable{\endgraf\afterenvbreak\endgroup}% \let\Etable=\relax}} \def\dontindex #1{} \def\fnitemindex #1{\doind {fn}{\code{#1}}}% +\def\vritemindex #1{\doind {vr}{\code{#1}}}% {\obeyspaces % \gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup% @@ -955,7 +1704,7 @@ July\or August\or September\or October\or November\or December\fi \def\tablez #1#2#3#4#5#6{% \aboveenvbreak % \begingroup % -\def\Edescription{\Etable}% Neccessary kludge. +\def\Edescription{\Etable}% Necessary kludge. \let\itemindex=#1% \ifnum 0#3>0 \advance \leftskip by #3\mil \fi % \ifnum 0#4>0 \tableindent=#4\mil \fi % @@ -964,10 +1713,11 @@ July\or August\or September\or October\or November\or December\fi \itemmax=\tableindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \tableindent % +\exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi% -\def\Etable{\endgraf\endgroup\afterenvbreak}% +\def\Etable{\endgraf\afterenvbreak\endgroup}% \let\item = \internalBitem % \let\itemx = \internalBitemx % \let\kitem = \internalBkitem % @@ -982,43 +1732,129 @@ July\or August\or September\or October\or November\or December\fi \def\itemize{\parsearg\itemizezzz} -\def\itemizezzz #1{\itemizey {#1}{\Eitemize}} +\def\itemizezzz #1{% + \begingroup % ended by the @end itemsize + \itemizey {#1}{\Eitemize} +} \def\itemizey #1#2{% \aboveenvbreak % -\begingroup % -\itemno = 0 % \itemmax=\itemindent % \advance \itemmax by -\itemmargin % \advance \leftskip by \itemindent % -\parindent = 0pt -\parskip = \smallskipamount +\exdentamount=\itemindent +\parindent = 0pt % +\parskip = \smallskipamount % \ifdim \parskip=0pt \parskip=2pt \fi% -\def#2{\endgraf\endgroup\afterenvbreak}% +\def#2{\endgraf\afterenvbreak\endgroup}% \def\itemcontents{#1}% \let\item=\itemizeitem} -\def\bullet{$\ptexbullet$} -\def\minus{$-$} - % Set sfcode to normal for the chars that usually have another value. % These are `.?!:;,' \def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000 \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 } -\def\enumerate{\itemizey{\the\itemno.}\Eenumerate\flushcr} +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\def\enumerate{\parsearg\enumeratezzz} +\def\enumeratezzz #1{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + \begingroup % ended by the @end enumerate + % + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} -\def\alphaenumerate{\itemizey{\ifcase\itemno\or -a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or n\or o\or -p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else -\errmessage{More than 26 items in @ecapitate; get a bigger alphabet.}\fi.}% -\Ealphaenumerate\flushcr} +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} -\def\capsenumerate{\itemizey{\ifcase\itemno\or -A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or N\or O\or -P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else -\errmessage{More than 26 items in @capsenumerate; get a bigger alphabet.}\fi.}% -\Ecapsenumerate\flushcr} +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call itemizey, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \itemizey{#1.}\Eenumerate\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} % Definition of @item while inside @itemize. @@ -1028,9 +1864,213 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \ifhmode \errmessage{\in hmode at itemizeitem}\fi {\parskip=0in \hskip 0pt \hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% -\vadjust{\penalty 300}}% +\vadjust{\penalty 1200}}% \flushcr} +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. +% +% For those who want to use more than one line's worth of words in +% the preamble, break the line within one argument and it +% will parse correctly, i.e., +% +% @multitable {Column 1 template} {Column 2 template} {Column 3 +% template} +% Not: +% @multitable {Column 1 template} {Column 2 template} +% {Column 3 template} + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab, @multitable or @end multitable do not need to be on their +% own lines, but it will not hurt if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. + +%%%% +% Dimensions + +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +%%%% +% Macros used to set up halign preamble: +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +%% 2/1/96, to allow fractions to be given with more than one digit. +\def\pickupwholefraction#1 {\global\advance\colcount by1 % +\expandafter\xdef\csname col\the\colcount\endcsname{.#1\hsize}% +\setuptable} + +\newcount\colcount +\def\setuptable#1{\def\firstarg{#1}% +\ifx\firstarg\xendsetuptable\let\go\relax% +\else + \ifx\firstarg\xcolumnfractions\global\setpercenttrue% + \else + \ifsetpercent + \let\go\pickupwholefraction % In this case arg of setuptable + % is the decimal point before the + % number given in percent of hsize. + % We don't need this so we don't use it. + \else + \global\advance\colcount by1 + \setbox0=\hbox{#1 }% Add a normal word space as a separator; + % typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi% + \fi% +\ifx\go\pickupwholefraction\else\let\go\setuptable\fi% +\fi\go} + +%%%% +% multitable syntax +\def\tab{&\hskip1sp\relax} % 2/2/96 + % tiny skip here makes sure this column space is + % maintained, even if it is never used. + + +%%%% +% @multitable ... @end multitable definitions: + +\def\multitable{\parsearg\dotable} + +\def\dotable#1{\bgroup +\let\item\cr +\tolerance=9500 +\hbadness=9500 +\setmultitablespacing +\parskip=\multitableparskip +\parindent=\multitableparindent +\overfullrule=0pt +\global\colcount=0\relax% +\def\Emultitable{\global\setpercentfalse\global\everycr{}\cr\egroup\egroup}% + % To parse everything between @multitable and @item : +\setuptable#1 \endsetuptable + % Need to reset this to 0 after \setuptable. +\global\colcount=0\relax% + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. +\halign\bgroup&\global\advance\colcount by 1\relax% +\multistrut\vtop{\hsize=\expandafter\csname col\the\colcount\endcsname + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % If user has set preamble in terms of percent of \hsize + % we will use that dimension as the width of the column, and + % the \leftskip will keep entries from bumping into each other. + % Table will start at left margin and final column will justify at + % right margin. +\ifnum\colcount=1 +\else + \ifsetpercent + \else + % If user has set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: +\leftskip=\multitablecolspace +\fi +\noindent##\multistrut}\cr% + % \everycr will reset column counter, \colcount, at the end of + % each line. Every column entry will cause \colcount to advance by one. + % The table preamble + % looks at the current \colcount to find the correct column width. +\global\everycr{\noalign{% +\filbreak%% keeps underfull box messages off when table breaks over pages. +\global\colcount=0\relax}} +} + +\def\setmultitablespacing{% test to see if user has set \multitablelinespace. +% If so, do nothing. If not, give it an appropriate dimension based on +% current baselineskip. +\ifdim\multitablelinespace=0pt +%% strut to put in table in case some entry doesn't have descenders, +%% to keep lines equally spaced +\let\multistrut = \strut +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\else +\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 +width0pt\relax} \fi +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + \message{indexing,} % Index generation facilities @@ -1043,14 +2083,14 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for -% the file that accumulates this index. The file's extension is foo. +% the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. \def\newindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file -\openout \csname#1indfile\endcsname \jobname.#1 % Open the file -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\openout \csname#1indfile\endcsname \jobname.#1 % Open the file +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#1}} } @@ -1062,8 +2102,8 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\newcodeindex #1{ \expandafter\newwrite \csname#1indfile\endcsname% Define number for output file -\openout \csname#1indfile\endcsname \jobname.#1 % Open the file -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\openout \csname#1indfile\endcsname \jobname.#1 % Open the file +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#1}} } @@ -1074,7 +2114,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\synindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\doindex {#2}}% } @@ -1083,7 +2123,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\syncodeindex #1 #2 {% \expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname \expandafter\let\csname#1indfile\endcsname=\synindexfoo -\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex +\expandafter\xdef\csname#1index\endcsname{% % Define \xxxindex \noexpand\docodeindex {#2}}% } @@ -1105,24 +2145,57 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} \def\indexdummies{% +% Take care of the plain tex accent commands. +\def\"{\realbackslash "}% +\def\`{\realbackslash `}% +\def\'{\realbackslash '}% +\def\^{\realbackslash ^}% +\def\~{\realbackslash ~}% +\def\={\realbackslash =}% +\def\b{\realbackslash b}% +\def\c{\realbackslash c}% +\def\d{\realbackslash d}% +\def\u{\realbackslash u}% +\def\v{\realbackslash v}% +\def\H{\realbackslash H}% +% Take care of the plain tex special European modified letters. +\def\oe{\realbackslash oe}% +\def\ae{\realbackslash ae}% +\def\aa{\realbackslash aa}% +\def\OE{\realbackslash OE}% +\def\AE{\realbackslash AE}% +\def\AA{\realbackslash AA}% +\def\o{\realbackslash o}% +\def\O{\realbackslash O}% +\def\l{\realbackslash l}% +\def\L{\realbackslash L}% +\def\ss{\realbackslash ss}% +% Take care of texinfo commands likely to appear in an index entry. +% (Must be a way to avoid doing expansion at all, and thus not have to +% laboriously list every single command here.) +\def\@{@}% will be @@ when we switch to @ as escape char. +%\let\{ = \lbracecmd +%\let\} = \rbracecmd \def\_{{\realbackslash _}}% \def\w{\realbackslash w }% \def\bf{\realbackslash bf }% -\def\rm{\realbackslash rm }% +%\def\rm{\realbackslash rm }% \def\sl{\realbackslash sl }% \def\sf{\realbackslash sf}% \def\tt{\realbackslash tt}% \def\gtr{\realbackslash gtr}% \def\less{\realbackslash less}% \def\hat{\realbackslash hat}% -\def\char{\realbackslash char}% +%\def\char{\realbackslash char}% \def\TeX{\realbackslash TeX}% \def\dots{\realbackslash dots }% \def\copyright{\realbackslash copyright }% \def\tclose##1{\realbackslash tclose {##1}}% \def\code##1{\realbackslash code {##1}}% +\def\dotless##1{\realbackslash dotless {##1}}% \def\samp##1{\realbackslash samp {##1}}% -\def\t##1{\realbackslash r {##1}}% +\def\,##1{\realbackslash ,{##1}}% +\def\t##1{\realbackslash t {##1}}% \def\r##1{\realbackslash r {##1}}% \def\i##1{\realbackslash i {##1}}% \def\b##1{\realbackslash b {##1}}% @@ -1131,8 +2204,17 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\file##1{\realbackslash file {##1}}% \def\var##1{\realbackslash var {##1}}% \def\kbd##1{\realbackslash kbd {##1}}% +\def\dfn##1{\realbackslash dfn {##1}}% +\def\emph##1{\realbackslash emph {##1}}% +\unsepspaces } +% If an index command is used in an @example environment, any spaces +% therein should become regular spaces in the raw index file, not the +% expansion of \tie (\\leavevmode \penalty \@M \ ). +{\obeyspaces + \gdef\unsepspaces{\obeyspaces\let =\space}} + % \indexnofonts no-ops all font-change commands. % This is used when outputting the strings to sort the index by. \def\indexdummyfont#1{#1} @@ -1140,6 +2222,33 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\indexdummydots{...} \def\indexnofonts{% +% Just ignore accents. +\let\,=\indexdummyfont +\let\"=\indexdummyfont +\let\`=\indexdummyfont +\let\'=\indexdummyfont +\let\^=\indexdummyfont +\let\~=\indexdummyfont +\let\==\indexdummyfont +\let\b=\indexdummyfont +\let\c=\indexdummyfont +\let\d=\indexdummyfont +\let\u=\indexdummyfont +\let\v=\indexdummyfont +\let\H=\indexdummyfont +\let\dotless=\indexdummyfont +% Take care of the plain tex special European modified letters. +\def\oe{oe}% +\def\ae{ae}% +\def\aa{aa}% +\def\OE{OE}% +\def\AE{AE}% +\def\AA{AA}% +\def\o{o}% +\def\O{O}% +\def\l{l}% +\def\L{L}% +\def\ss{ss}% \let\w=\indexdummyfont \let\t=\indexdummyfont \let\r=\indexdummyfont @@ -1161,6 +2270,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \let\var=\indexdummyfont \let\TeX=\indexdummytex \let\dots=\indexdummydots +\def\@{@}% } % To define \realbackslash, we must make \ not be an escape. @@ -1172,26 +2282,41 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax %initialize! +% workhorse for all \fooindexes +% #1 is name of index, #2 is stuff to put there \def\doind #1#2{% -{\count10=\lastpenalty % -{\indexdummies % Must do this here, since \bf, etc expand at this stage -\escapechar=`\\% -{\let\folio=0% Expand all macros now EXCEPT \folio -\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now -% so it will be output as is; and it will print as backslash in the indx. -% -% Now process the index-string once, with all font commands turned off, -% to get the string to sort the index by. -{\indexnofonts -\xdef\temp1{#2}% -}% -% Now produce the complete index entry. We process the index-string again, -% this time with font commands expanded, to get what to print in the index. -\edef\temp{% -\write \csname#1indfile\endcsname{% -\realbackslash entry {\temp1}{\folio}{#2}}}% -\temp }% -}\penalty\count10}} + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt #2}}% + \fi + {% + \count255=\lastpenalty + {% + \indexdummies % Must do this here, since \bf, etc expand at this stage + \escapechar=`\\ + {% + \let\folio=0 % We will expand all macros now EXCEPT \folio. + \def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % First process the index-string with all font commands turned off + % to get the string to sort by. + {\indexnofonts \xdef\indexsorttmp{#2}}% + % + % Now produce the complete index entry, with both the sort key and the + % original text, including any font commands. + \toks0 = {#2}% + \edef\temp{% + \write\csname#1indfile\endcsname{% + \realbackslash entry{\indexsorttmp}{\folio}{\the\toks0}}% + }% + \temp + }% + }% + \penalty\count255 + }% +} \def\dosubind #1#2#3{% {\count10=\lastpenalty % @@ -1228,7 +2353,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % \secondary {subtopic}{pagelist} % for each subtopic. -% Define the user-accessible indexing commands +% Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} @@ -1252,33 +2377,44 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\printindex{\parsearg\doprintindex} -\def\doprintindex#1{\tex % -\dobreak \chapheadingskip {10000} -\catcode`\%=\other\catcode`\&=\other\catcode`\#=\other -\catcode`\$=\other\catcode`\_=\other -\catcode`\~=\other -% The following don't help, since the chars were translated -% when the raw index was written, and their fonts were discarded -% due to \indexnofonts. -%\catcode`\"=\active -%\catcode`\^=\active -%\catcode`\_=\active -%\catcode`\|=\active -%\catcode`\<=\active -%\catcode`\>=\active -\def\indexbackslash{\rawbackslashxx} -\indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt -\begindoublecolumns -\openin 1 \jobname.#1s -\ifeof 1 -% \enddoublecolumns gets confused if there is no text in the index, -% and it loses the chapter title and the aux file entries for the index. -% The easiest way to prevent this problem is to make sure there is some text. -(Index is empty) -\else \closein 1 \input \jobname.#1s -\fi -\enddoublecolumns -\Etex} +\def\doprintindex#1{\begingroup + \dobreak \chapheadingskip{10000}% + % + \indexfonts \rm + \tolerance = 9500 + \indexbreaks + \def\indexbackslash{\rawbackslashxx}% + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \catcode`\\ = 0 + \catcode`\@ = 11 + \escapechar = `\\ + \begindoublecolumns + % + % See if the index file exists and is nonempty. + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + (Index is nonexistent) + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + (Index is empty) + \else + \input \jobname.#1s + \fi + \fi + \closein 1 + \enddoublecolumns +\endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. @@ -1287,21 +2423,77 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % \balancecolumns gets confused if there is any shrink. \newskip\initialskipamount \initialskipamount 12pt plus4pt -\outer\def\initial #1{% +\def\initial #1{% {\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt \ifdim\lastskip<\initialskipamount \removelastskip \penalty-200 \vskip \initialskipamount\fi \line{\secbf#1\hfill}\kern 2pt\penalty10000}} -\outer\def\entry #1#2{ -{\parfillskip=0in \parskip=0in \parindent=0in -\hangindent=1in \hangafter=1% -\noindent\hbox{#1}\indexdotfill #2\par -}} +% This typesets a paragraph consisting of #1, dot leaders, and then #2 +% flush to the right margin. It is used for index and table of contents +% entries. The paragraph is indented by \leftskip. +% +\def\entry #1#2{\begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent=2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % Start a ``paragraph'' for the index entry so the line breaking + % parameters we've set above will have an effect. + \noindent + % + % Insert the text of the index entry. TeX will do line-breaking on it. + #1% + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \def\tempa{{\rm }}% + \def\tempb{#2}% + \edef\tempc{\tempa}% + \edef\tempd{\tempb}% + \ifx\tempc\tempd\ \else% + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ #2% The page number ends the paragraph. + \fi% + \par +\endgroup} % Like \dotfill except takes at least 1 em. \def\indexdotfill{\cleaders - \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill} + \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} @@ -1313,69 +2505,99 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par }} -%% Define two-column mode, which is used in indexes. -%% Adapted from the TeXBook, page 416 -\catcode `\@=11 +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 \newbox\partialpage - -\newdimen\doublecolumnhsize \doublecolumnhsize = 3.11in -\newdimen\doublecolumnvsize \doublecolumnvsize = 19.1in -\newdimen\availdimen@ - -\def\begindoublecolumns{\begingroup - \output={\global\setbox\partialpage= - \vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {\global\setbox\partialpage + =\vbox{\unvbox255\kern -\topskip \kern \baselineskip}}% + \eject + % + % Now switch to the double-column output routine. \output={\doublecolumnout}% - \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize} -\def\enddoublecolumns{\output={\balancecolumns}\eject - \endgroup \pagegoal=\vsize} - -\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it once. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +- < + % 1pt) as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage + % box0 will be the left-hand column, box1 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ - \onepageout\pagesofar \unvbox255 \penalty\outputpenalty} -\def\pagesofar{\unvbox\partialpage % - \hsize=\doublecolumnhsize % have to restore this since output routine -% changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986) - \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}} + \onepageout\pagesofar + \unvbox255 \penalty\outputpenalty +} +\def\pagesofar{% + % The contents of the output page -- any previous material, + % followed by the two boxes we just split. + \unvbox\partialpage + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% +} +\def\enddoublecolumns{% + \output={\balancecolumns}\eject % split what we have + \endgroup + % Back to normal single-column typesetting, but take account of the + % fact that we just accumulated some stuff on the output page. + \pagegoal=\vsize +} \def\balancecolumns{% -% Unset the glue. - \setbox255=\vbox{\unvbox255} - \dimen@=\ht255 - \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip - \divide\dimen@ by2 - \availdimen@=\pageheight \advance\availdimen@ by-\ht\partialpage -% If the remaining data is too big for one page, -% output one page normally, then work with what remains. - \ifdim \dimen@>\availdimen@ - { - \splittopskip=\topskip \splitmaxdepth=\maxdepth - \dimen@=\pageheight \advance\dimen@ by-\ht\partialpage - \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ - \onepageout\pagesofar - } -% Recompute size of what remains, in case we just output some of it. - \dimen@=\ht255 - \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip - \divide\dimen@ by2 - \fi - \setbox0=\vbox{\unvbox255} - \splittopskip=\topskip + % Called on the last page of the double column material. + \setbox0=\vbox{\unvbox255}% + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 + \splittopskip = \topskip + % Loop until we get a decent breakpoint. {\vbadness=10000 \loop \global\setbox3=\copy0 \global\setbox1=\vsplit3 to\dimen@ - \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat} - \setbox0=\vbox to\dimen@{\unvbox1} \setbox2=\vbox to\dimen@{\unvbox3} - \pagesofar} - + \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + \pagesofar +} \catcode `\@=\other + + \message{sectioning,} % Define chapters, sections, etc. \newcount \chapno -\newcount \secno -\newcount \subsecno -\newcount \subsubsecno +\newcount \secno \secno=0 +\newcount \subsecno \subsecno=0 +\newcount \subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount \appendixno \appendixno = `\@ @@ -1397,6 +2619,10 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\chapternofonts{% \let\rawbackslash=\relax% \let\frenchspacing=\relax% +\def\result{\realbackslash result} +\def\equiv{\realbackslash equiv} +\def\expansion{\realbackslash expansion} +\def\print{\realbackslash print} \def\TeX{\realbackslash TeX} \def\dots{\realbackslash dots} \def\copyright{\realbackslash copyright} @@ -1423,45 +2649,141 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\dfn##1{\realbackslash dfn {##1}} } -\outer\def\chapter{\parsearg\chapterzzz} +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raise/lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% Choose a numbered-heading macro +% #1 is heading level if unmodified by @raisesections or @lowersections +% #2 is text for heading +\def\numhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \chapterzzz{#2} +\or + \seczzz{#2} +\or + \numberedsubseczzz{#2} +\or + \numberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \chapterzzz{#2} + \else + \numberedsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses appendix heading levels +\def\apphead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \appendixzzz{#2} +\or + \appendixsectionzzz{#2} +\or + \appendixsubseczzz{#2} +\or + \appendixsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \appendixzzz{#2} + \else + \appendixsubsubseczzz{#2} + \fi +\fi +} + +% like \numhead, but chooses numberless heading levels +\def\unnmhead#1#2{\absseclevel=\secbase\advance\absseclevel by #1 +\ifcase\absseclevel + \unnumberedzzz{#2} +\or + \unnumberedseczzz{#2} +\or + \unnumberedsubseczzz{#2} +\or + \unnumberedsubsubseczzz{#2} +\else + \ifnum \absseclevel<0 + \unnumberedzzz{#2} + \else + \unnumberedsubsubseczzz{#2} + \fi +\fi +} + + +\def\thischaptername{No Chapter Title} +\outer\def\chapter{\parsearg\chapteryyy} +\def\chapteryyy #1{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz #1{\seccheck{chapter}% \secno=0 \subsecno=0 \subsubsecno=0 -\global\advance \chapno by 1 \message{Chapter \the\chapno}% +\global\advance \chapno by 1 \message{\putwordChapter \the\chapno}% \chapmacro {#1}{\the\chapno}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% % We don't substitute the actual chapter name into \thischapter % because we don't want its macros evaluated now. -\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}% +\xdef\thischapter{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% {\chapternofonts% \edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \donoderef % -\global\let\section = \numberedsection +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec }} -\outer\def\appendix{\parsearg\appendixzzz} +\outer\def\appendix{\parsearg\appendixyyy} +\def\appendixyyy #1{\apphead0{#1}} % normally apphead0 calls appendixzzz \def\appendixzzz #1{\seccheck{appendix}% \secno=0 \subsecno=0 \subsubsecno=0 \global\advance \appendixno by 1 \message{Appendix \appendixletter}% -\chapmacro {#1}{Appendix \appendixletter}% +\chapmacro {#1}{\putwordAppendix{} \appendixletter}% \gdef\thissection{#1}% \gdef\thischaptername{#1}% -\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}% +\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% {\chapternofonts% -\edef\temp{{\realbackslash chapentry - {#1}{Appendix \appendixletter}{\noexpand\folio}}}% +\edef\temp{{\realbackslash chapentry + {#1}{\putwordAppendix{} \appendixletter}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \appendixnoderef % \global\let\section = \appendixsec +\global\let\subsection = \appendixsubsec +\global\let\subsubsection = \appendixsubsubsec }} -\outer\def\top{\parsearg\unnumberedzzz} -\outer\def\unnumbered{\parsearg\unnumberedzzz} +% @centerchap is like @unnumbered, but the heading is centered. +\outer\def\centerchap{\parsearg\centerchapyyy} +\def\centerchapyyy #1{{\let\unnumbchapmacro=\centerchapmacro \unnumberedyyy{#1}}} + +\outer\def\top{\parsearg\unnumberedyyy} +\outer\def\unnumbered{\parsearg\unnumberedyyy} +\def\unnumberedyyy #1{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz \def\unnumberedzzz #1{\seccheck{unnumbered}% -\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)} +\secno=0 \subsecno=0 \subsubsecno=0 +% +% This used to be simply \message{#1}, but TeX fully expands the +% argument to \message. Therefore, if #1 contained @-commands, TeX +% expanded them. For example, in `@unnumbered The @cite{Book}', TeX +% expanded @cite (which turns out to cause errors because \cite is meant +% to be executed, not expanded). +% +% Anyway, we don't want the fully-expanded definition of @cite to appear +% as a result of the \message, we just want `@cite' itself. We use +% \the to achieve this: TeX expands \the only once, +% simply yielding the contents of the . +\toks0 = {#1}\message{(\the\toks0)}% +% \unnumbchapmacro {#1}% \gdef\thischapter{#1}\gdef\thissection{#1}% {\chapternofonts% @@ -1470,10 +2792,13 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \write \contentsfile \temp % \unnumbnoderef % \global\let\section = \unnumberedsec +\global\let\subsection = \unnumberedsubsec +\global\let\subsubsection = \unnumberedsubsubsec }} -\outer\def\numberedsection{\parsearg\sectionzzz} -\def\sectionzzz #1{\seccheck{section}% +\outer\def\numberedsec{\parsearg\secyyy} +\def\secyyy #1{\numhead1{#1}} % normally calls seczzz +\def\seczzz #1{\seccheck{section}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}% {\chapternofonts% @@ -1483,11 +2808,11 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \write \contentsfile \temp % \donoderef % \penalty 10000 % -\global\let\subsection = \numberedsubsection }} -\outer\def\appendixsection{\parsearg\appendixsectionzzz} -\outer\def\appendixsec{\parsearg\appendixsectionzzz} +\outer\def\appendixsection{\parsearg\appendixsecyyy} +\outer\def\appendixsec{\parsearg\appendixsecyyy} +\def\appendixsecyyy #1{\apphead1{#1}} % normally calls appendixsectionzzz \def\appendixsectionzzz #1{\seccheck{appendixsection}% \subsecno=0 \subsubsecno=0 \global\advance \secno by 1 % \gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}% @@ -1498,10 +2823,10 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % -\global\let\subsection = \appendixsubsec }} -\outer\def\unnumberedsec{\parsearg\unnumberedseczzz} +\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} +\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz \def\unnumberedseczzz #1{\seccheck{unnumberedsec}% \plainsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% @@ -1510,11 +2835,11 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % -\global\let\subsection = \unnumberedsubsec }} -\outer\def\numberedsubsection{\parsearg\subsectionzzz} -\def\subsectionzzz #1{\seccheck{subsection}% +\outer\def\numberedsubsec{\parsearg\numberedsubsecyyy} +\def\numberedsubsecyyy #1{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz #1{\seccheck{subsection}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}% {\chapternofonts% @@ -1524,10 +2849,10 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \write \contentsfile \temp % \donoderef % \penalty 10000 % -\global\let\subsubsection = \numberedsubsubsection }} -\outer\def\appendixsubsec{\parsearg\appendixsubseczzz} +\outer\def\appendixsubsec{\parsearg\appendixsubsecyyy} +\def\appendixsubsecyyy #1{\apphead2{#1}} % normally calls appendixsubseczzz \def\appendixsubseczzz #1{\seccheck{appendixsubsec}% \gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 % \subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}% @@ -1538,23 +2863,23 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \write \contentsfile \temp % \appendixnoderef % \penalty 10000 % -\global\let\subsubsection = \appendixsubsubsec }} -\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz} +\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} +\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz \def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% -\plainsecheading {#1}\gdef\thissection{#1}% +\plainsubsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% \write \contentsfile \temp % \unnumbnoderef % \penalty 10000 % -\global\let\subsubsection = \unnumberedsubsubsec }} -\outer\def\numberedsubsubsection{\parsearg\subsubsectionzzz} -\def\subsubsectionzzz #1{\seccheck{subsubsection}% +\outer\def\numberedsubsubsec{\parsearg\numberedsubsubsecyyy} +\def\numberedsubsubsecyyy #1{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz #1{\seccheck{subsubsection}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}% @@ -1569,7 +2894,8 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \penalty 10000 % }} -\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz} +\outer\def\appendixsubsubsec{\parsearg\appendixsubsubsecyyy} +\def\appendixsubsubsecyyy #1{\apphead3{#1}} % normally appendixsubsubseczzz \def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}% \gdef\thissection{#1}\global\advance \subsubsecno by 1 % \subsubsecheading {#1} @@ -1584,9 +2910,10 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \penalty 10000 % }} -\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} +\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} +\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz \def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% -\plainsecheading {#1}\gdef\thissection{#1}% +\plainsubsubsecheading {#1}\gdef\thissection{#1}% {\chapternofonts% \edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% \escapechar=`\\% @@ -1596,6 +2923,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else }} % These are variants which are not "outer", so they can appear in @ifinfo. +% Actually, they should now be obsolete; ordinary section commands should work. \def\infotop{\parsearg\unnumberedzzz} \def\infounnumbered{\parsearg\unnumberedzzz} \def\infounnumberedsec{\parsearg\unnumberedseczzz} @@ -1612,22 +2940,42 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\infosubsection{\parsearg\subsectionzzz} \def\infosubsubsection{\parsearg\subsubsectionzzz} +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec + % Define @majorheading, @heading and @subheading +% NOTE on use of \vbox for chapter headings, section headings, and +% such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + \def\majorheading{\parsearg\majorheadingzzz} \def\majorheadingzzz #1{% {\advance\chapheadingskip by 10pt \chapbreak }% -{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 200} +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} \def\chapheading{\parsearg\chapheadingzzz} \def\chapheadingzzz #1{\chapbreak % -{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 200} - -\def\heading{\parsearg\secheadingi} +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} -\def\subheading{\parsearg\subsecheadingi} - -\def\subsubheading{\parsearg\subsubsecheadingi} +% @heading, @subheading, @subsubheading. +\def\heading{\parsearg\plainsecheading} +\def\subheading{\parsearg\plainsubsecheading} +\def\subsubheading{\parsearg\plainsubsubsecheading} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), @@ -1641,7 +2989,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else %%% Define plain chapter starts, and page on/off switching for it % Parameter controlling skip before chapter headings (if needed) -\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt +\newskip\chapheadingskip \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} @@ -1650,15 +2998,18 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{ +\global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{ +\global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{ +\global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} @@ -1667,26 +3018,45 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\CHAPFplain{ \global\let\chapmacro=\chfplain -\global\let\unnumbchapmacro=\unnchfplain} +\global\let\unnumbchapmacro=\unnchfplain +\global\let\centerchapmacro=\centerchfplain} -\def\chfplain #1#2{% +% Plain chapter opening. +% #1 is the text, #2 the chapter number or empty if unnumbered. +\def\chfplain#1#2{% \pchapsepmacro {% - \chapfonts - \leftline{\rm #2\enspace #1}% + \chapfonts \rm + \def\chapnum{#2}% + \setbox0 = \hbox{#2\ifx\chapnum\empty\else\enspace\fi}% + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 \centerparametersmaybe + \unhbox0 #1\par}% }% - \bigskip - \penalty5000 + \nobreak\bigskip % no page break after a chapter title + \nobreak } -\def\unnchfplain #1{% -\pchapsepmacro % -{\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 10000 % -} +% Plain opening for unnumbered. +\def\unnchfplain#1{\chfplain{#1}{}} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerchfplain#1{{% + \def\centerparametersmaybe{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt + }% + \chfplain{#1}{}% +}} + \CHAPFplain % The default \def\unnchfopen #1{% -\chapoddpage {\chapfonts \line{\rm #1\hfill}}\bigskip \par\penalty 10000 % +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 10000 % } \def\chfopen #1#2{\chapoddpage {\chapfonts @@ -1694,73 +3064,91 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \par\penalty 5000 % } +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rm #1}\hfill}}\bigskip \par\penalty 10000 % +} + \def\CHAPFopen{ \global\let\chapmacro=\chfopen -\global\let\unnumbchapmacro=\unnchfopen} +\global\let\unnumbchapmacro=\unnchfopen +\global\let\centerchapmacro=\centerchfopen} -% Parameter controlling skip before section headings. -\newskip \subsecheadingskip \subsecheadingskip = 17pt plus 8pt minus 4pt -\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} - -\newskip \secheadingskip \secheadingskip = 21pt plus 8pt minus 4pt +% Section titles. +\newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip {-1000}} +\def\secheading#1#2#3{\sectionheading{sec}{#2.#3}{#1}} +\def\plainsecheading#1{\sectionheading{sec}{}{#1}} +% Subsection titles. +\newskip \subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}} +\def\subsecheading#1#2#3#4{\sectionheading{subsec}{#2.#3.#4}{#1}} +\def\plainsubsecheading#1{\sectionheading{subsec}{}{#1}} -% Section fonts are the base font at magstep2, which produces -% a size a bit more than 14 points in the default situation. - -\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}} -\def\plainsecheading #1{\secheadingi {#1}} -\def\secheadingi #1{{\advance \secheadingskip by \parskip % -\secheadingbreak}% -{\secfonts \line{\rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } - - -% Subsection fonts are the base font at magstep1, -% which produces a size of 12 points. +% Subsubsection titles. +\let\subsubsecheadingskip = \subsecheadingskip +\let\subsubsecheadingbreak = \subsecheadingbreak +\def\subsubsecheading#1#2#3#4#5{\sectionheading{subsubsec}{#2.#3.#4.#5}{#1}} +\def\plainsubsubsecheading#1{\sectionheading{subsubsec}{}{#1}} -\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}} -\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip % -\subsecheadingbreak}% -{\subsecfonts \line{\rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 } -\def\subsubsecfonts{\subsecfonts} % Maybe this should change: - % Perhaps make sssec fonts scaled - % magstep half -\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}} -\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip % -\subsecheadingbreak}% -{\subsubsecfonts \line{\rm #1\hfill}}% -\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000} +% Print any size section title. +% +% #1 is the section type (sec/subsec/subsubsec), #2 is the section +% number (maybe empty), #3 the text. +\def\sectionheading#1#2#3{% + {% + \expandafter\advance\csname #1headingskip\endcsname by \parskip + \csname #1headingbreak\endcsname + }% + {% + % Switch to the right set of fonts. + \csname #1fonts\endcsname \rm + % + % Only insert the separating space if we have a section number. + \def\secnum{#2}% + \setbox0 = \hbox{#2\ifx\secnum\empty\else\enspace\fi}% + % + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent = \wd0 % zero if no section number + \unhbox0 #3}% + }% + \ifdim\parskip<10pt \nobreak\kern10pt\nobreak\kern-\parskip\fi \nobreak +} \message{toc printing,} - % Finish up the main text and prepare to read what we've written % to \contentsfile. +\newskip\contentsrightmargin \contentsrightmargin=1in \def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout \contentsfile \ifnum \pageno>0 - \pagealignmacro - \immediate\closeout \contentsfile - \pageno = -1 % Request roman numbered pages. + \pageno = -1 % Request roman numbered pages. \fi - % Don't need to put `Contents' or `Short Contents' in the headline. + % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \unnumbchapmacro{#1}\def\thischapter{}% - \begingroup % Set up to handle contents files properly. + \begingroup % Set up to handle contents files properly. \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 + \catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi \raggedbottom % Worry more about breakpoints than the bottom. - \advance\hsize by -1in % Don't use the full line length. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. } - + % Normal (long) toc. \outer\def\contents{% - \startcontents{Table of Contents}% + \startcontents{\putwordTableofContents}% \input \jobname.toc \endgroup \vfill \eject @@ -1768,7 +3156,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % And just the chapters. \outer\def\summarycontents{% - \startcontents{Short Contents}% + \startcontents{\putwordShortContents}% % \let\chapentry = \shortchapentry \let\unnumbchapentry = \shortunnumberedentry @@ -1776,6 +3164,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \rm + \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\secentry ##1##2##3##4{} \def\unnumbsecentry ##1##2{} @@ -1796,15 +3185,37 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % Chapter-level things, for both the long and short contents. \def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}} + +% See comments in \dochapentry re vbox and related settings \def\shortchapentry#1#2#3{% - \line{{#2\labelspace #1}\dotfill\doshortpageno{#3}}% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% } -\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} -\def\shortunnumberedentry#1#2{% - \line{#1\dotfill\doshortpageno{#2}}% +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g. `Appendix A' for an appendix, or `3' for a chapter. +% We could simplify the code here by writing out an \appendixentry +% command in the toc file for appendices, instead of using \chapentry +% for both, but it doesn't seem worth it. +\setbox0 = \hbox{\shortcontrm \putwordAppendix } +\newdimen\shortappendixwidth \shortappendixwidth = \wd0 + +\def\shortchaplabel#1{% + % We typeset #1 in a box of constant width, regardless of the text of + % #1, so the chapter titles will come out aligned. + \setbox0 = \hbox{#1}% + \dimen0 = \ifdim\wd0 > \shortappendixwidth \shortappendixwidth \else 0pt \fi + % + % This space should be plenty, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + \advance\dimen0 by 1.1em + \hbox to \dimen0{#1\hfil}% } +\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}} +\def\shortunnumberedentry#1#2{\tocentry{#1}{\doshortpageno{#2}}} + % Sections. \def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}} \def\unnumbsecentry#1#2{\dosecentry{#1}{#2}} @@ -1818,32 +3229,48 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}} \def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}} - % This parameter controls the indentation of the various levels. \newdimen\tocindent \tocindent = 3pc -% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % -% If the toc has to be broken over pages, we would want to be at chapters +% If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% - \penalty-300 \vskip\baselineskip - \line{\chapentryfonts #1\dotfill \dopageno{#2}}% - \nobreak\vskip .25\baselineskip + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno{#2}}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip } -\def\dosecentry#1#2{% - \line{\secentryfonts \hskip\tocindent #1\dotfill \dopageno{#2}}% -} +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} -\def\dosubsecentry#1#2{% - \line{\subsecentryfonts \hskip2\tocindent #1\dotfill \dopageno{#2}}% -} +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} -\def\dosubsubsecentry#1#2{% - \line{\subsubsecentryfonts \hskip3\tocindent #1\dotfill \dopageno{#2}}% -} +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} + +% Final typesetting of a toc entry; we use the same \entry macro as for +% the index entries, but we want to suppress hyphenation here. (We +% can't do that in the \entry macro, since index entries might consist +% of hyphenated-identifiers-that-do-not-fit-on-a-line-and-nothing-else.) +% +% \turnoffactive is for the sake of @" used for umlauts. +\def\tocentry#1#2{\begingroup + \vskip 0pt plus1pt % allow a little stretch for the sake of nice page breaks + \entry{\turnoffactive #1}{\turnoffactive #2}% +\endgroup} % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} @@ -1859,35 +3286,29 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \message{environments,} -% Since these characters are used in examples, it should be an even number of +% Since these characters are used in examples, it should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % Furthermore, these definitions must come after we define our fonts. \newbox\dblarrowbox \newbox\longdblarrowbox \newbox\pushcharbox \newbox\bullbox \newbox\equivbox \newbox\errorbox -\let\ptexequiv = \equiv - -{\tentt -\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} -\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} -\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} -\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} +%{\tentt +%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil} +%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil} +%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil} +%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil} % Adapted from the manmac format (p.420 of TeXbook) -\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex - depth .1ex\hfil} -} +%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width .85ex +% depth .1ex\hfil} +%} +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. \def\point{$\star$} - -\def\result{\leavevmode\raise.15ex\copy\dblarrowbox} -\def\expansion{\leavevmode\raise.1ex\copy\longdblarrowbox} -\def\print{\leavevmode\lower.1ex\copy\pushcharbox} - -\def\equiv{\leavevmode\lower.1ex\copy\equivbox} - -% Does anyone really want this? -% \def\bull{\leavevmode\copy\bullbox} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} % Adapted from the TeXbook's \boxit. {\tentt \global\dimen0 = 3em}% Width of the box. @@ -1918,7 +3339,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie \catcode `\%=14 -\catcode 43=12 +\catcode 43=12 % plus \catcode`\"=12 \catcode`\==12 \catcode`\|=12 @@ -1926,15 +3347,18 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \catcode`\>=12 \escapechar=`\\ % +\let\,=\ptexcomma +\let\~=\ptextilde \let\{=\ptexlbrace \let\}=\ptexrbrace \let\.=\ptexdot \let\*=\ptexstar \let\dots=\ptexdots +\def\endldots{\mathinner{\ldots\ldots\ldots\ldots}} +\def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi} \def\@{@}% \let\bullet=\ptexbullet -\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl -\let\L=\ptexL +\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext % \let\Etex=\endgroup} @@ -1945,150 +3369,218 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in -% This is the definition that ^M gets inside @lisp -% phr: changed space to \null, to avoid overfull hbox problems. -{\obeyspaces% -\gdef\lisppar{\null\endgraf}} +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} -% Cause \obeyspaces to make each Space cause a word-separation -% rather than the default which is that it acts punctuation. -% This is because space in tt font looks funny. +% Make each space character in the input produce a normal interword +% space in the output. Don't allow a line break at this space, as this +% is used only in environments like @example, where each line of input +% should produce a line of output anyway. +% {\obeyspaces % -\gdef\sepspaces{\def {\ }}} - -\newskip\aboveenvskipamount \aboveenvskipamount= 0pt -\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip -\endgraf \ifdim\lastskip<\aboveenvskipamount -\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}} - -\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount -\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi} - -\def\lisp{\aboveenvbreak -\begingroup\inENV % This group ends at the end of the @lisp body -\hfuzz=12truept % Don't be fussy -% Make spaces be word-separators rather than space tokens. -\sepspaces % -% Single space lines -\singlespace % -% The following causes blank lines not to be ignored -% by adding a space to the end of each line. -\let\par=\lisppar -\def\Elisp{\endgroup\afterenvbreak}% -\parskip=0pt -\advance \leftskip by \lispnarrowing -\parindent=0pt -\let\exdent=\internalexdent -\obeyspaces \obeylines \tt \rawbackslash -\def\next##1{}\next} - - -\let\example=\lisp -\def\Eexample{\Elisp} - -\let\smallexample=\lisp -\def\Esmallexample{\Elisp} - -% Macro for 9 pt. examples, necessary to print with 5" lines. -% From Pavel@xerox. This is not really used unless the -% @smallbook command is given. - -\def\smalllispx{\aboveenvbreak\begingroup\inENV -% This group ends at the end of the @lisp body -\hfuzz=12truept % Don't be fussy -% Make spaces be word-separators rather than space tokens. -\sepspaces % -% Single space lines -\singlespace % -% The following causes blank lines not to be ignored -% by adding a space to the end of each line. -\let\par=\lisppar -\def\Esmalllisp{\endgroup\afterenvbreak}% -\parskip=0pt -\advance \leftskip by \lispnarrowing -\parindent=0pt -\let\exdent=\internalexdent -\obeyspaces \obeylines \ninett \indexfonts \rawbackslash -\def\next##1{}\next} +\gdef\sepspaces{\obeyspaces\let =\tie}} + +% Define \obeyedspace to be our active space, whatever it is. This is +% for use in \parsearg. +{\sepspaces% +\global\let\obeyedspace= } + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip +% +\def\aboveenvbreak{{\advance\envskipamount by \parskip +\endgraf \ifdim\lastskip<\envskipamount +\removelastskip \penalty-50 \vskip\envskipamount \fi}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. +\let\nonarrowing=\relax + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \cartouche: draw rectangle w/rounded corners around argument +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\long\def\cartouche{% +\begingroup + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt %we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18pt % allow for 3pt kerns on either +% side, and for 6pt waste from +% each corner char + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=\comment + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \hsize=\cartinner + \kern3pt + \begingroup + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip +\def\Ecartouche{% + \endgroup + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup +\endgroup +}} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \inENV % This group ends at the end of the body + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \singlespace + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + % @cartouche defines \nonarrowing to inhibit narrowing + % at next level down. + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \let\exdent=\nofillexdent + \let\nonarrowing=\relax + \fi +} + +% To ending an @example-like environment, we first end the paragraph +% (via \afterenvbreak's vertical glue), and then the group. That way we +% keep the zero \parskip that the environments set -- \parskip glue +% will be inserted at the beginning of the next paragraph in the +% document, after the environment. +% +\def\nonfillfinish{\afterenvbreak\endgroup}% + +% This macro is +\def\lisp{\begingroup + \nonfillstart + \let\Elisp = \nonfillfinish + \tt + \rawbackslash % have \ input char produce \ char from current font + \gobble +} + +% Define the \E... control sequence only if we are inside the +% environment, so the error checking in \end will work. +% +% We must call \lisp last in the definition, since it reads the +% return following the @example (or whatever) command. +% +\def\example{\begingroup \def\Eexample{\nonfillfinish\endgroup}\lisp} +\def\smallexample{\begingroup \def\Esmallexample{\nonfillfinish\endgroup}\lisp} +\def\smalllisp{\begingroup \def\Esmalllisp{\nonfillfinish\endgroup}\lisp} + +% @smallexample and @smalllisp. This is not used unless the @smallbook +% command is given. Originally contributed by Pavel@xerox. +% +\def\smalllispx{\begingroup + \nonfillstart + \let\Esmalllisp = \nonfillfinish + \let\Esmallexample = \nonfillfinish + % + % Smaller fonts for small examples. + \indexfonts \tt + \rawbackslash % make \ output the \ character from the current font (tt) + \gobble +} % This is @display; same as @lisp except use roman font. +% +\def\display{\begingroup + \nonfillstart + \let\Edisplay = \nonfillfinish + \gobble +} -\def\display{\begingroup\inENV %This group ends at the end of the @display body -\aboveenvbreak -% Make spaces be word-separators rather than space tokens. -\sepspaces % -% Single space lines -\singlespace % -% The following causes blank lines not to be ignored -% by adding a space to the end of each line. -\let\par=\lisppar -\def\Edisplay{\endgroup\afterenvbreak}% -\parskip=0pt -\advance \leftskip by \lispnarrowing -\parindent=0pt -\let\exdent=\internalexdent -\obeyspaces \obeylines -\def\next##1{}\next} - -% This is @format; same as @lisp except use roman font and don't narrow margins - -\def\format{\begingroup\inENV %This group ends at the end of the @format body -\aboveenvbreak -% Make spaces be word-separators rather than space tokens. -\sepspaces % -\singlespace % -% The following causes blank lines not to be ignored -% by adding a space to the end of each line. -\let\par=\lisppar -\def\Eformat{\endgroup\afterenvbreak} -\parskip=0pt \parindent=0pt -\obeyspaces \obeylines -\def\next##1{}\next} - -% @flushleft and @flushright - -\def\flushleft{% -\begingroup\inENV %This group ends at the end of the @format body -\aboveenvbreak -% Make spaces be word-separators rather than space tokens. -\sepspaces % -% The following causes blank lines not to be ignored -% by adding a space to the end of each line. -% This also causes @ to work when the directive name -% is terminated by end of line. -\let\par=\lisppar -\def\Eflushleft{\endgroup\afterenvbreak}% -\parskip=0pt \parindent=0pt -\obeyspaces \obeylines -\def\next##1{}\next} - -\def\flushright{% -\begingroup\inENV %This group ends at the end of the @format body -\aboveenvbreak -% Make spaces be word-separators rather than space tokens. -\sepspaces % -% The following causes blank lines not to be ignored -% by adding a space to the end of each line. -% This also causes @ to work when the directive name -% is terminated by end of line. -\let\par=\lisppar -\def\Eflushright{\endgroup\afterenvbreak}% -\parskip=0pt \parindent=0pt -\advance \leftskip by 0pt plus 1fill -\obeyspaces \obeylines -\def\next##1{}\next} - -% @quotation - narrow the margins. +% This is @format; same as @display except don't narrow margins. +% +\def\format{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eformat = \nonfillfinish + \gobble +} +% @flushleft (same as @format) and @flushright. +% +\def\flushleft{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eflushleft = \nonfillfinish + \gobble +} +\def\flushright{\begingroup + \let\nonarrowing = t + \nonfillstart + \let\Eflushright = \nonfillfinish + \advance\leftskip by 0pt plus 1fill + \gobble} + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. +% \def\quotation{% -\begingroup\inENV %This group ends at the end of the @quotation body -{\parskip=0pt % because we will skip by \parskip too, later -\aboveenvbreak}% -\singlespace -\parindent=0pt -\def\Equotation{\par\endgroup\afterenvbreak}% -\advance \rightskip by \lispnarrowing -\advance \leftskip by \lispnarrowing} + \begingroup\inENV %This group ends at the end of the @quotation body + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \singlespace + \parindent=0pt + % We have retained a nonzero parskip for the environment, since we're + % doing normal filling. So to avoid extra space below the environment... + \def\Equotation{\parskip = 0pt \nonfillfinish}% + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \let\nonarrowing = \relax + \fi +} \message{defuns,} % Define formatter for defuns @@ -2106,9 +3598,23 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\&=\active \catcode`\[=\active \catcode`\]=\active} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + {\activeparens % Now, smart parens don't turn on until &foo (see \amprm) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +\global\let(=\lparen \global\let)=\rparen +\global\let[=\lbrack \global\let]=\rbrack + \gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 } \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} +% This is used to turn on special parens +% but make & act ordinary (given that it's active). +\gdef\boldbraxnoamp{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb\let&=\ampnr} % Definitions of (, ) and & used in args for functions. % This is the definition of ( outside of all parentheses. @@ -2156,7 +3662,9 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \advance \hsize by -\dimen2 \advance \hsize by -\dimen3 \rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}% % Make all lines underfull and no complaints: -\tolerance=10000 \hbadness=10000 +\tolerance=10000 \hbadness=10000 +\advance\leftskip by -\defbodyindent +\exdentamount=\defbodyindent {\df #1}\enskip % Generate function name } @@ -2174,8 +3682,9 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def#2{\begingroup\obeylines\activeparens\spacesplit#3}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent \begingroup % -\catcode 61=\active % +\catcode 61=\active % 61 is `=' \obeylines\activeparens\spacesplit#3} \def\defmethparsebody #1#2#3#4 {\begingroup\inENV % @@ -2186,6 +3695,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#4}}} \def\defopparsebody #1#2#3#4#5 {\begingroup\inENV % @@ -2197,8 +3707,87 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \begingroup\obeylines\activeparens\spacesplit{#3{##2}}}% \parindent=0in \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent \begingroup\obeylines\activeparens\spacesplit{#3{#5}}} +% These parsing functions are similar to the preceding ones +% except that they do not make parens into active characters. +% These are used for "variables" since they have no arguments. + +\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2{\begingroup\obeylines\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup % +\catcode 61=\active % +\obeylines\spacesplit#3} + +% This is used for \def{tp,vr}parsebody. It could probably be used for +% some of the others, too, with some judicious conditionals. +% +\def\parsebodycommon#1#2#3{% + \begingroup\inENV % + \medbreak % + % Define the end token that this defining construct specifies + % so that it will exit this group. + \def#1{\endgraf\endgroup\medbreak}% + \def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}% + \parindent=0in + \advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent + \exdentamount=\defbodyindent + \begingroup\obeylines +} + +\def\defvrparsebody#1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \spacesplit{#3{#4}}% +} + +% This loses on `@deftp {Data Type} {struct termios}' -- it thinks the +% type is just `struct', because we lose the braces in `{struct +% termios}' when \spacesplit reads its undelimited argument. Sigh. +% \let\deftpparsebody=\defvrparsebody +% +% So, to get around this, we put \empty in with the type name. That +% way, TeX won't find exactly `{...}' as an undelimited argument, and +% won't strip off the braces. +% +\def\deftpparsebody #1#2#3#4 {% + \parsebodycommon{#1}{#2}{#3}% + \spacesplit{\parsetpheaderline{#3{#4}}}\empty +} + +% Fine, but then we have to eventually remove the \empty *and* the +% braces (if any). That's what this does, putting the result in \tptemp. +% +\def\removeemptybraces\empty#1\relax{\def\tptemp{#1}}% + +% After \spacesplit has done its work, this is called -- #1 is the final +% thing to call, #2 the type name (which starts with \empty), and #3 +% (which might be empty) the arguments. +% +\def\parsetpheaderline#1#2#3{% + \removeemptybraces#2\relax + #1{\tptemp}{#3}% +}% + +\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV % +\medbreak % +% Define the end token that this defining construct specifies +% so that it will exit this group. +\def#1{\endgraf\endgroup\medbreak}% +\def#2##1 ##2 {\def#4{##1}% +\begingroup\obeylines\spacesplit{#3{##2}}}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup\obeylines\spacesplit{#3{#5}}} + % Split up #2 at the first space token. % call #1 with two arguments: % the first is all of #2 before the space token, @@ -2234,8 +3823,9 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\deftypefunargs #1{% % Expand, preventing hyphenation at `-' chars. % Note that groups don't affect changes in \hyphenchar. -\functionparens -\code{#1}% +% Use \boldbraxnoamp, not \functionparens, so that & is not special. +\boldbraxnoamp +\tclose{#1}% avoid \code because of side effects on active chars \interlinepenalty=10000 \advance\rightskip by 0pt plus 1fil \endgraf\penalty 10000\vskip -\parskip\penalty 10000% @@ -2271,7 +3861,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % #1 is the data type, #2 the name, #3 the args. \def\deftypefunheaderx #1#2 #3\relax{% \doind {fn}{\code{#2}}% Make entry in function index -\begingroup\defname {\code{#1} #2}{Function}% +\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Function}% \deftypefunargs {#3}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } @@ -2280,12 +3870,19 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader} +% \defheaderxcond#1\relax$$$ +% puts #1 in @code, followed by a space, but does nothing if #1 is null. +\def\defheaderxcond#1#2$$${\ifx#1\relax\else\code{#1#2} \fi} + % #1 is the classification. #2 is the data type. #3 is the name and args. \def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax} % #1 is the classification, #2 the data type, #3 the name, #4 the args. \def\deftypefnheaderx #1#2#3 #4\relax{% \doind {fn}{\code{#3}}% Make entry in function index -\begingroup\defname {\code{#2} #3}{#1}% +\begingroup +\normalparens % notably, turn off `&' magic, which prevents +% at least some C++ text from working +\defname {\defheaderxcond#2\relax$$$#3}{#1}% \deftypefunargs {#4}\endgroup % \catcode 61=\other % Turn off change made in \defparsebody } @@ -2343,23 +3940,10 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \defunargs {#3}\endgroup % } -% @deftypemethod class type frobnicate argument - -\def\deftypemethod{\defmethparsebody\Edeftypemethod\deftypemethodx% -\deftypemethodheader} - -% #1 is the class. #2 is the data type. #3 is the name and args. -\def\deftypemethodheader #1#2#3{\deftypemethodheaderx{#1}{#2}#3 \relax} -% #1 is the class, #2 the data type, #3 then name , #4 the args. -\def\deftypemethodheaderx #1#2#3 #4\relax{\dosubind {fn}{\code{#3}}{on #1}% -\begingroup\defname {\code{#2} #3}{Method on #1}% -\deftypefunargs {#4}\endgroup -} - % @defcv {Class Option} foo-class foo-flag \def\defcv #1 {\def\defcvtype{#1}% -\defopparsebody\Edefcv\defcvx\defcvarheader\defcvtype} +\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} \def\defcvarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index @@ -2369,7 +3953,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % @defivar == @defcv {Instance Variable} -\def\defivar{\defmethparsebody\Edefivar\defivarx\defivarheader} +\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} \def\defivarheader #1#2#3{% \dosubind {vr}{\code{#2}}{of #1}% Make entry in var index @@ -2396,14 +3980,14 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % @defvr Counter foo-count -\def\defvr{\defmethparsebody\Edefvr\defvrx\defvrheader} +\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader} \def\defvrheader #1#2#3{\doind {vr}{\code{#2}}% \begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup} % @defvar == @defvr Variable -\def\defvar{\defparsebody\Edefvar\defvarx\defvarheader} +\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader} \def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{Variable}% @@ -2412,7 +3996,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % @defopt == @defvr {User Option} -\def\defopt{\defparsebody\Edefopt\defoptx\defoptheader} +\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} \def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index \begingroup\defname {#1}{User Option}% @@ -2421,22 +4005,22 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % @deftypevar int foobar -\def\deftypevar{\defparsebody\Edeftypevar\deftypevarx\deftypevarheader} +\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader} % #1 is the data type. #2 is the name. \def\deftypevarheader #1#2{% \doind {vr}{\code{#2}}% Make entry in variables index -\begingroup\defname {\code{#1} #2}{Variable}% +\begingroup\defname {\defheaderxcond#1\relax$$$#2}{Variable}% \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} % @deftypevr {Global Flag} int enable -\def\deftypevr{\defmethparsebody\Edeftypevr\deftypevrx\deftypevrheader} +\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} \def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% -\begingroup\defname {\code{#2} #3}{#1} +\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} \interlinepenalty=10000 \endgraf\penalty 10000\vskip -\parskip\penalty 10000 \endgroup} @@ -2457,7 +4041,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % @deftp Class window height width ... -\def\deftp{\defmethparsebody\Edeftp\deftpx\deftpheader} +\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} \def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% \begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} @@ -2467,6 +4051,7 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \def\deftpx #1 {\errmessage{@deftpx in invalid context}} + \message{cross reference,} % Define cross-reference macros \newwrite \auxfile @@ -2474,20 +4059,25 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. +% @inforef is simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + % \setref{foo} defines a cross-reference point named foo. \def\setref#1{% -%\dosetq{#1-title}{Ytitle}% +\dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ysectionnumberandtype}} \def\unnumbsetref#1{% -%\dosetq{#1-title}{Ytitle}% +\dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Ynothing}} \def\appendixsetref#1{% -%\dosetq{#1-title}{Ytitle}% +\dosetq{#1-title}{Ytitle}% \dosetq{#1-pg}{Ypagenumber}% \dosetq{#1-snt}{Yappendixletterandtype}} @@ -2496,44 +4086,63 @@ P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else % cross-reference, #3 the printed node name, #4 the name of the Info % file, #5 the name of the printed manual. All but the node name can be % omitted. -% -\def\pxref#1{see \xrefX[#1,,,,,,,]} -\def\xref#1{See \xrefX[#1,,,,,,,]} -\def\ref#1{\xrefX[#1,,,,,,,]} -\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup% -\def\printedmanual{\ignorespaces #5}% -\def\printednodename{\ignorespaces #3}% -% -\setbox1=\hbox{\printedmanual}% -\setbox0=\hbox{\printednodename}% -\ifdim \wd0=0pt% -\def\printednodename{\ignorespaces #1}% -%%% Uncommment the following line to make the actual chapter or section title -%%% appear inside the square brackets. -%\def\printednodename{#1-title}% -\fi% % -% -% If we use \unhbox0 and \unhbox1 to print the node names, TeX does -% not insert empty discretionaries after hyphens, which means that it -% will not find a line break at a hyphen in a node names. Since some -% manuals are best written with fairly long node names, containing -% hyphens, this is a loss. Therefore, we simply give the text of -% the node name again, so it is as if TeX is seeing it for the first -% time. -\ifdim \wd1>0pt -section ``\printednodename'' in \cite{\printedmanual}% -\else% -\turnoffactive% -\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}% -\fi +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \def\printedmanual{\ignorespaces #5}% + \def\printednodename{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual}% + \setbox0=\hbox{\printednodename}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printednodename{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1>0pt% + % It is in another manual, so we don't have it. + \def\printednodename{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printednodename{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printednodename{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordsection{} ``\printednodename'' in \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive \refx{#1-snt}{}}% + \space [\printednodename],\space + \turnoffactive \putwordpage\tie\refx{#1-pg}{}% + \fi \endgroup} % \dosetq is the interface for calls from other macros % Use \turnoffactive so that punctuation chars such as underscore % work in node names. -\def\dosetq #1#2{{\let\folio=0 \turnoffactive% +\def\dosetq #1#2{{\let\folio=0 \turnoffactive \auxhat% \edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% \next}} @@ -2547,33 +4156,33 @@ section ``\printednodename'' in \cite{\printedmanual}% \def\Ypagenumber{\folio} -\def\Ytitle{\thischapter} +\def\Ytitle{\thissection} \def\Ynothing{} \def\Ysectionnumberandtype{% -\ifnum\secno=0 Chapter\xreftie\the\chapno % -\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno % +\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % +\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % \else \ifnum \subsubsecno=0 % -Section\xreftie\the\chapno.\the\secno.\the\subsecno % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % \else % -Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \def\Yappendixletterandtype{% -\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}% -\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno % +\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% +\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % \else \ifnum \subsubsecno=0 % -Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno % +\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % \else % -Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % +\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \fi \fi \fi } \gdef\xreftie{'tie} % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. -% +% \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Non-3.0. \else @@ -2633,7 +4242,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \catcode `\=\other \catcode `\=\other \catcode `\=\other -\catcode `\=\other +\catcode 26=\other \catcode `\^^[=\other \catcode `\^^\=\other \catcode `\^^]=\other @@ -2652,6 +4261,17 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \catcode `\$=\other \catcode `\#=\other \catcode `\&=\other +% `\+ does not work, so use 43. +\catcode 43=\other +% Make the characters 128-255 be printing characters +{% + \count 1=128 + \def\loop{% + \catcode\count 1=\other + \advance\count 1 by 1 + \ifnum \count 1<256 \loop \fi + }% +}% % the aux file uses ' as the escape. % Turn off \ as an escape so we do not lose on % entries which were dumped with control sequences in their names. @@ -2661,9 +4281,11 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \catcode `\{=1 \catcode `\}=2 \catcode `\%=\other \catcode `\'=0 +\catcode`\^=7 % to make ^^e4 etc usable in xref tags \catcode `\\=\other \openin 1 \jobname.aux \ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue +\global\warnedobstrue \fi % Open the new aux file. Tex will close it automatically at exit. \openout \auxfile=\jobname.aux @@ -2674,28 +4296,120 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \newcount \footnoteno +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } +% @footnotestyle is meaningful for info output only.. +\let\footnotestyle=\comment + \let\ptexfootnote=\footnote {\catcode `\@=11 -\long\gdef\footnote #1{\global\advance \footnoteno by \@ne -\removelastskip -\edef\thisfootno{$^{\the\footnoteno}$}% -\let\@sf\empty -\ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi -\thisfootno\@sf \footnotezzz{#1}} -% \parsearg\footnotezzz} - -\long\gdef\footnotezzz #1{\insert\footins{ -\interlinepenalty\interfootnotelinepenalty -\splittopskip\ht\strutbox % top baseline for broken footnotes -\splitmaxdepth\dp\strutbox \floatingpenalty\@MM -\leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip -\footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}} +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \footnotezzz +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +\long\gdef\footnotezzz#1{\insert\footins{% + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + % Hang the footnote text off the number. + \hang + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + #1\strut}% +} }%end \catcode `\@=11 +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +\def\setleading#1{% + \normalbaselineskip = #1\relax + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + + % End of control word definitions. \message{and turning on texinfo input format.} @@ -2711,49 +4425,123 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % % Set some numeric style parameters, for 8.5 x 11 format. -%\hsize = 6.5in +\hsize = 6in +\hoffset = .25in \newdimen\defaultparindent \defaultparindent = 15pt \parindent = \defaultparindent -\parskip 18pt plus 1pt -\baselineskip 15pt +\parskip 3pt plus 2pt minus 1pt +\setleading{13.2pt} \advance\topskip by 1.2cm +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + % Prevent underfull vbox error messages. \vbadness=10000 +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. This makes it come to about 9pt for the 8.5x11 format. -% -\ifx\emergencystretch\thisisundefined \else +% +\ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% +\else \emergencystretch = \hsize \divide\emergencystretch by 45 \fi -% Use @smallbook to reset parameters for 7x9.5 format +% Use @smallbook to reset parameters for 7x9.5 format (or else 7x9.25) \def\smallbook{ -\global\lispnarrowing = 0.3in -\global\baselineskip 12pt -\global\parskip 3pt plus 1pt -\global\hsize = 5in -\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in -\global\vsize=7.5in + \global\chapheadingskip = 15pt plus 4pt minus 2pt + \global\secheadingskip = 12pt plus 3pt minus 2pt + \global\subsecheadingskip = 9pt plus 2pt minus 2pt + % + \global\lispnarrowing = 0.3in + \setleading{12pt} + \advance\topskip by -1cm + \global\parskip 2pt plus 1pt + \global\hsize = 5in + \global\vsize=7.5in + \global\tolerance=700 + \global\hfuzz=1pt + \global\contentsrightmargin=0pt + \global\deftypemargin=0pt + \global\defbodyindent=.5cm + % + \global\pagewidth=\hsize + \global\pageheight=\vsize + % + \global\let\smalllisp=\smalllispx + \global\let\smallexample=\smalllispx + \global\def\Esmallexample{\Esmalllisp} +} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{ \global\tolerance=700 \global\hfuzz=1pt +\setleading{12pt} +\global\parskip 15pt plus 1pt + +\global\vsize= 53\baselineskip +\advance\vsize by \topskip +%\global\hsize= 5.85in % A4 wide 10pt +\global\hsize= 6.5in +\global\outerhsize=\hsize +\global\advance\outerhsize by 0.5in +\global\outervsize=\vsize +\global\advance\outervsize by 0.6in \global\pagewidth=\hsize \global\pageheight=\vsize - -\global\let\smalllisp=\smalllispx -\global\let\smallexample=\smalllispx -\global\def\Esmallexample{\Esmalllisp} } -%% For a final copy, take out the rectangles -%% that mark overfull boxes (in case you have decided -%% that the text looks ok even though it passes the margin). -\def\finalout{\hfuzz=\maxdimen} +\bindingoffset=0pt +\normaloffset=\hoffset +\pagewidth=\hsize +\pageheight=\vsize + +% Allow control of the text dimensions. Parameters in order: textheight; +% textwidth; voffset; hoffset; binding offset; topskip. +% All require a dimension; +% header is additional; added length extends the bottom of the page. + +\def\changepagesizes#1#2#3#4#5#6{ + \global\vsize= #1 + \global\topskip= #6 + \advance\vsize by \topskip + \global\voffset= #3 + \global\hsize= #2 + \global\outerhsize=\hsize + \global\advance\outerhsize by 0.5in + \global\outervsize=\vsize + \global\advance\outervsize by 0.6in + \global\pagewidth=\hsize + \global\pageheight=\vsize + \global\normaloffset= #4 + \global\bindingoffset= #5} + +% A specific text layout, 24x15cm overall, intended for A4 paper. Top margin +% 29mm, hence bottom margin 28mm, nominal side margin 3cm. +\def\afourlatex + {\global\tolerance=700 + \global\hfuzz=1pt + \setleading{12pt} + \global\parskip 15pt plus 1pt + \advance\baselineskip by 1.6pt + \changepagesizes{237mm}{150mm}{3.6mm}{3.6mm}{3mm}{7mm} + } + +% Use @afourwide to print on European A4 paper in wide format. +\def\afourwide{\afourpaper +\changepagesizes{9.5in}{6.5in}{\hoffset}{\normaloffset}{\bindingoffset}{7mm}} % Define macros to output various characters with catcode for normal text. \catcode`\"=\other @@ -2781,7 +4569,7 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. -% +% \def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi} % Turn off all special characters except @ @@ -2796,19 +4584,13 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % \def~{{\tt \char '176}} \chardef\hat=`\^ \catcode`\^=\active +\def\auxhat{\def^{'hat}} \def^{{\tt \hat}} \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} % Subroutine for the previous macro. -\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}} - -% \lvvmode is equivalent in function to \leavevmode. -% Using \leavevmode runs into trouble when written out to -% an index file due to the expansion of \leavevmode into ``\unhbox -% \voidb@x'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our -% magic tricks with @. -\def\lvvmode{\vbox to 0pt{}} +\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} \catcode`\|=\active \def|{{\tt \char '174}} @@ -2823,21 +4605,19 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % %\catcode 27=\active %\def^^[{$\diamondsuit$} -% Used sometimes to turn off (effectively) the active characters -% even after parsing them. -\def\turnoffactive{\let"=\normaldoublequote -\let~=\normaltilde -\let^=\normalcaret -\let_=\normalunderscore -\let|=\normalverticalbar -\let<=\normalless -\let>=\normalgreater -\let+=\normalplus} - % Set up an active definition for =, but don't enable it most of the time. {\catcode`\==\active \global\def={{\tt \char 61}}} +\catcode`+=\active +\catcode`\_=\active + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + \catcode`\@=0 % \rawbackslashxx output one backslash character in current font @@ -2858,18 +4638,47 @@ Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno % % \catcode 17=0 % Define control-q \catcode`\\=\active +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +@def@turnoffactive{@let"=@normaldoublequote +@let\=@realbackslash +@let~=@normaltilde +@let^=@normalcaret +@let_=@normalunderscore +@let|=@normalverticalbar +@let<=@normalless +@let>=@normalgreater +@let+=@normalplus} + +@def@normalturnoffactive{@let"=@normaldoublequote +@let\=@normalbackslash +@let~=@normaltilde +@let^=@normalcaret +@let_=@normalunderscore +@let|=@normalverticalbar +@let<=@normalless +@let>=@normalgreater +@let+=@normalplus} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + % If a .fmt file is being used, we don't want the `\input texinfo' to show up. -% That is what \eatinput is for; after that, the `\' should revert to printing +% That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then -% the first `\{ in the file would cause an error. This macro tries to fix +% the first `\{ in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. -% -@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi} +% Also back turn on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{@ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active @catcode`@_=@active} %% These look ok in all fonts, so just make them not special. The @rm below %% makes sure that the current font starts out as the newly loaded cmr10 -- 2.30.2