From a44161c313d46a1b10fd764728a089c26037710a Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Fri, 7 Jul 2000 19:14:18 +0000 Subject: Import of readline 4.0 --- readline/Makefile.in | 48 +- readline/acconfig.h | 28 +- readline/config.h.in | 99 +- readline/configure | 432 ++-- readline/configure.in | 40 +- readline/display.c | 21 - readline/doc/history.dvi | Bin 0 -> 48188 bytes readline/doc/history.html | 1161 ++++++++++ readline/doc/history.info | 788 +++++++ readline/doc/history.ps | 2265 +++++++++++++++++++ readline/doc/hsuser.texinfo | 4 +- readline/doc/readline.dvi | Bin 0 -> 199980 bytes readline/doc/readline.html | 4230 +++++++++++++++++++++++++++++++++++ readline/doc/readline.info | 3039 +++++++++++++++++++++++++ readline/doc/readline.ps | 5225 +++++++++++++++++++++++++++++++++++++++++++ readline/doc/texinfo.tex | 4692 ++++++++++++++++++++++++++++++++++++++ readline/rltty.c | 4 - readline/shell.c | 1 - readline/terminal.c | 10 - 19 files changed, 21620 insertions(+), 467 deletions(-) create mode 100644 readline/doc/history.dvi create mode 100644 readline/doc/history.html create mode 100644 readline/doc/history.info create mode 100644 readline/doc/history.ps create mode 100644 readline/doc/readline.dvi create mode 100644 readline/doc/readline.html create mode 100644 readline/doc/readline.info create mode 100644 readline/doc/readline.ps create mode 100644 readline/doc/texinfo.tex (limited to 'readline') diff --git a/readline/Makefile.in b/readline/Makefile.in index 5c667ed..746c83c 100644 --- a/readline/Makefile.in +++ b/readline/Makefile.in @@ -1,6 +1,6 @@ ## -*- text -*- ## # Master Makefile for the GNU readline library. -# Copyright (C) 1994, 1998 Free Software Foundation, Inc. +# Copyright (C) 1994 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -19,7 +19,7 @@ RL_LIBRARY_VERSION = @LIBVERSION@ RL_LIBRARY_NAME = readline srcdir = @srcdir@ -VPATH = @srcdir@ +VPATH = .:@srcdir@ top_srcdir = @top_srcdir@ BUILD_DIR = @BUILD_DIR@ @@ -147,9 +147,9 @@ stamp-h: config.status $(srcdir)/config.h.in CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status echo > $@ -# CYGNUS LOCAL: Never run autoconf. -#$(srcdir)/configure: $(srcdir)/configure.in Comment-me-out in distribution -# cd $(srcdir) && autoconf Comment-me-out in distribution +$(srcdir)/configure: $(srcdir)/configure.in ## Comment-me-out in distribution + cd $(srcdir) && autoconf ## Comment-me-out in distribution + shared: force -test -d shlib || mkdir shlib @@ -165,30 +165,20 @@ examples: force force: -## CYGNUS LOCAL -## Don't mess with people's installed readline's. -## This tries to install this version of readline over whatever -## version is already installed on the system (which could be a -## newer version). There is no real reason for us to install -## readline along with GDB. GDB links statically against readline, -## so it doesn't depend on us installing it on the system. - -install: - -#install: installdirs $(STATIC_LIBS) -# for f in ${INSTALLED_HEADERS}; do \ -# $(INSTALL_DATA) $(srcdir)/$$f $(includedir)/readline ; \ -# done -# -( if test -f $(libdir)/libreadline.a ; then $(MV) $(libdir)/libreadline.a $(libdir)/libreadline.old; fi ) -# $(INSTALL_DATA) libreadline.a $(libdir)/libreadline.a -# -test -n "$(RANLIB)" && $(RANLIB) -t $(libdir)/libreadline.a -# -( if test -f $(libdir)/libhistory.a; then $(MV) $(libdir)/libhistory.a $(libdir)/libhistory.old; fi ) -# $(INSTALL_DATA) libhistory.a $(libdir)/libhistory.a -# -test -n "$(RANLIB)" && $(RANLIB) -t $(libdir)/libhistory.a -# -( if test -d doc ; then \ -# cd doc && \ -# ${MAKE} ${MFLAGS} infodir=$(infodir) $@; \ -# fi ) +install: installdirs $(STATIC_LIBS) + for f in ${INSTALLED_HEADERS}; do \ + $(INSTALL_DATA) $(srcdir)/$$f $(includedir)/readline ; \ + done + -$(MV) $(libdir)/libreadline.a $(libdir)/libreadline.old + $(INSTALL_DATA) libreadline.a $(libdir)/libreadline.a + -test -n "$(RANLIB)" && $(RANLIB) -t $(libdir)/libreadline.a + -$(MV) $(libdir)/libhistory.a $(libdir)/libhistory.old + $(INSTALL_DATA) libhistory.a $(libdir)/libhistory.a + -test -n "$(RANLIB)" && $(RANLIB) -t $(libdir)/libhistory.a + -( if test -d doc ; then \ + cd doc && \ + ${MAKE} ${MFLAGS} infodir=$(infodir) $@; \ + fi ) installdirs: $(srcdir)/support/mkdirs -$(SHELL) $(srcdir)/support/mkdirs $(includedir) \ diff --git a/readline/acconfig.h b/readline/acconfig.h index 577cf9c..4f42238 100644 --- a/readline/acconfig.h +++ b/readline/acconfig.h @@ -17,38 +17,12 @@ /* Definitions pulled in from aclocal.m4. */ #undef VOID_SIGHANDLER -#undef GWINSZ_IN_SYS_IOCTL +#undef TIOCGWINSZ_IN_SYS_IOCTL #undef TIOCSTAT_IN_SYS_IOCTL #undef HAVE_GETPW_DECLS -#undef FIONREAD_IN_SYS_IOCTL - -#undef HAVE_BSD_SIGNALS - -#undef HAVE_LSTAT - -#undef HAVE_POSIX_SIGNALS - -#undef HAVE_POSIX_SIGSETJMP - -#undef HAVE_USG_SIGHOLD - -#undef MUST_REINSTALL_SIGHANDLERS - -#undef SPEED_T_IN_SYS_TYPES - -#undef STRCOLL_BROKEN - -#undef STRUCT_DIRENT_HAS_D_FILENO - -#undef STRUCT_DIRENT_HAS_D_INO - -#undef STRUCT_WINSIZE_IN_SYS_IOCTL - -#undef STRUCT_WINSIZE_IN_TERMIOS - /* Leave that blank line there!! Autoheader needs it. If you're adding to this file, keep in mind: diff --git a/readline/config.h.in b/readline/config.h.in index 87f807f..65927a8 100644 --- a/readline/config.h.in +++ b/readline/config.h.in @@ -1,60 +1,17 @@ /* config.h.in. Generated automatically from configure.in by autoheader. */ -/* Define if you have the strcoll function and it is properly defined. */ -#undef HAVE_STRCOLL - /* Define if on MINIX. */ #undef _MINIX -/* Define if the system does not provide POSIX.1 features except - with this defined. */ -#undef _POSIX_1_SOURCE - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - /* Define as the return type of signal handlers (int or void). */ #undef RETSIGTYPE /* Define if the `S_IS*' macros in do not work properly. */ #undef STAT_MACROS_BROKEN -/* Definitions pulled in from aclocal.m4. */ #undef VOID_SIGHANDLER -#undef GWINSZ_IN_SYS_IOCTL - -#undef TIOCSTAT_IN_SYS_IOCTL - -#undef HAVE_GETPW_DECLS - -#undef FIONREAD_IN_SYS_IOCTL - -#undef HAVE_BSD_SIGNALS - -#undef HAVE_LSTAT - -#undef HAVE_POSIX_SIGNALS - -#undef HAVE_POSIX_SIGSETJMP - -#undef HAVE_USG_SIGHOLD - -#undef MUST_REINSTALL_SIGHANDLERS - -#undef SPEED_T_IN_SYS_TYPES - -#undef STRCOLL_BROKEN - -#undef STRUCT_DIRENT_HAS_D_FILENO - -#undef STRUCT_DIRENT_HAS_D_INO - -#undef STRUCT_WINSIZE_IN_SYS_IOCTL - -#undef STRUCT_WINSIZE_IN_TERMIOS - -/* Define if you have the lstat function. */ +/* Define if you have the lstat function. */ #undef HAVE_LSTAT /* Define if you have the putenv function. */ @@ -66,27 +23,26 @@ /* Define if you have the setenv function. */ #undef HAVE_SETENV -/* Define if you have the setlocale function. */ -#undef HAVE_SETLOCALE - /* Define if you have the strcasecmp function. */ #undef HAVE_STRCASECMP +/* Define if you have the setlocale function. */ +#undef HAVE_SETLOCALE + /* Define if you have the tcgetattr function. */ #undef HAVE_TCGETATTR +/* Define if you have the strcoll function. */ +#undef HAVE_STRCOLL + +#undef STRCOLL_BROKEN + /* Define if you have the header file. */ #undef HAVE_DIRENT_H -/* Define if you have the header file. */ -#undef HAVE_LOCALE_H - /* Define if you have the header file. */ #undef HAVE_NDIR_H -/* Define if you have the header file. */ -#undef HAVE_STDARG_H - /* Define if you have the header file. */ #undef HAVE_STDLIB_H @@ -128,6 +84,43 @@ /* Define if you have the header file. */ #undef HAVE_VARARGS_H + +/* Define if you have the header file. */ +#undef HAVE_STDARG_H + +#undef HAVE_LOCALE_H + +/* Definitions pulled in from aclocal.m4. */ +#undef VOID_SIGHANDLER + +#undef GWINSZ_IN_SYS_IOCTL + +#undef STRUCT_WINSIZE_IN_SYS_IOCTL + +#undef STRUCT_WINSIZE_IN_TERMIOS + +#undef TIOCSTAT_IN_SYS_IOCTL + +#undef FIONREAD_IN_SYS_IOCTL + +#undef SPEED_T_IN_SYS_TYPES + +#undef HAVE_GETPW_DECLS + +#undef STRUCT_DIRENT_HAS_D_INO + +#undef STRUCT_DIRENT_HAS_D_FILENO + +#undef HAVE_BSD_SIGNALS + +#undef HAVE_POSIX_SIGNALS + +#undef HAVE_USG_SIGHOLD + +#undef MUST_REINSTALL_SIGHANDLERS + +#undef HAVE_POSIX_SIGSETJMP + /* config.h.bot */ /* modify settings or make new ones based on what autoconf tells us. */ diff --git a/readline/configure b/readline/configure index cdcdf88..454a177 100755 --- a/readline/configure +++ b/readline/configure @@ -1,6 +1,6 @@ #! /bin/sh -# From configure.in for Readline 4.0, version 2.14, from autoconf version 2.13 +# From configure.in for Readline 4.0, version 2.14, from autoconf version 2.12 LIBVERSION=4.0 @@ -92,7 +92,7 @@ LIBVERSION=4.0 # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 +# Generated automatically using autoconf version 2.12 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation @@ -121,7 +121,6 @@ program_suffix=NONE program_transform_name=s,x,x, silent= site= -sitefile= srcdir= target=NONE verbose= @@ -143,7 +142,6 @@ mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. ac_max_here_lines=12 @@ -236,7 +234,6 @@ Configuration: --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages - --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX @@ -407,11 +404,6 @@ EOF -site=* | --site=* | --sit=*) site="$ac_optarg" ;; - -site-file | --site-file | --site-fil | --site-fi | --site-f) - ac_prev=sitefile ;; - -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*) - sitefile="$ac_optarg" ;; - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) @@ -433,7 +425,7 @@ EOF verbose=yes ;; -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" + echo "configure generated by autoconf version 2.12" exit 0 ;; -with-* | --with-*) @@ -577,16 +569,12 @@ fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. -if test -z "$sitefile"; then - if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi -else - CONFIG_SITE="$sitefile" fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then @@ -607,11 +595,9 @@ ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross -ac_exeext= -ac_objext=o if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then @@ -629,9 +615,8 @@ fi - ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do +for ac_dir in ./support $srcdir/./support; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" @@ -643,34 +628,35 @@ for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do fi done if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } + { echo "configure: error: can not find install-sh or install.sh in ./support $srcdir/./support" 1>&2; exit 1; } fi ac_config_guess=$ac_aux_dir/config.guess ac_config_sub=$ac_aux_dir/config.sub ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + # Make sure we can run config.sub. -if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : +if $ac_config_sub sun4 >/dev/null 2>&1; then : else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } fi echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:660: checking host system type" >&5 +echo "configure:646: checking host system type" >&5 host_alias=$host case "$host_alias" in NONE) case $nonopt in NONE) - if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : + if host_alias=`$ac_config_guess`; then : else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } fi ;; *) host_alias=$nonopt ;; esac ;; esac -host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` +host=`$ac_config_sub $host_alias` host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` @@ -697,16 +683,15 @@ test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1 # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:701: checking for $ac_word" >&5 +echo "configure:687: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" @@ -727,17 +712,16 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:731: checking for $ac_word" >&5 +echo "configure:716: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do + for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then @@ -772,61 +756,25 @@ else echo "$ac_t""no" 1>&6 fi - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:782: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:814: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:764: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' cross_compiling=$ac_cv_prog_cc_cross -cat > conftest.$ac_ext << EOF - -#line 825 "configure" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:778: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -840,24 +788,18 @@ else ac_cv_prog_cc_works=no fi rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:856: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:798: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:861: checking whether we are using GNU C" >&5 +echo "configure:803: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -866,7 +808,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:870: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:812: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -877,15 +819,11 @@ echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:889: checking whether ${CC-cc} accepts -g" >&5 + ac_test_CFLAGS="${CFLAGS+set}" + ac_save_CFLAGS="$CFLAGS" + CFLAGS= + echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:827: checking whether ${CC-cc} accepts -g" >&5 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -900,24 +838,20 @@ rm -f conftest* fi echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then + if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" + elif test $ac_cv_prog_cc_g = yes; then CFLAGS="-g -O2" else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then CFLAGS="-O2" - else - CFLAGS= fi +else + GCC= + test "${CFLAGS+set}" = set || CFLAGS="-g" fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:921: checking how to run the C preprocessor" >&5 +echo "configure:855: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -932,14 +866,14 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:942: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +{ (eval echo configure:876: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else @@ -949,31 +883,14 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:959: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext < -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:976: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +{ (eval echo configure:893: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else @@ -986,8 +903,6 @@ fi rm -f conftest* fi rm -f conftest* -fi -rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" @@ -998,18 +913,18 @@ echo "$ac_t""$CPP" 1>&6 ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'` echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 -echo "configure:1002: checking for minix/config.h" >&5 +echo "configure:917: checking for minix/config.h" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1012: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +{ (eval echo configure:927: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" @@ -1046,52 +961,18 @@ EOF fi - -if test "x$cross_compiling" = "xyes"; then - case "${host}" in - *-cygwin*) - cross_cache=${srcdir}/cross-build/cygwin.cache - if test -r "${cross_cache}"; then - echo "loading cross-build cache file ${cross_cache}" - . ${cross_cache} - fi - LOCAL_CFLAGS="$LOCAL_CFLAGS -I${srcdir}/../libtermcap" - unset cross_cache - ;; - *) echo "configure: cross-compiling for a non-cygwin target is not supported" >&2 - ;; - esac -fi - -if test "x$cross_compiling" = "xyes"; then - CROSS_COMPILING_FLAG=-DCROSS_COMPILING -else - CROSS_COMPILING_FLAG= -fi - - -if test -z "$CC_FOR_BUILD"; then - if test "x$cross_compiling" = "xno"; then - CC_FOR_BUILD='$(CC)' - else - CC_FOR_BUILD=gcc - fi -fi - - - # If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" if test $ac_cv_prog_gcc = yes; then echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 -echo "configure:1089: checking whether ${CC-cc} needs -traditional" >&5 +echo "configure:970: checking whether ${CC-cc} needs -traditional" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_pattern="Autoconf.*'x'" cat > conftest.$ac_ext < Autoconf TIOCGETP @@ -1109,7 +990,7 @@ rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < Autoconf TCGETA @@ -1137,30 +1018,28 @@ fi # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1146: checking for a BSD compatible install" >&5 +echo "configure:1026: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do + for ac_prog in ginstall installbsd scoinst install; do if test -f $ac_dir/$ac_prog; then if test $ac_prog = install && grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. + # OSF/1 installbsd also uses dspmsg, but is usable. : else ac_cv_path_install="$ac_dir/$ac_prog -c" @@ -1190,23 +1069,20 @@ echo "$ac_t""$INSTALL" 1>&6 # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1201: checking for $ac_word" >&5 +echo "configure:1078: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_AR="ar" @@ -1227,16 +1103,15 @@ test -n "$ARFLAGS" || ARFLAGS="cr" # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1231: checking for $ac_word" >&5 +echo "configure:1107: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_RANLIB="ranlib" @@ -1259,12 +1134,12 @@ MAKE_SHELL=/bin/sh echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 -echo "configure:1263: checking return type of signal handlers" >&5 +echo "configure:1138: checking return type of signal handlers" >&5 if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1281,7 +1156,7 @@ int main() { int i; ; return 0; } EOF -if { (eval echo configure:1285: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1160: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void else @@ -1301,12 +1176,12 @@ EOF echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6 -echo "configure:1305: checking whether stat file-mode macros are broken" >&5 +echo "configure:1180: checking whether stat file-mode macros are broken" >&5 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1361,12 +1236,12 @@ for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6 -echo "configure:1365: checking for $ac_hdr that defines DIR" >&5 +echo "configure:1240: checking for $ac_hdr that defines DIR" >&5 if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include <$ac_hdr> @@ -1374,7 +1249,7 @@ int main() { DIR *dirp = 0; ; return 0; } EOF -if { (eval echo configure:1378: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1253: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* eval "ac_cv_header_dirent_$ac_safe=yes" else @@ -1399,7 +1274,7 @@ done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6 -echo "configure:1403: checking for opendir in -ldir" >&5 +echo "configure:1278: checking for opendir in -ldir" >&5 ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1407,7 +1282,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldir $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1297: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1440,7 +1315,7 @@ fi else echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6 -echo "configure:1444: checking for opendir in -lx" >&5 +echo "configure:1319: checking for opendir in -lx" >&5 ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1448,7 +1323,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lx $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1338: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1485,12 +1360,12 @@ fi for ac_func in strcasecmp select setenv putenv tcgetattr setlocale lstat do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1489: checking for $ac_func" >&5 +echo "configure:1364: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1392: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -1539,7 +1414,7 @@ done echo $ac_n "checking for working strcoll""... $ac_c" 1>&6 -echo "configure:1543: checking for working strcoll" >&5 +echo "configure:1418: checking for working strcoll" >&5 if eval "test \"`echo '$''{'ac_cv_func_strcoll_works'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1547,7 +1422,7 @@ else ac_cv_func_strcoll_works=no else cat > conftest.$ac_ext < main () @@ -1557,7 +1432,7 @@ main () strcoll ("123", "456") >= 0); } EOF -if { (eval echo configure:1561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then ac_cv_func_strcoll_works=yes else @@ -1586,18 +1461,18 @@ for ac_hdr in unistd.h stdlib.h varargs.h stdarg.h string.h \ do ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1590: checking for $ac_hdr" >&5 +echo "configure:1465: checking for $ac_hdr" >&5 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1600: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +{ (eval echo configure:1475: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" @@ -1625,13 +1500,13 @@ done echo $ac_n "checking for type of signal functions""... $ac_c" 1>&6 -echo "configure:1629: checking for type of signal functions" >&5 +echo "configure:1504: checking for type of signal functions" >&5 if eval "test \"`echo '$''{'bash_cv_signal_vintage'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { @@ -1644,7 +1519,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* bash_cv_signal_vintage=posix else @@ -1653,7 +1528,7 @@ else rm -rf conftest* cat > conftest.$ac_ext < int main() { @@ -1663,7 +1538,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:1667: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1542: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* bash_cv_signal_vintage=4.2bsd else @@ -1672,7 +1547,7 @@ else rm -rf conftest* cat > conftest.$ac_ext < @@ -1685,7 +1560,7 @@ int main() { ; return 0; } EOF -if { (eval echo configure:1689: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1564: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* bash_cv_signal_vintage=svr3 else @@ -1726,7 +1601,7 @@ fi echo $ac_n "checking if signal handlers must be reinstalled when invoked""... $ac_c" 1>&6 -echo "configure:1730: checking if signal handlers must be reinstalled when invoked" >&5 +echo "configure:1605: checking if signal handlers must be reinstalled when invoked" >&5 if eval "test \"`echo '$''{'bash_cv_must_reinstall_sighandlers'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1736,7 +1611,7 @@ else else cat > conftest.$ac_ext < @@ -1783,7 +1658,7 @@ main() } EOF -if { (eval echo configure:1787: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1662: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then bash_cv_must_reinstall_sighandlers=no else @@ -1808,7 +1683,7 @@ fi echo $ac_n "checking for presence of POSIX-style sigsetjmp/siglongjmp""... $ac_c" 1>&6 -echo "configure:1812: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5 +echo "configure:1687: checking for presence of POSIX-style sigsetjmp/siglongjmp" >&5 if eval "test \"`echo '$''{'bash_cv_func_sigsetjmp'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1818,7 +1693,7 @@ else else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1738: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then bash_cv_func_sigsetjmp=present else @@ -1882,12 +1757,12 @@ EOF fi echo $ac_n "checking for lstat""... $ac_c" 1>&6 -echo "configure:1886: checking for lstat" >&5 +echo "configure:1761: checking for lstat" >&5 if eval "test \"`echo '$''{'bash_cv_func_lstat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -1897,7 +1772,7 @@ int main() { lstat(".",(struct stat *)0); ; return 0; } EOF -if { (eval echo configure:1901: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* bash_cv_func_lstat=yes else @@ -1918,12 +1793,12 @@ EOF fi echo $ac_n "checking whether programs are able to redeclare getpw functions""... $ac_c" 1>&6 -echo "configure:1922: checking whether programs are able to redeclare getpw functions" >&5 +echo "configure:1797: checking whether programs are able to redeclare getpw functions" >&5 if eval "test \"`echo '$''{'bash_cv_can_redecl_getpw'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -1934,7 +1809,7 @@ int main() { struct passwd *z; z = getpwent(); z = getpwuid(0); z = getpwnam("root"); ; return 0; } EOF -if { (eval echo configure:1938: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1813: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_can_redecl_getpw=yes else @@ -1956,7 +1831,7 @@ fi echo $ac_n "checking whether or not strcoll and strcmp differ""... $ac_c" 1>&6 -echo "configure:1960: checking whether or not strcoll and strcmp differ" >&5 +echo "configure:1835: checking whether or not strcoll and strcmp differ" >&5 if eval "test \"`echo '$''{'bash_cv_func_strcoll_broken'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1966,7 +1841,7 @@ else else cat > conftest.$ac_ext < @@ -2005,7 +1880,7 @@ char *v[]; } EOF -if { (eval echo configure:2009: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +if { (eval echo configure:1884: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then bash_cv_func_strcoll_broken=yes else @@ -2029,12 +1904,12 @@ fi echo $ac_n "checking whether signal handlers are of type void""... $ac_c" 1>&6 -echo "configure:2033: checking whether signal handlers are of type void" >&5 +echo "configure:1908: checking whether signal handlers are of type void" >&5 if eval "test \"`echo '$''{'bash_cv_void_sighandler'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2049,7 +1924,7 @@ int main() { int i; ; return 0; } EOF -if { (eval echo configure:2053: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1928: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_void_sighandler=yes else @@ -2069,12 +1944,12 @@ EOF fi echo $ac_n "checking for TIOCGWINSZ in sys/ioctl.h""... $ac_c" 1>&6 -echo "configure:2073: checking for TIOCGWINSZ in sys/ioctl.h" >&5 +echo "configure:1948: checking for TIOCGWINSZ in sys/ioctl.h" >&5 if eval "test \"`echo '$''{'bash_cv_tiocgwinsz_in_ioctl'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2082,7 +1957,7 @@ int main() { int x = TIOCGWINSZ; ; return 0; } EOF -if { (eval echo configure:2086: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1961: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_tiocgwinsz_in_ioctl=yes else @@ -2103,12 +1978,12 @@ EOF fi echo $ac_n "checking for TIOCSTAT in sys/ioctl.h""... $ac_c" 1>&6 -echo "configure:2107: checking for TIOCSTAT in sys/ioctl.h" >&5 +echo "configure:1982: checking for TIOCSTAT in sys/ioctl.h" >&5 if eval "test \"`echo '$''{'bash_cv_tiocstat_in_ioctl'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2116,7 +1991,7 @@ int main() { int x = TIOCSTAT; ; return 0; } EOF -if { (eval echo configure:2120: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1995: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_tiocstat_in_ioctl=yes else @@ -2137,12 +2012,12 @@ EOF fi echo $ac_n "checking for FIONREAD in sys/ioctl.h""... $ac_c" 1>&6 -echo "configure:2141: checking for FIONREAD in sys/ioctl.h" >&5 +echo "configure:2016: checking for FIONREAD in sys/ioctl.h" >&5 if eval "test \"`echo '$''{'bash_cv_fionread_in_ioctl'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2150,7 +2025,7 @@ int main() { int x = FIONREAD; ; return 0; } EOF -if { (eval echo configure:2154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2029: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_fionread_in_ioctl=yes else @@ -2171,19 +2046,19 @@ EOF fi echo $ac_n "checking for speed_t in sys/types.h""... $ac_c" 1>&6 -echo "configure:2175: checking for speed_t in sys/types.h" >&5 +echo "configure:2050: checking for speed_t in sys/types.h" >&5 if eval "test \"`echo '$''{'bash_cv_speed_t_in_sys_types'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < int main() { speed_t x; ; return 0; } EOF -if { (eval echo configure:2187: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2062: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_speed_t_in_sys_types=yes else @@ -2204,12 +2079,12 @@ EOF fi echo $ac_n "checking for struct winsize in sys/ioctl.h and termios.h""... $ac_c" 1>&6 -echo "configure:2208: checking for struct winsize in sys/ioctl.h and termios.h" >&5 +echo "configure:2083: checking for struct winsize in sys/ioctl.h and termios.h" >&5 if eval "test \"`echo '$''{'bash_cv_struct_winsize_header'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2217,7 +2092,7 @@ int main() { struct winsize x; ; return 0; } EOF -if { (eval echo configure:2221: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2096: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_struct_winsize_header=ioctl_h else @@ -2225,7 +2100,7 @@ else cat conftest.$ac_ext >&5 rm -rf conftest* cat > conftest.$ac_ext < #include @@ -2233,7 +2108,7 @@ int main() { struct winsize x; ; return 0; } EOF -if { (eval echo configure:2237: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2112: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_struct_winsize_header=termios_h else @@ -2266,12 +2141,12 @@ fi echo $ac_n "checking if struct dirent has a d_ino member""... $ac_c" 1>&6 -echo "configure:2270: checking if struct dirent has a d_ino member" >&5 +echo "configure:2145: checking if struct dirent has a d_ino member" >&5 if eval "test \"`echo '$''{'bash_cv_dirent_has_dino'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -2300,7 +2175,7 @@ struct dirent d; int z; z = d.d_ino; ; return 0; } EOF -if { (eval echo configure:2304: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2179: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_dirent_has_dino=yes else @@ -2322,12 +2197,12 @@ fi echo $ac_n "checking if struct dirent has a d_fileno member""... $ac_c" 1>&6 -echo "configure:2326: checking if struct dirent has a d_fileno member" >&5 +echo "configure:2201: checking if struct dirent has a d_fileno member" >&5 if eval "test \"`echo '$''{'bash_cv_dirent_has_d_fileno'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < @@ -2356,7 +2231,7 @@ struct dirent d; int z; z = d.d_fileno; ; return 0; } EOF -if { (eval echo configure:2360: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2235: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* bash_cv_dirent_has_d_fileno=yes else @@ -2385,14 +2260,14 @@ if test "X$bash_cv_termcap_lib" = "X"; then _bash_needmsg=yes else echo $ac_n "checking which library has the termcap functions""... $ac_c" 1>&6 -echo "configure:2389: checking which library has the termcap functions" >&5 +echo "configure:2264: checking which library has the termcap functions" >&5 _bash_needmsg= fi if eval "test \"`echo '$''{'bash_cv_termcap_lib'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:2396: checking for tgetent in -ltermcap" >&5 +echo "configure:2271: checking for tgetent in -ltermcap" >&5 ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2400,7 +2275,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ltermcap $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2290: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2430,7 +2305,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6 -echo "configure:2434: checking for tgetent in -lcurses" >&5 +echo "configure:2309: checking for tgetent in -lcurses" >&5 ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2438,7 +2313,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2328: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2468,7 +2343,7 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then else echo "$ac_t""no" 1>&6 echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6 -echo "configure:2472: checking for tgetent in -lncurses" >&5 +echo "configure:2347: checking for tgetent in -lncurses" >&5 ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2476,7 +2351,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2366: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2516,7 +2391,7 @@ fi if test "X$_bash_needmsg" = "Xyes"; then echo $ac_n "checking which library has the termcap functions""... $ac_c" 1>&6 -echo "configure:2520: checking which library has the termcap functions" >&5 +echo "configure:2395: checking which library has the termcap functions" >&5 fi echo "$ac_t""using $bash_cv_termcap_lib" 1>&6 if test $bash_cv_termcap_lib = gnutermcap && test -z "$prefer_curses"; then @@ -2553,7 +2428,7 @@ esac # if test -f ${srcdir}/support/shobj-conf; then echo $ac_n "checking configuration for building shared libraries""... $ac_c" 1>&6 -echo "configure:2557: checking configuration for building shared libraries" >&5 +echo "configure:2432: checking configuration for building shared libraries" >&5 eval `${CONFIG_SHELL-/bin/sh} ${srcdir}/support/shobj-conf -C ${CC} -c ${host_cpu} -o ${host_os} -v ${host_vendor}` @@ -2611,7 +2486,7 @@ EOF # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in + case `(ac_space=' '; set) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote substitution # turns \\\\ into \\, and sed turns \\ into \). @@ -2678,7 +2553,7 @@ do echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" + echo "$CONFIG_STATUS generated by autoconf version 2.12" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; @@ -2698,11 +2573,9 @@ sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF $ac_vpsub $extrasub -s%@SHELL@%$SHELL%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g @@ -2728,10 +2601,7 @@ s%@host_vendor@%$host_vendor%g s%@host_os@%$host_os%g s%@CC@%$CC%g s%@CPP@%$CPP%g -s%@CROSS_COMPILING_FLAG@%$CROSS_COMPILING_FLAG%g -s%@CC_FOR_BUILD@%$CC_FOR_BUILD%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g s%@INSTALL_DATA@%$INSTALL_DATA%g s%@AR@%$AR%g s%@RANLIB@%$RANLIB%g diff --git a/readline/configure.in b/readline/configure.in index 9afdaa7..240a3ad 100644 --- a/readline/configure.in +++ b/readline/configure.in @@ -13,7 +13,7 @@ AC_CONFIG_HEADER(config.h) dnl make sure we are using a recent autoconf version AC_PREREQ(2.10) -dnl AC_CONFIG_AUX_DIR(./support) +AC_CONFIG_AUX_DIR(./support) AC_CANONICAL_HOST @@ -34,44 +34,6 @@ test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1 AC_PROG_CC AC_MINIX -dnl BEGIN changes for CYGNUS cross-building for Cygwin - -dnl load up the cross-building cache file -- add more cases and cache -dnl files as necessary -if test "x$cross_compiling" = "xyes"; then - case "${host}" in - *-cygwin*) - cross_cache=${srcdir}/cross-build/cygwin.cache - if test -r "${cross_cache}"; then - echo "loading cross-build cache file ${cross_cache}" - . ${cross_cache} - fi - LOCAL_CFLAGS="$LOCAL_CFLAGS -I${srcdir}/../libtermcap" - unset cross_cache - ;; - *) echo "configure: cross-compiling for a non-cygwin target is not supported" >&2 - ;; - esac -fi - -if test "x$cross_compiling" = "xyes"; then - CROSS_COMPILING_FLAG=-DCROSS_COMPILING -else - CROSS_COMPILING_FLAG= -fi -AC_SUBST(CROSS_COMPILING_FLAG) - -if test -z "$CC_FOR_BUILD"; then - if test "x$cross_compiling" = "xno"; then - CC_FOR_BUILD='$(CC)' - else - CC_FOR_BUILD=gcc - fi -fi -AC_SUBST(CC_FOR_BUILD) - -dnl END changes for CYGNUS cross-building for Cygwin - # If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" diff --git a/readline/display.c b/readline/display.c index 3f6fe71..25aba64 100644 --- a/readline/display.c +++ b/readline/display.c @@ -651,12 +651,8 @@ rl_redisplay () if (cursor_linenum == 0 && wrap_offset > 0 && _rl_last_c_pos > 0 && _rl_last_c_pos <= last_invisible && local_prompt) { -#if defined (__MSDOS__) - putc ('\r', rl_outstream); -#else if (term_cr) tputs (term_cr, 1, _rl_output_character_function); -#endif _rl_output_some_chars (local_prompt, nleft); _rl_last_c_pos = nleft; } @@ -903,11 +899,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin) term_cr && lendiff > visible_length && _rl_last_c_pos > 0 && od > lendiff && _rl_last_c_pos < last_invisible) { -#if defined (__MSDOS__) - putc ('\r', rl_outstream); -#else tputs (term_cr, 1, _rl_output_character_function); -#endif /* !__MSDOS__ */ _rl_output_some_chars (local_prompt, lendiff); _rl_last_c_pos = lendiff; } @@ -1511,11 +1503,7 @@ cr () { if (term_cr) { -#if defined (__MSDOS__) - putc ('\r', rl_outstream); -#else tputs (term_cr, 1, _rl_output_character_function); -#endif /* !__MSDOS__ */ _rl_last_c_pos = 0; } } @@ -1530,16 +1518,8 @@ _rl_redisplay_after_sigwinch () the right thing happens if we have wrapped to a new screen line. */ if (term_cr) { -#if defined (__MSDOS__) - putc ('\r', rl_outstream); -#else tputs (term_cr, 1, _rl_output_character_function); -#endif /* !__MSDOS__ */ _rl_last_c_pos = 0; -#if defined (__MSDOS__) - space_to_eol (screenwidth); - putc ('\r', rl_outstream); -#else if (term_clreol) tputs (term_clreol, 1, _rl_output_character_function); else @@ -1547,7 +1527,6 @@ _rl_redisplay_after_sigwinch () space_to_eol (screenwidth); tputs (term_cr, 1, _rl_output_character_function); } -#endif if (_rl_last_v_pos > 0) _rl_move_vert (0); } diff --git a/readline/doc/history.dvi b/readline/doc/history.dvi new file mode 100644 index 0000000..35dc6df Binary files /dev/null and b/readline/doc/history.dvi differ diff --git a/readline/doc/history.html b/readline/doc/history.html new file mode 100644 index 0000000..b498d27 --- /dev/null +++ b/readline/doc/history.html @@ -0,0 +1,1161 @@ + + + + +GNU History Library + + +

GNU History Library

+

Edition 4.0, for History Library Version 4.0.

+

December 1998

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

+


+

Table of Contents

+ +


+ +

+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 Free Software Foundation. + +

+

+Copyright (C) 1988-1999 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

+

+Jump to: +a +- +e +- +h +

+

a

+ +
  • anchored search +
  • +

    e

    + +
  • event designators +
  • +

    h

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

    + + +

    Function and Variable Index

    +

    +Jump to: +a +- +c +- +g +- +h +- +m +- +n +- +p +- +r +- +s +- +u +- +w +

    +

    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 31 December 1998 using the +texi2html +translator version 1.52.

    + + diff --git a/readline/doc/history.info b/readline/doc/history.info new file mode 100644 index 0000000..7a87cbd --- /dev/null +++ b/readline/doc/history.info @@ -0,0 +1,788 @@ +This is Info file history.info, produced by Makeinfo version 1.67 from +the input file /usr/homes/chet/src/bash/readline-src/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-1999 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 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 Free Software Foundation. + + +File: history.info, Node: Top, Next: Using History Interactively, Up: (dir) + +GNU History Library +******************* + + This document describes the GNU History library, a programming tool +that provides a consistent user interface for recalling lines of +previously typed input. + +* Menu: + +* Using History Interactively:: GNU History User's Manual. +* Programming with GNU History:: GNU History Programmer's Manual. +* Concept Index:: Index of concepts described in this manual. +* Function and Variable Index:: Index of externally visible functions + and variables. + + +File: history.info, Node: Using History Interactively, Next: Programming with GNU History, Prev: Top, Up: Top + +Using History Interactively +*************************** + + This chapter describes how to use the GNU History Library +interactively, from a user's standpoint. It should be considered a +user's guide. For information on using the GNU History Library in your +own programs, *note Programming with GNU History::.. + +* Menu: + +* History Interaction:: What it feels like using History as a user. + + +File: history.info, Node: History Interaction, Up: Using History Interactively + +History Expansion +================= + + The History library provides a history expansion feature that is +similar to the history expansion provided by `csh'. This section +describes the syntax used to manipulate the history information. + + History expansions introduce words from the history list into the +input stream, making it easy to repeat commands, insert the arguments +to a previous command into the current input line, or fix errors in +previous commands quickly. + + History expansion takes place in two parts. The first is to +determine which line from the history list should be used during +substitution. The second is to select portions of that line for +inclusion into the current one. The line selected from the history is +called the "event", and the portions of that line that are acted upon +are called "words". Various "modifiers" are available to manipulate +the selected words. The line is broken into words in the same fashion +that Bash does, so that several words surrounded by quotes are +considered one word. History expansions are introduced by the +appearance of the history expansion character, which is `!' by default. + +* Menu: + +* Event Designators:: How to specify which history line to use. +* Word Designators:: Specifying which words are of interest. +* Modifiers:: Modifying the results of substitution. + + +File: history.info, Node: Event Designators, Next: Word Designators, Up: History Interaction + +Event Designators +----------------- + + An event designator is a reference to a command line entry in the +history list. + +`!' + Start a history substitution, except when followed by a space, tab, + the end of the line, `=' or `('. + +`!N' + Refer to command line N. + +`!-N' + Refer to the command N lines back. + +`!!' + Refer to the previous command. This is a synonym for `!-1'. + +`!STRING' + Refer to the most recent command starting with STRING. + +`!?STRING[?]' + Refer to the most recent command containing STRING. The trailing + `?' may be omitted if the STRING is followed immediately by a + newline. + +`^STRING1^STRING2^' + Quick Substitution. Repeat the last command, replacing STRING1 + with STRING2. Equivalent to `!!:s/STRING1/STRING2/'. + +`!#' + The entire command line typed so far. + + +File: history.info, Node: Word Designators, Next: Modifiers, Prev: Event Designators, Up: History Interaction + +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 `0'th word. For many applications, this is the command word. + +`N' + The Nth word. + +`^' + The first argument; that is, word 1. + +`$' + The last argument. + +`%' + The word matched by the most recent `?STRING?' search. + +`X-Y' + A range of words; `-Y' abbreviates `0-Y'. + +`*' + All of the words, except the `0'th. This is a synonym for `1-$'. + It is not an error to use `*' if there is just one word in the + event; the empty string is returned in that case. + +`X*' + Abbreviates `X-$' + +`X-' + Abbreviates `X-$' like `X*', but omits the last word. + + If a word designator is supplied without an event specification, the +previous command is used as the event. + + +File: history.info, Node: Modifiers, Prev: Word Designators, Up: History Interaction + +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 `&'. + + +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 programs that you write with +the GNU History Library. It should be considered a technical guide. +For information on the interactive use of GNU History, *note Using +History Interactively::.. + +* Menu: + +* Introduction to History:: What is the GNU History library for? +* History Storage:: How information is stored. +* History Functions:: Functions that you can use. +* History Variables:: Variables that control behaviour. +* History Programming Example:: Example of using the GNU History Library. + + +File: history.info, Node: Introduction to History, Next: History Storage, Up: Programming with GNU History + +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. + + +File: history.info, Node: History Storage, Next: History Functions, Prev: Introduction to History, Up: Programming with GNU History + +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. + +* 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 + +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 + +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. + + +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'. + 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. + + +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); + + `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 (*note 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. + + +File: history.info, Node: History Variables, Next: History Programming Example, Prev: History Functions, Up: Programming with GNU History + +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. + + +File: history.info, Node: History Programming Example, Prev: History Variables, Up: Programming with GNU History + +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"); + } + } + } + } + + +File: history.info, Node: Concept Index, Next: Function and Variable Index, Prev: Programming with GNU History, Up: Top + +Concept Index +************* + +* Menu: + +* 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 + +Function and Variable Index +*************************** + +* Menu: + +* 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: Top1162 +Node: Using History Interactively1742 +Node: History Interaction2250 +Node: Event Designators3669 +Node: Word Designators4596 +Node: Modifiers5845 +Node: Programming with GNU History6983 +Node: Introduction to History7709 +Node: History Storage9030 +Node: History Functions10123 +Node: Initializing History and State Management11094 +Node: History List Management11886 +Node: Information About the History List13407 +Node: Moving Around the History List14713 +Node: Searching the History List15598 +Node: Managing the History File17430 +Node: History Expansion18936 +Node: History Variables20780 +Node: History Programming Example23098 +Node: Concept Index25702 +Node: Function and Variable Index26188 + +End Tag Table diff --git a/readline/doc/history.ps b/readline/doc/history.ps new file mode 100644 index 0000000..ec82198 --- /dev/null +++ b/readline/doc/history.ps @@ -0,0 +1,2265 @@ +%!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.12.31:1208 +%%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 26 123 df95 D<1FC0007FF00070780020180000 +1C00001C0007FC001FFC003C1C00701C00E01C00E01C00E01C00707C003FFF800F8F8011 +107E8F14>97 DI<03F80FFE1C0E380470006000E000E000E000E0006000700038 +0E1C1E0FFC03F00F107E8F14>I<007E00007E00000E00000E00000E00000E00000E0007 +CE000FFE001C3E00301E00700E00E00E00E00E00E00E00E00E00E00E00E00E00700E0030 +1E00383E001FEFC007CFC012177F9614>I<07E00FF01C38301C700CE00EE00EFFFEFFFE +E00060007000380E1C1E0FFC03F00F107E8F14>I<00FC01FE038E07040700070007007F +FEFFFE070007000700070007000700070007000700070007000700FFF8FFF80F177F9614 +>I<07CF001FFF80383B80301800701C00701C00701C003018003838003FF00037C00070 +00007000003FF8001FFC003FFE00700F00E00380E00380E00380E003807007003C1E001F +FC0007F00011197F8F14>II<06000F000F0006000000000000000000FF00FF00 +070007000700070007000700070007000700070007000700FFF8FFF80D187C9714>I107 DIII<07C01FF03C78701C701CE00E +E00EE00EE00EE00EE00E701C783C3C781FF007C00F107E8F14>II<03E7 +000FF7001C1F00300F00700F00E00700E00700E00700E00700E00700E00700700F00300F +001C3F000FF70007C700000700000700000700000700000700000700003FE0003FE01318 +7F8F14>II<0FD83FF86038C038C038F000 +7F803FF007F8001C6006E006F006F81CFFF8CFE00F107E8F14>I<06000E000E000E000E +007FFCFFFC0E000E000E000E000E000E000E000E000E0E0E0E0E0E0E1C07F801F00F157F +9414>IIII<7E3F007E3F001E3C000E78 +0007700007E00003E00001C00003C00003E0000770000E78000E38001C1C00FE3F80FE3F +8011107F8F14>II<3FFF7FFF700E701C7038007000E001C0038007000E +001C0738077007FFFFFFFF10107F8F14>I E /Fd 1 47 df<7070F06004047D830B>46 +D E /Fe 24 122 df<03000700FF00070007000700070007000700070007000700070007 +000700070007000700070007000700070007007FF80D187D9713>49 +D<001800180038007800F800B8013802380238043808381838103820384038C038FFFF00 +380038003800380038003803FF10187F9713>52 D<30183FF03FE03F8020002000200020 +0020002FC03060203000380018001C001C401CE01CE01C80184038403030E00F800E187E +9713>I<01F807040C06180E300E300070006000E000E3E0E418E80CF00EE006E007E007 +E007600760077006300E180C0C3807E010187F9713>I<40007FFF7FFE7FFE4004800880 +108010002000400040008001800100030003000700060006000E000E000E000E000E0004 +0010197E9813>I<07E01818300C2006600660067006780C3E181F3007C003E00CF8307C +601E600FC007C003C003C00360022004181807E010187F9713>I72 +D<0FC21836200E6006C006C002C002C002E00070007E003FE01FF803FC007E000E000700 +03800380038003C002C006E004D81887E0101A7E9915>83 D<1FC000387000383800101C +00001C00001C0003FC001E1C00381C00701C00E01C00E01C80E01C80E03C80705F801F8F +0011107F8F13>97 D<07F81C1C381C70087000E000E000E000E000E000E0007000700438 +081C1807E00E107F8F11>99 D<003F000007000007000007000007000007000007000007 +0000070000070003E7000C1700180F00300700700700E00700E00700E00700E00700E007 +00E00700600700700700380F001C370007C7E0131A7F9915>I<07C01C3030187018600C +E00CFFFCE000E000E000E0006000700438081C1807E00E107F8F11>I<0FCF0018718030 +30007038007038007038007038003030001860002FC0006000006000007000003FF0003F +FC001FFE00600F00C00300C00300C00300C00300600600381C0007E00011187F8F13> +103 DI<183C3C18000000000000FC1C1C1C1C1C1C1C1C1C +1C1C1C1C1CFF081A80990A>I110 +D<07E01C38300C700E6006E007E007E007E007E007E0076006700E381C1C3807E010107F +8F13>II114 D<1F2060E04020C020C020F0007F003FC01FE000F0807080 +30C030C020F0408F800C107F8F0F>I<0800080008000800180018003800FFC038003800 +380038003800380038003800382038203820382018201C4007800B177F960F>I118 D +120 DI E /Ff 2 42 df<00E001C00380078007000F001E001E001C003C003C00 +38007800780078007000F000F000F000F000F000F000F000F000F000F000F000F000F000 +F000700078007800780038003C003C001C001E001E000F0007000780038001C000E00B2E +7CA112>40 DI +E /Fg 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 +/Fh 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 /Fi 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 /Fj 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 /Fk 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 /Fl 1 14 df<0000FF00000007FFE000001F00F8000078001E +0000E0000700018000018003000000C006000000600C000000300C000000301800000018 +300000000C300000000C6000000006600000000660000000066000000006C000000003C0 +00000003C000000003C000000003C000000003C000000003C000000003C000000003C000 +0000036000000006600000000660000000066000000006300000000C300000000C180000 +00180C000000300C00000030060000006003000000C0018000018000E00007000078001E +00001F00F8000007FFE0000000FF0000282B7EA02D>13 D E /Fm +45 122 df<3C007F00FF80FF80FFC0FFC0FFC07FC03EC000C000C0018001800180030003 +0006000E001C00380010000A157B8813>44 D<1C007F007F00FF80FF80FF807F007F001C +0009097B8813>46 D<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE00 +00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 +00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE00 +00FE0000FE0000FE00FFFFFEFFFFFEFFFFFE17277BA622>49 D<00FF800007FFF0000FFF +FC001E03FE003800FF807C003F80FE003FC0FF001FC0FF001FE0FF000FE0FF000FE07E00 +0FE03C001FE000001FE000001FC000001FC000003F8000003F0000007E000000FC000000 +F8000001F0000003E00000078000000F0000001E0000003C00E0007000E000E000E001C0 +01C0038001C0060001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80FFFFFF80FFFF +FF801B277DA622>I<007F800003FFF00007FFFC000F81FE001F007F003F807F003F803F +803F803F803F803F801F803F801F003F8000007F0000007F0000007E000000FC000001F8 +000007F00000FFC00000FFC0000001F80000007E0000003F0000003F8000001FC000001F +C000001FE000001FE03C001FE07E001FE0FF001FE0FF001FE0FF001FC0FF003FC0FE003F +807C007F003F01FE001FFFFC0007FFF00000FF80001B277DA622>I<00000F0000000F00 +00001F0000003F0000007F000000FF000001FF000001FF000003BF0000073F00000E3F00 +001C3F00003C3F0000383F0000703F0000E03F0001C03F0003803F0007803F0007003F00 +0E003F001C003F0038003F0070003F00F0003F00FFFFFFF8FFFFFFF8FFFFFFF800007F00 +00007F0000007F0000007F0000007F0000007F0000007F0000007F00001FFFF8001FFFF8 +001FFFF81D277EA622>I<180003001F801F001FFFFE001FFFFC001FFFF8001FFFF0001F +FFC0001FFF00001C0000001C0000001C0000001C0000001C0000001C0000001C0000001C +7FC0001DFFF8001F80FC001E003F0008003F0000001F8000001FC000001FC000001FE000 +001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001FC078003F8078 +003F803C007F001F01FE000FFFFC0003FFF00000FF80001B277DA622>I<000007800000 +00000780000000000FC0000000000FC0000000000FC0000000001FE0000000001FE00000 +00003FF0000000003FF0000000003FF00000000077F80000000077F800000000F7FC0000 +0000E3FC00000000E3FC00000001C1FE00000001C1FE00000003C1FF0000000380FF0000 +000380FF00000007007F80000007007F8000000F007FC000000E003FC000000E003FC000 +001C001FE000001C001FE000003FFFFFF000003FFFFFF000003FFFFFF00000700007F800 +00700007F80000F00007FC0000E00003FC0001E00003FE0001C00001FE0001C00001FE00 +03C00001FF00FFFE003FFFFCFFFE003FFFFCFFFE003FFFFC2E297EA833>65 +DI<00007F +E0030007FFFC07001FFFFF0F007FF00F9F00FF0001FF01FC0000FF03F800007F07F00000 +3F0FE000001F1FC000001F1FC000000F3F8000000F3F800000077F800000077F80000007 +7F00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF00000000FF +00000000FF00000000FF000000007F000000007F800000007F800000073F800000073F80 +0000071FC00000071FC000000E0FE000000E07F000001C03F800003C01FC00007800FF00 +01F0007FF007C0001FFFFF800007FFFE0000007FF00028297CA831>I69 DI<00007FE003000007FFFC0700001F +FFFF0F00007FF00F9F0000FF0001FF0001FC0000FF0003F800007F0007F000003F000FE0 +00001F001FC000001F001FC000000F003F8000000F003F80000007007F80000007007F80 +000007007F0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF00 +00000000FF0000000000FF0000000000FF0000000000FF0000FFFFF87F0000FFFFF87F80 +00FFFFF87F800000FF003F800000FF003F800000FF001FC00000FF001FC00000FF000FE0 +0000FF0007F00000FF0003F80000FF0001FC0000FF0000FF0001FF00007FF007FF00001F +FFFF9F000007FFFE0F0000007FF003002D297CA835>III77 DI80 D82 D<00FF806003FFF0E00FFFF8E01F80 +FDE03F001FE03E0007E07C0003E07C0003E0FC0001E0FC0001E0FC0000E0FE0000E0FE00 +00E0FF000000FFC000007FFC00007FFFE0003FFFF8001FFFFE001FFFFF0007FFFF8003FF +FFC000FFFFC0000FFFE000007FE000001FF000000FF0000007F0E00003F0E00003F0E000 +03F0E00003F0F00003E0F00003E0F80007E0FC0007C0FF000F80FFE03F80E3FFFE00E1FF +FC00C01FF0001C297CA825>I85 DII<03FF8000 +0FFFF0001F01FC003F80FE003F807F003F803F003F803F801F003F8000003F8000003F80 +00003F8000003F80003FFF8001FC3F800FE03F801F803F803F003F807E003F80FC003F80 +FC003F80FC003F80FC003F80FC005F807E00DF803F839FFC1FFE0FFC03FC03FC1E1B7E9A +21>97 DI<00 +3FF00001FFFC0003F03E000FC07F001F807F003F007F003F007F007F003E007E0000007E +000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000007E0000007E +0000007F0000003F0003803F8003801F8007000FE00E0003F83C0001FFF800003FC00019 +1B7E9A1E>I<00007FF000007FF000007FF0000007F0000007F0000007F0000007F00000 +07F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0003F87F001FF +F7F007F03FF00FC00FF01F8007F03F0007F03F0007F07E0007F07E0007F07E0007F0FE00 +07F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F07E0007F07E00 +07F03F0007F03F0007F01F800FF00FC01FF007E07FFF01FFE7FF007F87FF202A7EA925> +I<003FC00001FFF00003E07C000F803E001F801F001F001F003F000F807E000F807E000F +C07E000FC0FE0007C0FE0007C0FFFFFFC0FFFFFFC0FE000000FE000000FE0000007E0000 +007E0000007F0000003F0001C01F0001C00F80038007C0070003F01E0000FFFC00003FE0 +001A1B7E9A1F>I<0007F8003FFC007E3E01FC7F03F87F03F07F07F07F07F03E07F00007 +F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F00007F00007 +F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007 +F00007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF80 +F003FFE3F80FC1FE1C1F007C7C3F007E7C3E003E107E003F007E003F007E003F007E003F +007E003F007E003F003E003E003F007E001F007C000FC1F8000BFFE00018FF8000180000 +0038000000380000003C0000003FFFF8003FFFFF001FFFFFC00FFFFFE007FFFFF01FFFFF +F03C0007F07C0001F8F80000F8F80000F8F80000F8F80000F87C0001F07C0001F03F0007 +E00FC01F8007FFFF00007FF0001E287E9A22>II<07000F801FC03FE03FE03FE01FC00F800700000000 +0000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F +E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B7EAA12>I< +FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE0FFFEFFFEFFFE0F2A7EA912>108 D +II<003FE00001FFFC0003F07E000FC01F801F800FC03F0007E03F0007E0 +7E0003F07E0003F07E0003F0FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8FE0003F8 +FE0003F8FE0003F87E0003F07E0003F03F0007E03F0007E01F800FC00FC01F8007F07F00 +01FFFC00003FE0001D1B7E9A22>II114 D<03FE300FFFF03E03F07800F07000F0F00070F000 +70F80070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800FFF80007FC0000FCE000 +7CE0003CF0003CF00038F80038FC0070FF01E0E7FFC0C1FF00161B7E9A1B>I<00E00000 +E00000E00000E00001E00001E00001E00003E00003E00007E0000FE0001FFFE0FFFFE0FF +FFE00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F +E0000FE0000FE0700FE0700FE0700FE0700FE0700FE0700FE07007F0E003F0C001FF8000 +7F0014267FA51A>IIIIII E /Fn 75 127 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F870000000000070F8F8 +F870051C779B18>33 D<4010E038F078E038E038E038E038E038E038E038E038E038E038 +60300D0E7B9C18>I<030600078F00078F00078F00078F00078F00078F007FFFC0FFFFE0 +FFFFE07FFFC00F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FFFFE07FFFC0 +1E3C001E3C001E3C001E3C001E3C001E3C000C1800131C7E9B18>I<00C00001C00001C0 +0001C00003F0000FFC003FFE007DCF0071C700E1C380E1C780E1C780E1C780F1C00079C0 +003FC0001FE0000FF80001FC0001DE0001CF0001C70061C380F1C380F1C380E1C380E1C7 +0071C70079DE003FFE001FF80007E00001C00001C00001C00000C00011247D9F18>I<38 +03007C07807C0780EE0F80EE0F00EE0F00EE1F00EE1E00EE1E00EE3E007C3C007C3C0038 +7C0000780000780000F80000F00001F00001E00001E00003E00003C00003C00007C00007 +83800787C00F87C00F0EE00F0EE01F0EE01E0EE01E0EE03E0EE03C07C03C07C018038013 +247E9F18>I<01C00007E0000FF0000E70001C38001C38001C38001C38001C73F81CF3F8 +1CE3F80FC1C00FC3800F83800F03801F07003F87007B8E0071CE00E1FC00E0FC00E07C00 +E07870E0787070FE707FFFE03FC7E00F03C0151C7F9B18>I<387C7C7E3E0E0E0E1C1C38 +F8F0C0070E789B18>I<007000F001E003C007800F001E001C0038003800700070007000 +7000E000E000E000E000E000E000E000E0007000700070007000380038001C001E000F00 +078003C001F000F000700C24799F18>I<6000F00078003C001E000F000780038001C001 +C000E000E000E000E00070007000700070007000700070007000E000E000E000E001C001 +C0038007800F001E003C007800F00060000C247C9F18>I<01C00001C00001C00001C000 +41C100F1C780FDDF807FFF001FFC0007F00007F0001FFC007FFF00FDDF80F1C78041C100 +01C00001C00001C00001C00011147D9718>I<00600000F00000F00000F00000F00000F0 +0000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F00000F00000F00000F00000F00000F0 +0000F00000600013147E9718>I<1C3E7E7F3F1F070E1E7CF860080C788518>I<7FFFC0FF +FFE0FFFFE07FFFC013047E8F18>I<3078FCFC78300606778518>I<000300000780000780 +000F80000F00001F00001E00001E00003E00003C00007C0000780000780000F80000F000 +01F00001E00003E00003C00003C00007C0000780000F80000F00000F00001F00001E0000 +3E00003C00003C00007C0000780000F80000F00000F0000060000011247D9F18>I<01F0 +0007FC000FFE001F1F001C07003803807803C07001C07001C0E000E0E000E0E000E0E000 +E0E000E0E000E0E000E0E000E0E000E0F001E07001C07001C07803C03803801C07001F1F +000FFE0007FC0001F000131C7E9B18>I<01800380038007800F803F80FF80FB80438003 +800380038003800380038003800380038003800380038003800380038003807FFCFFFE7F +FC0F1C7B9B18>I<03F0000FFE003FFF007C0F807003C0E001C0F000E0F000E06000E000 +00E00000E00001C00001C00003C0000780000F00001E00003C0000780000F00001E00007 +C0000F80001E00E03C00E07FFFE0FFFFE07FFFE0131C7E9B18>I<001F00003F00007700 +00770000E70001E70001C7000387000787000707000E07001E07003C0700380700780700 +F00700FFFFF8FFFFF8FFFFF8000700000700000700000700000700000700007FF0007FF0 +007FF0151C7F9B18>52 D<007E0001FF0007FF800F83C01E03C01C03C038018038000070 +0000700000E1F800E7FE00FFFF00FE0780F803C0F001C0F000E0E000E0F000E07000E070 +00E07000E03801C03C03C01E07800FFF0007FE0001F800131C7E9B18>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 /Fo 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 /Fp 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 Fp(GNU)33 b(History)f(Library)p 75 743 +1800 17 v 960 791 a Fo(Edition)16 b(4.0,)e(for)h Fn(History)f(Library)g +Fo(V)l(ersion)i(4.0.)1572 845 y(Decem)o(b)q(er)g(1998)75 +2467 y Fm(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 Fo(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(ree)h(Soft)o(w)o(are) +d(F)l(oundation.)75 2661 y(Cop)o(yrigh)o(t)301 2660 y(c)289 +2661 y Fl(\015)i Fo(1988-1999)e(F)l(ree)i(Soft)o(w)o(are)f(F)l +(oundation,)h(Inc.)p eop +%%Page: 1 3 +1 2 bop 75 -58 a Fo(Chapter)15 b(1:)k(Using)d(History)f(In)o(teractiv)o +(ely)1007 b(1)75 183 y Fk(1)41 b(Using)26 b(History)h(In)n(teractiv)n +(ely)137 317 y Fo(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)d(Library)h(in)h(y)o(our)e(o)o(wn)g +(programs,)f(see)i(Chapter)f(2)h([Programming)e(with)i(GNU)f(History],) +75 482 y(page)e(3.)75 625 y Fm(1.1)33 b(History)22 b(Expansion)137 +727 y Fo(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 Fn(csh)p Fo(.)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 Fj(ev)o(en)o(t)p +Fo(,)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 Fj(w)o(ords)p Fo(.)i(V)l(arious)c +Fj(mo)q(di\014ers)75 1311 y Fo(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 Fn(!)p Fo(')e(b)o(y)h(default.)75 +1599 y Fi(1.1.1)30 b(Ev)n(en)n(t)21 b(Designators)137 +1701 y Fo(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 Fn(!)216 b Fo(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 Fn(=)p Fo(')d(or)h(`)p Fn(\()p +Fo('.)75 1929 y Fn(!)p Fj(n)191 b Fo(Refer)16 b(to)e(command)h(line)i +Fj(n)p Fo(.)75 2015 y Fn(!-)p Fj(n)167 b Fo(Refer)16 +b(to)e(the)i(command)f Fj(n)g Fo(lines)i(bac)o(k.)75 +2100 y Fn(!!)192 b Fo(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 Fn(!-1)p Fo('.)75 +2186 y Fn(!)p Fj(string)102 b Fo(Refer)16 b(to)e(the)i(most)e(recen)o +(t)h(command)g(starting)g(with)g Fj(string)p Fo(.)75 +2271 y Fn(!?)p Fj(string)t Fn([?])315 2326 y Fo(Refer)i(to)f(the)h +(most)f(recen)o(t)h(command)g(con)o(taining)g Fj(string)p +Fo(.)25 b(The)17 b(trailing)g(`)p Fn(?)p Fo(')f(ma)o(y)g(b)q(e)315 +2381 y(omitted)f(if)h(the)f Fj(string)k Fo(is)d(follo)o(w)o(ed)f +(immediately)i(b)o(y)e(a)g(newline.)75 2466 y Fn(^)p +Fj(string1)t Fn(^)p Fj(string2)t Fn(^)315 2521 y Fo(Quic)o(k)i +(Substitution.)23 b(Rep)q(eat)17 b(the)f(last)f(command,)h(replacing)h +Fj(string1)i Fo(with)e Fj(string2)p Fo(.)315 2576 y(Equiv)m(alen)o(t)g +(to)d Fn(!!:s/)p Fj(string1)t Fn(/)p Fj(string2)t Fn(/)p +Fo(.)75 2661 y Fn(!#)192 b Fo(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 Fo(2)1347 b(GNU)15 b(History)g(Library)75 +183 y Fi(1.1.2)30 b(W)-5 b(ord)20 b(Designators)137 279 +y Fo(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 Fn(:)p +Fo(')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 Fn(^)p Fo(',)h(`)p Fn($)p Fo(',)f(`)p Fn(*)p +Fo(',)g(`)p Fn(-)p Fo(',)g(or)h(`)p Fn(\045)p Fo('.)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 Fn(0)e(\(zero\))57 b Fo(The)15 b Fn(0)p +Fo(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 Fj(n)215 b Fo(The)15 +b Fj(n)p Fo(th)h(w)o(ord.)75 731 y Fn(^)216 b Fo(The)15 +b(\014rst)g(argumen)o(t;)f(that)h(is,)g(w)o(ord)g(1.)75 +808 y Fn($)216 b Fo(The)15 b(last)h(argumen)o(t.)75 886 +y Fn(\045)216 b Fo(The)15 b(w)o(ord)g(matc)o(hed)g(b)o(y)g(the)g(most)g +(recen)o(t)g(`)p Fn(?)p Fj(string)t Fn(?)p Fo(')f(searc)o(h.)75 +964 y Fj(x)p Fn(-)p Fj(y)168 b Fo(A)15 b(range)g(of)g(w)o(ords;)f(`)p +Fn(-)p Fj(y)t Fo(')g(abbreviates)i(`)p Fn(0-)p Fj(y)t +Fo('.)75 1042 y Fn(*)216 b Fo(All)15 b(of)f(the)f(w)o(ords,)g(except)i +(the)f Fn(0)p Fo(th.)19 b(This)14 b(is)h(a)e(synon)o(ym)h(for)f(`)p +Fn(1-$)p Fo('.)18 b(It)c(is)g(not)g(an)g(error)315 1096 +y(to)g(use)h(`)p Fn(*)p Fo(')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 Fj(x)s Fn(*)189 +b Fo(Abbreviates)16 b(`)p Fj(x)p Fn(-$)p Fo(')75 1307 +y Fj(x)p Fn(-)192 b Fo(Abbreviates)16 b(`)p Fj(x)p Fn(-$)p +Fo(')e(lik)o(e)i(`)p Fj(x)s Fn(*)p Fo(',)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 Fi(1.1.3)30 b(Mo)r(di\014ers)137 1643 y Fo(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 +Fn(:)p Fo('.)75 1776 y Fn(h)216 b Fo(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 Fn(t)216 b Fo(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 Fn(r)216 b Fo(Remo)o(v)o(e)15 b(a)g(trailing)h(su\016x)f(of)g +(the)g(form)g(`)p Fn(.)p Fj(su\016x)s Fo(',)f(lea)o(ving)i(the)f +(basename.)75 2009 y Fn(e)216 b Fo(Remo)o(v)o(e)15 b(all)h(but)g(the)f +(trailing)h(su\016x.)75 2087 y Fn(p)216 b Fo(Prin)o(t)15 +b(the)g(new)h(command)f(but)g(do)g(not)g(execute)h(it.)75 +2164 y Fn(s/)p Fj(old)r Fn(/)p Fj(new)t Fn(/)315 2219 +y Fo(Substitute)h Fj(new)j Fo(for)c(the)h(\014rst)e(o)q(ccurrence)j(of) +e Fj(old)i Fo(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 +Fn(/)p Fo('.)18 b(The)13 b(delimiter)h(ma)o(y)e(b)q(e)h(quoted)f(in)i +Fj(old)g Fo(and)f Fj(new)k Fo(with)12 b(a)315 2329 y(single)j(bac)o +(kslash.)20 b(If)15 b(`)p Fn(&)p Fo(')e(app)q(ears)h(in)h +Fj(new)p Fo(,)f(it)g(is)h(replaced)g(b)o(y)f Fj(old)p +Fo(.)20 b(A)14 b(single)i(bac)o(kslash)315 2383 y(will)j(quote)e(the)h +(`)p Fn(&)p Fo('.)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 Fn(&)216 b Fo(Rep)q(eat)16 +b(the)f(previous)h(substitution.)75 2594 y Fn(g)216 b +Fo(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 Fn(s)p Fo(',)d(as)i(in)h Fn(gs/)p Fj(old)r +Fn(/)p Fj(new)t Fn(/)p Fo(,)f(or)g(with)g(`)p Fn(&)p +Fo('.)p eop +%%Page: 3 5 +3 4 bop 75 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(3)75 183 y Fk(2)41 b(Programming)28 b(with)e(GNU)i +(History)137 323 y Fo(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(Chapter)g(1)g([Using)g(History)g +(In)o(teractiv)o(ely],)h(page)f(1.)75 581 y Fm(2.1)33 +b(In)n(tro)r(duction)24 b(to)e(History)137 685 y Fo(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 Fj(expansion)h Fo(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 Fn(csh)p Fo(.)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 Fm(2.2)33 b(History)22 b(Storage)137 +1710 y Fo(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 Fn(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 Fo(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 Fn(HIST_ENTRY)22 b(**the_history_list;)137 2160 y Fo(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 Fn(/*)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 Fo(If)16 b(the)f(\015ags)g(mem)o(b)q(er)g(includes)j +Fn(HS_STIFLED)p Fo(,)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 Fo(4)1347 b(GNU)15 b(History)g(Library)75 +183 y Fm(2.3)33 b(History)22 b(F)-6 b(unctions)137 278 +y Fo(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 Fi(2.3.1)30 b(Initializing)20 +b(History)h(and)f(State)g(Managemen)n(t)137 536 y Fo(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 Fh(void)20 b Fg(using)p 333 679 18 3 v 20 w(history)j +Ff(\(\))195 734 y Fo(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 Fh(HISTORY_STATE)21 b(*)e Fg(history)p +657 877 V 21 w(get)p 755 877 V 21 w(history)p 951 877 +V 21 w(state)j Ff(\(\))195 931 y Fo(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 Fh(void)20 b Fg(history)p +377 1019 V 20 w(set)p 468 1019 V 21 w(history)p 664 1019 +V 21 w(state)j Ff(\()p Fn(HISTORY_STATE)13 b(*state)p +Ff(\))195 1074 y Fo(Set)i(the)h(state)e(of)h(the)g(history)g(list)h +(according)g(to)e Fj(state)p Fo(.)75 1182 y Fi(2.3.2)30 +b(History)20 b(List)h(Managemen)n(t)137 1277 y Fo(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 Fh(void)20 +b Fg(add)p 294 1420 V 20 w(history)j Ff(\()p Fn(char)14 +b(*string)p Ff(\))195 1475 y Fo(Place)i Fj(string)j Fo(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 +Fn(NULL)p Fo(.)1650 1618 y(F)l(unction)-1749 b Fh(HIST_ENTRY)21 +b(*)e Fg(remo)n(v)n(e)p 584 1618 V 20 w(history)k Ff(\()p +Fn(int)14 b(which)p Ff(\))195 1673 y Fo(Remo)o(v)o(e)g(history)g(en)o +(try)f(at)h(o\013set)f Fj(whic)o(h)h Fo(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 Fh(HIST_ENTRY)21 +b(*)e Fg(replace)p 580 1816 V 22 w(history)p 777 1816 +V 20 w(en)n(try)24 b Ff(\()p Fn(int)14 b(which,)g(char)283 +1870 y(*line,)g(char)g(*data)p Ff(\))195 1925 y Fo(Mak)o(e)f(the)h +(history)f(en)o(try)g(at)g(o\013set)g Fj(whic)o(h)h Fo(ha)o(v)o(e)g +Fj(line)k Fo(and)13 b Fj(data)p Fo(.)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 +Fj(whic)o(h)p Fo(,)g(a)e Fn(NULL)195 2035 y Fo(p)q(oin)o(ter)f(is)f +(returned.)1650 2123 y(F)l(unction)-1749 b Fh(void)20 +b Fg(clear)p 320 2123 V 21 w(history)j Ff(\(\))195 2178 +y Fo(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 Fh(void)20 +b Fg(sti\015e)p 320 2266 V 21 w(history)j Ff(\()p Fn(int)14 +b(max)p Ff(\))195 2321 y Fo(Sti\015e)i(the)f(history)h(list,)f(remem)o +(b)q(ering)h(only)g(the)f(last)g Fj(max)j Fo(en)o(tries.)1650 +2409 y(F)l(unction)-1749 b Fh(int)20 b Fg(unsti\015e)p +358 2409 V 21 w(history)i Ff(\(\))195 2463 y Fo(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 Fh(int)20 b Fg(history)p 351 +2606 V 20 w(is)p 409 2606 V 21 w(sti\015ed)k Ff(\(\))195 +2661 y Fo(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 Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(5)75 183 y Fi(2.3.3)30 b(Information)19 +b(Ab)r(out)i(the)f(History)h(List)137 279 y Fo(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 Fh(HIST_ENTRY)21 b(**)e Fg(history)p +605 371 18 3 v 21 w(list)24 b Ff(\(\))195 426 y Fo(Return)f(a)g +Fn(NULL)f Fo(terminated)g(arra)o(y)g(of)g Fn(HIST_ENTRY)f +Fo(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 Fn(NULL)p Fo(.)1650 627 y(F)l(unction)-1749 +b Fh(int)20 b Fg(where)p 325 627 V 20 w(history)j Ff(\(\))195 +682 y Fo(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 Fh(HIST_ENTRY)21 +b(*)e Fg(curren)n(t)p 587 773 V 21 w(history)k Ff(\(\))195 +828 y Fo(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 Fn(where_)195 +883 y(history)14 b(\(\))p Fo(.)20 b(If)15 b(there)g(is)h(no)f(en)o(try) +g(there,)g(return)g(a)g Fn(NULL)g Fo(p)q(oin)o(ter.)1650 +975 y(F)l(unction)-1749 b Fh(HIST_ENTRY)21 b(*)e Fg(history)p +579 975 V 21 w(get)j Ff(\()p Fn(int)15 b(offset)p Ff(\))195 +1029 y Fo(Return)21 b(the)g(history)g(en)o(try)f(at)g(p)q(osition)i +Fj(o\013set)p Fo(,)e(starting)g(from)g Fn(history_base)p +Fo(.)35 b(If)195 1084 y(there)16 b(is)h(no)g(en)o(try)f(there,)g(or)g +(if)g Fj(o\013set)h Fo(is)g(greater)e(than)h(the)h(history)f(length,)h +(return)f(a)195 1139 y Fn(NULL)f Fo(p)q(oin)o(ter.)1650 +1231 y(F)l(unction)-1749 b Fh(int)20 b Fg(history)p 351 +1231 V 20 w(total)p 487 1231 V 22 w(b)n(ytes)j Ff(\(\))195 +1285 y Fo(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 +Fi(2.3.4)30 b(Mo)n(ving)21 b(Around)f(the)h(History)g(List)137 +1548 y Fo(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 Fh(int)20 b Fg(history)p +351 1640 V 20 w(set)p 442 1640 V 21 w(p)r(os)h Ff(\()p +Fn(int)15 b(pos)p Ff(\))195 1694 y Fo(Set)g(the)h(p)q(osition)g(in)g +(the)f(history)g(list)h(to)f Fj(p)q(os)p Fo(,)g(an)g(absolute)g(index)i +(in)o(to)e(the)g(list.)1650 1786 y(F)l(unction)-1749 +b Fh(HIST_ENTRY)21 b(*)e Fg(previous)p 615 1786 V 20 +w(history)k Ff(\(\))195 1841 y Fo(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 +Fn(NULL)f Fo(p)q(oin)o(ter.)1650 1987 y(F)l(unction)-1749 +b Fh(HIST_ENTRY)21 b(*)e Fg(next)p 514 1987 V 21 w(history)k +Ff(\(\))195 2042 y Fo(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 Fn(NULL)g Fo(p)q(oin)o(ter.)75 2208 y Fi(2.3.5)30 +b(Searc)n(hing)21 b(the)f(History)h(List)137 2304 y Fo(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 +Fj(anc)o(hored)p Fo(,)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 Fh(int)20 b Fg(history)p +351 2560 V 20 w(searc)n(h)j Ff(\()p Fn(char)14 b(*string,)g(int)h +(direction)p Ff(\))195 2615 y Fo(Searc)o(h)g(the)h(history)f(for)f +Fj(string)p Fo(,)h(starting)f(at)h(the)g(curren)o(t)g(history)g +(o\013set.)k(If)d Fj(direction)195 2670 y Fn(<)j Fo(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 Fo(6)1347 b(GNU)15 b(History)g(Library)195 +183 y Fj(string)k Fo(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 Fj(string)j Fo(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 Fh(int)20 b +Fg(history)p 351 396 18 3 v 20 w(searc)n(h)p 527 396 +V 21 w(pre\014x)i Ff(\()p Fn(char)15 b(*string,)f(int)g(direction)p +Ff(\))195 451 y Fo(Searc)o(h)i(the)f(history)g(for)g +Fj(string)p Fo(,)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 +Fj(string)p Fo(.)25 b(If)17 b Fj(direction)h Fn(<)e Fo(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 Fj(string)k Fo(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 Fh(int)20 b +Fg(history)p 351 773 V 20 w(searc)n(h)p 527 773 V 21 +w(p)r(os)h Ff(\()p Fn(char)15 b(*string,)f(int)g(direction,)g(int)283 +828 y(pos)p Ff(\))195 883 y Fo(Searc)o(h)h(for)g Fj(string)k +Fo(in)d(the)f(history)g(list,)g(starting)g(at)f Fj(p)q(os)p +Fo(,)h(an)g(absolute)g(index)i(in)o(to)e(the)195 937 +y(list.)21 b(If)15 b Fj(direction)h Fo(is)g(negativ)o(e,)f(the)g(searc) +o(h)g(pro)q(ceeds)g(bac)o(kw)o(ard)g(from)f Fj(p)q(os)p +Fo(,)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 +Fj(string)k Fo(w)o(as)195 1047 y(found,)15 b(or)g(-1)g(otherwise.)75 +1170 y Fi(2.3.6)30 b(Managing)20 b(the)g(History)h(File)137 +1272 y Fo(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 Fh(int)20 b Fg(read)p 286 1430 V 20 w(history)i Ff(\()p +Fn(char)15 b(*filename)p Ff(\))195 1485 y Fo(Add)h(the)f(con)o(ten)o +(ts)f(of)h Fj(\014lename)j Fo(to)d(the)g(history)g(list,)g(a)g(line)h +(at)f(a)f(time.)21 b(If)15 b Fj(\014lename)j Fo(is)195 +1539 y Fn(NULL)p Fo(,)c(then)i(read)f(from)f(`)p Fn(~/.history)p +Fo('.)k(Returns)e(0)f(if)g(successful,)i(or)d(errno)h(if)h(not.)1650 +1643 y(F)l(unction)-1749 b Fh(int)20 b Fg(read)p 286 +1643 V 20 w(history)p 481 1643 V 20 w(range)i Ff(\()p +Fn(char)15 b(*filename,)e(int)i(from,)g(int)f(to)p Ff(\))195 +1697 y Fo(Read)21 b(a)f(range)g(of)g(lines)i(from)e Fj(\014lename)p +Fo(,)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 Fj(from)e +Fo(and)g(end)h(at)e Fj(to)p Fo(.)19 b(If)c Fj(from)e +Fo(is)i(zero,)f(start)f(at)g(the)h(b)q(eginning.)22 b(If)15 +b Fj(to)195 1807 y Fo(is)i(less)g(than)f Fj(from)p Fo(,)g(then)h(read)f +(un)o(til)i(the)e(end)h(of)f(the)h(\014le.)24 b(If)17 +b Fj(\014lename)j Fo(is)d Fn(NULL)p Fo(,)f(then)195 1862 +y(read)f(from)g(`)p Fn(~/.history)p Fo('.)i(Returns)f(0)f(if)h +(successful,)g(or)e Fn(errno)h Fo(if)h(not.)1650 1965 +y(F)l(unction)-1749 b Fh(int)20 b Fg(write)p 304 1965 +V 22 w(history)i Ff(\()p Fn(char)15 b(*filename)p Ff(\))195 +2020 y Fo(W)l(rite)23 b(the)f(curren)o(t)g(history)h(to)f +Fj(\014lename)p Fo(,)j(o)o(v)o(erwriting)d Fj(\014lename)k +Fo(if)d(necessary)l(.)42 b(If)195 2074 y Fj(\014lename)20 +b Fo(is)d Fn(NULL)p Fo(,)f(then)g(write)h(the)f(history)h(list)g(to)f +(`)p Fn(~/.history)p Fo('.)21 b(V)l(alues)d(returned)195 +2129 y(are)d(as)g(in)h Fn(read_history)d(\(\))p Fo(.)1650 +2232 y(F)l(unction)-1749 b Fh(int)20 b Fg(app)r(end)p +360 2232 V 19 w(history)j Ff(\()p Fn(int)14 b(nelements,)g(char)h +(*filename)p Ff(\))195 2287 y Fo(App)q(end)i(the)e(last)g +Fj(nelemen)o(ts)j Fo(of)d(the)g(history)g(list)h(to)f +Fj(\014lename)p Fo(.)1650 2390 y(F)l(unction)-1749 b +Fh(int)20 b Fg(history)p 351 2390 V 20 w(truncate)p 582 +2390 V 21 w(\014le)k Ff(\()p Fn(char)14 b(*filename,)g(int)h(nlines)p +Ff(\))195 2445 y Fo(T)l(runcate)g(the)h(history)f(\014le)h +Fj(\014lename)p Fo(,)g(lea)o(ving)g(only)g(the)f(last)g +Fj(nlines)k Fo(lines.)75 2568 y Fi(2.3.7)30 b(History)20 +b(Expansion)137 2670 y Fo(These)c(functions)g(implemen)o(t)g +Fn(csh)p Fo(-lik)o(e)g(history)g(expansion.)p eop +%%Page: 7 9 +7 8 bop 75 -58 a Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(7)1650 183 y(F)l(unction)-1749 b Fh(int)20 +b Fg(history)p 351 183 18 3 v 20 w(expand)j Ff(\()p Fn(char)14 +b(*string,)g(char)h(**output)p Ff(\))195 238 y Fo(Expand)k +Fj(string)p Fo(,)g(placing)h(the)e(result)h(in)o(to)g +Fj(output)p Fo(,)g(a)f(p)q(oin)o(ter)h(to)f(a)g(string)h(\(see)f(Sec-) +195 293 y(tion)d(1.1)g([History)f(In)o(teraction],)h(page)g(1\).)k +(Returns:)195 370 y Fn(0)216 b Fo(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 Fn(1)216 b Fo(if)16 b(expansions)g(did)g +(tak)o(e)e(place;)195 580 y Fn(-1)192 b Fo(if)16 b(there)f(w)o(as)f(an) +h(error)g(in)h(expansion;)195 657 y Fn(2)216 b Fo(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)g(the)f Fn(:p)g +Fo(mo)q(di\014er)h(\(see)f(Section)h(1.1.3)e([Mo)q(di\014ers],)g(page)i +(2\).)195 789 y(If)f(an)g(error)f(o)q(curred)i(in)g(expansion,)f(then)h +Fj(output)f Fo(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 Fh(char)20 +b(*)f Fg(history)p 422 932 V 21 w(arg)p 524 932 V 19 +w(extract)24 b Ff(\()p Fn(int)14 b(first,)h(int)g(last,)f(char)283 +987 y(*string)p Ff(\))195 1042 y Fo(Extract)g(a)g(string)g(segmen)o(t)g +(consisting)i(of)e(the)g Fj(\014rst)i Fo(through)e Fj(last)h +Fo(argumen)o(ts)f(presen)o(t)195 1097 y(in)i Fj(string)p +Fo(.)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 Fh(char)20 b(*)f Fg(get)p +324 1185 V 21 w(history)p 520 1185 V 20 w(ev)n(en)n(t)25 +b Ff(\()p Fn(char)14 b(*string,)g(int)h(*cindex,)f(int)283 +1240 y(qchar)p Ff(\))195 1295 y Fo(Returns)h(the)g(text)f(of)g(the)h +(history)g(ev)o(en)o(t)f(b)q(eginning)j(at)d Fj(string)k +Fn(+)d Fj(*cindex)p Fo(.)20 b Fj(*cindex)f Fo(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 +Fj(cindex)21 b Fo(p)q(oin)o(ts)195 1404 y(to)16 b(the)h(index)h(in)o +(to)e Fj(string)21 b Fo(where)c(the)g(history)f(ev)o(en)o(t)h(sp)q +(eci\014cation)h(b)q(egins.)26 b Fj(qc)o(har)19 b Fo(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 Fh(char)20 b(**)f Fg(history)p +448 1602 V 21 w(tok)n(enize)25 b Ff(\()p Fn(char)14 b(*string)p +Ff(\))195 1657 y Fo(Return)j(an)g(arra)o(y)f(of)g(tok)o(ens)g(parsed)h +(out)g(of)f Fj(string)p Fo(,)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 Fn(\(\)<>;&|$)p Fo(,)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 Fm(2.4)33 b(History)22 b(V)-6 b(ariables)137 1987 +y Fo(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 Fh(int)20 +b Fg(history)p 351 2130 V 20 w(base)195 2185 y Fo(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 Fh(int)20 +b Fg(history)p 351 2274 V 20 w(length)195 2329 y Fo(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 Fh(int)20 +b Fg(max)p 283 2417 V 19 w(input)p 435 2417 V 21 w(history)195 +2472 y Fo(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 +Fn(stifle_)195 2527 y(history)g(\(\))p Fo(.)1661 2615 +y(V)l(ariable)-1749 b Fh(char)20 b Fg(history)p 377 2615 +V 20 w(expansion)p 644 2615 V 21 w(c)n(har)195 2670 y +Fo(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 Fn(!)p Fo('.)p eop +%%Page: 8 10 +8 9 bop 75 -58 a Fo(8)1347 b(GNU)15 b(History)g(Library)1661 +183 y(V)l(ariable)-1749 b Fh(char)20 b Fg(history)p 377 +183 18 3 v 20 w(subst)p 529 183 V 20 w(c)n(har)195 238 +y Fo(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 Fn(^)p Fo('.)1661 +388 y(V)l(ariable)-1749 b Fh(char)20 b Fg(history)p 377 +388 V 20 w(commen)n(t)p 627 388 V 19 w(c)n(har)195 443 +y Fo(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 Fh(char)20 b(*)f Fg(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 Fo(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 Fj(history)p 528 758 14 2 v 16 +w(expansion)p 739 758 V 18 w(c)o(har)p Fo(.)j(The)d(default)f(is)h +(whitespace)g(and)g(`)p Fn(=)p Fo('.)1661 853 y(V)l(ariable)-1749 +b Fh(char)20 b(*)f Fg(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 Fo(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 Fn(:)p Fo(')d(and)i(`)p +Fn(?)p Fo(')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 Fh(int)20 b Fg(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 Fo(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 Fh(Function)20 b(*)g Fg(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 Fo(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 Fn(char)195 1428 y(*)j Fo(\()p +Fj(string)t Fo(\))f(and)i(an)f(in)o(teger)g(index)h(in)o(to)f(that)g +(string)g(\()p Fj(i)r Fo(\).)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 Fj(string[i])i Fo(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 Fm(2.5)33 b(History)22 b(Programming)h(Example)137 +1878 y Fo(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 Fn(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 Fo(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(History)889 b(9)434 183 y Fn(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 Fo(10)1324 b(GNU)15 b(History)g(Library)481 +183 y Fn({)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 Fo(App)q(endix)17 b(A:)e(Concept)g(Index)1196 +b(11)75 183 y Fk(App)r(endix)25 b(A)41 b(Concept)27 b(Index)75 +359 y Fm(A)75 417 y Fe(anc)o(hored)14 b(searc)o(h)s Fd(.)7 +b(.)f(.)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(.)16 +b Fe(5)75 517 y Fm(E)75 575 y Fe(ev)o(en)o(t)d(designators)c +Fd(.)g(.)d(.)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(.)21 +b Fe(1)1012 359 y Fm(H)1012 417 y Fe(history)15 b(ev)o(en)o(ts)s +Fd(.)7 b(.)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 +(.)16 b Fe(1)1012 467 y(history)f(expansion)6 b Fd(.)j(.)d(.)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(.)19 b Fe(1)1012 517 y(History)14 +b(Searc)o(hing)5 b Fd(.)j(.)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(.)18 b Fe(5)p eop +%%Page: 12 14 +12 13 bop 75 -58 a Fo(12)1324 b(GNU)15 b(History)g(Library)p +eop +%%Page: 13 15 +13 14 bop 75 -58 a Fo(App)q(endix)17 b(B:)e(F)l(unction)h(and)g(V)l +(ariable)g(Index)919 b(13)75 183 y Fk(App)r(endix)25 +b(B)41 b(F)-7 b(unction)26 b(and)h(V)-7 b(ariable)26 +b(Index)75 359 y Fm(A)75 417 y Fc(add)p 137 417 12 2 +v 13 w(history)6 b Fd(.)s(.)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(.)18 b Fe(4)75 467 y Fc(append)p +197 467 V 12 w(history)8 b Fd(.)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(.)23 b Fe(6)75 567 y Fm(C)75 625 y Fc(clear)p +177 625 V 12 w(history)s Fd(.)t(.)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(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)16 b Fe(4)75 675 y Fc(current)p +217 675 V 11 w(history)7 b Fd(.)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(.)22 b Fe(5)75 774 y Fm(G)75 832 y Fc(get)p +137 832 V 13 w(history)p 290 832 V 11 w(event)8 b Fd(.)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(.)22 b Fe(7)75 932 y Fm(H)75 +990 y Fc(history)p 217 990 V 11 w(arg)p 288 990 V 13 +w(extract)7 b Fd(.)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(.)20 +b Fe(7)75 1040 y Fc(history)p 217 1040 V 11 w(base)f +Fd(.)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(.)19 +b Fe(7)75 1090 y Fc(history_co)o(mm)o(ent)o(_c)o(har)h +Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)h(.)f(.)23 b Fe(8)75 1139 y Fc(history)p +217 1139 V 11 w(expand)9 b Fd(.)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(.)h(.)f(.) +g(.)g(.)g(.)g(.)23 b Fe(7)75 1189 y Fc(history)p 217 +1189 V 11 w(expansion)p 408 1189 V 11 w(char)17 b Fd(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)18 b Fe(7)75 1239 y Fc(history)p 217 +1239 V 11 w(get)6 b Fd(.)f(.)h(.)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(.)18 b Fe(5)75 1289 y Fc(history)p +217 1289 V 11 w(get)p 288 1289 V 13 w(history)p 441 1289 +V 12 w(state)9 b Fd(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fe(4)75 1339 y Fc(history_in)o(hi)o +(bit)o(_e)o(xpa)o(nsi)o(on)o(_fu)o(nc)o(tio)o(n)d Fd(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Fe(8)75 1389 y Fc(history)p +217 1389 V 11 w(is)p 268 1389 V 14 w(stifled)8 b Fd(.)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(.)21 b Fe(4)75 1438 y Fc(history)p +217 1438 V 11 w(length)15 b Fd(.)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(.)17 b Fe(7)75 1488 y Fc(history)p 217 +1488 V 11 w(list)5 b Fd(.)g(.)h(.)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(.)17 b Fe(5)75 1538 y Fc(history_no)o(_e)o(xpa)o(nd)o +(_ch)o(ars)f Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Fe(8)75 1588 y Fc(history_qu)o(ot)o +(es_)o(in)o(hib)o(it_)o(ex)o(pan)o(si)o(on)14 b Fd(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 b Fe(8)75 +1638 y Fc(history)p 217 1638 V 11 w(search)9 b Fd(.)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(.)h(.)f(.)g(.)g(.)g(.)g(.)23 b Fe(5)75 1687 +y Fc(history_se)o(ar)o(ch_)o(de)o(lim)o(ite)o(r_)o(cha)o(rs)16 +b Fd(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)19 +b Fe(8)75 1737 y Fc(history)p 217 1737 V 11 w(search)p +348 1737 V 12 w(pos)8 b Fd(.)d(.)i(.)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(.)21 +b Fe(6)75 1787 y Fc(history)p 217 1787 V 11 w(search)p +348 1787 V 12 w(prefix)5 b Fd(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Fe(6)75 1837 y Fc(history)p 217 1837 V 11 w(set)p 288 +1837 V 13 w(history)p 441 1837 V 12 w(state)9 b Fd(.)d(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)23 +b Fe(4)75 1887 y Fc(history)p 217 1887 V 11 w(set)p 288 +1887 V 13 w(pos)t Fd(.)5 b(.)h(.)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 Fe(5)1012 359 y Fc(history_sub)o(st)o(_ch)o(ar)e +Fd(.)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(.)18 b Fe(8)1012 +409 y Fc(history)p 1154 409 V 12 w(tokenize)8 b Fd(.)s(.)e(.)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(.)21 b Fe(7)1012 459 y Fc(history)p +1154 459 V 12 w(total)p 1266 459 V 12 w(bytes)7 b Fd(.)t(.)f(.)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 Fe(5)1012 509 y Fc(history)p +1154 509 V 12 w(truncate)p 1326 509 V 11 w(file)5 b Fd(.)t(.)h(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)18 b Fe(6)1012 612 y Fm(M)1012 670 y Fc(max)p +1074 670 V 13 w(input)p 1187 670 V 13 w(history)13 b +Fd(.)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(.)16 b +Fe(7)1012 773 y Fm(N)1012 831 y Fc(next)p 1094 831 V +13 w(history)5 b Fd(.)s(.)h(.)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(.)18 b Fe(5)1012 934 y Fm(P)1012 992 y +Fc(previous)p 1174 992 V 11 w(history)8 b Fd(.)t(.)e(.)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(.)21 b Fe(5)1012 1096 y Fm(R)1012 +1154 y Fc(read)p 1094 1154 V 13 w(history)5 b Fd(.)s(.)h(.)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(.)18 b Fe(6)1012 +1204 y Fc(read)p 1094 1204 V 13 w(history)p 1247 1204 +V 11 w(range)8 b Fd(.)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(.)21 +b Fe(6)1012 1253 y Fc(remove)p 1134 1253 V 12 w(history)8 +b Fd(.)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(.)24 +b Fe(4)1012 1303 y Fc(replace)p 1154 1303 V 12 w(history)p +1306 1303 V 11 w(entry)5 b Fd(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)18 +b Fe(4)1012 1406 y Fm(S)1012 1464 y Fc(stifle)p 1134 +1464 V 12 w(history)8 b Fd(.)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(.)24 b Fe(4)1012 1568 y Fm(U)1012 1626 y Fc(unstifle)p +1174 1626 V 11 w(history)8 b Fd(.)t(.)e(.)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(.)21 b Fe(4)1012 1676 y Fc(using)p 1114 1676 V +13 w(history)s Fd(.)s(.)6 b(.)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(.)17 b Fe(4)1012 1779 y Fm(W)1012 1837 y Fc(where)p +1114 1837 V 13 w(history)s Fd(.)s(.)6 b(.)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(.)17 b Fe(5)1012 1887 y Fc(write)p +1114 1887 V 13 w(history)s Fd(.)s(.)6 b(.)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(.)17 b Fe(6)p eop +%%Page: 14 16 +14 15 bop 75 -58 a Fo(14)1324 b(GNU)15 b(History)g(Library)p +eop +%%Page: -1 17 +-1 16 bop 1862 -58 a Fo(i)75 183 y Fk(T)-7 b(able)27 +b(of)f(Con)n(ten)n(ts)75 354 y Fm(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 Fm(1)224 423 y Fo(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 Fo(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 Fo(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 Fo(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 Fo(2)75 708 y Fm(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 Fm(3)224 777 y Fo(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 Fo(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 Fo(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 Fo(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 +Fo(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 Fo(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 Fo(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 Fo(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 Fo(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 Fo(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 Fo(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 Fo(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 Fo(8)75 1501 y Fm(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 Fm(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 Fm(13)p eop +%%Page: -2 18 +-2 17 bop 75 -58 a Fo(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/hsuser.texinfo b/readline/doc/hsuser.texinfo index 7c4582d..76cb63b 100644 --- a/readline/doc/hsuser.texinfo +++ b/readline/doc/hsuser.texinfo @@ -117,7 +117,7 @@ history list and history file. @table @code @item fc -@comment btindex fc +@btindex fc @example @code{fc [-e @var{ename}] [-nlr] [@var{first}] [@var{last}]} @code{fc -s [@var{pat}=@var{rep}] [@var{command}]} @@ -149,7 +149,7 @@ 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 -@comment btindex history +@btindex history @example history [-c] [@var{n}] history [-anrw] [@var{filename}] diff --git a/readline/doc/readline.dvi b/readline/doc/readline.dvi new file mode 100644 index 0000000..8335d6a2 Binary files /dev/null and b/readline/doc/readline.dvi differ diff --git a/readline/doc/readline.html b/readline/doc/readline.html new file mode 100644 index 0000000..f4ea74d --- /dev/null +++ b/readline/doc/readline.html @@ -0,0 +1,4230 @@ + + + + +GNU Readline Library + + +

    GNU Readline Library

    +

    Edition 4.0, for Readline Library Version 4.0.

    +

    December 1998

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

    +


    +

    Table of Contents

    + +


    + +

    +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 Free Software Foundation. + +

    +

    +Copyright (C) 1988-1999 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 +(see section 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 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 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. Afterwards, you can move the cursor to the right +with C-f. + +

    +

    +When you add text in the middle of a line, you will notice that 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 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 the character into the line at the cursor. +
    C-_ +
    +Undo the last editing command. You can undo all the way back to an +empty line. +
    + + + +

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

    + + +

    Readline Killing Commands

    + +

    + + + +

    +

    +Killing text means to delete the text from the line, but to save +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 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. + +
    + +

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

    Readline Arguments

    + +

    +You can pass numeric arguments to Readline commands. Sometimes the +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'. + +

    +

    +The general way to pass numeric arguments to a command is to type 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 C-d command an argument of 10, you could type `M-1 0 C-d'. + +

    + + +

    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 characters present in the value of the isearch-terminators variable +are used to terminate an incremental search. +If that variable has not been assigned a value, the ESC and +C-J characters will terminate an incremental search. +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 C-s or +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 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. + +

    + + +

    Readline Init File

    +

    + + +

    +

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

    + + + + + +

    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'. + +
    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. + +
    isearch-terminators +
    + +The string of characters that should terminate an incremental search without +subsequently executing the character as a command (see section Searching for Commands in the History). +If this variable has not been given a value, the characters ESC and +C-J will terminate an incremental search. + +
    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. + +
    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. + +
    forward-backward-delete-char () +
    + +Delete the character under the cursor, unless the cursor is at the +end of the line, in which case the character behind the cursor is +deleted. By default, this is not bound to a key. + +
    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. + +
    delete-char-or-list () +
    + +Deletes the character under the cursor if not at the beginning or +end of the line (like delete-char). +If at the end of the line, behaves identically to +possible-completions. +This command 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: int rl_erase_empty_line +
    +Setting this to a non-zero value causes Readline to completely erase +the current line, including any prompt, any time a newline is typed as +the only character on an otherwise-empty line. The cursor is moved to +the beginning of the newly-blank line. +
    + +

    +

    +

    +
    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_pre_input_hook +
    +If non-zero, this is the address of a function to call after +the first prompt has been printed and just before readline +starts reading input characters. +
    + +

    +

    +

    +
    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 (see section 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 (see section 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 +(see section Readline Init File). +
    + +

    +

    +

    +
    Function: int rl_read_init_file (char *filename) +
    +Read keybindings and variable assignments from filename +(see section 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. +
    + +

    +

    +

    +
    Function: void rl_save_prompt () +
    +Save the local Readline prompt display state in preparation for +displaying a new message in the message area with rl_message. +
    + +

    +

    +

    +
    Function: void rl_restore_prompt () +
    +Restore the local Readline prompt display state saved by the most +recent call to rl_save_prompt. +
    + +

    + + +

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

    +

    +

    +
    Function: void rl_display_match_list (char **matches, int len, int max) +
    +A convenience function for displaying a list of strings in +columnar format on Readline's output stream. matches is the list +of strings, in argv format, such as a list of completion matches. +len is the number of strings in matches, and max +is the length of the longest string in matches. This function uses +the setting of print-completions-horizontally to select how the +matches are displayed (see section Readline Init File Syntax). +
    + +

    +

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

    Readline Signal Handling

    + +

    +Signals are asynchronous events sent to a process by the Unix kernel, +sometimes on behalf of another process. They are intended to indicate +exceptional events, like a user pressing the interrupt key on his +terminal, or a network connection being broken. There is a class of +signals that can be sent to the process currently reading input from +the keyboard. Since Readline changes the terminal attributes when it +is called, it needs to perform special processing when a signal is +received to restore the terminal to a sane state, or provide application +writers with functions to do so manually. + +

    +

    +Readline contains an internal signal handler that is installed for a +number of signals (SIGINT, SIGQUIT, SIGTERM, +SIGALRM, SIGTSTP, SIGTTIN, and SIGTTOU). +When one of these signals is received, the signal handler +will reset the terminal attributes to those that were in effect before +readline () was called, reset the signal handling to what it was +before readline () was called, and resend the signal to the calling +application. +If and when the calling application's signal handler returns, Readline +will reinitialize the terminal and continue to accept input. +When a SIGINT is received, the Readline signal handler performs +some additional work, which will cause any partially-entered line to be +aborted (see the description of rl_free_line_state ()). + +

    +

    +There is an additional Readline signal handler, for SIGWINCH, which +the kernel sends to a process whenever the terminal's size changes (for +example, if a user resizes an xterm). The Readline SIGWINCH +handler updates Readline's internal screen size state, and then calls any +SIGWINCH signal handler the calling application has installed. +Readline calls the application's SIGWINCH signal handler without +resetting the terminal to its original state. If the application's signal +handler does more than update its idea of the terminal size and return (for +example, a longjmp back to a main processing loop), it must +call rl_cleanup_after_signal () (described below), to restore the +terminal state. + +

    +

    +Readline provides two variables that allow application writers to +control whether or not it will catch certain signals and act on them +when they are received. It is important that applications change the +values of these variables only when calling readline (), not in +a signal handler, so Readline's internal signal state is not corrupted. + +

    +

    +

    +
    Variable: int rl_catch_signals +
    +If this variable is non-zero, Readline will install signal handlers for +SIGINT, SIGQUIT, SIGTERM, SIGALRM, +SIGTSTP, SIGTTIN, and SIGTTOU. + +

    +

    +The default value of rl_catch_signals is 1. +

    + +

    +

    +

    +
    Variable: int rl_catch_sigwinch +
    +If this variable is non-zero, Readline will install a signal handler for +SIGWINCH. + +

    +

    +The default value of rl_catch_sigwinch is 1. +

    + +

    +

    +If an application does not wish to have Readline catch any signals, or +to handle signals other than those Readline catches (SIGHUP, +for example), +Readline provides convenience functions to do the necessary terminal +and internal state cleanup upon receipt of a signal. + +

    +

    +

    +
    Function: void rl_cleanup_after_signal (void) +
    +This function will reset the state of the terminal to what it was before +readline () was called, and remove the Readline signal handlers for +all signals, depending on the values of rl_catch_signals and +rl_catch_sigwinch. +
    + +

    +

    +

    +
    Function: void rl_free_line_state (void) +
    +This will free any partial state associated with the current input line +(undo information, any partial history entry, any partially-entered +keyboard macro, and any partially-entered numeric argument). This +should be called before rl_cleanup_after_signal (). The +Readline signal handler for SIGINT calls this to abort the +current input line. +
    + +

    +

    +

    +
    Function: void rl_reset_after_signal (void) +
    +This will reinitialize the terminal and reinstall any Readline signal +handlers, depending on the values of rl_catch_signals and +rl_catch_sigwinch. +
    + +

    +

    +If an application does not wish Readline to catch SIGWINCH, it may +call rl_resize_terminal () to force Readline to update its idea of +the terminal size when a SIGWINCH is received. + +

    +

    +

    +
    Function: void rl_resize_terminal (void) +
    +Update Readline's internal screen size. +
    + +

    +

    +The following functions install and remove Readline's signal handlers. + +

    +

    +

    +
    Function: int rl_set_signals (void) +
    +Install Readline's signal handler for SIGINT, SIGQUIT, +SIGTERM, SIGALRM, SIGTSTP, SIGTTIN, +SIGTTOU, and SIGWINCH, depending on the values of +rl_catch_signals and rl_catch_sigwinch. +
    + +

    +

    +

    +
    Function: int rl_clear_signals (void) +
    +Remove all of the Readline signal handlers installed by +rl_set_signals (). +
    + +

    + + +

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

    +

    +

    +
    Variable: VFunction * rl_completion_display_matches_hook +
    +If non-zero, then this is the address of a function to call when +completing a word would normally display the list of possible matches. +This function is called in lieu of Readline displaying the list. +It takes three arguments: +(char **matches, int num_matches, int max_length) +where matches is the array of matching strings, +num_matches is the number of strings in that array, and +max_length is the length of the longest string in that array. +Readline provides a convenience function, rl_display_match_list, +that takes care of doing the display to Readline's output stream. That +function may be called from this hook. +
    + +

    + + +

    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

    +

    +Jump to: +c +- +e +- +i +- +k +- +n +- +r +- +y +

    +

    c

    + +
  • command editing +
  • +

    e

    + +
  • editing command lines +
  • +

    i

    + +
  • initialization file, readline +
  • interaction, readline +
  • +

    k

    + +
  • kill ring +
  • killing text +
  • +

    n

    + +
  • notation, readline +
  • +

    r

    + +
  • readline, function +
  • +

    y

    + +
  • yanking text +
  • + +

    + + +

    Function and Variable Index

    +

    +Jump to: +( +- +a +- +b +- +c +- +d +- +e +- +f +- +h +- +i +- +k +- +l +- +m +- +n +- +o +- +p +- +q +- +r +- +s +- +t +- +u +- +v +- +y +

    +

    (

    + +
  • (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-char-or-list () +
  • 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-backward-delete-char () +
  • 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-*) +
  • isearch-terminators +
  • +

    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_catch_signals +
  • rl_catch_sigwinch +
  • rl_char_is_quoted_p +
  • rl_cleanup_after_signal +
  • rl_clear_message +
  • rl_clear_signals +
  • rl_complete, rl_complete +
  • rl_complete_internal +
  • rl_completer_quote_characters +
  • rl_completer_word_break_characters +
  • rl_completion_append_character +
  • rl_completion_display_matches_hook +
  • 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_display_match_list +
  • rl_do_undo +
  • rl_done +
  • rl_end +
  • rl_end_undo_group +
  • rl_erase_empty_line +
  • 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_free_line_state +
  • 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_pre_input_hook +
  • rl_prompt +
  • rl_read_init_file +
  • rl_read_key +
  • rl_readline_name +
  • rl_redisplay +
  • rl_redisplay_function +
  • rl_reset_after_signal +
  • rl_reset_line_state +
  • rl_reset_terminal +
  • rl_resize_terminal +
  • rl_restore_prompt +
  • rl_save_prompt +
  • rl_set_keymap +
  • rl_set_signals +
  • 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 31 December 1998 using the +texi2html +translator version 1.52.

    + + diff --git a/readline/doc/readline.info b/readline/doc/readline.info new file mode 100644 index 0000000..1aa2848 --- /dev/null +++ b/readline/doc/readline.info @@ -0,0 +1,3039 @@ +This is Info file readline.info, produced by Makeinfo version 1.67 from +the input file /usr/homes/chet/src/bash/readline-src/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. + + Copyright (C) 1988-1999 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 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 Free Software Foundation. + + +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. + +* Menu: + +* Command Line Editing:: GNU Readline User's Manual. +* Programming with GNU Readline:: GNU Readline Programmer's Manual. +* Concept Index:: Index of concepts described in this manual. +* Function and Variable Index:: Index of externally visible functions + and variables. + + +File: readline.info, Node: Command Line Editing, Next: Programming with GNU Readline, Prev: Top, Up: Top + +Command Line Editing +******************** + + 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 + +Introduction to Line Editing +============================ + + The following paragraphs describe the notation used to represent +keystrokes. + + 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 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 is read as `Meta-Control-k' and describes the +character produced by "metafying" . + + 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 + +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 . 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: + +* Readline Bare Essentials:: The least you need to know about Readline. +* 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 + +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 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 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 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 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. + + + Move back one character. + + + Move forward one character. + + + Delete the character to the left of the cursor. + + + Delete the character underneath the cursor. + +Printing characters + Insert the character into the line at the cursor. + + + 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 + +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 , +, , and . Here are some commands for moving more rapidly +about the line. + + + Move to the start of the line. + + + Move to the end of the line. + + + Move forward a word, where a word is composed of letters and + digits. + + + Move backward a word. + + + Clear the screen, reprinting the current line at the top. + + 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 + +Readline Killing Commands +------------------------- + + "Killing" text means to delete the text from the line, but to save +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. + + + Kill the text from the current cursor position to the end of the + line. + + + Kill from the cursor to the end of the current word, or if between + words, to the end of the next word. + + + Kill from the cursor the start of the previous word, or if between + words, to the start of the previous word. + + + Kill from the cursor to the previous whitespace. This is + different than because the word boundaries differ. + + Here is how to "yank" the text back into the line. Yanking means to +copy the most-recently-killed text from the kill buffer. + + + Yank the most recently killed text back into the buffer at the + cursor. + + + Rotate the kill-ring, and yank the new top. You can only do this + if the prior command is or . + + +File: readline.info, Node: Readline Arguments, Next: Searching, Prev: Readline Killing Commands, Up: Readline Interaction + +Readline Arguments +------------------ + + You can pass numeric arguments to Readline commands. Sometimes the +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'. + + The general way to pass numeric arguments to a command is to type +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 characters present in +the value of the ISEARCH-TERMINATORS variable are used to terminate an +incremental search. If that variable has not been assigned a value, +the and characters will terminate an incremental 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, 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 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 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 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 File Syntax, Next: Conditional Init Constructs, Up: Readline Init File + +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 +(*note 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 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'. + + `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. + + `isearch-terminators' + The string of characters that should terminate an incremental + search without subsequently executing the character as a + command (*note Searching::.). If this variable has not been + given a value, the characters and will terminate + an incremental search. + + `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. + + `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, 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). + + "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, is bound to the function + `universal-argument' (just as it was in the first example), + ` ' 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: + +* Commands For Moving:: Moving about the line. +* Commands For History:: Getting at previous lines. +* Commands For Text:: Commands for changing text. +* 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. +* 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: Bindable Readline Commands + +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. + + +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. + +`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. + + +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, 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. + +`forward-backward-delete-char ()' + Delete the character under the cursor, unless the cursor is at the + end of the line, in which case the character behind the cursor is + deleted. By default, this is not bound to a key. + +`quoted-insert (C-q, C-v)' + 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. + +`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. + + +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 (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. + + +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. 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. + + +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 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. + +`delete-char-or-list ()' + Deletes the character under the cursor if not at the beginning or + end of the line (like `delete-char'). If at the end of the line, + behaves identically to `possible-completions'. This command 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: Keyboard Macros, Up: Bindable Readline Commands + +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. + + +File: readline.info, Node: Readline vi Mode, Prev: Bindable Readline Commands, Up: Command Line Editing + +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 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, 1994, 1996, 1998, 1999 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 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. + + +File: readline.info, Node: Programming with GNU Readline, Next: Concept Index, Prev: Command Line Editing, Up: Top + +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. + +* Menu: + +* 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 + functions. +* Readline Signal Handling:: How Readline behaves when it receives signals. +* Custom Completers:: Supplanting or supplementing Readline's + completion functions. + + +File: readline.info, Node: Basic Behavior, Next: Custom Functions, Up: Programming with GNU Readline + +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 + 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 +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)());' + + `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 (*note Custom Completers::.). + + +File: readline.info, Node: Custom Functions, Next: Readline Variables, Prev: Basic Behavior, Up: Programming with GNU Readline + +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. + +* Menu: + +* The Function Type:: C declarations to make code readable. +* Function Writing:: Variables and calling conventions. + + +File: readline.info, Node: The Function Type, Next: Function Writing, Up: Custom Functions + +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. + + +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: int rl_erase_empty_line + Setting this to a non-zero value causes Readline to completely + erase the current line, including any prompt, any time a newline + is typed as the only character on an otherwise-empty line. The + cursor is moved to the beginning of the newly-blank line. + + - 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_pre_input_hook + If non-zero, this is the address of a function to call after the + first prompt has been printed and just before `readline' starts + reading input characters. + + - 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: Readline Signal Handling, 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 +----------------- + + 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 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. + + +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. + + - 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 (*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: Associating Function Names and Bindings, Prev: Keymaps, Up: Readline Convenience Functions + +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 (*note + Readline Init File::.). + + - Function: int rl_read_init_file (char *filename) + Read keybindings and variable assignments from FILENAME (*note + Readline Init File::.). + + +File: readline.info, Node: Associating Function Names and Bindings, Next: Allowing Undoing, Prev: Binding Keys, Up: Readline Convenience Functions + +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'. + + +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, 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. + + +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. + + - Function: void rl_save_prompt () + Save the local Readline prompt display state in preparation for + displaying a new message in the message area with `rl_message'. + + - Function: void rl_restore_prompt () + Restore the local Readline prompt display state saved by the most + recent call to `rl_save_prompt'. + + +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'. + + - Function: void rl_display_match_list (char **matches, int len, int + max) + A convenience function for displaying a list of strings in + columnar format on Readline's output stream. `matches' is the list + of strings, in argv format, such as a list of completion matches. + `len' is the number of strings in `matches', and `max' is the + length of the longest string in `matches'. This function uses the + setting of `print-completions-horizontally' to select how the + matches are displayed (*note Readline Init File Syntax::.). + + 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 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); + } + + +File: readline.info, Node: Readline Signal Handling, Next: Custom Completers, Prev: Readline Convenience Functions, Up: Programming with GNU Readline + +Readline Signal Handling +======================== + + Signals are asynchronous events sent to a process by the Unix kernel, +sometimes on behalf of another process. They are intended to indicate +exceptional events, like a user pressing the interrupt key on his +terminal, or a network connection being broken. There is a class of +signals that can be sent to the process currently reading input from +the keyboard. Since Readline changes the terminal attributes when it +is called, it needs to perform special processing when a signal is +received to restore the terminal to a sane state, or provide application +writers with functions to do so manually. + + Readline contains an internal signal handler that is installed for a +number of signals (`SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM', +`SIGTSTP', `SIGTTIN', and `SIGTTOU'). When one of these signals is +received, the signal handler will reset the terminal attributes to +those that were in effect before `readline ()' was called, reset the +signal handling to what it was before `readline ()' was called, and +resend the signal to the calling application. If and when the calling +application's signal handler returns, Readline will reinitialize the +terminal and continue to accept input. When a `SIGINT' is received, +the Readline signal handler performs some additional work, which will +cause any partially-entered line to be aborted (see the description of +`rl_free_line_state ()'). + + There is an additional Readline signal handler, for `SIGWINCH', which +the kernel sends to a process whenever the terminal's size changes (for +example, if a user resizes an `xterm'). The Readline `SIGWINCH' +handler updates Readline's internal screen size state, and then calls +any `SIGWINCH' signal handler the calling application has installed. +Readline calls the application's `SIGWINCH' signal handler without +resetting the terminal to its original state. If the application's +signal handler does more than update its idea of the terminal size and +return (for example, a `longjmp' back to a main processing loop), it +*must* call `rl_cleanup_after_signal ()' (described below), to restore +the terminal state. + + Readline provides two variables that allow application writers to +control whether or not it will catch certain signals and act on them +when they are received. It is important that applications change the +values of these variables only when calling `readline ()', not in a +signal handler, so Readline's internal signal state is not corrupted. + + - Variable: int rl_catch_signals + If this variable is non-zero, Readline will install signal + handlers for `SIGINT', `SIGQUIT', `SIGTERM', `SIGALRM', `SIGTSTP', + `SIGTTIN', and `SIGTTOU'. + + The default value of `rl_catch_signals' is 1. + + - Variable: int rl_catch_sigwinch + If this variable is non-zero, Readline will install a signal + handler for `SIGWINCH'. + + The default value of `rl_catch_sigwinch' is 1. + + If an application does not wish to have Readline catch any signals, +or to handle signals other than those Readline catches (`SIGHUP', for +example), Readline provides convenience functions to do the necessary +terminal and internal state cleanup upon receipt of a signal. + + - Function: void rl_cleanup_after_signal (void) + This function will reset the state of the terminal to what it was + before `readline ()' was called, and remove the Readline signal + handlers for all signals, depending on the values of + `rl_catch_signals' and `rl_catch_sigwinch'. + + - Function: void rl_free_line_state (void) + This will free any partial state associated with the current input + line (undo information, any partial history entry, any + partially-entered keyboard macro, and any partially-entered + numeric argument). This should be called before + `rl_cleanup_after_signal ()'. The Readline signal handler for + `SIGINT' calls this to abort the current input line. + + - Function: void rl_reset_after_signal (void) + This will reinitialize the terminal and reinstall any Readline + signal handlers, depending on the values of `rl_catch_signals' and + `rl_catch_sigwinch'. + + If an application does not wish Readline to catch `SIGWINCH', it may +call `rl_resize_terminal ()' to force Readline to update its idea of +the terminal size when a `SIGWINCH' is received. + + - Function: void rl_resize_terminal (void) + Update Readline's internal screen size. + + The following functions install and remove Readline's signal +handlers. + + - Function: int rl_set_signals (void) + Install Readline's signal handler for `SIGINT', `SIGQUIT', + `SIGTERM', `SIGALRM', `SIGTSTP', `SIGTTIN', `SIGTTOU', and + `SIGWINCH', depending on the values of `rl_catch_signals' and + `rl_catch_sigwinch'. + + - Function: int rl_clear_signals (void) + Remove all of the Readline signal handlers installed by + `rl_set_signals ()'. + + +File: readline.info, Node: Custom Completers, Prev: Readline Signal Handling, 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 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. +* Completion Functions:: Functions provided by Readline. +* Completion Variables:: Variables which control completion. +* A Short Completion Example:: An example of writing completer subroutines. + + +File: readline.info, Node: How Completing Works, Next: Completion Functions, Up: Custom Completers + +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. + + +File: readline.info, Node: Completion Functions, Next: Completion Variables, Prev: How Completing Works, Up: Custom Completers + +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. + + +File: readline.info, Node: Completion Variables, Next: A Short Completion Example, Prev: Completion Functions, Up: Custom Completers + +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 + #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 (); + + /* 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); + } + + +File: readline.info, Node: Concept Index, Next: Function and Variable Index, Prev: Programming with GNU Readline, Up: Top + +Concept Index +************* + +* Menu: + +* 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 + +Function and Variable Index +*************************** + +* Menu: + +* (: 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-char-or-list (): Commands For Completion. +* 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-backward-delete-char (): Commands For Text. +* 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. +* isearch-terminators: Readline Init File Syntax. +* 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_catch_signals: Readline Signal Handling. +* rl_catch_sigwinch: Readline Signal Handling. +* rl_char_is_quoted_p: Completion Variables. +* rl_cleanup_after_signal: Readline Signal Handling. +* rl_clear_message: Redisplay. +* rl_clear_signals: Readline Signal Handling. +* rl_complete <1>: Completion Functions. +* rl_complete: How Completing Works. +* 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_display_matches_hook: 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_display_match_list: Utility Functions. +* rl_do_undo: Allowing Undoing. +* rl_done: Readline Variables. +* rl_end: Readline Variables. +* rl_end_undo_group: Allowing Undoing. +* rl_erase_empty_line: Readline Variables. +* 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_free_line_state: Readline Signal Handling. +* 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_pre_input_hook: Readline Variables. +* 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_after_signal: Readline Signal Handling. +* rl_reset_line_state: Redisplay. +* rl_reset_terminal: Utility Functions. +* rl_resize_terminal: Readline Signal Handling. +* rl_restore_prompt: Redisplay. +* rl_save_prompt: Redisplay. +* rl_set_keymap: Keymaps. +* rl_set_signals: Readline Signal Handling. +* 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. +* 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: Top1190 +Node: Command Line Editing1789 +Node: Introduction and Notation2440 +Node: Readline Interaction3479 +Node: Readline Bare Essentials4672 +Node: Readline Movement Commands6213 +Node: Readline Killing Commands7179 +Node: Readline Arguments8895 +Node: Searching9870 +Node: Readline Init File11583 +Node: Readline Init File Syntax12630 +Node: Conditional Init Constructs21837 +Node: Sample Init File24276 +Node: Bindable Readline Commands27446 +Node: Commands For Moving28197 +Node: Commands For History29045 +Node: Commands For Text31797 +Node: Commands For Killing33816 +Node: Numeric Arguments35966 +Node: Commands For Completion37093 +Node: Keyboard Macros38841 +Node: Miscellaneous Commands39400 +Node: Readline vi Mode42204 +Node: Programming with GNU Readline43974 +Node: Basic Behavior44942 +Node: Custom Functions48268 +Node: The Function Type48869 +Node: Function Writing49714 +Node: Readline Variables50798 +Node: Readline Convenience Functions54407 +Node: Function Naming55145 +Node: Keymaps56373 +Node: Binding Keys58087 +Node: Associating Function Names and Bindings60295 +Node: Allowing Undoing61873 +Node: Redisplay64458 +Node: Modifying Text65853 +Node: Utility Functions66764 +Node: Alternate Interface69448 +Node: Readline Signal Handling72742 +Node: Custom Completers77788 +Node: How Completing Works78503 +Node: Completion Functions81499 +Node: Completion Variables84514 +Node: A Short Completion Example92412 +Node: Concept Index104718 +Node: Function and Variable Index105472 + +End Tag Table diff --git a/readline/doc/readline.ps b/readline/doc/readline.ps new file mode 100644 index 0000000..cff4c3c --- /dev/null +++ b/readline/doc/readline.ps @@ -0,0 +1,5225 @@ +%!PS-Adobe-2.0 +%%Creator: dvipsk 5.58f Copyright 1986, 1994 Radical Eye Software +%%Title: readline.dvi +%%Pages: 56 +%%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.12.31:1253 +%%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>IIII<0FF800E000E000E000E0 +00E000E000E000E000E000E000E000E000E000E000E000E000E0E0E0E0E0C1C061801F00 +0D177E9612>74 D76 DII80 D82 D<0FC4302C601C400CC004C004C004E0007000 +7F003FE00FF801FC001C000E0006800680068006C004E008D81087E00F177E9614>I<7F +FFF860381840380840380880380480380480380400380000380000380000380000380000 +380000380000380000380000380000380000380000380000380000380003FF8016177F96 +19>II91 D<3FC0706070302038003803F81E3830387038E039E039E079 +70FF1F1E100E7F8D12>97 DI<003E00000E00000E00000E00000E00000E00000E +00000E00000E0007CE001C3E00300E00700E00600E00E00E00E00E00E00E00E00E00600E +00700E00301E00182E0007CF8011177F9614>100 D<0FC0186030307038E018FFF8E000 +E000E000600070083010183007C00D0E7F8D10>I<03E006700E701C201C001C001C001C +001C00FF801C001C001C001C001C001C001C001C001C001C001C001C007F800C1780960B +>I<0F9E18E33060707070707070306018C02F80200060003FE03FF83FFC600EC006C006 +C006600C38380FE010157F8D12>I107 +DI<07C0183030 +18600C600CE00EE00EE00EE00EE00E701C3018183007C00F0E7F8D12>111 +DI<07C2001C +2600381E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E001C2E0007 +CE00000E00000E00000E00000E00000E00003F8011147F8D13>II<1F4060C0C040C040E000 +FF007F801FC001E080608060C060E0C09F000B0E7F8D0E>I<0800080008001800180038 +00FFC0380038003800380038003800380038403840384038401C800F000A147F930E>I< +F83E00380E00380E00380E00380E00380E00380E00380E00380E00380E00380E00381E00 +1C2E0007CF80110E7F8D14>I119 +DI< +FE1F380E3C0C1C081C080E100E100720072007E003C003C00180018001000100E200E200 +A400780010147F8D13>I123 D E /Fo 2 106 +df<00800180030003000300060006000C000C000C001800180018003000300060006000 +6000C000C000600060006000300030001800180018000C000C000C000600060003000300 +03000180008009267D9B0F>104 DI E +/Fp 8 89 df<0007F008003C0C1800E0033801C000B8078000780F0000380E0000381E00 +00183C0000183C0000087C0000087800000878000000F8000000F8000000F8000000F800 +0000F8000000F8000000F8001FFF780000F8780000787C0000783C0000783C0000781E00 +00780E0000780F0000780780007801C000B800E00118003C0E080007F00020217C9F27> +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 56 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<0007F800003FFE0000FFFF0001FC078003F00FC007C01FC0 +0F801FC01F801FC01F001FC03F000F803F0000007E0000007E0000007E000000FE020000 +FE1FF000FE3FFC00FE603E00FE801F00FF801F80FF000FC0FF000FC0FE000FE0FE000FE0 +FE000FE0FE000FE07E000FE07E000FE07E000FE07E000FE03E000FE03F000FC01F000FC0 +1F001F800F801F0007E07E0003FFFC0001FFF800003FC0001B277DA622>I<380000003E +0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF0070000E0070 +000E0070001C00E0003800E0007000E000E0000001C0000001C000000380000007800000 +070000000F0000001F0000001E0000003E0000003E0000007E0000007C0000007C000000 +FC000000FC000000FC000000FC000001FC000001FC000001FC000001FC000001FC000001 +FC000001FC000000F80000007000001C297CA822>I<007F800001FFF00007FFF8000FC0 +FC001F803E003F001F007E001F807E001F807E000F80FE000FC0FE000FC0FE000FC0FE00 +0FE0FE000FE0FE000FE0FE000FE0FE000FE07E001FE07E001FE03F003FE01F002FE00F80 +CFE007FF8FE001FF0FE000080FE000000FC000000FC000000FC000001F803E001F807F00 +1F807F003F007F003E007F007E007E00FC003E03F8001FFFE0000FFF800001FE00001B27 +7DA622>57 D<00000780000000000780000000000FC0000000000FC0000000000FC00000 +00001FE0000000001FE0000000003FF0000000003FF0000000003FF00000000077F80000 +000077F800000000F7FC00000000E3FC00000000E3FC00000001C1FE00000001C1FE0000 +0003C1FF0000000380FF0000000380FF00000007007F80000007007F8000000F007FC000 +000E003FC000000E003FC000001C001FE000001C001FE000003FFFFFF000003FFFFFF000 +003FFFFFF00000700007F80000700007F80000F00007FC0000E00003FC0001E00003FE00 +01C00001FE0001C00001FE0003C00001FF00FFFE003FFFFCFFFE003FFFFCFFFE003FFFFC +2E297EA833>65 DI<00007FE0030007FFFC07001FFFFF0F007FF00F9F00FF0001FF01FC0000FF03F8 +00007F07F000003F0FE000001F1FC000001F1FC000000F3F8000000F3F800000077F8000 +00077F800000077F00000000FF00000000FF00000000FF00000000FF00000000FF000000 +00FF00000000FF00000000FF00000000FF000000007F000000007F800000007F80000007 +3F800000073F800000071FC00000071FC000000E0FE000000E07F000001C03F800003C01 +FC00007800FF0001F0007FF007C0001FFFFF800007FFFE0000007FF00028297CA831>I< +FFFFFFFC0000FFFFFFFF8000FFFFFFFFE00003FC001FF80003FC0003FC0003FC0000FE00 +03FC00007F0003FC00003F8003FC00001FC003FC00001FC003FC00000FE003FC00000FE0 +03FC000007F003FC000007F003FC000007F003FC000007F003FC000007F803FC000007F8 +03FC000007F803FC000007F803FC000007F803FC000007F803FC000007F803FC000007F8 +03FC000007F803FC000007F803FC000007F003FC000007F003FC000007F003FC00000FE0 +03FC00000FE003FC00000FC003FC00001FC003FC00003F8003FC00007F0003FC0000FF00 +03FC0003FC0003FC001FF800FFFFFFFFF000FFFFFFFF8000FFFFFFFC00002D297EA834> +III<00007FE0030000 +07FFFC0700001FFFFF0F00007FF00F9F0000FF0001FF0001FC0000FF0003F800007F0007 +F000003F000FE000001F001FC000001F001FC000000F003F8000000F003F80000007007F +80000007007F80000007007F0000000000FF0000000000FF0000000000FF0000000000FF +0000000000FF0000000000FF0000000000FF0000000000FF0000000000FF0000FFFFF87F +0000FFFFF87F8000FFFFF87F800000FF003F800000FF003F800000FF001FC00000FF001F +C00000FF000FE00000FF0007F00000FF0003F80000FF0001FC0000FF0000FF0001FF0000 +7FF007FF00001FFFFF9F000007FFFE0F0000007FF003002D297CA835>III75 DIII<0000FFC00000000FFF +FC0000003F807F000000FE001FC00001F80007E00003F00003F00007E00001F8000FE000 +01FC001FC00000FE001FC00000FE003F8000007F003F8000007F007F8000007F807F0000 +003F807F0000003F807F0000003F80FF0000003FC0FF0000003FC0FF0000003FC0FF0000 +003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000 +003FC07F0000003F807F8000007F807F8000007F803F8000007F003F8000007F001FC000 +00FE001FC00000FE000FE00001FC0007F00003F80003F80007F00001FC000FE00000FE00 +1FC000003FC0FF0000000FFFFC00000000FFC000002A297CA833>II<0000FFC00000000FFFFC0000 +003FC0FF000000FE001FC00001FC000FE00003F00003F00007F00003F8000FE00001FC00 +1FC00000FE001FC00000FE003F8000007F003F8000007F007F8000007F807F8000007F80 +7F0000003F807F0000003F80FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0 +FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0FF0000003FC0 +7F0000003F807F8000007F807F8000007F803F8000007F003F8000007F001FC00000FE00 +1FC03E00FE000FE07F81FC0007E0C1C1F80003F18063F00001F98067E00000FF803FC000 +003FC07F0000000FFFFC00000000FFF800C00000003C00C00000001E00C00000001E01C0 +0000001F83C00000001FFFC00000000FFF800000000FFF800000000FFF0000000007FF00 +00000003FE0000000001FC0000000000F8002A357CA833>II<00FF806003FFF0E00FFF +F8E01F80FDE03F001FE03E0007E07C0003E07C0003E0FC0001E0FC0001E0FC0000E0FE00 +00E0FE0000E0FF000000FFC000007FFC00007FFFE0003FFFF8001FFFFE001FFFFF0007FF +FF8003FFFFC000FFFFC0000FFFE000007FE000001FF000000FF0000007F0E00003F0E000 +03F0E00003F0E00003F0F00003E0F00003E0F80007E0FC0007C0FF000F80FFE03F80E3FF +FE00E1FFFC00C01FF0001C297CA825>I<7FFFFFFFFF807FFFFFFFFF807FFFFFFFFF807F +807F807F807C007F800F8078007F80078078007F80078070007F800380F0007F8003C0F0 +007F8003C0E0007F8001C0E0007F8001C0E0007F8001C0E0007F8001C0E0007F8001C000 +007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000 +007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000 +007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000 +007F80000000007F80000000007F80000000007F80000000FFFFFFC00000FFFFFFC00000 +FFFFFFC0002A287EA72F>IIII89 +D<03FF80000FFFF0001F01FC003F80FE003F807F003F803F003F803F801F003F8000003F +8000003F8000003F8000003F80003FFF8001FC3F800FE03F801F803F803F003F807E003F +80FC003F80FC003F80FC003F80FC003F80FC005F807E00DF803F839FFC1FFE0FFC03FC03 +FC1E1B7E9A21>97 DI<003FF00001FFFC0003F03E000FC07F001F807F003F007F003F007F007F003E00 +7E0000007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000 +7E0000007E0000007F0000003F0003803F8003801F8007000FE00E0003F83C0001FFF800 +003FC000191B7E9A1E>I<00007FF000007FF000007FF0000007F0000007F0000007F000 +0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F000 +3F87F001FFF7F007F03FF00FC00FF01F8007F03F0007F03F0007F07E0007F07E0007F07E +0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F0FE0007F07E +0007F07E0007F03F0007F03F0007F01F800FF00FC01FF007E07FFF01FFE7FF007F87FF20 +2A7EA925>I<003FC00001FFF00003E07C000F803E001F801F001F001F003F000F807E00 +0F807E000FC07E000FC0FE0007C0FE0007C0FFFFFFC0FFFFFFC0FE000000FE000000FE00 +00007E0000007E0000007F0000003F0001C01F0001C00F80038007C0070003F01E0000FF +FC00003FE0001A1B7E9A1F>I<0007F8003FFC007E3E01FC7F03F87F03F07F07F07F07F0 +3E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F00007F0 +0007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F0 +0007F00007F00007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915 +>I<00FF80F003FFE3F80FC1FE1C1F007C7C3F007E7C3E003E107E003F007E003F007E00 +3F007E003F007E003F007E003F003E003E003F007E001F007C000FC1F8000BFFE00018FF +80001800000038000000380000003C0000003FFFF8003FFFFF001FFFFFC00FFFFFE007FF +FFF01FFFFFF03C0007F07C0001F8F80000F8F80000F8F80000F8F80000F87C0001F07C00 +01F03F0007E00FC01F8007FFFF00007FF0001E287E9A22>II<07000F801FC03FE03FE03FE01FC00F80 +07000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE0F2B +7EAA12>I108 DII<003FE00001FFFC0003F07E000FC01F801F800FC03F0007 +E03F0007E07E0003F07E0003F07E0003F0FE0003F8FE0003F8FE0003F8FE0003F8FE0003 +F8FE0003F8FE0003F8FE0003F87E0003F07E0003F03F0007E03F0007E01F800FC00FC01F +8007F07F0001FFFC00003FE0001D1B7E9A22>II114 D<03FE300FFFF03E03F07800F07000F0 +F00070F00070F80070FE0000FFE0007FFF007FFFC03FFFE01FFFF007FFF800FFF80007FC +0000FCE0007CE0003CF0003CF00038F80038FC0070FF01E0E7FFC0C1FF00161B7E9A1B> +I<00E00000E00000E00000E00001E00001E00001E00003E00003E00007E0000FE0001FFF +E0FFFFE0FFFFE00FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0 +000FE0000FE0000FE0000FE0700FE0700FE0700FE0700FE0700FE0700FE07007F0E003F0 +C001FF80007F0014267FA51A>IIIIII E /Ft 90 127 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F870000000 +000070F8F8F870051C779B18>33 D<4010E038F078E038E038E038E038E038E038E038E0 +38E038E03860300D0E7B9C18>I<030600078F00078F00078F00078F00078F00078F007F +FFC0FFFFE0FFFFE07FFFC00F1E000F1E000F1E000F1E000F1E000F1E007FFFC0FFFFE0FF +FFE07FFFC01E3C001E3C001E3C001E3C001E3C001E3C000C1800131C7E9B18>I<00C000 +01C00001C00001C00003F0000FFC003FFE007DCF0071C700E1C380E1C780E1C780E1C780 +F1C00079C0003FC0001FE0000FF80001FC0001DE0001CF0001C70061C380F1C380F1C380 +E1C380E1C70071C70079DE003FFE001FF80007E00001C00001C00001C00000C00011247D +9F18>I<3803007C07807C0780EE0F80EE0F00EE0F00EE1F00EE1E00EE1E00EE3E007C3C +007C3C00387C0000780000780000F80000F00001F00001E00001E00003E00003C00003C0 +0007C0000783800787C00F87C00F0EE00F0EE01F0EE01E0EE01E0EE03E0EE03C07C03C07 +C018038013247E9F18>I<01C00007E0000FF0000E70001C38001C38001C38001C38001C +73F81CF3F81CE3F80FC1C00FC3800F83800F03801F07003F87007B8E0071CE00E1FC00E0 +FC00E07C00E07870E0787070FE707FFFE03FC7E00F03C0151C7F9B18>I<387C7C7E3E0E +0E0E1C1C38F8F0C0070E789B18>I<007000F001E003C007800F001E001C003800380070 +00700070007000E000E000E000E000E000E000E000E0007000700070007000380038001C +001E000F00078003C001F000F000700C24799F18>I<6000F00078003C001E000F000780 +038001C001C000E000E000E000E00070007000700070007000700070007000E000E000E0 +00E001C001C0038007800F001E003C007800F00060000C247C9F18>I<01C00001C00001 +C00001C00041C100F1C780FDDF807FFF001FFC0007F00007F0001FFC007FFF00FDDF80F1 +C78041C10001C00001C00001C00001C00011147D9718>I<00600000F00000F00000F000 +00F00000F00000F00000F0007FFFC0FFFFE0FFFFE07FFFC000F00000F00000F00000F000 +00F00000F00000F00000600013147E9718>I<1C3E7E7F3F1F070E1E7CF860080C788518> +I<7FFFC0FFFFE0FFFFE07FFFC013047E8F18>I<3078FCFC78300606778518>I<00030000 +0780000780000F80000F00001F00001E00001E00003E00003C00007C0000780000780000 +F80000F00001F00001E00003E00003C00003C00007C0000780000F80000F00000F00001F +00001E00003E00003C00003C00007C0000780000F80000F00000F0000060000011247D9F +18>I<01F00007FC000FFE001F1F001C07003803807803C07001C07001C0E000E0E000E0 +E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07001C07803C0380380 +1C07001F1F000FFE0007FC0001F000131C7E9B18>I<01800380038007800F803F80FF80 +FB8043800380038003800380038003800380038003800380038003800380038003800380 +7FFCFFFE7FFC0F1C7B9B18>I<03F0000FFE003FFF007C0F807003C0E001C0F000E0F000 +E06000E00000E00000E00001C00001C00003C0000780000F00001E00003C0000780000F0 +0001E00007C0000F80001E00E03C00E07FFFE0FFFFE07FFFE0131C7E9B18>I<001F0000 +3F0000770000770000E70001E70001C7000387000787000707000E07001E07003C070038 +0700780700F00700FFFFF8FFFFF8FFFFF800070000070000070000070000070000070000 +7FF0007FF0007FF0151C7F9B18>52 D<3FFF803FFF803FFF803800003800003800003800 +003800003800003800003800003BF8003FFE003FFF003C07803003C00001C00000E00000 +E06000E0F000E0F000E0E001C07003C07C0F803FFF001FFC0003F000131C7E9B18>I<00 +7E0001FF0007FF800F83C01E03C01C03C0380180380000700000700000E1F800E7FE00FF +FF00FE0780F803C0F001C0F000E0E000E0F000E07000E07000E07000E03801C03C03C01E +07800FFF0007FE0001F800131C7E9B18>II<03F8000FFE001FFF003E0F803803807001C07001C07001C07001C03803803C07 +801FFF0007FC000FFE001F1F003C07807001C0F001E0E000E0E000E0E000E0E000E07001 +C07803C03E0F801FFF000FFE0003F800131C7E9B18>I<3078FCFC783000000000000000 +003078FCFC78300614779318>58 D<183C7E7E3C180000000000000000183C7E7E3E1E0E +1C3C78F060071A789318>I<0000C00003E00007E0001FC0003F8000FE0001FC0007F000 +0FE0003F80007F0000FC0000FC00007F00003F80000FE00007F00001FC0000FE00003F80 +001FC00007E00003E00000C013187E9918>I<7FFFC0FFFFE0FFFFE07FFFC00000000000 +000000000000007FFFC0FFFFE0FFFFE07FFFC0130C7E9318>I<600000F80000FC00007F +00003F80000FE00007F00001FC0000FE00003F80001FC00007E00007E0001FC0003F8000 +FE0001FC0007F0000FE0003F80007F0000FC0000F8000060000013187E9918>I<0FF000 +3FFC007FFF00700F00F00380F00380600780000F00003E00007C0001F00001E00003C000 +03C00003C00003C00003C00003800000000000000000000000000000000003800007C000 +07C00007C000038000111C7D9B18>I<007C0001FE0007FF000F87801E03C03C1DC0387F +C070FFE071E3E071C1E0E1C1E0E380E0E380E0E380E0E380E0E380E0E380E0E1C1C071C1 +C071E3C070FF80387F003C1C001E00E00F83E007FFC001FF80007E00131C7E9B18>I<00 +700000F80000F80000D80000D80001DC0001DC0001DC00018C00038E00038E00038E0003 +8E000707000707000707000707000707000FFF800FFF800FFF800E03801C01C01C01C01C +01C07F07F0FF07F87F07F0151C7F9B18>I<7FFC00FFFF007FFF801C03C01C01C01C00E0 +1C00E01C00E01C00E01C01E01C01C01C07C01FFF801FFF001FFFC01C03C01C00E01C00F0 +1C00701C00701C00701C00701C00F01C00E01C03E07FFFC0FFFF807FFE00141C7F9B18> +I<00F8E003FEE007FFE00F07E01E03E03C01E03800E07000E07000E0700000E00000E000 +00E00000E00000E00000E00000E00000E000007000007000E07000E03800E03C00E01E01 +C00F07C007FF8003FE0000F800131C7E9B18>I<7FF800FFFE007FFF001C0F801C03C01C +03C01C01E01C00E01C00E01C00F01C00701C00701C00701C00701C00701C00701C00701C +00701C00F01C00E01C00E01C01E01C01C01C03C01C0F807FFF00FFFE007FF800141C7F9B +18>III<01F1C003FDC00FFFC01F0FC01C03C03803C03801C07001C07001C0700000E0 +0000E00000E00000E00000E00000E00FF0E01FF0E00FF07001C07001C07003C03803C038 +03C01C07C01F0FC00FFFC003FDC001F1C0141C7E9B18>I<7F07F0FF8FF87F07F01C01C0 +1C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01FFFC01FFFC01FFFC01C01C0 +1C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C07F07F0FF8FF87F07F0 +151C7F9B18>I<7FFF00FFFF807FFF0001C00001C00001C00001C00001C00001C00001C0 +0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +0001C00001C00001C0007FFF00FFFF807FFF00111C7D9B18>I<01FFC001FFC001FFC000 +0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000 +0E00000E00000E00000E00000E00000E00000E00F00E00F00E00F03C007FFC003FF0000F +C000121C7D9B18>I<7F07F0FF87F87F07F01C03C01C07801C07001C0E001C1E001C3C00 +1C38001C70001CF0001DF0001DF0001FB8001FB8001F1C001E1C001C0E001C0E001C0700 +1C07001C03801C03801C01C07F03F0FF87F87F03F0151C7F9B18>III<7E07F0FF0FF8 +7F07F01D81C01D81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1C01CE1C01C61C01C71C0 +1C71C01C31C01C39C01C39C01C39C01C19C01C19C01C1DC01C0DC01C0DC01C0DC07F07C0 +FF87C07F03C0151C7F9B18>I<0FFE003FFF807FFFC07803C07001C0F001E0E000E0E000 +E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000 +E0E000E0E000E0F001E07001C07C07C07FFFC03FFF800FFE00131C7E9B18>II<0FFE003FFF807FFFC07803C07001C0F001E0E000E0 +E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0 +E000E0E070E0E070E0F079E07039C0783FC07FFFC03FFF800FFE00000F00000780000780 +0003C00001C00001C013227E9B18>I<7FF800FFFE007FFF001C0F801C03801C03C01C01 +C01C01C01C01C01C03C01C03801C0F801FFF001FFE001FFE001C0F001C07001C03801C03 +801C03801C03801C03801C039C1C039C1C039C7F01F8FF81F87F00F0161C7F9B18>I<03 +F1C01FFFC03FFFC07C0FC07003C0E001C0E001C0E001C0E000007000007800003F00001F +F00007FE0000FF00000F800003C00001C00000E00000E06000E0E000E0E001E0F001C0F8 +0780FFFF80FFFE00E7F800131C7E9B18>I<7FFFF8FFFFF8FFFFF8E07038E07038E07038 +E07038007000007000007000007000007000007000007000007000007000007000007000 +00700000700000700000700000700000700000700007FF0007FF0007FF00151C7F9B18> +IIII<7F0FE07F9FE07F0FE00E07000F07 +00070E00078E00039C0003DC0001F80001F80000F80000F00000700000F00000F80001FC +0001DC00039E00038E00070F000707000E07800E03801E03C07F07F0FF07F87F07F0151C +7F9B18>II91 +D<600000F00000F00000F800007800007C00003C00003C00003E00001E00001F00000F00 +000F00000F800007800007C00003C00003C00003E00001E00001F00000F00000F8000078 +00007800007C00003C00003E00001E00001E00001F00000F00000F800007800007800003 +0011247D9F18>II<7FFFC0FFFFE0FFFFE07FFFC013047E7F18>95 +D<061E3E387070E0E0E0F8FC7C7C38070E789E18>I<0FF0001FFC003FFE003C0F001807 +0000038000038000FF8007FF801FFF807F0380780380E00380E00380E00380F00780780F +803FFFF81FFDF807F0F815147E9318>I<7E0000FE00007E00000E00000E00000E00000E +00000E00000E3E000EFF800FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E +00380E00380E00380F00700F00700F80E00FC1E00FFFC00EFF80063E00151C809B18>I< +01FE0007FF001FFF803E0780380300700000700000E00000E00000E00000E00000E00000 +E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>I<001F80003F +80001F8000038000038000038000038000038003E3800FFB801FFF803C1F80380F807007 +80700380E00380E00380E00380E00380E00380E00380700780700780380F803C1F801FFF +F00FFBF803E3F0151C7E9B18>I<01F00007FC001FFE003E0F00380780700380700380E0 +01C0E001C0FFFFC0FFFFC0FFFFC0E000007000007001C03801C03E07C01FFF8007FF0001 +F80012147D9318>I<001F80007FC000FFE000E1E001C0C001C00001C00001C0007FFFC0 +FFFFC0FFFFC001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000 +01C00001C00001C00001C0007FFF007FFF007FFF00131C7F9B18>I<01E1F007FFF80FFF +F81E1E301C0E003807003807003807003807003807001C0E001E1E001FFC001FF80039E0 +003800001C00001FFE001FFFC03FFFE07801F0700070E00038E00038E00038E000387800 +F07E03F01FFFC00FFF8001FC00151F7F9318>I<7E0000FE00007E00000E00000E00000E +00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E +00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC7FCFFE7FE7FC7FC171C809B +18>I<038007C007C007C0038000000000000000007FC0FFC07FC001C001C001C001C001 +C001C001C001C001C001C001C001C001C001C0FFFFFFFFFFFF101D7C9C18>I<0038007C +007C007C003800000000000000000FFC0FFC0FFC001C001C001C001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C6038F078FFF07FE0 +3F800E277E9C18>I<7E0000FE00007E00000E00000E00000E00000E00000E00000E3FF0 +0E3FF00E3FF00E07800E0F000E1E000E3C000E78000EF0000FF8000FFC000F9C000F0E00 +0E0F000E07000E03800E03C07FC7F8FFC7F87FC7F8151C7F9B18>III<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E0 +0E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC7FCFFE7FE7FC7FC1714809318> +I<01F0000FFE001FFF003E0F803803807001C07001C0E000E0E000E0E000E0E000E0E000 +E0F001E07001C07803C03C07803E0F801FFF000FFE0001F00013147E9318>I<7E3E00FE +FF807FFFC00FC1E00F80E00F00700E00700E00380E00380E00380E00380E00380E00380F +00700F00700F80E00FC1E00FFFC00EFF800E3E000E00000E00000E00000E00000E00000E +00000E00007FC000FFE0007FC000151E809318>I<01F38007FB801FFF803E1F80380F80 +700780700780E00380E00380E00380E00380E00380E00380700780700780380F803C1F80 +1FFF800FFB8003E380000380000380000380000380000380000380000380001FF0003FF8 +001FF0151E7E9318>II<07F7003FFF007FFF00780F00E00700E00700E007007C00007FE0001FFC0003 +FE00001F00600780E00380E00380F00380F80F00FFFF00FFFC00E7F00011147D9318>I< +0180000380000380000380000380007FFFC0FFFFC0FFFFC0038000038000038000038000 +0380000380000380000380000380000380400380E00380E00380E001C1C001FFC000FF80 +003E0013197F9818>I<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00E00E00 +E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC1714 +809318>I<7F8FF0FF8FF87F8FF01C01C00E03800E03800E038007070007070007070007 +8F00038E00038E00038E0001DC0001DC0001DC0000F80000F80000700015147F9318>I< +FF07F8FF8FF8FF07F83800E03800E03800E03800E01C01C01C71C01CF9C01CF9C01CD9C0 +1DDDC00DDD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>I<7F8FF07F9F +F07F8FF00F0700078E00039E0001DC0001F80000F80000700000F00000F80001DC00039E +00038E000707000E07807F8FF0FF8FF87F8FF015147F9318>I<7F8FF0FF8FF87F8FF00E +01C00E03800E0380070380070700070700038700038700038E0001CE0001CE0001CC0000 +CC0000DC0000780000780000780000700000700000700000F00000E00079E0007BC0007F +80003F00001E0000151E7F9318>I<3FFFF07FFFF07FFFF07001E07003C0700780000F00 +001E00003C0000F80001F00003C0000780000F00701E00703C0070780070FFFFF0FFFFF0 +FFFFF014147F9318>I<0007E0001FE0007FE000780000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00001E0007FC000FF8000FF80007FC00001E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000078 +00007FE0001FE00007E013247E9F18>I<60F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0 +F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0600424769F18>I<7C0000FF0000FFC00003C000 +00E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000F000 +007FC0003FE0003FE0007FC000F00000E00000E00000E00000E00000E00000E00000E000 +00E00000E00000E00000E00003C000FFC000FF00007C000013247E9F18>I<060C1F1E3F +BEFBF8F1F060C00F067C9B18>I E /Fu 77 123 df<001F83E000F06E3001C078780380 +F8780300F03007007000070070000700700007007000070070000700700007007000FFFF +FF8007007000070070000700700007007000070070000700700007007000070070000700 +700007007000070070000700700007007000070070000700700007007000070070000700 +70003FE3FF001D20809F1B>11 D<003F0000E0C001C0C00381E00701E00701E007000007 +0000070000070000070000070000FFFFE00700E00700E00700E00700E00700E00700E007 +00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E03F +C3FC1620809F19>I<003FE000E0E001C1E00381E00700E00700E00700E00700E00700E0 +0700E00700E00700E0FFFFE00700E00700E00700E00700E00700E00700E00700E00700E0 +0700E00700E00700E00700E00700E00700E00700E00700E00700E00700E03FE7FC162080 +9F19>I<001F81F80000F04F040001C07C06000380F80F000300F00F000700F00F000700 +70000007007000000700700000070070000007007000000700700000FFFFFFFF00070070 +070007007007000700700700070070070007007007000700700700070070070007007007 +000700700700070070070007007007000700700700070070070007007007000700700700 +0700700700070070070007007007003FE3FE3FE02320809F26>I<7038F87CFC7EFC7E74 +3A0402040204020804080410081008201040200F0E7F9F17>34 D<00400000400003F000 +0C4E00104100204080604080404040C041C0C043C0C043C0E04180E040007040007C4000 +3FC0001FF8000FFC0003FE00007F00004F800043800041C00041C0F040C0F040C0F040C0 +8040C08040804041802041003042000C4C0003F00000400000400000400012257EA117> +36 D<70F8FCFC74040404080810102040060E7C9F0D>39 D<0040008001000300060004 +000C001800180038003000300070006000600060006000E000E000E000E000E000E000E0 +00E000E000E000E000E00060006000600060007000300030003800180018000C00040006 +0003000100008000400A2E7BA112>I<8000400020003000180008000C00060006000700 +030003000380018001800180018001C001C001C001C001C001C001C001C001C001C001C0 +01C001800180018001800380030003000700060006000C00080018003000200040008000 +0A2E7EA112>I<70F0F8F878080808101010202040050E7C840D>44 +DI<70F8F8F87005057C840D>I<0000400000C000018000018000 +0180000300000300000300000600000600000C00000C00000C0000180000180000180000 +300000300000600000600000600000C00000C00000C00001800001800001800003000003 +00000600000600000600000C00000C00000C000018000018000030000030000030000060 +0000600000600000C00000C00000122D7EA117>I<03F0000E1C001C0E00180600380700 +700380700380700380700380F003C0F003C0F003C0F003C0F003C0F003C0F003C0F003C0 +F003C0F003C0F003C0F003C0F003C07003807003807003807807803807001806001C0E00 +0E1C0003F000121F7E9D17>I<008003800F80F380038003800380038003800380038003 +80038003800380038003800380038003800380038003800380038003800380038007C0FF +FE0F1E7C9D17>I<03F0000C1C00100E00200700400780800780F007C0F803C0F803C0F8 +03C02007C00007C0000780000780000F00000E00001C0000380000700000600000C00001 +80000300000600400C00401800401000803FFF807FFF80FFFF80121E7E9D17>I<03F000 +0C1C00100E00200F00780F80780780780780380F80000F80000F00000F00001E00001C00 +00700007F000003C00000E00000F000007800007800007C02007C0F807C0F807C0F807C0 +F00780400780400F00200E00183C0007F000121F7E9D17>I<000600000600000E00000E +00001E00002E00002E00004E00008E00008E00010E00020E00020E00040E00080E00080E +00100E00200E00200E00400E00C00E00FFFFF0000E00000E00000E00000E00000E00000E +00000E0000FFE0141E7F9D17>I<1803001FFE001FFC001FF8001FE00010000010000010 +000010000010000010000011F000161C00180E001007001007800003800003800003C000 +03C00003C07003C0F003C0F003C0E00380400380400700200600100C0008380007E00012 +1F7E9D17>I<007C000182000701000E03800C0780180780380300380000780000700000 +700000F1F000F21C00F40600F80700F80380F80380F003C0F003C0F003C0F003C0F003C0 +7003C07003C07003803803803807001807000C0E00061C0001F000121F7E9D17>I<4000 +007FFFE07FFFC07FFFC04000808001008001008002000004000004000008000010000010 +0000200000200000600000600000E00000C00001C00001C00001C00001C00003C00003C0 +0003C00003C00003C00003C00003C000018000131F7E9D17>I<03F0000C0C0010060030 +03002001806001806001806001807001807803003E03003F06001FC8000FF00003F80007 +FC000C7E00103F00300F806007806001C0C001C0C000C0C000C0C000C0C0008060018020 +01001002000C0C0003F000121F7E9D17>I<03F0000E18001C0C00380600380700700700 +700380F00380F00380F003C0F003C0F003C0F003C0F003C07007C07007C03807C0180BC0 +0E13C003E3C0000380000380000380000700300700780600780E00700C00201800107000 +0FC000121F7E9D17>I<70F8F8F8700000000000000000000070F8F8F87005147C930D>I< +70F8F8F8700000000000000000000070F0F8F878080808101010202040051D7C930D>I< +000100000003800000038000000380000007C0000007C0000007C0000009E0000009E000 +0009E0000010F0000010F0000010F00000207800002078000020780000403C0000403C00 +00C03E0000801E0000801E0001FFFF0001000F0001000F00020007800200078002000780 +040003C0040003C00C0003C01E0003E0FF801FFE1F207F9F22>65 +DI<000FE01000381C3000E00270 +03C00170078000F00F0000701E0000701E0000303C0000303C0000107C00001078000010 +F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8000000 +780000007C0000103C0000103C0000101E0000201E0000200F0000200780004003C00080 +00E0030000380C00000FF0001C217E9F21>IIII<000FE01000381C3000E0027003C00170078000F0 +0F0000701E0000701E0000303C0000303C0000107C00001078000010F8000000F8000000 +F8000000F8000000F8000000F8000000F8000000F8003FFEF80001F0780000F07C0000F0 +3C0000F03C0000F01E0000F01E0000F00F0000F0078000F003C0017000E0023000380C10 +000FF0001F217E9F24>III75 DIII<001FE0000070380001C00E000380070007000380 +0F0003C01E0001E03C0000F03C0000F07C0000F87C0000F878000078F800007CF800007C +F800007CF800007CF800007CF800007CF800007CF800007CF800007C780000787C0000F8 +7C0000F83C0000F03E0001F01E0001E00F0003C0070003800380070001E01E0000703800 +001FE0001E217E9F23>II82 D<03F0400C0CC01803C030 +01C06000C06000C0E000C0E00040E00040E00040F00000F800007C00007F80003FF8001F +FF0007FF8000FFC0001FE00003E00001E00000F0000070800070800070800070800070C0 +0060C000E0E000C0F80180C6030081FC0014217E9F19>I<7FFFFFE0780F01E0600F0060 +400F0020400F0020C00F0030800F0010800F0010800F0010800F0010000F0000000F0000 +000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000001F8000 +03FFFC001C1F7E9E21>IIII89 +D91 D<080410082010201040204020804080408040 +B85CFC7EFC7E7C3E381C0F0E7A9F17>II<081020 +204040808080B8FCFC7C38060E7D9F0D>96 D<1FE000303000781800781C00300E00000E +00000E00000E0000FE00078E001E0E00380E00780E00F00E10F00E10F00E10F01E10781E +103867200F83C014147E9317>I<1C0000FC00001C00001C00001C00001C00001C00001C +00001C00001C00001C00001C00001C7C001D87001E01801E00C01C00E01C00701C00701C +00781C00781C00781C00781C00781C00781C00701C00F01C00E01E00C01A018019870010 +7C0015207E9F19>I<01FC000706001C0F00380F00380600780000700000F00000F00000 +F00000F00000F00000F000007000007800003800803800801C010007060001F80011147F +9314>I<0001C0000FC00001C00001C00001C00001C00001C00001C00001C00001C00001 +C00001C001F1C0070DC00C03C01801C03801C07801C07001C0F001C0F001C0F001C0F001 +C0F001C0F001C07001C07001C03801C01803C00C03C0070DC001F1F815207F9F19>I<03 +F0000E1C001C0E00380700380700700700700380F00380F00380FFFF80F00000F00000F0 +00007000007000003800803800801C010007060001F80011147F9314>I<007C01C6030F +070F0E060E000E000E000E000E000E000E00FFF00E000E000E000E000E000E000E000E00 +0E000E000E000E000E000E000E000E000E000E007FE01020809F0E>I<0000E003E3300E +3C301C1C30380E00780F00780F00780F00780F00780F00380E001C1C001E380033E00020 +00002000003000003000003FFE001FFF801FFFC03001E0600070C00030C00030C00030C0 +00306000603000C01C038003FC00141F7F9417>I<1C0000FC00001C00001C00001C0000 +1C00001C00001C00001C00001C00001C00001C00001C7C001C86001D03001E03801E0380 +1C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380 +1C03801C0380FF8FF014207E9F19>I<38007C007C007C00380000000000000000000000 +00001C00FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00 +1C001C00FF80091F7F9E0C>I<00E001F001F001F000E000000000000000000000000000 +7007F000F000700070007000700070007000700070007000700070007000700070007000 +70007000700070007000706070F060F0C061803F000C28829E0E>I<1C0000FC00001C00 +001C00001C00001C00001C00001C00001C00001C00001C00001C00001C1FE01C07801C06 +001C04001C08001C10001C20001C60001CE0001DF0001E70001C38001C3C001C1C001C0E +001C0F001C07001C07801C07C0FF9FF014207E9F18>I<1C00FC001C001C001C001C001C +001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001C001C00FF8009207F9F0C>I<1C3E03E000FCC30C30001D039038 +001E01E01C001E01E01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C00 +1C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C +01C01C001C01C01C00FF8FF8FF8021147E9326>I<1C7C00FC86001D03001E03801E0380 +1C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380 +1C03801C0380FF8FF014147E9319>I<01F800070E001C03803801C03801C07000E07000 +E0F000F0F000F0F000F0F000F0F000F0F000F07000E07000E03801C03801C01C0380070E +0001F80014147F9317>I<1C7C00FD87001E01801E01C01C00E01C00F01C00701C00781C +00781C00781C00781C00781C00781C00701C00F01C00E01E01C01E03801D87001C7C001C +00001C00001C00001C00001C00001C00001C00001C0000FF8000151D7E9319>I<01F040 +070CC00E02C01C03C03801C07801C07001C0F001C0F001C0F001C0F001C0F001C0F001C0 +7001C07801C03801C01C03C00C05C00709C001F1C00001C00001C00001C00001C00001C0 +0001C00001C00001C0000FF8151D7F9318>I<1CF0FD181E3C1E3C1E181C001C001C001C +001C001C001C001C001C001C001C001C001C001C00FFC00E147E9312>I<0FC830386018 +C008C008C008E0007C003FE01FF007F8003C800E8006C006C006C004E00CD81887E00F14 +7F9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E000E +000E000E000E000E000E040E040E040E040E040708030801F00E1C7F9B12>I<1C0380FC +1F801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C +03801C03801C03801C07800C0780061B8003E3F014147E9319>II +III<7FFF700E600E401C40384078407000E001E0 +01C00380078007010E011E011C0338027006700EFFFE10147F9314>I +E /Fv 14 122 df<0000001FFC0000C000000003FFFFC001C00000001FFFFFF003C00000 +007FFFFFFC07C0000001FFFC00FE0FC0000007FFC0001F9FC000000FFE000007FFC00000 +3FF8000003FFC000007FF0000000FFC00000FFE00000007FC00001FFC00000007FC00001 +FF800000003FC00003FF000000001FC00007FE000000001FC0000FFE000000000FC0000F +FC000000000FC0001FFC0000000007C0001FFC0000000007C0003FF80000000007C0003F +F80000000003C0003FF80000000003C0007FF80000000003C0007FF80000000003C0007F +F0000000000000007FF000000000000000FFF000000000000000FFF000000000000000FF +F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FF +F000000000000000FFF000000000000000FFF000000000000000FFF000000000000000FF +F000001FFFFFFF807FF000001FFFFFFF807FF000001FFFFFFF807FF800001FFFFFFF807F +F800000001FFC0003FF800000001FFC0003FF800000001FFC0003FF800000001FFC0001F +FC00000001FFC0001FFC00000001FFC0000FFE00000001FFC0000FFE00000001FFC00007 +FF00000001FFC00003FF00000001FFC00001FF80000001FFC00001FFC0000001FFC00000 +FFE0000001FFC000007FF0000003FFC000003FFC000003FFC000000FFF000007FFC00000 +07FFC0001FBFC0000001FFFC00FF1FC00000007FFFFFFE0FC00000001FFFFFF803C00000 +0003FFFFE000C0000000001FFE00000000413D7BBB4C>71 D76 D78 D82 D85 +D<003FFE00000001FFFFE0000007FFFFF800000FE007FC00000FF001FE00001FF800FF00 +001FF8007F80001FF8007FC0001FF8003FC0000FF0003FE00007E0003FE00003C0003FE0 +000000003FE0000000003FE0000000003FE0000000003FE0000000FFFFE000001FFFFFE0 +00007FF83FE00003FF803FE00007FC003FE0000FF0003FE0001FE0003FE0003FE0003FE0 +007FC0003FE0007FC0003FE000FF80003FE000FF80003FE000FF80003FE000FF80003FE0 +00FF80007FE0007FC0007FE0007FC000DFE0003FE0039FF0001FF80F0FFFE007FFFE0FFF +E001FFFC07FFE0003FE000FFE02B267DA52F>97 D<00FE00000000FFFE00000000FFFE00 +000000FFFE00000000FFFE0000000007FE0000000003FE0000000003FE0000000003FE00 +00000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE00 +00000003FE0000000003FE0000000003FE0000000003FE0000000003FE0000000003FE00 +00000003FE0000000003FE01FF000003FE1FFFF00003FE7FFFFC0003FEFC03FE0003FFF0 +00FF0003FFC0003F8003FF00001FC003FE00001FE003FE00000FF003FE00000FF803FE00 +000FF803FE000007FC03FE000007FC03FE000007FC03FE000007FE03FE000007FE03FE00 +0007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE000007FE03FE00 +0007FE03FE000007FC03FE000007FC03FE000007FC03FE00000FFC03FE00000FF803FE00 +000FF003FE00001FF003FF00001FE003FF80003FC003FFC0007F8003F9E000FF0003F0FC +07FE0003F07FFFF80003E01FFFE00003C003FE00002F3C7DBB36>I<000000003F800000 +003FFF800000003FFF800000003FFF800000003FFF8000000001FF8000000000FF800000 +0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000 +0000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000 +0000FF8000000000FF8000000000FF800000FF80FF80000FFFF0FF80003FFFFCFF8000FF +C03FFF8001FE000FFF8003FC0003FF8007F80001FF800FF00000FF801FF00000FF803FE0 +0000FF803FE00000FF807FE00000FF807FC00000FF807FC00000FF807FC00000FF80FFC0 +0000FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC00000FF80FFC0 +0000FF80FFC00000FF80FFC00000FF807FC00000FF807FC00000FF807FC00000FF803FE0 +0000FF803FE00000FF801FE00000FF800FF00001FF8007F80003FF8003F80007FF8001FE +001FFFC000FF807EFFFE007FFFF8FFFE000FFFE0FFFE0001FF00FFFE2F3C7DBB36>100 +D<0001FF8000000FFFF000007FFFFC0000FF81FE0003FE007F8007F8003F800FF0001FC0 +0FF0000FE01FE0000FE03FE0000FF03FE00007F07FC00007F07FC00007F87FC00007F8FF +C00007F8FFC00007F8FFFFFFFFF8FFFFFFFFF8FFFFFFFFF8FFC0000000FFC0000000FFC0 +000000FFC00000007FC00000007FC00000007FC00000003FE00000003FE00000781FE000 +00781FF00000780FF00000F007F80001F003FC0003E001FE000FC000FFC07F80003FFFFE +00000FFFF8000000FFC00025267DA52C>I<01E00007F8000FFC000FFC001FFE001FFE00 +1FFE001FFE000FFC000FFC0007F80001E000000000000000000000000000000000000000 +00000000000000000000000000000000FE007FFE007FFE007FFE007FFE0007FE0003FE00 +03FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE00 +03FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE00 +03FE0003FE0003FE00FFFFF0FFFFF0FFFFF0FFFFF0143D7DBC1A>105 +D<00FE00FFFE00FFFE00FFFE00FFFE0007FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE +0003FE0003FE0003FE0003FE0003FE0003FE0003FE0003FE00FFFFF8FFFFF8FFFFF8FFFF +F8153C7DBB1A>108 D<01FC00FF8000FFFC03FFF000FFFC0FFFF800FFFC1E03FC00FFFC +3801FE0007FC6001FF0003FCC000FF0003FDC000FF8003FD8000FF8003FF0000FF8003FF +0000FF8003FF0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE +0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE +0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE +0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF8003FE0000FF80FFFF +F83FFFFEFFFFF83FFFFEFFFFF83FFFFEFFFFF83FFFFE2F267CA536>110 +D<01FC03F000FFFC0FFC00FFFC1FFF00FFFC3C3F80FFFC707F8007FCE0FFC003FCC0FFC0 +03FD80FFC003FD80FFC003FF807F8003FF003F0003FF001E0003FF00000003FE00000003 +FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE +00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00000003FE00 +000003FE00000003FE00000003FE00000003FE00000003FE000000FFFFFC0000FFFFFC00 +00FFFFFC0000FFFFFC000022267DA528>114 D121 +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(4.0,)c(for)i +Ft(Readline)f(Library)g Fu(V)l(ersion)i(4.0.)1572 845 +y(Decem)o(b)q(er)g(1998)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(ree)h(Soft)o(w)o(are) +d(F)l(oundation.)75 2661 y(Cop)o(yrigh)o(t)301 2660 y(c)289 +2661 y Fr(\015)i Fu(1988-1999)e(F)l(ree)i(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 316 y Fo(h)p +87 290 56 2 v 87 318 a Fn(C-y)p 87 326 V 141 316 a Fo(i)315 +318 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 396 +y Fo(h)p 87 370 63 2 v 87 398 a Fn(M-y)p 87 406 V 148 +396 a Fo(i)315 398 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 453 y(command)d(is)568 451 y Fo(h)p 580 425 +56 2 v 580 453 a Fn(C-y)p 580 461 V 634 451 a Fo(i)664 +453 y Fu(or)719 451 y Fo(h)p 732 425 63 2 v 732 453 a +Fn(M-y)p 732 461 V 792 451 a Fo(i)807 453 y Fu(.)75 566 +y Fl(1.2.4)30 b(Readline)20 b(Argumen)n(ts)137 662 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 +717 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 772 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 827 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 881 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 949 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 1004 +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 1002 y Fo(h)p 1206 +976 12 2 v 1206 1004 a Fn(-)p 1206 1011 V 1215 1002 a +Fo(i)1230 1004 y Fu(\),)f(then)g(the)g(sign)h(of)f(the)g(argumen)o(t)75 +1059 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 1113 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 1111 +y Fo(h)p 1805 1085 57 2 v 1805 1113 a Fn(C-d)p 1805 1121 +V 1860 1111 a Fo(i)75 1168 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 1281 y Fl(1.2.5)30 b(Searc)n(hing)21 b(for)f(Commands)h(in)f +(the)h(History)137 1377 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 1432 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 1500 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 +1555 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 1609 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 1664 y(as)k(needed)j(to)d(\014nd)h(the)g +(desired)h(history)f(en)o(try)l(.)37 b(The)21 b(c)o(haracters)f(presen) +o(t)h(in)g(the)g(v)m(alue)h(of)f(the)75 1719 y Fm(isearc)o +(h-terminators)e Fu(v)m(ariable)f(are)f(used)h(to)e(terminate)h(an)g +(incremen)o(tal)i(searc)o(h.)25 b(If)17 b(that)g(v)m(ariable)75 +1774 y(has)f(not)f(b)q(een)i(assigned)f(a)g(v)m(alue,)g(the)774 +1772 y Fo(h)p 786 1746 70 2 v 786 1774 a Fn(ESC)p 786 +1781 V 853 1772 a Fo(i)884 1774 y Fu(and)973 1772 y Fo(h)p +985 1746 56 2 v 985 1774 a Fn(C-J)p 985 1781 V 1038 1772 +a Fo(i)1069 1774 y Fu(c)o(haracters)f(will)i(terminate)f(an)g(incremen) +o(tal)75 1828 y(searc)o(h.)230 1826 y Fo(h)p 242 1800 +55 2 v 242 1828 a Fn(C-g)p 242 1836 V 295 1826 a Fo(i)323 +1828 y Fu(will)f(ab)q(ort)e(an)g(incremen)o(tal)h(searc)o(h)f(and)h +(restore)f(the)g(original)h(line.)21 b(When)14 b(the)f(searc)o(h)75 +1883 y(is)k(terminated,)g(the)f(history)h(en)o(try)f(con)o(taining)h +(the)g(searc)o(h)f(string)h(b)q(ecomes)g(the)f(curren)o(t)h(line.)25 +b(T)l(o)75 1938 y(\014nd)18 b(other)f(matc)o(hing)h(en)o(tries)g(in)g +(the)g(history)f(list,)i(t)o(yp)q(e)1125 1936 y Fo(h)p +1137 1910 52 2 v 1137 1938 a Fn(C-s)p 1137 1946 V 1186 +1936 a Fo(i)1219 1938 y Fu(or)1277 1936 y Fo(h)p 1289 +1910 51 2 v 1289 1938 a Fn(C-r)p 1289 1946 V 1338 1936 +a Fo(i)1370 1938 y Fu(as)e(appropriate.)27 b(This)18 +b(will)75 1993 y(searc)o(h)h(bac)o(kw)o(ard)f(or)h(forw)o(ard)e(in)j +(the)f(history)h(for)e(the)h(next)g(en)o(try)g(matc)o(hing)g(the)g +(searc)o(h)g(string)75 2048 y(t)o(yp)q(ed)g(so)g(far.)30 +b(An)o(y)19 b(other)f(k)o(ey)h(sequence)h(b)q(ound)g(to)e(a)h(Readline) +i(command)d(will)j(terminate)e(the)75 2102 y(searc)o(h)h(and)h(execute) +g(that)f(command.)35 b(F)l(or)20 b(instance,)i(a)1151 +2100 y Fo(h)p 1163 2074 76 2 v 1163 2102 a Fn(RET)p 1163 +2110 V 1236 2100 a Fo(i)1271 2102 y Fu(will)g(terminate)f(the)f(searc)o +(h)h(and)75 2157 y(accept)15 b(the)h(line,)g(thereb)o(y)f(executing)i +(the)e(command)g(from)g(the)g(history)g(list.)137 2225 +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 +2280 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 2334 y(con)o(ten)o(ts)15 b(of)f(the)i(curren)o(t)f +(line.)75 2464 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(8\).)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 432 +y Ft(editing-mode)555 487 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 542 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 597 +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 652 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 736 +y Ft(enable-keypad)555 791 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 846 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 901 y(The)j(default)h(is)g(`)p Ft(off)p Fu('.)315 +986 y Ft(expand-tilde)555 1040 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 1095 y(w)o(ord)f(completion.)21 +b(The)15 b(default)h(is)f(`)p Ft(off)p Fu('.)315 1180 +y Ft(horizontal-scroll-mode)555 1235 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 1290 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 +1344 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 1399 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 1454 y(v)m(ariable)j(is)e(set)g(to)g(`)p +Ft(off)p Fu('.)315 1539 y Ft(input-meta)555 1594 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 1648 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 +1703 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 1758 y(name)15 b Ft(meta-flag)f Fu(is)i(a)f(synon)o(ym)g(for) +f(this)i(v)m(ariable.)315 1843 y Ft(isearch-terminators)555 +1898 y Fu(The)26 b(string)g(of)f(c)o(haracters)g(that)g(should)i +(terminate)f(an)g(incremen)o(tal)555 1952 y(searc)o(h)e(without)h +(subsequen)o(tly)g(executing)h(the)e(c)o(haracter)g(as)g(a)g(com-)555 +2007 y(mand)19 b(\(see)f(Section)i(1.2.5)d([Searc)o(hing],)i(page)f +(3\).)29 b(If)19 b(this)g(v)m(ariable)h(has)555 2062 +y(not)13 b(b)q(een)h(giv)o(en)g(a)f(v)m(alue,)i(the)e(c)o(haracters) +1312 2060 y Fo(h)p 1324 2034 70 2 v 1324 2062 a Fn(ESC)p +1324 2070 V 1391 2060 a Fo(i)1419 2062 y Fu(and)1505 +2060 y Fo(h)p 1518 2034 56 2 v 1518 2062 a Fn(C-J)p 1518 +2070 V 1571 2060 a Fo(i)1599 2062 y Fu(will)i(terminate)555 +2117 y(an)g(incremen)o(tal)h(searc)o(h.)315 2202 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 2256 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 2311 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 2366 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 2421 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 2476 y(also)15 b(a\013ects)g(the)g(default)h(k)o +(eymap.)315 2560 y Ft(mark-directories)555 2615 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 2670 y(The)15 b(default)h(is)g(`)p +Ft(on)p Fu('.)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(mark-modified-lines)555 238 y Fu(This)i(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 293 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 348 y(This)e(v)m(ariable)g(is)g(`)p Ft(off)p +Fu(')e(b)o(y)h(default.)315 425 y Ft(output-meta)555 +480 y Fu(If)j(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 +535 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 590 y(default)16 +b(is)f(`)p Ft(off)p Fu('.)315 667 y Ft(print-completions-horizont)o +(ally)555 722 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 +777 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 832 y(The)15 b(default)h(is)g(`)p +Ft(off)p Fu('.)315 909 y Ft(show-all-if-ambiguous)555 +964 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 1019 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 1074 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 1128 y(The)c(default)h(v)m(alue)h(is)e(`)p +Ft(off)p Fu('.)315 1206 y Ft(visible-stats)555 1261 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 +1316 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 1393 y(Key)h(Bindings)315 +1448 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 1503 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 +1558 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 +1612 y(and)d(a)g(short)g(description)i(of)d(what)h(the)g(command)g(do)q +(es.)315 1679 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 +1733 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 1788 +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 1843 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 1921 y Fm(k)o(eyname)s +Fu(:)k Fm(function-name)g Fu(or)c Fm(macro)555 1976 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 2039 y Ft(Control-u:)22 +b(universal-argument)675 2091 y(Meta-Rubout:)g(backward-kill-word)675 +2143 y(Control-o:)g(">)i(output")555 2209 y Fu(In)19 +b(the)f(ab)q(o)o(v)o(e)g(example,)1023 2207 y Fo(h)p +1035 2181 57 2 v 1035 2209 a Fn(C-u)p 1035 2216 V 1090 +2207 a Fo(i)1123 2209 y Fu(is)h(b)q(ound)g(to)f(the)g(function)h +Ft(universal-)555 2264 y(argument)p Fu(,)g(and)872 2262 +y Fo(h)p 884 2236 55 2 v 884 2264 a Fn(C-o)p 884 2271 +V 937 2262 a Fo(i)971 2264 y Fu(is)h(b)q(ound)g(to)f(run)h(the)f(macro) +g(expressed)h(on)g(the)555 2318 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 2396 y Ft(")p Fm(k)o(eyseq)q +Ft(")p Fu(:)20 b Fm(function-name)e Fu(or)d Fm(macro)555 +2451 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 +2506 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 2560 +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 2615 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 2670 y(recognized.)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)675 183 y Ft("\\C-u":)23 b(universal-argument)675 +235 y("\\C-x\\C-r":)f(re-read-init-file)675 287 y("\\e[11~":)h +("Function)f(Key)i(1")555 358 y Fu(In)19 b(the)f(ab)q(o)o(v)o(e)g +(example,)1023 356 y Fo(h)p 1035 330 57 2 v 1035 358 +a Fn(C-u)p 1035 365 V 1090 356 a Fo(i)1123 358 y Fu(is)h(b)q(ound)g(to) +f(the)g(function)h Ft(universal-)555 412 y(argument)9 +b Fu(\(just)h(as)h(it)g(w)o(as)e(in)j(the)e(\014rst)h(example\),)g(`) +1463 410 y Fo(h)p 1475 384 56 2 v 1475 412 a Fn(C-x)p +1475 420 V 1529 410 a Fo(i)k(h)p 1571 384 51 2 v 1571 +412 a Fn(C-r)p 1571 420 V 1620 410 a Fo(i)1635 412 y +Fu(')10 b(is)h(b)q(ound)h(to)555 467 y(the)k(function)i +Ft(re-read-init-file)p Fu(,)c(and)i(`)1351 465 y Fo(h)p +1363 439 70 2 v 1363 467 a Fn(ESC)p 1363 475 V 1430 465 +a Fo(i)f(h)p 1472 439 10 2 v 1472 467 a Fn([)p 1472 475 +V 1480 465 a Fo(i)g(h)p 1522 439 18 2 v 1522 467 a Fn(1)p +1522 475 V 1538 465 a Fo(i)g(h)p 1580 439 V 1580 467 +a Fn(1)p 1580 475 V 1595 465 a Fo(i)g(h)p 1637 439 24 +2 v 1637 467 a Ft(~)p 1637 475 V 1659 465 a Fo(i)1674 +467 y Fu(')h(is)h(b)q(ound)555 522 y(to)e(insert)g(the)g(text)g(`)p +Ft(Function)f(Key)h(1)p Fu('.)315 608 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 663 y(k)o(ey)i(sequences:)315 +749 y Fk(\\C-)168 b Fu(con)o(trol)15 b(pre\014x)315 835 +y Fk(\\M-)168 b Fu(meta)15 b(pre\014x)315 922 y Fk(\\e)192 +b Fu(an)15 b(escap)q(e)h(c)o(haracter)315 1008 y Fk(\\\\)192 +b Fu(bac)o(kslash)315 1094 y Fk(\\)p Ft(")555 1092 y +Fo(h)p 567 1066 V 567 1094 a Ft(")p 567 1102 V 589 1092 +a Fo(i)315 1180 y Fk(\\')555 1178 y Fo(h)p 567 1152 10 +2 v 567 1180 a Fn(')p 567 1188 V 575 1178 a Fo(i)315 +1267 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 +1321 y(escap)q(es)k(is)g(a)o(v)m(ailable:)315 1408 y +Ft(\\a)192 b Fu(alert)15 b(\(b)q(ell\))315 1494 y Ft(\\b)192 +b Fu(bac)o(kspace)315 1580 y Ft(\\d)g Fu(delete)315 1666 +y Ft(\\f)g Fu(form)14 b(feed)315 1752 y Ft(\\n)192 b +Fu(newline)315 1839 y Ft(\\r)g Fu(carriage)15 b(return)315 +1925 y Ft(\\t)192 b Fu(horizon)o(tal)16 b(tab)315 2011 +y Ft(\\v)192 b Fu(v)o(ertical)16 b(tab)315 2097 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 +2152 y(digits\))315 2238 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 2293 y(to)h(three)g(digits\))315 +2379 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 2434 +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 2489 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 2544 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 2599 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 +2666 y Ft("\\C-x\\\\":)23 b("\\\\")p eop +%%Page: 8 10 +8 9 bop 75 -58 a Fu(8)1322 b(GNU)15 b(Readline)i(Library)75 +183 y Fl(1.3.2)30 b(Conditional)20 b(Init)g(Constructs)137 +280 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 +334 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 389 y(the)e(result)h(of)f(tests.)k(There)c(are)g(four)g(parser)g +(directiv)o(es)h(used.)75 469 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 524 +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 578 +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 658 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 +713 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 +768 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 823 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 877 y(in)k Ft(emacs)f Fu(mo)q(de.)315 +957 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 +1012 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 1067 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 1121 +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 1176 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 +1231 y Ft(sun-cmd)p Fu(,)d(for)g(instance.)315 1311 y +Ft(application)555 1365 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 +1420 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 1475 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 +1530 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 1585 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 1639 y(previous)j(w)o(ord)e(in)i(Bash:)675 +1704 y Ft($if)23 b(Bash)675 1756 y(#)h(Quote)f(the)g(current)g(or)h +(previous)f(word)675 1808 y("\\C-xq":)g("\\eb\\"\\ef\\"")675 +1859 y($endif)75 1939 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 2019 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 2099 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 2153 +y(bindings)j(from)e(that)f(\014le.)435 2218 y Ft($include)23 +b(/etc/inputrc)75 2330 y Fl(1.3.3)30 b(Sample)20 b(Init)h(File)137 +2426 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 2481 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 +374 y Ft(forward-backward-delete-ch)o(ar)12 b(\(\))315 +429 y Fu(Delete)20 b(the)f(c)o(haracter)f(under)i(the)f(cursor,)h +(unless)g(the)f(cursor)g(is)h(at)e(the)h(end)h(of)f(the)315 +483 y(line,)e(in)g(whic)o(h)g(case)e(the)h(c)o(haracter)g(b)q(ehind)h +(the)f(cursor)g(is)g(deleted.)23 b(By)16 b(default,)h(this)315 +538 y(is)f(not)f(b)q(ound)h(to)e(a)h(k)o(ey)l(.)75 619 +y Ft(quoted-insert)e(\(C-q,)i(C-v\))315 674 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 729 +y(sequences)f(lik)o(e)605 727 y Fo(h)p 617 701 56 2 v +617 729 a Fn(C-q)p 617 737 V 671 727 a Fo(i)685 729 y +Fu(,)f(for)g(example.)75 810 y Ft(tab-insert)f(\(M-TAB\))315 +865 y Fu(Insert)h(a)g(tab)g(c)o(haracter.)75 946 y Ft(self-insert)f +(\(a,)g(b,)h(A,)g(1,)g(!,)g(...\))315 1001 y Fu(Insert)g(y)o(ourself.) +75 1082 y Ft(transpose-chars)e(\(C-t\))315 1136 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 1191 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 1246 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 1301 y(don't)k(w)o(ork.) +75 1382 y Ft(transpose-words)e(\(M-t\))315 1437 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 1491 y(the)e(cursor)g(o)o(v)o(er)g +(that)f(w)o(ord)g(as)h(w)o(ell.)75 1572 y Ft(upcase-word)f(\(M-u\))315 +1627 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 +1682 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 1763 y Ft(downcase-word)d(\(M-l\))315 +1818 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 1873 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 1954 y Ft(capitalize-word)e(\(M-c\))315 +2008 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 +2063 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 2178 y Fl(1.4.4)30 b(Killing)20 b(And)h(Y)-5 +b(anking)75 2289 y Ft(kill-line)14 b(\(C-k\))315 2344 +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 2425 +y Ft(backward-kill-line)e(\(C-x)h(Rubout\))315 2479 y +Fu(Kill)j(bac)o(kw)o(ard)e(to)f(the)i(b)q(eginning)h(of)e(the)g(line.) +75 2560 y Ft(unix-line-discard)e(\(C-u\))315 2615 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 2670 +y(text)f(is)g(sa)o(v)o(ed)g(on)g(the)h(kill-ring.)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-whole-line)c(\(\))315 238 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 293 y(this)k(is)f(un)o(b)q +(ound.)75 374 y Ft(kill-word)f(\(M-d\))315 429 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 483 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 564 y Ft(backward-kill-word)e(\(M-DEL\))315 +619 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 +674 y(word)p Fu(.)75 755 y Ft(unix-word-rubout)e(\(C-w\))315 +810 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 865 y(killed)17 b(text)e(is)h(sa)o(v)o(ed)f(on)g(the)g +(kill-ring.)75 946 y Ft(delete-horizontal-space)d(\(\))315 +1001 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 1082 +y Ft(kill-region)e(\(\))315 1136 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 1191 +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 +1272 y Ft(copy-region-as-kill)d(\(\))315 1327 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 +1382 y(By)e(default,)h(this)f(command)g(is)h(un)o(b)q(ound.)75 +1463 y Ft(copy-backward-word)d(\(\))315 1518 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 +1572 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 1653 y Ft(copy-forward-word)d(\(\)) +315 1708 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 1763 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 1844 y Ft(yank)f(\(C-y\))315 +1899 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 +1980 y Ft(yank-pop)f(\(M-y\))315 2035 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 2089 y(command)d(is)h(y)o(ank)f(or)f(y)o +(ank-p)q(op.)75 2204 y Fl(1.4.5)30 b(Sp)r(ecifying)20 +b(Numeric)h(Argumen)n(ts)75 2315 y Ft(digit-argument)13 +b(\(M-0,)i(M-1,)f(...)h(M--\))315 2370 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 2423 y Fo(h)p 327 2397 50 2 v 327 +2425 a Fn(M{)p 327 2432 V 375 2423 a Fo(i)405 2425 y +Fu(starts)g(a)h(negativ)o(e)g(argumen)o(t.)75 2506 y +Ft(universal-argument)e(\(\))315 2560 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 +2615 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 +2670 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)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(again)16 b(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 +238 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 +293 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 +348 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)315 +402 y(mak)o(es)c(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 +457 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 565 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 671 y Ft(complete)14 b(\(TAB\))315 726 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 781 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 835 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 890 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 +945 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 +1000 y(so)g(on.)75 1077 y Ft(possible-completions)d(\(M-?\))315 +1131 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 1208 y Ft(insert-completions)e(\(M-*\))315 +1263 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 +1318 y(b)o(y)f Ft(possible-completions)p Fu(.)75 1395 +y Ft(menu-complete)e(\(\))315 1450 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 1504 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 1559 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 1614 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 1669 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 1724 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 1778 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 1855 y Ft(delete-char-or-list)e(\(\))315 +1910 y Fu(Deletes)h(the)f(c)o(haracter)g(under)h(the)g(cursor)f(if)h +(not)f(at)g(the)g(b)q(eginning)j(or)d(end)h(of)f(the)g(line)315 +1965 y(\(lik)o(e)i Ft(delete-char)p Fu(\).)j(If)d(at)f(the)h(end)g(of)f +(the)g(line,)i(b)q(eha)o(v)o(es)f(iden)o(tically)i(to)d +Ft(possible-)315 2020 y(completions)p Fu(.)k(This)e(command)f(is)h(un)o +(b)q(ound)g(b)o(y)f(default.)75 2127 y Fl(1.4.7)30 b(Keyb)r(oard)20 +b(Macros)75 2233 y Ft(start-kbd-macro)13 b(\(C-x)i(\(\))315 +2288 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 2365 +y Ft(end-kbd-macro)e(\(C-x)i(\)\))315 2420 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 2475 y(de\014nition.)75 +2552 y Ft(call-last-kbd-macro)g(\(C-x)h(e\))315 2606 +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 +2661 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.)p eop +%%Page: 16 18 +16 17 bop 75 -58 a Fu(16)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Fl(1.4.8)30 b(Some)20 b(Miscellaneous)h(Commands)75 +298 y Ft(re-read-init-file)13 b(\(C-x)h(C-r\))315 353 +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 +407 y(assignmen)o(ts)k(found)h(there.)75 491 y Ft(abort)e(\(C-g\))315 +546 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 +600 y(setting)i(of)g Ft(bell-style)p Fu(\).)75 684 y +Ft(do-uppercase-version)d(\(M-a,)j(M-b,)f(M-)p Fm(x)p +Ft(,)h Fj(:)8 b(:)g(:)n Ft(\))315 739 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 794 y(corresp)q(onding)j(upp)q +(ercase)g(c)o(haracter.)75 877 y Ft(prefix-meta)e(\(ESC\))315 +932 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 987 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 1070 y Ft(undo)f(\(C-_,)f(C-x)h(C-u\))315 1125 +y Fu(Incremen)o(tal)h(undo,)f(separately)h(remem)o(b)q(ered)g(for)e +(eac)o(h)h(line.)75 1209 y Ft(revert-line)f(\(M-r\))315 +1263 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 1318 y(enough)g(times)f(to)g(get)f(bac)o(k)h(to)g(the)g +(b)q(eginning.)75 1402 y Ft(tilde-expand)f(\(M-~\))315 +1456 y Fu(P)o(erform)g(tilde)j(expansion)f(on)f(the)g(curren)o(t)g(w)o +(ord.)75 1540 y Ft(set-mark)f(\(C-@\))315 1595 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 1650 y(is)i(set)f(to)f +(that)h(p)q(osition.)75 1733 y Ft(exchange-point-and-mark)d(\(C-x)j +(C-x\))315 1788 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 1843 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 1926 +y Ft(character-search)e(\(C-]\))315 1981 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 2036 y(A)j(negativ)o(e)h +(coun)o(t)f(searc)o(hes)g(for)f(previous)i(o)q(ccurrences.)75 +2119 y Ft(character-search-backward)c(\(M-C-]\))315 2174 +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 +2229 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 2312 y Ft(insert-comment)d(\(M-#\)) +315 2367 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 +2422 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 2506 +y Ft(dump-functions)d(\(\))315 2560 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 2615 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 2670 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.)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 Ft(dump-variables)13 b(\(\))315 238 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 293 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 348 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 427 y Ft(dump-macros)f(\(\))315 +482 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 +537 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 +592 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 647 y(default.)75 775 y Fs(1.5)33 b(Readline)23 +b(vi)h(Mo)r(de)137 871 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 +926 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 981 y(the)c Fp(POSIX)h Fu(1003.2)d(standard.) +137 1048 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 1103 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 +1170 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 1225 y(had)e(t)o(yp)q(ed)h(an)f(`)p +Ft(i)p Fu('.)18 b(Pressing)608 1223 y Fo(h)p 620 1197 +70 2 v 620 1225 a Fn(ESC)p 620 1233 V 687 1223 a Fo(i)715 +1225 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 1280 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 1335 +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.6)f([Custom)f(Completers],)g(page)h +(32\).)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(26.)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(int)20 b Fh(rl)p 215 183 +18 3 v 21 w(erase)p 363 183 V 20 w(empt)n(y)p 540 183 +V 20 w(line)195 238 y Fu(Setting)13 b(this)h(to)e(a)h(non-zero)g(v)m +(alue)h(causes)f(Readline)j(to)c(completely)i(erase)f(the)g(curren)o(t) +195 293 y(line,)19 b(including)g(an)o(y)e(prompt,)f(an)o(y)h(time)g(a)f +(newline)j(is)f(t)o(yp)q(ed)f(as)f(the)h(only)h(c)o(haracter)195 +348 y(on)13 b(an)f(otherwise-empt)o(y)h(line.)20 b(The)13 +b(cursor)g(is)g(mo)o(v)o(ed)f(to)g(the)g(b)q(eginning)j(of)d(the)h +(newly-)195 402 y(blank)j(line.)1661 499 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 499 V 21 w(prompt)195 +554 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 609 y(should)i(not)f(b)q(e)h(assigned)g(to)e(directly)l +(.)1661 705 y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p +286 705 V 21 w(library)p 475 705 V 22 w(v)n(ersion)195 +760 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 856 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 856 V 21 w(terminal)p +518 856 V 21 w(name)195 911 y Fu(The)c(terminal)h(t)o(yp)q(e,)f(used)h +(for)f(initialization.)1661 1008 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 1008 V 21 w(readline)p +505 1008 V 22 w(name)195 1063 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 1117 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 1172 y(Init)16 b(Constructs],)e(page)h(8\).)1661 +1269 y(V)l(ariable)-1749 b Fi(FILE)20 b(*)f Fh(rl)p 286 +1269 V 21 w(instream)195 1324 y Fu(The)c(stdio)h(stream)e(from)h(whic)o +(h)h(Readline)h(reads)e(input.)1661 1420 y(V)l(ariable)-1749 +b Fi(FILE)20 b(*)f Fh(rl)p 286 1420 V 21 w(outstream)195 +1475 y Fu(The)c(stdio)h(stream)e(to)h(whic)o(h)h(Readline)h(p)q +(erforms)e(output.)1661 1571 y(V)l(ariable)-1749 b Fi(Function)20 +b(*)g Fh(rl)p 391 1571 V 21 w(startup)p 595 1571 V 20 +w(ho)r(ok)195 1626 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 1681 y(the)i(\014rst)g(prompt.)1661 +1778 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p +391 1778 V 21 w(pre)p 494 1778 V 20 w(input)p 647 1778 +V 21 w(ho)r(ok)195 1832 y Fu(If)d(non-zero,)h(this)f(is)h(the)f +(address)g(of)g(a)g(function)h(to)e(call)i(after)f(the)g(\014rst)f +(prompt)h(has)195 1887 y(b)q(een)f(prin)o(ted)g(and)g(just)f(b)q(efore) +g Ft(readline)f Fu(starts)g(reading)i(input)g(c)o(haracters.)1661 +1984 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p +391 1984 V 21 w(ev)n(en)n(t)p 544 1984 V 22 w(ho)r(ok)195 +2039 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 +2093 y(is)g(w)o(aiting)f(for)g(terminal)h(input.)1661 +2190 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p +391 2190 V 21 w(getc)p 514 2190 V 21 w(function)195 2245 +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 +2299 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 +2354 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(28\).)1661 2451 +y(V)l(ariable)-1749 b Fi(VFunction)20 b(*)g Fh(rl)p 417 +2451 V 21 w(redispla)n(y)p 661 2451 V 22 w(function)195 +2506 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 +2560 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 +2615 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 +2670 y([Redispla)o(y],)16 b(page)f(27\).)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)1661 183 y(V)l(ariable)-1749 b Fi(Keymap)20 +b Fh(rl)p 293 183 18 3 v 21 w(executing)p 551 183 V 22 +w(k)n(eymap)195 238 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 +293 y(whic)o(h)e(the)f(curren)o(tly)h(executing)g(readline)h(function)f +(w)o(as)f(found.)1661 392 y(V)l(ariable)-1749 b Fi(Keymap)20 +b Fh(rl)p 293 392 V 21 w(binding)p 501 392 V 22 w(k)n(eymap)195 +447 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 +501 y(whic)o(h)e(the)f(last)g(k)o(ey)h(binding)h(o)q(ccurred.)75 +639 y Fs(2.4)33 b(Readline)23 b(Con)n(v)n(enience)g(F)-6 +b(unctions)75 787 y Fl(2.4.1)30 b(Naming)20 b(a)g(F)-5 +b(unction)137 886 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 941 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 996 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 +1064 y Ft(Meta-Rubout:)46 b(backward-kill-word)137 1134 +y Fu(This)20 b(binds)h(the)f(k)o(eystrok)o(e)659 1132 +y Fo(h)p 671 1106 209 2 v 671 1134 a Fn(Meta-Rub)q(out)p +671 1142 V 878 1132 a Fo(i)912 1134 y Fu(to)f(the)h(function)g +Fm(descriptiv)o(ely)25 b Fu(named)20 b Ft(backward-)75 +1189 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 1244 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 1343 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1343 18 3 v 21 w(add)p 328 +1343 V 20 w(defun)i Fg(\()p Ft(char)14 b(*name,)g(Function)g +(*function,)g(int)h(key)p Fg(\))195 1398 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 +1453 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 1552 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 1606 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 +1661 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 +1716 y(functions)f(describ)q(ed)h(b)q(elo)o(w.)75 1835 +y Fl(2.4.2)30 b(Selecting)20 b(a)h(Keymap)137 1935 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 1989 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 2044 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 +2143 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 +2143 V 21 w(mak)n(e)p 445 2143 V 20 w(bare)p 575 2143 +V 20 w(k)n(eymap)j Fg(\(\))195 2198 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 2253 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 +2352 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 +2352 V 21 w(cop)n(y)p 428 2352 V 21 w(k)n(eymap)j Fg(\()p +Ft(Keymap)14 b(map)p Fg(\))195 2407 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 +2506 y(F)l(unction)-1749 b Fi(Keymap)20 b Fh(rl)p 293 +2506 V 21 w(mak)n(e)p 445 2506 V 20 w(k)n(eymap)j Fg(\(\))195 +2560 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 2560 14 2 +v 17 w(insert,)g(the)h(lo)o(w-)195 2615 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 2670 y(b)q(ound)c(to)f(pro)q(duce)h(n)o +(umeric)g(argumen)o(ts.)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(discard)p 441 183 V 21 w(k)n(eymap)i Fg(\()p +Ft(Keymap)14 b(keymap)p Fg(\))195 238 y Fu(F)l(ree)h(the)h(storage)d +(asso)q(ciated)j(with)f Fm(k)o(eymap)p Fu(.)137 330 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 +384 y(k)o(eymap)15 b(is)h(activ)o(e.)1650 476 y(F)l(unction)-1749 +b Fi(Keymap)20 b Fh(rl)p 293 476 V 21 w(get)p 391 476 +V 21 w(k)n(eymap)i Fg(\(\))195 531 y Fu(Returns)16 b(the)f(curren)o +(tly)h(activ)o(e)f(k)o(eymap.)1650 622 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 622 V 21 w(set)p 333 622 V +21 w(k)n(eymap)i Fg(\()p Ft(Keymap)14 b(keymap)p Fg(\))195 +677 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 768 y(F)l(unction)-1749 b Fi(Keymap)20 +b Fh(rl)p 293 768 V 21 w(get)p 391 768 V 21 w(k)n(eymap)p +605 768 V 20 w(b)n(y)p 685 768 V 21 w(name)i Fg(\()p +Ft(char)14 b(*name)p Fg(\))195 823 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 878 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 970 y(F)l(unction)-1749 b Fi(char)20 +b(*)f Fh(rl)p 286 970 V 21 w(get)p 384 970 V 21 w(k)n(eymap)p +598 970 V 20 w(name)i Fg(\()p Ft(Keymap)14 b(keymap)p +Fg(\))195 1024 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 1079 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 1191 y Fl(2.4.3)30 b(Binding)20 b(Keys)137 +1287 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 +1342 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 1396 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 1451 y(and)15 b(the)h(examples)g(in)g(this) +f(man)o(ual)h(assume)f(that.)137 1518 y(These)h(functions)g(manage)e(k) +o(ey)i(bindings.)1650 1610 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 1610 V 21 w(bind)p 347 1610 V 21 w(k)n(ey)k +Fg(\()p Ft(int)14 b(key,)h(Function)f(*function)p Fg(\))195 +1664 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 1719 y(case)f(of)g(an)g(in)o(v)m +(alid)j Fm(k)o(ey)p Fu(.)1650 1811 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1811 V 21 w(bind)p 347 1811 +V 21 w(k)n(ey)p 452 1811 V 21 w(in)p 520 1811 V 22 w(map)h +Fg(\()p Ft(int)14 b(key,)h(Function)f(*function,)283 +1866 y(Keymap)g(map)p Fg(\))195 1920 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 2012 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 2012 V 21 w(un)n(bind)p 409 2012 V 21 w(k)n(ey)k +Fg(\()p Ft(int)14 b(key)p Fg(\))195 2067 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 +2121 y(in)i(case)f(of)g(error.)1650 2213 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 2213 V 21 w(un)n(bind)p 409 +2213 V 21 w(k)n(ey)p 514 2213 V 21 w(in)p 582 2213 V +22 w(map)h Fg(\()p Ft(int)14 b(key,)h(Keymap)f(map)p +Fg(\))195 2268 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 2359 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 2359 V 21 w(un)n(bind)p 409 2359 V 21 w(function)p +635 2359 V 21 w(in)p 703 2359 V 21 w(map)h Fg(\()p Ft(Function)14 +b(*function,)283 2414 y(Keymap)g(map)p Fg(\))195 2469 +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 2560 y(F)l(unction)-1749 b +Fi(int)20 b Fh(rl)p 215 2560 V 21 w(un)n(bind)p 409 2560 +V 21 w(command)p 674 2560 V 17 w(in)p 738 2560 V 22 w(map)h +Fg(\()p Ft(char)14 b(*command,)g(Keymap)283 2615 y(map)p +Fg(\))195 2670 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(.)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(generic)p 413 183 V 21 +w(bind)j Fg(\()p Ft(int)15 b(type,)f(char)h(*keyseq,)f(char)h(*data,) +283 238 y(Keymap)f(map)p Fg(\))195 293 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 348 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 402 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 457 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(.)1650 567 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 567 V 21 w(parse)p 369 567 V 19 w(and)p +480 567 V 21 w(bind)j Fg(\()p Ft(char)14 b(*line)p Fg(\))195 +622 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 677 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 +731 y(page)c(3\).)1650 841 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 841 V 21 w(read)p 346 841 V 20 w(init)p +450 841 V 22 w(\014le)k Fg(\()p Ft(char)14 b(*filename)p +Fg(\))195 896 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 951 y([Readline)17 b(Init)f(File],)g(page)f(3\).)75 +1080 y Fl(2.4.4)30 b(Asso)r(ciating)20 b(F)-5 b(unction)20 +b(Names)h(and)f(Bindings)137 1185 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 1240 y(in)o(v)o(ok)o(ed)k +(b)o(y)h(a)e(particular)i(k)o(ey)f(sequence.)1650 1350 +y(F)l(unction)-1749 b Fi(Function)20 b(*)g Fh(rl)p 391 +1350 V 21 w(named)p 579 1350 V 19 w(function)j Fg(\()p +Ft(char)14 b(*name)p Fg(\))195 1405 y Fu(Return)i(the)f(function)h +(with)g(name)f Fm(name)p Fu(.)1650 1514 y(F)l(unction)-1749 +b Fi(Function)20 b(*)g Fh(rl)p 391 1514 V 21 w(function)p +617 1514 V 21 w(of)p 685 1514 V 19 w(k)n(eyseq)k Fg(\()p +Ft(char)15 b(*keyseq,)f(Keymap)283 1569 y(map,)g(int)h(*type)p +Fg(\))195 1624 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 1679 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 1734 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 +1843 y(F)l(unction)-1749 b Fi(char)20 b(**)f Fh(rl)p +312 1843 V 21 w(in)n(v)n(oking)p 541 1843 V 23 w(k)n(eyseqs)k +Fg(\()p Ft(Function)14 b(*function)p Fg(\))195 1898 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 +1953 y(tion)g Fu(in)h(the)g(curren)o(t)f(k)o(eymap.)1650 +2063 y(F)l(unction)-1749 b Fi(char)20 b(**)f Fh(rl)p +312 2063 V 21 w(in)n(v)n(oking)p 541 2063 V 23 w(k)n(eyseqs)p +750 2063 V 21 w(in)p 818 2063 V 22 w(map)i Fg(\()p Ft(Function)14 +b(*function,)283 2117 y(Keymap)g(map)p Fg(\))195 2172 +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 +2227 y(tion)g Fu(in)h(the)g(k)o(eymap)f Fm(map)p Fu(.)1650 +2337 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 2337 +V 21 w(function)p 467 2337 V 21 w(dump)r(er)g Fg(\()p +Ft(int)15 b(readable)p Fg(\))195 2392 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 2446 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 2501 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 2611 y(F)l(unction)-1749 b Fi(void)20 +b Fh(rl)p 241 2611 V 21 w(list)p 337 2611 V 22 w(funmap)p +550 2611 V 18 w(names)h Fg(\(\))195 2666 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(.)p eop +%%Page: 26 28 +26 27 bop 75 -58 a Fu(26)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Fl(2.4.5)30 b(Allo)n(wing)21 b(Undoing)137 287 +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 +341 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 396 y(undo)e(function)g(for)e(the)i(sto)q +(c)o(k)e(mark)o(et.)137 471 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 525 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(.)137 600 y(If)d(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 655 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 709 +y(group)14 b(\(\))h Fu(and)h Ft(rl_end_undo_group)d(\(\))p +Fu(.)137 784 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 855 y Ft(enum)23 b(undo_code)g({)h(UNDO_DELETE,) +e(UNDO_INSERT,)g(UNDO_BEGIN,)g(UNDO_END)h(};)137 930 +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 +985 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 1039 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 1146 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1146 18 3 v 21 w(b)r(egin)p +372 1146 V 20 w(undo)p 517 1146 V 20 w(group)h Fg(\(\))195 +1201 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 1255 +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 1310 +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 1417 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 1417 V 21 w(end)p 326 1417 V 20 w(undo)p +471 1417 V 20 w(group)h Fg(\(\))195 1471 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 1526 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 1581 y(group)f(\(\))p Fu(.)1650 +1687 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1687 +V 21 w(add)p 354 1687 V 20 w(undo)i Fg(\()p Ft(enum)14 +b(undo_code)g(what,)g(int)h(start,)g(int)f(end,)283 1742 +y(char)g(*text)p Fg(\))195 1797 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 1852 +y(from)e Fm(start)h Fu(to)g Fm(end)p Fu(,)g(and)h(encompasses)f +Fm(text)p Fu(.)1650 1958 y(F)l(unction)-1749 b Fi(void)20 +b Fh(free)p 296 1958 V 20 w(undo)p 441 1958 V 20 w(list)k +Fg(\(\))195 2013 y Fu(F)l(ree)15 b(the)h(existing)g(undo)f(list.)1650 +2119 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2119 +V 21 w(do)p 297 2119 V 20 w(undo)i Fg(\(\))195 2174 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 +2229 y(non-zero)g(if)h(something)g(w)o(as)e(undone.)137 +2336 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 2390 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 2445 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 2552 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +2552 V 21 w(mo)r(difying)h Fg(\()p Ft(int)15 b(start,)f(int)h(end)p +Fg(\))195 2606 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 2661 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.)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)75 183 y Fl(2.4.6)30 b(Redispla)n(y)1650 +300 y Fu(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 +300 18 3 v 21 w(redispla)n(y)k Fg(\(\))195 355 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 410 y(line_buffer)p +Fu(.)1650 497 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p +215 497 V 21 w(forced)p 390 497 V 20 w(up)r(date)p 584 +497 V 20 w(displa)n(y)k Fg(\(\))195 552 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 607 y(the)c(screen)h +(displa)o(y)g(is)g(correct.)1650 694 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 694 V 21 w(on)p 297 694 V 20 +w(new)p 416 694 V 21 w(line)k Fg(\(\))195 749 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 +804 y(after)d(ouputting)i(a)f(newline.)1650 892 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 892 V 21 w(reset)p 357 892 +V 20 w(line)p 465 892 V 23 w(state)j Fg(\(\))195 947 +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 +1001 y(on)d(a)g(new)g(line.)1650 1089 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1089 V 21 w(message)g Fg(\()p +Ft(va_alist)p Fg(\))195 1144 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 1199 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 1253 y(n)o(umeric)16 +b(argumen)o(ts)e(and)i(searc)o(h)f(strings.)1650 1341 +y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1341 V +21 w(clear)p 354 1341 V 21 w(message)h Fg(\(\))195 1396 +y Fu(Clear)15 b(the)h(message)e(in)i(the)g(ec)o(ho)f(area.)1650 +1483 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1483 +V 21 w(sa)n(v)n(e)p 365 1483 V 21 w(prompt)h Fg(\(\))195 +1538 y Fu(Sa)o(v)o(e)e(the)h(lo)q(cal)h(Readline)h(prompt)d(displa)o(y) +i(state)e(in)h(preparation)g(for)f(displa)o(ying)i(a)195 +1593 y(new)15 b(message)g(in)h(the)f(message)g(area)g(with)g +Ft(rl_message)p Fu(.)1650 1681 y(F)l(unction)-1749 b +Fi(void)20 b Fh(rl)p 241 1681 V 21 w(restore)p 436 1681 +V 20 w(prompt)g Fg(\(\))195 1736 y Fu(Restore)c(the)h(lo)q(cal)h +(Readline)g(prompt)e(displa)o(y)i(state)e(sa)o(v)o(ed)g(b)o(y)g(the)h +(most)e(recen)o(t)i(call)195 1790 y(to)e Ft(rl_save_prompt)p +Fu(.)75 1898 y Fl(2.4.7)30 b(Mo)r(difying)20 b(T)-5 b(ext)1650 +2015 y Fu(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +2015 V 21 w(insert)p 378 2015 V 21 w(text)k Fg(\()p Ft(char)14 +b(*text)p Fg(\))195 2069 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 +2157 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2157 +V 21 w(delete)p 383 2157 V 22 w(text)k Fg(\()p Ft(int)14 +b(start,)h(int)f(end)p Fg(\))195 2212 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 2300 y(F)l(unction)-1749 b Fi(char)20 b(*)f +Fh(rl)p 286 2300 V 21 w(cop)n(y)p 421 2300 V 21 w(text)24 +b Fg(\()p Ft(int)14 b(start,)h(int)g(end)p Fg(\))195 +2354 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 +2442 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 2442 +V 21 w(kill)p 311 2442 V 23 w(text)k Fg(\()p Ft(int)14 +b(start,)h(int)g(end)p Fg(\))195 2497 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 2552 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 2606 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 +2661 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.)p +eop +%%Page: 28 30 +28 29 bop 75 -58 a Fu(28)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Fl(2.4.8)30 b(Utilit)n(y)21 b(F)-5 b(unctions)1650 +304 y Fu(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +304 18 3 v 21 w(read)p 346 304 V 20 w(k)n(ey)k Fg(\(\))195 +359 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 +414 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 469 +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 561 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 561 V 21 w(getc)j Fg(\()p Ft(FILE)14 +b(*)p Fg(\))195 616 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 708 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 708 V 21 w(stu\013)p 346 708 +V 20 w(c)n(har)j Fg(\()p Ft(int)15 b(c)p Fg(\))195 763 +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 817 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 +910 y(F)l(unction)-1749 b Fi(rl_extend_line_buffer)22 +b Fh(\(in)n(t)j Ft(len)p Fg(\))195 964 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 1019 y(reallo)q(cating)k +(it)g(if)f(necessary)l(.)1650 1111 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1111 V 21 w(initiali)q(z)q(e)26 +b Fg(\(\))195 1166 y Fu(Initialize)18 b(or)d(re-initialize)j +(Readline's)f(in)o(ternal)f(state.)1650 1258 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1258 V 21 w(reset)p 357 1258 +V 20 w(terminal)j Fg(\()p Ft(char)15 b(*terminal_name)p +Fg(\))195 1313 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 1313 +14 2 v 17 w(name)j Fu(as)c(the)195 1368 y(terminal)j(t)o(yp)q(e)f +(\(e.g.,)f Ft(vt100)p Fu(\).)1650 1460 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 1515 y Fu(Return)i(1)f(if)g Fm(c)j Fu(is)e(an)f(alphab)q +(etic)i(c)o(haracter.)1650 1607 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 +1662 y Fu(Return)h(1)f(if)g Fm(c)j Fu(is)e(a)f(n)o(umeric)h(c)o +(haracter.)1650 1754 y(F)l(unction)-1749 b Fi(int)20 +b Fh(ding)i Fg(\(\))195 1808 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(.)1650 +1901 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1901 +18 3 v 21 w(displa)n(y)p 435 1901 V 22 w(matc)n(h)p 611 +1901 V 20 w(list)25 b Fg(\()p Ft(char)14 b(**matches,)g(int)g(len,)h +(int)283 1955 y(max)p Fg(\))195 2010 y Fu(A)j(con)o(v)o(enience)i +(function)g(for)d(displa)o(ying)j(a)e(list)i(of)e(strings)g(in)h +(columnar)g(format)e(on)195 2065 y(Readline's)e(output)e(stream.)18 +b Ft(matches)12 b Fu(is)h(the)g(list)h(of)f(strings,)f(in)i(argv)e +(format,)g(suc)o(h)h(as)195 2120 y(a)h(list)h(of)e(completion)j(matc)o +(hes.)j Ft(len)13 b Fu(is)i(the)f(n)o(um)o(b)q(er)h(of)e(strings)h(in)h +Ft(matches)p Fu(,)e(and)h Ft(max)195 2174 y Fu(is)k(the)g(length)h(of)e +(the)h(longest)g(string)g(in)h Ft(matches)p Fu(.)27 b(This)18 +b(function)h(uses)f(the)g(setting)195 2229 y(of)13 b +Ft(print-completions-horizontally)d Fu(to)k(select)g(ho)o(w)g(the)g +(matc)o(hes)f(are)h(displa)o(y)o(ed)195 2284 y(\(see)h(Section)h(1.3.1) +e([Readline)j(Init)f(File)g(Syn)o(tax],)e(page)h(4\).)137 +2376 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 2468 y(F)l(unction)-1749 +b Fi(int)20 b Fh(upp)r(ercase)p 426 2468 V 19 w(p)j Fg(\()p +Ft(int)14 b(c)p Fg(\))195 2523 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 +2615 y(F)l(unction)-1749 b Fi(int)20 b Fh(lo)n(w)n(ercase)p +409 2615 V 22 w(p)i Fg(\()p Ft(int)15 b(c)p Fg(\))195 +2670 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.)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(int)20 +b Fh(digit)p 289 183 18 3 v 22 w(p)i Fg(\()p Ft(int)15 +b(c)p Fg(\))195 238 y Fu(Return)h(1)f(if)g Fm(c)j Fu(is)e(a)f(n)o +(umeric)h(c)o(haracter.)1650 328 y(F)l(unction)-1749 +b Fi(int)20 b Fh(to)p 227 328 V 20 w(upp)r(er)i Fg(\()p +Ft(int)14 b(c)p Fg(\))195 383 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 437 y(c)o(haracter.)1650 527 +y(F)l(unction)-1749 b Fi(int)20 b Fh(to)p 227 527 V 20 +w(lo)n(w)n(er)k Fg(\()p Ft(int)15 b(c)p Fg(\))195 582 +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 +637 y(c)o(haracter.)1650 727 y(F)l(unction)-1749 b Fi(int)20 +b Fh(digit)p 289 727 V 22 w(v)m(alue)j Fg(\()p Ft(int)15 +b(c)p Fg(\))195 781 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 891 +y Fl(2.4.9)30 b(Alternate)20 b(In)n(terface)137 987 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 +1042 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 1096 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 +1151 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 1206 y(this)i(easy)l(.)1650 +1296 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1296 +V 21 w(callbac)n(k)p 458 1296 V 23 w(handler)p 670 1296 +V 21 w(install)25 b Fg(\()p Ft(char)14 b(*prompt,)g(Vfunction)283 +1351 y(*lhandler)p Fg(\))195 1405 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 1460 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 1515 y(of)e(input)h(has)f +(b)q(een)h(en)o(tered.)1650 1605 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 1605 V 21 w(callbac)n(k)p +458 1605 V 23 w(read)p 591 1605 V 20 w(c)n(har)j Fg(\(\))195 +1660 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 +1714 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 1769 +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 1824 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 +1879 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 1934 y Fu(line.)1650 2023 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 2023 V 21 w(callbac)n(k)p +458 2023 V 23 w(handler)p 670 2023 V 21 w(remo)n(v)n(e)i +Fg(\(\))195 2078 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 2133 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 +2243 y Fl(2.4.10)29 b(An)21 b(Example)137 2338 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 2393 +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 2448 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 2503 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 2566 y Ft(/*)24 +b(Invert)f(the)g(case)g(of)h(the)f(COUNT)h(following)e(characters.)h +(*/)195 2618 y(int)195 2670 y(invert_case_line)f(\(count,)h(key\))p +eop +%%Page: 30 32 +30 31 bop 75 -58 a Fu(30)1299 b(GNU)15 b(Readline)i(Library)314 +183 y Ft(int)24 b(count,)f(key;)195 235 y({)243 287 y(register)f(int)i +(start,)f(end,)g(i;)243 391 y(start)g(=)h(rl_point;)243 +495 y(if)f(\(rl_point)g(>=)h(rl_end\))290 546 y(return)f(\(0\);)243 +650 y(if)g(\(count)g(<)h(0\))290 702 y({)338 754 y(direction)f(=)h(-1;) +338 806 y(count)f(=)h(-count;)290 858 y(})243 910 y(else)290 +962 y(direction)f(=)h(1;)243 1065 y(/*)f(Find)h(the)f(end)h(of)f(the)h +(range)f(to)g(modify.)g(*/)243 1117 y(end)g(=)h(start)f(+)h(\(count)f +(*)h(direction\);)243 1221 y(/*)f(Force)g(it)h(to)g(be)f(within)g +(range.)g(*/)243 1273 y(if)g(\(end)h(>)f(rl_end\))290 +1325 y(end)h(=)g(rl_end;)243 1377 y(else)f(if)h(\(end)f(<)h(0\))290 +1429 y(end)g(=)g(0;)243 1532 y(if)f(\(start)g(==)h(end\))290 +1584 y(return)f(\(0\);)243 1688 y(if)g(\(start)g(>)h(end\))290 +1740 y({)338 1792 y(int)g(temp)f(=)h(start;)338 1844 +y(start)f(=)h(end;)338 1896 y(end)g(=)f(temp;)290 1947 +y(})243 2051 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 2103 y(the)g(undo)f +(information.)f(*/)243 2155 y(rl_modifying)g(\(start,)h(end\);)243 +2259 y(for)g(\(i)h(=)f(start;)h(i)f(!=)h(end;)f(i++\))290 +2311 y({)338 2363 y(if)h(\(uppercase_p)e(\(rl_line_buffer[i]\)\))386 +2414 y(rl_line_buffer[i])f(=)j(to_lower)f(\(rl_line_buffer[i]\);)338 +2466 y(else)g(if)h(\(lowercase_p)e(\(rl_line_buffer[i]\)\))386 +2518 y(rl_line_buffer[i])f(=)j(to_upper)f(\(rl_line_buffer[i]\);)290 +2570 y(})243 2622 y(/*)g(Move)h(point)f(to)g(on)h(top)f(of)h(the)f +(last)h(character)e(changed.)h(*/)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)243 183 y Ft(rl_point)22 b(=)i(\(direction)f(==)g +(1\))h(?)g(end)f(-)h(1)g(:)f(start;)243 235 y(return)g(\(0\);)195 +287 y(})75 408 y Fs(2.5)33 b(Readline)23 b(Signal)h(Handling)137 +502 y Fu(Signals)e(are)f(async)o(hronous)f(ev)o(en)o(ts)h(sen)o(t)f(to) +h(a)f(pro)q(cess)h(b)o(y)g(the)g(Unix)h(k)o(ernel,)g(sometimes)f(on)75 +557 y(b)q(ehalf)g(of)e(another)h(pro)q(cess.)34 b(They)20 +b(are)g(in)o(tended)h(to)e(indicate)j(exceptional)f(ev)o(en)o(ts,)f +(lik)o(e)h(a)f(user)75 612 y(pressing)c(the)f(in)o(terrupt)g(k)o(ey)g +(on)g(his)h(terminal,)f(or)g(a)f(net)o(w)o(ork)g(connection)i(b)q(eing) +g(brok)o(en.)k(There)15 b(is)75 667 y(a)e(class)g(of)g(signals)h(that)f +(can)g(b)q(e)h(sen)o(t)f(to)f(the)i(pro)q(cess)f(curren)o(tly)h +(reading)f(input)i(from)d(the)h(k)o(eyb)q(oard.)75 721 +y(Since)i(Readline)g(c)o(hanges)f(the)f(terminal)h(attributes)f(when)h +(it)g(is)g(called,)h(it)e(needs)h(to)f(p)q(erform)g(sp)q(ecial)75 +776 y(pro)q(cessing)22 b(when)f(a)g(signal)h(is)g(receiv)o(ed)g(to)e +(restore)g(the)i(terminal)f(to)g(a)g(sane)g(state,)g(or)f(pro)o(vide)75 +831 y(application)d(writers)e(with)g(functions)h(to)f(do)g(so)g(man)o +(ually)l(.)137 896 y(Readline)23 b(con)o(tains)d(an)g(in)o(ternal)h +(signal)g(handler)g(that)f(is)h(installed)h(for)d(a)h(n)o(um)o(b)q(er)g +(of)g(signals)75 951 y(\()p Ft(SIGINT)p Fu(,)h Ft(SIGQUIT)p +Fu(,)g Ft(SIGTERM)p Fu(,)g Ft(SIGALRM)p Fu(,)g Ft(SIGTSTP)p +Fu(,)g Ft(SIGTTIN)p Fu(,)h(and)f Ft(SIGTTOU)p Fu(\).)36 +b(When)21 b(one)g(of)75 1005 y(these)16 b(signals)h(is)f(receiv)o(ed,)h +(the)f(signal)h(handler)f(will)i(reset)e(the)g(terminal)g(attributes)g +(to)f(those)h(that)75 1060 y(w)o(ere)22 b(in)h(e\013ect)f(b)q(efore)g +Ft(readline)14 b(\(\))22 b Fu(w)o(as)f(called,)k(reset)d(the)g(signal)h +(handling)h(to)d(what)g(it)i(w)o(as)75 1115 y(b)q(efore)e +Ft(readline)14 b(\(\))20 b Fu(w)o(as)f(called,)k(and)e(resend)g(the)f +(signal)i(to)d(the)i(calling)h(application.)37 b(If)21 +b(and)75 1170 y(when)15 b(the)f(calling)i(application's)g(signal)f +(handler)g(returns,)f(Readline)j(will)e(reinitialize)j(the)c(terminal) +75 1225 y(and)21 b(con)o(tin)o(ue)h(to)e(accept)h(input.)39 +b(When)21 b(a)g Ft(SIGINT)f Fu(is)h(receiv)o(ed,)j(the)d(Readline)i +(signal)f(handler)75 1279 y(p)q(erforms)c(some)f(additional)j(w)o(ork,) +d(whic)o(h)i(will)h(cause)e(an)o(y)g(partially-en)o(tered)h(line)h(to)d +(b)q(e)i(ab)q(orted)75 1334 y(\(see)c(the)g(description)i(of)e +Ft(rl_free_line_state)e(\(\))p Fu(\).)137 1399 y(There)i(is)h(an)f +(additional)h(Readline)h(signal)f(handler,)g(for)e Ft(SIGWINCH)p +Fu(,)g(whic)o(h)h(the)g(k)o(ernel)h(sends)g(to)75 1454 +y(a)i(pro)q(cess)h(whenev)o(er)h(the)e(terminal's)h(size)h(c)o(hanges)f +(\(for)f(example,)i(if)f(a)f(user)h(resizes)h(an)e Ft(xterm)p +Fu(\).)75 1509 y(The)k(Readline)h Ft(SIGWINCH)d Fu(handler)j(up)q +(dates)e(Readline's)i(in)o(ternal)g(screen)e(size)i(state,)e(and)h +(then)75 1563 y(calls)c(an)o(y)f Ft(SIGWINCH)e Fu(signal)j(handler)g +(the)f(calling)i(application)f(has)f(installed.)27 b(Readline)19 +b(calls)f(the)75 1618 y(application's)h Ft(SIGWINCH)d +Fu(signal)j(handler)f(without)g(resetting)g(the)f(terminal)i(to)e(its)g +(original)i(state.)75 1673 y(If)d(the)g(application's)h(signal)g +(handler)g(do)q(es)g(more)e(than)h(up)q(date)h(its)f(idea)h(of)e(the)h +(terminal)h(size)g(and)75 1728 y(return)e(\(for)f(example,)h(a)g +Ft(longjmp)f Fu(bac)o(k)g(to)h(a)f(main)h(pro)q(cessing)h(lo)q(op\),)f +(it)g Fm(m)o(ust)g Fu(call)i Ft(rl_cleanup_)75 1783 y(after_signal)d +(\(\))g Fu(\(describ)q(ed)j(b)q(elo)o(w\),)e(to)g(restore)f(the)i +(terminal)g(state.)137 1847 y(Readline)h(pro)o(vides)e(t)o(w)o(o)e(v)m +(ariables)i(that)f(allo)o(w)g(application)i(writers)e(to)g(con)o(trol)g +(whether)h(or)e(not)75 1902 y(it)k(will)h(catc)o(h)e(certain)h(signals) +h(and)f(act)f(on)g(them)h(when)g(they)f(are)h(receiv)o(ed.)25 +b(It)16 b(is)i(imp)q(ortan)o(t)e(that)75 1957 y(applications)j(c)o +(hange)e(the)g(v)m(alues)i(of)d(these)i(v)m(ariables)g(only)g(when)g +(calling)g Ft(readline)d(\(\))p Fu(,)h(not)h(in)h(a)75 +2012 y(signal)e(handler,)g(so)f(Readline's)i(in)o(ternal)f(signal)g +(state)e(is)i(not)f(corrupted.)1661 2097 y(V)l(ariable)-1749 +b Fi(int)20 b Fh(rl)p 215 2097 18 3 v 21 w(catc)n(h)p +366 2097 V 22 w(signals)195 2151 y Fu(If)h(this)h(v)m(ariable)g(is)g +(non-zero,)g(Readline)i(will)e(install)h(signal)f(handlers)g(for)e +Ft(SIGINT)p Fu(,)195 2206 y Ft(SIGQUIT)p Fu(,)14 b Ft(SIGTERM)p +Fu(,)g Ft(SIGALRM)p Fu(,)f Ft(SIGTSTP)p Fu(,)h Ft(SIGTTIN)p +Fu(,)g(and)h Ft(SIGTTOU)p Fu(.)195 2271 y(The)g(default)h(v)m(alue)h +(of)d Ft(rl_catch_signals)f Fu(is)j(1.)1661 2356 y(V)l(ariable)-1749 +b Fi(int)20 b Fh(rl)p 215 2356 V 21 w(catc)n(h)p 366 +2356 V 22 w(sigwinc)n(h)195 2411 y Fu(If)15 b(this)h(v)m(ariable)g(is)g +(non-zero,)f(Readline)i(will)g(install)f(a)f(signal)h(handler)g(for)e +Ft(SIGWINCH)p Fu(.)195 2476 y(The)h(default)h(v)m(alue)h(of)d +Ft(rl_catch_sigwinch)f Fu(is)j(1.)137 2560 y(If)g(an)f(application)j +(do)q(es)d(not)g(wish)i(to)d(ha)o(v)o(e)h(Readline)j(catc)o(h)e(an)o(y) +f(signals,)h(or)f(to)f(handle)j(signals)75 2615 y(other)i(than)g(those) +g(Readline)j(catc)o(hes)d(\()p Ft(SIGHUP)p Fu(,)g(for)g(example\),)h +(Readline)i(pro)o(vides)d(con)o(v)o(enience)75 2670 y(functions)d(to)f +(do)g(the)g(necessary)g(terminal)h(and)g(in)o(ternal)g(state)e(clean)o +(up)i(up)q(on)g(receipt)g(of)f(a)g(signal.)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(void)20 b Fh(rl)p 241 183 +18 3 v 21 w(clean)n(up)p 450 183 V 22 w(after)p 590 183 +V 20 w(signal)j Fg(\()p Ft(void)p Fg(\))195 238 y Fu(This)12 +b(function)h(will)g(reset)f(the)g(state)f(of)g(the)h(terminal)h(to)e +(what)g(it)h(w)o(as)f(b)q(efore)h Ft(readline)195 293 +y(\(\))f Fu(w)o(as)f(called,)j(and)e(remo)o(v)o(e)g(the)g(Readline)i +(signal)f(handlers)g(for)e(all)i(signals,)h(dep)q(ending)195 +348 y(on)i(the)g(v)m(alues)i(of)e Ft(rl_catch_signals)d +Fu(and)k Ft(rl_catch_sigwinch)p Fu(.)1650 437 y(F)l(unction)-1749 +b Fi(void)20 b Fh(rl)p 241 437 V 21 w(free)p 356 437 +V 20 w(line)p 464 437 V 23 w(state)j Fg(\()p Ft(void)p +Fg(\))195 492 y Fu(This)e(will)h(free)e(an)o(y)g(partial)g(state)g +(asso)q(ciated)g(with)g(the)h(curren)o(t)f(input)h(line)h(\(undo)195 +546 y(information,)d(an)o(y)f(partial)h(history)f(en)o(try)l(,)h(an)o +(y)f(partially-en)o(tered)i(k)o(eyb)q(oard)e(macro,)195 +601 y(and)c(an)o(y)f(partially-en)o(tered)i(n)o(umeric)f(argumen)o +(t\).)k(This)c(should)h(b)q(e)f(called)h(b)q(efore)e +Ft(rl_)195 656 y(cleanup_after_signal)f(\(\))p Fu(.)23 +b(The)16 b(Readline)j(signal)e(handler)g(for)f Ft(SIGINT)f +Fu(calls)j(this)195 711 y(to)d(ab)q(ort)f(the)h(curren)o(t)h(input)g +(line.)1650 800 y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p +241 800 V 21 w(reset)p 383 800 V 20 w(after)p 521 800 +V 21 w(signal)j Fg(\()p Ft(void)p Fg(\))195 855 y Fu(This)d(will)h +(reinitialize)i(the)c(terminal)i(and)e(reinstall)i(an)o(y)e(Readline)j +(signal)e(handlers,)195 910 y(dep)q(ending)d(on)f(the)f(v)m(alues)h(of) +f Ft(rl_catch_signals)e Fu(and)i Ft(rl_catch_sigwinch)p +Fu(.)137 999 y(If)20 b(an)g(application)h(do)q(es)f(not)g(wish)g +(Readline)i(to)d(catc)o(h)g Ft(SIGWINCH)p Fu(,)h(it)g(ma)o(y)f(call)h +Ft(rl_resize_)75 1054 y(terminal)14 b(\(\))i Fu(to)g(force)g(Readline)j +(to)d(up)q(date)h(its)g(idea)g(of)f(the)g(terminal)i(size)f(when)g(a)f +Ft(SIGWINCH)f Fu(is)75 1109 y(receiv)o(ed.)1650 1198 +y(F)l(unction)-1749 b Fi(void)20 b Fh(rl)p 241 1198 V +21 w(resize)p 401 1198 V 22 w(terminal)j Fg(\()p Ft(void)p +Fg(\))195 1253 y Fu(Up)q(date)16 b(Readline's)h(in)o(ternal)f(screen)f +(size.)137 1342 y(The)h(follo)o(wing)g(functions)g(install)g(and)g +(remo)o(v)o(e)e(Readline's)j(signal)f(handlers.)1650 +1431 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1431 +V 21 w(set)p 307 1431 V 20 w(signals)j Fg(\()p Ft(void)p +Fg(\))195 1486 y Fu(Install)28 b(Readline's)g(signal)f(handler)h(for)e +Ft(SIGINT)p Fu(,)i Ft(SIGQUIT)p Fu(,)f Ft(SIGTERM)p Fu(,)h +Ft(SIGALRM)p Fu(,)195 1541 y Ft(SIGTSTP)p Fu(,)19 b Ft(SIGTTIN)p +Fu(,)h Ft(SIGTTOU)p Fu(,)f(and)h Ft(SIGWINCH)p Fu(,)g(dep)q(ending)i +(on)d(the)h(v)m(alues)h(of)e Ft(rl_)195 1596 y(catch_signals)13 +b Fu(and)j Ft(rl_catch_sigwinch)p Fu(.)1650 1685 y(F)l(unction)-1749 +b Fi(int)20 b Fh(rl)p 215 1685 V 21 w(clear)p 354 1685 +V 21 w(signals)j Fg(\()p Ft(void)p Fg(\))195 1740 y Fu(Remo)o(v)o(e)15 +b(all)h(of)f(the)g(Readline)j(signal)e(handlers)g(installed)h(b)o(y)e +Ft(rl_set_signals)e(\(\))p Fu(.)75 1865 y Fs(2.6)33 b(Custom)21 +b(Completers)137 1961 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 2016 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 2070 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 +2125 y(co)q(op)q(erate)g(to)g(pro)o(vide)g(this)h(service.)75 +2234 y Fl(2.6.1)30 b(Ho)n(w)21 b(Completing)f(W)-5 b(orks)137 +2330 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 2385 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 2439 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 2494 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 2549 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 +2604 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 +2670 y(There)g(are)f(three)g(ma)s(jor)f(functions)i(used)f(to)g(p)q +(erform)g(completion:)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)100 183 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 238 +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 293 y(ing)p 228 293 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 +348 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 +402 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 +457 y(whic)o(h)16 b(b)q(eha)o(vior)g(is)f(desired.)100 +525 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 580 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 635 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 703 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 758 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 813 +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 868 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 922 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 977 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 1032 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 1087 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 +1141 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 1196 y(it)g(has)h(\014nished)g(with)g(them.)1650 +1292 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 1292 +18 3 v 21 w(complete)j Fg(\()p Ft(int)14 b(ignore,)g(int)h +(invoking_key)p Fg(\))195 1347 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 1402 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 1456 y(\(\))p Fu(\).)19 b(The)d(default)f(is)h(to)f(do)g +(\014lename)h(completion.)1661 1552 y(V)l(ariable)-1749 +b Fi(Function)20 b(*)g Fh(rl)p 391 1552 V 21 w(completion)p +686 1552 V 21 w(en)n(try)p 839 1552 V 21 w(function)195 +1607 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 1662 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 1717 y(fault)11 +b(\014lename)h(generator)d(function,)j Ft(filename_completion_function) +g(\(\))p Fu(,)f(is)g(used.)75 1832 y Fl(2.6.2)30 b(Completion)20 +b(F)-5 b(unctions)137 1930 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 2026 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p 215 +2026 V 21 w(complete)p 460 2026 V 21 w(in)n(ternal)k +Fg(\()p Ft(int)15 b(what_to_do)p Fg(\))195 2081 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 2081 14 2 v 16 w(to)p 1162 2081 V 16 w(do)21 b Fu(sa)o(ys)c(what)h +(to)g(do)g(with)h(the)195 2136 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 2191 +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 2245 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 2300 y(w)o(ell)f(as)f(p)q(erforming)h(partial)f +(completion.)1650 2396 y(F)l(unction)-1749 b Fi(int)20 +b Fh(rl)p 215 2396 18 3 v 21 w(complete)j Fg(\()p Ft(int)14 +b(ignore,)g(int)h(invoking_key)p Fg(\))195 2451 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 +2506 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 2560 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 2615 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 2670 y Fm(in)o(v)o(oking)p 364 +2670 14 2 v 17 w(k)o(ey)p Fu(.)p eop +%%Page: 34 36 +34 35 bop 75 -58 a Fu(34)1299 b(GNU)15 b(Readline)i(Library)1650 +183 y(F)l(unction)-1749 b Fi(int)19 b Fh(rl)p 214 183 +18 3 v 21 w(p)r(ossible)p 432 183 V 20 w(completions)k +Fg(\()p Ft(int)15 b(count,)f(int)h(invoking_key)p Fg(\)\))195 +238 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 293 y Ft(rl_complete_internal)12 +b(\(\))j Fu(with)h(an)f(argumen)o(t)f(of)h(`)p Ft(?)p +Fu('.)1650 396 y(F)l(unction)-1749 b Fi(int)20 b Fh(rl)p +215 396 V 21 w(insert)p 378 396 V 21 w(completions)j +Fg(\()p Ft(int)14 b(count,)g(int)h(invoking_key)p Fg(\)\))195 +451 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 505 +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 +560 y(internal)e(\(\))h Fu(with)g(an)h(argumen)o(t)e(of)h(`)p +Ft(*)p Fu('.)1650 663 y(F)l(unction)-1749 b Fi(char)20 +b(**)f Fh(completion)p 547 663 V 21 w(matc)n(hes)j Fg(\()p +Ft(char)15 b(*text,)f(CPFunction)283 718 y(*entry_func)p +Fg(\))195 773 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 828 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 +882 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 937 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 1010 y Fm(en)o(try)p +302 1010 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 1065 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 1120 +y(on)g(subsequen)o(t)g(calls.)21 b Fm(en)o(try)p 714 +1120 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 1174 y(are)g(no)g(more)g(matc)o(hes.) +1650 1277 y(F)l(unction)-1749 b Fi(char)20 b(*)f Fh(\014lename)p +455 1277 18 3 v 20 w(completion)p 749 1277 V 21 w(function)k +Fg(\()p Ft(char)15 b(*text,)f(int)283 1332 y(state)p +Fg(\))195 1387 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 1442 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 1497 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 +1551 y(a)f(useful)h(reference)g(for)f(writing)g(custom)g(completion)h +(functions.)1650 1654 y(F)l(unction)-1749 b Fi(char)20 +b(*)f Fh(username)p 487 1654 V 19 w(completion)p 780 +1654 V 21 w(function)k Fg(\()p Ft(char)14 b(*text,)g(int)283 +1709 y(state)p Fg(\))195 1764 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 1819 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 1874 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 1997 y Fl(2.6.3)30 +b(Completion)20 b(V)-5 b(ariables)1661 2129 y Fu(V)l(ariable)-1749 +b Fi(Function)20 b(*)g Fh(rl)p 391 2129 V 21 w(completion)p +686 2129 V 21 w(en)n(try)p 839 2129 V 21 w(function)195 +2183 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 2238 y(to)f(use)g Ft(filename_entry_function)d(\(\))p +Fu(,)j(the)g(default)h(\014lename)g(completer.)1661 2341 +y(V)l(ariable)-1749 b Fi(CPPFunction)21 b(*)e Fh(rl)p +469 2341 V 21 w(attempted)p 749 2341 V 20 w(completion)p +1043 2341 V 21 w(function)195 2396 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 2451 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 2506 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 2560 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 +2615 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 2670 y(strings)f(returned) +h(will)h(b)q(e)e(used.)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)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(quoting)p 881 183 V 21 w(function)195 238 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 293 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 348 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 402 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 +402 14 2 v 16 w(t)o(yp)q(e)p Fu(,)h(and)f Fm(quote)p +1480 402 V 16 w(p)q(oin)o(ter)p Fu(.)30 b(The)195 457 +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 457 V 16 w(t)o(yp)q(e)i +Fu(is)f(either)f Ft(SINGLE_MATCH)p Fu(,)e(if)195 512 +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 +567 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 567 V +16 w(p)q(oin)o(ter)195 622 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 676 y(c)o(ho)q(ose)c(to)g(reset)g(this)g(c)o +(haracter.)1661 765 y(V)l(ariable)-1749 b Fi(CPFunction)21 +b(*)e Fh(rl)p 443 765 18 3 v 21 w(\014lename)p 672 765 +V 20 w(dequoting)p 939 765 V 21 w(function)195 820 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 +875 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 +930 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 +985 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 985 14 2 v 16 +w(c)o(har)p Fu(,)g(whic)o(h)h(is)g(the)195 1039 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 1039 V 16 w(c)o(har)195 1094 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 +1183 y(V)l(ariable)-1749 b Fi(Function)20 b(*)g Fh(rl)p +391 1183 18 3 v 21 w(c)n(har)p 519 1183 V 20 w(is)p 577 +1183 V 22 w(quoted)p 770 1183 V 20 w(p)195 1238 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 1293 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 1348 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 1403 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 +1457 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 1512 +y Fu(should)d(b)q(e)g(used)g(to)e(break)i(w)o(ords)e(for)h(the)g +(completer.)1661 1601 y(V)l(ariable)-1749 b Fi(int)20 +b Fh(rl)p 215 1601 V 21 w(completion)p 510 1601 V 21 +w(query)p 673 1601 V 21 w(items)195 1656 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 1711 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 1766 y(default)16 +b(v)m(alue)g(is)g(100.)1661 1855 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 1855 V 21 w(basic)p 430 +1855 V 21 w(w)n(ord)p 575 1855 V 21 w(break)p 736 1855 +V 20 w(c)n(haracters)195 1910 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 1964 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 2019 y(for)g(completion)h(in)g(Bash,)f(i.e.,)g +Ft(")g(\\t\\n\\"\\\\'`@$><=;|&{\(")p Fu(.)1661 2108 y(V)l(ariable)-1749 +b Fi(char)20 b(*)f Fh(rl)p 286 2108 V 21 w(basic)p 430 +2108 V 21 w(quote)p 590 2108 V 21 w(c)n(haracters)195 +2163 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 2252 y(V)l(ariable)-1749 b +Fi(char)20 b(*)f Fh(rl)p 286 2252 V 21 w(completer)p +555 2252 V 21 w(w)n(ord)p 700 2252 V 20 w(break)p 860 +2252 V 20 w(c)n(haracters)195 2307 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 2362 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 2366 +21 36 v 1661 2451 a(V)l(ariable)-1749 b Fi(char)20 b(*)f +Fh(rl)p 286 2451 18 3 v 21 w(completer)p 555 2451 V 21 +w(quote)p 715 2451 V 21 w(c)n(haracters)195 2506 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 2560 +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 2615 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 2670 y(within)h(this)g(list.)p +eop +%%Page: 36 38 +36 37 bop 75 -58 a Fu(36)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(\014lename)p 515 183 V 20 w(quote)p 674 +183 V 21 w(c)n(haracters)195 238 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 293 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 +398 y(V)l(ariable)-1749 b Fi(char)20 b(*)f Fh(rl)p 286 +398 V 21 w(sp)r(ecial)p 473 398 V 22 w(pre\014xes)195 +452 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 507 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 562 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 +617 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.)1661 722 y(V)l(ariable)-1749 +b Fi(int)20 b Fh(rl)p 215 722 V 21 w(completion)p 510 +722 V 21 w(app)r(end)p 715 722 V 19 w(c)n(haracter)195 +776 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 +831 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 +886 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 941 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 +996 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 +1050 y(an)g(application-sp)q(eci\014)q(c)j(command)d(line)i(syn)o(tax)d +(sp)q(eci\014cation.)1661 1155 y(V)l(ariable)-1749 b +Fi(int)20 b Fh(rl)p 215 1155 V 21 w(ignore)p 391 1155 +V 20 w(completion)p 685 1155 V 21 w(duplicates)195 1210 +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 1315 y(V)l(ariable)-1749 +b Fi(int)20 b Fh(rl)p 215 1315 V 21 w(\014lename)p 444 +1315 V 20 w(completion)p 738 1315 V 21 w(desired)195 +1369 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 +1424 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 1479 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 +1534 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 +1589 y(an)o(y)f(em)o(b)q(edded)i(w)o(ord)d(break)h(c)o(haracters.)1661 +1693 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 1693 +V 21 w(\014lename)p 444 1693 V 20 w(quoting)p 653 1693 +V 21 w(desired)195 1748 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 +1803 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 +1858 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 1913 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 1967 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 2022 y(quoting_function)p Fu(.)1661 +2127 y(V)l(ariable)-1749 b Fi(int)20 b Fh(rl)p 215 2127 +V 21 w(inhibit)p 399 2127 V 23 w(completion)195 2182 +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 +2236 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 2341 y(V)l(ariable)-1749 b +Fi(Function)20 b(*)g Fh(rl)p 391 2341 V 21 w(ignore)p +567 2341 V 20 w(some)p 714 2341 V 19 w(completions)p +1030 2341 V 21 w(function)195 2396 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 2451 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 2506 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 2560 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 2615 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 2670 y(freed.)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)1661 183 y(V)l(ariable)-1749 b Fi(Function)20 +b(*)g Fh(rl)p 391 183 18 3 v 21 w(directory)p 639 183 +V 21 w(completion)p 934 183 V 21 w(ho)r(ok)195 238 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 +293 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 +348 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 +402 y(v)m(ariables)j(in)f(pathnames.)1661 495 y(V)l(ariable)-1749 +b Fi(VFunction)20 b(*)g Fh(rl)p 417 495 V 21 w(completion)p +712 495 V 21 w(displa)n(y)p 906 495 V 22 w(matc)n(hes)p +1131 495 V 20 w(ho)r(ok)195 549 y Fu(If)g(non-zero,)g(then)f(this)h(is) +g(the)f(address)h(of)f(a)g(function)h(to)f(call)h(when)g(completing)g +(a)195 604 y(w)o(ord)h(w)o(ould)h(normally)h(displa)o(y)g(the)f(list)h +(of)e(p)q(ossible)j(matc)o(hes.)39 b(This)23 b(function)f(is)195 +659 y(called)d(in)f(lieu)h(of)e(Readline)j(displa)o(ying)f(the)e(list.) +27 b(It)18 b(tak)o(es)e(three)i(argumen)o(ts:)23 b(\()p +Ft(char)195 714 y(**)p Fm(matc)o(hes)p Fu(,)g Ft(int)e +Fm(n)o(um)p 623 714 14 2 v 17 w(matc)o(hes)p Fu(,)h Ft(int)g +Fm(max)p 1015 714 V 16 w(length)p Fu(\))g(where)g Fm(matc)o(hes)i +Fu(is)e(the)g(arra)o(y)195 769 y(of)17 b(matc)o(hing)h(strings,)f +Fm(n)o(um)p 702 769 V 17 w(matc)o(hes)h Fu(is)g(the)g(n)o(um)o(b)q(er)g +(of)f(strings)g(in)h(that)f(arra)o(y)l(,)g(and)195 823 +y Fm(max)p 283 823 V 16 w(length)f Fu(is)h(the)e(length)i(of)e(the)h +(longest)g(string)f(in)i(that)e(arra)o(y)l(.)20 b(Readline)e(pro)o +(vides)195 878 y(a)d(con)o(v)o(enience)i(function,)g +Ft(rl_display_match_list)p Fu(,)12 b(that)j(tak)o(es)g(care)g(of)h +(doing)g(the)195 933 y(displa)o(y)k(to)f(Readline's)i(output)f(stream.) +31 b(That)19 b(function)h(ma)o(y)f(b)q(e)h(called)h(from)e(this)195 +988 y(ho)q(ok.)75 1100 y Fl(2.6.4)30 b(A)21 b(Short)f(Completion)g +(Example)137 1196 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 1251 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 +1306 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: 38 40 +38 39 bop 75 -58 a Fu(38)1299 b(GNU)15 b(Readline)i(Library)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: 39 41 +39 40 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(39)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: 40 42 +40 41 bop 75 -58 a Fu(40)1299 b(GNU)15 b(Readline)i(Library)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: 41 43 +41 42 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(41)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: 42 44 +42 43 bop 75 -58 a Fu(42)1299 b(GNU)15 b(Readline)i(Library)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: 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(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: 44 46 +44 45 bop 75 -58 a Fu(44)1299 b(GNU)15 b(Readline)i(Library)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: 45 47 +45 46 bop 75 -58 a Fu(Chapter)15 b(2:)k(Programming)c(with)g(GNU)g +(Readline)844 b(45)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: 46 48 +46 47 bop 75 -58 a Fu(46)1299 b(GNU)15 b(Readline)i(Library)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: 47 49 +47 48 bop 75 -58 a Fu(Concept)15 b(Index)1466 b(47)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: 48 50 +48 49 bop 75 -58 a Fu(48)1299 b(GNU)15 b(Readline)i(Library)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 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(28)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(16)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\))d Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +19 b Ff(13,)13 b(14)75 1038 y Fd(backward-w)o(or)o(d)d(\(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\))c +Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)17 b Ff(12,)c(13)75 1456 y Fd(character-)o(se)o(arc)o(h)d +(\(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(34)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(\(\))5 +b Fe(.)g(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)17 b Ff(13,)c(14)75 1904 y Fd(copy-forwa)o(rd)o(-wo)o(rd)c +(\(\))d Fe(.)f(.)h(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)18 b Ff(13,)13 b(14)75 1954 y +Fd(copy-regio)o(n-)o(as-)o(ki)o(ll)c(\(\))s Fe(.)d(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 +b Ff(13,)d(14)75 2064 y Fs(D)75 2122 y Fd(delete-cha)o(r)d(\(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-cha)o(r-)o(or-)o(li)o(st)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(15)75 2222 y Fd(delete-hor)o(iz)o(ont)o(al)o +(-sp)o(ace)9 b(\(\))e Fe(.)e(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)19 b Ff(13,)13 b(14)75 2271 y Fd(digit-argu)o(me)o(nt)c(\(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 2321 y Fd(digit_p)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(29)75 2371 y Fd(digit_valu)o(e)7 b Fe(.)g(.)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(.)23 b Ff(29)75 2421 +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 +2471 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 2521 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 2570 y Fd(downcase-w)o(or)o(d)10 +b(\(M-l\))d Fe(.)t(.)f(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(12,)13 b(13)75 +2620 y Fd(dump-funct)o(io)o(ns)c(\(\))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 2670 y Fd(dump-macro)o(s)10 +b(\(\))5 b Fe(.)g(.)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(.)17 +b Ff(16,)c(17)1012 345 y Fd(dump-variab)o(le)o(s)d(\(\))f +Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)23 b Ff(16,)13 b(17)1012 463 +y Fs(E)1012 521 y Ff(editing-mo)q(de)g 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 +571 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 620 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 +670 y Fd(end-of-hist)o(or)o(y)10 b(\(M->\))c Fe(.)t(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)19 +b Ff(11,)13 b(12)1012 720 y Fd(end-of-line)c(\(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 +770 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 +820 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 937 y Fs(F)1012 +995 y Fd(filename)p 1174 995 V 11 w(completion)p 1385 +995 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(34)1012 1045 y Fd(forward-bac)o(kw)o(ard)o +(-d)o(ele)o(te)o(-ch)o(ar)9 b(\(\))g Fe(.)d(.)g(.)g(.)g(.)g(.)g(.)g(.) +22 b Ff(12,)13 b(13)1012 1095 y Fd(forward-cha)o(r)d(\(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 +1145 y Fd(forward-sea)o(rc)o(h-h)o(is)o(tor)o(y)10 b(\(C-s\))t +Fe(.)t(.)c(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)17 b +Ff(11,)c(12)1012 1194 y Fd(forward-wor)o(d)d(\(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 +1244 y Fd(free)p 1094 1244 V 13 w(undo)p 1187 1244 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 1362 y Fs(H)1012 1420 y Fd(history-sea)o(rc)o(h-b)o +(ac)o(kwa)o(rd)9 b(\(\))e Fe(.)e(.)h(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)g(.)20 b Ff(11,)13 b(12)1012 1470 y Fd(history-sea)o(rc)o(h-f)o +(or)o(war)o(d)d(\(\))e Fe(.)d(.)h(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g +(.)g(.)g(.)g(.)21 b Ff(11,)13 b(12)1012 1519 y(horizon)o(tal-scrol)q +(l-mo)r(de)h 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 1637 y Fs(I)1012 1695 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 1745 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 +1795 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 1844 y(isearc)o(h-terminators)13 b Fe(.)6 +b(.)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(.)23 b Ff(5)1012 +1962 y Fs(K)1012 2020 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 2070 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 2120 y Fd(kill-region)9 +b(\(\))c 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(.)18 +b Ff(13,)13 b(14)1012 2169 y Fd(kill-whole-)o(li)o(ne)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(.)22 b Ff(13,)13 b(14)1012 2219 +y Fd(kill-word)d(\(M-d\))t Fe(.)t(.)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(.)17 +b Ff(13,)c(14)1012 2337 y Fs(L)1012 2395 y Fd(lowercase)p +1194 2395 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 2512 y Fs(M)1012 +2570 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(6)1012 2620 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 2670 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)p eop +%%Page: 50 52 +50 51 bop 75 -58 a Fu(50)1299 b(GNU)15 b(Readline)i(Library)75 +183 y Fs(N)75 241 y Fd(next-histo)o(ry)9 b(\(C-n\))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 +291 y Fd(non-increm)o(en)o(tal)o(-f)o(orw)o(ard)o(-s)o(ear)o(ch)o(-hi)o +(st)o(ory)9 b(\(M-n\))158 341 y Fe(.)d(.)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(.)19 b +Ff(11,)13 b(12)75 391 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)c(\(M-p\))158 441 y Fe(.)d(.)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(.)19 +b Ff(11,)13 b(12)75 490 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 591 y Fs(O)75 649 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 750 y Fs(P)75 808 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 858 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 908 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 1008 y Fs(Q)75 1067 +y Fd(quoted-ins)o(er)o(t)10 b(\(C-q,)h(C-v\))t Fe(.)t(.)6 +b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)17 +b Ff(12,)c(13)75 1167 y Fs(R)75 1225 y Fd(re-read-in)o(it)o(-fi)o(le)c +(\(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(16)75 1275 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 1325 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 1375 y Fd(reverse-se)o(ar) +o(ch-)o(hi)o(sto)o(ry)9 b(\(C-r\))t Fe(.)c(.)h(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)17 b Ff(11,)c(12)75 1425 y Fd(revert-lin)o(e)d(\(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 +1474 y Fd(rl)p 117 1474 12 2 v 13 w(add)p 190 1474 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 1524 y Fd(rl)p 117 1524 V 13 +w(add)p 190 1524 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 1574 y +Fd(rl)p 117 1574 V 13 w(attempted)p 310 1574 V 11 w(completion)p +520 1574 V 10 w(function)h Fe(.)6 b(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.) +24 b Ff(34)75 1624 y Fd(rl)p 117 1624 V 13 w(basic)p +230 1624 V 13 w(quote)p 343 1624 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(35)75 1674 y Fd(rl)p 117 1674 V 13 +w(basic)p 230 1674 V 13 w(word)p 323 1674 V 12 w(break)p +435 1674 V 12 w(characters)h Fe(.)6 b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)21 b Ff(35)75 1724 y Fd(rl)p 117 1724 +V 13 w(begin)p 230 1724 V 13 w(undo)p 323 1724 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 1773 +y Fd(rl)p 117 1773 V 13 w(bind)p 210 1773 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 1823 y Fd(rl)p 117 1823 V 13 w(bind)p +210 1823 V 13 w(key)p 283 1823 V 13 w(in)p 336 1823 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 1873 y Fd(rl)p 117 1873 V 13 w(binding)p 270 +1873 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(23)75 1923 y Fd(rl_callbac)o(k_)o(han)o(dl)o(er_)o(ins)o(ta)o(ll)7 +b Fe(.)s(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)20 +b Ff(29)75 1973 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 2022 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 2072 y Fd(rl)p +117 2072 V 13 w(catch)p 230 2072 V 13 w(signals)13 b +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(31)75 2122 y Fd(rl)p 117 2122 V 13 w(catch)p 230 2122 +V 13 w(sigwinch)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(31)75 2172 y Fd(rl)p 117 2172 V 13 w(char)p 210 +2172 V 13 w(is)p 263 2172 V 13 w(quoted)p 396 2172 V +12 w(p)18 b 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(35)75 2222 y Fd(rl)p 117 2222 V 13 w(cleanup)p 270 +2222 V 12 w(after)p 382 2222 V 12 w(signal)t Fe(.)s(.)6 +b(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h +(.)f(.)g(.)16 b Ff(32)75 2271 y Fd(rl)p 117 2271 V 13 +w(clear)p 230 2271 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 2321 y Fd(rl)p 117 2321 +V 13 w(clear)p 230 2321 V 13 w(signals)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(32)75 2371 y Fd(rl)p 117 +2371 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(33)75 2421 y Fd(rl)p +117 2421 V 13 w(complete)p 290 2421 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(33)75 2471 y +Fd(rl)p 117 2471 V 13 w(completer)p 310 2471 V 11 w(quote)p +421 2471 V 12 w(characters)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)g(.)19 b Ff(35)75 2521 y Fd(rl)p 117 2521 +V 13 w(completer)p 310 2521 V 11 w(word)p 401 2521 V +13 w(break)p 514 2521 V 12 w(character)o(s)13 b Fe(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)16 b Ff(35)75 2570 y +Fd(rl)p 117 2570 V 13 w(completion)p 329 2570 V 11 w(append)p +461 2570 V 11 w(character)f Fe(.)6 b(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.) +g(.)g(.)g(.)18 b Ff(36)75 2620 y Fd(rl)p 117 2620 V 13 +w(completion)p 329 2620 V 11 w(display)p 481 2620 V 11 +w(matches)p 632 2620 V 11 w(hook)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)16 b Ff(37)75 2670 y Fd(rl)p 117 2670 V 13 w(completion)p +329 2670 V 11 w(entry)p 441 2670 V 12 w(function)21 b +Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(33,)13 +b(34)1012 183 y Fd(rl)p 1054 183 V 14 w(completio)o(n)p +1267 183 V 11 w(query)p 1378 183 V 12 w(items)h Fe(.)6 +b(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)17 b Ff(35)1012 233 y Fd(rl)p 1054 233 V 14 w(copy)p +1148 233 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 283 y Fd(rl)p 1054 283 +V 14 w(copy)p 1148 283 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 333 +y Fd(rl)p 1054 333 V 14 w(delete)p 1188 333 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 382 y Fd(rl)p 1054 382 V 14 w(directory)p +1247 382 V 10 w(completion)p 1458 382 V 11 w(hook)i Fe(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)21 +b Ff(37)1012 432 y Fd(rl)p 1054 432 V 14 w(discard)p +1208 432 V 11 w(keymap)9 b Fe(.)s(.)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(.) +22 b Ff(24)1012 482 y Fd(rl)p 1054 482 V 14 w(display)p +1208 482 V 11 w(match)p 1319 482 V 12 w(list)6 b Fe(.)f(.)h(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +h(.)19 b Ff(28)1012 532 y Fd(rl)p 1054 532 V 14 w(do)p +1108 532 V 13 w(undo)9 b Fe(.)c(.)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(.)22 b Ff(26)1012 582 y Fd(rl)p +1054 582 V 14 w(done)15 b 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 +632 y Fd(rl)p 1054 632 V 14 w(end)f Fe(.)6 b(.)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(.)g(.)g(.)18 +b Ff(21)1012 681 y Fd(rl)p 1054 681 V 14 w(end)p 1128 +681 V 13 w(undo)p 1221 681 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 731 y Fd(rl)p 1054 731 +V 14 w(erase)p 1168 731 V 12 w(empty)p 1280 731 V 12 +w(line)d Fe(.)6 b(.)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(22)1012 +781 y Fd(rl)p 1054 781 V 14 w(event)p 1168 781 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 831 y Fd(rl)p 1054 831 V 14 w(executing)p +1247 831 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(23)1012 881 y Fd(rl)p 1054 881 V 14 w(filename)p +1228 881 V 11 w(completio)o(n)p 1438 881 V 11 w(desired)16 +b Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 +b Ff(36)1012 930 y Fd(rl)p 1054 930 V 14 w(filename)p +1228 930 V 11 w(dequoting)p 1418 930 V 10 w(function)d +Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 +b Ff(35)1012 980 y Fd(rl)p 1054 980 V 14 w(filename)p +1228 980 V 11 w(quote)p 1339 980 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(36)1012 1030 y Fd(rl)p 1054 1030 V 14 w(filename)p +1228 1030 V 11 w(quoting)p 1379 1030 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(36)1012 1080 y Fd(rl)p 1054 1080 V 14 w(filename)p +1228 1080 V 11 w(quoting)p 1379 1080 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(35)1012 1130 y Fd(rl)p 1054 1130 V 14 w(forced)p +1188 1130 V 12 w(update)p 1320 1130 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(27)1012 1180 y Fd(rl)p 1054 1180 +V 14 w(free)p 1148 1180 V 12 w(line)p 1240 1180 V 13 +w(state)8 b Fe(.)e(.)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(32)1012 1229 y Fd(rl)p 1054 1229 V 14 w(function)p +1228 1229 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 1279 y Fd(rl)p 1054 1279 V 14 w(function)p +1228 1279 V 11 w(of)p 1279 1279 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 1329 y Fd(rl)p 1054 1329 V 14 +w(generic)p 1208 1329 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(25)1012 1379 y Fd(rl)p 1054 +1379 V 14 w(get)p 1128 1379 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(24)1012 +1429 y Fd(rl)p 1054 1429 V 14 w(get)p 1128 1429 V 13 +w(keymap)p 1261 1429 V 11 w(by)p 1312 1429 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 1478 y Fd(rl)p +1054 1478 V 14 w(get)p 1128 1478 V 13 w(keymap)p 1261 +1478 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 1528 y Fd(rl)p 1054 1528 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(28)1012 1578 y Fd(rl)p 1054 1578 +V 14 w(getc)p 1148 1578 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 1628 y Fd(rl)p +1054 1628 V 14 w(ignore)p 1188 1628 V 12 w(completi)o(on)p +1399 1628 V 11 w(duplicate)o(s)d Fe(.)6 b(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)h(.)f(.)17 b Ff(36)1012 1678 y Fd(rl)p 1054 1678 +V 14 w(ignore)p 1188 1678 V 12 w(some)p 1280 1678 V 12 +w(completion)o(s)p 1511 1678 V 11 w(function)j Fe(.)6 +b(.)g(.)g(.)g(.)g(.)g(.)24 b Ff(36)1012 1727 y Fd(rl)p +1054 1727 V 14 w(inhibit)p 1208 1727 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(36)1012 1777 y Fd(rl)p +1054 1777 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 1827 y Fd(rl)p +1054 1827 V 14 w(insert)p 1188 1827 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(34)1012 1877 y Fd(rl)p +1054 1877 V 14 w(insert)p 1188 1877 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 1927 y Fd(rl)p 1054 1927 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 1977 y Fd(rl)p 1054 1977 V 14 w(invoking)p +1228 1977 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 2026 y Fd(rl)p 1054 2026 V 14 w(invoking)p +1228 2026 V 11 w(keyseqs)p 1379 2026 V 11 w(in)p 1430 +2026 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 2076 y Fd(rl)p +1054 2076 V 14 w(kill)p 1148 2076 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 +2126 y Fd(rl)p 1054 2126 V 14 w(library)p 1208 2126 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 2176 y Fd(rl)p 1054 2176 V 14 w(line)p 1148 +2176 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 2226 y Fd(rl)p 1054 2226 V +14 w(list)p 1148 2226 V 12 w(funmap)p 1280 2226 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 +2275 y Fd(rl)p 1054 2275 V 14 w(make)p 1148 2275 V 12 +w(bare)p 1240 2275 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 2325 y Fd(rl)p 1054 2325 V 14 w(make)p +1148 2325 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 2375 y Fd(rl)p 1054 2375 +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 2425 +y Fd(rl)p 1054 2425 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 +2475 y Fd(rl)p 1054 2475 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 2524 y Fd(rl)p 1054 2524 V 14 w(named)p +1168 2524 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 2574 y Fd(rl)p 1054 2574 V 14 w(on)p +1108 2574 V 13 w(new)p 1181 2574 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 2624 +y Fd(rl)p 1054 2624 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)p eop +%%Page: 51 53 +51 52 bop 75 -58 a Fu(F)l(unction)16 b(and)f(V)l(ariable)i(Index)1187 +b(51)75 183 y Fd(rl)p 117 183 12 2 v 13 w(parse)p 230 +183 V 13 w(and)p 303 183 V 13 w(bind)9 b Fe(.)d(.)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(.)24 b Ff(25)75 233 y Fd(rl)p 117 233 V 13 +w(pending)p 270 233 V 12 w(input)14 b 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(21)75 283 y Fd(rl)p 117 283 V +13 w(point)22 b Fe(.)6 b(.)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(.)g(.)24 b Ff(21)75 333 y Fd(rl)p +117 333 V 13 w(possible)p 290 333 V 11 w(completions)6 +b Fe(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.) +g(.)g(.)g(.)g(.)22 b Ff(34)75 382 y Fd(rl)p 117 382 V +13 w(pre)p 190 382 V 13 w(input)p 303 382 V 13 w(hook)16 +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(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(22)75 +432 y Fd(rl)p 117 432 V 13 w(prompt)i 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(.)h(.)f(.)g(.)g(.)22 b Ff(22)75 +482 y Fd(rl)p 117 482 V 13 w(read)p 210 482 V 13 w(init)p +303 482 V 13 w(file)9 b Fe(.)d(.)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(.)24 +b Ff(25)75 532 y Fd(rl)p 117 532 V 13 w(read)p 210 532 +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(28)75 582 y Fd(rl)p 117 582 V +13 w(readline)p 290 582 V 11 w(name)15 b 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 632 y Fd(rl)p 117 632 +V 13 w(redisplay)t Fe(.)s(.)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(.) +g(.)h(.)f(.)g(.)16 b Ff(27)75 681 y Fd(rl)p 117 681 V +13 w(redisplay)p 310 681 V 11 w(function)f Fe(.)6 b(.)g(.)h(.)f(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)18 +b Ff(22)75 731 y Fd(rl)p 117 731 V 13 w(reset)p 230 731 +V 13 w(after)p 343 731 V 12 w(signal)6 b Fe(.)t(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)19 +b Ff(32)75 781 y Fd(rl)p 117 781 V 13 w(reset)p 230 781 +V 13 w(line)p 323 781 V 12 w(state)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(27)75 831 y Fd(rl)p 117 831 V 13 w(reset)p +230 831 V 13 w(terminal)8 b Fe(.)s(.)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(.) +21 b Ff(28)75 881 y Fd(rl)p 117 881 V 13 w(resize)p 250 +881 V 12 w(terminal)7 b Fe(.)s(.)f(.)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(32)75 930 y Fd(rl)p 117 930 V 13 w(restore)p 270 +930 V 12 w(prompt)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(27)75 980 y Fd(rl)p 117 980 V 13 w(save)p 210 980 +V 13 w(prompt)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(27)75 1030 y Fd(rl)p 117 1030 V 13 w(set)p +190 1030 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 1080 y Fd(rl)p 117 +1080 V 13 w(set)p 190 1080 V 13 w(signals)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(32)75 1130 y Fd(rl)p 117 1130 V 13 w(special)p 270 +1130 V 12 w(prefixes)h 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(36)75 1180 y Fd(rl)p 117 1180 V 13 w(startup)p 270 +1180 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 1229 y Fd(rl)p 117 1229 V 13 w(stuff)p +230 1229 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(28)75 1279 y Fd(rl)p 117 1279 +V 13 w(terminal)p 290 1279 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 1329 y Fd(rl)p 117 +1329 V 13 w(unbind)p 250 1329 V 12 w(command)p 402 1329 +V 12 w(in)p 454 1329 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 1379 y Fd(rl)p 117 1379 V 13 w(unbind)p 250 +1379 V 12 w(function)p 422 1379 V 11 w(in)p 473 1379 +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 1429 y Fd(rl)p +117 1429 V 13 w(unbind)p 250 1429 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 +1478 y Fd(rl)p 117 1478 V 13 w(unbind)p 250 1478 V 12 +w(key)p 322 1478 V 13 w(in)p 375 1478 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 1578 y Fs(S)75 +1636 y Fd(self-inser)o(t)10 b(\(a,)h(b,)h(A,)g(1,)g(!,)g(...\))c +Fe(.)t(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)20 b Ff(12,)13 b(13)1012 +183 y Fd(set-mark)d(\(C-@\))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(16)1012 233 y(sho)o(w-all-if-am)o(bigu)q(ous)8 +b Fe(.)g(.)e(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.) +g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)20 b Ff(6)1012 +283 y Fd(start-kbd-m)o(ac)o(ro)9 b(\(C-x)j(\(\))e Fe(.)c(.)g(.)g(.)g(.) +g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)24 +b Ff(15)1012 389 y Fs(T)1012 447 y Fd(tab-insert)9 b(\(M-TAB\))c +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(13)1012 +497 y Fd(tilde-expan)o(d)10 b(\(M-~\))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(16)1012 546 y Fd(to_lower)6 b Fe(.)s(.)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(.)19 +b Ff(29)1012 596 y Fd(to_upper)6 b Fe(.)s(.)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(.)19 b +Ff(29)1012 646 y Fd(transpose-c)o(ha)o(rs)9 b(\(C-t\))c +Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)18 b Ff(12,)13 b(13)1012 696 y Fd(transpose-w)o(or)o(ds)c +(\(M-t\))c Fe(.)t(.)h(.)g(.)g(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)18 b Ff(12,)13 b(13)1012 802 y +Fs(U)1012 860 y Fd(undo)f(\(C-)p 1166 860 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 +910 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 959 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 1009 y Fd(unix-word-r)o(ub)o +(out)9 b(\(C-w\))s Fe(.)t(.)e(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)g(.)g(.)g(.)h(.)16 b Ff(13,)d(14)1012 1059 +y Fd(upcase-word)c(\(M-u\))f Fe(.)e(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g +(.)g(.)g(.)h(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)23 +b Ff(12,)13 b(13)1012 1109 y Fd(uppercase)p 1194 1109 +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 1159 y Fd(username)p 1174 +1159 V 11 w(completion)p 1385 1159 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(34)1012 1265 y Fs(V)1012 1323 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 1429 y Fs(Y)1012 1487 y Fd(yank)12 +b(\(C-y\))c Fe(.)e(.)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(.) +23 b Ff(13,)13 b(14)1012 1537 y Fd(yank-last-a)o(rg)c(\(M-.,)i(M-)p +1433 1537 V 13 w(\))c Fe(.)f(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.)f(.) +g(.)g(.)g(.)g(.)g(.)20 b Ff(11,)13 b(12)1012 1586 y Fd(yank-nth-ar)o(g) +d(\(M-C-y\))c Fe(.)s(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)g(.)h(.) +f(.)g(.)g(.)g(.)g(.)g(.)g(.)19 b Ff(11,)13 b(12)1012 +1636 y Fd(yank-pop)d(\(M-y\))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(.)18 b Ff(13,)13 b(14)p eop +%%Page: 52 54 +52 53 bop 75 -58 a Fu(52)1299 b(GNU)15 b(Readline)i(Library)p +eop +%%Page: -1 55 +-1 54 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(8)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(16)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(26)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(27)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(28)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(29)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(Readline)17 b(Signal)g(Handling)12 +b Fa(.)c(.)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(.)27 +b Fu(31)224 2640 y(2.6)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(32)p eop +%%Page: -2 56 +-2 55 bop 75 -58 a Fu(ii)1321 b(GNU)15 b(Readline)i(Library)374 +42 y(2.6.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(32)374 96 y(2.6.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(33)374 151 y(2.6.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(34)374 206 +y(2.6.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(37)75 327 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(47)75 462 +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(49)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/readline/doc/texinfo.tex b/readline/doc/texinfo.tex new file mode 100644 index 0000000..7d62f26 --- /dev/null +++ b/readline/doc/texinfo.tex @@ -0,0 +1,4692 @@ +%% TeX macros to handle texinfo files + +% 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 +%published by the Free Software Foundation; either version 2, or (at +%your option) any later version. + +%This texinfo.tex file is distributed in the hope that it will be +%useful, but WITHOUT ANY WARRANTY; without even the implied warranty +%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%General Public License for more details. + +%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, 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! + + +% 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]:} + +% 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\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\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 @~. + + +\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 +\newdimen \normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% 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 +\outerhsize=7in +%\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, 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 = `\\ % 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. +% The contents of the page are centerlined into the cropmarks, +% and any desired binding offset is added as an \hskip on either +% site of the centerlined box. (P. A. MacKay, 12 November, 1986) +% +\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up +{\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} + \hfill + \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 + \boxmaxdepth\cornerthick + \line{\vbox{\moveleft\cornerthick\nsbot} + \hfill + \vbox{\moveright\cornerthick\nsbot}} + \nointerlineskip + \vbox{\line{\ewbot\hfill\ewbot}} + }} + \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} +} + +% +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% 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{% + % \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 {\futurelet\temp\parseargx}} + +{\obeylines % + \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} + +%% These are used to keep @begin/@end levels from running away +%% Call \inENV within environments (after a \begingroup) +\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi} +\def\ENVcheck{% +\ifENV\errmessage{Still within an environment. Type Return to continue.} +\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.} + +\outer\def\begin{\parsearg\beginxxx} + +\def\beginxxx #1{% +\expandafter\ifx\csname #1\endcsname\relax +{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else +\csname #1\endcsname\fi} + +% @end foo executes the definition of \Efoo. +% +\def\end{\parsearg\endxxx} +\def\endxxx #1{% + \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 +} + +% 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}}% +} + + +% Single-spacing is done by various environments (specifically, in +% \nonfillstart and \quotations). +\newskip\singlespaceskip \singlespaceskip = 12.5pt +\def\singlespace{% + % 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 + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt \char '100}} + +% 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 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=3000 } + +% @enddots{} is an end-of-sentence ellipsis. +\gdef\enddots{$\mathinner{\ldotp\ldotp\ldotp\ldotp}$\spacefactor=3000} + +% @! is an end-of-sentence bang. +\gdef\!{!\spacefactor=3000 } + +% @? 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. + +\newdimen\mil \mil=0.001in + +\def\need{\parsearg\needx} + +% 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 + +\let\br = \par + +% @dots{} output some dots + +\def\dots{$\ldots$} + +% @page forces the start of a new page + +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% 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}} + +% 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}}}} + +% @inmargin{TEXT} puts TEXT in the margin next to the current paragraph. + +\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{} + +% @center line outputs that line, centered + +\def\center{\parsearg\centerzzz} +\def\centerzzz #1{{\advance\hsize by -\leftskip +\advance\hsize by -\rightskip +\centerline{#1}}} + +% @sp n outputs n lines of vertical space + +\def\sp{\parsearg\spxxx} +\def\spxxx #1{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other% +\parsearg \commentxxx} + +\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 } + +\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{% +\let\chapter=\relax +\let\unnumbered=\relax +\let\top=\relax +\let\unnumberedsec=\relax +\let\unnumberedsection=\relax +\let\unnumberedsubsec=\relax +\let\unnumberedsubsection=\relax +\let\unnumberedsubsubsec=\relax +\let\unnumberedsubsubsection=\relax +\let\section=\relax +\let\subsec=\relax +\let\subsubsec=\relax +\let\subsection=\relax +\let\subsubsection=\relax +\let\appendix=\relax +\let\appendixsec=\relax +\let\appendixsection=\relax +\let\appendixsubsec=\relax +\let\appendixsubsection=\relax +\let\appendixsubsubsec=\relax +\let\appendixsubsubsection=\relax +\let\contents=\relax +\let\smallbook=\relax +\let\titlepage=\relax +} + +% 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 +} + +% Ignore @ignore ... @end ignore. +% +\def\ignore{\doignore{ignore}} + +% 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}} + +% 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 + + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory = \comment + +% 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 +} + +% 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} + +% @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} + +% @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. +% We don't use $'s directly in the definition of \math because control +% sequences like \math are expanded when the toc file is written. Then, +% 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 +\global\let\lastnode=\relax} + +\def\unnumbnoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi +\global\let\lastnode=\relax} + +\def\appendixnoderef{\ifx\lastnode\relax\else +\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi +\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. +\def\setfilename{% + \readauxfile + \opencontents + \openindices + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \global\let\setfilename=\comment % Ignore extra @setfilename cmds. + \comment % Ignore the actual filename. +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + +% \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,} + +% Font-change commands. + +% Texinfo supports the sans serif font style, which plain TeX does not. +% So we set up a \sf analogous to plain's \rm, etc. +\newfam\sffam +\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 +\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. +\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. +\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 (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. +\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 +\setfont\indsc\scshape{10}{900} +\font\indi=cmmi9 +\font\indsy=cmsy9 + +% 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 +\setfont\chapsc\scbshape{10}{\magstep3} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +% 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 + +% \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} + +%\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 + +% 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: +\setfont\titlerm\rmbshape{12}{\magstep3} +\let\authorrm = \secrm + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% 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 + \textfont\ttfam = \tentt \textfont\sffam = \tensf +} + + +% 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 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\tenttsl=\textttsl + \resetmathfonts} +\def\chapfonts{% + \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 \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=\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 \let\tenttsl=\ssecttsl + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts % Maybe make sssec fonts scaled magstephalf? +\def\indexfonts{% + \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 \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. +\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 + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi} +\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\var=\smartitalic +\let\dfn=\smartitalic +\let\emph=\smartitalic +\let\cite=\smartitalic + +\def\b#1{{\bf #1}} +\let\strong=\b + +% 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} +\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. +\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, +% 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{\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} + +% @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 +% Use of \lowercase was suggested. +\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,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\def\titlefont#1{{\titlerm #1}} + +\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. +% This change was not in the ChangeLog anyway. --rms. +% \let\subtitlerm=\cmr12 + \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}% + % + \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}% + % + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % + % 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 width \hsize \vskip4pt}% + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Now you can put text using @subtitle. + \def\subtitle{\parsearg\subtitlezzz}% + \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}% + % + % @author should come last, but may come many times. + \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 + \fi + \oldpage + \let\page = \oldpage + \hbox{}}% +% \def\page{\oldpage \hbox{}} +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + \HEADINGSon +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks \evenheadline % Token sequence for heading line of even pages +\newtoks \oddheadline % Token sequence for heading line of odd pages +\newtoks \evenfootline % Token sequence for footing line of even pages +\newtoks \oddfootline % Token sequence for footing line of odd pages + +% Now make Tex use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + +\def\evenheading{\parsearg\evenheadingxxx} +\def\oddheading{\parsearg\oddheadingxxx} +\def\everyheading{\parsearg\everyheadingxxx} + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\oddfooting{\parsearg\oddfootingxxx} +\def\everyfooting{\parsearg\everyfootingxxx} + +{\catcode`\@=0 % + +\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish} +\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish} +\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish} +\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish} +\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish} +\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{% +\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish} +\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}} +\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} +% +}% 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 singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{ +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{ +\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{ +\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} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% Produces Day Month Year style of output. +\def\today{\number\day\space +\ifcase\month\or +January\or February\or March\or April\or May\or June\or +July\or August\or September\or October\or November\or December\fi +\space\number\year} + +% Use this if you want the Month Day, Year style of output. +%\def\today{\ifcase\month\or +%January\or February\or March\or April\or May\or June\or +%July\or August\or September\or October\or November\or December\fi +%\space\number\day, \number\year} + +% @settitle line... specifies the title of the document, for headings +% It generates no output of its own + +\def\thistitle{No Title} +\def\settitle{\parsearg\settitlezzz} +\def\settitlezzz #1{\gdef\thistitle{#1}} + + +\message{tables,} + +% @tabs -- simple alignment + +% These don't work. For one thing, \+ is defined as outer. +% So these macros cannot even be defined. + +%\def\tabs{\parsearg\tabszzz} +%\def\tabszzz #1{\settabs\+#1\cr} +%\def\tabline{\parsearg\tablinezzz} +%\def\tablinezzz #1{\+#1\cr} +%\def\&{&} + +% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% 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{\itemxpar \parsearg\itemzzz} + +\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz} +\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \itemxpar \parsearg\xitemzzz} + +\def\internalBkitem{\smallbreak \parsearg\kitemzzz} +\def\internalBkitemx{\itemxpar \parsearg\kitemzzz} + +\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}% + \itemzzz {#1}} + +\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}% + \itemzzz {#1}} + +\def\itemzzz #1{\begingroup % + \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}} +\def\itemx{\errmessage{@itemx while not in a table}} +\def\kitem{\errmessage{@kitem while not in a table}} +\def\kitemx{\errmessage{@kitemx while not in a table}} +\def\xitem{\errmessage{@xitem while not in a table}} +\def\xitemx{\errmessage{@xitemx while not in a table}} + +%% Contains a kludge to get @end[description] to work +\def\description{\tablez{\dontindex}{1}{}{}{}{}} + +\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex} +{\obeylines\obeyspaces% +\gdef\tablex #1^^M{% +\tabley\dontindex#1 \endtabley}} + +\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex} +{\obeylines\obeyspaces% +\gdef\ftablex #1^^M{% +\tabley\fnitemindex#1 \endtabley +\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% +\tablez{#1}{#2}{#3}{#4}{#5}{#6}}} + +\def\tablez #1#2#3#4#5#6{% +\aboveenvbreak % +\begingroup % +\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 % +\ifnum 0#5>0 \advance \rightskip by #5\mil \fi % +\def\itemfont{#2}% +\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\afterenvbreak\endgroup}% +\let\item = \internalBitem % +\let\itemx = \internalBitemx % +\let\kitem = \internalBkitem % +\let\kitemx = \internalBkitemx % +\let\xitem = \internalBxitem % +\let\xitemx = \internalBxitemx % +} + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\def\itemize{\parsearg\itemizezzz} + +\def\itemizezzz #1{% + \begingroup % ended by the @end itemsize + \itemizey {#1}{\Eitemize} +} + +\def\itemizey #1#2{% +\aboveenvbreak % +\itemmax=\itemindent % +\advance \itemmax by -\itemmargin % +\advance \leftskip by \itemindent % +\exdentamount=\itemindent +\parindent = 0pt % +\parskip = \smallskipamount % +\ifdim \parskip=0pt \parskip=2pt \fi% +\def#2{\endgraf\afterenvbreak\endgroup}% +\def\itemcontents{#1}% +\let\item=\itemizeitem} + +% 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 } + +% \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 +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% 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. + +\def\itemizeitem{% +\advance\itemno by 1 +{\let\par=\endgraf \smallbreak}% +\ifhmode \errmessage{\in hmode at itemizeitem}\fi +{\parskip=0in \hskip 0pt +\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}% +\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 + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within \newindex. +{\catcode`\@=11 +\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} + +% \newindex {foo} defines an index named foo. +% 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 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 +\noexpand\doindex {#1}} +} + +% @defindex foo == \newindex{foo} + +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. + +\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 +\noexpand\docodeindex {#1}} +} + +\def\defcodeindex{\parsearg\newcodeindex} + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +\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 +\noexpand\doindex {#2}}% +} + +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +\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 +\noexpand\docodeindex {#2}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\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\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\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\,##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}}% +\def\cite##1{\realbackslash cite {##1}}% +\def\key##1{\realbackslash key {##1}}% +\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} +\def\indexdummytex{TeX} +\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 +\let\i=\indexdummyfont +\let\b=\indexdummyfont +\let\emph=\indexdummyfont +\let\strong=\indexdummyfont +\let\cite=\indexdummyfont +\let\sc=\indexdummyfont +%Don't no-op \tt, since it isn't a user-level command +% and is used in the definitions of the active chars like <, >, |... +%\let\tt=\indexdummyfont +\let\tclose=\indexdummyfont +\let\code=\indexdummyfont +\let\file=\indexdummyfont +\let\samp=\indexdummyfont +\let\kbd=\indexdummyfont +\let\key=\indexdummyfont +\let\var=\indexdummyfont +\let\TeX=\indexdummytex +\let\dots=\indexdummydots +\def\@{@}% +} + +% To define \realbackslash, we must make \ not be an escape. +% We must first make another character (@) an escape +% so we do not become unable to do a definition. + +{\catcode`\@=0 \catcode`\\=\other +@gdef@realbackslash{\}} + +\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{% + % 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 % +{\indexdummies % Must do this here, since \bf, etc expand at this stage +\escapechar=`\\% +{\let\folio=0% +\def\rawbackslashxx{\indexbackslash}% +% +% 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 #3}% +}% +% 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}{#3}}}% +\temp }% +}\penalty\count10}} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% This is what you call to cause a particular index to get printed. +% Write +% @unnumbered Function Index +% @printindex fn + +\def\printindex{\parsearg\doprintindex} + +\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. + +% Same as \bigskipamount except no shrink. +% \balancecolumns gets confused if there is any shrink. +\newskip\initialskipamount \initialskipamount 12pt plus4pt + +\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}} + +% 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 ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm + +\def\secondary #1#2{ +{\parfillskip=0in \parskip=0in +\hangindent =1in \hangafter=1 +\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par +}} + +% 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 + +\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}% + % + % 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{% + % 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{% + % 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 +} +\catcode `\@=\other + + +\message{sectioning,} +% Define chapters, sections, etc. + +\newcount \chapno +\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 = `\@ +\def\appendixletter{\char\the\appendixno} + +\newwrite \contentsfile +% This is called from \setfilename. +\def\opencontents{\openout \contentsfile = \jobname.toc} + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise + +\def\thischapter{} \def\thissection{} +\def\seccheck#1{\if \pageno<0 % +\errmessage{@#1 not allowed after generating table of contents}\fi +% +} + +\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} +\def\tt{\realbackslash tt} +\def\bf{\realbackslash bf } +\def\w{\realbackslash w} +\def\less{\realbackslash less} +\def\gtr{\realbackslash gtr} +\def\hat{\realbackslash hat} +\def\char{\realbackslash char} +\def\tclose##1{\realbackslash tclose {##1}} +\def\code##1{\realbackslash code {##1}} +\def\samp##1{\realbackslash samp {##1}} +\def\r##1{\realbackslash r {##1}} +\def\b##1{\realbackslash b {##1}} +\def\key##1{\realbackslash key {##1}} +\def\file##1{\realbackslash file {##1}} +\def\kbd##1{\realbackslash kbd {##1}} +% These are redefined because @smartitalic wouldn't work inside xdef. +\def\i##1{\realbackslash i {##1}} +\def\cite##1{\realbackslash cite {##1}} +\def\var##1{\realbackslash var {##1}} +\def\emph##1{\realbackslash emph {##1}} +\def\dfn##1{\realbackslash dfn {##1}} +} + +\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{\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{\putwordChapter{} \the\chapno: \noexpand\thischaptername}% +{\chapternofonts% +\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\global\let\section = \numberedsec +\global\let\subsection = \numberedsubsec +\global\let\subsubsection = \numberedsubsubsec +}} + +\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}{\putwordAppendix{} \appendixletter}% +\gdef\thissection{#1}% +\gdef\thischaptername{#1}% +\xdef\thischapter{\putwordAppendix{} \appendixletter: \noexpand\thischaptername}% +{\chapternofonts% +\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 +}} + +% @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 +% +% 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% +\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\global\let\section = \unnumberedsec +\global\let\subsection = \unnumberedsubsec +\global\let\subsubsection = \unnumberedsubsubsec +}} + +\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% +\edef\temp{{\realbackslash secentry % +{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\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}% +{\chapternofonts% +\edef\temp{{\realbackslash secentry % +{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsec{\parsearg\unnumberedsecyyy} +\def\unnumberedsecyyy #1{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz #1{\seccheck{unnumberedsec}% +\plainsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +\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% +\edef\temp{{\realbackslash subsecentry % +{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\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}% +{\chapternofonts% +\edef\temp{{\realbackslash subsecentry % +{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsubsec{\parsearg\unnumberedsubsecyyy} +\def\unnumberedsubsecyyy #1{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}% +\plainsubsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +\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}% +{\chapternofonts% +\edef\temp{{\realbackslash subsubsecentry % + {#1} + {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno} + {\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\donoderef % +\penalty 10000 % +}} + +\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} + {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}% +{\chapternofonts% +\edef\temp{{\realbackslash subsubsecentry{#1}% + {\appendixletter} + {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\appendixnoderef % +\penalty 10000 % +}} + +\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubsecyyy} +\def\unnumberedsubsubsecyyy #1{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}% +\plainsubsubsecheading {#1}\gdef\thissection{#1}% +{\chapternofonts% +\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}% +\escapechar=`\\% +\write \contentsfile \temp % +\unnumbnoderef % +\penalty 10000 % +}} + +% 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} +\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz} +\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz} + +\def\infoappendix{\parsearg\appendixzzz} +\def\infoappendixsec{\parsearg\appendixseczzz} +\def\infoappendixsubsec{\parsearg\appendixsubseczzz} +\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz} + +\def\infochapter{\parsearg\chapterzzz} +\def\infosection{\parsearg\sectionzzz} +\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 \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +\def\chapheading{\parsearg\chapheadingzzz} +\def\chapheadingzzz #1{\chapbreak % +{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 200} + +% @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), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\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}} + +\CHAPPAGon + +\def\CHAPFplain{ +\global\let\chapmacro=\chfplain +\global\let\unnumbchapmacro=\unnchfplain +\global\let\centerchapmacro=\centerchfplain} + +% Plain chapter opening. +% #1 is the text, #2 the chapter number or empty if unnumbered. +\def\chfplain#1#2{% + \pchapsepmacro + {% + \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}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% 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 \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\penalty 10000 % +} + +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\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\centerchapmacro=\centerchfopen} + + +% 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}} + +% 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}} + + +% 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 + \pageno = -1 % Request roman numbered pages. + \fi + % 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. + \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 -\contentsrightmargin % Don't use the full line length. +} + + +% Normal (long) toc. +\outer\def\contents{% + \startcontents{\putwordTableofContents}% + \input \jobname.toc + \endgroup + \vfill \eject +} + +% And just the chapters. +\outer\def\summarycontents{% + \startcontents{\putwordShortContents}% + % + \let\chapentry = \shortchapentry + \let\unnumbchapentry = \shortunnumberedentry + % We want a true roman here for the page numbers. + \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{} + \def\subsecentry ##1##2##3##4##5{} + \def\unnumbsubsecentry ##1##2{} + \def\subsubsecentry ##1##2##3##4##5##6{} + \def\unnumbsubsubsecentry ##1##2{} + \input \jobname.toc + \endgroup + \vfill \eject +} +\let\shortcontents = \summarycontents + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% 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{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno{#3}}% +} + +% 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}} + +% Subsections. +\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}} +\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}} + +% And subsubsections. +\def\subsubsecentry#1#2#3#4#5#6{% + \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 +% page number. +% +% 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 \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{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno{#2}}% +\endgroup} + +\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} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\let\subsecentryfonts = \textfonts +\let\subsubsecentryfonts = \textfonts + + +\message{environments,} + +% 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 + +%{\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} +%} + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +\def\point{$\star$} +\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. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} + +\global\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{ + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} + +% The @error{} command. +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\def\tex{\begingroup +\catcode `\\=0 \catcode `\{=1 \catcode `\}=2 +\catcode `\$=3 \catcode `\&=4 \catcode `\#=6 +\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie +\catcode `\%=14 +\catcode 43=12 % plus +\catcode`\"=12 +\catcode`\==12 +\catcode`\|=12 +\catcode`\<=12 +\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\Etex=\endgroup} + +% Define @lisp ... @endlisp. +% @lisp does a \begingroup so it can rebind things, +% including the definition of @endlisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% 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} + +% 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{\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 +} + +% 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 \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 +% First, allow user to change definition object font (\df) internally +\def\setdeffont #1 {\csname DEF#1\endcsname} + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deftypemargin \deftypemargin=12pt +\newskip\deflastargmargin \deflastargmargin=18pt + +\newcount\parencount +% define \functionparens, which makes ( and ) and & do special things. +% \functionparens affects the group it is contained in. +\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. +\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested % +\global\advance\parencount by 1 } +% +% This is the definition of ( when already inside a level of parens. +\gdef\opnested{\char`\(\global\advance\parencount by 1 } +% +\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0. +% also in that case restore the outer-level definition of (. +\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi +\global\advance \parencount by -1 } +% If we encounter &foo, then turn on ()-hacking afterwards +\gdef\amprm#1 {{\rm\}\let(=\oprm \let)=\clrm\ } +% +\gdef\normalparens{\boldbrax\let&=\ampnr} +} % End of definition inside \activeparens +%% These parens (in \boldbrax) actually are a little bolder than the +%% contained text. This is especially needed for [ and ] +\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&} +\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}} + +% First, defname, which formats the header line itself. +% #1 should be the function name. +% #2 should be the type of definition, such as "Function". + +\def\defname #1#2{% +% Get the values of \leftskip and \rightskip as they were +% outside the @def... +\dimen2=\leftskip +\advance\dimen2 by -\defbodyindent +\dimen3=\rightskip +\advance\dimen3 by -\defbodyindent +\noindent % +\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}% +\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line +\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations +\parshape 2 0in \dimen0 \defargsindent \dimen1 % +% Now output arg 2 ("Function" or some such) +% ending at \deftypemargin from the right margin, +% but stuck inside a box of width 0 so it does not interfere with linebreaking +{% Adjust \hsize to exclude the ambient margins, +% so that \rightline will obey them. +\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 +\advance\leftskip by -\defbodyindent +\exdentamount=\defbodyindent +{\df #1}\enskip % Generate function name +} + +% Actually process the body of a definition +% #1 should be the terminating control sequence, such as \Edefun. +% #2 should be the "another name" control sequence, such as \defunx. +% #3 should be the control sequence that actually processes the header, +% such as \defunheader. + +\def\defparsebody #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\activeparens\spacesplit#3}% +\parindent=0in +\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent +\exdentamount=\defbodyindent +\begingroup % +\catcode 61=\active % 61 is `=' +\obeylines\activeparens\spacesplit#3} + +\def\defmethparsebody #1#2#3#4 {\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\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 % +\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\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, +% the second is all of #2 after that space token. +% If #2 contains no space token, all of it is passed as the first arg +% and the second is passed as empty. + +{\obeylines +\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}% +\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{% +\ifx\relax #3% +#1{#2}{}\else #1{#2}{#3#4}\fi}} + +% So much for the things common to all kinds of definitions. + +% Define @defun. + +% First, define the processing that is wanted for arguments of \defun +% Use this to expand the args and terminate the paragraph they make up + +\def\defunargs #1{\functionparens \sl +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +\hyphenchar\tensl=0 +#1% +\hyphenchar\tensl=45 +\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi% +\interlinepenalty=10000 +\advance\rightskip by 0pt plus 1fil +\endgraf\penalty 10000\vskip -\parskip\penalty 10000% +} + +\def\deftypefunargs #1{% +% Expand, preventing hyphenation at `-' chars. +% Note that groups don't affect changes in \hyphenchar. +% 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% +} + +% Do complete processing of one @defun or @defunx line already parsed. + +% @deffn Command forward-char nchars + +\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader} + +\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}% +\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defun == @deffn Function + +\def\defun{\defparsebody\Edefun\defunx\defunheader} + +\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Function}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefun int foobar (int @var{foo}, float @var{bar}) + +\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader} + +% #1 is the data type. #2 is the name and args. +\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax} +% #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 {\defheaderxcond#1\relax$$$#2}{Function}% +\deftypefunargs {#3}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) + +\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 +\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 +} + +% @defmac == @deffn Macro + +\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader} + +\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Macro}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% @defspec == @deffn Special Form + +\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader} + +\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index +\begingroup\defname {#1}{Special Form}% +\defunargs {#2}\endgroup % +\catcode 61=\other % Turn off change made in \defparsebody +} + +% This definition is run if you use @defunx +% anywhere other than immediately after a @defun or @defunx. + +\def\deffnx #1 {\errmessage{@deffnx in invalid context}} +\def\defunx #1 {\errmessage{@defunx in invalid context}} +\def\defmacx #1 {\errmessage{@defmacx in invalid context}} +\def\defspecx #1 {\errmessage{@defspecx in invalid context}} +\def\deftypefnx #1 {\errmessage{@deftypefnx in invalid context}} +\def\deftypeunx #1 {\errmessage{@deftypeunx in invalid context}} + +% @defmethod, and so on + +% @defop {Funny Method} foo-class frobnicate argument + +\def\defop #1 {\def\defoptype{#1}% +\defopparsebody\Edefop\defopx\defopheader\defoptype} + +\def\defopheader #1#2#3{% +\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index +\begingroup\defname {#2}{\defoptype{} on #1}% +\defunargs {#3}\endgroup % +} + +% @defmethod == @defop Method + +\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader} + +\def\defmethodheader #1#2#3{% +\dosubind {fn}{\code{#2}}{on #1}% entry in function index +\begingroup\defname {#2}{Method on #1}% +\defunargs {#3}\endgroup % +} + +% @defcv {Class Option} foo-class foo-flag + +\def\defcv #1 {\def\defcvtype{#1}% +\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype} + +\def\defcvarheader #1#2#3{% +\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index +\begingroup\defname {#2}{\defcvtype{} of #1}% +\defvarargs {#3}\endgroup % +} + +% @defivar == @defcv {Instance Variable} + +\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader} + +\def\defivarheader #1#2#3{% +\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index +\begingroup\defname {#2}{Instance Variable of #1}% +\defvarargs {#3}\endgroup % +} + +% These definitions are run if you use @defmethodx, etc., +% anywhere other than immediately after a @defmethod, etc. + +\def\defopx #1 {\errmessage{@defopx in invalid context}} +\def\defmethodx #1 {\errmessage{@defmethodx in invalid context}} +\def\defcvx #1 {\errmessage{@defcvx in invalid context}} +\def\defivarx #1 {\errmessage{@defivarx in invalid context}} + +% Now @defvar + +% First, define the processing that is wanted for arguments of @defvar. +% This is actually simple: just print them in roman. +% This must expand the args and terminate the paragraph they make up +\def\defvarargs #1{\normalparens #1% +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000} + +% @defvr Counter foo-count + +\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{\defvarparsebody\Edefvar\defvarx\defvarheader} + +\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{Variable}% +\defvarargs {#2}\endgroup % +} + +% @defopt == @defvr {User Option} + +\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader} + +\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index +\begingroup\defname {#1}{User Option}% +\defvarargs {#2}\endgroup % +} + +% @deftypevar int foobar + +\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 {\defheaderxcond#1\relax$$$#2}{Variable}% +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000 +\endgroup} + +% @deftypevr {Global Flag} int enable + +\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader} + +\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}% +\begingroup\defname {\defheaderxcond#2\relax$$$#3}{#1} +\interlinepenalty=10000 +\endgraf\penalty 10000\vskip -\parskip\penalty 10000 +\endgroup} + +% This definition is run if you use @defvarx +% anywhere other than immediately after a @defvar or @defvarx. + +\def\defvrx #1 {\errmessage{@defvrx in invalid context}} +\def\defvarx #1 {\errmessage{@defvarx in invalid context}} +\def\defoptx #1 {\errmessage{@defoptx in invalid context}} +\def\deftypevarx #1 {\errmessage{@deftypevarx in invalid context}} +\def\deftypevrx #1 {\errmessage{@deftypevrx in invalid context}} + +% Now define @deftp +% Args are printed in bold, a slight difference from @defvar. + +\def\deftpargs #1{\bf \defvarargs{#1}} + +% @deftp Class window height width ... + +\def\deftp{\deftpparsebody\Edeftp\deftpx\deftpheader} + +\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}% +\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup} + +% This definition is run if you use @deftpx, etc +% anywhere other than immediately after a @deftp, etc. + +\def\deftpx #1 {\errmessage{@deftpx in invalid context}} + + +\message{cross reference,} +% Define cross-reference macros +\newwrite \auxfile + +\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-pg}{Ypagenumber}% +\dosetq{#1-snt}{Ysectionnumberandtype}} + +\def\unnumbsetref#1{% +\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Ynothing}} + +\def\appendixsetref#1{% +\dosetq{#1-title}{Ytitle}% +\dosetq{#1-pg}{Ypagenumber}% +\dosetq{#1-snt}{Yappendixletterandtype}} + +% \xref, \pxref, and \ref generate cross-references to specified points. +% For \xrefX, #1 is the node name, #2 the name of the Info +% 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{\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 \auxhat% +\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}% +\next}} + +% \internalsetq {foo}{page} expands into +% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...} +% When the aux file is read, ' is the escape character + +\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}} + +% Things to be expanded by \internalsetq + +\def\Ypagenumber{\folio} + +\def\Ytitle{\thissection} + +\def\Ynothing{} + +\def\Ysectionnumberandtype{% +\ifnum\secno=0 \putwordChapter\xreftie\the\chapno % +\else \ifnum \subsecno=0 \putwordSection\xreftie\the\chapno.\the\secno % +\else \ifnum \subsubsecno=0 % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno % +\else % +\putwordSection\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno % +\fi \fi \fi } + +\def\Yappendixletterandtype{% +\ifnum\secno=0 \putwordAppendix\xreftie'char\the\appendixno{}% +\else \ifnum \subsecno=0 \putwordSection\xreftie'char\the\appendixno.\the\secno % +\else \ifnum \subsubsecno=0 % +\putwordSection\xreftie'char\the\appendixno.\the\secno.\the\subsecno % +\else % +\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 + \def\linenumber{\the\inputlineno:\space} +\fi + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. + +\def\refx#1#2{% + \expandafter\ifx\csname X#1\endcsname\relax + % If not defined, say something at least. + $\langle$un\-de\-fined$\rangle$% + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \else + % It's defined, so just use it. + \csname X#1\endcsname + \fi + #2% Output the suffix in any case. +} + +% Read the last existing aux file, if any. No error if none exists. + +% This is the macro invoked by entries in the aux file. +\def\xrdef #1#2{ +{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}} + +\def\readauxfile{% +\begingroup +\catcode `\^^@=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\^^C=\other +\catcode `\^^D=\other +\catcode `\^^E=\other +\catcode `\^^F=\other +\catcode `\^^G=\other +\catcode `\^^H=\other +\catcode `\ =\other +\catcode `\^^L=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode `\=\other +\catcode 26=\other +\catcode `\^^[=\other +\catcode `\^^\=\other +\catcode `\^^]=\other +\catcode `\^^^=\other +\catcode `\^^_=\other +\catcode `\@=\other +\catcode `\^=\other +\catcode `\~=\other +\catcode `\[=\other +\catcode `\]=\other +\catcode`\"=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\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. +% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^ +% Reference to such entries still does not work the way one would wish, +% but at least they do not bomb out when the aux file is read in. +\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 +\endgroup} + + +% Footnotes. + +\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 +% +% 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.} + +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% Set some numeric style parameters, for 8.5 x 11 format. + +\hsize = 6in +\hoffset = .25in +\newdimen\defaultparindent \defaultparindent = 15pt +\parindent = \defaultparindent +\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 + % 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 (or else 7x9.25) +\def\smallbook{ + \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 +} + +\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 +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} + +% This macro is used to make a character print one way in ttfont +% where it can probably just be output, and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% 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 @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt \char '042}} +\let"=\activedoublequote +\catcode`\~=\active +\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\_{\leavevmode \kern.06em \vbox{\hrule width.3em height.1ex}} + +\catcode`\|=\active +\def|{{\tt \char '174}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +%\catcode 27=\active +%\def^^[{$\diamondsuit$} + +% 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 +\global\chardef\rawbackslashxx=`\\ +%{\catcode`\\=\other +%@gdef@rawbackslashxx{\}} + +% \rawbackslash redefines \ as input to do \rawbackslashxx. +{\catcode`\\=\active +@gdef@rawbackslash{@let\=@rawbackslashxx }} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\rawbackslashxx}} + +% Say @foo, not \foo, in error messages. +\escapechar=`\@ + +% \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 +% 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 +% that, assuming it is called before the first `\' could plausibly occur. +% 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 +@catcode`@$=@other @catcode`@%=@other @catcode`@&=@other @catcode`@#=@other + +@textfonts +@rm + +@c Local variables: +@c page-delimiter: "^\\\\message" +@c End: diff --git a/readline/rltty.c b/readline/rltty.c index 2c7e886..a5ef938 100644 --- a/readline/rltty.c +++ b/readline/rltty.c @@ -189,9 +189,7 @@ get_tty_settings (tty, tiop) int tty; TIOTYPE *tiop; { -#if defined (TIOCGWINSZ) set_winsize (tty); -#endif tiop->flags = tiop->lflag = 0; @@ -390,9 +388,7 @@ get_tty_settings (tty, tiop) { int ioctl_ret; -#if defined (TIOCGWINSZ) set_winsize (tty); -#endif while (1) { diff --git a/readline/shell.c b/readline/shell.c index f0ddc89..091ec08 100644 --- a/readline/shell.c +++ b/readline/shell.c @@ -27,7 +27,6 @@ #endif #include -#include #if defined (HAVE_UNISTD_H) # include diff --git a/readline/terminal.c b/readline/terminal.c index a1fcc25..c22ec51 100644 --- a/readline/terminal.c +++ b/readline/terminal.c @@ -186,10 +186,8 @@ _rl_get_screen_size (tty, ignore_env) if (ignore_env == 0 && (ss = get_env_value ("COLUMNS"))) screenwidth = atoi (ss); -#if !defined(__DJGPP__) if (screenwidth <= 0 && term_string_buffer) screenwidth = tgetnum ("co"); -#endif } /* Environment variable LINES overrides setting of "li" if IGNORE_ENV @@ -199,10 +197,8 @@ _rl_get_screen_size (tty, ignore_env) if (ignore_env == 0 && (ss = get_env_value ("LINES"))) screenheight = atoi (ss); -#if !defined(__DJGPP__) if (screenheight <= 0 && term_string_buffer) screenheight = tgetnum ("li"); -#endif } /* If all else fails, default to 80x24 terminal. */ @@ -291,12 +287,10 @@ static void get_term_capabilities (bp) char **bp; { -#if !defined(__DJGPP__) register int i; for (i = 0; i < NUM_TC_STRINGS; i++) *(tc_strings[i].tc_value) = tgetstr (tc_strings[i].tc_var, bp); -#endif tcap_initialized = 1; } @@ -546,20 +540,16 @@ ding () void _rl_enable_meta_key () { -#if !defined(__DJGPP__) if (term_has_meta && term_mm) tputs (term_mm, 1, _rl_output_character_function); -#endif } void _rl_control_keypad (on) int on; { -#if !defined(__DJGPP__) if (on && term_ks) tputs (term_ks, 1, _rl_output_character_function); else if (!on && term_ke) tputs (term_ke, 1, _rl_output_character_function); -#endif } -- cgit v1.1