about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.cvsignore10
-rw-r--r--.distfiles7
-rw-r--r--.lastloc5
-rw-r--r--ChangeLog2328
-rw-r--r--ChangeLog.3.03671
-rw-r--r--Config/.distfiles4
-rw-r--r--Config/clean.mk43
-rw-r--r--Config/config.mk38
-rw-r--r--Config/defs.mk83
-rw-r--r--Config/version.mk31
-rw-r--r--Doc/.cvsignore15
-rw-r--r--Doc/.distfiles16
-rw-r--r--Doc/META-FAQ.yo44
-rw-r--r--Doc/Makefile.in172
-rw-r--r--Doc/Zsh/.distfiles9
-rw-r--r--Doc/Zsh/.lastloc1
-rw-r--r--Doc/Zsh/arith.yo73
-rw-r--r--Doc/Zsh/builtins.yo1184
-rw-r--r--Doc/Zsh/compat.yo69
-rw-r--r--Doc/Zsh/compctl.yo526
-rw-r--r--Doc/Zsh/cond.yo158
-rw-r--r--Doc/Zsh/exec.yo25
-rw-r--r--Doc/Zsh/expn.yo1052
-rw-r--r--Doc/Zsh/filelist.yo15
-rw-r--r--Doc/Zsh/files.yo26
-rw-r--r--Doc/Zsh/func.yo107
-rw-r--r--Doc/Zsh/grammar.yo335
-rw-r--r--Doc/Zsh/guide.yo149
-rw-r--r--Doc/Zsh/index.yo24
-rw-r--r--Doc/Zsh/intro.yo38
-rw-r--r--Doc/Zsh/invoke.yo23
-rw-r--r--Doc/Zsh/jobs.yo91
-rw-r--r--Doc/Zsh/metafaq.yo142
-rw-r--r--Doc/Zsh/mod_cap.yo28
-rw-r--r--Doc/Zsh/mod_clone.yo19
-rw-r--r--Doc/Zsh/mod_comp1.yo11
-rw-r--r--Doc/Zsh/mod_compctl.yo7
-rw-r--r--Doc/Zsh/mod_deltochar.yo12
-rw-r--r--Doc/Zsh/mod_example.yo16
-rw-r--r--Doc/Zsh/mod_files.yo100
-rw-r--r--Doc/Zsh/mod_sched.yo17
-rw-r--r--Doc/Zsh/mod_stat.yo145
-rw-r--r--Doc/Zsh/mod_zftp.yo421
-rw-r--r--Doc/Zsh/mod_zle.yo193
-rw-r--r--Doc/Zsh/modules.yo64
-rw-r--r--Doc/Zsh/options.yo1039
-rw-r--r--Doc/Zsh/params.yo812
-rw-r--r--Doc/Zsh/prompt.yo209
-rw-r--r--Doc/Zsh/redirect.yo183
-rw-r--r--Doc/Zsh/restricted.yo44
-rw-r--r--Doc/Zsh/seealso.yo25
-rw-r--r--Doc/Zsh/zle.yo1076
-rw-r--r--Doc/intro.ms2701
-rw-r--r--Doc/zmacros.yo32
-rw-r--r--Doc/zman.yo192
-rw-r--r--Doc/zsh.yo83
-rw-r--r--Doc/zshbuiltins.yo3
-rw-r--r--Doc/zshcompctl.yo3
-rw-r--r--Doc/zshexpn.yo3
-rw-r--r--Doc/zshmisc.yo12
-rw-r--r--Doc/zshmodules.yo3
-rw-r--r--Doc/zshoptions.yo3
-rw-r--r--Doc/zshparam.yo3
-rw-r--r--Doc/zshzle.yo3
-rw-r--r--Doc/ztexi.yo246
-rw-r--r--Etc/.cvsignore3
-rw-r--r--Etc/.distfiles5
-rw-r--r--Etc/BUGS41
-rw-r--r--Etc/CONTRIBUTORS127
-rw-r--r--Etc/FAQ.yo2018
-rw-r--r--Etc/FEATURES74
-rw-r--r--Etc/FTP-README61
-rw-r--r--Etc/MACHINES94
-rw-r--r--Etc/Makefile.in59
-rw-r--r--Etc/NEWS203
-rw-r--r--Etc/pubring.pgp150
-rw-r--r--Functions/.distfiles5
-rwxr-xr-xFunctions/acx6
-rw-r--r--Functions/cat16
-rwxr-xr-xFunctions/cdmatch23
-rw-r--r--Functions/cdmatch215
-rw-r--r--Functions/checkmail26
-rwxr-xr-xFunctions/cx6
-rwxr-xr-xFunctions/harden6
-rwxr-xr-xFunctions/mere3
-rwxr-xr-xFunctions/multicomp80
-rwxr-xr-xFunctions/proto8
-rw-r--r--Functions/pushd13
-rwxr-xr-xFunctions/randline3
-rwxr-xr-xFunctions/run-help72
-rwxr-xr-xFunctions/yp2
-rwxr-xr-xFunctions/yu2
-rwxr-xr-xFunctions/zed65
-rw-r--r--Functions/zls55
-rw-r--r--INSTALL242
-rw-r--r--Makefile.in124
-rw-r--r--Misc/.distfiles4
-rw-r--r--Misc/.lastloc2
-rwxr-xr-xMisc/c2z128
-rw-r--r--Misc/compctl-examples716
-rwxr-xr-xMisc/globtests107
-rwxr-xr-xMisc/globtests.ksh91
-rwxr-xr-xMisc/lete2ctl301
-rw-r--r--README135
-rw-r--r--acconfig.h221
-rw-r--r--aclocal.m452
-rw-r--r--aczsh.m4433
-rwxr-xr-xconfig.guess698
-rwxr-xr-xconfig.sub924
-rw-r--r--configure.in1113
-rwxr-xr-xinstall-sh238
-rwxr-xr-xmkinstalldirs32
-rw-r--r--patchlist.txt41
113 files changed, 27065 insertions, 0 deletions
diff --git a/.cvsignore b/.cvsignore
new file mode 100644
index 000000000..efdcc4439
--- /dev/null
+++ b/.cvsignore
@@ -0,0 +1,10 @@
+Makefile
+META-FAQ
+config.cache
+config.h
+config.h.in
+config.log
+config.status
+configure
+stamp-h
+stamp-h.in
diff --git a/.distfiles b/.distfiles
new file mode 100644
index 000000000..84316b5e9
--- /dev/null
+++ b/.distfiles
@@ -0,0 +1,7 @@
+DISTFILES_SRC='
+    .cvsignore .distfiles Makefile.in
+    ChangeLog ChangeLog.3.0 INSTALL META-FAQ README
+    acconfig.h aclocal.m4 aczsh.m4 configure.in
+    configure config.h.in stamp-h.in
+    config.guess config.sub install-sh mkinstalldirs
+'
diff --git a/.lastloc b/.lastloc
new file mode 100644
index 000000000..c927e76e2
--- /dev/null
+++ b/.lastloc
@@ -0,0 +1,5 @@
+(("/home/user2/pws/src/zsh-3.1.5/patchlist.txt" . 861)
+ ("/home/user2/pws/src/zsh-3.1.5/patch-match" . 74776)
+ ("/home/user2/pws/src/zsh-3.1.5/sven_fix2.dif" . 6081)
+ ("/home/user2/pws/src/zsh-3.1.5/ci_notes.txt" . 1267)
+ ("/home/user2/pws/src/zsh-3.1.5/configure.in" . 28530))
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 000000000..a1a22e495
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,2328 @@
+Thu Oct 29 21:51:10 1998  Andrew Main  <zefram@zsh.org>
+
+	* Config/version.mk: Version 3.1.5.
+
+	* Doc/Makefile.in, Doc/META-FAQ.yo: Format the plain-ASCII
+	  META-FAQ in a manner consistent with the other plain-ASCII
+	  documents.
+
+	* Src/exec.c: Retry reading from a pipe on EINTR, to avoid
+	  getting truncated output.  (schaefer, u1880)
+
+	* acconfig.h, aczsh.m4, configure.in, Src/compat.c, Src/system.h,
+	  Src/watch.c: New zsh_STRUCT_MEMBER macro for structure member
+	  tests (changes names of some existing preprocessor defines).
+	  Test for d_ino and d_stat in struct dire[nc]t.  New code in
+	  zgetdir() to make use of d_stat if available.
+
+	* Src/params.c, Src/system.h, Src/watch.c: Move definition of
+	  DEFAULT_WATCHFMT into watch.c (where the decision about which
+	  utmp structure to use is made).
+
+	* Doc/Zsh/metafaq.yo: Another mirror (sunsite.doc.ic.ac.uk).
+
+Wed Oct 28 21:02:28 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/builtin.c: More accurate test for ncurses, for the benefit
+	  of systems where ncurses' termcap.h is used.
+
+	* Etc/BUGS, Etc/CONTRIBUTORS, Etc/FEATURES, Etc/MACHINES,
+	  Etc/NEWS, INSTALL, README, Util/zsh-development-guide:
+	  Consistent formatting.
+
+	* Etc/NEWS: List universal-argument and POSIX character classes.
+
+	* Doc/Zsh/metafaq.yo, Etc/CONTRIBUTORS: Use more zsh.org email
+	  addresses.
+
+Tue Oct 27 20:23:18 1998  Andrew Main  <zefram@zsh.org>
+
+	* Etc/FAQ.yo: New version, 1998-10-26.  (pws)
+
+Mon Oct 26 21:13:42 1998  Andrew Main  <zefram@zsh.org>
+
+	* Doc/Zsh/guide.yo, Doc/Zsh/metafaq.yo, Etc/CONTRIBUTORS,
+	  Functions/checkmail, Functions/run-help, Functions/zed,
+	  Misc/compctl-examples, Misc/lete2ctl, README,
+	  Src/Builtins/rlimits.awk, Src/Zle/zle_main.c, Src/makepro.awk,
+	  Src/signames.awk, Util/helpfiles, Util/reporter: Consistently
+	  use zsh.org email addresses where available.  Remove some
+	  stray individual credits from the source, in favour of the
+	  more usual credit in ChangeLog and CONTRIBUTORS files.
+
+	* acconfig.h, configure.in, Src/watch.c: Some systems have ut_tv
+	  in struct utmpx, rather than ut_xtime or ut_time.
+
+Sun Oct 25 21:04:01 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/exec.c: Save and restore simple_pline.  (pws, 4390)
+
+	* Src/loop.c: Set isfirstln to get the right behaviour on ^D
+	  in select.  (pws, 4389)
+
+	* Src/exec.c: Don't fail to AUTO_CD if there is an improperly
+	  hashed external command of the same name.  (pws, 4426;
+	  schaefer, 4434)
+
+	* Src/builtin.c: getopts wasn't resetting all its counters
+	  correctly.  (schaefer, 4416)
+
+	* Src/Zle/zle_tricky.c: Prevent removable suffixes remaining in
+	  effect when a new completion is attempted.
+
+	* Doc/Zsh/compctl.yo: Add an example of usage of n[...] to the
+	  compctl manual.  (pws, u1857)
+
+	* Src/Zle/zle_main.c, Src/Zle/zle_misc.c: Give ungetkey()
+	  external linkage.
+
+	* Doc/Zsh/zle.yo, Src/Zle/zle_misc.c: Make universal-argument
+	  accept a typed integer, EMACS-style.  (pws, 4425)
+
+	* Src/Zle/zle.h, Src/Zle/zle_misc.c: Fix neg-argument.  (pws,
+	  4420)
+
+Sat Oct 17 17:12:31 1998  Andrew Main  <zefram@zsh.org>
+
+	* Doc/Zsh/mod_files.yo: Note that mv won't move across devices.
+
+	* Doc/Zsh/expn.yo: Add some examples to the parameter expansion
+	  section.  (schaefer, 4402)
+
+	* Src/jobs.c: Unset STAT_DONE when adding a process to a job,
+	  in case $() processes finish before all the processes have
+	  been started.  (pws, 4397)
+
+	* Doc/Zsh/builtins.yo, Src/builtin.c, Src/hashtable.c, Src/zsh.h:
+	  type/whence/where/which -w gives machine-readable output.
+	  (pws, 4388)
+
+	* Doc/Zsh/builtins.yo: Document the effect of unset on a local
+	  parameter.
+
+	* Src/params.c: unset should not remove the localness of a
+	  local parameter.  (pws, 4317)
+
+	* Src/compat.c, Src/prototypes.h: Give gethostname() the right
+	  prototype (the length argument is a size_t), and implement it
+	  to spec.
+
+	* Doc/Zsh/metafaq.yo: New address for web-based mailing list
+	  archive (http://www.zsh.org/mla/).
+
+	* Doc/Zsh/metafaq.yo: New mirror (foad.org).
+
+Thu Oct 15 19:07:17 1998  Andrew Main  <zefram@zsh.org>
+
+	* configure.in, Src/Modules/cap.c, Src/utils.c: Check for the
+	  existence of cap_get_proc() rather than cap_init(), because
+	  some systems have a different cap_init().
+
+	* Etc/MACHINES: Format changes.  Removed some entries that didn't
+	  actually contain any intelligible information.
+
+	* Etc/MACHINES: Tested on FreeBSD 2.2.7.  (Roland Jesse
+	  <jesse@prinz-atm.cs.uni-magdeburg.de>, u1770)
+
+	* acconfig.h, configure.in, Src/watch.c: Handle systems where
+	  struct utmpx has a member named ut_time rather than ut_xtime.
+
+	* Src/parse.c: Do not require a separator after esac.  (hzoli,
+	  4376)
+
+	* Doc/Makefile.in: Ignore errors from makeinfo.
+
+	* Src/Zle/zle_thingy.c: Use permanent allocation when executing
+	  widgets.  (schaefer, 4350)
+
+	* Functions/multicomp: Fix for leading tildes; made
+	  case-insensitive.  (schaefer, 4342)
+
+	* Src/Zle/zle_utils.c: Fix an uninitialised pointer in
+	  mkundoent().  (pws, 4315)
+
+	* config.guess: Support Netwinder (arm-unknown-linux).
+	  (Jason Naughton <jnaughto@ee.ryerson.ca>, 4308)
+
+	* configure.in: Dynamic linking on OSF.  (<simond@informix.com>,
+	  4258)
+
+	* Misc/lete2ctl: Update for Perl5.004.  Use compctl -/ and -W.
+	  Some other fixes.  (pws, 4245)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/compctl.yo: Minor typo fixes.
+	  (schaefer, 4232)
+
+	* Src/signals.h: A variable was being modified twice without an
+	  intervening sequence point.  (Gray Watson <gwatson@lycos.com>,
+	  4221)
+
+	* Makefile.in: Remove spurious ";\".  (Gray Watson
+	  <gwatson@lycos.com>, 4221)
+
+Tue Oct 13 21:42:47 1998  Andrew Main  <zefram@zsh.org>
+
+	* Doc/Zsh/expn.yo, Src/glob.c: Add the [:blank:] character class
+	  required by POSIX, which has no corresponding ctype macro.
+
+	* Doc/Zsh/expn.yo, Misc/globtests, Src/glob.c, Src/lex.c:
+	  Add POSIX globbing character classes ([:alnum:] etc.).
+	  (pws, 4209+4212)
+
+Sun Oct 11 20:39:06 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/Zle/zle_tricky.c: Make compctl -S '' work properly (i.e.,
+	  suppress the addition of the default suffix).  (schaefer, u1668)
+
+	* Src/loop.c: Fix the handling of empty user input to select.
+	  (schaefer, 4200)
+
+	* Src/utils.c: Y2K bugfix in %y sequence in ztrftime().
+	  (zefram, 4198)
+
+	* Src/init.c, Src/main.c: Abort on parse errors, except when
+	  reading input from stdin.  (pws, 4191; some semantic changes
+	  by zefram)
+
+	* Misc/compctl-examples: Fix the setopt completion in the case
+	  where KSH_OPTION_PRINT is set.  (schaefer, 4176)
+
+	* Doc/Zsh/compctl.yo: Mention the read builtin in the
+	  documentation of compctl -K.  (sven, 4150)
+
+	* Src/Zle/zle_tricky.c: Fixed a bug where completing in a word
+	  could duplicate part of the word due to it being in both the
+	  common prefix and the common suffix.  (sven, 4147)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/compat.yo, Doc/Zsh/expn.yo,
+	  Doc/Zsh/grammar.yo, Doc/Zsh/intro.yo, Doc/Zsh/options.yo,
+	  Doc/Zsh/params.yo, Doc/Zsh/restricted.yo, Doc/Zsh/zle.yo:
+	  Spelling/typo fixes in documentation.  (schaefer, 4136)
+
+	* Misc/compctl-examples: Better implementations of the CVS
+	  compctl functions.  (schaefer, 4130)
+
+Sun Sep 27 18:31:55 1998  Andrew Main  <zefram@zsh.org>
+
+	* Doc/zsh.yo, Doc/Zsh/builtins.yo, Doc/Zsh/compctl.yo,
+	  Doc/Zsh/expn.yo, Doc/Zsh/grammar.yo, Doc/Zsh/guide.yo,
+	  Doc/Zsh/intro.yo, Doc/Zsh/params.yo, Doc/Zsh/redirect.yo,
+	  Doc/Zsh/zle.yo: Clarification of the expansion documentation.
+	  Several other documentation bugfixes.  (schaefer, 4116)
+
+	* Src/Modules/rlimits.awk: Cosmetic fix of the generated file.
+
+	* Src/Modules/rlimits.awk: Avoid using the sub() function,
+	  which some older awks lack.
+
+	* Doc/Zsh/grammar.yo: List "builtin" as a precommand modifier.
+
+	* Doc/Zsh/builtins.yo: Fuller details of the interaction between
+	  options of the read builtin.  (schaefer, 4109)
+
+	* Src/Modules/stat.c: The ls-style mode string was not being
+	  terminated.  (Goran Larsson <hoh@lorelei.approve.se>, 4105)
+
+	* Src/Zle/zle_hist.c: Make use of repeat count in history
+	  searches.  (wayne, 4104)
+
+	* Src/Zle/zle_hist.c: Some bugfixes and code simplifications
+	  for {vi-,}{up,down}-line-or-{history,search}.  (wayne, 4086)
+
+Sat Sep 26 16:08:53 1998  Andrew Main  <zefram@zsh.org>
+
+	* Etc/zsh-development-guide: Expanded the section on C coding
+	  style.  Added some notes about documentation.
+
+	* configure.in, Src/exec.c, Src/glob.c, Src/hashtable.c,
+	  Src/init.c, Src/params.c, Src/system.h, Src/utils.c,
+	  Src/Modules/stat.c, Src/Zle/zle_tricky.c: Cope with systems
+	  that lack <pwd.h>, <grp.h>, nice(), getpw{ent,nam,uid}(),
+	  getgr{gid,nam}().
+
+	* Doc/Zsh/metafaq.yo: uiarchive now mirrors ftp.zsh.org.
+
+	* Doc/ztexi.yo, Doc/Zsh/expn.yo, Doc/Zsh/options.yo,
+	  Doc/Zsh/redirect.yo, Doc/Zsh/zle.yo: Some minor documentation
+	  fixes.  (schaefer, 4045)
+
+	* Src/hist.c, Src/input.c, Src/parse.c: Simplification and
+	  bugfixes of the input flushing code on history and parse
+	  errors.  (pws, 4172)
+
+	* configure.in: Use "1,$s" instead of ",s" in the generated
+	  ed script, for compatibility with historical systems.
+
+Mon Sep 21 19:16:03 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/Makefile.in: Clean up conditionals in install/uninstall
+	  rules.
+
+	* Config/clean.mk, Config/config.mk, Src/Makemod.in.in: Avoid
+	  empty argument list in for loops, for /bin/sh.
+
+	* aczsh.m4, configure.in, Etc/MACHINES: Check for systems with
+	  broken static/shared library combinations, such as SINIX.
+
+	* Doc/Zsh/params.yo, Src/builtin.c, Src/params.c: Make PWD and
+	  OLDPWD parameters non-special.  (hzoli, 3990; doc by zefram)
+
+	* Src/builtin.c: Don't crash when exporting an unset special
+	  parameter.  (hzoli, 3983)
+
+	* Src/Zle/zle_utils.c: Mark sticks to preceding character instead
+	  of the following one.  (wayne, 3969)
+
+	* Src/builtin.c, Src/init.c, Src/utils.c: Set stdin to read
+	  blockingly where appropriate.  (hzoli, 3950; POSIXification
+	  by zefram)
+
+Mon Sep 14 14:44:32 1998  Andrew Main  <zefram@zsh.org>
+
+	* Makefile.in, configure.in, Config/.distfiles, Config/config.mk,
+	  Config/defs.mk, Config/version.mk, Doc/.cvsignore,
+	  Doc/.distfiles, Doc/Makefile.in, Doc/paths.yo.in,
+	  Doc/zman.yo, Doc/zsh.yo, Doc/ztexi.yo, Doc/Zsh/builtins.yo,
+	  Doc/Zsh/filelist.yo, Doc/Zsh/files.yo, Doc/Zsh/mod_comp1.yo,
+	  Doc/Zsh/modules.yo, Doc/Zsh/options.yo, Doc/Zsh/params.yo,
+	  Etc/Makefile.in, Src/.distfiles, Src/Makefile.in,
+	  Src/Makemod.in.in, Src/version.h, Src/zsh.mdd: Move version
+	  data into a single file, Config/version.mk.  Remove all site
+	  dependencies from the documentation.  Some related Makefile
+	  cleanups.
+
+Sun May 31 09:28:18 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/version.h: Version 3.1.4.
+
+	* Doc/paths.yo.in: New date.
+
+	* configure.in, aczsh.m4, acconfig.h, Src/system.h,
+	  Src/watch.c: Don't confuse utmp and utmpx files.  Don't rely
+	  on having a utmp structure at all.
+
+	* Src/system.h, Src/Modules/clone.c, Src/Modules/files.c,
+	  Src/builtin.c, Src/compat.c, Src/exec.c, Src/hist.c, Src/init.c,
+	  Src/utils.c: Use O_NOCTTY on all open() calls, to get consistent
+	  behaviour (no controlling tty) on all systems.
+
+	* Doc/Zsh/grammar.yo: Correct and clarify the "simple commands &
+	  pipelines" section.  (schaefer, u1548; markup and some additions
+	  by zefram)
+
+	* Src/params.c: When unsetting paired special parameters (e.g.,
+	  CDPATH/cdpath), don't try to remove names that don't exist.
+	  (hzoli, 3974)
+
+Sat May 30 16:16:13 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/system.h: #define _XPG_IV on SINIX (Reliant UNIX).  It is
+	  reported that this is necessary in order to get the right
+	  version of gettimeofday().
+
+	* Doc/Zsh/grammar.yo, Src/lex.c, Src/subst.c, Src/utils.c,
+	  Etc/NEWS: ksh93 $'' syntax.  (hzoli, 3952; documentation
+	  clarifications by zefram)
+
+Thu May 28 21:13:04 1998  Andrew Main  <zefram@zsh.org>
+
+	* Functions/checkmail: Zero-length folders don't count as
+	  containing new mail, regardless of when they've been examined.
+	  (hzoli, 3963)
+
+	* Src/glob.c: When globbing `foo/', stat `foo/.', so that only
+	  directories are matched (as POSIX requires).  With (-T)
+	  qualifier, dangling symlinks should be matched as normal.
+	  With (T-/), etc., stat the pathname *before* modification by
+	  (T).  (hzoli, 3960)
+
+	* Src/Modules/stat.c: Some old K&R compilers don't like automatic
+	  aggregate initialisation.  (hzoli, 3962)
+
+	* Src/glob.c: tail was assumed to be NULL when pattern parsing
+	  was called.  (hzoli, 3961)
+
+	* Src/builtin.c: Fix off-by-one allocation bug in read.
+	  (hzoli, 3951)
+
+	* Src/builtin.c: Cleanup of read builtin.  Also backslash should
+	  quote characters, as well as performing line continuation.
+	  (hzoli, 3949)
+
+	* Src/Zle/zle_tricky.c: Remove prototype cast for
+	  yp_callback.foreach, because on some systems the prototype
+	  is wrong.  (hzoli, 3948)
+
+	* Src/math.c: Avoid an unbalanced stack error on $((0x1+0x1)).
+	  (hzoli, 3947)
+
+	* Src/params.c: PM_UNIQUE should persist across changes of
+	  parameter type.  (hzoli, 3946)
+
+	* Etc/NEWS: List major changes from 3.0.
+
+Tue May 26 21:39:06 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/glob.c, Doc/Zsh/expn.yo: `~' alone should not trigger
+	  globbing.
+
+Mon May 25 21:13:41 1998  Andrew Main  <zefram@zsh.org>
+
+	* Src/mkmakemod.sh, configure.in, aczsh.m4: Link modules against
+	  $(LIBS), and include -lc in $(LIBS), in case a module requires
+	  a function that only exists in static libraries.
+
+	* Src/makepro.awk: Change `\{' to `[{]' in regexps, because some
+	  nawks dislike the former.
+
+	* configure.in: Use tr to avoid giving backslashes to echo
+	  (which may interpret them).
+
+Fri May  1 19:39:12 1998  Andrew Main  <zefram@zsh.org>
+
+	* Doc/Zsh/metafaq.yo: ftp.math.technion.ac.il now mirrors
+	  ftp.zsh.org.
+
+Thu Apr 30 20:19:47 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/version.h: Version 3.1.3.
+
+	* Doc/paths.yo.in: New date.
+
+	* Src/Modules/stat.c: Remove some unused variables.
+
+	* configure.in: Start of configuration for dynamic modules
+	  on netbsd.  (gcw)
+
+	* Doc/Zsh/metafaq.yo: New mirror (ftp.roedu.net).  ftp.cs.elte.hu
+	  and ftp.cenatls.cena.dgac.fr now mirror ftp.zsh.org.
+
+Wed Apr 29 20:24:16 1998  Andrew Main  <zefram@fysh.org>
+
+	* many files: Remove RCS Id lines.
+
+	* Etc/pubring.pgp: Change mason's DSS/DH key.
+
+	* Doc/Zsh/metafaq.yo: New mirror (sunsite.auc.dk).
+	  ftp.math.gatech.edu now mirrors ftp.zsh.org.
+
+Tue Apr 28 23:18:44 1998  Andrew Main  <zefram@fysh.org>
+
+	* Doc/Zsh/metafaq.yo: New primary archive, ftp.zsh.org.
+
+	* Etc/FAQ.yo: New version, 1998-04-24.  (pws)
+
+	* Etc/FTP-README, Etc/pubring.pgp, Etc/.distfiles: Include these
+	  files from the FTP site in the distribution.
+
+	* configure.in, Util/mkdisttree.sh, Config/, Config/clean.mk,
+	  Config/config.mk, Config/defs.mk Makefile.in,
+	  Doc/Makefile.in, Etc/Makefile.in, Functions/Makefile.in,
+	  Misc/Makefile.in, Src/Makefile.in, Src/Makemod.in.in,
+	  StartupFiles/Makefile.in, Util/Makefile.in, .distfiles,
+	  Config/.distfiles, Doc/.distfiles, Doc/Zsh/.distfiles,
+	  Etc/.distfiles, Functions/.distfiles, Misc/.distfiles,
+	  Src/.distfiles, Src/Builtins/.distfiles, Src/Modules/.distfiles,
+	  Src/Zle/.distfiles, StartupFiles/.distfiles, Util/.distfiles:
+	  Modify config.status to add a file inclusion facility;
+	  this is used to remove common code from many Makefiles.
+	  New distribution-building mechanism: `.distfiles' files list
+	  the files to go in the distribution, and Util/mkdisttree.sh
+	  processes these.  As a result, directories in which nothing
+	  is ever built no longer need Makefiles.
+
+Sun Apr 26 22:08:06 1998  Andrew Main  <zefram@fysh.org>
+
+	* configure.in, Src/mkmakemod.sh: Modify config.status to allow
+	  .in files in the build tree.
+
+Sun Apr 26 19:35:17 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/glob.c: Glob patterns with | alternation at the top level
+	  were not setting C_LAST flags correctly.  (zefram, 3876)
+
+Sun Apr 26 13:49:28 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/cond.c, Src/glob.c, Src/system.h, Src/utils.c,
+	  Src/Modules/files.c, Src/Modules/stat.c, Src/Zle/zle_tricky.c:
+	  Use POSIX S_I* macros instead of fixed octal values.  (zefram,
+	  3875)
+
+	* configure.in, Src/params.c, Src/system.h: Don't need configure
+	  test for sizeof(long).
+
+	* configure.in, Src/cond.c, Src/glob.c, Src/system.h,
+	  Src/Modules/files.c, Src/Modules/stat.c, Src/Zle/zle_tricky.c:
+	  Use S_IS* macros in all cases instead of S_IF*.  Define S_IS*
+	  macros for file types that don't exist, to avoid needing
+	  conditionals; support readlink() similarly.  Add more file
+	  type letters to the stat module.  (zefram, 3874)
+
+Sat Apr 25 22:58:34 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/Zle/zle_misc.c: Fix an array overrun in suffix removal,
+	  caused by a signed/unsigned char mixup.  (zefram, 3873)
+
+Sat Apr 25 17:15:32 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/utils.c: Make CHASE_LINKS take effect on cd, as documented.
+	  (zefram, 3872)
+
+	* Misc/globtest, Misc/globtest.ksh, Src/glob.c: Fix for exclusions
+	  nested inside more complex glob patterns.  (pws, 3870)
+
+Thu Apr 23 21:21:29 1998  Andrew Main  <zefram@fysh.org>
+
+	* META-FAQ, Doc/META-FAQ.yo, Doc/Makefile.in, Doc/Zsh/guide.yo,
+	  Doc/Zsh/intro.yo, Doc/Zsh/metafaq.yo, Doc/Zsh/seealso.yo:
+	  Generate the META-FAQ and the related parts of the documentation
+	  from a common source (Doc/Zsh/metafaq.yo).  Updated list of
+	  mirror sites.
+
+	* Src/exec.c: Back out patch 3859.  NO_CLOBBER should allow
+	  opening non-regular files (POSIX.2 clause 3.7.2).  Instead fix
+	  the errno handling.  (zefram, 3869)
+
+Wed Apr 22 21:11:30 1998  Andrew Main  <zefram@fysh.org>
+
+	* Etc/BUGS, Etc/MACHINES: sed is no longer used for generating
+	  prototypes.  We also now know about /proc/self/fd.
+
+	* Misc/compctl-examples: Remove some code to cope with very old
+	  zsh versions.
+
+	* Etc/CONTRIBUTORS, Util/zsh-development-guide, Doc/Zsh/intro.yo,
+	  META-FAQ, README: New coordinator.
+
+	* Src/exec.c: NO_CLOBBER should prevent opening FIFOs, not just
+	  overwriting regular files.  (zefram, 3859)
+
+Wed Apr  8 20:29:28 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/version.h: Version 3.1.2-zefram4.
+
+	* Src/Zle/zle_keymap.c: Bind "^[OA" etc. as well as "^[[A".
+	  Change vi arrow key bindings to match vi practice.  (zefram)
+
+	* Src/jobs.c: Don't read tty settings when ZLE is active.
+	  (pws, 3818)
+
+	* Src/Zle/zle_keymap.c: Don't set errflag in bindkey.  (pws, 3815)
+
+	* Etc/FAQ: New FAQ version, 1998-03-24.  (pws, a76)
+
+	* Misc/compctl-examples: tar completion that lists files in
+	  the archive.  (pws, u1409)
+
+	* Src/glob.c: Fix foo(:s/foo/bar).  (pws, 3808)
+
+	* Src/subst.c: Fix ${i:s/foo/bar}.  (pws, 3806)
+
+	* Doc/Zsh/expn.yo: Mention in the parameter expansion section
+	  that history modifiers can be used.  (pws, 3805)
+
+Mon Apr  6 21:45:30 1998  Andrew Main  <zefram@fysh.org>
+
+	* Doc/Zsh/expn.yo, Doc/Zsh/options.yo, Src/glob.c, Src/options.c,
+	  Src/parse.c: More glob changes:
+	  + remove `-(...)' glob qualifier syntax
+	  + allow normal qualifier syntax with KSH_GLOB
+	  + add option BARE_GLOB_QUAL (emulation-relevant, zsh-only)
+	    that enables glob qualifiers
+	  + remove the paren twiddling when using patterns in [[ ]]
+	    and case
+	  (zefram)
+
+	* Misc/globtests, Misc/globtests.ksh: More tests for exclusions,
+	  which currently don't work properly.  (zefram)
+
+Sun Apr  5 20:00:40 1998  Andrew Main  <zefram@fysh.org>
+
+	* Doc/Zsh/expn.yo, Doc/Zsh/options.yo, Src/glob.c: Glob changes:
+	  + KSH_GLOB doesn't affect parens that are not preceded by the
+	    special characters
+	  + correctly handle combinations like ?(foo)##
+	  + parens always trigger globbing
+	  + with EXTENDED_GLOB, embedded `~' triggers globbing,
+	    as the documentation already states
+	  + remove incorrect special handling of (^...)
+	  + general documentation cleanup
+	  (zefram)
+
+	* Doc/Zsh/expn.yo, Doc/Zsh/options.yo, Misc/globtests,
+	  Misc/globtests.ksh, Src/glob.c, Src/options.c, Src/parse.c,
+	  Src/zsh.h: KSH_GLOB.  (pws, 3764)
+
+Sat Apr  4 15:44:05 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/Zle/zle_tricky.c: expand-or-complete-prefix rewrite.
+	  (pws, 3770)
+
+Wed Mar 25 21:51:15 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/builtin.c: getopts bugfixes.  (bugs pointed out by Bernd
+	  Eggink <eggink@uni-hamburg.de>, 3797)
+
+	* Misc/compctl-examples: Completions for ssh, nslookup, telnet,
+	  ping, finger and gdb.  (<mirar@idonex.se>, u1274; some fiddling)
+
+	* Misc/compctl-examples: pine completion.  (pws, u1359)
+
+Tue Mar 24 21:36:47 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/compat.c, Src/prototypes.h: gettimeofday() returns int,
+	  not void.  (zefram)
+
+	* Misc/compctl-examples: cvs completion.  (<mirar@idonex.se>,
+	  u1243; much fiddling)
+
+	* Misc/compctl-examples: lynx completion.  (Oliver Kiddle
+	  <opk101@cs.york.ac.uk>, 3760; some fiddling for portability)
+
+Mon Mar 23 21:18:11 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/loop.c: Don't reprint the select list after non-empty input.
+	  (Bernd Eggink <eggink@uni-hamburg.de>, 3796)
+
+	* configure.in: Display module compiler flags.  (zefram)
+
+	* Src/signames.awk, Src/Builtins/rlimits.awk: Remove leading
+	  zeros from decimal constants to avoid interpretation as octal.
+
+	* configure.in: define CLOBBERS_TYPEAHEAD for SINIX.  (Andrej
+	  Borsenkow <borsenkow.msk@sni.de>, 3737)
+
+	* Misc/compctl-examples: mount completion.  (Stefan Monnier
+	  <monnier@tequila.systemsz.cs.yale.edu>, u1238)
+
+Sun Mar 22 19:02:04 1998  Andrew Main  <zefram@fysh.org>
+
+	* Doc/Zsh/prompt.yo, Src/utils.c: %L strftime sequence to do %l
+	  without fill.  (pws, 3731)
+
+	* Src/prompt.c, Doc/Zsh/prompt.yo: %L prompt escape for $SHLVL.
+	  (Phil Pennock <bear@dcs.warwick.ac.uk>)
+
+	* Src/Makefile.in: Use LD_RUN_PATH instead of -R.  (Andrej
+	  Borsenkow <borsenkow.msk@sni.de>, 3739)
+
+	* Etc/FAQ: New FAQ version, 1998-03-02.  (pws, a75)
+
+Thu Jan 15 23:28:02 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/makepro.awk, Src/mkmakemod.sh, Src/mkmodindex.sh:
+	  Portability fixes.  (zefram, 3713)
+
+	* configure.in: Test for yp_all(), not getdomainname(), to see
+	  if -lnsl is required.  (zefram, 3715)
+
+	* Makefile.in, Src/Makefile.in, Src/Makemod.in.in: Accept
+	  $(INSTALL) being a relative pathname, set by configure.
+	  (zefram, 3716)
+
+	* configure.in, Src/Makefile.in: More logical name for libzsh.
+	  Install/uninstall/clean libzsh.  Link with a -R option to
+	  indicate where libzsh will be installed.  (zefram, 3714)
+
+	* Src/glob.c: Don't use up more digits in a <-> glob pattern
+	  than the range can match.  There are still several cases that
+	  don't work; backtracking is required.  (pws, 3680)
+
+Sun Jan 11 19:22:13 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/version.h: Version 3.1.2-zefram3.
+
+	* Src/builtins.c: Rewrote getopts to remove its various bugs.
+
+Sun Jan 11 14:22:50 1998  Andrew Main  <zefram@fysh.org>
+
+	* Doc/Makefile.in, Etc/Makefile.in, Functions/Makefile.in,
+	  Makefile.in, Misc/Makefile.in, Src/Makefile.in,
+	  Src/Makemod.in.in, StartupFiles/Makefile.in, Util/Makefile.in:
+	  Pass on all configuration variables to all Makefiles.
+
+	* Src/mkmakemod.sh: Fix $sed_normalise script to allow for
+	  compilation in the source tree.
+
+Sat Jan 10 23:56:33 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/version.h: Version 3.1.2-zefram2.
+
+	* Doc/Zsh/compctl.yo, Src/Zle/comp.h, Src/Zle/comp1.c,
+	  Src/Zle/compctl.c, Src/Zle/zle_tricky.c: compctl -Y is like -X,
+	  but performs expansion on the string.  compctl -y allows the
+	  displayed completions to be user-generated.  (pws, 3636)
+
+Sat Jan 10 16:27:30 1998  Andrew Main  <zefram@fysh.org>
+
+	* Misc/compctl-examples: Use compctl -W where appropriate.
+
+	* Doc/Zsh/compctl.yo, Src/Zle/comp.h, Src/Zle/compctl.c,
+	  Src/Zle/zle_tricky.c: compctl -W applies an invisible prefix
+	  when matching pathnames.  (pws, 3498+3502)
+
+	* Misc/compctl-examples: Use compctl -/ where appropriate.
+
+	* Doc/Zsh/compctl.yo, Src/Zle/comp.h, Src/Zle/compctl.c,
+	  Src/Zle/zle_tricky.c: compctl -/ completes directories in the
+	  manner of -f.  (pws, 3492+3493+3495+3502)
+
+Sat Jan 10 00:36:04 1998  Andrew Main  <zefram@fysh.org>
+
+	* Makefile.in, Src/Makefile.in, Src/Makemod.in.in: make clean
+	  fixes.
+
+Fri Jan  9 21:04:38 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/system.h, Src/zsh.h, Src/utils.c, Src/parse.c: Don't
+	  depend on any relation between sizes of ints and pointers when
+	  duplicating/freeing structures.
+
+	* Src/Zle/zle_refresh.c: Refresh bugfix.  (schaefer, 3511)
+
+	* Util/helpfiles: Updated.  (pws, 3598)
+
+	* Doc/Zsh/intro.yo: Mention the list archives.
+
+	* configure.in: Prefer -lcurses to -ltermcap on HP-UX 10.*.
+	  (pws, 3360)
+
+Fri Jan  9 01:28:46 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/Makefile.in: ansi2knr was being built as a.out.
+
+Wed Jan  7 23:44:16 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/glob.c, Misc/globtests: Backtrack in globbing, to support
+	  nested closures.  (pws, 3513+3514+3515+3525)
+
+	* Doc/Zsh/expn.yo: Clarifications and corrections to the
+	  documentation for history expansion modifiers.  (pws, 3549)
+
+	* Src/subst.c: Fix for a typo that made RC_EXPAND_PARAM expansion
+	  of an empty array go horribly wrong.  (hzoli, 3548)
+
+	* Src/builtin.c, Src/hist.c: Neater method to remove fc commands
+	  from the history list.  (pws, 3531)
+
+	* Src/builtin.c, Src/init.c, Src/main.c: Make $(r) work.
+	  (pws, 3526)
+
+Wed Jan  7 22:17:31 1998  Andrew Main  <zefram@fysh.org>
+
+	* Doc/Zsh/options.yo, Src/Zle/zle_tricky.c: Completion in brace
+	  expansion, with magic suffix removal on `,' and `}' triggered by
+	  AUTO_PARAM_KEYS.  (pws, 3438; suffix code rewritten by zefram)
+
+	* Src/Zle/zle_tricky.c, Doc/Zsh/compctl.yo: Print -X explanation
+	  iff there was not a unique match, rather than iff there were
+	  no matches.  (code: hzoli, 3423.  doc: pws, 3424)
+
+Wed Jan  7 20:44:46 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/init.c, Doc/Zsh/func.yo: preexec shell function is run
+	  immediately before running each command.  (pws, u1068)
+
+	* Src/Zle/zle_main.c: Select keymap earlier; apparently
+	  this avoids a crash in some circumstances.  (Bernd Eggink
+	  <eggink@uni-hamburg.de>, 3625)
+
+	* Src/mem.c: zrealloc() should check for out-of-memory condition.
+	  (hzoli, 3522)
+
+	* Src/subst.c: A fix for `a="a "; print -l ${(o)=a}b'.  (hzoli,
+	  3522)
+
+	* Src/rlimits.awk: Some awks do not like || in the pattern.
+	  (hzoli, 3522)
+
+	* Misc/c2z: Many corrections.  (schaefer, 3484)
+
+	* Doc/Zsh/expn.yo: An extra paragraph explaining RC_EXPAND_PARAM
+	  behaviour.  (pws, 3417; markup brought into line with the rest
+	  of the documentation)
+
+	* Src/zsh.h, Src/subst.c, Src/utils.c: Make parameter expansion
+	  with RC_EXPAND_PARAM behave the same as brace expansion,
+	  and make it make sense.  (hzoli, 3403)
+
+	* Src/parse.c: Fix error recovery on inputs such as
+	  `( [[ $I bug 10 ]] )', which previously got mangled.
+	  (hzoli, 3383)
+
+	* configure.in, Src/Builtins/rlimits.awk: Find and correctly
+	  handle the GNU hurd <resourcebits.h>, which defines RLIMIT_*
+	  in an enum.  (Kunihiro Ishiguro <kunihiro@zebra.org>, 3369)
+
+	* Src/glob.c: restrict leaf optimisation of recursive globs to
+	  the case of nlink == 2.  Some systems don't keep proper link
+	  counts for directories, but will probably distinguish themselves
+	  by having a link count of 1 or 0 for directories.  (hzoli, 3368)
+
+Tue Jan  6 23:29:43 1998  Andrew Main  <zefram@fysh.org>
+
+	* Src/version.h: Version 3.1.2-zefram1.
+
+	* Src/Zle/zle.h, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+	  Src/Zle/zle_tricky.c, Src/Zle/zle_vi.c: Rewrite of the
+	  removable suffix mechanism.  In all cases, the longest possible
+	  meaningful suffix is added, and on following insertions the
+	  minimum trailing part of the suffix removed in order to put
+	  the character in a sensible place.  (zefram, 3353)
+
+	* Doc/Zsh/options.yo, Src/options.c, Src/utils.c, Src/zsh.h:
+	  Option PRINT_EIGHT_BIT, indicates that characters >= 0x80 are
+	  printable, even if isprint() says otherwise.  (pws, 3318)
+
+	* Src/Zle/zle_utils.c: Spaces were getting added to the end of
+	  the line when menu completing.  (pws, 3308)
+
+	* Src/jobs.c: Set STAT_NOSTTY in bg.  The result is that
+	  STAT_NOSTTY is set if a job is ever run backgrounded.
+	  (Suzuki Hisao <suzuki@otsl.oki.co.jp>, 3302)
+
+	* Src/Zle/zle_tricky.c, Src/params.c: A couple of memory leaks.
+	  (pws, 3301)
+
+	* Src/zsh.h, Src/exec.c, Src/jobs.c: New job flag STAT_NOSTTY
+	  means don't inherit the tty settings from this job when it
+	  exits.  Is set on jobs that are started in the background.
+	  (hzoli, 3297)
+
+	* Src/params.c: Keep actual inherited environment strings around
+	  while importing individual variables.  This is required because
+	  the special behaviour when setting $TERM (and potentially
+	  other variables) depends on the value of other variables.
+	  (hzoli, 3293)
+
+	* Src/glob.c: In `*(-M)', the (-) should affect the type of stat
+	  used for (M).  (pws, 3285)
+
+	* Src/Zle/zle_refresh.c: Buffer overrun bug fix.  (gcw, 3260)
+
+	* INSTALL, Makefile.in, configure.in, Src/Makefile.in,
+	  Src/**/*.c, Src/mkbltnmlst.sh, Src/prototypes.h,
+	  Src/signals.h, Src/signames.awk, Src/xmods.conf, Src/zsh.h,
+	  Src/Zle/comp.h, Src/Zle/zle.h, Src/Makemod.in.in,
+	  Src/mkmakemod.sh, Src/mkmodindex.sh, Src/zsh.mdd,
+	  Src/Builtins/rlimits.mdd, Src/Builtins/sched.mdd,
+	  Src/Modules/cap.mdd, Src/Modules/clone.mdd,
+	  Src/Modules/example.mdd, Src/Modules/files.mdd,
+	  Src/Modules/stat.mdd, Src/Zle/comp1.mdd, Src/Zle/compctl.mdd,
+	  Src/Zle/deltochar.mdd, Src/Zle/zle.mdd, Src/conf.sed,
+	  Src/mkstamp.sh, Src/mods.conf, Src/Builtins/Makefile.in,
+	  Src/Modules/Makefile.in, Src/Zle/Makefile.in: Rewrite of
+	  the module build system.  Knowledge specific to each module
+	  is localised in a .mdd file for that module.  Makefiles and
+	  headers are automatically generated.  (zefram, 3252)
+
+	* Src/jobs.c: `disown' was leaking memory.  (pws, 3251)
+
+	* Src/subst.c: `set "$@"' was freeing strings while still needed,
+	  due to paramsubst() not duplicating them.  (zefram, 3250)
+
+	* Src/glob.c: globbing of `foo*r~foob*' was failing, due to
+	  the character before the ~ not being marked as being the end
+	  of a pattern.  (pws, 3249)
+
+	* Src/Zle/zle_tricky.c: AUTO_PARAM_KEYS was adding suffix
+	  characters in the middle of a word if completing within a word.
+	  (hzoli, 3247)
+
+	* Src/params.c: filter out garbage when importing environment
+	  variables.  (hzoli, 3246)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/mod_compctl.yo,
+	  Doc/Zsh/mod_sched.yo, Doc/Zsh/mod_zle.yo: Move documentation
+	  of the standard moduleified builtins into zshmodules(1).
+	  (zefram, 3244)
+
+	* Src/Makefile.in, Src/builtin.c, Src/exec.c, Src/glob.c,
+	  Src/globals.h, Src/hashtable.c, Src/hashtable.h, Src/hist.c,
+	  Src/init.c, Src/input.c, Src/jobs.c, Src/lex.c, Src/loop.c,
+	  Src/makepro.awk, Src/math.c, Src/mem.c, Src/module.c,
+	  Src/options.c, Src/params.c, Src/parse.c, Src/prompt.c,
+	  Src/prototypes.h, Src/signals.c, Src/signals.h,
+	  Src/signames.awk, Src/subst.c, Src/utils.c, Src/zsh.h,
+	  Src/Builtins/Makefile.in, Src/Modules/Makefile.in,
+	  Src/Zle/Makefile.in, Src/Zle/comp.h, Src/Zle/comp1.c,
+	  Src/Zle/zle.h, Src/Zle/zle_hist.c, Src/Zle/zle_keymap.c,
+	  Src/Zle/zle_main.c, Src/Zle/zle_refresh.c, Src/Zle/zle_tricky.c,
+	  Src/Zle/zle_utils.c, Src/Zle/zle_vi.c: Move all object
+	  declarations into .c files, so that they are processed by
+	  makepro.awk.  (zefram, 3243)
+
+	* Src/Makefile.in, Src/builtin.c, Src/exec.c, Src/glob.c,
+	  Src/globals.h, Src/hist.c, Src/init.c, Src/jobs.c,
+	  Src/lex.c, Src/main.c, Src/math.c, Src/mem.c, Src/options.c,
+	  Src/params.c, Src/parse.c, Src/signals.c, Src/watch.c,
+	  Src/zsh.h, Src/Builtins/Makefile.in, Src/Modules/Makefile.in,
+	  Src/Zle/Makefile.in, Src/Zle/zle.h, Src/Zle/zle_bindings.c,
+	  Src/Zle/zle_refresh.c, Src/Zle/zle_tricky.c, Src/makepro.sh,
+	  Src/makepro.awk: Generate prototypes with an awk script, which
+	  handles data declarations as well as functions.  Make data
+	  objects static where appropriate.  (zefram, 3242)
+
+	* Src/builtin.c, Src/exec.c, Src/hashtable.c, Src/hashtable.h,
+	  Src/module.c, Src/zsh.h, Src/Builtins/rlimits.c,
+	  Src/Builtins/sched.c, Src/Modules/cap.c, Src/Modules/clone.c,
+	  Src/Modules/example.c, Src/Modules/files.c, Src/Modules/stat.c,
+	  Src/Zle/compctl.c, Src/Zle/zle_main.c: Use struct builtin
+	  instead of struct binlist, avoiding some dynamic memory
+	  allocation.  (zefram, 3241)
+
+	* configure.in, Src/builtin.c, Src/Builtins/Makefile.in,
+	  Src/Builtins/rlimits.c, Src/Modules/cap.c: Always build the
+	  rlimits module.  (zefram, 3240)
+
+	* Src/builtin.c, Src/globals.h, Src/init.c, Src/input.c,
+	  Src/loop.c, Src/prompt.c, Src/utils.c, Src/Zle/zle.h,
+	  Src/Zle/zle_main.c, Src/Zle/zle_refresh.c: Format prompts once
+	  per editing session, so that they don't get changed improperly.
+	  (zefram, 3239)
+
+	* Doc/Zsh/compat.yo, Doc/Zsh/options.yo, Doc/Zsh/prompt.yo,
+	  Src/options.c, Src/prompt.c, Src/zsh.h: Options PROMPT_PERCENT
+	  and PROMPT_BANG, controlling which type of sequences get
+	  expanded in prompts.  Set appropriately for sh and ksh
+	  emulation.  (zefram, 3052)
+
+	* Doc/Zsh/options.yo, Src/exec.c, Src/options.c, Src/zsh.h:
+	  Option HIST_NO_FUNCTIONS, to exclude function definitions
+	  from the history list.  Option alias NO_LOG (from ksh).
+	  (zefram, 3050)
+
+	* Src/init.c: When emulating sh or ksh, make the default prompts
+	  "$ " (or "# ") and "> ".  (zefram, 3004)
+
+	* Doc/Zsh/options.yo, Src/builtin.c, Src/options.c, Src/utils.c,
+	  Src/zsh.h: Option RM_STAR_WAIT to wait ten seconds at the `rm
+	  *' prompt.  (zefram, 2999)
+
+Tue Jun  3 06:14:14 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.1.2 released
+
+	* Src/params.c: Some compilers do not like ? (void *) :
+
+	* Src/jobs.c: pg(){ less;};:|pg caused suspended (tty input)
+
+Mon Jun  2 07:52:31 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/paths.yo.in: Updated date
+
+	* Doc/paths.yo, Doc/zsh.1, Doc/zsh.texi, Doc/zshall.1,
+ 	  Doc/zshbuiltins.1, Doc/zshcompctl.1, Doc/zshexpn.1,
+ 	  Doc/zshmisc.1, Doc/zshmodules.1, Doc/zshoptions.1,
+ 	  Doc/zshparam.1, Doc/zshzle.1: generated zsh-3.1.2 manuals
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/params.yo: Typo fixes from Tomasz
+ 	  Cholewo (3163)
+
+	* Src/Zle/zle_refresh.c: Xterm cut & paste fixes from Geoff (3135)
+
+	* Src/hist.c: Fix !# history expansion during completion.  From
+ 	  Peter (3132)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/compat.yo, Doc/Zsh/expn.yo,
+ 	  Doc/Zsh/func.yo: Minor documentation fixes from Zefram (3125)
+
+	* Doc/Zsh/guide.yo, Doc/Zsh/intro.yo: The zsh web site moved
+
+	* Etc/FAQ, Etc/FAQ.yo: FAQ from Peter: Id: zshfaq.yo,v 1.6
+ 	  1997/05/29 09:15:00 pws Exp
+
+	* Etc/Makefile.in: Do not make FAQ.yodl by default
+
+	* INSTALL: Instructions about dynamic modules and builtin modules
+
+	* Functions/zls: Improved zll module renamed to zls supporting the
+ 	  ailLFd options
+
+	* Src/glob.c: The T glob flag did not work
+
+Sun Jun  1 08:02:19 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/system.h: Use _POSIX_VDISABLE is available.  Fixes ^@ in zle
+ 	  on some systems.
+
+	* Src/Zle/zle_tricky.c: expand-or-complete-prefix fixed
+
+	* Src/Builtins/rlimits.c, Src/Builtins/sched.c,
+ 	  Src/Modules/clone.c, Src/Modules/example.c, Src/Zle/comp1.c,
+ 	  Src/Zle/compctl.c, Src/Zle/deltochar.c, Src/Zle/zle_hist.c,
+ 	  Src/Zle/zle_keymap.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+ 	  Src/Zle/zle_move.c, Src/Zle/zle_params.c, Src/Zle/zle_refresh.c,
+ 	  Src/Zle/zle_thingy.c, Src/Zle/zle_tricky.c, Src/Zle/zle_utils.c,
+ 	  Src/Zle/zle_vi.c, Src/Zle/zle_word.c, Src/builtin.c,
+ 	  Src/compat.c, Src/cond.c, Src/exec.c, Src/glob.c,
+ 	  Src/hashtable.c, Src/hist.c, Src/init.c, Src/input.c, Src/jobs.c,
+ 	  Src/lex.c, Src/linklist.c, Src/loop.c, Src/main.c, Src/math.c,
+ 	  Src/mem.c, Src/module.c, Src/options.c, Src/params.c,
+ 	  Src/parse.c, Src/prompt.c, Src/prototypes.h, Src/signals.c,
+ 	  Src/subst.c, Src/text.c, Src/utils.c, Src/watch.c: Declare
+ 	  functions used locally in one file static.
+
+Sat May 31 07:29:53 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/comp.h, Src/prototypes.h, Src/makepro.sh,
+ 	  Src/Builtins/Makefile.in, Src/Makefile.in,
+ 	  Src/Modules/Makefile.in, Src/Zle/Makefile.in, Src/Zle/zle.h,
+ 	  Src/module.c: Use fixed names for module make/cleanup funxtions.
+  	  Generate prototypes for static functions.  Ideas from articles
+ 	  3123 and 3124 from Zefram.
+
+Thu May 29 05:17:31 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/cond.c: directories are always executable by root
+
+	* META-FAQ: The zsh web page moved.
+
+	* aclocal.m4, configure, configure.in: --enable-ansi2knr configure
+ 	  option added.  From Zefram (3122)
+
+Tue May 20 05:22:16 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c: if abort or edit used on a correct prompt, do not
+ 	  attempt to correct further words on the line.
+
+Sun May 18 18:57:08 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/exec.c, Src/init.c, Src/signals.c, Src/jobs.c:
+ 	  Do not handle SIGPIPE specially for shells with job control
+
+	* Src/init.c, Src/jobs.c, Src/utils.c: (:); while true; do; done
+ 	  was uninterruptible.  Sometimes LINES/COLUMNS was not set
+ 	  properly for non-interractive shells.
+
+	* Src/exec.c, Src/signals.c: `:`; while true; do; done was
+ 	  uninterruptible
+
+Mon May 12 09:01:55 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* configure, configure.in: on NetBSD <sys/time.h> is needed for
+ 	  rlimit type checks.  From Geoff.
+
+	* Src/hist.c: !:2-1 history expansion caused memory corruption
+
+Sun May 11 08:52:00 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c: $((foo);bar) syntax works
+
+	* Src/hist.c: A terminal hangup caused coredump while saving history
+
+	* Src/globals.h, Src/init.c, Src/params.c: if we cannot get the
+ 	  correct window size with ioctl, set LINES and COLUMNS from
+ 	  termcap.
+
+	* Src/builtin.c: make sure zexit is not reentered when its
+ 	  execution is interrupted by a signal.
+
+Fri May  9 07:59:00 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c: print_if_link (used by whence -s) did not work well.
+
+	* Doc/zsh.texi: @br{} removed
+
+	* Src/exec.c: Quick hack: do not open file redirections if noexec
+ 	  is set
+
+	* Src/jobs.c: printjobs() set errflag when the foreground process
+ 	  was interrupted.
+
+Thu May  8 09:18:56 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/cond.c: [[ -x file ]] does stat for privileged users
+
+	* Src/Zle/zle_utils.c: do no read line[ll] (which is undefined)
+
+	* Src/signals.c: flush the input queue on interrupt
+
+	* Src/lex.c, Src/parse.c: improve parsing of for ((...))
+
+	* Src/Zle/zle_tricky.c, Src/hist.c, Src/lex.c, Src/parse.c:
+	  ((foo);bar) now works
+
+Wed May  7 14:50:08 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/Makefile.in: make clean should delete generated htmls
+
+Tue May  6 06:33:06 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/Makefile.in: rules to create FAQ and FAQ.html from the yodl
+ 	  source
+
+	* Doc/Makefile.in, Doc/Zsh/guide.yo, Doc/Zsh/mod_cap.yo,
+ 	  Doc/Zsh/mod_clone.yo, Doc/Zsh/modules.yo, Doc/Zsh/prompt.yo,
+ 	  Src/Modules/Makefile.in, Src/Modules/cap.c, Src/mods.conf,
+ 	  Src/prompt.c, Src/system.h, Src/utils.c, config.h.in, configure,
+ 	  configure.in: Make the shell aware of POSIX.1e capabilities and
+ 	  add a cap builtin module.  From Zefram (3088)
+
+	* Src/Zle/zle_main.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c: vi
+ 	  line range bugfix from Zefram (3094)
+
+	* Src/signals.c: WINCH traps did not work.  From Peter (3093)
+
+	* Src/hashtable.h, Src/params.c: LC_* parameters stopped working
+ 	  after patch 3014.  From Zefram (3089)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/restricted.yo, Src/builtin.c,
+ 	  Src/hashtable.h: hash builtin fixes from Zefram (3061)
+
+	* Src/Zle/zle_thingy.c, Src/hashtable.c, Src/params.c, Src/zsh.h:
+ 	  Allow adding/deleting nodes during scanhashtable.  From Zefram
+ 	  (3058)
+
+Mon May  5 09:29:22 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hist.c: % word designator fix from Bruce Murphy
+ 	  <packrat@iinet.net.au> (3065)
+
+	* Doc/Zsh/builtins.yo, Src/builtin.c, Src/hashtable.h,
+ 	  Src/utils.c: whence -s prints expanded symlinks (idea from
+ 	  art. 3067 by Juergen A. Erhard <jae@laden.ilk.de>).  Use zputs
+ 	  in whence. xsymlinks return 1 iff it found some symlinks or ../
+ 	  (previously it always returned 0 although it had some
+ 	  never-reached return 1 statements).
+
+	* Src/params.c: zero LINES/COLUMNS should not set narrow/short
+ 	  term.  From Zefram (3063)
+
+	* Src/builtin.c: typeset -R UID caused a coredump
+
+	* Src/globals.h, Src/mem.c, Src/prototypes.h: alloc/ncalloc
+ 	  declarations moved to globals.h.  From Zefram (3057)
+
+	* Doc/Makefile.in, Doc/zsh.yo: doc install and zshall fixes.  From
+ 	  Zefram (3056)
+
+	* Src/prototypes.h, Src/system.h, config.h.in, configure,
+ 	  configure.in: checks for memcpy and memmove.  From Zefram (3055)
+
+	* Doc/Zsh/params.yo: parameter documentation improvements.  From
+ 	  Zefram (3051)
+
+	* Src/utils.c: simplify adjustwinsize().  Based on art. 3053 from
+ 	  Zefram.
+
+	* Src/Zle/zle_main.c, Src/Zle/zle_params.c, Src/builtin.c,
+ 	  Src/exec.c, Src/globals.h, Src/init.c, Src/params.c: remove
+ 	  locallist.  From Zefram (3049)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/guide.yo, Doc/Zsh/params.yo,
+ 	  Src/builtin.c, Src/params.c: local parameters can hide special
+ 	  parameters.  From Zefram (3048)
+
+Sun May  4 06:16:44 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Builtins/Makefile.in, Src/Makefile.in,
+ 	  Src/Modules/Makefile.in, Src/Zle/Makefile.in, aczsh.m4,
+ 	  configure, configure.in: Strip shared modules and executables if
+ 	  possible.  From Zefram (3038)
+
+	* Doc/Zsh/mod_sched.yo, Doc/Zsh/guide.yo, Doc/Zsh/mod_files.yo,
+ 	  Doc/Zsh/mod_stat.yo, Doc/Zsh/modules.yo,
+ 	  Src/Builtins/Makefile.in, Src/Builtins/sched.c, Src/Makefile.in,
+ 	  Src/builtin.c, Src/globals.h, Src/hashtable.h, Src/init.c,
+ 	  Src/linklist.c, Src/mods.conf, Src/utils.c, Src/xmods.conf,
+ 	  Src/zsh.h: The sched builtin moved to a separate module.  From
+ 	  Zefram (3037)
+
+	* Src/Builtins/rlimits.c, Src/prototypes.h, Src/hashtable.h,
+ 	  Src/mods.conf, Src/xmods.conf, Src/Builtins/Makefile.in,
+ 	  Src/Makefile.in, configure, configure.in: Src/Builtins directory
+ 	  created.  rlimits.c moved to Src/Builtins and converted into a
+ 	  loadable module.
+
+Wed Apr 30 07:40:30 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/Zsh/grammar.yo, Src/globals.h, Src/lex.c, Src/loop.c,
+ 	  Src/parse.c, Src/text.c, Src/zsh.h: ksh style ;& case
+ 	  fall-through feature from Zefram (3062)
+
+	* Src/text.c: printing case commands were broken.  From Zefram (3062)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/func.yo, Doc/Zsh/options.yo,
+ 	  Src/builtin.c, Src/exec.c, Src/hashtable.c, Src/options.c,
+ 	  Src/utils.c, Src/zsh.h: KSH_AUTOLOAD option from Zefram (3060)
+
+	* Src/module.c: Do not remove dependencies for a module when it is
+ 	  unloaded. From Zefram (3033)
+
+	* Src/Zle/zle_main.c, Src/Zle/zle_tricky.c, Src/builtin.c,
+ 	  Src/exec.c, Src/utils.c: get{sh,fp}func() return &dummy_list for
+ 	  non-existent functions.  This allows autoloading empty
+ 	  functions.  From Zefram (3036)
+
+	* Src/exec.c: Assume ksh-autoloading only if the autoloaded file
+ 	  is a single function definition.  From Zefram (3032)
+
+	* Src/Makefile.in, Src/mkbltnmlst.sh, Src/mkstamp.sh,
+ 	  Src/xmods.conf, aczsh.m4, configure, configure.in: Link comp1
+ 	  into the main zsh if the system lacks RTDL_GLOBAL functionality.
+  	  From Zefram (3030)
+
+	* config.h.in, configure, aczsh.m4, configure.in, Makefile.in,
+ 	  acconfig.h, aclocal.m4: The config part of the nameclash patch
+ 	  from Zefram (3028).  The code part does not work with ansi2knr.
+
+Mon Apr 28 07:28:34 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/comp.h, Src/Zle/comp1.c, Src/Zle/compctl.c,
+ 	  Src/Zle/deltochar.c, Src/Zle/zle.h, Src/Zle/zle_bindings.c,
+ 	  Src/Zle/zle_hist.c, Src/Zle/zle_keymap.c, Src/Zle/zle_main.c,
+ 	  Src/Zle/zle_misc.c, Src/Zle/zle_move.c, Src/Zle/zle_params.c,
+ 	  Src/Zle/zle_refresh.c, Src/Zle/zle_thingy.c,
+ 	  Src/Zle/zle_tricky.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c,
+ 	  Src/Zle/zle_word.c, Src/builtin.c, Src/globals.h, Src/init.c,
+ 	  Src/zsh.h: move compctl related read stuff global variables from
+ 	  the main binary into the comp1 module.  From Zefram (3029)
+
+	* Src/Zle/zle_tricky.c: Yet an other suffix removal fix from
+ 	  Zefram (3024)
+
+	* Src/builtin.c, Src/system.h, acconfig.h, config.h.in, configure,
+ 	  configure.in, Src/Builtins/rlimits.c: Use rlim_t if available
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/restricted.yo, Src/globals.h,
+ 	  Src/init.c, Src/jobs.c, Src/main.c: jobs -Z documented, improved
+ 	  and disabled in restricted mode.  From Zefram (3027)
+
+	* Doc/Zsh/builtins.yo, Src/hashtable.h, Src/jobs.c: jobs -d prints
+ 	  the working current directory of jobs.  From Peter (2889)
+
+	* Doc/Zsh/restricted.yo, Src/module.c: disallow adding module
+ 	  dependencies with absolute pathnames in restricted mode.  From
+ 	  Zefram (3025)
+
+	* Doc/Zsh/options.yo, Src/options.c: New option aliases to please
+ 	  bash users: dotglob, hashall, histappend, histexpand, mailwarn,
+ 	  onecmd and promptvars.  From Zefram (3026)
+
+	* Etc/FAQ.yo: from Peter: Id: zshfaq.yo,v 1.5 1997/04/24 10:19:15
+ 	  pws Exp
+
+	* Etc/FAQ: April 24 1997 FAQ from Peter
+
+	* Src/Makefile.in, Src/Zle/zle_params.c, Doc/Zsh/zle.yo,
+ 	  Src/Zle/Makefile.in, Src/Zle/zle.h, Src/Zle/zle_main.c,
+ 	  Src/exec.c, Src/hashtable.h, Src/mods.conf, Src/params.c,
+ 	  Src/zsh.h: New special parameters {,L,R}BUFFER, CURSER added
+ 	  only present in zle widget functions.  Virtualised unset method
+ 	  in struct param.  pm->data modev to pm->u.data.  From Zefram
+ 	  (3014)
+
+	* Src/Zle/zle_thingy.c: Fix a memory leak when unloading zle with
+ 	  user-defined widgets.  From Zefram (3015)
+
+	* Src/Zle/zle.h, Src/Zle/zle_hist.c, Src/Zle/zle_main.c,
+ 	  Src/Zle/zle_thingy.c, Src/Zle/zle_tricky.c, Src/builtin.c,
+ 	  Src/globals.h, Src/init.c, Src/input.c, Src/loop.c, Src/utils.c,
+ 	  Src/zsh.h: Remove in_vared and use a third parameter to zleread
+ 	  to allow history recall.  histallowed is a new zle global
+ 	  variable for that.  Rename inzlefunc to incompctlfunc.  Add some
+ 	  checks to avoid dangerous recursive zle calls.  From Zefram
+ 	  (3013)
+
+	* Src/Zle/zle_main.c, Src/Zle/zle_tricky.c: menu completion did
+ 	  not work well with auto_param_keys.  From Zefram (3011)
+
+Sat Apr 26 06:26:11 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Functions/zed: Reenter zed if it fails to save the file
+
+	* Functions/zed: Use bindkey -L to temporarily save bindings.
+  	  From Zefram (3012)
+
+	* Src/builtin.c, Src/init.c: Do not retry failed autoloads.  From
+ 	  Zefram (3010)
+
+	* Src/Makefile.in, Src/mkbltnmlst.sh: non-dynamic zsh can be built
+ 	  without zle.  From Zefram (3008)
+
+	* Doc/Zsh/builtins.yo, Src/module.c: Rearrange modules.c.
+  	  zmodload -qu removes dependencies.  From Zefram (3009)
+
+	* Doc/Zsh/builtins.yo, Src/module.c: zmodload -i -a works as one
+ 	  would expect.  From Zefram (3007)
+
+	* Doc/Zsh/builtins.yo, Src/module.c: zmodload -a argument swap to
+ 	  allow autoloading multiple builtins from a single file in one
+ 	  command.  From Zefram (2997)
+
+Fri Apr 25 06:41:36 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zman.yo: use UPPERCASE yodl macro
+
+	* Functions/cdmatch, Misc/compctl-examples: compctl-examples
+ 	  improvements from Zefram (3006)
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in,
+ 	  Src/Zle/zle_hist.c, Src/Zle/zle_keymap.c, Src/Zle/zle_main.c,
+ 	  Src/Zle/zle_thingy.c: ZLE unload code from Zefram (3005)
+
+	* Src/options.c: NOTIFY is off in sh/ksh mode.  From Zefram (3003)
+
+	* Doc/Zsh/builtins.yo, Doc/Zsh/zle.yo, Misc/compctl-examples,
+ 	  Src/Zle/Makefile.in, Src/Zle/deltochar.c, Src/Zle/iwidgets.list,
+ 	  Src/Zle/zle.h, Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c,
+ 	  Src/Zle/zle_main.c, Src/Zle/zle_misc.c, Src/Zle/zle_move.c,
+ 	  Src/Zle/zle_things.sed, Src/Zle/zle_thingy.c,
+ 	  Src/Zle/zle_tricky.c, Src/Zle/zle_vi.c, Src/Zle/zle_widget.sed,
+ 	  Src/Zle/zle_word.c, Src/xmods.conf: New ZLE widgets allow
+ 	  user-defind ZLE functions.  From Zefram (3002)
+
+	* Src/params.c: ${foo#bar} writes to the value of foo which can be
+	  a const causing SEGV.  From Zefram (2998)
+
+	* Src/Modules/files.c: files module fixes from Zefram (2996)
+
+	* Functions/zll, Src/Modules/Makefile.in, Src/Modules/stat.c,
+ 	  Src/mods.conf: stat module fixes from Zefram (2995)
+
+	* Functions/zll, Src/Modules/stat.c: stat module from Peter (2994)
+
+	* Doc/Makefile.in, Doc/Zsh/compctl.yo, Doc/Zsh/guide.yo,
+ 	  Doc/Zsh/intro.yo, Doc/Zsh/mod_clone.yo, Doc/Zsh/mod_comp1.yo,
+ 	  Doc/Zsh/mod_compctl.yo, Doc/Zsh/mod_deltochar.yo,
+ 	  Doc/Zsh/mod_example.yo, Doc/Zsh/mod_files.yo,
+ 	  Doc/Zsh/mod_stat.yo, Doc/Zsh/mod_zle.yo, Doc/Zsh/modules.yo,
+ 	  Doc/Zsh/seealso.yo, Doc/zsh.yo, Doc/zshmodules.yo: Module
+ 	  documentations from zefram (2994)
+
+Sun Apr 20 07:24:12 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c, Src/params.c, Src/utils.c: Remove setintenv()
+
+Tue Apr 15 05:51:27 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_refresh.c: SGTABTYPE can contain more than one bit
+ 	  set.  From Geoff (2976)
+
+	* Doc/Zsh/prompt.yo, Src/prompt.c, Src/utils.c, Src/watch.c: New
+ 	  escapes %K and %f inside %D{...} promt sequences.  %k and %e are
+ 	  now compatible with strftime().  From Peter (2963)
+
+	* Src/Zle/zle_keymap.c: bindkey -s "^X^L" "^@" produced a pound
+ 	  sterling sign.  From Zefram (2951)
+
+	* Src/Zle/zle_main.c: vared 1 caused a coredump.  From Peter (2909)
+
+	* Src/exec.c, Src/signals.c: execute trap on EXIT in the caller's
+ 	  environment. From Peter (2896)
+
+	* Src/Zle/zle_tricky.c: Autoparamkeys broken by earlier patch
+ 	  fixed.  From Zefram and Peter (2894)
+
+	* Src/Zle/zle_tricky.c: Clear menucur in invalidatelist().  From
+ 	  Peter (2881)
+
+	* Src/Zle/zle_main.c: vared path caused permanent
+ 	  allocation in arrayfixenv
+
+Sat Apr 12 04:27:34 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_misc.c: Overwrite mode did not work
+
+Sat Mar  8 00:17:24 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/compctl.c: Sometimes an incorrect compctl caused a core
+ 	  dump.  From Peter (2942)
+
+Fri Mar  7 23:54:18 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in: zle_binding.pro is not used
+
+	* Src/Zle/zle.h, Src/Zle/zle_main.c, Src/Zle/zle_refresh.c,
+ 	  Src/Zle/zle_tricky.c, Src/Zle/zle_utils.c, Src/builtin.c,
+ 	  Src/globals.h, Src/init.c, Src/params.c, Src/prompt.c,
+ 	  Src/zsh.h: termok changed to termflags.  Modified version of
+ 	  art. 2970 from Geoff
+
+Thu Mar  6 18:06:17 1997  Zoltan T. Hidvegi  <hzoli@vnet.ibm.com>
+
+	* Src/init.c, Src/params.c, Src/utils.c: handle narrow and short
+	  terminals centralized in zlevarsetfn().  From Bart and me
+	  (2956, 2957)
+
+Wed Mar  5 23:37:30 1997  Zoltan T. Hidvegi  <hzoli@vnet.ibm.com>
+
+	* Src/Zle/zle.h, Src/Zle/zle_refresh.c: act as if single_line_zle
+	  were set when LINES < 3.  From Geoff (2865)
+
+	* Doc/zmacros.yo: Use UPPERCASE() yodl macro instead of chartable
+ 	  hacks.  From Zefram (2873)
+
+	* Src/Zle/zle_tricky.c: menu completing parameters removed
+ 	  non-existent / suffix. From Zefram (2872)
+
+	* Src/Zle/zle_bindings.c: Some zle functions did not use
+ 	  ZLE_KEEPSUFFIX.  From Zefram (2871)
+
+	* Src/Zle/Makefile.in, Src/Zle/zle.h: zle_bindings doesn't define
+ 	  any functions so zle_bindings.pro is not needed
+
+	* Src/loop.c: $? was incorrectly reset before executing case,
+	  while, for
+
+Tue Feb 18 20:59:51 1997  Zoltan Hidvegi  <hzoli@vnet.ibm.com>
+
+	* Src/Zle/zle_bindings.c: M-p and M-n defaults to
+	  history-beginning-search-*
+
+	* Src/builtin.c: getopts handling of required argument fix from
+	  Andrew Robinson (2846)
+
+	* Src/builtin.c, Src/globals.h, Src/hist.c, Src/lex.c, Src/zsh.h:
+	  History fixes: fc -AI;fc -R now do not confuse hist_ignore_dups
+	  and some other cleanups from Peter (2845).  Contains changes
+	  from articles 2748 and 2755.
+
+	* Src/signals.c: An #ifdef SIGWINCH was missing.  From Hrvoje
+	  Niksic <hniksic@srce.hr> (2844)
+
+	* Src/Modules/files.c: fix problems on machines with unsigned long
+	  mode_t.  From Zefram (2843)
+
+	* Doc/Makefile.in, Doc/Zsh/builtins.yo, Doc/Zsh/compctl.yo,
+	  Doc/Zsh/expn.yo, Doc/Zsh/guide.yo, Doc/Zsh/prompt.yo,
+	  Doc/Zsh/restricted.yo, Doc/zman.yo, Doc/zsh.yo, Doc/ztexi.yo,
+	  configure.in: Various documentation fixes from Zefram (2842)
+
+	* Src/exec.c: return from a function called from a loop breaked
+	  the loop
+
+	* Src/lex.c: eval \$\{$#\} did not work
+
+Tue Feb 11 20:25:59 1997  Zoltan Hidvegi  <hzoli@cs.elte.hu>
+
+	* config.h.in, Src/compat.c, Src/utils.c, configure, configure.in:
+	  stupid AIX 3.2 does not have fchdir
+
+Tue Jan 28 00:57:37 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.1.1 released
+
+	* Doc/paths.yo, Doc/zsh.1, Doc/zsh.texi, Doc/zshall.1,
+ 	  Doc/zshbuiltins.1, Doc/zshcompctl.1, Doc/zshexpn.1,
+ 	  Doc/zshmisc.1, Doc/zshoptions.1, Doc/zshparam.1, Doc/zshzle.1:
+ 	  yodl generated generated documentation
+
+Mon Jan 27 22:04:29 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/signals.c: temprarily set breaks to zero when executing a trap
+
+	* Src/exec.c: do not reset breaks in doshfunc
+
+	* Src/parse.c: words following for ((...)) are in command position.
+
+Sun Jan 26 23:29:48 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/hashtable.h: fix cd -, use unrecognized
+ 	  option arguments literally
+
+	* Src/exec.c: localoptions should not restore RESTRICTED
+
+	* Src/signals.c: terminate a restricted shell if an untrapped INT
+ 	  signal is received
+
+	* Src/init.c: set noerrexit to -1 in setupvals()
+
+Sat Jan 25 20:07:46 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/subst.c, Src/utils.c: some assignments were missing from my
+ 	  spacesplit fix
+
+	* Etc/FAQ: FAQ from Peter: Id: zsh.FAQ,v 2.23 1997/01/24 13:21:16
+ 	  pws Exp
+
+	* config.h.in, configure, configure.in: check for setsid()
+
+	* Src/Modules/Makefile.in, Src/Modules/clone.c: new builtin: start
+ 	  a forked instance of the current shell on a new terminal
+
+Thu Jan 23 15:45:27 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_refresh.c, Src/globals.h, Src/prompt.c:
+	  redisplay fix for multiline prompts from Geoff (2817)
+
+	* Src/subst.c, Src/utils.c: a${=:- }b expanded to `ab'
+
+	* Doc/Zsh/compctl.yo, Doc/Zsh/guide.yo, Doc/Zsh/options.yo,
+ 	  Doc/Zsh/restricted.yo, Doc/zsh.yo, Doc/zshmisc.yo: RESTRICTED
+ 	  option documentation
+
+	* Doc/Makefile.in: generate everything with yodl
+
+	* Doc/zman.yo, Doc/ztexi.yo: itemize environment added
+
+	* Src/module.c: disable zmodload -a and loading explicitely given
+ 	  modules when restricted
+
+	* Doc/Zsh/zle.yo: what-cursor-position zle function documented
+
+Wed Jan 22 00:54:02 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/Zsh/builtins.yo: cd -sLP documentation
+
+	* Doc/Zsh/builtins.yo, Src/module.c: zmodload -au removes defined
+ 	  but not yet loaded builtins
+
+Tue Jan 21 20:38:24 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/ztexi.yo: sitem() fix for TeX
+
+	* Misc/compctl-examples: limit/unlimit compctl improvemenmt
+
+	* Doc/Zsh/builtins.yo, Doc/ztexi.yo: TeX changes
+
+Mon Jan 20 21:11:22 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hashtable.h, acconfig.h, config.h.in, configure,
+ 	  configure.in: some old compilers cannot initialise a union
+
+	* Src/Zle/zle.h, Src/Zle/zle_keymap.c, Src/options.c: changes for
+ 	  K&R compilers
+
+	* Src/Zle/deltochar.c: deltochar is IN_ZLE
+
+	* Src/Modules/files.c, Src/Zle/zle_misc.c, Src/mem.c: stupid SunOS
+ 	  4 has broken headers
+
+	* Src/system.h: cast alloca in VARARR
+
+	* Src/Zle/zle_bindings.c, Src/Zle/zle_keymap.c,
+ 	  Src/Zle/zle_misc.c: what-cursor-position zle function added
+
+	* Src/Zle/zle_utils.c: move the mark when characters are
+ 	  inserted/deleted.  From Peter (2807)
+
+	* Src/builtin.c, Src/hashtable.h: bash/ksh compatible cd -LP options
+
+	* Src/utils.c: lchdir fix
+
+	* Src/Modules/files.c: rm -r works with arbitrary deep
+ 	  hierarchies.  rm -r can be interrupted
+
+Sun Jan 19 13:30:36 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/glob.c: glob arbitrary deep directory structures
+
+	* Src/mem.c, Src/Zle/zle_keymap.c, Src/subst.c, Src/utils.c,
+	  Src/zsh.h: add real hrealloc()
+
+Sat Jan 18 22:34:17 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_keymap.c: in bindkey -s the string was not zrdupped.
+
+	* Src/utils.c: after Zefram's changes getkeystring should return
+	  the result on the heap
+
+	* Src/utils.c: fix file descriptor leak in lchdir
+
+	* acconfig.h, config.h.in, configure, configure.in: use the
+	  AC_FUNC_STRCOLL builtin autoconf test
+
+	* Src/subst.c, Src/system.h, config.h.in, configure, configure.in:
+	  alloca() and VARARR macro added which defines a variable sized
+	  automatic array
+
+Tue Jan 14 23:17:34 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/glob.c: debugging changes (the change is mostrly reindentation)
+
+	* Src/Zle/zle_move.c: vi-goto-column did not move to the last column
+
+	* Src/glob.c: some old C compilers cannot use typedefed type
+	  defined function prototypes
+
+	* Src/exec.c: PATH=foo somecommand gives error in restricted mode
+
+	* Src/options.c, Src/init.c: the -r command line option turns on
+	  restricted mode
+
+Mon Jan 13 21:28:35 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/exec.c, Src/hashtable.h, Src/init.c,
+	  Src/options.c, Src/params.c, Src/text.c, Src/zsh.h: RESTRICTED
+	  option added
+
+Sun Jan 12 01:00:04 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_tricky.c: automenu starts iff lastambig is true.
+	  From Zefram (2781)
+
+	* Src/Zle/zle.h, Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c,
+	  Src/Zle/zle_main.c, Src/Zle/zle_move.c: add ZLE_LASTCOL flag to
+	  zle-commands which set lastcol.  From Zefram (2780)
+
+	* Src/Zle/deltochar.c, Src/Zle/zle.h, Src/Zle/zle_bindings.c,
+	  Src/Zle/zle_hist.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+	  Src/Zle/zle_tricky.c, Src/Zle/zle_vi.c: zle removable suffix
+	  cleanup.  ZLE_INSERT and ZLE_DELETE is gone and ZLE_KEEPSUFFIX
+	  added for commands which do not remove autoremovable suffixes.
+	  From Zefram (2779)
+
+	* Src/Zle/zle.h, Src/Zle/zle_hist.c, Src/Zle/zle_utils.c: remove
+	  some code duplications and undo fixes.  From Zefram (2769)
+
+Sat Jan 11 23:45:50 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/compat.c: lstat is defined to stat on systems without lstat
+
+	* Src/system.h: define lstat(X,Y) instead of lstst if HAVE_LSTAT
+	  is not defined
+
+	* Src/Zle/zle_tricky.c: ll was not restored for xorrec
+
+	* Src/builtin.c: read -l forgot to duplicate line before assignment
+
+	* Src/jobs.c: do not execute trap when only the child receives the
+	  signal.  Based on article 2480 from Zefram.
+
+	* Src/builtin.c, Src/jobs.c: move job control builtins to jobs.c
+
+	* Src/builtin.c: fix bugs when there was no current job after disown
+
+Thu Jan  9 16:07:31 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/rlimits.c: zstrtorlimit was defined instead of zstrtorlimt
+
+	* Src/Modules/Makefile.in, Src/Zle/Makefile.in: some buggy makes
+	  could not find out how to make .so from .c
+
+Wed Jan  8 22:02:51 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/Zsh/zle.yo, Doc/zsh.texi, Doc/zshzle.man, Src/Zle/zle.h,
+	  Src/Zle/zle_bindings.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+	  Src/Zle/zle_utils.c: zle undo rewrite from Zefram (2746)
+
+	* Src/Zle/zle.h, Src/Zle/zle_hist.c, Src/Zle/zle_main.c,
+	  Src/Zle/zle_misc.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c,
+	  Src/utils.c: feep() just sets a flag and the main zle loop calls
+	  beep() when this flag is set so multiple feeps cause only one
+	  beep.  From Zefram (2745)
+
+	* Src/hist.c, Src/main.c, Src/utils.c: use shout instead of stderr
+	  where appropriate.  From Zefram (2743)
+
+	* configure, configure.in: on NetBSD <sys/time.h> is needed for
+	  rlimit type checks.  Based on article 2742 from Geoff
+
+	* Src/builtin.c: empty cd caused a coredump
+
+	* Doc/Makefile.in: texi -> dvi suffix rule added
+
+	* Doc/Zsh/redirect.yo: fix a typo.  From Zefram (2685)
+
+	* Doc/Zsh/expn.yo, Doc/Zsh/grammar.yo: brace related bugfixes
+
+	* Doc/Makefile.in, Doc/Zsh/arith.yo, Doc/Zsh/builtins.yo,
+	  Doc/Zsh/compat.yo, Doc/Zsh/compctl.yo, Doc/Zsh/cond.yo,
+	  Doc/Zsh/exec.yo, Doc/Zsh/expn.yo, Doc/Zsh/filelist.yo,
+	  Doc/Zsh/files.yo, Doc/Zsh/func.yo, Doc/Zsh/grammar.yo,
+	  Doc/Zsh/guide.yo, Doc/Zsh/index.yo, Doc/Zsh/intro.yo,
+	  Doc/Zsh/invoke.yo, Doc/Zsh/jobs.yo, Doc/Zsh/options.yo,
+	  Doc/Zsh/params.yo, Doc/Zsh/prompt.yo, Doc/Zsh/redirect.yo,
+	  Doc/Zsh/seealso.yo, Doc/Zsh/zle.yo, Doc/paths.yo.in,
+	  Doc/zmacros.yo, Doc/zman.yo, Doc/zsh.yo, Doc/zshbuiltins.yo,
+	  Doc/zshcompctl.yo, Doc/zshexpn.yo, Doc/zshmisc.yo,
+	  Doc/zshoptions.yo, Doc/zshparam.yo, Doc/zshzle.yo, Doc/ztexi.yo:
+	  documentation rewritten into yodl format by Zefram.
+
+Tue Jan  7 23:10:24 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/params.c, Src/builtin.c, Src/exec.c: print error when
+	  changing read-only variables, prevent core dump when assigning
+	  an array to read-only scalar and some other fixes
+
+	* Src/Zle/zle_tricky.c: compctl -S bugfix
+
+Mon Jan  6 20:43:36 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, acconfig.h, config.h.in, configure, configure.in:
+	  better /dev/fd filesystem check
+
+	* Src/Zle/Makefile.in, Src/Zle/zle.h, Src/Zle/zle_tricky.c: make
+	  dependency cleanups
+
+	* Src/Zle/Makefile.in, Src/Zle/zle.h, Src/Zle/zle_keymap.c,
+	  Src/Zle/zle_things.sed: autogenerate the enum of z_* and t_*
+	  macros.  From Zefram (2731)
+
+	* Src/Zle/zle.h, Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c,
+	  Src/Zle/zle_keymap.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+	  Src/Zle/zle_move.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c: zle
+	  prefix commands rewrite from Zefram (2722)
+
+	* Src/Zle/zle.h, Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c:
+	  history-search-*ward serch for complete words.  From Zefram
+	  (2721, 2730)
+
+	* Doc/zsh.texi, Doc/zshbuiltins.man, Src/Zle/zle_keymap.c,
+	  Src/Zle/zle_main.c: remove bindkey -u -U options.  From Zefram
+	  (2711)
+
+	* Src/Zle/Makefile.in, Src/Zle/deltochar.c, Src/Zle/zle.h,
+	  Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c,
+	  Src/Zle/zle_keymap.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+	  Src/Zle/zle_thingy.c, Src/Zle/zle_tricky.c, Src/Zle/zle_vi.c,
+	  Src/mods.conf: first zle extendability patch from Zefram (2710)
+
+Sun Jan  5 23:33:32 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/exec.c: do builtin autoloading in execcmd and
+	  do not ignore BINF_PSPECIAL and BINF_MAGICEQUALS flags for the
+	  builtin being loaded
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in,
+	  Src/builtin.c, Src/prototypes.h, Src/rlimits.c, Src/utils.c:
+	  move limit/ulimit/unlimit builtins to rlimits.c
+
+	* Src/builtin.c, Src/system.h, Src/utils.c, acconfig.h,
+	  config.h.in, configure, configure.in: checks for quad_t and
+	  unsigned resource types
+
+	* Src/Modules/example.c, Src/Modules/files.c: the copyright notice
+	  was different from the rest of the code
+
+	* Src/jobs.c: set_clktck() function added
+
+	* Src/compat.c, Src/Modules/files.c, Src/builtin.c, Src/utils.c,
+	  Src/zsh.h: safe rm and cd which do not follow any symlinks
+
+	* Src/builtin.c, Src/rlimits.awk: safe fallback when RLIM_ macros
+	  are not found
+
+	* Src/Zle/zle_main.c: EOF ignored in interactive mode when not in
+	  the first line.  From Peter (2713)
+
+Fri Jan  3 02:26:03 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Misc/compctl-examples: setopt/unsetopt compctl fixes
+
+	* Src/Zle/comp.h, Src/Zle/comp1.c, Src/Zle/compctl.c,
+	  Src/Zle/zle.h, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+	  Src/mods.conf, Src/xmods.conf, Src/Zle/Makefile.in: compctl base
+	  module.  compctl no longer depends on zle instead both zle and
+	  compctl depends on this new comp1 module.  From Zefram (2700)
+
+	* Src/Zle/zle.h, Src/Zle/zle_keymap.c, Src/Zle/zle_main.c,
+	  Src/Zle/zle_refresh.c, Src/Zle/zle_tricky.c,
+	  Src/Zle/zle_utils.c, Src/utils.c: add showmsg() which displays
+	  an arbitrary message below the ZLE buffer and minibuffer.  From
+	  Zefram (2699)
+
+	* Src/Zle/zle_keymap.c, Src/hashtable.c: omit resize option from
+	  emptytable thus make is available as a generic emptytable
+	  method.  From Zefram (2698)
+
+	* Src/Zle/zle_utils.c: literal ^ characters were not escaped when
+	  printing key sequences.  From Zefram (2689)
+
+	* Src/utils.c: finddir() now can cope with arbitrary long
+	  directories.	From Zefram (2688)
+
+	* Src/prompt.c: my long directories in prompt fix broke prompt
+	  truncation.  From Zefram (2687)
+
+Thu Jan  2 20:57:33 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* configure, configure.in: alpha-linux defines signals in
+	  <asm/signum.h>.  From David Krinsky <krinsky@hcs.harvard.edu>
+	  (2706)
+
+	* Src/Makefile.in: . does not set positional parameters
+
+	* Src/builtin.c, Src/compat.c: zchdir returns -2 when it looses
+	  the current directory.
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in,
+	  Src/Zle/compctl.c, Src/Zle/zle.h, Src/params.c, Src/zsh.h:
+	  header dependencies and inclusions fixes from Zefram (2697)
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in,
+	  Src/conf.sed, Src/mkbltnmlst.sh, Src/mkstamp.sh, Src/mods.conf,
+	  Src/xmods.conf: more Makefile fixes from Zefram (2703)
+
+	* Src/Modules/files.c, Src/utils.c: files module rm -r fixes
+
+	* Src/Modules/files.c: make rm -r safe so that it never follows
+	  symlinks.
+
+	* Src/utils.c (lchdir): paranoid chdir which does not follow
+	  symlinks.  From Zefram (2690)
+
+	* Src/Modules/Makefile.in, Src/Modules/files.c: module with
+	  builtin ln, mkdir, mv, rm, rmdir, sync utilities.  From Zefram
+	  (2621)
+
+	* Src/compat.c: do not use lstat if HAVE_LSTAT is not defined
+
+	* Src/conf.sed, Src/mkbltnmlst.sh, Src/mkstamp.sh: move big shell
+	  scripts from the Makefile to separate files.
+
+Wed Jan  1 20:04:06 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/options.c: remove union initialisation hacks and use optno
+	  for aliases
+
+	* Src/params.c, Src/hashtable.h: remove the struct iparam hack
+	  which assumed that sizeof(long) == sizeof(void*)
+
+	* Src/system.h, configure, configure.in: dgux CLOBBERS_TYPEAHEAD.
+	  From Roderick Schertler <roderick@gate.net> (2623)
+
+Tue Dec 31 02:28:09 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in:
+	  improve proto dependency rules
+
+	* Doc/zshbuiltins.man, Doc/zshzle.man, Src/Zle/Makefile.in,
+	  Src/Zle/zle.h, Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c,
+	  Src/Zle/zle_keymap.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+	  Src/Zle/zle_move.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c,
+	  Src/hashtable.c, Src/mods.conf, Src/utils.c, Util/reporter:
+	  keymap rewrite from Zefram (2648)
+
+	* Src/Makefile.in: avoid using -nt test operator
+
+	* Src/Zle/zle_tricky.c, Src/params.c, Src/utils.c: use
+	  dupstrpfx/ztrduppfx
+
+Mon Dec 30 23:24:46 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in, Src/init.c, Src/mods.conf, Src/xmods.conf:
+	  automatic generation of linked-in module boot code and automatic
+	  autoload code.  From Zefram (2647)
+
+	* Src/utils.c: dupsctruct/freestruct now work even if sizeof(int)
+	  != sizeof(void*)
+
+	* Src/options.c: option initialisation did not work on Alpha
+
+	* Src/Makefile.in: some sh's do not like empty for lists
+
+	* Src/options.c: use short instead of enum
+
+	* Src/globals.h, Src/input.c, Src/lex.c, Src/zsh.h: after alias
+	  foo='echo ' ; alias bar=foo, foo bar should expand to foo echo.
+	  From Peter (2558)
+
+	* Src/compat.c: zgetcwd's result should not be freed
+
+	* Src/prompt.c (putpromptchar): handle long pwd
+
+	* Src/builtin.c, Src/compat.c, Src/init.c: zgetcwd's result should
+	  not be freed
+
+	* Src/glob.c: make functions only called from glob.c static.
+	  Rearrange functions so that they are already defined when first
+	  referenced.
+
+Sun Dec 29 22:34:21 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Doc/zshexpn.man, Doc/zshmisc.man, Src/glob.c,
+	  Src/lex.c: brace related bugfixes
+
+	* Src/glob.c, Src/utils.c: fix a buffer overflow bug in parsecomp()
+
+	* Src/exec.c, Src/loop.c, Src/parse.c: case argument should not be
+	  globbed
+
+Sat Dec 28 19:55:04 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/options.c (optlookup): no prefix was ignored
+
+	* Src/Makefile.in, Src/Modules/example.c, Src/Zle/compctl.c,
+	  Src/Zle/zle_main.c, Src/init.c, Src/module.c, Src/zsh.h:
+	  addbuiltins() and deletebuiltins() functions to add/delete a
+	  group of builtins.  From Zefram (2646)
+
+Fri Dec 27 23:33:20 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Modules/example.c, Src/Zle/compctl.c, Src/Zle/zle_main.c,
+	  Src/init.c, Src/module.c: addbuiltin can now set all members of
+	  the builtin structure.  From Zefram (2643)
+
+	* Src/options.c: set ALWAYSLASTPROMPT, APPENDHISTORY, AUTOLIST,
+	  AUTOMENU, AUTOPARAMKEYS, AUTOPARAMSLASH, AUTOREMOVESLASH,
+	  LISTAMBIGUOUS, LISTTYPES options by default
+
+	* Src/main.c, Src/options.c, Src/zsh.h: use the hastable functions
+	  for optiontab instead of the optns array.
+
+	* Src/exec.c: minor noclobber changes
+
+Thu Dec 26 22:43:13 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, Src/hist.c, Src/lex.c, Src/mem.c, Src/params.c,
+	  Src/subst.c, Src/text.c, Src/utils.c: all "can't happen"
+	  messages start with a BUG: From Zefram (2633)
+
+	* Src/Makefile.in: better rules for version changes
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in:
+	  some Makefile cleanups
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in,
+	  configure, configure.in: use ..o suffix for module objects.
+	  From Zefram (2632)
+
+	* Src/Makefile.in, Src/init.c, Src/zsh.h: only init.o depends on
+	  zshxmods.h.  From Zefram (2631)
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in:
+	  some hacks to get parallel make work.	 From Zefram (2630)
+
+	* Src/Zle/zle.h, Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c,
+	  Src/Zle/zle_main.c, Src/Zle/zle_misc.c, Src/Zle/zle_move.c,
+	  Src/Zle/zle_refresh.c, Src/Zle/zle_tricky.c,
+	  Src/Zle/zle_utils.c, Src/Zle/zle_vi.c, Src/Zle/zle_word.c,
+	  Src/globals.h, Src/init.c, Src/module.c, Src/zsh.h: zle module
+	  autoloading interface cleanup from Zefram (2627)
+
+	* Src/Zle/compctl.c, Src/Zle/zle_main.c: remove unnecessary
+	  contitional code for printcompctlp.  From Zefram (2629)
+
+	* Src/module.c: print error message when module's boot/cleanup
+	  function not found.  From Zefram (2628)
+
+	* Src/module.c: zmodload -L did not handle module names starting
+	  with `-'. From Zefram (2626)
+
+	* Doc/zshbuiltins.man, Src/hashtable.h, Src/module.c,
+	  Util/reporter: zmodload -a lists builtins declared for
+	  autoloading. -L prints everything in sourcable format.  From
+	  Zefram (2620)
+
+	* Src/Zle/zle_main.c, Src/hashtable.c, Src/options.c,
+	  Src/params.c, Src/zsh.h: Make ZSH_HASH_DEBUG less visible.  From
+	  Zefram (2619)
+
+	* Src/builtin.c, Src/compat.c, Src/utils.c: handle arbitrary long
+	  pathnames in pwd
+
+Wed Dec 25 16:04:45 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Doc/zshoptions.man, Src/Makefile.in,
+	  Src/Zle/zle_tricky.c, Src/builtin.c, Src/glob.c, Src/globals.h,
+	  Src/init.c, Src/main.c, Src/params.c, Src/prototypes.h,
+	  Src/utils.c, Src/zsh.h, Src/options.c: New hash table for
+	  options, option aliases.  From Zefram (2612)
+
+Tue Dec 24 02:25:20 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_tricky.c, Src/glob.c, Src/hashtable.c, Src/utils.c:
+	  move . and .. special case handling into zreaddir().	From
+	  Zefram (2617)
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in:
+	  parallel make support gone again as it always rebuilt everything
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Zle/Makefile.in:
+	  More Makefile cleanups.  Parallel make now runs fine
+
+	* Src/Zle/zle.h, Src/Zle/zle_main.c, Src/globals.h, Src/init.c,
+	  Src/main.c, Src/module.c, Src/zsh.h, Src/Makefile.in,
+	  Src/Modules/Makefile.in, Src/Zle/Makefile.in: module makefile
+	  improvements, better support for builtin modules.  From Zefram
+	  (2611)
+
+Sat Dec 21 02:00:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.1.0 released
+
+	* Makefile.in: modifications for the beta series
+
+	* Src/Zle/zle_main.c, Src/globals.h, Src/hist.c, Src/module.c,
+ 	  Src/zsh.h: changes to allow compilation on SunOS 4 with K&R
+ 	  compiler
+
+	* Doc/zsh.texi, Doc/zshbuiltins.man, Src/builtin.c, Src/hashtable.h:
+	  pwd now accepts -L and -P to be compatible with bash and ksh
+
+	* configure, configure.in: SunOS 4 shared libraries do not work
+ 	  when they are stripped
+
+Thu Dec 19 21:27:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c: work around a bug in NeXTStep 3.2 which caused slow
+ 	  refresh
+
+	* Etc/FAQ: FAQ from Peter: Id: zsh.FAQ,v 2.22 1996/12/19 09:52:11
+ 	  pws Exp
+
+Wed Dec 18 23:51:24 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Etc/FAQ, META-FAQ: ftp.prz.tu-berlin.de no longer
+ 	  mirrors zsh, uiarchive.uiuc.edu name correction
+
+Tue Dec 17 20:08:58 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/params.c: remove some compiler varnings
+
+	* Src/Makefile.in: rlimits.h depends on rlimits.awk.  Cosmetic
+ 	  changes.  From Zefram (2589)
+
+Mon Dec 16 03:33:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* README: unknown limits should no longer be a problem
+
+	* Src/glob.c: toggles were not reset after a comma in a glob
+ 	  qualifier list (e.g. *(@-.,/))
+
+	* Src/builtin.c: fg %% failed and disabled job control sometimes
+ 	  when there were no current job
+
+Sun Dec 15 01:07:40 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* README: beta warning
+
+	* Misc/compctl-examples: compctl for zmodload
+
+Sat Dec 14 22:50:00 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_main.c: Remove unnecessary prefix delay in zle.
+  	  From Zefram (2583)
+
+	* Src/exec.c (execcmd): builtin < / > / closed stdin
+
+	* configure, Src/Makefile.in, Src/builtin.c, Src/rlimits.awk,
+ 	  configure.in: awk generated rlimits from Peter (2573)
+
+	* config.guess, config.sub, configure, configure.in: upgrade to
+ 	  autoconf-2.12.  Linux machines are still recognized without the
+ 	  -gnu suffix
+
+	* configure, configure.in: working fifos should be tested in /tmp
+
+Wed Dec 11 02:30:39 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_tricky.c, Src/builtin.c, Src/exec.c, Src/globals.h,
+ 	  Src/hist.c, Src/init.c, Src/input.c, Src/lex.c, Src/zsh.h:
+ 	  remove the alias stack and fix several related bugs. From Peter
+ 	  (2548, 2551)
+
+	* Doc/zsh.texi, META-FAQ: ftp mirror site changes
+
+	* Src/params.c: use the heap in getstrvalue()
+
+Tue Dec 10 02:27:35 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_refresh.c: single line zle refresh bugfix from Geoff
+ 	  (2549)
+
+	* Src/subst.c: ${(l:4:)foo} stopped working between 3.0.0 and 3.0.1
+
+	* Src/math.c: $((#\c)) character code expansion did not work when
+ 	  c was a metafied
+
+	* Src/params.c: $foo[i] did not work when foo[i] was a metafied
+ 	  character
+
+	* Src/builtin.c: use the heap in zexit()
+
+Sun Dec  8 21:32:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c, Doc/zshbuiltins.man, Src/hashtable.h, Src/module.c:
+ 	  zmodload can be used to define atoloaded builtins and module
+ 	  dependencies
+
+	* Doc/zsh.texi, Doc/zshoptions.man: options documentation
+ 	  improvements from Zefram (2529)
+
+	* Src/globals.h, Src/hist.c, Src/zsh.h: HIST_REDUCE_BLANKS from
+ 	  Wayne (2446)
+
+	* Etc/FEATURES, Etc/NEWS: news in zsh-3.1
+
+	* Src/hashtable.h: security: do not import MODULE_PATH
+
+	* Src/input.c: no further input should be attempted when lexstop
+ 	  is true (e.g. after eof).
+
+	* Src/Makefile.in: make tags fix
+
+	* Misc/compctl-examples: MH compctl changes from Peter (2535)
+
+	* Src/Zle/zle_tricky.c, Src/glob.c, Src/hashtable.c, Src/utils.c:
+ 	  unmetafy did not put a null terminator to the end of the string.
+  	  zreaddir discarded the metafied filename.  readdir was used
+ 	  instead of zreaddir in zle_tricky.c.  From Zefram (2533)
+
+	* Src/Zle/zle_vi.c: vi-replace-chars now emulates better the real
+ 	  vi.  From Zefram (2496)
+
+	* Src/jobs.c: CLK_TCK is 60 on NeXT not 64 as defined in the
+ 	  system headers.  From Robert F Tobler
+ 	  <rft@raven.cg.tuwien.ac.at> (2522)
+
+	* Src/input.c, Src/zsh.h: alias foo='a=b foo' ; foo caused an
+ 	  infinite loop.  From Peter (2515)
+
+	* Src/builtin.c, Src/zsh.h: put hash tables to a linked list when
+ 	  hash-debug is enabled and move the simplified bin_hashinfo into
+ 	  hashtable.c.  From Zefram (2509)
+
+	* Src/builtin.c, Src/Zle/compctl.c: more bad option fixes. Make
+ 	  the getopts builtin 8-bit clean.  From Zefram (2508)
+
+	* Src/builtin.c: show metafied characters correctly in bad option
+ 	  errors.  From Zefram (2497)
+
+Thu Dec  5 03:59:45 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in, Src/Modules/Makefile.in, Src/Modules/example.c,
+ 	  Src/Zle/Makefile.in, Src/Zle/deltochar.c, Src/Zle/zle.h,
+ 	  Src/Zle/zle_bindings.c, Src/Zle/zle_hist.c, Src/Zle/zle_main.c,
+ 	  Src/Zle/zle_misc.c, Src/Zle/zle_move.c, Src/Zle/zle_refresh.c,
+ 	  Src/Zle/zle_tricky.c, Src/Zle/zle_utils.c, Src/Zle/zle_vi.c,
+ 	  Src/Zle/zle_word.c, Src/builtin.c, Src/globals.h,
+ 	  Src/hashtable.c, Src/hashtable.h, Src/init.c, Src/input.c,
+ 	  Src/loop.c, Src/main.c, Src/module.c, Src/modules-bltin,
+ 	  Src/prompt.c, Src/prototypes.h, Src/utils.c, Src/zsh.h,
+ 	  configure, configure.in: Move zle into a separate directory and
+ 	  convert it to an optional auto-loadable module.  Create Modules
+ 	  subdirectory.  Many Makefile changes.  boot_modname and
+ 	  cleanup_modname is back since on elf all module use one common
+ 	  name space.  Lots of other changes.
+
+Wed Nov 27 03:20:53 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_main.c, Src/Zle/zle_vi.c: ANSI was broken and fixed
+ 	  again in zle_main.c ESC in vi command mode caused SEGV.  From
+ 	  Zefram (2479)
+
+	* configure, configure.in: -pedantic is used with
+ 	  --enable-zsh-debug.  Link non-debugged zsh with -s.  From Zefram
+ 	  (2479)
+
+Tue Nov 26 02:45:15 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c: the STTY parameter did not work well when pipes were
+ 	  used.  From Peter (2474)
+
+	* Src/Zle/zle_main.c: little fix for the bindkey patch from Peter
+ 	  (2470)
+
+	* Doc/zshbuiltins.man, Src/Zle/zle.h, Src/Zle/zle_bindings.c,
+ 	  Src/Zle/zle_hist.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+ 	  Src/Zle/zle_tricky.c, Src/Zle/zle_vi.c, Src/builtin.c,
+ 	  Src/globals.h, Src/hashtable.c, Src/init.c: big multi-character
+ 	  key bindings fix from Zefram (2464)
+
+	* Doc/zshbuiltins.man, Src/hashtable.h, Src/module.c, Src/zsh.h:
+ 	  The -f option of zmodload is removed.  Improved zmodload
+ 	  documentation.
+
+	* Src/hashtable.h, Doc/zshbuiltins.man, Src/module.c: zmodload
+ 	  with -i will not complain and will succeed without doing
+ 	  anything if an already loaded module is loaded or a non-loaded
+ 	  module is unloaded.  From Zefram (2463)
+
+	* Doc/Makefile.in, Doc/zshbuiltins.man, Doc/zshparam.man: zmodload
+ 	  documentation.  It only appears in the final manual if dynamic
+ 	  modules are enabled.  Note that the texinfo documentation is
+ 	  still missing.  From Zefram (2460)
+
+	* Etc/FAQ: FAQ from Peter: Id: zsh.FAQ,v 2.21 1996/11/25 09:13:28
+ 	  pws Exp
+
+Mon Nov 25 02:39:08 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/module.c: try to load the modules with .DL_EXT appended
+ 	  first.  Honor PATH_DIRS when loading a module.
+
+	* Src/Makefile.in: handle force ruleas as in the top-level Makefile
+
+	* Makefile.in, Src/Makefile.in, Src/init.c: module install added,
+ 	  default module_path is $(libdir)/zsh/$(VERSION).  From Zefram
+ 	  (2458 and 2465 with modifications)
+
+	* Src/Makefile.in: optimized and made more silent
+
+	* Src/Makefile.in, Src/Modules/example.c, Src/Zle/deltochar.c,
+ 	  Src/init.c, Src/main.c, Src/module.c: modules can now statically
+ 	  compiled into zsh.  From Zefram (2455)
+
+Sun Nov 24 22:44:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_move.c: vi-goto-mark fix from Thorsten
+
+	* Src/utils.c: dupnode mergerd into the simplified dupstruct2,
+ 	  freetreenode merged into the simplified freestruct
+
+	* Src/globals.h, Src/text.c, Doc/zsh.texi, Doc/zshmisc.man,
+ 	  Src/lex.c, Src/loop.c, Src/parse.c, Src/utils.c, Src/zsh.h: for
+ 	  ((expr; expr; expr)) command added
+
+Sat Nov 23 23:34:58 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c:
+	  ((...)) substituted the expression twice and coredumped on (())
+
+	* Doc/zsh.texi, Doc/zshcompctl.man: compctl -e clarification from
+ 	  Peter (2453)
+
+	* Src/hist.c (hend): minor cleanup from Wayne (2447)
+
+	* Doc/zsh.texi, Doc/zshzle.man, Src/Zle/zle_hist.c:
+ 	  insert-last-word with numeric arguments inserts the given word
+ 	  from the previous history event.  From Bart (2445),
+ 	  documentation by me.
+
+	* Src/subst.c, acconfig.h, config.h.in, configure, configure.in:
+ 	  added configure check for variable-length automatic arrays
+
+Wed Nov 20 00:58:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c: The spell checker always tries to fix as many
+ 	  leading directory compontents as possible.  From Bart (2429)
+
+	* Src/Zle/zle.h, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+ 	  Src/Zle/zle_tricky.c, Src/Zle/zle_vi.c: the source was not ANSI
+ 	  C compatible.  From Thorsten Meinecke <kaefer@aglaia.aball.DE>
+
+	* Src/Zle/zle_tricky.c: my spell-word fix used an uninitialised
+ 	  pointer.  Fix from Bart (2428)
+
+Sun Nov 17 21:21:22 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in: fix the .SUFFIXES list
+
+	* Src/module.c: do not call dlclose() if cleanup_module failed
+ 	  (returned nonzero)
+
+	* Src/Makefile.in, Src/init.c, Src/main.c, Src/prototypes.h,
+ 	  configure, configure.in: try to support dynamic loading on SVR4
+ 	  systems
+
+	* config.h.in: Makefile and configure fixes from Zefram (2416)
+
+	* Src/params.c: remove a few memory leaks when initialising the
+ 	  parameter table.
+
+	* Src/exec.c, Src/zsh.h: allow arbitrary number of multios.  From
+ 	  Zefram (2414)
+
+	* Src/exec.c, Src/parse.c, Src/text.c, Src/zsh.h: do not convert
+ 	  ((...)) to builtin let internally.
+
+Sat Nov 16 23:57:40 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: spell-word zle function did not work for word
+ 	  beginning with a tilde
+
+	* Src/hist.c: histignoredups ignores insignificant whitespace
+ 	  changes.  From Peter (1949)
+
+	* Src/zle_main.c: execute-last-named-cmd may point to an already
+ 	  removed zle function after a zle module is deleted.  From Zefram
+ 	  (2418)
+
+	* Doc/Makefile.in: give some explanation if the user compiling zsh
+ 	  has no makeinfo
+
+	* configure.in: fix a problem introduced by patch 2338.  From
+ 	  Zefram (2416)
+
+	* Makefile.in, acconfig.h, configure.in: Makefile and configure
+ 	  fixes from Zefram (2416)
+
+	* Src/zle_tricky.c: the cursor moved back on TAB when it was on
+ 	  "".  From Zefram (2415)
+
+Thu Nov 14 12:59:25 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_refresh.c: one more refresh fix from Geoff (2404)
+
+	* Src/Makefile.in, Src/Modules/deltochar.c, Src/Modules/example.c,
+ 	  configure, configure.in: move modules into Src/Modules
+
+Wed Nov 13 21:47:28 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Modules/deltochar.c, Src/Modules/example.c, Src/module.c:
+ 	  unload the module if the boot routine failed
+
+	* config.guess, config.sub: recognize i[6-9]86
+
+	* Src/globals.h, Src/init.c, Src/utils.c: make fdtable dynamic
+
+	* Src/zle_refresh.c: zle_refresh fix from Geoff (2387)
+
+	* Src/zle_refresh.c: some checks added.  From Geoff (2386)
+
+	* Src/zle_refresh.c: fix an off-by-one array bound bug.  From
+ 	  Geoff (2359)
+
+	* Doc/zsh.texi, Doc/zshbuiltins.man, Src/Modules/deltochar.c,
+ 	  Src/hashtable.h, Src/module.c, Src/zle_main.c: handle name
+ 	  clashes when adding zle modules and remove bindings when a zle
+ 	  module is removed.  From Peter (2370)
+
+	* Src/zle_refresh.c: zle_refresh scrolling change from Geoff (2351)
+
+	* Src/Modules/deltochar.c, Src/module.c, Src/zle.h,
+ 	  Src/zle_main.c, Src/zle_misc.c, Src/zle_tricky.c, Src/zle_vi.c:
+ 	  zle function modules from Peter (2339)
+
+Tue Nov 12 21:35:18 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c, Src/zle_refresh.c: zle-refresh patch from Geoff (2336)
+
+	* Src/hashtable.h, Src/module.c: rename modload to zmodload.  From
+ 	  Peter (2333)
+
+	* Src/Makefile.in: added automatic ansi2knr rules
+
+Mon Nov 11 21:55:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in, Src/Modules/example.c, Src/module.c, configure,
+ 	  configure.in: various module changes from Zefram (2338)
+
+	* configure, configure.in: a $ was missing.  IRIX gcc needs
+ 	  -shared for modules.  From Peter
+
+Wed Nov  6 20:54:33 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in, Src/mod_example.c: moduule modifications for
+ 	  old compilers
+
+Sun Nov  3 23:00:05 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/system.h: set OPEN_MAX to 64 if NOFILE is not defined
+
+	* Src/hashtable.c: disable -f TRAPxxx permanently removed the
+	  function
+
+	* Functions/pushd: setopt localoptions must come after
+	  emulate -R zsh
+
+Sat Nov  2 22:47:53 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/compat.c, Src/hashtable.c, Src/utils.c: do not blindly
+ 	  assume that . and .. are always the first two enrties in a
+ 	  directory.  Problem discovered by Hideki ONO and fixed by Bart
+ 	  (2309)
+
+	* Src/utils.c: max_zsh_fd should not be decreased below zero
+
+Thu Oct 31 01:38:10 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Makefile.in, Src/globals.h, Src/hashtable.c,
+ 	  Src/hashtable.h, Src/init.c, Src/mod_example.c, Src/module.c,
+ 	  Src/prototypes.h, Src/zsh.h, acconfig.h, config.h.in, configure,
+ 	  configure.in: support dynamically loaded binary modules
+
+	* Src/hist.c: zsh splitted lines longer than 1022 while reading
+ 	  the history file
+
+	* Src/glob.c (doesmatch): <-number> range glob did not work
+
+	* Src/builtin.c: read -c ignored its first parameter
+
+Fri Oct 25 20:50:38 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0.1 released
diff --git a/ChangeLog.3.0 b/ChangeLog.3.0
new file mode 100644
index 000000000..56aa342a5
--- /dev/null
+++ b/ChangeLog.3.0
@@ -0,0 +1,3671 @@
+Tue Jun  3 06:14:14 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0.3 released
+
+	* Src/params.c: Some compilers do not like ? (void *) :
+
+	* Src/jobs.c: pg(){ less;};:|pg caused suspended (tty input)
+
+Mon Jun  2 07:17:08 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_refresh.c: Xterm cut & paste fixes from Geoff (3135)
+
+	* Src/hist.c: Fix !# history expansion during completion.  From
+ 	  Peter (3132)
+
+Sun Jun  1 08:02:19 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/system.h: Use _POSIX_VDISABLE is available.  Fixes ^@ in zle
+ 	  on some systems.
+
+Thu May 29 05:17:31 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/cond.c: directories are always executable by root
+
+	* META-FAQ: The zsh web page moved.
+
+Tue May 20 05:22:16 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c: if abort or edit used on a correct prompt, do not
+ 	  attempt to correct further words on the line.
+
+Sun May 18 18:57:08 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/exec.c, Src/init.c, Src/signals.c, Src/jobs.c:
+ 	  Do not handle SIGPIPE specially for shells with job control
+
+	* Src/init.c, Src/jobs.c, Src/utils.c: (:); while true; do; done
+ 	  was uninterruptible.  Sometimes LINES/COLUMNS was not set
+ 	  properly for non-interractive shells.
+
+	* Src/exec.c, Src/signals.c: `:`; while true; do; done was
+ 	  uninterruptible
+
+Mon May 12 09:01:55 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hist.c: !:2-1 history expansion caused memory corruption
+
+Sun May 11 08:52:00 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c: $((foo);bar) syntax works
+
+	* Src/hist.c: A terminal hangup caused coredump while saving history
+
+	* Src/globals.h, Src/init.c, Src/params.c: if we cannot get the
+ 	  correct window size with ioctl, set LINES and COLUMNS from
+ 	  termcap.
+
+	* Src/builtin.c: make sure zexit is not reentered when its
+ 	  execution is interrupted by a signal.
+
+Fri May  9 07:59:00 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi: @br{} removed
+
+	* Src/exec.c: Quick hack: do not open file redirections if noexec
+ 	  is set
+
+	* Src/jobs.c: printjobs() set errflag when the foreground process
+ 	  was interrupted.
+
+Thu May  8 09:18:56 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/cond.c: [[ -x file ]] does stat for privileged users
+
+	* Src/Zle/zle_utils.c: do no read line[ll] (which is undefined)
+
+	* Src/signals.c: flush the input queue on interrupt
+
+	* Src/Zle/zle_tricky.c, Src/hist.c, Src/lex.c, Src/parse.c:
+	  ((foo);bar) now works
+
+Tue May  6 05:56:36 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/signals.c: WINCH traps did not work.  From Peter (3093)
+
+Wed Apr 30 07:40:30 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/text.c: printing case commands were broken.  From Zefram (3062)
+
+Mon Apr 28 07:28:34 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/system.h, acconfig.h, config.h.in, configure,
+ 	  configure.in, Src/Builtins/rlimits.c: Use rlim_t if available
+
+	* Etc/FAQ: March 24 1997 FAQ from Peter
+
+Sat Apr 26 06:26:11 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Functions/zed: Reenter zed if it fails to save the file
+
+	* Functions/zed: Use bindkey -L to temporarily save bindings.
+  	  From Zefram (3012)
+
+Fri Apr 25 06:41:36 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Functions/cdmatch, Misc/compctl-examples: compctl-examples
+ 	  improvements from Zefram (3006)
+
+	* Src/globals.h: NOTIFY is off in sh/ksh mode.  From Zefram (3003)
+
+Sun Apr 20 07:24:12 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c, Src/params.c, Src/utils.c: Remove setintenv()
+
+Tue Apr 15 05:51:27 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_refresh.c: SGTABTYPE can contain more than one bit
+ 	  set.  From Geoff (2976)
+
+	* Src/builtin.c: vared 1 caused a coredump.  From Peter (2909)
+
+	* Src/exec.c, Src/signals.c: execute trap on EXIT in the caller's
+ 	  environment. From Peter (2896)
+
+	* Src/builtin.c: vared path caused permanent
+ 	  allocation in arrayfixenv
+
+Sat Mar  8 00:17:24 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: Sometimes an incorrect compctl
+ 	  caused a core dump.  From Peter (2942)
+
+	* Src/Zle/zle.h, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
+ 	  Src/Zle/zle_refresh.c, Src/Zle/zle_tricky.c, Src/builtin.c,
+ 	  Src/globals.h, Src/init.c, Src/params.c, Src/zsh.h: termok
+ 	  changed to termflags.  Modified version of art. 2970 from Geoff
+
+	* Src/init.c, Src/params.c, Src/utils.c: handle narrow and short
+ 	  terminals centralized in zlevarsetfn().  From Bart and me (2956,
+ 	  2957)
+
+Fri Mar  7 23:54:18 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle.h, Src/Zle/zle_misc.c, Src/Zle/zle_refresh.c,
+	  Src/utils.c: act as if single_line_zle were set when LINES < 3.
+	  From Geoff (2865)
+
+Wed Mar  5 23:37:30 1997  Zoltan T. Hidvegi  <hzoli@vnet.ibm.com>
+
+	* Src/loop.c: $? was incorrectly reset before executing case,
+	  while, for
+
+Tue Feb 18 20:59:51 1997  Zoltan Hidvegi  <hzoli@vnet.ibm.com>
+
+	* Src/builtin.c: getopts handling of required argument fix from
+	  Andrew Robinson (2846)
+
+	* Src/signals.c: An #ifdef SIGWINCH was missing.  From Hrvoje
+	  Niksic <hniksic@srce.hr> (2844)
+
+	* Src/exec.c: return from a function called from a loop breaked
+	  the loop
+
+	* Src/lex.c: eval \$\{$#\} did not work
+
+Mon Jan 27 22:04:29 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/signals.c: temprarily set breaks to zero when executing a trap
+
+	* Src/exec.c: do not reset breaks in doshfunc
+
+Sun Jan 26 02:55:02 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c: set noerrexit to -1 in setupvals()
+
+Sat Jan 25 20:07:46 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/subst.c, Src/utils.c: some assignments were missing from my
+ 	  spacesplit fix
+
+	* Etc/FAQ: FAQ from Peter: Id: zsh.FAQ,v 2.23 1997/01/24 13:21:16
+ 	  pws Exp
+
+	* Src/Zle/zle.h, Src/Zle/zle_misc.c, Src/Zle/zle_refresh.c:
+ 	  redisplay fix for multiline prompts from Geoff (2817)
+
+Mon Jan 20 21:11:22 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hashtable.h, acconfig.h, config.h.in, configure,
+ 	  configure.in: some old compilers cannot initialise a union
+
+	* Src/Zle/zle_utils.c: move the mark when characters are
+	  inserted/deleted.  From Peter (2807)
+
+Sat Jan 18 22:34:17 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* acconfig.h, config.h.in, configure, configure.in: use the
+ 	  AC_FUNC_STRCOLL builtin autoconf test
+
+Tue Jan 14 13:52:36 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_move.c: vi-goto-column did not move to the last column
+
+Sat Jan 11 23:45:50 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/system.h: define lstat(X,Y) instead of lstst if HAVE_LSTAT
+ 	  is not defined
+
+	* Src/Zle/zle_tricky.c: ll was not restored for xorrec
+
+	* Src/builtin.c: read -l forgot to duplicate line before assignment
+
+	* Src/jobs.c: do not execute trap when only the child receives the
+ 	  signal.  Based on article 2480 from Zefram.
+
+	* Src/builtin.c: fix bugs when there was no current job after disown
+
+Thu Jan  9 14:44:28 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hist.c: Peter's patch broke history expansion in some cases.
+  	  From Peter (2755)
+
+Wed Jan  8 22:02:51 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/globals.h, Src/hist.c, Src/lex.c: hist_ignore_dups did not
+ 	  work with fc in precmd().  From Peter (2748)
+
+	* configure, configure.in: on NetBSD <sys/time.h> is needed for
+ 	  rlimit type checks.  Based on article 2742 from Geoff
+
+Tue Jan  7 23:10:24 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/params.c, Src/builtin.c, Src/exec.c: print error when
+	  changing read-only variables, prevent core dump when assigning
+	  an array to read-only scalar and some other fixes
+
+	* Src/Zle/zle_tricky.c: compctl -S bugfix
+
+Mon Jan  6 20:43:36 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, acconfig.h, config.h.in, configure, configure.in:
+	  better /dev/fd filesystem check
+
+Sun Jan  5 23:33:32 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/system.h, Src/utils.c, acconfig.h,
+ 	  config.h.in, configure, configure.in: checks for quad_t and
+ 	  unsigned resource types
+
+	* Src/jobs.c: set_clktck() function added
+
+	* Src/builtin.c, Src/rlimits.awk: safe fallback when RLIM_ macros
+ 	  are not found
+
+	* Src/Zle/zle_main.c: EOF ignored in interactive mode when not in
+ 	  the first line.  From Peter (2713)
+
+Fri Jan  3 02:26:03 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Misc/compctl-examples: setopt/unsetopt compctl fixes
+
+Thu Jan  2 20:57:33 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* configure, configure.in: alpha-linux defines signals in
+ 	  <asm/signum.h>.  From David Krinsky <krinsky@hcs.harvard.edu>
+ 	  (2706)
+
+Wed Jan  1 20:04:06 1997  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/params.c, Src/hashtable.h: remove the struct iparam hack
+ 	  which assumed that sizeof(long) == sizeof(void*)
+
+	* Src/system.h, configure, configure.in: dgux CLOBBERS_TYPEAHEAD.
+  	  From Roderick Schertler <roderick@gate.net> (2623)
+
+Tue Dec 31 02:28:09 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_tricky.c, Src/params.c, Src/utils.c: use
+ 	  dupstrpfx/ztrduppfx
+
+	* Src/globals.h, Src/input.c, Src/lex.c, Src/zsh.h: after alias
+ 	  foo='echo ' ; alias bar=foo, foo bar should expand to foo echo.
+  	  From Peter (2558)
+
+Sun Dec 29 22:34:21 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Doc/zshexpn.man, Doc/zshmisc.man, Src/glob.c,
+ 	  Src/lex.c: brace related bugfixes
+
+	* Src/glob.c, Src/utils.c: fix a buffer overflow bug in parsecomp()
+
+	* Src/exec.c, Src/loop.c, Src/parse.c: case argument should not be
+ 	  globbed
+
+Thu Dec 19 21:37:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* zsh-3.0.2 repacked
+
+	* Src/init.c: work around a bug in NeXTStep 3.2 which caused slow
+ 	  refresh
+
+	* Etc/FAQ: FAQ from Peter: Id: zsh.FAQ,v 2.22 1996/12/19 09:52:11
+ 	  pws Exp
+
+Tue Dec 17 20:08:58 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0.2 released
+
+	* Src/params.c: remove some compiler varnings
+
+	* Src/Makefile.in: rlimits.h depends on rlimits.awk.  Cosmetic
+ 	  changes.  From Zefram (2589)
+
+Mon Dec 16 03:33:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* README: unknown limits should no longer be a problem
+
+	* Src/glob.c: toggles were not reset after a comma in a glob
+ 	  qualifier list (e.g. *(@-.,/))
+
+	* Src/builtin.c: fg %% failed and disabled job control sometimes
+ 	  when there were no current job
+
+Sun Dec 15 22:09:21 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Doc/zshzle.man, Src/Zle/zle_hist.c:
+ 	  insert-last-word with numeric arguments inserts the given word
+ 	  from the previous history event.  From Bart (2445),
+ 	  documentation by me.
+
+Sat Dec 14 02:44:21 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c (execcmd): builtin < / > / closed stdin
+
+	* configure, Src/Makefile.in, Src/builtin.c, Src/rlimits.awk,
+ 	  configure.in: awk generated rlimits from Peter (2573)
+
+	* config.guess, config.sub, configure, configure.in: upgrade to
+ 	  autoconf-2.12.  Linux machines are still recognized without the
+ 	  -gnu suffix
+
+	* configure, configure.in: working fifos should be tested in /tmp
+
+Wed Dec 11 02:30:39 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_tricky.c, Src/builtin.c, Src/exec.c, Src/globals.h,
+ 	  Src/hist.c, Src/init.c, Src/input.c, Src/lex.c, Src/zsh.h:
+ 	  remove the alias stack and fix several related bugs. From Peter
+ 	  (2548, 2551)
+
+	* Doc/zsh.texi, META-FAQ: ftp mirror site changes
+
+	* Src/params.c: use the heap in getstrvalue()
+
+Tue Dec 10 02:27:35 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_refresh.c: single line zle refresh bugfix from Geoff
+ 	  (2549)
+
+	* Src/subst.c: ${(l:4:)foo} stopped working between 3.0.0 and 3.0.1
+
+	* Src/math.c: $((#\c)) character code expansion did not work when
+ 	  c was a metafied
+
+	* Src/params.c: $foo[i] did not work when foo[i] was a metafied
+ 	  character
+
+	* Src/builtin.c: use the heap in zexit()
+
+Sun Dec  8 21:32:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/input.c: no further input should be attempted when lexstop
+ 	  is true (e.g. after eof).
+
+	* Misc/compctl-examples: MH compctl changes from Peter (2535)
+
+	* Src/signals.c: use the heap when reading TMOUT
+
+	* Src/jobs.c: use the heap when reading REPORTTIME.  From Peter (3534)
+
+	* Src/Zle/zle_tricky.c, Src/glob.c, Src/hashtable.c, Src/utils.c:
+ 	  unmetafy did not put a null terminator to the end of the string.
+  	  zreaddir discarded the metafied filename.  readdir was used
+ 	  instead of zreaddir in zle_tricky.c.  From Zefram (2533)
+
+	* Src/jobs.c: CLK_TCK is 60 on NeXT not 64 as defined in the
+ 	  system headers.  From Robert F Tobler
+ 	  <rft@raven.cg.tuwien.ac.at> (2522)
+
+	* Src/input.c, Src/zsh.h: alias foo='a=b foo' ; foo caused an
+ 	  infinite loop.  From Peter (2515)
+
+	* Src/builtin.c, Src/Zle/compctl.c: more bad option fixes. Make
+ 	  the getopts builtin 8-bit clean.  From Zefram (2508)
+
+	* Src/builtin.c: show metafied characters correctly in bad option
+ 	  errors.  From Zefram (2497)
+
+Tue Nov 26 02:45:15 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c: the STTY parameter did not work well when pipes were
+ 	  used.  From Peter (2474)
+
+	* Etc/FAQ: FAQ from Peter: Id: zsh.FAQ,v 2.21 1996/11/25 09:13:28
+ 	  pws Exp
+
+Sun Nov 24 22:44:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/Zle/zle_move.c: vi-goto-mark fix from Thorsten
+
+Sat Nov 23 23:34:58 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c:
+	  ((...)) substituted the expression twice and coredumped on (())
+
+	* Doc/zsh.texi, Doc/zshcompctl.man: compctl -e clarification from
+ 	  Peter (2453)
+
+Wed Nov 20 00:58:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c: The spell checker always tries to fix as many
+ 	  leading directory compontents as possible.  From Bart (2429)
+
+	* Src/Zle/zle_tricky.c: my spell-word fix used an uninitialised
+ 	  pointer.  Fix from Bart (2428)
+
+Sun Nov 17 21:21:22 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/params.c: remove a few memory leaks when initialising the
+ 	  parameter table.
+
+	* Src/exec.c, Src/zsh.h: allow arbitrary number of multios.  From
+ 	  Zefram (2414)
+
+	* Src/exec.c, Src/parse.c, Src/text.c, Src/zsh.h: do not convert
+ 	  ((...)) to builtin let internally.
+
+Sat Nov 16 23:57:40 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: spell-word zle function did not work for word
+ 	  beginning with a tilde
+
+	* Doc/Makefile.in: give some explanation if the user compiling zsh
+ 	  has no makeinfo
+
+	* Makefile.in, acconfig.h, configure.in, config.h.in: Makefile and
+ 	  configure fixes from Zefram (2416)
+
+	* Src/zle_tricky.c: the cursor moved back on TAB when it was on
+ 	  "".  From Zefram (2415)
+
+Thu Nov 14 12:59:25 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_refresh.c: one more refresh fix from Geoff (2404)
+
+Wed Nov 13 21:47:28 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* config.guess, config.sub: recognize i[6-9]86
+
+	* Src/globals.h, Src/init.c, Src/utils.c: make fdtable dynamic
+
+	* Src/zle_refresh.c: zle_refresh fix from Geoff (2387)
+
+	* Src/zle_refresh.c: some checks added.  From Geoff (2386)
+
+	* Src/zle_refresh.c: fix an off-by-one array bound bug.  From
+ 	  Geoff (2359)
+
+	* Src/zle_refresh.c: zle_refresh scrolling change from Geoff (2351)
+
+Tue Nov 12 21:35:18 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c, Src/zle_refresh.c: zle-refresh patch from Geoff (2336)
+
+Sun Nov  3 23:00:05 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/system.h: set OPEN_MAX to 64 if NOFILE is not defined
+
+	* Src/hashtable.c: disable -f TRAPxxx permanently removed the
+	  function
+
+	* Functions/pushd: setopt localoptions must come after
+	  emulate -R zsh
+
+Sat Nov  2 22:47:53 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/compat.c, Src/hashtable.c, Src/utils.c: do not blindly
+ 	  assume that . and .. are always the first two enrties in a
+ 	  directory.  Problem discovered by Hideki ONO and fixed by Bart
+ 	  (2309)
+
+	* Src/utils.c: max_zsh_fd should not be decreased below zero
+
+Thu Oct 31 01:38:10 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hist.c: zsh splitted lines longer than 1022 while reading
+ 	  the history file
+
+	* Src/glob.c (doesmatch): <-number> range glob did not work
+
+	* Src/builtin.c: read -c ignored its first parameter
+
+Fri Oct 25 20:50:38 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0.1 released
+
+	* Functions/pushd: First version
+
+	* Functions/pushd: empty dummy revision
+
+	* Src/zle_main.c: key binding coredump fix from Peter (2131)
+
+Thu Oct 24 10:02:00 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: A minor bugfix related to alwayslastprompt and
+ 	  compctl -X from Geoff (2255)
+
+Thu Oct 24 09:15:18 1996  pws  <pws@ihf.de>
+
+	* Etc/FAQ: checked in with -k by hzoli at 1996/10/25 19:57:51
+
+Mon Oct 21 20:39:19 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Doc/zshoptions.man: Better documentation of
+ 	  GLOB_ASSIGN and MAGIC_EQUAL_SUBST from Peter (2164)
+
+Sun Oct 20 00:08:41 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* configure, configure.in: I made a stupid mistake in the Cray
+ 	  hacks for nis_list
+
+Sat Oct 19 19:39:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* configure, configure.in: allow cross-compiling
+
+Fri Oct 18 20:34:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.man, Doc/zsh.texi, Doc/zshall.man: Paul Falstad's
+ 	  preferred E-mail address is pjf@cts.com
+
+	* Src/hist.c: A little simplifiction.
+
+Wed Oct 16 22:58:08 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/BUGS: sed in HP-UX 10.20 is broken.
+
+	* Src/builtin.c: popd to a non-existent directory did not remove
+ 	  that from the directory stack.  popd should warn when the
+ 	  directory stack is empty.  From Bart (zsh-users 437)
+
+Tue Oct 15 21:07:03 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_utils.c: use int instead of char in getzlequery
+
+	* Doc/Makefile.in, Doc/zsh.texi, Etc/Makefile.in,
+ 	  Functions/Makefile.in, Makefile.in, Misc/Makefile.in,
+ 	  Src/Makefile.in, Src/builtin.c, Src/compat.c, Src/cond.c,
+ 	  Src/exec.c, Src/glob.c, Src/globals.h, Src/hashtable.c,
+ 	  Src/hashtable.h, Src/hist.c, Src/init.c, Src/input.c,
+ 	  Src/jobs.c, Src/lex.c, Src/linklist.c, Src/loop.c, Src/math.c,
+ 	  Src/mem.c, Src/params.c, Src/parse.c, Src/prototypes.h,
+ 	  Src/signals.c, Src/signals.h, Src/subst.c, Src/system.h,
+ 	  Src/text.c, Src/utils.c, Src/watch.c, Src/zle.h,
+ 	  Src/zle_bindings.c, Src/zle_hist.c, Src/zle_main.c,
+ 	  Src/zle_misc.c, Src/zle_move.c, Src/zle_refresh.c,
+ 	  Src/zle_tricky.c, Src/zle_utils.c, Src/zle_vi.c, Src/zle_word.c,
+ 	  Src/zsh.h, Src/ztype.h, StartupFiles/Makefile.in,
+ 	  Util/Makefile.in, configure.in: copyright condition changes
+
+	* Src/zle_refresh.c: bugfix and optimisation for poor terminals
+ 	  from Geoff (2221)
+
+Tue Oct  8 23:19:38 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/BUGS, Etc/CONTRIBUTORS, Etc/MACHINES, Etc/NEWS: spell fixes
+ 	  from Geoff (2190)
+
+	* Src/builtin.c: there was an extra check for unknown limits
+
+	* Src/prototypes.h, acconfig.h, config.h.in, configure,
+ 	  configure.in: make compilation possible on OSF/1 V4.x with gcc
+
+Tue Oct  8 00:16:29 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c: PS3 and PS4 were only initialized in non-interactive
+ 	  shells
+
+	* Src/utils.c: getquery always returned n on cray-unicos. From
+ 	  Richard D. Slater (2136)
+
+	* config.guess, config.sub: recognize c90-cray and t90-cray machines.
+	  From Richard D. Slater <rdslater@splash.Princeton.EDU> (2136)
+
+	* configure, configure.in: changes to enable NIS+ username
+ 	  completion on Unicos based on information provided by Charles
+ 	  Finan <chf@bear.com>.
+
+	* Src/zle_tricky.c: get_comp_string simplification and a little
+ 	  bugfix based on art. 2198 from Zefram
+
+	* Src/builtin.c: print -P '\0hehe' printed nothing.
+
+	* Src/zle_misc.c: handle meta characters in prompts
+
+	* Src/utils.c: a litle optimization
+
+Sun Oct  6 12:21:08 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Functions/cdmatch, Functions/cdmatch2, Functions/multicomp: add
+ 	  emulate -R zsh to some function examples.  From Bart (2172)
+
+	* Src/exec.c, Src/jobs.c, Src/zsh.h: =(...) arguments to a
+ 	  function were deleted after the first command of the function
+ 	  was executed.  Fix from Louis.Granboulan@ens.fr (2165).
+
+	* Doc/zsh.texi, Doc/zshexpn.man, Etc/NEWS, Src/glob.c: trailing /
+ 	  in a glob pattern now works like in other shells.
+
+Thu Oct  3 00:02:35 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* configure, configure.in: on AIX curses should always be
+ 	  preferred to termcap
+
+	* Util/zsh-development-guide: added description about the coding
+	  style.
+
+	* Src/subst.c: expand arithmetic expressions in substitution flags
+ 	  and modifiers
+
+	* Src/glob.c: echo foo(:t:r) gave no matches error
+
+Tue Oct  1 00:50:49 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/exec.c, Src/hashtable.h, Src/params.c,
+ 	  Src/zle_tricky.c: dots no longer appear in place of empty
+ 	  components of PATH, MANPATH etc.
+
+Sat Sep 28 21:22:31 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zsh.h, Src/builtin.c, Src/hashtable.h, Src/init.c,
+ 	  Src/jobs.c, Src/params.c, Src/utils.c, Src/zle_misc.c,
+ 	  Src/zle_refresh.c, Src/zle_tricky.c: COLUMNS=1 causes a
+ 	  coredump.  From Bart (2173)
+
+	* Src/subst.c: tilde expansion did not work for usernames
+ 	  beginning with a digit
+
+	* Src/utils.c: zstrtol did not handle signs
+
+	* Src/globals.h, Src/init.c, Src/utils.c: when an error occurs in
+ 	  a sourced script the full pathname of the script is included in
+ 	  the message.  From Peter (2170)
+
+	* Src/init.c: initialise ttystrname in init_io to avoid duplicated
+ 	  call of ttyname
+
+Tue Sep 24 19:45:30 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_refresh.c: one character long prompts did not work.
+  	  From Geoff (2118)
+
+	* Src/zle_main.c: getkey shoud use EOF instead of -1 when no
+ 	  characters were read.  From hoh@approve.se (Goran Larsson)
+ 	  (2144)
+
+	* Src/zle_utils.c: ^C answer to a query printed a funny character.
+	  From hoh@approve.se (Goran Larsson) (2144)
+
+Mon Sep 23 23:28:38 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c: array assignments stopped working after my previous fix
+
+	* Src/exec.c: If setpgrp fails make the process a new job leader.
+  	  From Peter (2150)
+
+	* Functions/cat: A simplified implementation of cat as a zsh function
+
+	* Src/exec.c, Src/utils.c: Do not close coprocin/coprocout for
+ 	  command/process substitutions
+
+	* Src/builtin.c: POSIX: shift n should fail with error message if
+ 	  n > $#
+
+Sat Sep 14 04:19:41 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c: metafy/unmetafy speedups
+
+	* Src/lex.c: assignment parsing fix (e.g. 1foo=bar is not an
+ 	  assignment)
+
+	* Src/exec.c: an index bug which never caused any problems fixed.
+
+	* Src/glob.c, Src/lex.c, Src/subst.c, Src/zle_tricky.c: setopt
+ 	  extendedglob no longer affects parsing.  From Peter (2123) with
+ 	  and me (2127)
+
+	* Src/params.c: shift <number> did not work
+
+Fri Sep 13 03:30:51 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: read builtin simplifications and improvements
+
+	* Src/builtin.c: the read builtin did not handle meta characters
+
+Sat Sep  7 15:19:40 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/params.c, config.h.in, configure, configure.in:
+	  setting the USERNAME parameter executes initgroups()
+
+	* configure, configure.in: define HAVE_NIS_PLUS only if the
+ 	  nis_list function is found
+
+Tue Sep  3 20:33:07 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: autoload has no effect for already defined
+ 	  functions & other cosmetic changes
+
+	* Src/utils.c: control keys at a query prompt left ^ as a garbage
+ 	  on the screen.  Fix from hoh@approve.se (Goran Larsson)
+
+Sun Sep  1 22:58:11 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/NEWS: more news
+
+	* Src/mem.c: fill the freed heap with 0xff on popheap and freeheap
+
+	* Src/zle_tricky.c: completion did not work well after
+ 	  delete-char-or-list
+
+	* Src/builtin.c: umask prints 0222 instead of 222
+
+Sat Aug 31 23:43:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: fc -e should not change lastval
+
+	* Src/input.c: fc -e prints the modified line of stderr instead of
+ 	  stdout
+
+	* Src/init.c: use source instead of sourcehome for sourcing $ENV
+ 	  in sh/ksh mode
+
+	* Doc/zsh.texi, Doc/zshbuiltins.man, Src/builtin.c: set -s and set
+ 	  +A now works as in ksh
+
+	* Src/params.c: getaparam used by shift and compctl -k did not
+ 	  work with KSH_ARRAYS
+
+	* Src/exec.c: a prefix without command is not an error.
+
+	* Doc/zsh.texi, Doc/zshbuiltins.man, Src/builtin.c,
+ 	  Src/hashtable.h: unset -f is the same as unfunction
+
+	* Src/builtin.c: read should set variables even if EOF is read
+
+	* Src/builtin.c: typeset -i foo should not change an already set
+ 	  base for foo
+
+	* Src/init.c, Src/loop.c, Src/signals.c: terminate zsh if an
+ 	  untrapped INT signal is received while sourcing a startup script
+ 	  and the privileged option is set
+
+	* Doc/zsh.texi, Doc/zshmisc.man, Src/globals.h: NO_BG_NICE is set
+ 	  in sh/ksh mode
+
+	* Src/zle_refresh.c: xterm cut&paste fix from Geoff (2095)
+
+Thu Aug 29 21:07:24 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c, Src/zle_tricky.c: run-help always uses the alias
+ 	  expanded word
+
+	* Src/zle_refresh.c: fixes for slow refresh on some terminals from
+ 	  Geoff (2091)
+
+Mon Aug 26 00:02:36 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c: save/restore underscore on execsave/execrestore
+
+	* Src/zle_tricky.c: line was wrongly used unmetafied in getcurcmd()
+
+Sun Aug 25 23:06:43 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Functions/checkmail, Doc/zsh.texi, Doc/zshmisc.man, Src/cond.c,
+ 	  Src/parse.c: new -N contitional test to check if the access time
+ 	  of a file is not newer than its modification time.  A new
+ 	  checkmail function is also included to check mailpath or the
+ 	  given forlers for new mails.
+
+	* Src/builtin.c: umask error message fix from János Farkas
+ 	  <chexum@shadow.banki.hu> (2061)
+
+	* Src/mem.c, Src/zsh.h: halloc simplification
+
+	* Src/zsh.h: save/restore underscore on execsave/execrestore
+
+	* Doc/zsh.texi: <> should be <->.
+	  From hoh@approve.se (Goran Larsson)
+
+	* Doc/zshoptions.man: a space was missing after .BR.
+	  From Bart (2019)
+
+	* Src/exec.c, Src/globals.h, Src/signals.c, Src/signals.h,
+ 	  Src/utils.c: Some little speedups
+
+Fri Aug 23 19:18:43 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: compctl -X did not work
+
+	* Functions/run-help: fixed compctl handling
+
+	* Util/helpfiles: comment changes
+
+	* Src/params.c: $foo[(i)...], caused invalid subscript error
+
+Thu Aug 22 21:57:47 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* META-FAQ: ftp.uit.no now mirrors the primary site.
+  	  ftp.nis.co.jp should be used instead of shirakaba.nis.co.jp
+
+	* Src/parse.c: if ((...)) { ... } else { ... } should work.  From
+ 	  Bart (2043) and me
+
+	* Src/builtin.c: RLIMIT_TCACHE = cachedthreads on HP-UX 10.20
+
+	* Etc/MACHINES: better description of the OSF/1 header bug
+	  workaround
+
+Thu Aug 15 17:40:38 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0.0 released
+
+	* configure, configure.in: remove -DDEBUG from the default CFLAGS
+
+	* Makefile.in: Automatically update zsh-doc.tar.gz and the www
+ 	  manual with make release
+
+	* Doc/zsh.texi: final version for zsh-3.0
+
+	* Src/zsh.h: some compilers complained the 0x80 is out of range
+
+	* Doc/zsh.texi, Doc/zshmisc.man, Src/globals.h: undo the emulation
+ 	  of the echo style of /bin/sh in sh mode.
+
+	* Functions/run-help: new version from Bart with some modifications
+
+	* META-FAQ: new mirror in Japan and Slovenia, META-FAQ.html
+
+	* Src/exec.c: $(< nosuchfile) dumped core.  From Peter (1985)
+
+Wed Aug 14 17:02:39 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/parse.c: ignore spaces in case foo in ( f* | b* ) ...
+
+	* Src/exec.c: fix error messages when there is an unreadable
+ 	  directory or a non-directory in the path.  From Peter (1666)
+
+	* Src/utils.c: zstrtol skips leading whitespaces.  From Risto J
+ 	  Laitinen <rjl@math.jyu.fi>
+
+	* Src/builtin.c: fc builtin fix from Peter (1956)
+
+	* Doc/zsh.man, Doc/zsh.texi, Doc/zshall.man, Doc/zshmisc.man,
+ 	  Doc/zshoptions.man, Src/exec.c, Src/globals.h, Src/hashtable.h,
+ 	  Src/zsh.h: POSIX_BUILTIN option added
+
+Tue Aug 13 20:36:44 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Doc/zshparam.man, Src/init.c, Src/zle_misc.c: PS2
+ 	  defaults to %_> , %_ prints all shell constructs.  From Peter
+ 	  (1948)
+
+	* Src/hist.c: a cast was missing in a debug test
+
+Mon Aug 12 18:01:08 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: limit fixes for Alpha/Linux 2.0.x from Jeff Blank
+ 	  <jfblank@mtu.edu> (1951)
+
+	* META-FAQ: ftp.funet.fi mirrors zsh
+
+	* Doc/zshmisc.man, Doc/zsh.texi, Src/globals.h, acconfig.h,
+ 	  config.h.in, configure, configure.in: test for the echo style of
+ 	  /bin/sh
+
+	* Src/math.c: $[#\c] did not work for meta characters.  From Heiko
+ 	  Schroeder (1937)
+
+	* Src/builtin.c: hostorical sh compatibility: set - is set +xv and
+ 	  set - args is set +xv -- args.
+
+	* Src/zle_main.c, Src/zle_refresh.c: call getiparam("BAUD") once
+ 	  before each zle invocation instead of calling it on each
+ 	  keystroke.
+
+	* Src/hist.c, Src/signals.c: Zsh coredumped on auto-logout
+
+Sun Aug 11 19:46:50 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/input.c: Fix history expansion in foo<!$.  This may also fix
+ 	  some other rare bugs.  From Peter (1930)
+
+	* Src/zle_main.c: zsfree used to free bindkey -s binding.  From
+ 	  Peter (1927)
+
+	* Doc/zsh.texi, Doc/zshparam.man: minor corrections from Peter (1926)
+
+	* Src/builtin.c, Src/exec.c: The exit builtin used exit() instead
+ 	  of _exit() in subshells.  From Peter (1923)
+
+	* Src/zle_tricky.c: Untokenize and quote the current command
+ 	  before passing it to run-help.  Based on art. 1920 from Bart.
+
+Sun Aug  4 18:28:00 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0-pre6 released
+
+	* Doc/zsh.texi, Doc/zshparam.man, Src/hashtable.h, Src/params.c:
+ 	  LANG and LC_{ALL,CTYPE,COLLATE,MESSAGES,TIME} special parameters
+ 	  added
+
+	* Src/utils.c (ztrftime): use strftime() for %a, %b and %p since
+ 	  it respects LC_TIME
+
+	* Src/mem.c: zsh_mem segfaulted when the free list was empty and a
+ 	  large block was freed.
+
+	* Src/zle_tricky.c: do not complete unset special parameters
+
+Sat Aug  3 02:54:46 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c, Src/builtin.c, Src/globals.h, Src/zsh.h: setopt
+ 	  prints non-default options.  From Wayne (1907)
+
+	* Src/exec.c, Src/zsh.h: foo | some_function > ... closed stdout
+ 	  permanemtly
+
+	* Src/zle_utils.c: zsfree used on the non-null-terminated vibuf[*].buf
+
+Fri Aug  2 20:05:50 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi: spelling fixes from Mark and added reference to
+ 	  obtaining precompiled documentation, zsh-doc.tar.gz from Clive
+ 	  (1858)
+
+	* Etc/BUGS, Etc/FEATURES, Etc/NEWS: `spelling' fixes
+	  from Zefram (1856)
+
+	* Functions/multicomp: unset nounset (in other words set unset) in
+ 	  the function
+
+	* Src/zle_refresh.c: zsfree was used to free the
+ 	  non-null-terminated lpptbuf and rpptbuf
+
+	* Src/mem.c: fill freed memory with 0xff intead of 0 when
+ 	  ZSH_MEM_DEBUG is defined
+
+	* Src/builtin.c, Src/exec.c: parse_string does not use
+ 	  pushheap/popheap.  $(< file command) works
+
+	* Src/lex.c: lexsave() saves lexstop, gettok does not do hwbegin()
+ 	  when lexstop != 0
+
+	* Src/hist.c: strinbeg/strinend increases/decreases strin.  This
+ 	  fixes the here-document within command substitution bug.
+
+Thu Aug  1 17:56:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c: \" should remain unchanged in here documents
+
+Wed Jul 31 19:10:04 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0-pre5 released
+
+	* Doc/zsh.texi: updated to zsh-3.0-pre5
+
+	* Src/signals.c: update shtimes for disowned and command/process
+ 	  substitution processes since otherwise these would be added to
+ 	  the time of the next terminating non-disowned process.  From
+ 	  Peter (1849)
+
+	* Src/jobs.c: more than 100% CPU usage is meaningfull on parallel
+ 	  machines.  From Peter (1849)
+
+	* Doc/Makefile.in: use $< only in implicit rules
+
+	* Src/builtin.c, Src/jobs.c, Src/zle_misc.c, Src/zle_refresh.c,
+ 	  Src/zle_tricky.c, Src/zsh.h: COLUMNS=0 caused division by zero
+
+	* Src/zle_refresh.c: use single line scroll only if speed >=
+ 	  19200.  Fix a refresh bug happenning with half-screen scrolls.
+  	  From Mason (1835)
+
+	* Doc/zsh.texi: texinfo updates from Clive (1833, 1838)
+
+	* Src/hashtable.h, Src/params.c, Src/zsh.h: {E,}{U,G}ID, USERNAME,
+	  histchars, HISTCHARS, IFS are not imported
+
+	* Doc/zshparam.man, Src/exec.c: foo=something command did not work
+ 	  well when foo was a special array or integer parameter or when
+ 	  foo was a read-only parameter.  It's fixed but now USERNAME=name
+ 	  command will not work to start a single command under a
+ 	  different username.  (USERNAME=name ; command) should be used
+ 	  instead.
+
+	* Src/math.c: $[foo=] and $[foo,]caused SEGV
+
+	* Src/utils.c, Src/zsh.h: DPUTS calls dputs() to print a debug
+ 	  message.  This makes debugging easier since a breakpoint can be
+ 	  set to dputs.
+
+Tue Jul 30 20:28:38 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/params.c, Src/utils.c: zsh -s dereferenced wordchars while
+ 	  it was still NULL.  Reported by Peter.
+
+	* Src/exec.c: handle special parameter assignments before builtins
+ 	  and functions
+
+	* Doc/zshmisc.man, Src/hashtable.h: MANPATH is not special in
+ 	  sh/ksh mode
+
+Mon Jul 29 23:44:19 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/mem.c: a little-bit improved ZSH_MEM_WARNING
+
+	* Src/init.c, Src/params.c, Src/utils.c, Src/zsh.h: zsh -s
+ 	  dereferenced ifs while it was still NULL.  Reported by Peter.
+
+	* Src/signals.c: unfunxtion TRAPxxx gave a bogous BUG: message.
+  	  From Peter (1823)
+
+	* Functions/zed: save/restore TMOUT fix
+
+	* Doc/zshzle.man: isearch case-sensitivity documentation
+
+	* Src/globals.h: swap option leters for noclobber and
+	  printexitvalue again
+
+	* Src/exec.c, Src/loop.c: do fake exec in complex commands
+
+	* Src/parse.c: zsh -c 'echo foo ; & echo bar' should give parse
+	  error.
+
+Sun Jul 28 22:34:08 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshoptions.man: SH_FILE_EXPN renamed to SH_FILE_EXPANSION,
+ 	  -s works as SHIN_STDIN again in sh/ksh mode, -t is
+ 	  SINGLE_COMMAND in sh/ksh mode
+
+	* Src/globals.h, Src/subst.c, Src/zsh.h, Doc/zshexpn.man,
+ 	  Doc/zshmisc.man: SH_FILE_EXPN renamed to SH_FILE_EXPANSION
+
+	* Functions/zed: some fixes
+
+	* Misc/compctl-examples: (un)setopt completion example now know
+	  about no_option
+
+	* Src/zle_tricky.c: accept-and-menu-complete did not work well
+ 	  with GLOB_COMPLETE
+
+	* Src/zle_tricky.c: an other attempt to implement proper quoting
+	  after a failed completion
+
+	* Src/zle_hist.c: do not use zsfree on non-null-terminated strings
+
+	* Src/zle_hist.c, Src/zle_utils.c: isearch is case sensitive if it
+ 	  has a numeric argument
+
+	* Src/globals.h: -s is back in sh/ksh mode for SHIN_STDIN
+
+Sat Jul 27 20:24:36 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/compat.c, Src/glob.c, Src/init.c, Src/mem.c,
+ 	  Src/zle_tricky.c: changes to make the upcoming gcc-2.8.0 more
+ 	  silent
+
+Fri Jul 26 21:02:59 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0-pre4 released
+
+	* Makefile.in: the diffs for the FAQ contains RCS header diffs
+
+	* Doc/zshmisc.man: COMPATIBILITY section added
+
+	* Doc/zsh.man: use %manext% instead of 1
+
+	* Doc/zshbuiltins.man, Src/builtin.c, Src/hashtable.h: emulate -R
+ 	  added
+
+	* Doc/zshoptions.man, Src/globals.h, Src/zsh.h: shoptionletters
+ 	  added, localoptions is only set for ksh, ksh knows -t and -s is
+ 	  different from zsh so ksh -s is disabled.
+
+	* Src/init.c: sh/ksh mode does not use $ZDOTDIR.  ENV is expanded
+
+	* Src/builtin.c, Src/exec.c, Src/signals.c: final (?) trap fixes
+
+	* Doc/Makefile.in: added rules for zsh_a4.ps, zsh_us.ps, zsh_toc.html
+
+	* Src/hashtable.c: print { } for empty funxtion definitions.  From
+ 	  Peter (1778)
+
+Thu Jul 25 21:50:36 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/signals.c, Src/subst.c: old compilers do not like char []
+ 	  automatic initializers
+
+	* Src/globals.h: ignorebraces is not set for ksh emulation
+
+	* Etc/CONTRIBUTORS: Bart Schaefer added to 3.0 contributors
+
+	* Src/zle_tricky.c: backed out an earlier patch of mine which
+ 	  quoted the line after a failed completion.
+
+	* Src/builtin.c, Src/exec.c, Src/init.c: some checks to prevent
+ 	  buffer overflows from Bart (1760)
+
+	* Src/params.c: do not import special array parameters like path.
+
+	* Src/params.c, Src/subst.c: Subscripts can be used in all array
+ 	  types substitutions.  For example
+ 	  "${${(M)${(f@)$(<builtin.pro)}:%char*}[2][(w)3]}" expands to the
+ 	  third word of the second line of builtin.pro which begins with
+ 	  char.  This is really a bugfix: ${foo[1]} does not give error is
+ 	  foo is unset and the UNSET option is set.
+
+	* Src/zle_main.c: return or break (probably called from a trap)
+ 	  stops zle
+
+	* Src/builtin.c, Src/exec.c: return does not do anything special
+ 	  if used in a function called from a TRAPxxx function.
+
+Thu Jul 25 08:08:47 1996  pws  <pws@bolyai.cs.elte.hu>
+
+	* Etc/FAQ: checked in with -k by hzoli at 1996/07/25 20:32:43
+
+Wed Jul 24 15:02:42 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/NEWS, Src/lex.c: disallow [[-z $foo]] again since it will
+ 	  cause problems with POSIX character classes (e.g. [[:ALPHA:]]).
+
+	* Src/zle_misc.c: deletechar works at the end of lines.
+
+Tue Jul 23 21:04:22 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/exec.c, Src/globals.h, Src/hashtable.c,
+ 	  Src/jobs.c, Src/signals.c, Src/zsh.h: more signal trap fixes
+
+	* Src/exec.c: add zleactive = 0; to entersubsh().  From Bart and
+ 	  Peter (1735)
+
+	* Src/zle_vi.c: vi-replace-chars repeat correctly with
+ 	  vi-repeat-change.  From Zefram (1696)
+
+	* Doc/zshzle.man, Src/zle.h, Src/zle_main.c, Src/zle_misc.c,
+ 	  Src/zle_utils.c, Src/zle_vi.c: vi-style named cut buffers work
+ 	  in ZLE.  From Zefram (1683)
+
+	* Src/builtin.c: whence -c (and which) tells if the given command
+ 	  is not found.
+
+Mon Jul 22 20:32:13 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshexpn.man, Doc/zshoptions.man, Doc/zshparam.man,
+ 	  Src/globals.h, Src/subst.c, Src/zsh.h: SH_FILE_EXPN option and
+ 	  some other changes related to sh/ksh emulation from Zefram
+ 	  (1695)
+
+	* Doc/zshoptions.man, Src/builtin.c, Src/exec.c, Src/globals.h,
+ 	  Src/zsh.h: FUNCTION_ARGZERO option from Zefram (1669)
+
+	* Doc/zshcompctl.man: some stylistic improvements from Peter (1675)
+
+	* Src/parse.c: case foo in (foo) echo yes;; esac fixed.  From Bart
+ 	  (1734)
+
+	* Doc/zsh.texi: A couple of small fixes from Anthony Heading
+ 	  <aheading@jpmorgan.com> & Vinnie Shelton
+ 	  <shelton@icd.teradyne.com>.  Updated URL for mdb's online
+ 	  documentation.  Updated to include changes made to man-pages
+ 	  pre2 -> pre3.  FIXME: URL for ps & dvi. From Clive (1730)
+
+Mon Jul 22 01:26:09 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, Doc/zshmisc.man: traps defined by the trap builtin
+ 	  are unset in subshells
+
+	* Src/exec.c, Src/builtin.c, Src/globals.h, Src/hashtable.c,
+ 	  Src/init.c, Src/jobs.c, Src/signals.c, Src/zsh.h,
+ 	  Doc/zshbuiltins.man: traps defined by the trap builtin are now
+ 	  executed in the current shell environment and not as a shell
+ 	  function.
+
+	* Src/utils.c, Src/zle_hist.c, Src/zle_utils.c: add Emacs-like
+ 	  case insensitive incremental search
+
+	* Doc/zsh.man, Doc/zshall.man, Doc/zshexpn.man, Doc/zshmisc.man,
+ 	  Doc/zshoptions.man, Src/builtin.c, Src/exec.c, Src/glob.c,
+ 	  Src/globals.h, Src/hist.c, Src/init.c, Src/params.c,
+ 	  Src/parse.c, Src/signals.c, Src/subst.c, Src/utils.c,
+ 	  Src/zle_hist.c, Src/zle_main.c, Src/zle_misc.c,
+ 	  Src/zle_tricky.c, Src/zle_vi.c, Src/zsh.h: second option
+ 	  reorganization: setopt no_something is the same as unsetopt
+ 	  something.  From Zefram.
+
+Sat Jul 20 17:07:14 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* acconfig.h, config.h.in, configure, configure.in: configure
+ 	  check for working strcoll()
+
+	* configure, configure.in: cache broken signed to unsigned char
+ 	  conversion, and the path for utmp/wtmp/signals.h.  Modified
+ 	  cache variable names according to the GNU aucoconf standard.
+  	  From Zefram (1698)
+
+	* config.guess: fix for dgux
+
+	* Src/prototypes.h: strerror() prototype for SunOS from Zefram (1664)
+
+	* Doc/zsh.man, Doc/zshall.man: modified the AUTHOR section
+
+	* Etc/CONTRIBUTORS: Peter told me that programmable completion was
+ 	  done by Sven only.
+
+	* Src/exec.c, Src/init.c: make compilation possible on systems
+ 	  withour resurce limits.  From Wayne (1656)
+
+	* Src/lex.c: cmdstack changed bugfix from Zefram (1671)
+
+Fri Jul 19 19:25:14 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/subst.c: parameter modifier fixes, better diagnostics
+
+	* Src/subst.c: nested $((...)) substitutions now work.
+
+	* Src/zle_refresh.c: do not put the cursor into the last screen
+ 	  line if possible.  From Zefram (1678)
+
+	* Src/zle_refresh.c: a third refresh patch from Mason (1685)
+
+	* Src/zle_refresh.c: another refresh improvement from Mason (1642)
+
+	* Src/glob.c: a minor optimization
+
+	* Src/builtin.c: rlimit fixes for AIX 4.2
+
+	* Src/parse.c: case foo in (pattern) foo=bar;; esac now works
+
+	* Src/lex.c: allow {command} [[-z $foo]] etc. again.
+
+	* Src/lex.c: name=(...) did not work is there was a alias for name.
+
+	* Misc/compctl-examples: avoid a fork/exec in CVS completion.
+  	  From Bart.
+
+	* Src/jobs.c: fix a core dump in printjob().  From Zefram (1689)
+
+	* Src/lex.c: do not handle `<' in case patterns specially
+
+Thu Jul 18 23:03:59 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/subst.c: a little simplification
+
+Mon Jul 15 04:43:43 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0-pre3 released
+
+	* Etc/CONTRIBUTORS: added major contributors to zsh-3.0 briefly
+	  describing their work.
+
+	* Misc/compctl-examples: CVS compctl improvements from Bart (293, 1639)
+
+	* Src/exec.c, Src/hist.c: some compilers were noisy
+
+	* Src/exec.c: fix problems of failed redirection in an exec'ed
+ 	  command. From Peter (1526)
+
+	* Src/zle_refresh.c: big zle patch from Geoff to improve handling
+ 	  of long lines (1637)
+
+	* Src/exec.c: redirected than interrupted builtins sometimes left
+ 	  the output redirected.  From Peter (1609)
+
+	* Src/builtin.c, Src/exec.c, Src/jobs.c: jobs does not redraw the
+ 	  terminal when called from a compctl.  The output from jobs now
+ 	  goes to stdout.  From Peter (1606)
+
+	* Src/zle_main.c: fix terminal problems when backgrounding
+ 	  less. From Bart Schaefer (1546)
+
+	* Src/builtin.c, Src/exec.c, Src/globals.h, Src/init.c: limit,
+	  ulimt, unlimit improvements: hard limit for the children can
+	  always be raised up to the hard limits of the shell.
+	  Optimization: setrlimit() is only called when necessary.
+
+Sat Jul 13 20:26:35 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/NEWS, Doc/zshmisc.man, Src/globals.h, Src/hashtable.h,
+ 	  Src/hist.c, Src/lex.c, Src/parse.c, Src/utils.c,
+ 	  Src/zle_tricky.c, Src/zsh.h: The lexer no longer depens on the
+ 	  history code (it does not use hwget).  ! [[ { } are now reserved
+ 	  words.
+
+	* Src/lex.c: parsestr() failed if the string contained a backslash
+ 	  newline
+
+Fri Jul 12 17:19:02 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_hist.c, Src/zle_main.c: always execute the zle command
+	  which ended an I-search.  From Wayne (1613)
+
+	* Src/exec.c: for word in %1 should not trigger sutoresume.  From
+	  Peter (1619)
+
+	* Src/parse.c: allow the repeat word { list } syntax without
+	  noshortloops.  If CSHJUNKIELOOPS is set accept repeat word list
+	  end.
+
+	* Doc/zshmisc.man: more precise definition the the syntax of
+ 	  complex commands
+
+	* Src/parse.c: the repeat word sublist syntax does not work if
+ 	  NOSHORTLOOPS is set
+
+	* Src/parse.c: The foo () sublist function definition syntax is
+ 	  changed to foo () command for ksh and POSIX compatibility.  This
+ 	  syntax does not require NO_SHORT_LOOPS.
+
+Thu Jul 11 21:03:51 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c: handle metacharacters in here documents
+
+	* Src/subst.c: remnulargs is unnecessary in singsub() since it is
+ 	  done in prefork()
+
+	* Doc/zsh.texi, Doc/zshmisc.man: case documentation improvements
+
+	* Src/exec.c, Src/hist.c: remove hgets() and merge it into gethere()
+
+	* Src/zle_tricky.c: feep when completion is tried when the current
+ 	  word begins in an already accepted line.  Make the code a bit
+ 	  simpler and add a debug check.
+
+	* Src/zle_tricky.c: fix completing in $(...)
+
+Wed Jul 10 20:52:55 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/glob.c, Src/subst.c, config.h.in, configure, configure.in:
+ 	  use strcoll for sorting.  From Andrej Borsenkow
+ 	  <borsenkow.msk@sni.de> (1599) with some modifications
+
+	* Src/exec.c: FOO=bar function leaved FOO=bar in the environment
+
+Wed Jul 10 02:34:49 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c: FOO=bar function leaved FOO=bar in the environment
+
+	* Src/exec.c, Src/init.c: FOO=bar function fixes from Peter (1573)
+
+	* Src/zle_tricky.c: quoting after faild completion fixed
+
+	* Src/utils.c, Src/zle_tricky.c: menu completion after ~/ and
+ 	  $foo/ fixed
+
+Tue Jul  9 21:09:29 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi, Doc/zshmisc.man, Src/parse.c: case foo in
+ 	  (pattern) ... syntax documented and parsing improved
+
+	* Doc/zsh.texi: Removed the chapter "History" as it was duplicated
+ 	  as "History Expansion" in chapter "Expansion".  From Clive.
+
+	* Src/zle_tricky.c: gcc gave `ocs' might be used uninitialized warning
+
+	* Src/init.c, Src/utils.c: bangchar is special iff
+ 	  unset(NOBANGHIST) &&interactive && isset(SHINSTDIN)
+
+	* Src/zle_tricky.c: fix completing words containing bangchar
+
+	* Src/hist.c: prevent infinite loop when saving history
+
+	* Src/zle_tricky.c: fix various completion bugs mostly related to
+ 	  completing in multiline command structures
+
+	* Src/lex.c: do not call exalias if errflag is true (fixes
+ 	  push-line-or-edit)
+
+Mon Jul  8 20:37:59 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c: set shout fully buffered
+
+Mon Jul  8 01:56:51 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, Src/globals.h, Src/hist.c, Src/init.c, Src/input.c,
+	  Src/lex.c, Src/parse.c, Src/zsh.h: doexpandhist() no does not
+	  mess up the history.  Here document are put into the history and
+	  some other here document fixes.
+
+Sun Jul  7 16:03:48 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/init.c: alloc_stackp debug check fix
+
+	* Doc/zsh.texi: Add accents to my name fix a typo and improve
+ 	  ulimit documentation (Zoltan)
+
+	* Doc/zshbuiltins.man: improve ulimit documentation
+
+Sun Jul  7 00:18:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c: remove warning about the new <> behaviour
+
+Sat Jul  6 18:17:13 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: fix completing in process and command
+	  substitutions
+
+Fri Jul  5 21:58:31 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c, acconfig.h, config.h.in, configure,
+ 	  configure.in: configure check for NIS+ and some othe related
+ 	  changes.  From Peter (1530) and me
+
+	* Doc/zsh.texi: updated texinfo documentation from Clive
+
+	* Src/system.h: RLIMIT_* fixes for HP-UX A.09.x
+
+	* Src/signals.c: pid_d *procsubpid instead of int *.
+	  From Wayne (1528)
+
+	* Src/zsh.h: X was used instead of Y in DPUTS.  From Wayne (1528)
+
+	* Doc/Makefile.in, Doc/zsh.man, Doc/zshall.man,
+ 	  Doc/zshoptions.man, INSTALL, configure, configure.in:
+ 	  --enable-etcdir is back.  The customized locations are put into
+ 	  the manual
+
+Thu Jul  4 20:46:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-3.0-pre2 released
+
+	* Src/zsh.h: some old compilers did not like the "foo" "bar" syntax
+
+	* INSTALL, acconfig.h, config.h.in, configure, configure.in:
+ 	  replace --enable-etcdir with --enable-{zshenv,zshrc,zlogin,
+ 	  zprofile,zlogout}
+
+	* Src/builtin.c, Src/exec.c, Src/hist.c, Src/lex.c, Src/mem.c,
+ 	  Src/signals.c, Src/utils.c, Src/zle_main.c, Src/zle_misc.c,
+ 	  Src/zle_tricky.c, Src/zsh.h: heapalloc()/permalloc() replaced
+ 	  with HEAPALLOC/PERMALLOC.  Both begin a new block which must be
+ 	  terminated by LASTALLOC.  LASTALLOC_RETURN must be used to
+ 	  return in the middle of such a block.  Example usage:
+	  PERMALLOC { l = dupstruct(list); } LASTALLOC;
+	  Idea from Bart and Zefram
+
+Thu Jul  4 13:18:11 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshoptions.man: >| is preferred to >!
+
+Mon Jul  1 20:59:36 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshmisc.man, Doc/zshoptions.man, Src/globals.h, Src/parse.c,
+ 	  Src/zsh.h: CSH_JUNKIE_PAREN option removed.  From Bart Schaefer
+ 	  (1496) with some modifications
+
+Mon Jul  1 20:13:26 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/mem.c, acconfig.h, config.h.in, configure, configure.in:
+	  check for brk/sbrk prototypes
+
+	* Misc/compctl-examples: complete *.rpm files after rpm -i
+
+	* Misc/compctl-examples: improved MH completions from Peter
+	  (zsh-users 268)
+
+	* Src/system.h: RLIMIT_ definitions are not hidden in HPUX 10.x
+
+Mon Jul  1 14:01:46 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: ulimit fixes
+
+	* Src/builtin.c, Src/globals.h, Src/hashtable.h, Src/hist.c,
+ 	  Src/init.c, Src/jobs.c, Src/params.c, Src/signals.c,
+ 	  Src/utils.c, Src/zle_main.c, Src/zle_tricky.c: BAUD,
+ 	  DIRSTACKSIZE, KEYTIMEOUT, LISTMAX, LOGCHECK, MAILCHECK, PERIOD,
+ 	  REPORTTIME, SAVEHIST and TMOUT are no longer special parameters.
+
+Mon Jul  1 02:27:23 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/globals.h, Src/builtin.c, Src/exec.c, Src/init.c, Src/lex.c,
+ 	  Src/mem.c, Src/signals.c, Src/utils.c, Src/zle_main.c,
+ 	  Src/zle_misc.c, Src/zle_tricky.c, Src/zsh.h: new
+ 	  heapalloc/permalloc/lastalloc macros.  heapalloc/permalloc
+ 	  starts with an open brace and lastalloc ends in a closing brace
+ 	  so these can only be used together. lastalloc_return must be
+ 	  used instead of return between heapalloc/permalloc and
+ 	  lastalloc.  From Bart Schaefer (1490) with some modifications
+
+Mon Jul  1 01:13:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshbuiltins.man, Src/builtin.c, Src/exec.c, Src/hashtable.h:
+	  limit/unlimit/ulimit changes, bash/ksh compatible ulimit
+
+Sun Jun 30 21:14:16 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/intro.ms, Doc/zsh.man, Doc/zshall.man:
+	  Paul Falstad's E-mail is pf@software.com
+
+Sun Jun 30 15:46:13 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c (doshfunc): do not change the value of underscore
+
+	* Src/builtin.c, Src/utils.c: zjoin and sepjoin returns an
+	  ncalloc'ed result (which makes them reentrant)
+
+	* Src/zle_misc.c (undo): zsfree can only be used on null
+	  terminated strings
+
+	* Src/signals.c: restore the old signal mask in unqueue_signals
+
+	* Src/exec.c: cmdoutpid and cmdoutval added to execstack
+
+Sun Jun 30 01:30:27 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/mem.c: fill freed memory with zeros if ZSH_MEM_DEBUG is defined
+
+	* Src/exec.c, Src/globals.h, Src/jobs.c, Src/signals.c, Src/zsh.h:
+ 	  cmdoutpid and cmdoutval added to execstack
+
+Sat Jun 29 15:24:54 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/hist.c, Src/utils.c: fix problems with quad_t
+ 	  resource limits.  From Geoff (1444,1471)
+
+Fri Jun 28 17:52:52 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: use the heap during the execution of chpwd()
+
+Fri Jun 28 15:00:11 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* ChangeLog: zsh-3.0-pre1 released
+
+	* Makefile.in: replace dots with _ in symbolic revision names
+
+	* Src/subst.c: fix a silly bug I made
+
+	* Makefile.in: make release changes
+
+Fri Jun 28 14:08:44 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/Makefile.in: zsh.info and zsh.dvi depends on zsh.texi
+
+	* Doc/zsh.texi: Fixed compctl -d and -e. Added ref to ***/.
+	  HISTCHARS depreciated, use histchars.
+
+Fri Jun 28 13:46:02 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/glob.c: foo.bar(:r) did not work
+
+Fri Jun 28 01:27:57 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_misc.c: alwayslastprompt fix when listing in
+ 	  execute-named-command
+
+	* Doc/zshparam.man, Src/jobs.c: %% represents % in TIMEFMT
+
+Thu Jun 27 23:51:19 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/BUGS: I hope that all awk problems are solved by now
+
+	* Src/subst.c: more bugfixes
+
+	* Src/exec.c: do not dump core on ls =()
+
+	* Src/builtin.c: fix problems with more than 63 character long
+ 	  fields in bin_read
+
+	* Src/hist.c: hungetc did not work when an originally unquoted
+ 	  bang came from a history substitution (e.g. when !$ should
+ 	  expand to $!)
+
+	* Src/subst.c, Src/glob.c: fix some really rare substitution bugs
+
+	* Src/exec.c: foo=( '' ) assigned an empty array
+
+	* README: instructions added what to do when there are unknown
+ 	  limits
+
+	* INSTALL, acconfig.h, config.h.in, configure, configure.in:
+ 	  --enable-etcdir added
+
+Wed Jun 26 23:19:48 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hist.c, Doc/zshexpn.man: get !# work again.  From Peter
+ 	  (1218 and 1219)
+
+	* Src/hashtable.h, Doc/zshbuiltins.man, Src/builtin.c:
+	  umask -S prints the mask in symbolyc form
+
+	* Src/init.c: do not buffer stdin if SHINSTDIN is set and not
+ 	  interactive.  This is because the line that comes afrer a
+ 	  command line on the standard input should be the potential
+ 	  standard input of the command.  This means that echo -e
+ 	  'cat\nfoo' | zsh will print foo instead of command not found:
+ 	  foo
+
+	* Doc/zshbuiltins.man, Src/builtin.c: POSIX conforming kill builtin
+
+Wed Jun 26 08:58:31 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.man, Doc/zshall.man, Doc/zshbuiltins.man,
+ 	  Doc/zshcompctl.man, Doc/zshexpn.man, Doc/zshmisc.man,
+ 	  Doc/zshoptions.man, Doc/zshparam.man, Doc/zshzle.man: date and
+ 	  version number changed
+
+	* Doc/zshbuiltins.man, Doc/zshmisc.man: -, command, exec and
+ 	  noglob are builtins
+
+Tue Jun 25 23:15:04 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c: \<nevline>c was interpreted as \c in dquote_parse()
+
+Tue Jun 25 21:07:59 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/NEWS: AUTO_PUSHD and IFS change description
+
+	* Etc/FAQ: New FAQ from Peter
+
+	* Src/signals.c: queue_signals()/unqueue_signals()
+ 	  increase/decreas the queueing_enabled variable and when it drops
+ 	  to zero accumulated signals are processed
+
+	* Src/mem.c: queue_signals in zfree(), malloc(), realloc() when
+ 	  ZSH_MEM is used remove signal queueing from zalloc() and
+ 	  zcalloc()
+
+	* Doc/zshzle.man, Src/zle_bindings.c: reverse / and ? vi mode
+	  keybindings (so the original behaviour is back)
+
+	* Src/exec.c: save underscore, lastval, noeval and badcshglob in
+ 	  execsave
+
+Tue Jun 25 19:46:34 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshexpn.man: trailing newlines are removed in command
+ 	  substitution
+
+Tue Jun 25 00:52:10 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, Src/signals.c: new function execsave()/execrestore()
+ 	  used in dotrap()
+
+Mon Jun 24 21:05:00 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c: doshfunc must use the heap
+
+	* Src/signals.c: dotrap should not change allocation state
+
+	* Src/watch.c: do not watch utmp entries without a login name.
+  	  From János Farkas (1432)
+
+	* Src/utils.c: handle terminals faster than 100000 baud.  From
+ 	  János Farkas (1431) with modifications
+
+	* Src/subst.c: fix nested $[$[...]] sunstitution
+
+Fri Jun 21 14:40:00 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshexpn.man: <> is a redirection operator.
+	  From Mark Borges (1390)
+
+	* Src/glob.c (glob): untokenize bad patterns if NO_BAD_PATTERN is
+ 	  set From Peter (1395)
+
+	* Doc/Makefile.in: zsh.info* files are removed from the
+ 	  distribution since these should be generated from zsh.texi.
+  	  Added targets zsh.info and zsh.dvi.
+
+	* Doc/zsh.texi: minor corrections from Clive (1399)
+
+	* Doc/zsh.texi: changes between 2.6-beta20 and beta21 are
+	  documented.  From Clive Messer <clive@epos.demon.co.uk> (1372)
+
+	* Src/glob.c: remove the undocumented [(foo)(bar)] glob feature
+	  since it is the same as (foo|bar).
+
+Thu Jun 20 20:58:14 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/parse.c: enable < =(...) and > =(...) again
+
+	* Src/parse.c: no special handling is necessary if test has two
+	  arguments
+
+	* Src/zle_tricky.c: allow tilde and equals substitution with
+	  compctl -g
+
+Wed Jun 19 20:55:00 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-2.6-beta21 released
+
+Wed Jun 19 20:51:45 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: on Solaris RLIMIT_AS == RLIMIT_VMEM
+
+	* configure, configure.in: remove -pedantic from gcc options
+
+Wed Jun 19 20:21:33 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hashtable.c: fix printing of the command name tables and
+ 	  displaying of arrays etc.  From Zefram (1259)
+
+	* Src/params.c: unset USERNAME coredump fix.  Also do not reset
+ 	  integer variables to zero before unsetting.  From Zefram (1258)
+
+
+Wed Jun 19 20:12:37 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/params.c, Src/subst.c, Src/utils.c: handle
+	  the case when the first character of IFS is a meta character
+
+Tue Jun 18 21:05:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshexpn.man: [...] glob documentation
+
+	* Doc/zshoptions.man: SH_GLOB disables numeric globbing on the
+ 	  result of parameter expansions and in some other cases.
+
+Tue Jun 18 19:28:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/subst.c, Src/utils.c: handle null (but not unset) IFS
+
+	* Src/exec.c: an other implementation of IFS field splitting of
+ 	  process substitutions
+
+	* Src/glob.c: in tokenize(): <> is not a glob pattern.  Do not
+ 	  tokenize < if SH_GLOB is set.  Tokenize only glob special
+ 	  characters.  in notstrcmp(): handle arbitrary big numbers if
+ 	  NUMERICGLOBSORT is used.
+
+Mon Jun 17 18:33:44 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/lex.c: reset lexstop to zero after most hungetc's
+
+Mon Jun 17 02:14:04 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zsh.texi: a major update from Clive Messer
+ 	  <clive@epos.demon.co.uk>
+
+	* Doc/zshparam.man, Src/builtin.c, Src/exec.c, Src/params.c,
+ 	  Src/subst.c, Src/utils.c, Src/ztype.h: ksh/POSIX compatible IFS
+ 	  behaviour
+
+Sun Jun 16 19:37:01 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/subst.c: ${(Oi)...} should sort case-independently in
+	  descending order.  From Thorsten Meinecke (1337)
+
+	* Doc/zshoptions.man, Etc/NEWS, Src/globals.h: swap option leters
+	  for noclobber and printexitvalue since according to POSIX 1003.2
+	  noclobber must be -C
+
+	* Src/exec.c: make noclobber a bit more secure
+
+Sun Jun 16 18:50:47 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Misc/compctl-examples: compctl for the RedHat rpm utility
+
+Sun Jun 16 14:50:42 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/system.h: include <sys/ioctl.h> if GWINSZ_IN_SYS_IOCTL is
+ 	  defined.  This in fact just removes an earlier experimental
+ 	  patch which accicently got into the release.
+
+Sat Jun 15 23:37:44 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshmisc.man, Etc/NEWS, Src/exec.c, Src/glob.c,
+ 	  Src/globals.h, Src/lex.c, Src/parse.c, Src/text.c, Src/zsh.h:
+	  <> redirection operator
+
+	* Src/builtin.c, Src/parse.c: POSIX test builtin
+
+	* Src/zle_tricky.c: use heapalloc() in reversemenucomplete()
+
+Tue Jun 11 21:03:45 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, Src/glob.c, Src/globals.h, Src/lex.c, Src/parse.c,
+ 	  Src/text.c, Src/zsh.h: POSIX redirection changes.  Epand word
+ 	  after >& or <& and decide the action after the expansion.  >&
+ 	  redirects both stdout and stderr only if the expansion of the
+ 	  word is not -, p or a number.  The &> operator is added to which
+ 	  does not check the result of the expansion.  This change also
+	  incorporates the patch from Zefram in art. 1261.
+
+	* Src/utils.c: use nicezputs for printing rm * confirmation question
+
+	* Src/exec.c: fix autoresume and %job
+
+	* Src/zle_tricky.c: use heapalloc() in do_menucomp()
+
+Mon Jun 10 20:58:16 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/glob.c: treat pattern/ as pattern(-/) instead of pattern(/)
+
+	* Perform only single-word substitution in redirections if
+	  NO_MULTIOS is set.  Based on a patch from Zefram.
+
+	* Src/parse.c: fix cmdstack empty bug when CSH_JUNKIE_PAREN is set
+
+	* Src/zle_tricky.c: fix compctl -g if nonomatch is set
+
+	* Src/parse.c, Src/lex.c: POSIX: allow an optional leading open
+ 	  parenthesis in case patterns
+
+	* Src/builtin.c: handle RLIMIT_AS in Linux 2.0
+
+Sun Jun  9 23:30:02 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: compctl -L fixes
+
+	* Src/zle_tricky.c: compctl -l '' foo only worked for the first
+ 	  argument of foo.
+
+Fri Jun  7 15:24:18 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-2.6-beta20
+
+	* Etc/NEWS: There were some changes since 2.5
+
+	* Src/params.c, Src/subst.c: sh/ksh compatibility changes: perform
+ 	  tilde and equals substitution together with other substitutions
+ 	  and disable braceless colon modifiers and subscripting in
+ 	  parameter expansion when zsh is invoked as sh/ksh.
+
+	* Src/exec.c: NULLCMD and READNULLCMD did not work if set to a
+ 	  builtin
+
+	* Doc/zshparam.man, acconfig.h, config.h.in, configure.in,
+ 	  configure, Src/hashtable.h, Src/params.c: Special parameter
+ 	  changes: remove HOSTTYPE, and disable cdpath, fignore, fpath,
+ 	  mailpath, manpath, watch, psvar and path in sh/ksh compatibility
+ 	  mode.
+
+Thu Jun  6 20:23:23 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c (doexpansion): move newlinklist() after heapalloc()
+
+	* Src/builtin.c (bin_cd): a heapalloc() was missing
+
+	* Src/builtin.c: use zwarnnam() instead of zerrnam() in most
+ 	  builtins and reset errflag to zero if necessary.
+
+	* Src/builtin.c, Src/zle_tricky.c, Src/zsh.h: new compctl options:
+ 	  -m for external commands and -w for reserved words.  -cFBmwaRG
+ 	  now only completes enabled commands.  -d, -e documentation
+ 	  fixed.
+
+Wed Jun  5 22:27:49 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: getcurcmd() did not use the heap when it
+ 	  called the lexer.  I also added some debug tests.
+
+Mon Jun  3 18:53:10 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/hashtable.c, Src/zle_hist.c, Src/zle_main.c,
+ 	  Src/zle_tricky.c, Src/zle_utils.c: add some (char *) and
+ 	  (unsigned char *) casts
+
+Mon Jun  3 16:55:44 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-2.6-beta20-test1
+
+	* Src/subst.c: multsub() did not like when prefork() resulted in
+ 	  an empty list
+
+Mon Jun  3 03:14:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/subst.c: fix brace expansion bug
+
+Mon Jun  3 01:42:58 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Makefile.in: config.status depends on Src/version.h
+
+	* Doc/zsh.man, Doc/zshall.man: remove the accents from my name
+ 	  since some man pagers do not like it
+
+	* Src/signames.awk: now this should _really_ work even with SunOS
+ 	  4 nawk
+
+	* Src/builtin.c, Src/exec.c: do not set $0 for sourced scripts and
+ 	  functions in sh/ksh mode
+
+	* Src/zle_misc.c: use heapalloc when doing substitution with
+ 	  PROMPT_SUBST set
+
+	* configure, configure.in: add -DDEBUG to the default CFLAGS
+
+	* Doc/zshbuiltins.man, Doc/zshoptions.man, Src/builtin.c,
+ 	  Src/cond.c, Src/exec.c, Src/globals.h, Src/hashtable.h,
+ 	  Src/init.c, Src/params.c, Src/utils.c, Src/zle_main.c,
+ 	  Src/zle_tricky.c, Src/zle_vi.c, Src/zsh.h: reorganized option
+ 	  handling from Zefram (1227)
+
+Sun Jun  2 23:36:36 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, Src/builtin.c, Src/glob.c, Src/hashtable.h,
+ 	  Src/subst.c, Src/zsh.h: reorganize execcmd() again.  Glob only
+ 	  the first argument before fork().  -, command, exec and noglob
+ 	  are now builtins.  The builtin builtin is now handled in
+ 	  execcmd().  fixcline() is removed.  prefork() removes null
+ 	  arguments.  The result of glob() does not have tokens so
+ 	  untokenize() is no longer necessary after globlist().
+
+	* Src/lex.c: give warnings when DEBUG is defined and the lexer is
+ 	  called with !useheap
+
+	* Src/zsh.h: added some debug macros
+
+	* Src/zle_tricky.c: use the heap in doexpansion()
+
+	* Src/parse.c: give warnings when DEBUG is defined and the lexer
+ 	  is called with !useheap
+
+Fri May 31 14:09:34 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c, Src/utils.c: nicezputs and nicechar fixes
+
+Thu May 30 18:20:46 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/exec.c: simplify makecline which also fixes a bug introcuced
+ 	  by the previous patch
+
+	* Src/exec.c, Src/hashtable.h, Src/parse.c, Src/text.c, Src/zsh.h:
+ 	  execcmd() reorganization.  Do globbing before fork, remove -,
+ 	  exec, noglob and command from the list of reserved words.
+  	  Interpret EXEC=exec ; $EXEC something like other shells.  From
+ 	  Peter (1229)
+
+Tue May 28 20:49:53 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_misc.c: fix gosmacs-transpose-chars bug when a line has
+	  less than two characters
+
+Mon May 27 23:52:54 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: clwords initialisation after resizing clwords
+	  was wrong.  From Zefram (1173)
+
+Mon May 27 17:43:31 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c: typeset -i2 a now works.  Based on art. 1165 from
+	  SUZUKI Hisao <suzuki@oz.fantasy.otsl.oki.co.jp>
+
+	* Doc/zshparam.man, Src/utils.c: expand messages in mailpath
+
+	* Doc/zshbuiltins.man: revised read manual entry from Peter (663)
+
+Sun May 26 23:14:07 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Etc/FAQ: New version from Peter
+
+Thu May 23 20:14:05 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: further improve handling of null at the end of
+ 	  a completion word
+
+	* Src/zle_tricky.c: fix problems when a completion ends in a null
+ 	  character.  From Zefram (1145)
+
+	* Src/zle_utils.c: move the line[ll] in foredel/backdel since it
+ 	  contains the null terminator character when called from
+ 	  zle_tricky.c.  From Zefram (1144)
+
+	* Src/zle_tricky.c (quotename): handle the (metafied) null
+ 	  character.  From Zefram (1143)
+
+Thu May 23 13:40:50 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-2.6-beta19 released
+
+	* Src/signames.awk: this version should work with all awks out
+	  there.  From Geoff (1142) and me
+
+	* Src/glob.c, Src/subst.c, Doc/zshexpn.man: ${...:#...}
+	  substitution now removes matching array elements
+
+Thu May 23 01:29:48 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Doc/zshoptions.man: an attempt was made to document SH_GLOB
+
+	* Src/builtin.c: popd now works even if chaselinks is set.  From
+ 	  Anthony (1123)
+
+Wed May 22 23:43:01 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/glob.c, Src/zle_tricky.c: add some remnulargs()
+
+	* Src/builtin.c: print -m fixed
+
+Wed May 22 21:00:06 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/glob.c, Src/globals.h, Src/init.c, Src/lex.c, Src/zsh.h:
+	  SH_GLOB option added
+
+Wed May 22 20:19:13 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/signames.awk: revert changes made in beta18.
+
+	* Src/cond.c (getstat): always use fstat when testing for /dev/fd/n
+
+	* Src/exec.c (getoutputfile): open the file before zfork()
+
+Tue May 21 19:39:16 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: zsh-2.6-beta18 released
+
+	* Etc/MACHINES: note that /dev/fd must be a link to /proc/self/fd
+ 	  on Linux
+
+	* Src/builtin.c: jobs exits with status 1 if the given job is not
+	  found.  From Peter (1069)
+
+	* configure, configure.in: prefer curses over termcap for aix-3.2*
+ 	  and not just for aix-3.2.5
+
+	* META-FAQ: Ftp site list changes
+
+Mon May 20 01:24:24 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/signames.awk: change #else to \#else since some nawks did
+ 	  not like the former.  From Johan Danielsson <joda@pdc.kth.se>
+ 	  (1096)
+
+	* Src/builtin.c, Src/params.c, Src/utils.c: rename join() to zjoin
+ 	  since join is used by Cray Unicos 9.  From Johan Danielsson
+ 	  <joda@pdc.kth.se> (1096)
+
+	* Src/utils.c (inittyptab): null is not blank and not special
+
+	* Src/zle_tricky.c: Do a lexrestore() before returning from
+ 	  get_comp_string().
+
+	* Src/zle_tricky.c: Undo Zefram's modifications in quotename() to
+	  fix a bug when completing ~/foo
+
+Sun May 19 23:20:45 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: Reformat and add some comments.
+	  From Zefram (1092)
+
+	* Src/zle_tricky.c: Make completion 8-bit clean.  From Zefram (1092)
+
+	* Src/glob.c, Src/subst.c: use STOUC instead of (unsigned char) cast
+
+	* Src/glob.c, Src/subst.c: Make substitution compatible with
+ 	  (ba)sh and other little cleanups in lex.c.
+
+	* Src/hashtable.c, Src/utils.c: Make output 8-bit clean in zerr()
+ 	  and in hashtable.c.  From Zefram (1093)
+
+	* Src/glob.c, Src/lex.c, Src/subst.c, Src/utils.c, Src/zle_main.c,
+ 	  Src/zle_refresh.c, Src/ztype.h: use STOUC instead of (unsigned
+ 	  char) cast
+
+	* Src/glob.c, Src/globals.h, Src/lex.c, Src/subst.c, Src/zsh.h:
+ 	  Make substitution compatible with (ba)sh and other little
+ 	  cleanups in lex.c.
+
+Fri May 17 20:23:47 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/version.h: 2.6-beta18-test1
+
+	* Src/zle.h, Src/zle_hist.c, Src/zle_main.c, Src/zle_misc.c,
+ 	  Src/zle_move.c, Src/zle_tricky.c, Src/zle_vi.c, Src/zle_word.c:
+ 	  Rename mult to zmult since mult caused problems on Solaris 2.5
+
+	* Src/zle_hist.c, Src/zle_tricky.c, Src/zle_utils.c,
+ 	  Src/zle_word.c, Src/zsh.h: Remove UTOSCP and STOUCP macros
+
+	* Etc/MACHINES: Note about GNU strip bug on OSF/1
+
+Thu May 16 23:46:44 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_hist.c, Src/zle_utils.c: Some simple cleanups in
+	  doisearch() and hstrnstr()
+
+	* Src/zle_hist.c: Recall the last isearch if fwd/bck-isearch
+	  repeated on an empty search.  It also fixes a rare isearch bug.
+	  From Wayne (1084)
+
+Thu May 16 00:15:42 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* acconfig.h, config.h.in, configure, configure.in, Src/system.h:
+	  configure hacks against SCO bugs
+
+Wed May 15 01:41:33 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_hist.c, Src/zle_misc.c: More 8-bit zle changes
+
+	* Src/zle_hist.c: A minor optimization which also removes an
+ 	  strlen() which should have been ztrlen().  From Wayne (1071)
+
+	* Src/builtin.c: compctl fixes from Zefram (1068)
+
+Tue May 14 03:19:34 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c, Src/zle_hist.c, Src/zle_main.c, Src/zsh.h: Keep
+ 	  modified history lines until the next accept* function.  Make
+ 	  history{beginning,}search{forward,backward} 8-bit clean.  From
+ 	  Wayne (1062, 1063) and me.
+
+	* Src/exec.c: in getoutputfile() returned the ztrdupped name from
+ 	  the jobtable From Peter (1061)
+
+Mon May 13 02:17:07 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/zle_tricky.c: temporary 8-bit clean patches
+
+	* Src/utils.c, Src/zsh.h: Add META_HEAPDUP method to metafy
+
+	* Src/builtin.c: Use #error again but do not put the # to the
+	  first column to make the traditional cpp happy
+
+	* Src/exec.c, Src/params.c: Do not call singsub() if parsestr()
+ 	  returned an error.
+
+	* Src/lex.c: dquote_parse() did not return error on unmatched `.
+	  parsestr() now restores the original string on error.
+
+	* Src/init.c: Change backquotes to normal quotes in the default
+ 	  sprompt to make it work if PROMPT_SUBST is set.
+
+	* Src/exec.c: Remove debug test for open file descriptors in closem()
+
+	* Src/exec.c, Src/parse.c: Fix coredump when chpwd is autoloaded
+
+	* Src/zle_hist.c: history-beginning-* fix
+
+	* Src/builtin.c, Src/exec.c, Src/init.c, Src/params.c,
+ 	  Src/utils.c: In metafy use -1 instead of zero if the len is
+ 	  unknown
+
+Sun May 12 01:46:12 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/utils.c, Src/zle_hist.c, Src/zle_utils.c:
+	  Incremental search fixes from Wayne (1051)
+
+Sat May 11 00:42:14 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* config.guess, configure: Use autoconf-2.10
+
+Fri May 10 21:01:56 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/glob.c, Src/hashtable.c, Src/utils.c,
+ 	  Src/zle.h, Src/zle_hist.c, Src/zle_main.c, Src/zle_misc.c,
+ 	  Src/zle_move.c, Src/zle_refresh.c, Src/zle_utils.c,
+ 	  Src/zle_vi.c: Make most of ZLE 8-bit clean.  From Zefram (1046)
+
+	* Src/exec.c, Src/utils.c: More redirection fixes from Zefram (1045)
+
+	* Src/hist.c, Src/zle.h, Src/zle_bindings.c, Src/zle_hist.c,
+ 	  Src/zle_main.c, Src/zle_tricky.c, Src/zle_vi.c: Cleanup of ZLE
+ 	  bindings (use enum, rename some functions). From Zefram (1015)
+
+	* Src/exec.c, Src/utils.c: Redirection fixes from Zefram (1011)
+
+	* Src/zle_hist.c, Src/zle_utils.c: History search improvements
+ 	  from Wayne (1014)
+
+	* Src/exec.c: Metafy was missing for autoloaded functions
+
+Fri May 10 12:06:23 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Makefile.in: Improve check-rcs and handle dot-files (like
+	  Src/.indent.pro)
+
+	* Src/zle_tricky.c: Use permanent allocation for cmdstr instead of
+	  the heap to prevent SEGV
+
+Tue May  7 20:49:17 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/builtin.c, Src/glob.c, Src/input.c, Src/zle_misc.c,
+ 	  Src/zle_tricky.c: Some changes to make Ultrix cc happy (1001)
+
+	* Src/exec.c, Src/globals.h: Do not use negative numbers in
+ 	  fdtable (996)
+
+	* Src/exec.c: Close process substitution file descriptors in the
+ 	  child process (987)
+
+Tue May  6 23:59:59 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* zsh-2.6-beta17 released
+
+Mon May  6 01:37:20 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* Src/signals.h: SIGNAL_HANDTYPE is RETSIGTYPE (*)_((int))
+
+	* Src/builtin.c: Preprocessor hacks to make the limit builtin work
+ 	  correctly.
+
+	* Makefile.in: New targets: dist-diff, release, md5sum.  Rewritten
+ 	  dist and dist-rcs rules.  A minor change to superclean-top.
+
+	* Src/Makefile.in: Rewitten tags target rules.
+
+	* Src/zle_tricky.c: do tilde expansion in expand-word and
+	  list-expand (zsh-users/200)
+
+	* configure.in, INSTALL: added --enable-zsh-debug option
+
+	* exec.c, init.c, utils.c, globals.h: create an fdtable array to
+ 	  hold information about the file descriptors used by the shell.
+  	  Do not call close() on each fd greater than 9 only on those that
+ 	  are marked in fdtable.  Use /dev/fd/ if it is available for
+ 	  <(...) and >(...) process substitutions.
+
+Fri May  3 03:38:28 1996  Zoltán Hidvégi  <hzoli@cs.elte.hu>
+
+	* README, META-FAQ, Util/zsh-development-guide: new maintainer.
+	  Some other changes in the README.
+
+	* Added the helpfiles script from Peter in Util (492)
+
+	* merged the patches from beta15-hzoli14.  Here is the ChangeLog
+	  for that:
+
+	March/April 1995
+
+	* pushd/popd changes from Anthony Heading <aheading@jpmorgan.com>
+
+	* fignore fixes from Sven
+
+	* where builtin from Zefram (5901) + manual from me.
+
+	* New glob qualifiers from Zefram (5918)
+
+	* &| backgrounding from Zefram (5919) with some manual changes
+	  from me
+
+	* New option, -m to print
+
+	* New option, -U to typeset to remove duplications from an array
+
+	* Swap -f and -F on the command line if zsh is invoked as sh/ksh.
+
+	* KSH_ARRAYS option
+
+	* array subscripts can be really used without leading $ in math
+
+	* if a parameter is used in math its value is evaluated with full
+	  arithmetic evaluation.
+
+	* # can be used in mathematical expressions as described in the
+	  manual.
+
+	* new parameter TTYIDLE containing the idle time of the current
+	  tty in seconds
+
+	* new parameter ZSHNAME to tell how zsh is invoked
+
+	* lots of bugfixes in params.c
+
+	* If SIGALRM is not trapped zsh will only exit on alarm if
+	  TTYIDLE >= TMOUT.  If TTYIDLE < TMOUT a new alarm is set to
+	  TMOUT - TTYIDLE seconds.  No change in behaviour when SIGALRM
+	  is trapped.
+
+	* $#foo when foo is an array returns the array length in double
+	  quotes
+
+	* $=foo and ${(s:...:)foo} forces splitting even in double quotes
+
+	* New flags to paramer substitution: @, A, e, p, f, F, W
+
+	* autoremoveslash if a slash is typed
+
+	* fix bugs related to menu completion and expand-or-complete-prefix
+
+	* cshjunkiequotes fixed to really emulate csh behaviour. So far
+	  backslash newline was removed in double- and backquotes but csh
+	  removes the backslash only.
+
+	* the $, # and ? special parameters can bee used without the
+	  leading $ in math
+
+	* negative sign is printed before the base in convbase
+	  (-2#111 instead of 2#-111)
+
+	* > <(foo)  and < >(foo) redirections are now cause parse error
+
+	* < <(foo) fixed (it did not work so far).
+
+	* fixed a bug when history were expanded on cat <\!foo
+
+	* history expansion is disabled in single quotes within double
+	  quotes: echo "`echo '!$'`" prints !$. It is not yet perfect but
+	  not worse than in bash since history expansion is also disabled
+	  in `echo "'!$'"`.
+
+	* echo $(echo \!$) no longer expands history. This sometimes
+	  caused infinite memory eating loops in earlier verions.
+
+	* history bangchars are only escaped in the history if they were
+	  originally escaped on the command line.
+
+	* $((...)) math evaluation is done before fork now which makes
+	  assignment and increment/decrement operators work. Now all
+	  substitutions are done before fork exept globbing. To reflect
+	  this change I removed postfork() from subst.c and replaced with
+	  globlist().
+
+	* The shell behaviour is slightly changed when the globsubst
+	  option is set.  Now globsubst is really globsubst, ie. only
+	  tidle and equals substitution and globbing is done on the
+	  result of parameter expansion and command substitution which
+	  makes it more sh-compatible. It means that foo='$bar' ; echo
+	  $foo no longer prints the value of bar.  It also prevents
+	  infinite uninterruptable loops like foo='$foo' ; echo $foo.
+	  Also globsubst no longer removes single and double quotes from
+	  the value of parameters and a backshlash is only removed if it
+	  followed by a glob special character or a backslash. The result
+	  of command substitution is handled the same way.  These are
+	  really done by tokenize() in glob.c. This function must not be
+	  used to tokenize a string before singsub(). We have to use the
+	  lexer for that. I provided a parsestr() function for that which
+	  parses a given string as it were a string within double quotes
+	  (but it may contain double quotes).
+
+	* Expansion does not starts again on each expanded parameter
+ 	  which should make it a little faster. With rcexpandparam set
+ 	  the part of the line following the array evaluated only
+ 	  once. This makes it a little bit faster but it may cause
+ 	  problems when the tail of the line has an arithmetic expression
+ 	  with a side effect: $foo$[i++] increments i by one but in old
+ 	  versions i was incremented by the number of array elements. If
+ 	  foo is an empty array i is not changed in either versions.
+
+	* Parsing of mathematical substitutions are now done like double
+ 	  quoted strings. The body of a math substiturion is first
+ 	  expanded using parameter, command and arithmetic substitution
+ 	  and only the result is evaluated. This means that modifyers,
+ 	  backquote substitution and ${foo##$bar} type expansions can be
+ 	  used. This makes ((...)), $((...))  and $[...] completely
+ 	  equivalent.
+
+	* If $@ is empty ''$@ and $@"" and similar arguments are not
+ 	  removed. The argument is only removed from the argument list if
+ 	  it is written as "$@"	(or if rcexpandparam is set).
+
+	* zatol() function is removed
+
+	* doexpandhist() (ie. magic-space) now keeps the cursor in the
+	  right palace in all cases I hope.
+
+	* lexer fixes to help completion and to fix parsing problems in
+ 	  brace-params (things like ${foo:-()} and ${foo:-|} used to give
+ 	  a parse error but ${foo:-(}) didn't.)
+
+	* get_comp_string completely rewritten
+
+	Wed Apr 12 1995
+
+	* I changed the lexer to allow `]' characters in [...] glob
+ 	  list. This is to make zsh compatible with all other shells I
+ 	  know. This should be documented in the manual where the
+ 	  description of [a-z] syntax is also missing. I'd copy the
+ 	  relevant part from an other manual page but there may be
+ 	  copyright problems with that. I looked at some man pages but
+ 	  they contained almost word-by-word the same so I think we can
+ 	  do that as well (change some words perhaps).
+
+	* There are some important changes in the new substitution code.
+  	  The right hand side of parameter assignments is no longer
+ 	  globbed by default (note that tidle and equals substitution is
+ 	  not globbing). This is compatible with sh/ksh/bash. I added an
+ 	  option, GLOB_ASSIGN which can be set to restore the old
+ 	  behaviour but I do not recommend the usage of this option. For
+ 	  more details, see the manual.  If GLOB_ASSIGN is not set, it is
+ 	  guaranteed that foo=... assignments assign a scalar value. In
+ 	  earlier versions foo=* or foo=$bar where bar is an array
+ 	  created scalars if the result had zero or one words and an
+ 	  array otherwise.
+
+	Thu Apr 13 1995
+
+	* prompts are empty if the shell is not interactive from
+	  P.Stephenson (5836)
+
+	* pwd -r prints the real path
+
+	* emulate builtin
+
+	* ! and bangchar quoting fixed.
+
+	* echo { prints { when ignorebraces is set
+
+	* completion works correctly with COMPLETE_ALIASES
+
+	Tue Apr 18 1995
+
+	* i/o not redirected to /dev/null in <(...) and >(...) (both in
+ 	  redirections and in arguments).
+
+	Wed Apr 19 1995
+
+	* ${$(...)...} syntax can be used
+
+	Sat Apr 29 1995
+
+	* zle history expansion was buggy when a word begun with a #.
+	  It's fixed.
+
+	* prompt substitution is now completely functional (things like
+	  ${...##...} or `...` are usable now in prompts)
+
+	Fri May  5 1995
+
+	* USERNAME, LOGNAME, HOST, TTY and signals are no longer specials
+ 	  parameters. They are initialized as before but are now writable
+ 	  and unsettable.
+
+	* make sure that vared does not go to the previous history line
+ 	  with up-line-or-history.  You can use vared -h to get the old
+	  behaviour.
+
+	Tue May  9 1995
+
+	* TAB always inserts itself at the beginning of a line (6126, 6146)
+
+	Sat Jun  3 1995
+
+	* Leading zero no longer denotes octal. Leading 0x still means
+ 	  hex and it also sets lastbase. (95)
+
+	* getvar in math.c removed
+
+	Fri Jun  9 1995
+
+	* cdmatch2 function to complete the 2nd arg. to cd/pushd
+
+	Fri Jul  7 1995
+
+	* Fix :s/l/r/ modifier when l is empty (176)
+
+	* Prefixed commands no longer trigger autoresume from
+	  P.Stephenson (172)
+
+	* FOO=bar function now set the FOO environment variable in the
+	  function from P.Stephenson (103)
+
+	* Leading . is not special for ~ exclude patterns from
+	  P.Stephenson (98)
+
+	* Do not exit the spelling prompt until an acceptable key is
+	  pressed.  From Wayne Davison <wayne@tenor.clarinet.com> (6138)
+
+	* Capitalize ../configure to ../Configure from Wayne (6132)
+
+	* After yank, mark set to the beginning of the yanked text from
+	  Wayne (6131)
+
+	* . file no longer sources directories. From P.Stephenson (6063)
+
+	* Prevent infinite loops when zle expands history.
+	  From Zefram (152) with a few hunks omitted.
+
+	Sat Jul  8 1995
+
+	* executenamedcommand() now resets showinglist to zero on exit to
+ 	  prevent a SEGV when a list of completion (of zle commands) was
+ 	  showed. (193)
+
+	Mon Jul 10 1995
+
+	* !:s//r/ gives `no previous substitution' message instead of
+	  "no previous substitution with &". From Thorsten Meinecke (182)
+
+	* $foo:s//r/ gives similar error message (it didn't use to give
+	  any) (194)
+
+	* print -c fixes from Zefram (183)
+
+	* HIST_NO_STORE fix from Zefram (186)
+
+	* Manual fix: export = typeset -x. From Zefram (190)
+
+	* type/whence/which -f option ducumented. From Zefram (192)
+
+	* whence builtin fix from Zefram (192)
+
+	Mon Jul 17 1995
+
+	* A fix for Sven's old fignore fixes from Wayne (213)
+
+	* print builtin option fixes from Zefram (214)
+
+	* Disable list-expand zle function inside braces etc. From Zefram
+	  (215)
+
+	Wed Jul 19 1995
+
+	* Make self-insert refuse the NUL character. From Zefram (238)
+
+	* Completion on words containing quoted char's fix (250)
+
+	Mon Jul 24 1995
+
+	* Completion fixes for words beginning with ~ or =. From Zefram
+	  (241)
+
+	* vi mode fixes from Zefram (230)
+
+	* Allow prefix/suffix in xor'd completion. From Zefram (254)
+
+	* sh compatibility option: NO_MULTIOS. From Zefram (255, 260)
+
+	* vi-forward-char beeps when it has to beep. From Zefram (258)
+
+	* Allow more than one line long status line (or minibuffer). From
+	  Zefram (256)
+
+	* Minibuffer fixes: more zle commands, long search
+	  strings... From Zefram (261)
+
+	* vi-quoted-insert and quoted-insert in minibuffers. From Zefram
+	  (262)
+
+	* make sure that vi-backward-kill-word doesn't delete past the
+	  beginning of the line. From Zerfam (263)
+
+	* execute-named-cmd fixes from Zefram (264)
+
+	Tue Aug  8 1995
+
+	* Patch from Peter to prevent writing the builtin command names
+	  (293)
+
+	* Removed the -fwritable-strings kludge.
+
+	Wed Aug 16 1995
+
+	* a zsfree moved after an error-check in subst.c. From Thorsten (322)
+
+	* Initialize hsubl/hsubr to NULL in globals.h (323)
+
+	Thu Sep 21 1995
+
+	* input.c and here documents bugfixes (395,398)
+
+	Sun Sep 24 1995
+
+	* K, M and G size glob qualifiers from Thorsten Meinecke (402)
+
+	Mon Nov  6 1995:
+
+	* Do not save history on exec/exit from init scripts. (538)
+
+	Wed Jan  3 1996:
+
+	* Whence -f is back.  From Zefram (644)
+
+	* A single ^ no longer crashes zsh.  From Peter (560)
+
+	Mon Jan  8 1996
+
+	* Fix echotc to work with ncurses
+
+	Fri March  1 1996
+
+	* It's a bug to call lexsave with alstackind != 0 (792).
+
+	Sun March  3 1996
+
+	* The first working and mostly 8-bit clean version.
+
+	* add lexsave/lexrestore to parselstring()
+
+	* save/restore tok with lexsave/lexrestore
+
+	* a xored completion bugfix in zle_tricky.c
+
+	* cd .. should not use cdpath (877)
+
+	* get magic-space & completion work with interactivecomments
+
+	* an fc builtin fix
+
+	Mon March  4 1996
+
+	* make n and N extended completions work on words with special
+	  characters (880)
+
+	* Allow colon qualifiers with ^...^...^ history substitution.
+	  From Peter (608)
+
+	* Fix printquoted() to handle CSH_JUNKIE_QUOTES.  From Zefram (713)
+
+	* AUTO_PUSHD option documentation fix forom Anthony Heading (598)
+
+	Wed March  6 1996
+
+	* Fix $PATH[1,(ws.:.)-2] type expansions (800).
+
+	Tue March 19 1996
+
+	* Do not use setvbuf(stderr, NULL, _IOFBF, 0) to work around a
+	  bug in Linux libc 5.3.6 or older.
+
+	* Fix a little bug in compctl -l (841)
+
+	Fri March 22 1996
+
+	* mypid, lastpid, ppid should be long instead of pid_t (846)
+
+	Fri March 29 1996
+
+	* Set $? to 1 after wibble=$(false).
+	  From Zefram and me (637, 855, 856)
+
+	* Prevent infinite loops when zsh looses its controlling
+	  tty. From Peter (862)
+
+	Sun March 31 1996
+
+	* signal handling fixes from Peter (6200, 89, 91, summarized in
+	  826).
+
+	* Some fixes related to quotes and completion (882)
+
+	Sat April 27 1996
+
+	* Execute traps properly.  From Peter (929)
+
+	* Yet an other vi mode fix from Zefram (936)
+
+	* \ should quote \ in here documents.
+
+	* Workaround a bug in GNU autoconf which makes configure think
+ 	  that there is no -lcourses and -lncurses if the test for
+ 	  -ltermcap failed.  From János Farkas <chexum@shadow.banki.hu>
+ 	  (972)
+
+	Sun April 27 1996
+
+	* Call entersubshell after opening the pipe in getproc to avoid
+ 	  hangs in open.  This prevents hangs when a $(... <(...))
+  	  substituion is interrupted in an unfortunate moment. (964)
+
+Wed May  1 03:49:31 1996  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh-2.6-beta16 released.  rc.
+
+	* read -q and read -k would mess up terminal if
+	  non-interactive.  From P.Stephenson (565).
+
+	* Must call init_term() in putpromtpt so that %-sequences
+	  are recognized in non-interactive shells.
+	  From Eskandar Ensafi (791).
+
+Tue Apr 30 02:08:48 1996  Richard Coleman  <coleman@math.gatech.edu>
+
+	* fixed time printing bug in printhhmmss when time was
+	  small.  From Zoltan (793).
+
+Mon Apr 29 03:37:35 1996  Richard Coleman  <coleman@math.gatech.edu>
+
+	* fixed history from dropping last line of multi-line command
+	  when it contains a comment.  From P.Stephenson (741).
+
+	* Change all functions in loop.c to give execlist non-zero
+	  parameter for dont_change_job.  Removed code in functions
+	  in loop.c to remember current job number.  rc.
+
+Fri Apr 26 20:50:40 1996  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Small cleanup of handling of SIGCHLD signal.  rc.
+
+	* Fix vi range bug.  From Zefram (936).
+
+	* execpline and execpline2 now assume that the
+	  sublist/pipeline passed to them is not NULL.  NULL
+	  arguments must be handled higher up.  From rc.
+
+	* Prefer curses library over termcap for certain versions
+	  of AIX.  From Mike Kazda (948).
+
+	* Updated MACHINES entry for Linux.  From Bas.
+
+	* Rearrange function execlist.  From rc.
+
+Thu Apr 25 01:34:02 1996  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Merged initjob and getfreejob.  From rc.
+
+Wed Apr 24 22:15:22 1996  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh-2.6-beta15 released.  From rc.
+
+	* Merge runlist and execlist.  Add parameter to execlist
+	  and execstring to retain current job number.  Remove
+	  function zyztem.  From rc.
+
+Mon Apr 15 01:27:16 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* Fixed typo in zle_tricky.c.  From Samuel Tardieu (925).
+
+	* Zsh-2.6-beta14 released.  From rc.
+
+Sat Apr 13 01:49:07 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* alias -L now prints `-- ' first if alias begins with
+	  `-'.  Also changes reporter to use "alias -L".  Also
+	  removed Log messages from reporter.  From Zefram (712).
+
+Fri Apr 12 19:16:53 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* Printing was missing glob characters.
+	  From Zoltan (705).
+
+	* Small rearrangement of function `source'.  From rc.
+
+	* Change zshall.x to use relative paths to other man
+	  pages.  From Zefram and others.
+
+Thu Apr 11 01:32:11 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* Move code to hash whole directory into cmdnamtab
+	  to its own function `hashdir'.  From rc.
+
+	* Unbalanced stack in math expression could cause
+	  core dump.  From Zoltan (879).
+
+	* Tighten up security on temporary files.
+	  From Zoltan (881).
+
+Tue Apr  9 02:01:09 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* Make termbuf local rather than global.  Only allocate
+	  static termbuf if tgetent will not accept NULL termbuf
+	  (and hence allocate its own).  Add configure check for
+	  tgetent that accepts NULL termbuf.
+	  From Zoltan (878, 892).
+
+Fri Apr  5 01:23:40 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* Lots of refresh bugs fixed.
+	  From Mason (820,831,867,868).
+
+Sun Mar 31 23:34:38 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* Update configure to version 2.9.  From rc.
+
+Fri Mar 29 23:44:47 1996  Richard J. Coleman  <coleman@math.gatech.edu>
+
+	* Add emptytable and filltable methods to hash tables.  Changed
+	  fullhash and addusernames to be these methods for cmdnamtab
+	  and nameddirtab.
+	  From rc.
+
+Mon Mar 25 20:08:15 1996  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Convert named directories table from a link list
+	  to a hash table.  From Zefram (711).
+
+Thu Dec 21 10:00:00 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh-2.6-beta13 released.
+
+Mon Dec 18 23:25:34 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Make the parameters WATCHFMT, TIMEFMT, TMPPREFIX,
+	  and FCEDIT non-special parameters.  From Zoltan (271).
+
+Sat Dec 16 22:50:51 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix in trashzle, and small cleanup of do_ambiguous which
+	  fixes a double listing problem when LIST_AMBIGUOUS is
+	  unset.  From Zefram (694).
+
+	* Fix so that escape sequences (bold, etc...) work
+	  in WATCHFMT strings.  From P.Stephenson (695).
+
+Wed Dec 13 00:30:22 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Updated MACHINES files with info about OSF/1 and Solaris
+	  from the FAQ.  From rc.
+
+	* Fix zle bug, where completion list wasn't being invalidated
+	  after ^C.  From Zefram (687).
+
+Mon Dec 11 00:02:44 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Addition to zshexpn.man to describe when history
+	  expansion takes place.  From P.Stephenson (624).
+
+	* Clean up the nice* printing functions, as well
+	  as add support for 8-bit characters.  Patches were
+	  submitted from various people { P.Stephenson,
+	  Thorsten Meinecke, Zefram }, but I used patches
+	  (646,647).
+
+Sun Dec 10 20:20:18 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix problem with 8-bit-cleanliness in input.c.
+	  From various people.
+
+	* A couple of fixes for refreshing screens with
+	  automargin.  From P.Stephenson (662).
+
+	* Use strerror instead of sys_errlist in utils.c.
+	  From P.Stephenson (667).
+
+Fri Dec  8 02:15:52 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix Doc subdirectory to work if building in an
+	  alternate directory.  From Scott Blachowicz.
+
+Mon Nov 20 23:21:45 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh-2.6-beta12 released.
+
+	* Updated to GNU autoconf 2.6.  From rc.
+
+	* Improve handling of valid termcap entries that
+	  don't have the ability to move up.  From P.Stephenson
+	  (623).
+
+Sat Nov 18 23:39:16 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Updated INSTALL, configure.in, aclocal.m4, and
+	  Makefile.in to GNU autoconf 2.5.  From rc.
+
+Thu Nov 16 01:38:38 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* BGNICE was running in parent rather than child.
+	  From rc.
+
+	* Fix problems with completion explanation strings.
+	  From Zefram (240).
+
+	* Fix bug with REC_EXACT.  From Zefram (207).
+
+	* Fix bug where when LIST_AMBIGUOUS is unset, it will
+	  sometimes insert the unambiguous portion a second
+	  time.  From Zefram (199).
+
+	* Remove a superfluous display of a completion list when
+	  AUTO_LIST and ALWAYS_LAST_PROMPT are set.  From
+	  Zefram (198).
+
+	* Clean up the way completion lists are shown.
+	  From Zefram (165).
+
+	* Make zle so that it will keep a completion list fully
+	  visible on the screen if it is still valid.  From
+	  Zefram (151).
+
+	* Reorganize the completion code so that it only works
+	  out the completion list again when something has
+	  actually changed.  From Zefram (145).
+
+Wed Nov 15 22:13:17 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Several cleanups and fixes to the input, and history
+	  mechanisms.  Fixed bug where completing after command
+	  that was an alias containing itself would expand
+	  repeatedly.  Fixed bug where aliases ending in spaces
+	  would leave the spaces in the history line.  Also removed
+	  INP_SPACE, INP_OLDSPACE hack of adding bogus space.
+	  From P.Stephenson (611,612,614).
+
+Tue Nov 14 03:33:45 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix substitution bug for ${FOO:-} when FOO is unset.
+	  From Zoltan and P.Stephenson (545).
+
+	* Did some reorganization for code in execcmd() that
+	  determines if the shell should fork.  Removed the
+	  flag CFLAG_FAKE_EXEC since it was no longer needed.
+	  From rc.
+
+Mon Nov 13 20:48:54 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Don't do FAKE_EXEC for jobs running in the
+	  current shells.  From P.Stephenson (604).
+
+Fri Nov 10 01:47:04 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Change mechanism by which history remembers word breaks.
+	  Uses an array of indexes into the history event rather
+	  than adding character HISTSPACE to remember word breaks.
+	  Remove special parameter LITHISTSIZE.
+	  Remove zsh option HISTLIT.
+	  From P.Stephenson (515).
+
+Wed Nov  8 00:07:01 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Combine catproc, teeproc, and closemn in exec.c.  Also fixes
+	  a memory leak in multio.  From rc.
+
+	* Fix exec.c so that _exit rather than exit is used
+	  from subshells.  We now keep track of which subshells
+	  are real and which are fake (we are doing an exec).
+	  From P.Stephenson (562).
+
+	* Small cleanups for man pages zsh.1, zshall.1,
+	  zshmisc.1.  From rc, Mark Borges, and Mark Hanson
+	  (570,571)
+
+	* Installation of man page zshall.1 will now
+	  insert correct location of other man pages. From rc
+	  and Zefram (566).
+
+Mon Nov  6 22:32:19 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta11 released.
+
+Sat Nov  4 23:49:15 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix whence/which/type so that commands added with
+	  `hash foo=bar' are correctly reported.  From rc.
+
+Thu Nov  2 03:04:09 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Delay setting up terminal and termcap in noninteractive
+	  shells until needed.  From P.Stephenson (479).
+
+Wed Nov  1 18:20:49 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Remove some arbitrary buffer limits in zle_tricky.c
+	  From Zoltan (506).
+
+	* Fix not clearing properly if more characters were
+	  inserted than deleted.  Fix not clearing the last
+	  character in the line if rprompt was printed.
+	  From Geoff Wing (164,273).
+
+	* Fix core dump in `bindkey'.  From P.Stephenson (514).
+
+Mon Oct 30 01:49:10 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Added -L option to `alias' builtin.  From rc.
+
+Sun Oct 29 04:34:51 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Removed hack of setting sourcelevel to 32768 to suppress
+	  errexit and trapping of SIGZERR and SIGEXIT in init scripts.
+	  Added global noerrexit for this.  From rc.
+
+	* Added new command flag CFLAG_FAKE_EXEC.  This flag is used
+	  when we can pretend this is an `exec' since this is the
+	  last command in a subshell, or for `zsh -c'.  Rearranged code
+	  to determine whether to do a fake exec.  Fixed code so that
+	  fake exec (typically from command substitution) doesn't trash
+	  the history file.  Also added code to save history file when
+	  exec'ing a builtin.  From rc, Zoltan, and P.Stephenson.
+
+Wed Oct 25 22:58:54 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fixed hash -d foo=/usr/local/foo.  Also fixed hash -d foo
+	  so that is doesn't try to free memory from the heap.  From rc.
+
+Thu Oct 19 19:13:33 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Documentation fix for BRACE_CCL.  From P.Stephenson (173).
+
+	* Add -Q option to compctl.  From Zefram (167).
+
+	* New version of reporter script.  From Karl Vogel.
+
+	* Add [[ str == pat ]].  From Zoltan (451).  The old
+	  syntax remains, but this should be considered the
+	  preferred form.
+
+	* Add code to workaround a bug in in.rshd.  It is
+	  not turned on by default.  You need to add the
+	  #define RSH_BUG_WORKAROUND to turn on this code.
+
+	* When you disable/enable a shell function
+	  such as TRAPsig, the trapping of the signal
+	  `sig' will also be disabled/enabled.  From rc.
+
+Mon Oct  9 19:34:07 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Spelling correction changes.  From Zoltan.
+
+	* Prompt code changes.  From Zefram (195,265) and
+	  Zoltan (280).
+
+Fri Oct  6 14:10:35 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix for input.c and hist.c when comparing
+	  HISTSPACE.  From P.Stephenson (421).
+
+Wed Oct  4 02:25:23 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* gettext2 wasn't printing text for pre-commands
+	  noglob and `-'.  From Zefram.
+
+	* Should do bitwise-or for CFLAG_DASH.  From Zefram
+	  and Zoltan.
+
+Mon Sep 25 00:18:08 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Rearrange things in setupvals() so that path is
+	  set before cmdnamtable is built.  From Zoltan.
+
+	* Only tokenize commas that are inside of
+	  brace expansion.  From Zoltan (403).
+
+	* Fix command resolution for commands (such as
+	  typeset) that need automatic MAGIC_EQUAL_SUBST
+	  substitution.  From Zefram.
+
+Sun Sep 24 20:19:33 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* A small fix for compctl.  From Zefram.
+
+	* Change phork to zfork.  From rc.
+
+	* Fix core dump when setting trap.  Also remove
+	  warning message about unsetting unset parameters.
+	  From Zoltan.
+
+Thu Sep 21 02:10:02 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Cleanups for glob.c.  From Zoltan (202).
+
+	* Rearrange the checking of hash tables for
+	  commands.  From Zefram and rc.
+
+Tue Sep 19 21:23:54 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix to function restarthashtable so that if
+	  restarting a table that is not re-allocated,
+	  the memory will be re-zeroed.  This fix core dumps
+	  when PATH is changed.  From rc.
+
+	* Fix tty-opening code in init_io.
+	  From P.Stephenson (391).
+
+Mon Sep 18 18:58:23 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Change Z_* pipeline flags to be or'able.  This
+	  cleans up pipeline code as well as making
+	  `time command' work correctly in subshells.
+	  From P.Stephenson (384).
+
+	* Small patch to input routines for `eval'.
+	  From P.Stephenson (385).
+
+	* More cleanup of builtin `compctl'.  From Zefram
+	  and rc.
+
+Sun Sep 17 01:50:40 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Improvements and additions for the compctl's in
+	  compctl-examples.  From Zefram.
+
+Thu Sep 14 20:00:32 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Cleanup of printing text with special characters.
+	  Move this printing into own function printquoted.
+	  From Zefram (170,184).
+
+	* Add man info for fc -i.  From Zefram.
+
+	* Fix for signal trapping bug.  From P.Stephenson (119).
+
+	* Fix bug of using spacejoin when IFS has changed.
+	  From Zoltan (52).
+
+Tue Sep 12 20:56:46 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add code for unhash -d.  From Zefram.
+
+	* Add back code for re-running autoloaded functions
+	  that define themselves by name.  Also fix bug in
+	  running autoloaded functions with parameters.
+	  From P.Stephenson (379).
+
+Sat Sep  9 00:28:02 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Corrected man page entry for hash, unhash, rehash,
+	  function, unfunction, enable, disable, alias,
+	  and unalias.  rc
+
+Fri Sep  8 17:03:18 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Added zshall man page.  From P.Stephenson.
+
+	* New version of zshcompctl man page from
+	  P.Stephenson (234).
+
+	* Fix completion code w.r.t the separated hash tables.
+	  Also makes the disabled/enabled flags act as
+	  modifiers.  From Zefram.
+
+	* Moved code in execcmd to save/restore parameters
+	  (for shell functions and buiiltins) to their own
+	  functions.  Also cleaned it up some.  rc
+
+	* Cleaned up bin_typeset some.  rc
+
+Thu Aug 31 00:21:54 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Change configure to get right signal.h file for
+	  Linux 1.3.x.  From Thorsten Meinecke and Zoltan
+	  (196,289).
+
+	* Eliminate ZLE_NAMEDBUFFER.  From Zefram (136).
+
+	* Big patch to clean up base routines for history
+	  input.  From P.Stephenson (140,334).
+
+Mon Aug 28 21:01:03 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add some detail to file globbing flags.  Mark Borges (323).
+
+	* Split function handling code out of bin_typeset into
+	  bin_functions.  rc
+
+Tue Jul 18 05:13:01 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Changed syntax of hash builtin.  Use the syntax
+	  "hash foo1=bar1 foo2=bar2" to add elements to the
+	  cmdnam hash table.  Also added the -m option which
+	  will print out all elements of cmdnam table matching
+	  a glob pattern.  rc
+
+Mon Jul 17 16:42:49 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Merged bin_enable and bin_disable.  rc
+
+Sat Jul 15 04:46:03 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Merged bin_hash and bin_rehash.  Split named dir
+	  code in bin_hash out into its own function
+	  bin_nameddir_hash.  rc
+
+Fri Jul 14 00:16:47 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* You can enable/disable reserved words with
+	  "enable -r", and "disable -r".  You can enable/
+	  disable aliases with "enable -a", and
+	  "disable -a".  rc
+
+Mon Jul 10 20:29:37 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* unhash only unhashed entries in hash table for external
+	  commands.  Use "unhash -f" to unhash shell functions.  Added
+	  option so that "unhash -a" will unhash elements of the
+	  alias hash table.  unfunction is now equivalent to "unhash -f".
+	  unalias is now equivalent to "unhash -a".  rc
+
+
+	* enable/disable now only works on builtins.  You can use
+	  "enable -f" or "disable -f" to enable/disable shell
+	  functions.  rc
+
+	* Split hash table cmdnamtab into 3 hash tables.  cmdnamtab
+	  for external commands and hashed commands.  shfunctab for
+	  shell functions.  builtintab for builtin commands.  This
+	  of course entailed lots for changes in builtin.c.  rc
+
+Fri Jun 30 05:10:13 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta10 released.
+
+	* Make HOSTTYPE, OSTYPE, MACHTYPE, VENDOR, and
+	  ZSH_VERSION non-special parameters.  From Zoltan (5827).
+
+	* Added parameter ZSH_NAME.  From Zoltan (5615).
+
+Wed Jun 28 17:25:23 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Build/installation parameters that are changed in the
+	  top makefile are now passed down to recursive makefile
+	  calls.  From rc.
+
+Mon Jun 26 04:32:33 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add some comments and some small cleanups of params.c.
+	  From rc.
+
+Fri Jun 23 03:37:55 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Assuming sufficient privileges (typically root), you can
+	  change the username (and uid and gid) of the shell process
+	  by assigning to USERNAME.  Also (again assuming sufficient
+	  privileges) you can start an individual command under a
+	  different username (and uid/gid) by:
+	  USERNAME=username command
+	  From rc.
+
+	* Updated the man page entries for USERNAME, UID, GID,
+	  EUID, EGID, and LOGNAME.  From rc and Zoltan.
+
+Mon Jun 19 02:07:46 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Allow var[a,b]=c type string assignments  when b < a.
+	  From Zoltan (5791).
+
+Sun Jun 18 01:17:08 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add a glob of comments (pun intended) to glob.c.
+	  From P. Stephenson (101).
+
+Fri Jun 16 00:30:41 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Use zsh's own zstrtol instead of vendor strtol
+	  since a lot of them are broken.
+
+	* Fix some problems dealing with 64 bit ints.
+	  From Zoltan (5826).
+
+	* Add new versions of config.sub and config.guess to
+	  distribution.  Rebuilt configure with new autoconf 2.4.
+
+Thu Jun 15 00:25:43 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add new builtin called "hashinfo" which will dump
+	  stats about the various internal hash tables.  You can enable
+	  this command with the configure option --enable-zsh-hash-debug.
+	  This will add the #define ZSH_HASH_DEBUG to config.h.
+
+	* Add support for printing time report in HH:MM:SS
+	  format.  From Zoltan (96).
+
+	* Changed the DEFAULT_TIMEFMT to
+	  "%J  %U user %S system %P cpu %*E total".
+	  From rc.
+
+	* Cleanup of code to print a condition.
+	  From P. Stephenson (74).
+
+	* Make errors in math evaluation in let are non-fatal.
+	  Also fix some problems with multiple traps.  From
+	  P.Stephenson (59).
+
+	* Fix for redirection bug.  From Zefram (31).
+
+	* Merge setmoreflags and initterm into init_io.
+	  From P.Stephenson (64). 
+
+	* Use _exit instead of exit when in subshell and
+	  CFLAG_EXEC.  From P.Stephenson (72).
+
+Wed Jun 14 23:17:55 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add support for NIS+.  From Sven Wischnowsky (77).
+	  ( No configure support yet )
+
+Thu Jun  8 14:16:28 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Small fix to vicmdmode.  From Zefram (86).
+
+	* Add configure test for CLOBBERS_TYPEAHEAD.
+	  From P. Stephenson (88).
+
+	* Big reorganization of code dealing with the various
+	  hash tables.  From rc.
+
+Tue May 30 01:55:51 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta9 released.
+
+	* Add some optimisations to matheval.  From P. Stephenson (55).
+
+	* Separate the I/O of zle from direct reliance on
+	  stdin/stdout or fd's 0 and 1.  From P. Stephenson (26).
+
+Fri May 26 00:01:52 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Merged setupparams and setparams into buildparamtab.
+	  From Richard Coleman.
+
+	* Split aliases and reserved words into two separate
+	  hash tables.  From Peter Stephenson (33).
+
+Thu May 25 00:27:55 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Tighten up permissions on temporary files and named
+	  pipes that zsh creates.  From Duncan Sinclair (5298).
+
+Mon May 22 23:54:52 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Use sed instead of cut in configure.  From Eskandar.
+
+Fri May 19 00:08:52 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add some casts to pacify noisy compilers.
+	  From Zoltan (6123).
+
+	* Fix for describe-key-briefly and where-is which
+	  had problem with command lines spanning more than
+	  one screen.  From Zoltan (6127).
+
+	* Fix core dump in bindkey.  From Peter (6198).
+
+	* Fix typo in exec.c code.  From Peter (6197).
+
+	* Fix for redisplay from Zefram (6009).
+
+	* Small fix for missing newlines in single_line_zle
+	  mode. (6201).
+
+Wed May 17 01:50:48 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Added function zrealloc to mimic POSIX realloc.
+
+Wed May 10 19:13:34 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix so that with builtin at the end of a pipeline,
+	  the return value of pipeline is return value of
+	  builtin.  From P.Stephenson (6161).
+
+	* Fix problem with exec.  From P.Stephenson (6160).
+
+Tue May  9 00:35:45 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fixes to read builtin.  From Dave Sainty (6142).
+
+	* Vi mode fix.  From Zefram (6115).
+
+Mon May  8 23:44:00 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Patch for exec.c so that execpline will correctly invert
+	  return values of !foo, when foo is shell function.  From
+	  P.Stephenson (6098).
+
+Thu May  4 00:02:51 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta8 released.
+
+	* Allow globbing of words beginning with %.  From
+	  Zoltan (6002).
+
+	* Add -T option to compctl.  From Sven (6028).
+
+	* Patch to allow array subscripts in arithmetic
+	  evaluations without $.  From Zoltan (5715).
+
+	* Patch so that exec bit gets to execcursh by execcmd.
+	  From P.Stephenson (6076).  Now zsh -c '{ foo }' will
+	  exec last command instead of forking.
+
+Wed May  3 23:56:21 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix bug in accept-and-menu-complete on variable
+	  names.  From Zoltan (6078).
+
+Tue May  2 00:17:47 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Remove redundant call to inittyptab in setupvals
+	  in init.c.  (rc)
+
+	* Setopt PROMPTSUBST if started as sh or ksh.  From
+	  Zoltan (6070).
+
+	* Check for /dev/fd filesystem with configure.  Don't
+	  do /dev/fd simulation in conditional expressions
+	  unless /dev/fd is not supported.  (rc)
+
+	* Patch for job.c so that ^C-ing a job started by a
+	  function stop the whole function.  From Sven (5837).
+
+Mon May  1 23:50:05 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Patch so that zsh -c and subshells will exec last
+	  command correctly.  From P.Stephenson (6057).
+
+Sun Apr 30 04:28:57 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fixed handling of ${foo+`echo hello`}.
+	  From Zoltan (6019).
+
+	* Fixed reversed arguments in difftime compatibility
+	  function.  From Wayne Davison (6050).
+
+Wed Apr 26 20:07:27 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta7 released.
+
+Tue Apr 25 00:56:13 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix some memory leaks.  From Zoltan (5959).
+
+	* Setopt NOBADPATTERN if started as sh or ksh.  From
+	  P.Stephenson (6031).
+
+	* Big patch for zle's vi mode.  From Zefram (6014).
+
+	* Make test builtin compatible with /bin/test.
+	  From P.Stephenson (6012).
+
+Mon Apr 24 21:26:44 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* In arithmetic evaluation, numbers can now be entered
+	  using C syntax (0xff and 077).  From Zoltan (5780).
+
+Fri Apr 21 17:03:37 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Rearranged builtin.c to group things more logically.
+	  From Zefram.
+
+Mon Apr 17 21:22:26 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta6 released.
+
+	* lots of fixes I don't remember.
+
+	* new zle functions describe-key-briefly and
+	  whereis.
+
+	* precedents fixed in math mode.
+
+	* lots of changes to named directory code, new options -r,
+	  and -f to hash.
+
+	* option NO_HIST_CLOBBER removed and HIST_ALLOW_CLOBBER
+	  added.  It is not on by default.
+
+	* most of signals.{c,h} rewritten.
+
+	* lots of configurations changes.
+
+	* history saved on exec and timeout.
+
+Wed Mar  8 23:06:16 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Reversed -f and -F (again).
+
+Fri Mar  3 20:48:34 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Fix a couple of memory leaks from Sven (5561).
+
+	* Comments and minor changes to builtin.c from
+	  Zefram (5495).
+
+Mon Feb 27 23:14:45 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta5 released.
+
+	* Builtin.c enhancements from Zefram (5428).
+
+	* Added ksh style autoloaded functions from
+	  P.Stephenson (5424).
+
+	* Job.c and exec.c fixes from Sven Wischnowsky (5417,5491)
+
+	* New version of cdmatch from Zoltan Hidvegi (5376).
+
+	* Comments for builtin.c from Zefram (5378).
+
+	* New version of zed from Zoltan Hidvegi (5372)
+
+	* KSHPRIV changed to PRIVILEGED from Zoltan Hidvegi
+	  (5370,5420).
+
+	* New option BSD_ECHO from Zoltan Hidvegi (5391,5474)
+
+	* Fix core dump on !<RET> from P.Stephenson (5410)
+
+	* Compctl fixes from P.Stephenson (5373)
+
+	* Enable ksh style redirection from Zoltan Hidvegi
+	  (5374)
+
+	* Fix partial command running on ^C from P. Stephenson
+	  (5326)
+
+	* History fixes from Zoltan Hidvegi (5300,5342)
+
+	* Accept modifiers in glob patterns from Zoltan Hidvegi
+	  (5272)
+
+	* Bug fixes to completion code from Sven Wischnowsky and
+	  Zoltan Hidvegi. (5263,5291,5327,5344,5352,5369,5386,
+	  5403,5408,5422,5468)
+
+	* More comments for zle_tricky.c from Sven Wischnowsky
+	  (5258).
+
+	* Fixed problem with signals.h coming after some prototypes.
+	  (Richard).
+
+	* Changed funcs.h to prototypes.h.  Moved a couple externs
+	  from prototypes.h to zsh.h (Richard)
+
+Sun Feb 12 22:51:19 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh 2.6-beta4 released.
+
+Sat Feb 11 00:06:51 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* patch for getopts.  From Peter Stephenson.
+
+	* Add big patch of comments to zle_tricky.c from
+	  Sven Wischnowsky.
+
+Thu Feb  9 22:44:26 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Add Numeric brace expansion.
+
+	* Added rlimit kludge for HP/UX.
+
+	* Big patch to RPROMPT stuff from Eskandar Ensafi.
+
+	* Lots of fixes for zle_tricky.c, zle_main.c, zle_misc.c
+	  from Zoltan Hidvegi and Sven Wischnowsky.
+
+Thu Feb  2 02:56:46 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Switched -f and -F options so that -f is noglob
+	  and -F is norcs.  This for greater ksh compatibility.
+
+Wed Feb  1 21:24:48 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Added option LOCAL_OPTIONS.  From Peter Stephenson.
+
+Tue Jan 31 15:05:31 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Added manual entry for autoparamslash.
+
+	* Updates to compctl code in builtin.c.  From Peter Stephenson.
+
+	* Renamed signals.awk to signames.awk.  Move the signal
+	  handling code out of jobs.c, utils.c, zsh.h into
+	  signals.h and signals.c.
+
+Mon Jan 30 00:49:37 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* changed GLOBAL_ZLOGOUT to be sourced after .zlogout
+
+Sat Jan 28 04:22:04 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* added #define RLIM_T_IS_QUAD_T for real BSD4.4 systems.
+
+Fri Jan 27 17:45:21 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* patch to exec.c for pipeline bug.  From
+	  Sven Wischnowsky. (article 5063).
+
+Thu Jan 26 22:00:27 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Added GLOBAL_ZLOGOUT
+
+	* Changed configure.in so that libnsl is only linked
+	  if needed to find getdomainname.
+
+Wed Jan 25 15:40:56 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Zsh version 2.6-beta3 released.
+
+	* Added small patch for FCEDIT and POSTEDIT.  From
+	  Geoff Wing.
+
+	* Added new version of reporter script.  From
+	  Karl Vogel.
+
+Tue Jan 24 00:16:20 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* Added patch so that shwordsplit doesn't toggle.
+	  From Peter Stephenson.
+
+	* Several patches for tty settings and some cleanup of
+	  prompting.  From Eskandar Ensafi.
+
+	* patch for builtin from Hegedus Peter.
+
+	* patch for pipe bug.  From Sven Wischnowsky.
+
+	* patch to zle_tricky.c for small completion bug.  From
+	  Sven Wischnowsky.
+
+	* Patch for math.c.  From Peter Stephenson.
+
+	* Added new zle_refresh.c and followup patch.  From
+	  Geoff Wing.
+
+Mon Jan 23 22:42:17 1995  Richard Coleman  <coleman@math.gatech.edu>
+
+	* patch to prevent job table from filling up.
+
+	* Added patch for autoparamslash option.  From
+	  Sven Wischnowsky.
+
+Mon Dec 12 20:17:01 1994  Richard Coleman  <zsh@math.gatech.edu>
+
+	* Fixed buglet in CSH_JUNKIE_PAREN.  From
+	  Peter Stephenson.
+
+Thu Nov 17 19:57:17 1994  Richard Coleman  <zsh@math.gatech.edu>
+
+	* Spurious comma in configure.in.  Spurious spaces on
+          blank lines in Makefile{.in} were causing problems
+          on netbsd.
+
+Wed Nov 16 00:24:33 1994  Richard Coleman  <zsh@math.gatech.edu>
+
+	* Zsh version 2.6-beta2 released.
+
+	* New version of aclocal.m4.  Borrowed from m4-1.4.
+          Made a few changes since we're not strict ansi yet.
+
+Wed Nov  9 20:29:21 1994  Richard Coleman  <zsh@math.gatech.edu>
+
+	* Added updated replacement for zle_refresh.c from Geoff Wing.
+
+Tue Nov  8 21:01:08 1994  Richard Coleman  <zsh@math.gatech.edu>
+
+	* initialize tty modes in non-interactive shells.
+
+	* fixed so expand-or-complete-prefix respects
+	  always_last_prompt option. (Sven)
+
+	* fix for pipes in for loops. (Sven)
+
+	* Patch from  Peter Stephenson to fix <-> for case where
+	  the file names are large.
+
+	* Added 2 patches from Eskandar Ensafi for zle_misc.c,
+	  watch.c,zsh.h, for cleaning up handling of termcap
+	  strings and text attributes.
+
+	* Added replacement for zle_refresh.c from Geoff Wing.
+
+Mon Nov  7 01:00 1994 Richard Coleman <zsh@math.gatech.edu>
+
+	* Reorganized the directory structure and renamed some of the
+	  directories.
+
+        * New targets dist and dist-rcs to automatically create
+          zsh distributions.
+
+Sun Nov  6 08:10 1994 Richard Coleman <zsh@math.gatech.edu>
+
+        * Finished converting to autoconf 2.1.
+
+Sun Oct 23 20:05 1994 Sven Wischnowsky <oberon@cs.tu-berlin.de>
+
+	* exec.c,utils.c: fix problem with commands in pipeline not
+	  able to attach to tty under certain conditions.
+
+Sun Oct 23 03:25 1995 Richard Coleman <zsh@math.gatech.edu>
+
+	* configure.in,jobs.c: removed configure test for sigsetjmp.
+	  Use _POSIX_VERSION instead.
+
+Sun Oct 23 03:20 1994 Peter Stephenson <P.Stephenson@swan.ac.uk>
+
+	* builtin.c,exec.c,globals.h: big patch to fix problems with
+	  typeset and variable assignment.
+
+Mon Oct 17 18:28 1994 Martin Steed <msteed@tfs.com>
+
+	* signals.awk: added change so that _SIGxxx will be
+	  recognized in sys/signal.h.
+
+Mon Oct 17 18:21 1994 Kunihiro Ishiguro <kunihiro@sramhb.sra.co.jp
+
+	* zsh.h: replaced #elif since HP-UX 8.07 doesn't support it.
+
+Sun Oct 16 22:23 1994 Richard Coleman <zsh@math.gatech.edu>
+
+	* Created Makefile.in for rest of subdirectories.
+
+Sun Oct 16 21:00 1994 Richard Coleman <zsh@math.gatech.edu>
+
+	* Zsh version 2.6-beta1 released.
diff --git a/Config/.distfiles b/Config/.distfiles
new file mode 100644
index 000000000..ac024c171
--- /dev/null
+++ b/Config/.distfiles
@@ -0,0 +1,4 @@
+DISTFILES_SRC='
+    .distfiles
+    clean.mk config.mk defs.mk version.mk
+'
diff --git a/Config/clean.mk b/Config/clean.mk
new file mode 100644
index 000000000..918a84ff4
--- /dev/null
+++ b/Config/clean.mk
@@ -0,0 +1,43 @@
+#
+# Makefile fragment for cleanup
+#
+# Copyright (c) 1995-1997 Richard Coleman
+# All rights reserved.
+#
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall Richard Coleman or the Zsh Development Group be liable
+# to any party for direct, indirect, special, incidental, or consequential
+# damages arising out of the use of this software and its documentation,
+# even if Richard Coleman and the Zsh Development Group have been advised of
+# the possibility of such damage.
+#
+# Richard Coleman and the Zsh Development Group specifically disclaim any
+# warranties, including, but not limited to, the implied warranties of
+# merchantability and fitness for a particular purpose.  The software
+# provided hereunder is on an "as is" basis, and Richard Coleman and the
+# Zsh Development Group have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+#
+
+mostlyclean: mostlyclean-recursive mostlyclean-here
+clean:       clean-recursive       clean-here
+distclean:   distclean-recursive   distclean-here
+realclean:   realclean-recursive   realclean-here
+
+mostlyclean-here:
+clean-here: mostlyclean-here
+distclean-here: clean-here
+realclean-here: distclean-here
+
+mostlyclean-recursive clean-recursive distclean-recursive realclean-recursive:
+	@subdirs='$(SUBDIRS)'; if test -n "$$subdirs"; then \
+	  target=`echo $@ | sed s/-recursive//`; \
+	  for subdir in $$subdirs; do \
+	    (cd $$subdir && $(MAKE) $(MAKEDEFS) $$target) || exit 1; \
+	  done; \
+	fi
diff --git a/Config/config.mk b/Config/config.mk
new file mode 100644
index 000000000..dd91476d0
--- /dev/null
+++ b/Config/config.mk
@@ -0,0 +1,38 @@
+#
+# Makefile fragment for building Makefiles
+#
+# Copyright (c) 1995-1997 Richard Coleman
+# All rights reserved.
+#
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall Richard Coleman or the Zsh Development Group be liable
+# to any party for direct, indirect, special, incidental, or consequential
+# damages arising out of the use of this software and its documentation,
+# even if Richard Coleman and the Zsh Development Group have been advised of
+# the possibility of such damage.
+#
+# Richard Coleman and the Zsh Development Group specifically disclaim any
+# warranties, including, but not limited to, the implied warranties of
+# merchantability and fitness for a particular purpose.  The software
+# provided hereunder is on an "as is" basis, and Richard Coleman and the
+# Zsh Development Group have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+#
+
+config: Makefile
+	@subdir='$(SUBDIRS)'; for subdir in $$subdirs; do \
+	  (cd $$subdir && $(MAKE) $(MAKEDEFS) $@) || exit 1; \
+	done
+
+CONFIG_INCS = \
+$(dir_top)/Config/clean.mk $(dir_top)/Config/config.mk \
+$(dir_top)/Config/defs.mk $(dir_top)/Config/version.mk
+
+Makefile: Makefile.in $(dir_top)/config.status $(CONFIG_INCS)
+	cd $(dir_top) && \
+	  CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
diff --git a/Config/defs.mk b/Config/defs.mk
new file mode 100644
index 000000000..42cad5740
--- /dev/null
+++ b/Config/defs.mk
@@ -0,0 +1,83 @@
+#
+# Basic Makefile definitions
+#
+# Copyright (c) 1995-1997 Richard Coleman
+# All rights reserved.
+#
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall Richard Coleman or the Zsh Development Group be liable
+# to any party for direct, indirect, special, incidental, or consequential
+# damages arising out of the use of this software and its documentation,
+# even if Richard Coleman and the Zsh Development Group have been advised of
+# the possibility of such damage.
+#
+# Richard Coleman and the Zsh Development Group specifically disclaim any
+# warranties, including, but not limited to, the implied warranties of
+# merchantability and fitness for a particular purpose.  The software
+# provided hereunder is on an "as is" basis, and Richard Coleman and the
+# Zsh Development Group have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+#
+
+# fundamentals
+SHELL = /bin/sh
+@SET_MAKE@
+
+# source/build directories
+VPATH           = @srcdir@
+sdir            = @srcdir@
+sdir_top        = @top_srcdir@
+
+# installation directories
+prefix          = @prefix@
+exec_prefix     = @exec_prefix@
+bindir          = @bindir@
+libdir          = @libdir@
+MODDIR          = $(libdir)/zsh/$(VERSION)
+infodir         = @infodir@
+mandir          = @mandir@
+
+# compilation
+CC              = @CC@
+CPPFLAGS        = @CPPFLAGS@
+DEFS            = @DEFS@
+CFLAGS          = @CFLAGS@
+LDFLAGS         = @LDFLAGS@
+EXTRA_LDFLAGS   = @EXTRA_LDFLAGS@
+DLCFLAGS        = @DLCFLAGS@
+DLLDFLAGS       = @DLLDFLAGS@
+LIBLDFLAGS      = @LIBLDFLAGS@
+EXELDFLAGS      = @EXELDFLAGS@
+LIBS            = @LIBS@
+DL_EXT          = @DL_EXT@
+DLLD            = @DLLD@
+
+# utilities
+AWK             = @AWK@
+YODL            = @YODL@
+YODL2TXT        = $(YODL)2txt
+YODL2HTML       = $(YODL)2html
+
+# install utility
+INSTALL         = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA    = @INSTALL_DATA@
+
+# flags passed to recursive makes in subdirectories
+MAKEDEFS = \
+prefix='$(prefix)' exec_prefix='$(exec_prefix)' bindir='$(bindir)' \
+libdir='$(libdir)' MODDIR='$(MODDIR)' infodir='$(infodir)' mandir='$(mandir)' \
+CC='$(CC)' CPPFLAGS='$(CPPFLAGS)' DEFS='$(DEFS)' CFLAGS='$(CFLAGS)' \
+LDFLAGS='$(LDFLAGS)' EXTRA_LDFLAGS='$(EXTRA_LDFLAGS)' \
+DLCFLAGS='$(DLCFLAGS)' DLLDFLAGS='$(DLLDFLAGS)' \
+LIBLDFLAGS='$(LIBLDFLAGS)' EXELDFLAGS='$(EXELDFLAGS)' \
+LIBS='$(LIBS)' DL_EXT='$(DL_EXT)' DLLD='$(DLLD)' \
+AWK='$(AWK)' YODL='$(YODL)' YODL2TXT='$(YODL2TXT)' YODL2HTML='$(YODL2HTML)'
+
+# override built-in suffix list
+.SUFFIXES:
diff --git a/Config/version.mk b/Config/version.mk
new file mode 100644
index 000000000..5ed093b1b
--- /dev/null
+++ b/Config/version.mk
@@ -0,0 +1,31 @@
+#
+# Makefile fragment for version numbers
+#
+# Copyright (c) 1995-1997 Richard Coleman
+# All rights reserved.
+#
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall Richard Coleman or the Zsh Development Group be liable
+# to any party for direct, indirect, special, incidental, or consequential
+# damages arising out of the use of this software and its documentation,
+# even if Richard Coleman and the Zsh Development Group have been advised of
+# the possibility of such damage.
+#
+# Richard Coleman and the Zsh Development Group specifically disclaim any
+# warranties, including, but not limited to, the implied warranties of
+# merchantability and fitness for a particular purpose.  The software
+# provided hereunder is on an "as is" basis, and Richard Coleman and the
+# Zsh Development Group have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+#
+
+# This must also serve as a shell script, so do not add spaces around the
+# `=' signs.
+
+VERSION=3.1.5
+VERSION_DATE='October 29, 1998'
diff --git a/Doc/.cvsignore b/Doc/.cvsignore
new file mode 100644
index 000000000..11b508947
--- /dev/null
+++ b/Doc/.cvsignore
@@ -0,0 +1,15 @@
+Makefile
+version.yo
+zsh*.1
+zsh.texi
+zsh.info*
+zsh_*.html
+zsh.aux zsh.toc
+zsh.cp zsh.cps
+zsh.fn zsh.fns
+zsh.ky zsh.kys
+zsh.pg zsh.pgs
+zsh.vr zsh.vrs
+zsh.log zsh.dvi
+zsh.tp zsh.tps
+zsh_*.ps
diff --git a/Doc/.distfiles b/Doc/.distfiles
new file mode 100644
index 000000000..7fd1cdcc1
--- /dev/null
+++ b/Doc/.distfiles
@@ -0,0 +1,16 @@
+DISTFILES_SRC='
+    .cvsignore .distfiles Makefile.in
+    META-FAQ.yo intro.ms
+    version.yo zmacros.yo zman.yo ztexi.yo
+    zsh.yo zshbuiltins.yo zshcompctl.yo zshexpn.yo zshmisc.yo
+    zshmodules.yo zshoptions.yo zshparam.yo zshzle.yo
+    zsh.texi
+    zsh.1 zshbuiltins.1 zshcompctl.1 zshexpn.1 zshmisc.1 zshmodules.1
+    zshoptions.1 zshparam.1 zshzle.1 zshall.1
+'
+
+DISTFILES_DOC='
+    zsh.info zsh.info-[0-9]*
+    zsh_toc.html zsh_[0-9]*.html
+    zsh.dvi zsh_us.ps zsh_a4.ps
+'
diff --git a/Doc/META-FAQ.yo b/Doc/META-FAQ.yo
new file mode 100644
index 000000000..019264601
--- /dev/null
+++ b/Doc/META-FAQ.yo
@@ -0,0 +1,44 @@
+STARTDEF()
+INCLUDEFILE(zmacros.yo)
+
+def(startmenu)(0)(DELLINE)
+def(endmenu)(0)(DELLINE)
+def(menu)(1)(DELLINE)
+def(texinode)(4)(DELLINE)
+def(cindex)(1)(DELLINE)
+
+def(sect)(1)(
+SECTHEAD
+ARG1
+)
+
+def(em)(1)(ARG1)
+def(bf)(1)(ARG1)
+def(tt)(1)(ARG1)
+def(var)(1)(ARG1)
+def(nofill)(1)(ARG1)
+
+def(startitem)(0)(NEXTLINE DELLINE)
+def(enditem)(0)(DELLINE)
+def(item)(2)(
+      ARG1+USECHARTABLE(indent2)ARG2 DELLINE USECHARTABLE(standard))
+
+def(startlist)(0)(DELLINE)
+def(endlist)(0)(DELLINE)
+def(list)(1)(      ARG1)
+
+DEFINECHARTABLE(standard)(
+  '\n' = "\n"
+)
+DEFINECHARTABLE(indent2)(
+  '\n' = "\n            "
+)
+
+ENDDEF()\
+------------------------
+META-FAQ for the Z Shell
+------------------------
+
+The latest version of this META-FAQ can be found at any of the FTP sites
+listed below.
+INCLUDEFILE(Zsh/metafaq.yo)\
diff --git a/Doc/Makefile.in b/Doc/Makefile.in
new file mode 100644
index 000000000..1883abfd1
--- /dev/null
+++ b/Doc/Makefile.in
@@ -0,0 +1,172 @@
+#
+# Makefile for Doc subdirectory
+#
+# Copyright (c) 1995-1997 Richard Coleman
+# All rights reserved.
+#
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall Richard Coleman or the Zsh Development Group be liable
+# to any party for direct, indirect, special, incidental, or consequential
+# damages arising out of the use of this software and its documentation,
+# even if Richard Coleman and the Zsh Development Group have been advised of
+# the possibility of such damage.
+#
+# Richard Coleman and the Zsh Development Group specifically disclaim any
+# warranties, including, but not limited to, the implied warranties of
+# merchantability and fitness for a particular purpose.  The software
+# provided hereunder is on an "as is" basis, and Richard Coleman and the
+# Zsh Development Group have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+#
+
+subdir = Doc
+dir_top = ..
+
+@@version.mk@@
+@@defs.mk@@
+
+MAKEINFO = makeinfo
+TEXI2DVI = texi2dvi
+DVIPS = dvips -D 300
+TEXI2HTML = texi2html -expandinfo -split_chapter
+
+.SUFFIXES: .yo .1
+
+# man pages to install
+MAN = zsh.1 zshbuiltins.1 zshcompctl.1 \
+zshexpn.1 zshmisc.1 zshmodules.1 \
+zshoptions.1 zshparam.1 zshzle.1 zshall.1
+
+# yodl documentation
+YODLDOC = $(MAN) zsh.texi
+YODLSRC = zmacros.yo zman.yo ztexi.yo Zsh/arith.yo Zsh/builtins.yo \
+Zsh/compat.yo Zsh/compctl.yo Zsh/cond.yo Zsh/exec.yo Zsh/expn.yo \
+Zsh/filelist.yo Zsh/files.yo Zsh/func.yo Zsh/grammar.yo Zsh/guide.yo \
+Zsh/index.yo Zsh/intro.yo Zsh/invoke.yo Zsh/jobs.yo Zsh/metafaq.yo \
+Zsh/modules.yo Zsh/mod_cap.yo \
+Zsh/mod_clone.yo Zsh/mod_comp1.yo Zsh/mod_compctl.yo Zsh/mod_deltochar.yo \
+Zsh/mod_example.yo Zsh/mod_files.yo Zsh/mod_stat.yo \
+Zsh/mod_zle.yo Zsh/options.yo \
+Zsh/params.yo Zsh/prompt.yo Zsh/redirect.yo Zsh/restricted.yo \
+Zsh/seealso.yo Zsh/zle.yo
+
+# ========== DEPENDENCIES FOR BUILDING ==========
+
+all: $(MAN) zsh.texi zsh.info ../META-FAQ
+
+everything: all zsh.dvi zsh_us.ps zsh_a4.ps zsh_toc.html
+
+zsh.dvi: zsh.texi
+	$(TEXI2DVI) $(sdir)/zsh.texi
+
+zsh.info: zsh.texi
+	$(MAKEINFO) $(sdir)/zsh.texi; exit 0
+
+zsh.texi: zsh.yo
+	$(YODL) -o $(sdir)/zsh.texi -I$(sdir) -w ztexi.yo version.yo zsh.yo
+	test -f $(sdir)/zsh.texi
+
+.yo.1:
+	case $@ in \
+	  */*) target=$@ ;; \
+	  *) target=$(sdir)/$@ ;; \
+	esac; \
+	$(YODL) -o $$target -I$(sdir) -w zman.yo version.yo $< || exit 1; \
+	test -f $$target
+
+zsh_us.ps: zsh.dvi
+	$(DVIPS) -t letter -o $@ zsh.dvi
+
+zsh_a4.ps: zsh.dvi
+	$(DVIPS) -t a4 -o $@ zsh.dvi
+
+zsh_toc.html: zsh.texi
+	$(TEXI2HTML) $(sdir)/zsh.texi
+
+zshall.1: zsh.yo
+	case $@ in \
+	  */*) target=$@ ;; \
+	  *) target=$(sdir)/$@ ;; \
+	esac; \
+	$(YODL) -o $$target -I$(sdir) -DZSHALL -w zman.yo version.yo zsh.yo || exit 1; \
+	test -f $$target
+
+../META-FAQ: META-FAQ.yo Zsh/metafaq.yo
+	$(YODL) -I$(sdir) META-FAQ.yo | sed -e '/NEXTLINE/N' -e '/DELLINE/d' -e '/^SECTHEAD$$/{N;s/^SECTHEAD.//;h;s/./-/g;H;g;}' -e 's/  *$$//' > $(sdir_top)/META-FAQ
+	test -f $(sdir_top)/META-FAQ
+
+$(YODLDOC): $(YODLSRC) version.yo
+
+version.yo: $(sdir_top)/Config/version.mk
+	( \
+	  echo 'STARTDEF()'; \
+	  echo 'def(version)(0)('$(VERSION)')'; \
+	  echo 'def(date)(0)('$(VERSION_DATE)')'; \
+	  echo 'ENDDEF()#' | tr '#' '\\'; \
+	) > $(sdir)/version.yo
+
+# ========== DEPENDENCIES FOR INSTALLING ==========
+
+# install all the documentation
+install: install.man install.info
+
+# uninstall all the documentation
+uninstall: uninstall.man uninstall.info
+
+# install man pages, creating install directory if necessary
+install.man: $(MAN)
+	$(sdir_top)/mkinstalldirs $(mandir)/man1
+	for file in $(MAN); do \
+	  if test -f $$file; then \
+	    $(INSTALL_DATA) $$file $(mandir)/man1; \
+	  elif test -f $(sdir)/$$file; then \
+	    $(INSTALL_DATA) $(sdir)/$$file $(mandir)/man1; \
+	  else :; \
+	  fi || exit 1; \
+	done
+
+# install info pages, creating install directory if necessary
+install.info: zsh.info
+	$(sdir_top)/mkinstalldirs $(infodir)
+	for file in zsh.info zsh.info-[1-9]; do \
+	  if test -f $$file; then \
+	    $(INSTALL_DATA) $$file $(infodir); \
+	  elif test -f $(sdir)/$$file; then \
+	    $(INSTALL_DATA) $(sdir)/$$file $(infodir); \
+	  else :; \
+	  fi || exit 1; \
+	done
+
+# uninstall man pages
+uninstall.man:
+	for file in $(MAN); do \
+	  rm -f $(mandir)/man1/$$file; \
+	done
+
+# uninstall info pages
+uninstall.info:
+	rm -f $(infodir)/zsh.info $(infodir)/zsh.info-[1-9]
+
+# ========== DEPENDENCIES FOR CLEANUP ==========
+
+@@clean.mk@@
+
+clean-here:
+	rm -f *.html *.info* *.dvi *.ps
+	rm -f *.aux *.cp *.cps *.fn *.fns *.ky *.log
+	rm -f *.pg *.pgs *.toc *.tp *.tps *.vr *.vrs
+
+distclean-here:
+	rm -f Makefile
+
+realclean-here:
+	cd $(sdir) && rm -f version.yo *.1 *.texi ../META-FAQ
+
+# ========== DEPENDENCIES FOR MAINTENANCE ==========
+
+@@config.mk@@
diff --git a/Doc/Zsh/.distfiles b/Doc/Zsh/.distfiles
new file mode 100644
index 000000000..42517f507
--- /dev/null
+++ b/Doc/Zsh/.distfiles
@@ -0,0 +1,9 @@
+DISTFILES_SRC='
+    .distfiles
+    arith.yo builtins.yo compat.yo compctl.yo cond.yo exec.yo expn.yo
+    filelist.yo files.yo func.yo grammar.yo guide.yo index.yo intro.yo
+    invoke.yo jobs.yo metafaq.yo mod_cap.yo mod_clone.yo mod_comp1.yo
+    mod_compctl.yo mod_deltochar.yo mod_example.yo mod_files.yo mod_sched.yo
+    mod_stat.yo mod_zle.yo modules.yo options.yo params.yo prompt.yo
+    redirect.yo restricted.yo seealso.yo zle.yo
+'
diff --git a/Doc/Zsh/.lastloc b/Doc/Zsh/.lastloc
new file mode 100644
index 000000000..8b1a784a8
--- /dev/null
+++ b/Doc/Zsh/.lastloc
@@ -0,0 +1 @@
+(("/home/user2/pws/src/zsh-3.1.5/Doc/Zsh/expn.yo" . 33735))
diff --git a/Doc/Zsh/arith.yo b/Doc/Zsh/arith.yo
new file mode 100644
index 000000000..1560c81d3
--- /dev/null
+++ b/Doc/Zsh/arith.yo
@@ -0,0 +1,73 @@
+texinode(Arithmetic Evaluation)(Conditional Expressions)(Jobs & Signals)(Top)
+chapter(Arithmetic Evaluation)
+ifzman(\
+sect(Arithmetic Evaluation)
+)\
+cindex(arithmetic evaluation)
+cindex(evaluation, arithmetic)
+An ability to perform integer arithmetic is provided with the builtin tt(let).
+findex(let, use of)
+Evaluations are performed using em(long) arithmetic.
+A leading `tt(0x)' or `tt(0X)' denotes hexadecimal.
+Otherwise, numbers are of the form `[var(base)tt(#)]var(n)',
+where var(base) is a decimal number between two and thirty-six
+representing the arithmetic base and var(n)
+is a number in that base (for example, `tt(16#ff)' is 255 in hexadecimal).
+If var(base) is omitted
+then base 10 is used.  For backwards compatibility the form
+`tt([)var(base)tt(])var(n)' is also accepted.
+
+cindex(arithmetic operators)
+cindex(operators, arithmetic)
+An arithmetic expression uses nearly the same syntax, precedence, and
+associativity of expressions in C.
+The following operators are supported (listed in decreasing order
+of precedence):
+
+startsitem()
+sitem(tt(PLUS() - ! ~ PLUS()PLUS() --))(unary plus/minus, logical NOT, complement, {pre,post}{in,de}crement)
+sitem(tt(<< >>))(bitwise shift left, right)
+sitem(tt(&))(bitwise AND)
+sitem(tt(^))(bitwise XOR)
+sitem(tt(|))(bitwise OR)
+sitem(tt(**))(exponentiation)
+sitem(tt(* / %))(multiplication, division, modulus (remainder))
+sitem(tt(PLUS() -))(addition, subtraction)
+sitem(tt(< > <= >=))(comparison)
+sitem(tt(== !=))(equality and inequality)
+sitem(tt(&&))(logical AND)
+sitem(tt(|| ^^))(logical OR, XOR)
+sitem(tt(? :))(ternary operator)
+sitem(tt(= PLUS()= -= *= /= %= &= ^= |= <<= >>= &&= ||= ^^= **=))(assignment)
+sitem(tt(,))(comma operator)
+endsitem()
+
+The operators `tt(&&)', `tt(||)', `tt(&&=)', and `tt(||=)' are short-circuiting,
+and only one of the latter two expressions in a ternary operator
+is evaluated.  Note the precedence of the bitwise AND, OR,
+and XOR operators.
+
+An expression of the form `tt(#\)var(x)' where var(x) is any character
+gives the ascii value of this character and an expression of the form
+`tt(#)var(foo)' gives the ascii value of the first character of the value
+of the parameter var(foo).
+
+Named parameters and subscripted arrays can be referenced by name within an
+arithmetic expression without using the parameter substitution syntax.
+
+An internal integer representation of a named parameter
+can be specified with the tt(integer) builtin.
+cindex(parameters, integer)
+cindex(integer parameters)
+findex(integer, use of)
+Arithmetic evaluation is performed on the value of each
+assignment to a named parameter declared integer
+in this manner.
+
+Since many of the arithmetic operators require
+quoting, an alternative form of the tt(let) command is provided.
+For any command which begins with a tt(LPAR()LPAR()),
+all the characters until a matching tt(RPAR()RPAR())
+are treated as a quoted expression.
+More precisely, `tt(LPAR()LPAR()) ... tt(RPAR()RPAR())'
+is equivalent to `tt(let ")...tt(")'.
diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
new file mode 100644
index 000000000..8959543c5
--- /dev/null
+++ b/Doc/Zsh/builtins.yo
@@ -0,0 +1,1184 @@
+texinode(Shell Builtin Commands)(Zsh Line Editor)(Options)(Top)
+chapter(Shell Builtin Commands)
+ifzman(\
+sect(Shell Builtin Commands)
+)\
+cindex(builtin commands)
+cindex(commands, builtin)
+def(prefix)(1)(\
+findex(ARG1)
+item(tt(ARG1) var(simple command))(
+See noderef(Precommand Modifiers).
+)\
+)\
+def(alias)(2)(\
+findex(ARG1)
+item(tt(ARG1))(
+Same as tt(ARG2).
+)\
+)\
+startitem()
+prefix(-)
+findex(.)
+item(tt(.) var(file) [ var(arg) ... ])(
+Read commands from var(file) and execute them in the current shell
+environment.
+If var(file) does not contain a slash, or if tt(PATH_DIRS)
+is set, the shell looks in the components of tt($path) to find the
+directory containing var(file).
+Files in the current directory are not read unless `tt(.)' appears
+somewhere in tt($path).
+
+If any arguments var(arg) are given,
+they become the positional parameters; the old positional
+parameters are restored when the var(file) is done executing.
+The exit status is the exit status of the last command executed.
+)
+findex(NOTRANS(:))
+cindex(expanding parameters)
+cindex(parameters, expanding)
+cindex(doing nothing)
+item(tt(:) [ var(arg) ... ])(
+This command only expands parameters.  A zero exit code is returned.
+)
+findex(alias)
+cindex(aliases, defining)
+cindex(aliases, listing)
+item(tt(alias) [ tt(-gmrL) ] [ var(name)[tt(=)var(value)] ... ])(
+For each var(name) with a corresponding var(value), define an alias
+with that value.  A trailing space in var(value) causes the next word
+to be checked for alias substitution.  If the tt(-g) flag is present,
+define a global alias; global aliases are expanded even if they do not
+occur in command position.
+
+For each var(name) with no var(value),
+print the value of var(name), if any.  With no arguments, print all
+currently defined aliases.  If the tt(-m) flag is given the arguments
+are taken as patterns (they should be quoted to preserve them from being
+interpreted as glob patterns), and the aliases matching these patterns
+are printed.  When printing aliases and the tt(-g) or tt(-r) flags
+are present, then restrict the printing to global or regular
+aliases, respectively.
+
+If the tt(-L) flag is present, then print each
+alias in a manner suitable for putting in a startup script.  The exit
+status is nonzero if a var(name) (with no var(value)) is given for
+which no alias has been defined.
+)
+findex(autoload)
+cindex(functions, autoloading)
+cindex(autoloading functions)
+alias(autoload)(functions -u)
+findex(bg)
+cindex(jobs, backgrounding)
+xitem(tt(bg) [ var(job) ... ])
+item(var(job) ... tt(&))(
+Put each specified var(job) in the background,
+or the current job if none is specified.
+)
+findex(break)
+cindex(exiting loops)
+cindex(loops, exiting)
+item(tt(break) [ var(n) ])(
+Exit from an enclosing tt(for), tt(while),
+tt(until), tt(select) or tt(repeat) loop.  If var(n)
+is specified, then break var(n) levels instead of just one.
+)
+findex(builtin)
+item(tt(builtin) var(name) [ var(args) ... ])(
+Executes the builtin var(name), with the given var(args).
+)
+alias(bye)(exit)
+findex(cd)
+cindex(directories, changing)
+xitem(tt(cd) [ tt(-sLP) ] [ var(arg) ])
+xitem(tt(cd) [ tt(-sLP) ] var(old) var(new))
+item(tt(cd) [ tt(-sLP) ] {tt(PLUS())|tt(-)}var(n))(
+Change the current directory.  In the first form, change the
+current directory to var(arg), or to the value of tt($HOME) if
+var(arg) is not specified.  If var(arg) is `tt(-)', change to the
+value of tt($OLDPWD), the previous directory.
+If a directory named var(arg) is not found in the current directory
+and var(arg) does not begin with a slash,
+search each component of the shell parameter tt(cdpath).
+If the option tt(CDABLE_VARS) is set, and a parameter named var(arg)
+exists whose value begins with a slash, treat its value as
+the directory.
+
+The second form of tt(cd) substitutes the string var(new)
+for the string var(old) in the name of the current directory,
+and tries to change to this new directory.
+
+The third form of tt(cd) extracts an entry from the directory
+stack, and changes to that directory.  An argument of the form
+`tt(PLUS())var(n)' identifies a stack entry by counting from the left
+of the list shown by the tt(dirs) command, starting with zero.
+An argument of the form `tt(-)var(n)' counts from the right.
+If the tt(PUSHD_MINUS) option is set, the meanings of `tt(PLUS())'
+and `tt(-)' in this context are swapped.
+
+If the tt(-s) option is specified, tt(cd) refuses to change the current
+directory if the given pathname contains symlinks.  If the tt(-P) option
+is given or the tt(CHASE_LINKS) option is set, symbolic links are resolved
+to their true values.  If the tt(-L) option is given symbolic links are
+followed regardless of the state of the tt(CHASE_LINKS) option.
+)
+alias(chdir)(cd)
+prefix(command)
+findex(continue)
+cindex(loops, continuing)
+cindex(continuing loops)
+item(tt(continue) [ var(n) ])(
+Resume the next iteration of the enclosing
+tt(for), tt(while), tt(until), tt(select) or
+tt(repeat) loop.  If var(n) is specified, break out of
+var(n)-1 loops and resume at the var(n)th enclosing loop.
+)
+alias(declare)(typeset)
+findex(dirs)
+cindex(directory stack, printing)
+item(tt(dirs) [ tt(-v) ] [ var(arg) ... ])(
+With no arguments, print the contents of the directory stack.
+If the tt(-v) option is given, number the directories
+in the stack when printing.
+Directories are added to this stack with the tt(pushd) command,
+and removed with the tt(cd) or tt(popd) commands.
+If arguments are specified, load them onto the directory stack,
+replacing anything that was there, and push the current directory
+onto the stack.
+)
+findex(disable)
+cindex(disabling commands)
+cindex(commands, disabling)
+item(tt(disable) [ tt(-afmr) ] var(name) ...)(
+Temporarily disable the var(name)d hash table elements.  The default
+is to disable builtin commands.  This allows you to use an external
+command with the same name as a builtin command.  The tt(-a) option
+causes tt(disable) to act on aliases.  The tt(-f) option causes
+tt(disable) to act on shell functions.  The tt(-r) options causes
+tt(disable) to act on reserved words.  Without arguments all disabled
+hash table elements from the corresponding hash table are printed.
+With the tt(-m) flag the arguments are taken as patterns (should be
+quoted to preserve them from being taken as glob patterns), and all hash
+table elements from the corresponding hash table matching these patterns
+are disabled.  Disabled objects can be enabled with the tt(enable)
+command.
+)
+findex(disown)
+cindex(jobs, disowning)
+xitem(tt(disown) [ var(job) ... ])
+xitem(var(job) ... tt(&|))
+item(var(job) ... tt(&!))(
+Remove the specified var(job)s from the job table; the shell will
+no longer report their status, and will not complain if you
+try to exit an interactive shell with them running or stopped.
+If no var(job) is specified, disown the current job.
+)
+findex(echo)
+item(tt(echo) [ tt(-neE) ] [ var(arg) ... ])(
+Write each var(arg) on the standard output, with a space separating
+each one.
+If the tt(-n) flag is not present, print a newline at the end.
+tt(echo) recognizes the following escape sequences:
+
+startsitem()
+sitem(tt(\a))(bell character)
+sitem(tt(\b))(backspace)
+sitem(tt(\c))(suppress final newline)
+sitem(tt(\e))(escape)
+sitem(tt(\f))(form feed)
+sitem(tt(\n))(linefeed (newline))
+sitem(tt(\r))(carriage return)
+sitem(tt(\t))(horizontal tab)
+sitem(tt(\v))(vertical tab)
+sitem(tt(\\))(backslash)
+sitem(tt(\0)var(NNN))(character code in octal)
+sitem(tt(\x)var(NN))(character code in hexadecimal)
+endsitem()
+
+pindex(BSD_ECHO, use of)
+The tt(-E) flag, or the tt(BSD_ECHO) option, can be used to disable
+these escape sequences.  In the latter case, tt(-e) flag can be used to
+enable them.
+)
+findex(echotc)
+cindex(termcap string, printing)
+item(tt(echotc) var(cap) [ var(arg) ... ])(
+Output the termcap string corresponding to the capability
+var(cap), with optional arguments.
+)
+findex(emulate)
+cindex(compatibility, sh)
+cindex(compatibility, ksh)
+cindex(compatibility, csh)
+cindex(sh, compatibility)
+cindex(ksh, compatibility)
+cindex(csh, compatibility)
+item(tt(emulate) [ tt(-R) ] {tt(zsh)|tt(sh)|tt(ksh)|tt(csh)})(
+Set up zsh options to emulate the specified shell as much as possible.
+bf(csh) will never be fully emulated.
+If the argument is not one of the shells listed above, tt(zsh)
+will be used as a default.  If the tt(-R) option is given, all options
+are reset to their default value corresponding to the specified emulation
+mode.
+)
+findex(enable)
+cindex(enabling commands)
+cindex(commands, enabling)
+item(tt(enable) [ tt(-afmr) ] var(name) ...)(
+Enable the var(name)d hash table elements, presumably disabled
+earlier with tt(disable).  The default is to enable builtin commands.
+The tt(-a) option causes tt(enable) to act on aliases.  The tt(-f)
+option causes tt(enable) to act on shell functions.  The tt(-r)
+option causes tt(enable) to act on reserved words.  Without arguments
+all enabled hash table elements from the corresponding hash table are
+printed.  With the tt(-m) flag the arguments are taken as patterns
+(should be quoted) and all hash table elements from the corresponding
+hash table matching these patterns are enabled.  Enabled objects can be
+disabled with the tt(disable) builtin command.
+)
+findex(eval)
+cindex(evaluating arguments as commands)
+item(tt(eval) [ var(arg) ... ])(
+Read the arguments as input to the shell and execute the resulting
+command in the current shell process.
+)
+prefix(exec)
+findex(exit)
+item(tt(exit) [ var(n) ])(
+Exit the shell with the exit code specified by var(n); if none
+is specified, use the exit code from the last command executed.
+pindex(IGNORE_EOF, use of)
+An EOF condition will also cause the shell to exit, unless
+the tt(IGNORE_EOF) option is set.
+)
+findex(export)
+item(tt(export) [ var(name)[tt(=)var(value)] ... ])(
+The specified var(name)s are marked for automatic export
+to the environment of subsequently executed commands.
+Equivalent to tt(typeset -x), except that no parameter will be created
+to hide an existing one in an outer scope.
+If a parameter specified does not
+already exist, it is created in the global scope.
+)
+findex(false)
+cindex(doing nothing, unsuccessfully)
+item(tt(false) [ var(arg) ... ])(
+Do nothing and return an exit code of 1.
+)
+findex(fc)
+cindex(history, editing)
+cindex(editing history)
+xitem(tt(fc) [ tt(-e) var(ename) ] [ tt(-nlrdDfEim) ] [ var(old)tt(=)var(new) ... ] [ var(first) [ var(last) ] ])
+item(tt(fc) tt(-ARWI) [ var(filename) ])(
+Select a range of commands from var(first) to var(last) from the
+history list.
+The arguments var(first) and var(last) may be specified as a
+number or as a string.  A negative number is used as an offset
+to the current history event number.
+A string specifies the most recent event beginning with the given string.
+All substitutions var(old)tt(=)var(new), if any, are then performed
+on the commands.
+
+If the tt(-l) flag is given, the resulting commands are listed on
+standard output.
+If the tt(-m) flag is also given the first argument is taken as a
+pattern (should be quoted) and only the history events matching this
+pattern will be shown.
+Otherwise the editor program var(ename) is invoked on a file containing
+these history events.  If var(ename) is not given, the value
+of the parameter tt(FCEDIT) is used.  If var(ename) is `tt(-)',
+no editor is invoked.  When editing is complete, the edited
+command is executed.
+
+If var(first) is not specified, it will be set to -1 (the most recent
+event), or to -16 if the tt(-l) flag is given.
+If var(last) is not specified, it will be set to var(first),
+or to -1 if the tt(-l) flag is given.
+
+The flag tt(-r) reverses the order of the commands and the
+flag tt(-n) suppresses command numbers when listing.
+Also when listing, tt(-d) prints timestamps for each command, and
+tt(-f) prints full time-date stamps.  Adding the tt(-E) flag
+causes the dates to be printed as `var(dd)tt(.)var(mm)tt(.)var(yyyy)',
+instead of the default `var(mm)tt(/)var(dd)tt(/)var(yyyy)'.
+Adding the tt(-i) flag causes the dates to be printed in ISO8601
+`var(yyyy)tt(-)var(mm)tt(-)var(dd)' format.
+With the tt(-D) flag, tt(fc) prints elapsed times.
+
+cindex(history, file)
+cindex(file, history)
+tt(fc -R) reads the history from the given file,
+tt(fc -W) writes the history out to the given file,
+and tt(fc -A) appends the history out to the given file.
+If the tt(-I) option is added, only those
+events that are new since last incremental append (write) to
+the history file are appended (written).
+In any case the file will have no more than tt($SAVEHIST)
+entries.
+)
+findex(fg)
+cindex(jobs, foregrounding)
+cindex(jobs, resuming)
+xitem(tt(fg) [ var(job) ... ])
+item(var(job) ...)(
+Bring each specified var(job) in turn to the foreground.
+If no var(job) is specified, resume the current job.
+)
+findex(functions)
+item(tt(functions) [ {tt(PLUS())|tt(-)}tt(tum) ] [ var(name) ... ])(
+Equivalent to tt(typeset -f).
+)
+findex(getln)
+cindex(line, reading)
+cindex(reading a line)
+item(tt(getln) [ tt(-AclneE) ] var(name) ...)(
+Read the top value from the buffer stack and put it in
+the shell parameter tt(name).  Equivalent to
+tt(read -zr).
+)
+findex(getopts)
+cindex(options, processing)
+item(tt(getopts) var(optstring) var(name) [ var(arg) ... ])(
+Checks the var(arg)s for legal options.  If the var(arg)s are omitted,
+use the positional parameters.  A valid option argument
+begins with a `tt(PLUS())' or a `tt(-)'.  An argument not beginning with
+a `tt(PLUS())' or a `tt(-)', or the argument `tt(--)', ends the options.
+var(optstring) contains the letters that tt(getopts)
+recognizes.  If a letter is followed by a `tt(:)', that option
+is expected to have an argument.  The options can be
+separated from the argument by blanks.
+
+Each time it is invoked, tt(getopts) places the option letter it finds
+in the shell parameter var(name), prepended with a `tt(PLUS())' when
+var(arg) begins with a `tt(PLUS())'.  The index of the next var(arg)
+is stored in tt(OPTIND).  The option argument, if any,
+is stored in tt(OPTARG).
+vindex(OPTIND, use of)
+vindex(OPTARG, use of)
+
+A leading `tt(:)' in var(optstring) causes tt(getopts) to store the
+letter of the invalid option in tt(OPTARG), and to set var(name)
+to `tt(?)' for an unknown option and to `tt(:)' when a required option
+is missing.  Otherwise, tt(getopts) prints an error
+message.  The exit status is nonzero when there are no more options.
+)
+findex(hash)
+item(tt(hash) [ tt(-dfmrv) ] [ var(name)[tt(=)var(value)] ] ...)(
+tt(hash) can be used to directly modify the contents of the command
+hash table, and the named directory hash table.  Normally one would
+modify these tables by modifying one's tt(PATH)
+(for the command hash table) or by creating appropriate shell parameters
+(for the named directory hash table).
+The choice of hash table to work on is determined by the tt(-d) option;
+without the option the command hash table is used, and with the option the
+named directory hash table is used.
+
+Given no arguments, and neither the tt(-r) or tt(-f) options,
+the selected hash table will be listed in full.
+
+The tt(-r) option causes the selected hash table to be emptied.
+It will be subsequently rebuilt in the normal fashion.
+The tt(-f) option causes the selected hash table to be fully
+rebuilt immediately.  For the command hash table this hashes
+all the absolute directories in the tt(PATH),
+and for the named directory hash table this adds all users' home directories.
+These two options cannot be used with any arguments.
+
+The tt(-m) option causes the arguments to be taken as patterns
+(they should be quoted) and the elements of the hash table
+matching those patterns are printed.  This is the only way to display
+a limited selection of hash table elements.
+
+For each var(name) with a corresponding var(value), put `var(name)' in
+the selected hash table, associating it with the pathname `var(value)'.
+In the command hash table, this means that
+whenever `var(name)' is used as a command argument, the shell will try
+to execute the file given by `var(value)'.
+In the named directory hash table, this means
+that `var(value)' may be referred to as `tt(~)var(name)'.
+
+For each var(name) with no
+corresponding var(value), attempt to add var(name) to the hash table,
+checking what the appropriate tt(value) is in the normal manner for
+that hash table.  If an appropriate tt(value) can't be found, then
+the hash table will be unchanged.
+
+The tt(-v) option causes hash table entries to be listed as they are
+added by explicit specification.  If has no effect if used with tt(-f).
+)
+alias(history)(fc -l)
+findex(integer)
+item(tt(integer) [ {tt(PLUS())|tt(-)}tt(lrtux) ] [ var(name)[tt(=)var(value)] ... ])(
+Equivalent to tt(typeset -i), except that options irrelevant to
+integers are not permitted.
+)
+findex(jobs)
+xitem(tt(jobs) [ tt(-dlprs) ] [ var(job) ... ])
+item(tt(jobs -Z) var(string))(
+Lists information about each given job, or all jobs
+if var(job) is omitted.  The tt(-l) flag lists process
+IDs, and the tt(-p) flag lists process groups.
+If the tt(-r) flag is specified only running jobs will be listed
+and if the tt(-s) flag is given only stopped jobs are shown.
+If the tt(-d) flag is given, the directory from which the job was
+started (which may not be the current directory of the job) will also
+be shown.
+
+The tt(-Z) option replaces the shell's argument and environment space with
+the given string, truncated if necessary to fit.  This will normally be
+visible in tt(ps) (manref(ps)(1)) listings.  This feature is typically
+used by daemons, to indicate their state.
+)
+findex(kill)
+cindex(killing jobs)
+cindex(jobs, killing)
+xitem(tt(kill) [ tt(-s) var(signal_name) ] var(job) ...)
+xitem(tt(kill) [ tt(-)var(sig) ] var(job) ...)
+item(tt(kill) tt(-l) [ var(sig) ... ])(
+Sends either tt(SIGTERM) or the specified signal to the given
+jobs or processes.
+Signals are given by number or by names, without the `tt(SIG)' prefix.
+If the signal being sent is not `tt(KILL)' or `tt(CONT)', then the job
+will be sent a `tt(CONT)' signal if it is stopped.
+The argument var(job) can be the process ID of a job
+not in the job list.
+In the third form, tt(kill -l), if var(sig) is not
+specified the signal names are listed.  Otherwise, for each
+var(sig) that is a name, the corresponding signal number is
+listed.  For each var(sig) that is a signal number or a number
+representing the exit status of a process which was terminated or
+stopped by a signal the name of the signal is printed.
+)
+findex(let)
+item(tt(let) var(arg) ...)(
+Evaluate each var(arg) as an arithmetic expression.
+See noderef(Arithmetic Evaluation) for a description
+of arithmetic expressions.  The exit status is 0 if the
+value of the last expression is nonzero, and 1 otherwise.
+)
+findex(limit)
+cindex(resource limits)
+cindex(limits, resource)
+item(tt(limit) [ tt(-hs) ] [ var(resource) [ var(limit) ] ] ...)(
+Set or display resource limits.  Unless the tt(-s) flag is given,
+the limit applies only the children of the shell.  If tt(-s) is
+given without other arguments, the resource limits of the current
+shell is set to the previously set resource limits of the children.
+
+If var(limit) is not specified, print the current limit placed
+on var(resource), otherwise
+set the limit to the specified value.  If the tt(-h) flag
+is given, use hard limits instead of soft limits.
+If no var(resource) is given, print all limits.
+
+var(resource) can be one of:
+
+startsitem()
+sitem(tt(memorylocked))(Maximum amount of memory locked in RAM.)
+sitem(tt(resident))(Maximum resident set size.)
+sitem(tt(vmemorysize))(Maximum amount of virtual memory.)
+sitem(tt(descriptors))(Maximum value for a file descriptor.)
+sitem(tt(coredumpsize))(Maximum size of a core dump.)
+sitem(tt(stacksize))(Maximum stack size for each process.)
+sitem(tt(datasize))(Maximum data size (including stack) for each process.)
+sitem(tt(filesize))(Largest single file allowed.)
+sitem(tt(cputime))(Maximum CPU seconds per process.)
+sitem(tt(maxproc))(Maximum number of processes.)
+sitem(tt(addressspace))(Maximum amount of address space used.)
+sitem(tt(cachedthreads))(Maximum number of cached threads.)
+endsitem()
+
+Which of these resource limits are available depends on the system.
+var(resource) can be abbreviated to any unambiguous prefix.
+
+var(limit) is a number, with an optional scaling factor, as follows:
+
+startsitem()
+sitem(var(n)tt(h))(hours)
+sitem(var(n)tt(k))(kilobytes (default))
+sitem(var(n)tt(m))(megabytes or minutes)
+sitem([var(mm)tt(:)]var(ss))(minutes and seconds)
+endsitem()
+)
+findex(local)
+item(tt(local) [ {tt(PLUS())|tt(-)}tt(LRZilrtu) [var(n)]] [ var(name)[tt(=)var(value)] ] ...)(
+Same as tt(typeset), except that the options tt(-x) and
+tt(-f) are not permitted.
+)
+findex(log)
+vindex(watch, use of)
+cindex(watching users)
+cindex(users, watching)
+item(tt(log))(
+List all users currently logged in who are affected by
+the current setting of the tt(watch) parameter.
+)
+findex(logout)
+item(tt(logout) [ var(n) ])(
+Same as tt(exit), except that it only works in a login shell.
+)
+prefix(noglob)
+findex(popd)
+item(tt(popd) [ {tt(PLUS())|tt(-)}var(n) ])(
+Removes a entry from the directory stack, and perform a tt(cd) to
+the new top directory. With no argument, the current top entry is
+removed.  An argument of the form `tt(PLUS())var(n)' identifies a stack
+entry by counting from the left of the list shown by the tt(dirs) command,
+starting with zero.  An argument of the form tt(-n) counts from the right.
+pindex(PUSHD_MINUS, use of)
+If the tt(PUSHD_MINUS) option is set, the meanings of `tt(PLUS())' and
+`tt(-)' in this context are swapped.
+)
+findex(print)
+item(tt(print) [ tt(-nrslzpNDPoOicm) ] [ tt(-u)var(n) ] [ tt(-R) [ tt(-en) ]] [ var(arg) ... ])(
+With no flags or with flag `tt(-)', the arguments are printed on
+the standard output as described by tt(echo), with the following differences:
+the escape sequence `tt(\M-)var(x)' metafies the character
+var(x) (sets the highest bit),
+`tt(\C-)var(x)' produces a control character (`tt(\C-@)' and `tt(\C-?)' give the
+characters NUL and delete), and `tt(\E)' is a synonym for `tt(\e)'.
+Finally, if not in an escape
+sequence, `tt(\)' escapes the following character and is not printed.
+
+startitem()
+item(tt(-r))(
+Ignore the escape conventions of tt(echo).
+)
+item(tt(-R))(
+Emulate the BSD tt(echo) command, which does not process escape sequences
+unless the tt(-e) flag is given.  The tt(-n) flag suppresses the trailing
+newline.  Only the tt(-e) and tt(-n) flags are recognized after
+tt(-R); all other arguments and options are printed.
+)
+item(tt(-m))(
+Take the first argument as a pattern (should be quoted), and remove
+it from the argument list together with subsequent arguments that
+do not match this pattern.
+)
+item(tt(-s))(
+Place the results in the history list instead of on the standard output.
+)
+item(tt(-n))(
+Do not add a newline to the output.
+)
+item(tt(-l))(
+Print the arguments separated by newlines instead of spaces.
+)
+item(tt(-N))(
+Print the arguments separated and terminated by nulls.
+)
+item(tt(-o))(
+Print the arguments sorted in ascending order.
+)
+item(tt(-O))(
+Print the arguments sorted in descending order.
+)
+item(tt(-i))(
+If given together with tt(-o) or tt(-O), makes them work case
+independently.
+)
+item(tt(-c))(
+Print the arguments in columns.
+)
+item(tt(-u)var(n))(
+Print the arguments to file descriptor var(n).
+)
+item(tt(-p))(
+Print the arguments to the input of the coprocess.
+)
+item(tt(-z))(
+Push the arguments onto the editing buffer stack, separated by spaces;
+no escape sequences are recognized.
+)
+item(tt(-D))(
+Treat the arguments as directory names, replacing prefixes with tt(~)
+expressions, as appropriate.
+)
+item(tt(-P))(
+Perform prompt expansion (see noderef(Prompt Expansion)).
+)
+enditem()
+)
+findex(pushd)
+pindex(PUSHD_TO_HOME, use of)
+pindex(PUSHD_MINUS, use of)
+pindex(CDABLE_VARS, use of)
+pindex(PUSHD_SILENT, use of)
+xitem(tt(pushd) [ var(arg) ])
+xitem(tt(pushd) var(old) var(new))
+item(tt(pushd) {tt(PLUS())|tt(-)}var(n))(
+Change the current directory, and push the old current directory
+onto the directory stack.  In the first form, change the
+current directory to var(arg).
+If var(arg) is not specified, change to the second directory
+on the stack (that is, exchange the top two entries), or
+change to tt($HOME) if the tt(PUSHD_TO_HOME)
+option is set or if there is only one entry on the stack.
+
+If var(arg) is `tt(-)', change to tt($OLDPWD), the previous directory.
+If a directory named var(arg) is not found in the current directory
+and var(arg) does not contain a slash,
+search each component of the shell parameter tt(cdpath).
+If the option tt(CDABLE_VARS) is set, and a parameter named var(arg)
+exists whose value begins with a slash, treat its value as
+the directory.
+
+If the option tt(PUSHD_SILENT) is not set, the directory
+stack will be printed after a tt(pushd) is performed.
+
+The second form of tt(pushd) substitutes the string var(new)
+for the string var(old) in the name of the current directory,
+and tries to change to this new directory.
+
+The third form of tt(pushd) changes directory by rotating the
+directory list.  An argument of the form `tt(PLUS())var(n)' identifies a stack
+entry by counting from the left of the list shown by the tt(dirs)
+command, starting with zero.  An argument of the form `tt(-)var(n)' counts
+from the right.  If the tt(PUSHD_MINUS) option is set, the meanings
+of `tt(PLUS())' and `tt(-)' in this context are swapped.
+)
+findex(pushln)
+item(tt(pushln) [ var(arg) ... ])(
+Equivalent to tt(print -nz).
+)
+findex(pwd)
+pindex(CHASE_LINKS, use of)
+item(tt(pwd) [ tt(-rLP) ])(
+Print the absolute pathname of the current working directory.
+If the tt(-r) or the tt(-P) flag is specified, or the tt(CHASE_LINKS)
+option is set and the tt(-L) flag is not given, the printed path will not
+contain symbolic links.
+)
+alias(r)(fc -e -)
+findex(read)
+vindex(IFS, use of)
+item(tt(read) [ tt(-rzpqAclneE) ] [ tt(-k) [ var(num) ] ] \
+[ tt(-u)var(n) ] [ var(name)[tt(?)var(prompt)] ] [ var(name) ...  ])(
+Read one line and break it into fields using the characters
+in tt($IFS) as separators, except as noted below.
+The first field is assigned to the first var(name), the second field
+to the second var(name), etc., with leftover
+fields assigned to the last var(name).
+
+startitem()
+item(tt(-r))(
+Raw mode: a `tt(\)' at the end of a line does not signify line
+continuation.
+)
+item(tt(-q))(
+Read only one character from the terminal and set var(name) to
+`tt(y)' if this character was `tt(y)' or `tt(Y)' and to `tt(n)' otherwise.
+With this flag set the return value is zero only if the character was
+`tt(y)' or `tt(Y)'.  Note that this always reads from the terminal, even
+if used with the tt(-p) or tt(-u) or tt(-z) flags or with redirected input.
+)
+item(tt(-k) [ var(num) ])(
+Read only one (or var(num)) characters.  All are assigned to the first
+var(name), without word splitting.  This flag is ignored when tt(-q) is
+present.  Input is read from the terminal unless one of tt(-u) or tt(-p)
+is present.
+)
+item(tt(-z))(
+Read one entry from the editor buffer stack and assign it to the first
+var(name), without word splitting.  Text is pushed onto the stack with
+`tt(print -z)' or with tt(push-line) from the line editor (see
+ifzman(zmanref(zshzle))\
+ifnzman(noderef(Zsh Line Editor))\
+).  This flag is ignored when the tt(-k) or tt(-q) flags are present.
+)
+xitem(tt(-e))
+item(tt(-E))(
+The input read is printed (echoed) to the standard output.  If the tt(-e)
+flag is used, no input is assigned to the parameters.
+)
+item(tt(-A))(
+The first var(name) is taken as the name of an array and all words are
+assigned to it.
+)
+xitem(tt(-c))
+item(tt(-l))(
+These flags are allowed only if called inside a
+function used for completion (specified with the tt(-K) flag to
+tt(compctl)).  If the tt(-c) flag is given, the words of the
+current command are read. If the tt(-l) flag is given, the whole
+line is assigned as a scalar.  If both flags are present, tt(-l)
+is used and tt(-c) is ignored.  If var(name) is omitted then
+tt(REPLY) is used for scalars and tt(reply) for arrays.
+)
+item(tt(-n))(
+Together with tt(-c), the number of the word the cursor is on is
+read.  With tt(-l), the index of the character the cursor is on is
+read.  Note that the command name is word number 1, not word 0,
+and that when the cursor is at the end of the line, its character
+index is the length of the line plus one.
+)
+item(tt(-u)var(n))(
+Input is read from file descriptor var(n).
+)
+item(tt(-p))(
+Input is read from the coprocess.
+)
+enditem()
+
+If the first argument contains a `tt(?)', the remainder of this
+word is used as a var(prompt) on standard error when the shell
+is interactive.
+
+The value (exit status) of tt(read) is 1 when an end-of-file is
+encountered, or when tt(-c) or tt(-l) is present and the command is
+not called from a tt(compctl) function.  Otherwise the value is 0.
+
+The behavior of some combinations of the tt(-k), tt(-p), tt(-q), tt(-u)
+and tt(-z) flags is undefined.  Presently tt(-q) cancels all the others,
+tt(-p) cancels tt(-u), tt(-k) cancels tt(-z), and otherwise tt(-z)
+cancels both tt(-p) and tt(-u).
+
+The tt(-c) or tt(-l) flags cancel any and all of tt(-kpquz).
+)
+cindex(parameters, marking readonly)
+alias(readonly)(typeset -r)
+alias(rehash)(hash -r)
+findex(return)
+cindex(functions, returning from)
+item(tt(return) [ var(n) ])(
+Causes a shell function or tt(.) script to return to
+the invoking script with the return status specified by var(n).  If var(n)
+is omitted, the return status is that of the last command
+executed.
+
+If tt(return) was executed from a trap in a tt(TRAP)var(NAL) function,
+the effect is different for zero and non-zero return status.  With zero
+status (or after an implicit return at the end of the trap), the shell
+will return to whatever it was previously processing; with a non-zero
+status, the shell will behave as interrupted except that the return
+status of the trap is retained.  Note that the signal which caused the
+trap is passed as the first argument, so the statement `tt(return
+$((128PLUS()$1)))' will return the same status as if the signal had not
+been trapped.
+)
+findex(set)
+cindex(parameters, listing)
+cindex(parameters, positional)
+cindex(parameters, setting array)
+cindex(array parameters, setting)
+item(tt(set) [ {tt(PLUS())|tt(-)}var(options) | {tt(PLUS())|tt(-)}tt(o) var(option_name) ] ... [ {tt(PLUS())|tt(-)}tt(A) [ var(name) ] ] [ var(arg) ... ])(
+Set the options for the shell and/or set the positional parameters, or
+declare and set an array.  If the tt(-s) option is given, it causes the
+specified arguments to be sorted before assigning them to the positional
+parameters (or to the array var(name) if tt(-A) is used).  With tt(PLUS()s)
+sort arguments in descending order.  For the meaning of the other flags, see
+ifzman(zmanref(zshoptions))\
+ifnzman(noderef(Options))\
+.  Flags may be specified by name using the tt(-o) option.
+
+If the tt(-A) flag is specified, var(name) is
+set to an array containing the given var(arg)s. if tt(PLUS()A) is used and
+var(name) is an array, the given arguments will replace the initial
+elements of that array; if no var(name) is specified, all arrays are
+printed.  Otherwise the positional parameters are set.  If no arguments are
+given, then the names and values of all parameters are printed on the
+standard output.  If the only argument is `tt(PLUS())',
+the names of all parameters are printed.
+)
+findex(setopt)
+cindex(options, setting)
+item(tt(setopt) [ {tt(PLUS())|tt(-)}var(options) | \
+{tt(PLUS())|tt(-)}tt(o) var(option_name) ] [ var(name) ... ])(
+Set the options for the shell.  All options specified either
+with flags or by name are set.  If no arguments are supplied,
+the names of all options currently set are printed.
+If the tt(-m) flag is given the arguments are taken as patterns
+(which should be quoted to preserve them from being interpreted as glob
+patterns), and all options with names matching these patterns are set.
+)
+findex(shift)
+cindex(parameters, positional)
+item(tt(shift) [ var(n) ] [ var(name) ... ])(
+The positional parameters tt(${)var(n)PLUS()1tt(}) ... are renamed
+to tt($1) ..., where var(n) is an arithmetic expression that
+defaults to 1.
+If any var(name)s are given then the arrays with these names are
+shifted instead of the positional parameters.
+)
+findex(source)
+item(tt(source) var(file) [ var(arg) ... ])(
+Same as tt(.), except that the current directory is always searched and
+is always searched first, before directories in tt($path).
+)
+findex(suspend)
+cindex(shell, suspending)
+cindex(suspending the shell)
+item(tt(suspend) [ tt(-f) ])(
+Suspend the execution of the shell (send it a tt(SIGTSTP))
+until it receives a tt(SIGCONT).
+Unless the tt(-f) option is given, this will refuse to suspend a login shell.
+)
+findex(test)
+xitem(tt(test) [ var(arg) ... ])
+item(tt([) [ var(arg) ... ] tt(]))(
+Like the system version of tt(test).  Added for compatibility;
+use conditional expressions instead (see noderef(Conditional Expressions)).
+)
+findex(times)
+cindex(shell, timing)
+cindex(timing the shell)
+item(tt(times))(
+Print the accumulated user and system times for the shell
+and for processes run from the shell.
+)
+findex(trap)
+cindex(signals, trapping)
+cindex(trapping signals)
+item(tt(trap) [ var(arg) [ var(sig) ... ] ])(
+var(arg) is a command to be read and executed when the shell
+receives var(sig).  Each var(sig) can be given as a number
+or as the name of a signal.
+If var(arg) is `tt(-)', then all traps var(sig) are reset to their
+default values.  If var(arg) is the null string, then this signal
+is ignored by the shell and by the commands it invokes.
+
+If var(sig) is tt(ZERR) then var(arg) will be executed
+after each command with a nonzero exit status.
+If var(sig) is tt(DEBUG) then var(arg) will be executed
+after each command.
+If var(sig) is tt(0) or tt(EXIT)
+and the tt(trap) statement is executed inside the body of a function,
+then the command var(arg) is executed after the function completes.
+If var(sig) is tt(0) or tt(EXIT)
+and the tt(trap) statement is not executed inside the body of a function,
+then the command var(arg) is executed when the shell terminates.
+
+The tt(trap) command with no arguments prints a list of commands
+associated with each signal.
+)
+findex(true)
+cindex(doing nothing, successfully)
+item(tt(true) [ var(arg) ... ])(
+Do nothing and return an exit code of 0.
+)
+findex(ttyctl)
+cindex(tty, freezing)
+item(tt(ttyctl) tt(-fu))(
+The tt(-f) option freezes the tty, and tt(-u) unfreezes it.
+When the tty is frozen, no changes made to the tty settings by
+external programs will be honored by the shell, except for changes in the
+size of the screen; the shell will
+simply reset the settings to their previous values as soon as each
+command exits or is suspended.  Thus, tt(stty) and similar programs have
+no effect when the tty is frozen.  Without options it reports whether the
+terminal is frozen or not.
+)
+findex(type)
+item(tt(type) [ tt(-wfpams) ] var(name) ...)(
+Equivalent to tt(whence -v).
+)
+findex(typeset)
+cindex(parameters, setting)
+cindex(parameters, declaring)
+item(tt(typeset) [ {tt(PLUS())|tt(-)}tt(LRUZfilrtuxm) [var(n)]] [ var(name)[tt(=)var(value)] ... ])(
+Set attributes and values for shell parameters.
+When invoked inside a function a new parameter is created which will be
+unset when the function completes.  The new parameter will not be
+exported unless tt(ALL_EXPORT) is set, in which case the parameter will be
+exported provided no parameter of that name already exists.
+The following attributes are valid:
+
+startitem()
+item(tt(-L))(
+Left justify and remove leading blanks from var(value).
+If var(n) is nonzero, it defines the width of the field;
+otherwise it is determined by the width of the value of the first
+assignment.
+When the parameter is printed, it is filled on the right with
+blanks or truncated if necessary to fit the field.
+Leading zeros are removed if the tt(-Z) flag is also set.
+)
+item(tt(-R))(
+Right justify and fill with leading blanks.  If var(n) is nonzero
+if defines the width of the field;
+otherwise it is determined by the width of the value of the first
+assignment.
+When the parameter is printed, the field is left filled with
+blanks or truncated from the end.
+)
+item(tt(-U))(
+For arrays keep only the first element of each duplications. It can also be
+set for colon separated special parameters like tt(PATH) or tt(FIGNORE),
+etc.
+)
+item(tt(-Z))(
+Right justify and fill with leading zeros if the first non-blank
+character is a digit and the tt(-L) flag has not been set.
+If var(n) is nonzero it defines the width of the field;
+otherwise it is determined by the width of the value of the
+first assignment.
+)
+item(tt(-f))(
+The names refer to functions rather than parameters.  No assignments
+can be made, and the only other valid flags are tt(-t)
+and tt(-u).  The flag tt(-t) turns on execution tracing for this
+function.  The flag tt(-u) causes this function to be marked
+for autoloading.  The tt(fpath) parameter will be searched to find the
+function definition when the function is first referenced; see
+noderef(Functions).
+)
+item(tt(-i))(
+Use an internal integer representation.  If var(n) is nonzero
+it defines the output arithmetic base, otherwise it is determined by the first
+assignment.
+)
+item(tt(-l))(
+Convert to lower case.
+)
+item(tt(-r))(
+The given var(name)s are marked readonly.
+)
+item(tt(-t))(
+Tags the named parameters.  Tags have no special meaning to the shell.
+)
+item(tt(-u))(
+Convert to upper case.
+)
+item(tt(-x))(
+Mark for automatic export to the environment of subsequently
+executed commands.
+)
+enditem()
+
+Using `tt(PLUS())' rather than `tt(-)' causes these flags to be turned off.
+If no arguments are given but flags are specified,
+a list of named parameters which have these flags set is printed.
+Using `tt(PLUS())' instead of `tt(-)' keeps their values from being printed.
+If no arguments or options are given, the names and attributes
+of all parameters are printed. If only the tt(-m) flag is given the
+arguments are taken as patterns (should be quoted) and all parameters
+or functions (with the tt(-f) flag) with matching names are printed.
+)
+findex(ulimit)
+cindex(resource limits)
+cindex(limits, resource)
+item(tt(ulimit) [ tt(-SHacdflmnpstv) [ tt(limit) ] ... ])(
+Set or display resource limits of the shell and the processes started by
+the shell.  The value of var(limit) can be a number in the unit specified
+below or the value `tt(unlimited)'.  If the tt(-H) flag is given use
+hard limits instead of soft limits.  If the tt(-S) flag is given
+together with the tt(-H) flag set both hard and soft limits.  If no
+options are used, the file size limit (tt(-f)) is assumed.  If
+var(limit) is omitted the current value of the specified resources are
+printed.  When more than one resource values are printed the limit name and
+unit is printed before each value.
+
+startsitem()
+sitem(tt(-a))(Lists all of the current resource limits.)
+sitem(tt(-c))(512-byte blocks on the size of core dumps.)
+sitem(tt(-d))(K-bytes on the size of the data segment.)
+sitem(tt(-f))(512-byte blocks on the size of files written.)
+sitem(tt(-l))(K-bytes on the size of locked-in memory.)
+sitem(tt(-m))(K-bytes on the size of physical memory.)
+sitem(tt(-n))(open file descriptors.)
+sitem(tt(-s))(K-bytes on the size of the stack.)
+sitem(tt(-t))(CPU seconds to be used.)
+sitem(tt(-u))(processes available to the user.)
+sitem(tt(-v))(K-bytes on the size of virtual memory.)
+endsitem()
+)
+findex(umask)
+cindex(umask)
+item(tt(umask) [ tt(-S) ] [ var(mask) ])(
+The umask is set to var(mask).  var(mask) can be either
+an octal number or a symbolic value as described in manref(chmod)(1).
+If var(mask) is omitted, the current value is printed.  The tt(-S)
+option causes the mask to be printed as a symbolic value.  Otherwise,
+the mask is printed as an octal number.  Note that in
+the symbolic form the permissions you specify are those which are to be
+allowed (not denied) to the users specified.
+)
+cindex(aliases, removing)
+alias(unalias)(unhash -a)
+cindex(functions, removing)
+alias(unfunction)(unhash -f)
+findex(unhash)
+item(tt(unhash) [ tt(-adfm) ] var(name) ...)(
+Remove the element named var(name) from an internal hash table.  The
+default is remove elements from the command hash table.  The tt(-a)
+option causes tt(unhash) to remove aliases.  The tt(-f) option causes
+tt(unhash) to remove shell functions.  The tt(-d) options causes
+tt(unhash) to remove named directories.  If the tt(-m) flag is given
+the arguments are taken as patterns (should be quoted) and all elements
+of the corresponding hash table with matching names will be removed.
+)
+findex(unlimit)
+cindex(resource limits)
+cindex(limits, resource)
+item(tt(unlimit) [ tt(-hs) ] var(resource) ...)(
+The resource limit for each var(resource) is set to the hard limit.
+If the tt(-h) flag is given and the shell has appropriate privileges,
+the hard resource limit for each var(resource) is removed.
+The resources of the shell process are only changed if the tt(-s)
+flag is given.
+)
+findex(unset)
+cindex(parameters, unsetting)
+item(tt(unset) [ tt(-fm) ] var(name) ...)(
+Each named parameter is unset.
+Local parameters remain local even if unset; they appear unset within scope,
+but the previous value will still reappear when the scope ends.
+
+If the tt(-m) flag is specified the
+arguments are taken as patterns (should be quoted) and all parameters
+with matching names are unset.  tt(unset -f) is equivalent to
+tt(unfunction).
+)
+findex(unsetopt)
+cindex(options, unsetting)
+item(tt(unsetopt) [ {tt(PLUS())|tt(-)}var(options) | \
+{tt(PLUS())|tt(-)}tt(o) var(option_name) ] [ var(name) ... ])(
+Unset the options for the shell.  All options specified either
+with flags or by name are unset.  If no arguments are supplied,
+the names of all options currently unset are printed.
+If the tt(-m) flag is given the arguments are taken as patterns
+(which should be quoted to preserve them from being interpreted as glob
+patterns), and all options with names matching these patterns are unset.
+)
+findex(wait)
+cindex(waiting for jobs)
+cindex(jobs, waiting for)
+item(tt(wait) [ var(job) ... ])(
+Wait for the specified jobs or processes.  If var(job) is not given
+then all currently active child processes are waited for.
+Each var(job) can be either a job specification or the process ID
+of a job in the job table.
+The exit status from this command is that of the job waited for.
+)
+findex(whence)
+item(tt(whence) [ tt(-vcwfpams) ] var(name) ...)(
+For each name, indicate how it would be interpreted if used as a
+command name.
+
+startitem()
+item(tt(-v))(
+Produce a more verbose report.
+)
+item(tt(-c))(
+Print the results in a bf(csh)-like format.
+This takes precedence over tt(-v).
+)
+item(tt(-w))(
+For each var(name), print `var(name)tt(:) var(word)' where var(word)
+is one of tt(alias), tt(builtin), tt(command), tt(function),
+tt(hashed), tt(reserved) or tt(none), according as var(name)
+corresponds to an alias, a built-in command, an external command, a
+shell function, a command defined with the tt(hash) builtin, a
+reserved word, or is not recognised.  This takes precedence over
+tt(-v) and tt(-c).
+)
+item(tt(-f))(
+Causes the contents of a shell function to be
+displayed, which would otherwise not happen unless the tt(-c)
+flag were used.
+)
+item(tt(-p))(
+Do a path search for var(name)
+even if it is an alias, reserved word, shell function or builtin.
+)
+item(tt(-a))(
+Do a search for all occurrences of var(name)
+throughout the command path.
+Normally only the first occurrence is printed.
+)
+item(tt(-m))(
+The arguments are taken as patterns (should be
+quoted), and the information is displayed for each command matching one
+of these patterns.
+)
+item(tt(-s))(
+If a pathname contains symlinks, print the symlink-free pathname as well.
+)
+enditem()
+)
+findex(where)
+item(tt(where) [ tt(-wpms) ] var(name) ...)(
+Equivalent to tt(whence -ca).
+)
+findex(which)
+item(tt(which) [ tt(-wpams) ] var(name) ...)(
+Equivalent to tt(whence -c).
+)
+findex(zmodload)
+cindex(modules, loading)
+cindex(loading modules)
+xitem(tt(zmodload) [ tt(-iL) ] [ var(name) ... ])
+xitem(tt(zmodload) tt(-u) [ tt(-i) ] var(name) ...)
+xitem(tt(zmodload) tt(-d) [ tt(-L) ] [ var(name) [ var(dep) ... ] ])
+xitem(tt(zmodload) tt(-du) var(name) [ var(dep) ... ])
+xitem(tt(zmodload) tt(-a) [ tt(-iL) ] [ var(name) [ var(builtin) ... ] ])
+item(tt(zmodload) tt(-au) [ tt(-i) ] var(builtin) ...)(
+tt(zmodload) performs operations relating to zsh's loadable modules.
+This feature is not available on all operating systems,
+or on all installations on a particular operating system.
+
+In the simplest case,
+tt(zmodload) loads a binary module.  The module must be in a file with a
+name consisting of the specified var(name) followed by a standard suffix,
+usually `tt(.so)'.  If this can't be found, the var(name) is tried without
+the suffix.
+If the module to be loaded is already loaded and the tt(-i)
+option is given, the duplicate module is ignored.  Otherwise
+tt(zmodload) prints an error message.
+
+The var(name)d module is searched for in the same way a command is, using
+tt($module_path) instead of tt($path).  If var(name) contains a `tt(/)',
+it will be used as-is, and a path search will be performed otherwise.
+This behaviour can be modified by the tt(PATH_DIRS) option.
+cindex(PATH_DIRS, use of)
+
+With tt(-u), tt(zmodload) unloads modules.  The same var(name)
+must be given that was given when the module was loaded, but it is not
+necessary for the module to exist in the filesystem.
+The tt(-i) option suppresses the error if the module is already
+unloaded (or was never loaded).
+
+Each module has a boot and a cleanup function.  The module
+will not be loaded if its boot function fails.  Similarly a module
+can only be unloaded if its cleanup function runs successfully.
+
+Without arguments all currently loaded binary modules are printed.
+The tt(-L) option causes this list to be in the form of a series of
+tt(zmodload) commands.
+
+The tt(-d) option can be used to specify module dependencies.
+This operation is idempotent regardless of the tt(-i) option.
+The modules named in the second and subsequent arguments will be
+loaded before the module named in the first argument.
+
+With tt(-d) and one
+argument, all dependencies for that module are listed.  With tt(-d) and no
+arguments, all module dependencies are listed.
+This listing is by default in a Makefile-like format.
+The tt(-L) option changes this format to a list of
+tt(zmodload -d) commands.
+
+If tt(-d) and tt(-u) are both used, dependencies are removed.
+This operation is idempotent regardless of the tt(-i) option.
+If only one argument is given, all dependencies for that module are removed.
+
+The tt(-a) option defines autoloaded builtins.  It defines the
+specified var(builtin)s.  When any of those builtins is called, the module
+specified in the first argument is loaded.  If only one argument is given,
+one builtin is defined, with the same name as the module.
+tt(-i) suppresses the error if the builtin is already defined or
+autoloaded, regardless of which module it came from.
+
+With tt(-a) and no arguments, all
+autoloaded builtins are listed, with the module name (if different)
+shown in parentheses after the builtin name.  The tt(-L) option changes
+this format to a list of tt(zmodload -a) commands.
+
+If tt(-a) is used
+together with the tt(-u) option it removes builtins defined with
+tt(zmodload -a).  This is only possible if the builtin is not yet
+loaded.  tt(-i) suppresses the error if the builtin is already
+removed (or never existed).
+)
+enditem()
diff --git a/Doc/Zsh/compat.yo b/Doc/Zsh/compat.yo
new file mode 100644
index 000000000..529bd4557
--- /dev/null
+++ b/Doc/Zsh/compat.yo
@@ -0,0 +1,69 @@
+texinode(Compatibility)(Prompt Expansion)(Conditional Expressions)(Top)
+chapter(Compatibility)
+ifzman(\
+sect(Compatibility)
+)\
+cindex(compatibility)
+cindex(sh, compatibility)
+cindex(ksh, compatibility)
+Zsh tries to emulate bf(sh) or bf(ksh) when it is invoked as
+tt(sh) or tt(ksh) respectively.  In this mode the following
+parameters are not special and not initialized by the shell:
+tt(ARGC),
+tt(argv),
+tt(cdpath),
+tt(fignore),
+tt(fpath),
+tt(HISTCHARS),
+tt(mailpath),
+tt(MANPATH),
+tt(manpath),
+tt(path),
+tt(prompt),
+tt(PROMPT),
+tt(PROMPT2),
+tt(PROMPT3),
+tt(PROMPT4),
+tt(psvar),
+tt(status),
+tt(watch).
+
+The usual zsh startup/shutdown scripts are not executed.  Login shells
+source tt(/etc/profile) followed by tt($HOME/.profile).  If the
+tt(ENV) environment variable is set on invocation, tt($ENV) is sourced
+after the profile scripts.  The value of tt(ENV) is subjected to
+parameter expansion, command substitution, and arithmetic expansion before
+being interpreted as a pathname.  Note that the tt(PRIVILEGED) option
+also affects the execution of startup files.
+
+The following options are set if the shell is invoked as tt(sh) or
+tt(ksh):
+tt(NO_BAD_PATTERN),
+tt(NO_BANG_HIST),
+tt(NO_BG_NICE),
+tt(NO_EQUALS),
+tt(NO_FUNCTION_ARGZERO),
+tt(GLOB_SUBST),
+tt(NO_HUP),
+tt(INTERACTIVE_COMMENTS),
+tt(KSH_ARRAYS),
+tt(NO_MULTIOS),
+tt(NO_NOMATCH),
+tt(NO_NOTIFY),
+tt(POSIX_BUILTINS),
+tt(NO_PROMPT_PERCENT),
+tt(RM_STAR_SILENT),
+tt(SH_FILE_EXPANSION),
+tt(SH_GLOB),
+tt(SH_OPTION_LETTERS),
+tt(SH_WORD_SPLIT).
+Additionally the tt(BSD_ECHO) and tt(IGNORE_BRACES)
+options are set if zsh is invoked as tt(sh).
+Also, the
+tt(KSH_OPTION_PRINT),
+tt(LOCAL_OPTIONS),
+tt(PROMPT_BANG),
+tt(PROMPT_SUBST)
+and
+tt(SINGLE_LINE_ZLE)
+options are set if zsh is invoked as tt(ksh).
diff --git a/Doc/Zsh/compctl.yo b/Doc/Zsh/compctl.yo
new file mode 100644
index 000000000..a78a18fa9
--- /dev/null
+++ b/Doc/Zsh/compctl.yo
@@ -0,0 +1,526 @@
+texinode(Programmable Completion)(Zsh Modules)(Zsh Line Editor)(Top)
+chapter(Programmable Completion)
+cindex(completion, programmable)
+cindex(completion, controlling)
+findex(compctl)
+sect(Description)
+startlist()
+list(tt(compctl) [ tt(-CDT) ] var(options) [ var(command) ... ])
+list(tt(compctl) [ tt(-CDT) ] var(options) \
+  [ tt(-x) var(pattern) var(options) tt(-) ... tt(--) ] \
+  [ tt(PLUS()) var(options) [ tt(-x) ... tt(--) ] ... [tt(PLUS())] ] \
+  [ var(command) ... ])
+list(tt(compctl) tt(-L) [ tt(-CDT) ] [ var(command) ... ])
+list(tt(compctl) tt(PLUS()) var(command) ...)
+endlist()
+
+Control the editor's completion behavior according to the supplied set
+of var(options).  Various editing commands, notably
+tt(expand-or-complete-word), usually bound to tab, will
+attempt to complete a word typed by the user, while others, notably
+tt(delete-char-or-list), usually bound to ^D in EMACS editing
+mode, list the possibilities; tt(compctl) controls what those
+possibilities are.  They may for example be filenames (the most common
+case, and hence the default), shell variables, or words from a
+user-specified list.
+startmenu()
+menu(Command Flags)
+menu(Option Flags)
+menu(Alternative Completion)
+menu(Extended Completion)
+menu(Example)
+endmenu()
+texinode(Command Flags)(Option Flags)()(Programmable Completion)
+sect(Command Flags)
+Completion of the arguments of a command may be different for each
+command or may use the default.  The behavior when completing the
+command word itself may also be separately specified.  These
+correspond to the following flags and arguments, all of which (except
+for tt(-L)) may be combined with any combination of the
+var(options) described subsequently in noderef(Option Flags):
+
+startitem()
+item(var(command) ...)(
+controls completion for the named commands, which must be listed last
+on the command line.  If completion is attempted for a command with a
+pathname containing slashes and no completion definition is found, the
+search is retried with the last pathname component.  Note that aliases
+are expanded before the command name is determined unless the
+tt(COMPLETE_ALIASES) option is set.  Commands should not be combined
+with the tt(-C), tt(-D) or tt(-T) flags.
+)
+item(tt(-C))(
+controls completion when the command word itself is being completed.
+If no tt(compctl -C) command has been issued,  the names of any
+executable command (whether in the path or specific to the shell, such
+as aliases or functions) are completed.
+)
+item(tt(-D))(
+controls default completion behavior for the arguments of commands not
+assigned any special behavior.  If no tt(compctl -D) command has
+been issued, filenames are completed.
+)
+item(tt(-T))(
+supplies completion flags to be used before any other processing is
+done, even those given to specific commands with other compctl
+definitions.  This is only useful when combined with extended
+completion (the tt(-x) flag, see noderef(Extended Completion) below).
+Using this flag you can define default behavior
+which will apply to all commands without exception, or you can alter
+the standard behavior for all commands.  For example, if your access
+to the user database is too slow and/or it contains too many users (so
+that completion after `tt(~)' is too slow to be usable), you can use
+
+nofill(tt(compctl -Tx  'C[0,*/*]' -f - 's[~]' -k friends -S/))
+
+to complete the strings in the array tt(friends) after a `tt(~)'.
+The first argument is necessary so that this form of ~-completion is
+not tried after the directory name is finished.
+)
+item(tt(-L))(
+lists the existing completion behavior in a manner suitable for
+putting into a start-up script; the existing behavior is not changed.
+Any combination of the above forms may be specified, otherwise all
+defined completions are listed.  Any other flags supplied
+are ignored.
+)
+item(em(no argument))(
+If no argument is given, tt(compctl) lists all defined completions
+in an abbreviated form;  with a list of var(options), all completions
+with those flags set (not counting extended completion) are listed.
+)
+endlist()
+
+If the tt(PLUS()) flag is alone and followed immediately by the var(command)
+list, the completion behavior for all the commands in the list is reset to
+the default.  In other words, completion will subsequently use the
+options specified by the tt(-D) flag.
+texinode(Option Flags)(Alternative Completion)(Command Flags)(Programmable Completion)
+sect(Option Flags)
+startlist()
+list([ tt(-fcFBdeaRGovNAIOPZEnbjrzu/) ])
+list([ tt(-k) var(array) ] [ tt(-g) var(globstring) ] \
+  [ tt(-s) var(subststring) ])
+list([ tt(-K) var(function) ] [ tt(-H) var(num pattern) ])
+list([ tt(-Q) ] [ tt(-P) var(prefix) ] [ tt(-S) var(suffix) ])
+list([ tt(-W) var(file-prefix) ])
+list([ tt(-q) ] [ tt(-X) var(explanation) ] [ tt(-Y) var(explanation) ])
+list([ tt(-y) var(func-or-var) ] [ tt(-l) var(cmd) ] [ tt(-U) ])
+endlist()
+
+The remaining var(options) specify the type of command arguments
+to look for during completion.  Any combination of these flags may be
+specified; the result is a sorted list of all the possibilities.  The
+options are as follows.
+startmenu()
+menu(Simple Flags)
+menu(Flags with Arguments)
+menu(Control Flags)
+endmenu()
+texinode(Simple Flags)(Flags with Arguments)()(Option Flags)
+subsect(Simple Flags)
+These produce completion lists made up by the shell itself:
+
+startitem()
+item(tt(-f))(
+Filenames and filesystem paths.
+)
+item(tt(-/))(
+Just filesystem paths.
+)
+item(tt(-c))(
+Command names, including aliases, shell functions, builtins
+and reserved words.
+)
+item(tt(-F))(
+Function names.
+)
+item(tt(-B))(
+Names of builtin commands.
+)
+item(tt(-m))(
+Names of external commands.
+)
+item(tt(-w))(
+Reserved words.
+)
+item(tt(-a))(
+Alias names.
+)
+item(tt(-R))(
+Names of regular (non-global) aliases.
+)
+item(tt(-G))(
+Names of global aliases.
+)
+item(tt(-d))(
+This can be combined with tt(-F), tt(-B), tt(-w),
+tt(-a), tt(-R) and tt(-G) to get names of disabled
+functions, builtins, reserved words or aliases.
+)
+item(tt(-e))(
+This option (to show enabled commands) is in effect by default, but
+may be combined with tt(-d); tt(-de) in combination with
+tt(-F), tt(-B), tt(-w), tt(-a), tt(-R) and tt(-G)
+will complete names of functions, builtins, reserved words or aliases
+whether or not they are disabled.
+)
+item(tt(-o))(
+Names of shell options (see
+ifzman(zmanref(zshoptions))\
+ifnzman(noderef(Options))\
+).
+)
+item(tt(-v))(
+Names of any variable defined in the shell.
+)
+item(tt(-N))(
+Names of scalar (non-array) parameters.
+)
+item(tt(-A))(
+Array names.
+)
+item(tt(-I))(
+Names of integer variables.
+)
+item(tt(-O))(
+Names of read-only variables.
+)
+item(tt(-p))(
+Names of parameters used by the shell (including special parameters).
+)
+item(tt(-Z))(
+Names of shell special parameters.
+)
+item(tt(-E))(
+Names of environment variables.
+)
+item(tt(-n))(
+Named directories.
+)
+item(tt(-b))(
+Key binding names.
+)
+item(tt(-j))(
+Job names:  the first word of the job leader's command line.  This is useful
+with the tt(kill) builtin.
+)
+item(tt(-r))(
+Names of running jobs.
+)
+item(tt(-z))(
+Names of suspended jobs.
+)
+item(tt(-u))(
+User names.
+)
+enditem()
+texinode(Flags with Arguments)(Control Flags)(Simple Flags)(Option Flags)
+subsect(Flags with Arguments)
+These have user supplied arguments to determine how the list of
+completions is to be made up:
+
+startitem()
+item(tt(-k) var(array))(
+Names taken from the elements of tt($)var(array) (note that the `tt($)'
+does not appear on the command line).
+Alternatively, the argument var(array) itself may be a set
+of space- or comma-separated values in parentheses, in which any
+delimiter may be escaped with a backslash; in this case the argument
+should be quoted.  For example,
+
+nofill(tt(compctl -k "(cputime filesize datasize stacksize
+    coredumpsize resident descriptors)" limit))
+)
+item(tt(-g) var(globstring))(
+The var(globstring) is expanded using filename globbing; it should be
+quoted to protect it from immediate expansion. The resulting
+filenames are taken as the possible completions.  Use `tt(*(/))' instead of
+`tt(*/)' for directories.  The tt(fignore) special parameter is not
+applied to the resulting files.  More than one pattern may be given
+separated by blanks. (Note that brace expansion is em(not) part of
+globbing.  Use the syntax `tt((either|or))' to match alternatives.)
+)
+item(tt(-s) var(subststring))(
+The var(subststring) is split into words and these words are than
+expanded using all shell expansion mechanisms (see
+ifzman(zmanref(zshexpn))\
+ifnzman(noderef(Expansion))\
+).  The resulting words are taken as possible
+completions.  The tt(fignore) special parameter is not applied to the
+resulting files.  Note that tt(-g) is faster for filenames.
+)
+item(tt(-K) var(function))(
+Call the given function to get the completions.  The function is
+passed two arguments: the prefix and the suffix of the word on which
+completion is to be attempted, in other words those characters before
+the cursor position, and those from the cursor position onwards.  The
+whole command line can be accessed with the tt(-c) and tt(-l) flags
+of the tt(read) builtin.  The
+function should set the variable tt(reply) to an array containing
+the completions (one completion per element); note that tt(reply)
+should not be made local to the function.  From such a function the
+command line can be accessed with the tt(-c) and tt(-l) flags to
+the tt(read) builtin.  For example,
+
+nofill(tt(function whoson { reply=(`users`); }
+compctl -K whoson talk))
+
+completes only logged-on users after `tt(talk)'.  Note that `tt(whoson)' must
+return an array, so `tt(reply=`users`)' would be incorrect.
+)
+item(tt(-H) var(num pattern))(
+The possible completions are taken from the last var(num) history
+lines.  Only words matching var(pattern) are taken.  If var(num) is
+zero or negative the whole history is searched and if var(pattern) is
+the empty string all words are taken (as with `tt(*)').  A typical
+use is
+
+nofill(tt(compctl -D -f PLUS() -H 0 ''))
+
+which forces completion to look back in the history list for a word if
+no filename matches.
+)
+enditem()
+texinode(Control Flags)()(Flags with Arguments)(Option Flags)
+subsect(Control Flags)
+These do not directly specify types of name to be completed, but
+manipulate the options that do:
+
+startitem()
+item(tt(-Q))(
+This instructs the shell not to quote any metacharacters in the possible
+completions.  Normally the results of a completion are inserted into
+the command line with any metacharacters quoted so that they are
+interpreted as normal characters.  This is appropriate for filenames
+and ordinary strings.  However, for special effects, such as inserting
+a backquoted expression from a completion array (tt(-k)) so that
+the expression will not be evaluated until the complete line is
+executed, this option must be used.
+)
+item(tt(-P) var(prefix))(
+The var(prefix) is inserted just before the completed string; any
+initial part already typed will be completed and the whole var(prefix)
+ignored for completion purposes.  For example,
+
+nofill(tt(compctl -j -P "%" kill))
+
+inserts a `%' after the kill command and then completes job names.
+)
+item(tt(-S) var(suffix))(
+When a completion is found the var(suffix) is inserted after
+the completed string.  In the case of menu completion the suffix is
+inserted immediately, but it is still possible to cycle through the
+list of completions by repeatedly hitting the same key.
+)
+item(tt(-W) var(file-prefix))(
+With directory var(file-prefix):  for command, file, directory and
+globbing completion (options tt(-c), tt(-f), tt(-/), tt(-g)), the file
+prefix is implicitly added in front of the completion.  For example,
+
+nofill(tt(compctl -/ -W ~/Mail maildirs))
+
+completes any subdirectories to any depth beneath the directory
+tt(~/Mail), although that prefix does not appear on the command line.
+)
+item(tt(-q))(
+If used with a suffix as specified by the tt(-S) option, this
+causes the suffix to be removed if the next character typed is a blank
+or does not insert anything (the same rule as used for the
+tt(AUTO_REMOVE_SLASH) option).  The option is most useful for list
+separators (comma, colon, etc.).
+)
+item(tt(-l) var(cmd))(
+This option cannot be combined with any other.  It restricts the range
+of command line words that are considered to be arguments.  If
+combined with one of the extended completion patterns `tt(p[)...tt(])',
+`tt(r[)...tt(])', or `tt(R[)...tt(])'  (see noderef(Extended Completion)
+below) the range is restricted to the range of arguments
+specified in the brackets.  Completion is then performed as if these
+had been given as arguments to the var(cmd) supplied with the
+option. If the var(cmd) string is empty the first word in the range
+is instead taken as the command name, and command name completion
+performed on the first word in the range.  For example,
+
+nofill(tt(compctl -x 'r[-exec,;]' -l '' -- find))
+
+completes arguments between `tt(-exec)' and the following `tt(;)' (or the end
+of the command line if there is no such string) as if they were
+a separate command line.
+)
+item(tt(-U))(
+Use the whole list of possible completions, whether or not they
+actually match the word on the command line.  The word typed so far
+will be deleted.  This is most useful with a function (given by the
+tt(-K) option) which can examine the word components passed to it
+(or via the tt(read) builtin's tt(-c) and tt(-l) flags) and
+use its own criteria to decide what matches.  If there is no
+completion, the original word is retained.
+)
+item(tt(-y) var(func-or-var))(
+The list provided by var(func-or-var) is displayed instead of the list
+of completions whenever a listing is required; the actual completions
+to be inserted are not affected.  It can be provided in two
+ways. Firstly, if var(func-or-var) begins with a tt($) it defines a
+variable, or if it begins with a left parenthesis a literal
+array, which contains the list.  A variable may have been set by a
+call to a function using the tt(-K) option.  Otherwise it contains the
+name of a function which will be executed to create the list.  The
+function will be passed as an argument list all matching completions,
+including prefixes and suffixes expanded in full, and should set the
+array var(reply) to the result.  In both cases, the display list will
+only be retrieved after a complete list of matches has been created.
+
+Note that the returned list does not have to correspond, even in
+length, to the original set of matches, and may be passed as a scalar
+instead of an array.  No special formatting of characters is
+performed on the output in this case; in particular, newlines are
+printed literally and if they appear output in columns is suppressed.
+)
+item(tt(-X) var(explanation))(
+Print var(explanation) when trying completion on the current set of
+options. A `tt(%n)' in this string is replaced by the number of matches.
+The explanation only appears if completion was tried and there was
+no unique match, or when listing completions.
+)
+item(tt(-Y) var(explanation))(
+Identical to tt(-X), except that the var(explanation) first undergoes
+expansion following the usual rules for strings in double quotes.
+The expansion will be carried out after any functions are called for
+the tt(-K) or tt(-y) options, allowing them to set variables.
+)
+enditem()
+texinode(Alternative Completion)(Extended Completion)(Option Flags)(Programmable Completion)
+sect(Alternative Completion)
+startlist()
+list(tt(compctl) [ tt(-CDT) ] var(options) tt(PLUS()) var(options) [ tt(PLUS()) ... ] \
+[ tt(PLUS()) ] var(command) ...)
+endlist()
+
+The form with `tt(PLUS())' specifies alternative options. Completion is
+tried with the options before the first `tt(PLUS())'. If this produces no
+matches completion is tried with the flags after the `tt(PLUS())' and so on. If
+there are no flags after the last `tt(PLUS())' and a match has not been found
+up to that point, default completion is tried.
+texinode(Extended Completion)(Example)(Alternative Completion)(Programmable Completion)
+sect(Extended Completion)
+startlist()
+list(tt(compctl) [ tt(-CDT) ] var(options) \
+tt(-x) var(pattern) var(options) tt(-) ... tt(--) \
+[ var(command) ... ])
+list(tt(compctl) [ tt(-CDT) ] var(options) \
+[ tt(-x) var(pattern) var(options) tt(-) ... tt(--) ] \
+[ tt(PLUS()) var(options) [ tt(-x) ... tt(--) ] ... [tt(PLUS())] ] \
+[ var(command) ... ])
+endlist()
+
+The form with `tt(-x)' specifies extended completion for the
+commands given; as shown, it may be combined with alternative
+completion using `tt(PLUS())'.  Each var(pattern) is examined in turn; when a
+match is found, the corresponding var(options), as described in
+noderef(Option Flags) above, are used to generate possible
+completions.  If no var(pattern) matches, the var(options) given
+before the tt(-x) are used.
+
+Note that each pattern should be supplied as a single argument and
+should be quoted to prevent expansion of metacharacters by the
+shell.
+
+A var(pattern) is built of sub-patterns separated by commas; it
+matches if at least one of these sub-patterns matches (they are
+`or'ed). These sub-patterns are in turn composed of other
+sub-patterns separated by white spaces which match if all of the
+sub-patterns match (they are `and'ed).  An element of the
+sub-patterns is of the form `var(c)tt([)...tt(][)...tt(])', where the pairs of
+brackets may be repeated as often as necessary, and matches if any of
+the sets of brackets match (an `or').  The example below makes this
+clearer.
+
+The elements may be any of the following:
+
+startitem()
+item(tt(s[)var(string)tt(])...)(
+Matches if the current word on the command line starts with
+one of the strings given in brackets.  The var(string) is not removed
+and is not part of the completion.
+)
+item(tt(S[)var(string)tt(])...)(
+Like tt(s[)var(string)tt(]) except that the var(string) is part of the
+completion.
+)
+item(tt(p[)var(from)tt(,)var(to)tt(])...)(
+Matches if the number of the current word is between one of
+the var(from) and var(to) pairs inclusive. The comma and var(to)
+are optional; var(to) defaults to the same value as var(from).  The
+numbers may be negative: tt(-)var(n) refers to the var(n)'th last word
+on the line.
+)
+item(tt(c[)var(offset)tt(,)var(string)tt(])...)(
+Matches if the var(string) matches the word offset by
+var(offset) from the current word position.  Usually var(offset)
+will be negative.
+)
+item(tt(C[)var(offset)tt(,)var(pattern)tt(])...)(
+Like tt(c) but using pattern matching instead.
+)
+item(tt(w[)var(index)tt(,)var(string)tt(])...)(
+Matches if the word in position var(index) is equal
+to the corresponding var(string).  Note that the word count is made
+after any alias expansion.
+)
+item(tt(W[)var(index)tt(,)var(pattern)tt(])...)(
+Like tt(w) but using pattern matching instead.
+)
+item(tt(n[)var(index)tt(,)var(string)tt(])...)(
+Matches if the current word contains var(string).  Anything up to and
+including the var(index)th occurrence of this string will not be
+considered part of the completion, but the rest will.  var(index) may
+be negative to count from the end: in most cases, var(index) will be
+1 or -1.  For example,
+
+nofill(tt(compctl -s '`users`' -x 'n[1,@]' -k hosts -- talk))
+
+will usually complete usernames, but if you insert an tt(@) after the
+name, names from the array var(hosts) (assumed to contain hostnames,
+though you must make the array yourself) will be completed.  Other
+commands such as tt(rcp) can be handled similarly.
+)
+item(tt(N[)var(index)tt(,)var(string)tt(])...)(
+Like tt(n) except that the string will be
+taken as a character class.  Anything up to and including the
+var(index)th occurrence of any of the characters in var(string)
+will not be considered part of the completion.
+)
+item(tt(m[)var(min)tt(,)var(max)tt(])...)(
+Matches if the total number of words lies between var(min) and
+var(max) inclusive.
+)
+item(tt(r[)var(str1)tt(,)var(str2)tt(])...)(
+Matches if the cursor is after a word with prefix var(str1).  If there
+is also a word with prefix var(str2) on the command line it matches
+only if the cursor is before this word.
+)
+item(tt(R[)var(str1)tt(,)var(str2)tt(])...)(
+Like tt(r) but using pattern matching instead.
+)
+enditem()
+texinode(Example)()(Extended Completion)(Programmable Completion)
+sect(Example)
+nofill(tt(compctl -u -x 's[tt(PLUS())] c[-1,-f],s[-f+PLUS()]' -g '~/Mail/*(:t)' \ 
+    - 's[-f],c[-1,-f]' -f -- mail))
+
+This is to be interpreted as follows:
+
+If the current command is tt(mail), then
+
+indent(
+if ((the current word begins with tt(PLUS()) and the previous word is tt(-f))
+or (the current word begins with tt(-f+PLUS()))), then complete the
+non-directory part (the `tt(:t)' glob modifier) of files in the directory
+tt(~/Mail); else
+
+if the current word begins with tt(-f) or the previous word was tt(-f), then
+complete any file; else
+
+complete user names.
+)
diff --git a/Doc/Zsh/cond.yo b/Doc/Zsh/cond.yo
new file mode 100644
index 000000000..0ff49b187
--- /dev/null
+++ b/Doc/Zsh/cond.yo
@@ -0,0 +1,158 @@
+texinode(Conditional Expressions)(Compatibility)(Arithmetic Evaluation)(Top)
+chapter(Conditional Expressions)
+ifzman(\
+sect(Conditional Expressions)
+)\
+cindex(conditional expressions)
+cindex(expressions, conditional)
+A em(conditional expression) is used with the tt([[)
+compound command to test attributes of files and to compare strings.
+Each expression can be constructed from one or more
+of the following unary or binary expressions:
+
+startitem()
+item(tt(-a) var(file))(
+true if var(file) exists.
+)
+item(tt(-b) var(file))(
+true if var(file) exists and is a block special file.
+)
+item(tt(-c) var(file))(
+true if var(file) exists and is a character special file.
+)
+item(tt(-d) var(file))(
+true if var(file) exists and is a directory.
+)
+item(tt(-e) var(file))(
+true if var(file) exists.
+)
+item(tt(-f) var(file))(
+true if var(file) exists and is a regular file.
+)
+item(tt(-g) var(file))(
+true if var(file) exists and has its setgid bit set.
+)
+item(tt(-h) var(file))(
+true if var(file) exists and is a symbolic link.
+)
+item(tt(-k) var(file))(
+true if var(file) exists and has its sticky bit set.
+)
+item(tt(-n) var(string))(
+true if length of var(string) is non-zero.
+)
+item(tt(-o) var(option))(
+true if option named var(option) is on.  var(option)
+may be a single character, in which case it is a single letter option name.
+(See noderef(Specifying Options).)
+)
+item(tt(-p) var(file))(
+true if var(file) exists and is a FIFO special file (named pipe).
+)
+item(tt(-r) var(file))(
+true if var(file) exists and is readable by current process.
+)
+item(tt(-s) var(file))(
+true if var(file) exists and has size greater than zero.
+)
+item(tt(-t) var(fd))(
+true if file descriptor number var(fd)
+is open and associated with a terminal device.
+(note: var(fd) is not optional)
+)
+item(tt(-u) var(file))(
+true if var(file) exists and has its setuid bit set.
+)
+item(tt(-w) var(file))(
+true if var(file) exists and is writable by current process.
+)
+item(tt(-x) var(file))(
+true if var(file) exists and is executable by current process.
+If var(file) exists and is a directory, then the current process
+has permission to search in the directory.
+)
+item(tt(-z) var(string))(
+true if length of var(string) is zero.
+)
+item(tt(-L) var(file))(
+true if var(file) exists and is a symbolic link.
+)
+item(tt(-O) var(file))(
+true if var(file) exists and is owned by the effective user ID of this process.
+)
+item(tt(-G) var(file))(
+true if var(file) exists and its group matches
+the effective group ID of this process.
+)
+item(tt(-S) var(file))(
+true if var(file) exists and is a socket.
+)
+item(tt(-N) var(file))(
+true if var(file) exists and its access time is
+not newer than its modification time.
+)
+item(var(file1) tt(-nt) var(file2))(
+true if var(file1) exists and is newer than var(file2).
+)
+item(var(file1) tt(-ot) var(file2))(
+true if var(file1) exists and is older than var(file2).
+)
+item(var(file1) tt(-ef) var(file2))(
+true if var(file1) and var(file2) exist and refer to the same file.
+)
+xitem(var(string) tt(=) var(pattern))
+item(var(string) tt(==) var(pattern))(
+true if var(string) matches var(pattern).
+The `tt(==)' form is the preferred one.  The `tt(=)' form is for
+backward compatibility and should be considered obsolete.
+)
+item(var(string) tt(!=) var(pattern))(
+true if var(string) does not match var(pattern).
+)
+item(var(string1) tt(<) var(string2))(
+true if var(string1) comes before var(string2)
+based on ASCII value of their characters.
+)
+item(var(string1) tt(>) var(string2))(
+true if var(string1) comes after var(string2)
+based on ASCII value of their characters.
+)
+item(var(exp1) tt(-eq) var(exp2))(
+true if var(exp1) is numerically equal to var(exp2).
+)
+item(var(exp1) tt(-ne) var(exp2))(
+true if var(exp1) is numerically not equal to var(exp2).
+)
+item(var(exp1) tt(-lt) var(exp2))(
+true if var(exp1) is numerically less than var(exp2).
+)
+item(var(exp1) tt(-gt) var(exp2))(
+true if var(exp1) is numerically greater than var(exp2).
+)
+item(var(exp1) tt(-le) var(exp2))(
+true if var(exp1) is numerically less than or equal to var(exp2).
+)
+item(var(exp1) tt(-ge) var(exp2))(
+true if var(exp1) is numerically greater than or equal to var(exp2).
+)
+item(tt(LPAR()) var(exp) tt(RPAR()))(
+true if var(exp) is true.
+)
+item(tt(!) var(exp))(
+true if var(exp) is false.
+)
+item(var(exp1) tt(&&) var(exp2))(
+true if var(exp1) and var(exp2) are both true.
+)
+item(var(exp1) tt(||) var(exp2))(
+true if either var(exp1) or var(exp2) is true.
+)
+enditem()
+
+In each of the above expressions, if
+var(file) is of the form `tt(/dev/fd/)var(n)',
+where var(n) is an integer,
+then the test applied to the open file whose
+descriptor number is var(n),
+even if the underlying system does not support
+the tt(/dev/fd) directory.
diff --git a/Doc/Zsh/exec.yo b/Doc/Zsh/exec.yo
new file mode 100644
index 000000000..0d53b14b8
--- /dev/null
+++ b/Doc/Zsh/exec.yo
@@ -0,0 +1,25 @@
+texinode(Command Execution)(Functions)(Redirection)(Top)
+chapter(Command Execution)
+ifzman(\
+sect(Command Execution)
+)\
+cindex(command execution)
+cindex(execution, of commands)
+If a command name contains no slashes, the shell attempts to locate
+it.  If there exists a shell function by that name, the function
+is invoked as described in noderef(Functions).  If there exists
+a shell builtin by that name, the builtin is invoked.
+
+vindex(path, use of)
+Otherwise, the shell searches each element of tt($path) for a
+directory containing an executable file by that name.  If the
+search is unsuccessful, the shell prints an error message and returns
+a nonzero exit status.
+
+If execution fails because the file is not in executable format,
+and the file is not a directory, it is assumed to be a shell
+script.  tt(/bin/sh) is spawned to execute it.  If the program
+is a file beginning with `tt(#!)', the remainder of the first line
+specifies an interpreter for the program.  The shell will
+execute the specified interpreter on operating systems that do
+not handle this executable format in the kernel.
diff --git a/Doc/Zsh/expn.yo b/Doc/Zsh/expn.yo
new file mode 100644
index 000000000..99844b42a
--- /dev/null
+++ b/Doc/Zsh/expn.yo
@@ -0,0 +1,1052 @@
+texinode(Expansion)(Parameters)(Restricted Shell)(Top)
+chapter(Expansion)
+cindex(expansion)
+sect(Description)
+The types of expansions performed are
+
+startlist()
+list(em(history expansion))
+list(em(alias expansion))
+list(em(process substitution))
+list(em(parameter expansion))
+list(em(command substitution))
+list(em(arithmetic expansion))
+list(em(brace expansion))
+list(em(filename expansion))
+list(em(filename generation))
+endlist()
+
+Expansion is done in the above specified order in five steps.  The
+first is em(history expansion), which is only performed in
+interactive shells.  The next step is em(alias expansion), which is
+done right before the command line is parsed.  They are followed by
+em(process substitution), em(parameter expansion), em(command
+substitution), em(arithmetic expansion) and em(brace expansion)
+which are performed in one step in left-to-right fashion.  After
+these expansions, all unquoted occurrences of the characters `tt(\)',
+`tt(')' and `tt(")' are removed, and the result is subjected to
+em(filename expansion) followed by em(filename generation).
+
+If the tt(SH_FILE_EXPANSION) option is set, the order of expansion is modified
+for compatibility with bf(sh) and bf(ksh).  em(Filename expansion)
+is performed immediately after em(alias substitution),
+preceding the set of five substitutions mentioned above.
+startmenu()
+menu(History Expansion)
+menu(Process Substitution)
+menu(Parameter Expansion)
+menu(Command Substitution)
+menu(Arithmetic Expansion)
+menu(Brace Expansion)
+menu(Filename Expansion)
+menu(Filename Generation)
+endmenu()
+texinode(History Expansion)(Process Substitution)()(Expansion)
+sect(History Expansion)
+cindex(history)
+cindex(history expansion)
+cindex(expansion, history)
+History expansion allows you to use words from previous command
+lines in the command line you are typing.  This simplifies spelling
+corrections and the repetition of complicated commands or arguments.
+Command lines are saved in the history list, the size of which
+is controlled by the tt(HISTSIZE)
+vindex(HISTSIZE, use of)
+variable.  The most recent command is retained in any case.
+A history expansion begins with the first character of the
+tt(histchars) parameter which is `tt(!)'
+by default and may occur anywhere on the command line; history
+expansions do not nest.  The `tt(!)' can be escaped with `tt(\)'
+or can be enclosed between a pair of single quotes (tt('')) to suppress
+its special meaning. Double quotes will em(not) work for this.
+
+Input lines containing history expansions are echoed on the
+terminal after being expanded, but before any other
+expansions take place or the command gets executed.
+startmenu()
+menu(Event Designators)
+menu(Word Designators)
+menu(Modifiers)
+endmenu()
+texinode(Event Designators)(Word Designators)()(History Expansion)
+subsect(Event Designators)
+cindex(history event designators)
+cindex(event designators, history)
+An event designator is a reference to a command-line entry in
+the history list.
+
+startitem()
+item(tt(!))(
+Start a history expansion, except when followed by a blank, newline,
+`tt(=)' or `tt(LPAR())'.
+)
+item(tt(!!))(
+Refer to the previous command.
+By itself, this expansion
+repeats the previous command.
+)
+item(tt(!)var(n))(
+Refer to command-line var(n).
+)
+item(tt(!-)var(n))(
+Refer to the current command-line minus var(n).
+)
+item(tt(!)var(str))(
+Refer to the most recent command starting with var(str).
+)
+item(tt(!?)var(str)[tt(?)])(
+Refer to the most recent command containing var(str).
+)
+item(tt(!#))(
+Refer to the current command line typed in so far.  The line is
+treated as if it were complete up to and including the word before the
+one with the `tt(!#)' reference.
+)
+item(tt(!{)...tt(}))(
+Insulate a history reference from adjacent characters (if necessary).
+)
+enditem()
+texinode(Word Designators)(Modifiers)(Event Designators)(History Expansion)
+subsect(Word Designators)
+cindex(history word designators)
+cindex(word designators, history)
+A word designator indicates which word or words of a given command line will
+be included in a history reference.  A `tt(:)'
+separates the event specification from the word designator.
+It can be omitted if the word designator begins with a
+`tt(^)', `tt($)', `tt(*)', `tt(-)' or `tt(%)'.
+Word designators include:
+
+startsitem()
+sitem(tt(0))(The first input word (command).)
+sitem(var(n))(The var(n)th argument.)
+sitem(tt(^))(The first argument.  That is, tt(1).)
+sitem(tt($))(The last argument.)
+sitem(tt(%))(The word matched by (the most recent) tt(?)var(str) search.)
+sitem(var(x)tt(-)var(y))(A range of words; var(x) defaults to tt(0).)
+sitem(tt(*))(All the arguments, or a null value if there are none.)
+sitem(var(x)tt(*))(Abbreviates `var(x)tt(-$)'.)
+sitem(var(x)tt(-))(Like `var(x)tt(*)' but omitting word tt($).)
+endsitem()
+
+Note that a `tt(%)' word designator will only work when used as
+`tt(!%)', `tt(!:%)' or `tt(!?)var(str)tt(?:%)',
+and only when used after a tt(!?) expansion.  Anything else will result
+in an error, although the error may not be the most obvious one.
+texinode(Modifiers)()(Word Designators)(History Expansion)
+subsect(Modifiers)
+cindex(modifiers, history)
+cindex(history modifiers)
+After the optional word designator, you can add
+a sequence of one or more of the following modifiers,
+each preceded by a `tt(:)'.  These modifiers also work on the result
+of em(filename generation) and em(parameter expansion), except where
+noted.
+
+startitem()
+item(tt(h))(
+Remove a trailing pathname component, leaving the head.
+)
+item(tt(r))(
+Remove a trailing suffix of the form `tt(.)var(xxx)', leaving the basename.
+)
+item(tt(e))(
+Remove all but the suffix.
+)
+item(tt(t))(
+Remove all leading pathname components, leaving the tail.
+)
+item(tt(p))(
+Print the new command but do not execute it.  Only works with history
+expansion.
+)
+item(tt(q))(
+Quote the substituted words, escaping further substitutions.  Only
+works with history expansion.
+)
+item(tt(x))(
+Like tt(q), but break into words at each blank.
+)
+item(tt(l))(
+Convert the words to all lowercase.
+)
+item(tt(u))(
+Convert the words to all uppercase.
+)
+item(tt(f))(
+(This and the following
+tt(F), tt(w) and tt(W) modifier only work with parameter and
+filename expansion.)
+Repeats the immediately (without a colon) following modifier until the
+resulting word doesn't change any more.
+)
+item(tt(F:)var(expr)tt(:))(
+Like tt(f), but repeats only var(n) times if the expression
+var(expr) evaluates to var(n).  Any character can be used instead of
+the `tt(:)', if any of `tt(LPAR())', `tt([)', or `tt({)'
+is used as the opening delimiter
+the second one has to be 'tt(RPAR())', `tt(])', or `tt(})' respectively.
+)
+item(tt(w))(
+Makes the immediately following modifier work on each word in the
+string.
+)
+item(tt(W:)var(sep)tt(:))(
+Like tt(w) but words are considered to be the parts of the string
+that are separated by var(sep). Any character can be used instead of
+the `tt(:)'; opening parentheses are handled specially, see above.
+)
+item(tt(s/)var(l)tt(/)var(r)[tt(/)])(
+Substitute var(r) for var(l) as described below.
+Unless preceded immediately by a tt(g), with no colon between,
+the substitution is done only for the
+first string that matches var(l).  For arrays and filename
+expansion, this applies to each word of the expanded text.
+)
+item(tt(&))(
+Repeat the previous tt(s) substitution.  Like tt(s), may be preceded
+immediately by a tt(g).  In variable expansion the tt(&) must appear
+inside braces, and in filename expansion it must be quoted with a
+backslash.
+)
+enditem()
+
+The tt(s/l/r/) substitution works as follows.  The left-hand side of
+substitutions are not regular expressions, but character strings.  Any
+character can be used as the delimiter in place of `tt(/)'.  A
+backslash quotes the delimiter character.  The character `tt(&)', in
+the right-hand-side var(r), is replaced by the text from the
+left-hand-side var(l).  The `tt(&)' can be quoted with a backslash.  A
+null var(l) uses the previous string either from the previous var(l)
+or from the contextual scan string var(s) from `tt(!?)var(s)'.  You can
+omit the rightmost delimiter if a newline immediately follows var(r);
+the rightmost `tt(?)' in a context scan can similarly be omitted.
+Note the same record of the last var(l) and var(r) is maintained
+across all forms of expansion.
+
+By default, a history reference with no event specification refers to the same
+line as the last history reference on that command line, unless it is the
+first history reference in a command.  In that case, a history reference
+with no event specification always refers to the previous command.  However,
+if the option tt(CSH_JUNKIE_HISTORY) is set,
+pindex(CSH_JUNKIE_HISTORY, use of)
+then history reference with no
+event specification will em(always) refer to the previous command.
+
+For example, `tt(!!:1)'
+will always refer to the first word of the previous command, and `tt(!!$)'
+will always refer to the last word of the previous command.  And with
+tt(CSH_JUNKIE_HISTORY) set, then `tt(!:1)' and `tt(!$)'
+will function in the same manner as `tt(!!:1)' and `tt(!!$)',
+respectively.  However, if tt(CSH_JUNKIE_HISTORY) is unset, then
+`tt(!:1)' and `tt(!$)'
+will refer to the first and last words respectively, of the last command
+referenced on the current command line.  However, if they are the first history
+reference on the command line, then they refer to the previous command.
+
+The character sequence `tt(^)var(foo)tt(^)var(bar)'
+repeats the last command, replacing the string var(foo) with var(bar).
+
+If the shell encounters the character sequence `tt(!")'
+in the input, the history mechanism is temporarily disabled until
+the current list is fully parsed.  The `tt(!")'
+is removed from the input, and any subsequent `tt(!)'
+characters have no special significance.
+
+A less convenient but more comprehensible
+form of command history support
+is provided by the tt(fc) builtin.
+findex(fc, use of)
+texinode(Process Substitution)(Parameter Expansion)(History Expansion)(Expansion)
+sect(Process Substitution)
+cindex(process substitution)
+cindex(substitution, process)
+Each command argument of the form
+`tt(<LPAR())var(list)tt(RPAR())',
+`tt(>LPAR())var(list)tt(RPAR())' or
+`tt(=LPAR())var(list)tt(RPAR())'
+is subject to process substitution.
+In the case of the tt(<) or tt(>) forms, the shell will run process
+var(list) asynchronously, connected to a named pipe (FIFO).
+The name of this pipe will become the argument to the command.
+If the form with tt(>)
+is selected then writing on this file will provide input for var(list).
+If tt(<) is used, then the file passed as an argument will
+be a named pipe connected to the output of the var(list) process.
+For example,
+
+nofill(tt(paste <LPAR()cut -f1) var(file1)tt(RPAR() <LPAR()cut -f3) var(file2)tt(RPAR() | tee >LPAR())var(process1)tt(RPAR() >LPAR())var(process2)tt(RPAR() >/dev/null))
+
+cuts fields 1 and 3 from the files var(file1) and var(file2) respectively,
+pastes the results together, and sends it to the processes
+var(process1) and var(process2).
+Note that the file, which is passed as an argument to the command,
+is a system pipe, so programs that expect to lseek (see manref(lseek)(2))
+on the file will not work.
+Also note that the previous example can be more compactly and
+efficiently written as:
+
+nofill(tt(paste <LPAR()cut -f1) var(file1)tt(RPAR() <LPAR()cut -f3) var(file2)tt(RPAR() > >LPAR())var(process1)tt(RPAR() > >LPAR())var(process2)tt(RPAR()))
+
+The shell uses pipes instead of FIFOs to implement the latter
+two process substitutions in the above example.
+
+If tt(=) is used,
+then the file passed as an argument will be the name
+of a temporary file containing the output of the var(list)
+process.  This may be used instead of the tt(<)
+form for a program that expects to lseek (see manref(lseek)(2))
+on the input file.
+texinode(Parameter Expansion)(Command Substitution)(Process Substitution)(Expansion)
+sect(Parameter Expansion)
+cindex(parameter expansion)
+cindex(expansion, parameter)
+The character `tt($)' is used to introduce parameter expansions.
+See
+ifzman(\
+zmanref(zshparam)
+)\
+ifnzman(\
+noderef(Parameters)
+)\
+for a description of parameters.
+In the expansions discussed below that require a pattern, the form of
+the pattern is the same as that used for filename generation;
+see noderef(Filename Generation).  In addition to the following
+operations, the file modifiers described in
+noderef(Modifiers) in noderef(History Expansion) can be
+applied:  for example, tt(${i:s/foo/bar/}) performs string
+substitution on the value of parameter tt($i).
+
+startitem()
+item(tt(${)var(name)tt(}))(
+The value, if any, of the parameter var(name) is substituted.
+The braces are required if var(name) is followed by
+a letter, digit, or underscore that is not to be interpreted
+as part of its name.
+
+If var(name) is an array parameter, then the values of each
+element of var(name) is substituted, one element per word.
+Otherwise, the expansion results in one word only; no field
+splitting is done on the result unless the tt(SH_WORD_SPLIT)
+option is set.
+)
+item(tt(${PLUS())var(name)tt(}))(
+If var(name) is the name of a set parameter `tt(1)' is substituted,
+otherwise `tt(0)' is substituted.
+)
+item(tt(${)var(name)tt(:-)var(word)tt(}))(
+If var(name) is set and is non-null then substitute its
+value; otherwise substitute var(word). If var(name) is
+missing, substitute var(word).
+)
+item(tt(${)var(name)tt(:=)var(word)tt(}))(
+If var(name) is unset or is null then
+set it to var(word); the value of the parameter is then
+substituted.
+)
+item(tt(${)var(name)tt(:?)var(word)tt(}))(
+If var(name) is set and is non-null, then substitute
+its value; otherwise, print var(word) and exit from the shell.
+If var(word) is omitted, then a standard message is printed.
+)
+item(tt(${)var(name)tt(:PLUS())var(word)tt(}))(
+If var(name) is set and is non-null then substitute
+var(word); otherwise substitute nothing.
+)
+enditem()
+
+If the colon is omitted from one of the above expressions
+containing a colon, then the shell only checks whether
+var(name) is set or not, not whether it is null.
+
+startitem()
+item(tt(${)var(name)tt(::=)var(word)tt(}))(
+Set var(name) to var(word); the value of the parameter is then
+substituted.
+)
+xitem(tt(${)var(name)tt(#)var(pattern)tt(}))
+item(tt(${)var(name)tt(##)var(pattern)tt(}))(
+If the var(pattern) matches the beginning of the value of
+var(name), then substitute the value of var(name) with
+the matched portion deleted; otherwise, just
+substitute the value of var(name).  In the first
+form, the smallest matching pattern is preferred;
+in the second form, the largest matching pattern is
+preferred. If var(name) is an array and the substitution
+is not quoted or the tt((@)) flag or the `var(name)tt([@])' syntax
+is used, matching is performed on each array elements separately.
+)
+xitem(tt(${)var(name)tt(%)var(pattern)tt(}))
+item(tt(${)var(name)tt(%%)var(pattern)tt(}))(
+If the var(pattern) matches the end of the value of
+var(name), then substitute the value of var(name) with
+the matched portion deleted; otherwise, just
+substitute the value of var(name).  In the first
+form, the smallest matching pattern is preferred;
+in the second form, the largest matching pattern is
+preferred. If var(name) is an array and the substitution
+is not quoted or the tt((@)) flag or the `var(name)tt([@])' syntax
+is used, matching is performed on each array elements separately.
+)
+item(tt(${)var(name)tt(:#)var(pattern)tt(}))(
+If the var(pattern) matches the value of var(name), then substitute
+the empty string; otherwise, just substitute the value of var(name).
+If var(name) is an array and the substitution
+is not quoted or the tt((@)) flag or the `var(name)tt([@])' syntax
+is used, matching is performed on each array elements separately, and
+the matched array elements are removed (use the tt((M)) flag to
+remove the non-matched elements).
+)
+item(tt(${#)var(spec)tt(}))(
+If var(spec) is one of the above substitutions, substitute
+the length in characters of the result instead of
+the result itself.  If var(spec) is an array expression,
+substitute the number of elements of the result.
+)
+item(tt(${^)var(spec)tt(}))(
+pindex(RC_EXPAND_PARAM, use of)
+cindex(array expansion style, rc)
+cindex(rc, array expansion style)
+Turn on the tt(RC_EXPAND_PARAM) option for the
+evaluation of var(spec); if the `tt(^)' is doubled, turn it off.
+When this option is set, array expansions of the form
+`var(foo)tt(${)var(xx)tt(})var(bar)',
+where the parameter var(xx)
+is set to tt(LPAR())var(a b c)tt(RPAR()), are substituted with
+`var(fooabar foobbar foocbar)' instead of the default
+`var(fooa b cbar)'.
+
+Internally, each such expansion is converted into the
+equivalent list for brace expansion.  E.g., tt(${^var}) becomes
+tt({$var[1],$var[2],)...tt(}), and is processed as described in
+noderef(Brace Expansion) above.
+If word splitting is also in effect the
+tt($var[)var(N)tt(]) may themselves be split into different list
+elements.
+)
+item(tt(${=)var(spec)tt(}))(
+pindex(SH_WORD_SPLIT, use of)
+cindex(field splitting, sh style)
+cindex(sh, field splitting style)
+Turn on the tt(SH_WORD_SPLIT) option for the
+evaluation of var(spec); if the `tt(=)' is doubled, turn it off.
+vindex(IFS, use of)
+When this option is set, parameter values are split into
+separate words using tt(IFS) as a delimiter
+before substitution.
+This is done by default in most other shells.
+)
+item(tt(${~)var(spec)tt(}))(
+pindex(GLOB_SUBST)
+Turn on the tt(GLOB_SUBST) option for the evaluation of
+var(spec); if the `tt(~)' is doubled, turn it off.  When this option is
+set, any pattern characters resulting
+from the substitution become eligible for file expansion and filename
+generation.
+)
+enditem()
+
+If a tt(${)...tt(}) type parameter expression or a
+tt($LPAR())...tt(RPAR()) type command substitution is used in place of
+var(name) above, it is substituted first and the result is used as if
+it were the value of var(name).  Thus it is
+possible to perform nested operations:  tt(${${foo#head}%tail})
+substitues the value of tt($foo) with both tt(head) and tt(tail)
+deleted.  The form with tt($LPAR())...tt(RPAR()) is often useful in
+combination with the flags described next; see the example below.
+subsect(Parameter Expansion Flags)
+cindex(parameter expansion flags)
+cindex(flags, parameter expansion)
+cindex(expansion, parameter, flags)
+If the opening brace is directly followed by an opening parenthesis,
+the string up to the matching closing parenthesis will be taken as a
+list of flags.  Where arguments are valid, any character, or the
+matching pairs `tt(LPAR())...tt(RPAR())', `tt({)...tt(})',
+`tt([)...tt(])', or `tt(<)...tt(>)',  may be used
+in place of the colon as delimiters.  The following flags are supported:
+
+startitem()
+item(tt(A))(
+Create an array parameter with
+tt(${)...tt(:=)...tt(}) or tt(${)...tt(::=)...tt(}).
+Assignment is made before sorting or padding.
+)
+item(tt(@))(
+In double quotes, array elements are put into separate words.
+E.g., `tt("${(@)foo}")' is equivalent to `tt("${foo[@]}")' and
+`tt("${(@)foo[1,2]}")' is the same as `tt("$foo[1]" "$foo[2]")'.
+)
+item(tt(e))(
+Perform em(parameter expansion), em(command substitution) and
+em(arithmetic expansion) on the result. Such expansions can be
+nested but too deep recursion may have unpredictable effects.
+)
+item(tt(o))(
+Sort the resulting words in ascending order.
+)
+item(tt(O))(
+Sort the resulting words in descending order.
+)
+item(tt(i))(
+With tt(o) or tt(O), sort case-independently.
+)
+item(tt(L))(
+Convert all letters in the result to lower case.
+)
+item(tt(U))(
+Convert all letters in the result to upper case.
+)
+item(tt(C))(
+Capitalize the resulting words.
+)
+item(tt(c))(
+With tt(${#)var(name)tt(}), count the total number of characters in an array,
+as if the elements were concatenated with spaces between them.
+)
+item(tt(w))(
+With tt(${#)var(name)tt(}), count words in arrays or strings; the tt(s)
+flag may be used to set a word delimiter.
+)
+item(tt(W))(
+Similar to tt(w) with the difference that empty words between
+repeated delimiters are also counted.
+)
+item(tt(p))(
+Recognize the same escape sequences as the tt(print) builtin
+in string arguments to subsequent flags.
+)
+item(tt(l:)var(expr)tt(::)var(string1)tt(::)var(string2)tt(:))(
+Pad the resulting words on the left.  Each word will be truncated if
+required and placed in a field var(expr) characters wide.  The space
+to the left will be filled with var(string1) (concatenated as often
+as needed) or spaces if var(string1) is not given.  If both
+var(string1) and var(string2) are given, this string will be placed
+exactly once directly to the left of the resulting word.
+)
+item(tt(r:)var(expr)tt(::)var(string1)tt(::)var(string2)tt(:))(
+As tt(l), but pad the words on the right.
+)
+item(tt(j:)var(string)tt(:))(
+Join the words of arrays together using var(string) as a separator.
+pindex(SH_WORD_SPLIT, use of)
+Note that this occurs before field splitting by the tt(SH_WORD_SPLIT)
+option.
+)
+item(tt(F))(
+Join the words of arrays together using newline as a separator.
+This is a shorthand for `tt(pj:\n:)'.
+)
+item(tt(s:)var(string)tt(:))(
+Force field splitting (see the option tt(SH_WORD_SPLIT)) at the
+separator var(string).  Splitting only occurs in places where an
+array value is valid.
+)
+item(tt(f))(
+Split the result of the expansion to lines. This is a shorthand
+for `tt(ps:\n:)'.
+)
+item(tt(S))(
+(This and all remaining flags are used with the tt(${)...tt(#)...tt(}) or
+tt(${)...tt(%)...tt(}) forms.)
+Search substrings as well as beginnings or ends.
+)
+item(tt(I:)var(expr)tt(:))(
+Search the var(expr)th match (where var(expr) evaluates to a number).
+)
+item(tt(M))(
+Include the matched portion in the result.
+)
+item(tt(R))(
+Include the unmatched portion in the result (the em(R)est).
+)
+item(tt(B))(
+Include the index of the beginning of the match in the result.
+)
+item(tt(E))(
+Include the index of the end of the match in the result.
+)
+item(tt(N))(
+Include the length of the match in the result.
+)
+enditem()
+subsect(Example)
+The flag tt(f) is useful to split a double-quoted substitution line by
+line.  For example, `tt("${(f)$LPAR()<)var(file)tt(RPAR()}")'
+will substitue the contents of var(file) divided so that one line is
+supplied per argument to var(cmd).  Compare this with the effect of
+`tt($)tt(LPAR()<)var(file)tt(RPAR())' alone, which divides the file
+up by words, or the same inside double quotes, where the entire
+contents of the file are passed as a single argument.
+texinode(Command Substitution)(Arithmetic Expansion)(Parameter Expansion)(Expansion)
+sect(Command Substitution)
+cindex(command substitution)
+cindex(substitution, command)
+A command enclosed in parentheses
+preceded by a dollar sign, like `tt($LPAR())...tt(RPAR())', or quoted with grave
+accents, like `tt(`)...tt(`)', is replaced with its standard output, with any
+trailing newlines deleted.
+If the substitution is not enclosed in double quotes, the
+output is broken into words using the tt(IFS) parameter.
+vindex(IFS, use of)
+The substitution `tt($LPAR()cat) var(foo)tt(RPAR())' may be replaced
+by the equivalent but faster `tt($LPAR()<)var(foo)tt(RPAR())'.
+In either case, if the option tt(GLOB_SUBST) is set,
+the output is eligible for filename generation.
+texinode(Arithmetic Expansion)(Brace Expansion)(Command Substitution)(Expansion)
+sect(Arithmetic Expansion)
+cindex(arithmetic expansion)
+cindex(expansion, arithmetic)
+A string of the form `tt($[)var(exp)tt(])' or
+`tt($LPAR()LPAR())var(exp)tt(RPAR()RPAR())' is substituted
+with the value of the arithmetic expression var(exp).  var(exp) is
+subjected to em(parameter expansion), em(command substitution)
+and em(arithmetic expansion) before it is evaluated.
+See noderef(Arithmetic Evaluation).
+texinode(Brace Expansion)(Filename Expansion)(Arithmetic Expansion)(Expansion)
+sect(Brace Expansion)
+cindex(brace expansion)
+cindex(expansion, brace)
+A string of the form
+`var(foo)tt({)var(xx)tt(,)var(yy)tt(,)var(zz)tt(})var(bar)'
+is expanded to the individual words
+`var(fooxxbar)', `var(fooyybar)' and `var(foozzbar)'.
+Left-to-right order is preserved.  This construct
+may be nested.  Commas may be quoted in order to
+include them literally in a word.
+
+An expression of the form `tt({)var(n1)tt(..)var(n2)tt(})',
+where var(n1) and var(n2) are integers,
+is expanded to every number between
+var(n1) and var(n2) inclusive.  If either number begins with a
+zero, all the resulting numbers will be padded with leading zeroes to
+that minimum width.  If the numbers are in decreasing order the
+resulting sequence will also be in decreasing order.
+
+If a brace expression matches none of the above forms, it is left
+unchanged, unless the tt(BRACE_CCL) option is set.
+pindex(BRACE_CCL, use of)
+In that case, it is expanded to a sorted list of the individual
+characters between the braces, in the manner of a search set.
+`tt(-)' is treated specially as in a search set, but `tt(^)' or `tt(!)' as
+the first character is treated normally.
+texinode(Filename Expansion)(Filename Generation)(Brace Expansion)(Expansion)
+sect(Filename Expansion)
+cindex(filename expansion)
+cindex(expansion, filename)
+Each word is checked to see if it begins with an unquoted `tt(~)'.
+If it does, then the word up to a `tt(/)',
+or the end of the word if there is no `tt(/)',
+is checked to see if it can be substituted in one of the ways
+described here.  If so, then the `tt(~)' and the checked portion are
+replaced with the appropriate substitute value.
+
+A `tt(~)' by itself is replaced by the value of tt($HOME).
+A `tt(~)' followed by a `tt(PLUS())' or a `tt(-)' is replaced by the value of
+tt($PWD) or tt($OLDPWD), respectively.
+
+A `tt(~)' followed by a number is replaced by the directory at that
+position in the directory stack.
+`tt(~0)' is equivalent to `tt(~PLUS())',
+and `tt(~1)' is the top of the stack.
+`tt(~PLUS())' followed by a number is replaced by the directory at that
+position in the directory stack.
+`tt(~PLUS()0)' is equivalent to `tt(~PLUS())',
+and `tt(~PLUS()1)' is the top of the stack.
+`tt(~-)' followed by a number is replaced by the directory that
+many positions from the bottom of the stack.
+`tt(~-0)' is the bottom of the stack.
+pindex(PUSHD_MINUS, use of)
+The tt(PUSHD_MINUS)
+option exchanges the effects of `tt(~PLUS())' and `tt(~-)' where they are
+followed by a number.
+
+cindex(directories, named)
+cindex(named directories)
+A `tt(~)' followed by anything not already covered is looked up as a
+named directory, and replaced by the value of that named directory if found.
+Named directories are typically home directories for users on the system.
+They may also be defined if the text after the `tt(~)' is the name
+of a string shell parameter whose value begins with a `tt(/)'.
+It is also possible to define directory names using the tt(-d) option to the
+tt(hash) builtin.
+
+In certain circumstances (in prompts, for instance), when the shell
+prints a path, the path is checked to see if it has a named
+directory as its prefix.  If so, then the prefix portion
+is replaced with a `tt(~)' followed by the name of the directory.
+The shortest way of referring to the directory is used,
+with ties broken in favour of using a named directory,
+except when the directory is tt(/) itself.
+
+If a word begins with an unquoted `tt(=)'
+and the tt(EQUALS) option is set,
+the remainder of the word is taken as the
+name of a command or alias.  If a command
+exists by that name, the word is replaced
+by the full pathname of the command.
+If an alias exists by that name, the word
+is replaced with the text of the alias.
+
+Filename expansion is performed on the right hand side of a parameter
+assignment, including those appearing after commands of the
+tt(typeset) family.  In this case, the right hand side will be treated
+as a colon-separated list in the manner of the tt(PATH) parameter,
+so that a `tt(~)' or an `tt(=)' following a `tt(:)' is eligible for expansion.
+All such behaviour can be
+disabled by quoting the `tt(~)', the `tt(=)', or the whole expression (but not
+simply the colon); the tt(EQUALS) option is also respected.
+
+If the option tt(MAGIC_EQUAL_SUBST) is set, any unquoted shell
+argument in the form `var(identifier)tt(=)var(expression)' becomes eligible
+for file expansion as described in the previous paragraph.  Quoting the
+first `tt(=)' also inhibits this.
+texinode(Filename Generation)()(Filename Expansion)(Expansion)
+sect(Filename Generation)
+cindex(filename generation)
+cindex(globbing)
+If a word contains an unquoted instance of one of the characters
+`tt(*)', `tt(LPAR())', `tt(|)', `tt(<)', `tt([)', or `tt(?)', it is regarded
+as a pattern for filename generation, unless the tt(GLOB) option is unset.
+pindex(GLOB, use of)
+If the tt(EXTENDED_GLOB) option is set,
+pindex(EXTENDED_GLOB, use of)
+the `tt(^)' and `tt(#)' characters also denote a pattern; otherwise
+they are not treated specially by the shell.
+
+The word is replaced with a list of sorted filenames that match
+the pattern.  If no matching pattern is found, the shell gives
+an error message, unless the tt(NULL_GLOB) option is set,
+pindex(NULL_GLOB, use of)
+in which case the word is deleted; or unless the tt(NOMATCH)
+option is unset, in which case the word is left unchanged.
+pindex(NOMATCH, use of)
+
+In filename generation,
+the character `tt(/)' must be matched explicitly;
+also, a `tt(.)' must be matched
+explicitly at the beginning of a pattern or after a `tt(/)', unless the
+tt(GLOB_DOTS) option is set.
+pindex(GLOB_DOTS, use of)
+No filename generation pattern
+matches the files `tt(.)' or `tt(..)'.  In other instances of pattern
+matching, the `tt(/)' and `tt(.)' are not treated specially.
+subsect(Glob Operators)
+startitem()
+item(tt(*))(
+Matches any string, including the null string.
+)
+item(tt(?))(
+Matches any character.
+)
+item(tt([)...tt(]))(
+Matches any of the enclosed characters.  Ranges of characters
+can be specified by separating two characters by a `tt(-)'.
+A `tt(-)' or `tt(])' may be matched by including it as the
+first character in the list.
+There are also several named classes of characters, in the form
+`tt([:)var(name)(tt:])' with the following meanings:  `tt([:alnum:])'
+alphanumeric, `tt([:alpha:])' alphabetic,
+`tt([:blank:])' space or tab,
+`tt([:cntrl:])' control character, `tt([:digit:])' decimal
+digit, `tt([:graph:])' printable character except whitespace,
+`tt([:lower:])' lowercase letter, `tt([:print:])' printable character,
+`tt([:punct:])' printable character neither alphanumeric nor whitespace,
+`tt([:space:])' whitespace character, `tt([:upper:])' uppercase letter, 
+`tt([:xdigit:])' hexadecimal digit.  These use the macros provided by
+the operating system to test for the given character combinations,
+including any modifications due to local language settings:  see
+manref(ctype)(3).  Note that the square brackets are additional
+to those enclosing the whole set of characters, so to test for a
+single alphanumeric character you need `tt([[:alnum:]])'.  Named
+character sets can be used alongside other types,
+e.g. `tt([[:alpha:]0-9])'.
+)
+xitem(tt([^)...tt(]))
+item(tt([!)...tt(]))(
+Like tt([)...tt(]), except that it matches any character which is
+not in the given set.
+)
+item(tt(<)[var(x)]tt(-)[var(y)]tt(>))(
+Matches any number in the range var(x) to var(y), inclusive.
+Either of the numbers may be omitted to make the range open-ended;
+hence `tt(<->)' matches any number.
+)
+item(tt(LPAR())...tt(RPAR()))(
+Matches the enclosed pattern.  This is used for grouping.
+If the tt(KSH_GLOB) option is set, then a
+`tt(@)', `tt(*)', `tt(+)', `tt(?)' or `tt(!)' immediately preceding
+the `tt(LPAR())' is treated specially, as detailed below.
+)
+item(var(x)tt(|)var(y))(
+Matches either var(x) or var(y).
+This operator has lower precedence than any other.
+The `tt(|)' character
+must be within parentheses, to avoid interpretation as a pipeline.
+)
+item(tt(^)var(x))(
+(Requires tt(EXTENDED_GLOB) to be set.)
+Matches anything except the pattern var(x).
+This has a higher precedence than `tt(/)', so `tt(^foo/bar)'
+will search directories in `tt(.)' except `tt(./foo)'
+for a file named `tt(bar)'.
+)
+item(var(x)tt(~)var(y))(
+(Requires tt(EXTENDED_GLOB) to be set.)
+Match anything that matches the pattern var(x) but does not match var(y).
+This has lower precedence than any operator except `tt(|)', so
+`tt(*/*~foo/bar)' will search for all files in all directories in `tt(.)'
+and then exclude `tt(foo/bar)' if there was such a match.
+It groups left-to-right, so multiple patterns can be excluded by
+`var(foo)tt(~)var(bar)tt(~)var(baz)'.
+In the exclusion pattern (var(y)), `tt(/)' and `tt(.)' are not treated
+specially the way they usually are in globbing.
+)
+item(var(x)tt(#))(
+(Requires tt(EXTENDED_GLOB) to be set.)
+Matches zero or more occurrences of the pattern var(x).
+This operator has high precedence; `tt(12#)' is equivalent to `tt(1(2#))',
+rather than `tt((12)#)'.
+)
+item(var(x)tt(##))(
+(Requires tt(EXTENDED_GLOB) to be set.)
+Matches one or more occurrences of the pattern var(x).
+This operator has high precedence; `tt(12##)' is equivalent to `tt(1(2##))',
+rather than `tt((12)##)'.
+)
+enditem()
+subsect(ksh-like Glob Operators)
+pindex(KSH_GLOB, use of)
+If the tt(KSH_GLOB) option is set, the effects of parentheses can be
+modified by a preceding `tt(@)', `tt(*)', `tt(+)', `tt(?)' or `tt(!)'.
+This character need not be unquoted to have special effects,
+but the `tt(LPAR())' must be.
+
+startitem()
+item(tt(@LPAR())...tt(RPAR()))(
+Match the pattern in the parentheses.  (Like `tt(LPAR())...tt(RPAR())'.)
+)
+item(tt(*LPAR())...tt(RPAR()))(
+Match any number of occurrences.  (Like `tt(LPAR())...tt(RPAR()#)'.)
+)
+item(tt(PLUS()LPAR())...tt(RPAR()))(
+Match at least one occurrence.  (Like `tt(LPAR())...tt(RPAR()##)'.)
+)
+item(tt(?LPAR())...tt(RPAR()))(
+Match zero or one occurrence.  (Like `tt(LPAR()|)...tt(RPAR())'.)
+)
+item(tt(!LPAR())...tt(RPAR()))(
+Match anything but the expression in parentheses.
+(Like `tt(LPAR()^LPAR())...tt(RPAR()RPAR())'.)
+)
+enditem()
+subsect(Recursive Globbing)
+A pathname component of the form `tt(LPAR())var(foo)tt(/RPAR()#)'
+matches a path consisting of zero or more directories
+matching the pattern var(foo).
+As a shorthand, `tt(**/)' is equivalent to `tt((*/)#)'.
+Thus:
+
+nofill(tt(ls (*/)#bar))
+
+or
+
+nofill(tt(ls **/bar))
+
+does a recursive directory search for files named `tt(bar)', not following
+symbolic links.  To follow links, use `tt(***/)'.
+subsect(Glob Qualifiers)
+cindex(globbing, qualifiers)
+cindex(qualifiers, globbing)
+Patterns used for filename generation may end in a
+list of qualifiers enclosed in parentheses.
+The qualifiers specify which filenames that otherwise match the given pattern
+will be inserted in the argument list.
+
+pindex(BARE_GLOB_QUAL, use of)
+If the option tt(BARE_GLOB_QUAL) is set, then a trailing set of parentheses
+containing no `tt(|)' or `tt(LPAR())' characters (or `tt(~)' if it is special)
+is taken as a set of
+glob qualifiers.  A glob subexpression that would normally be taken as glob
+qualifiers, for example `tt((^x))', can be forced to be treated as part of
+the glob pattern by doubling the parentheses, for example `tt(((^x)))'.
+
+A qualifier may be any one of the following:
+
+startitem()
+item(tt(/))(
+directories
+)
+item(tt(.))(
+plain files
+)
+item(tt(@))(
+symbolic links
+)
+item(tt(=))(
+sockets
+)
+item(tt(p))(
+named pipes (FIFOs)
+)
+item(tt(*))(
+executable plain files (0100)
+)
+item(tt(%))(
+device files (character or block special)
+)
+item(tt(%b))(
+block special files
+)
+item(tt(%c))(
+character special files
+)
+item(tt(r))(
+owner-readable files (0400)
+)
+item(tt(w))(
+owner-writable files (0200)
+)
+item(tt(x))(
+owner-executable files (0100)
+)
+item(tt(A))(
+group-readable files (0040)
+)
+item(tt(I))(
+group-writable files (0020)
+)
+item(tt(E))(
+group-executable files (0010)
+)
+item(tt(R))(
+world-readable files (0004)
+)
+item(tt(W))(
+world-writable files (0002)
+)
+item(tt(X))(
+world-executable files (0001)
+)
+item(tt(s))(
+setuid files (04000)
+)
+item(tt(S))(
+setgid files (02000)
+)
+item(tt(t))(
+files with the sticky bit (01000)
+)
+item(tt(d)var(dev))(
+files on the device var(dev)
+)
+item(tt(l)[tt(-)|tt(PLUS())]var(ct))(
+files having a link count less than var(ct) (tt(-)), greater than
+var(ct) (tt(PLUS())), or is equal to var(ct)
+)
+item(tt(U))(
+files owned by the effective user ID
+)
+item(tt(G))(
+files owned by the effective group ID
+)
+item(tt(u)var(id))(
+files owned by user ID var(id) if it is a number, if not, than the
+character after the `tt(u)' will be used as a separator and the string
+between it and the next matching separator
+(`tt(LPAR())', `tt([)', `tt({)', and `tt(<)'
+match `tt(RPAR())', `tt(])', `tt(})', and `tt(>)' respectively,
+any other character matches
+itself) will be taken as a user name, and the user ID of this user will
+be taken (e.g. `tt(u:foo:)' or `tt(u[foo])' for user `tt(foo)')
+)
+item(tt(g)var(id))(
+like tt(u)var(id) but with group IDs or names
+)
+item(tt(a)[tt(Mwhm)][tt(-)|tt(PLUS())]var(n))(
+files accessed exactly var(n) days ago.  Files accessed within the
+last var(n) days are selected using a negative value for var(n)
+(tt(-)var(n)).  Files accessed more than var(n) days ago are selected by a
+positive var(n) value (tt(PLUS())var(n)).  Optional unit specifiers `tt(M)',
+`tt(w)', `tt(h)' or `tt(m)' (e.g. `tt(ah5)') cause the check to be
+performed with months (of 30 days), weeks, hours, or minutes instead of
+days, respectively.  For instance, `tt(echo *(ah-5))' would echo files
+accessed within the last five hours.
+)
+item(tt(m)[tt(Mwhm)][tt(-)|tt(PLUS())]var(n))(
+like the file access qualifier, except that it uses the file modification
+time.
+)
+item(tt(c)[tt(Mwhm)][tt(-)|tt(PLUS())]var(n))(
+like the file access qualifier, except that it uses the file inode change
+time.
+)
+item(tt(L)[tt(PLUS())|tt(-)]var(n))(
+files less than var(n) bytes (tt(-)), more than var(n) bytes (tt(PLUS())), or
+exactly var(n) bytes in length. If this flag is directly followed by a `tt(k)'
+(`tt(K)'), `tt(m)' (`tt(M)'), or `tt(p)' (`tt(P)') (e.g. `tt(Lk-50)')
+the check is performed with kilobytes, megabytes, or blocks (of 512 bytes)
+instead.
+)
+item(tt(^))(
+negates all qualifiers following it
+)
+item(tt(-))(
+toggles between making the qualifiers work on symbolic links (the
+default) and the files they point to
+)
+item(tt(M))(
+sets the tt(MARK_DIRS) option for the current pattern
+pindex(MARK_DIRS, setting in pattern)
+)
+item(tt(T))(
+appends a trailing qualifier mark to the file names, analogous to the
+tt(LIST_TYPES) option, for the current pattern (overrides tt(M))
+)
+item(tt(N))(
+sets the tt(NULL_GLOB) option for the current pattern
+pindex(NULL_GLOB, setting in pattern)
+)
+item(tt(D))(
+sets the tt(GLOB_DOTS) option for the current pattern
+pindex(GLOB_DOTS, setting in pattern)
+)
+enditem()
+
+More than one of these lists can be combined, separated by commas. The
+whole list matches if at least one of the sublists matches (they are
+`or'ed, the qualifiers in the sublists are `and'ed).
+
+If a `tt(:)' appears in a qualifier list, the remainder of the expression in
+parenthesis is interpreted as a modifier (see noderef(Modifiers)
+in noderef(History Expansion)).  Note that
+each modifier must be introduced by a separate `tt(:)'.  Note also that the
+result after modification does not have to be an existing file.  The
+name of any existing file can be followed by a modifier of the form
+`tt((:..))' even if no actual filename generation is performed.
+Thus:
+
+nofill(tt(ls *(-/)))
+
+lists all directories and symbolic links that point to directories,
+and
+
+nofill(tt(ls *(%W)))
+
+lists all world-writable device files in the current directory, and
+
+nofill(tt(ls *(W,X)))
+
+lists all files in the current directory that are
+world-writable or world-executable, and
+
+nofill(tt(echo /tmp/foo*(u0^@:t)))
+
+outputs the basename of all root-owned files beginning with the string
+`tt(foo)' in tt(/tmp), ignoring symlinks, and
+
+nofill(tt(ls *.*~(lex|parse).[ch](^D^l1)))
+
+lists all files having a link count of one whose names contain a dot
+(but not those starting with a dot, since tt(GLOB_DOTS) is explicitly
+switched off) except for tt(lex.c), tt(lex.h), tt(parse.c) and tt(parse.h).
diff --git a/Doc/Zsh/filelist.yo b/Doc/Zsh/filelist.yo
new file mode 100644
index 000000000..298eff074
--- /dev/null
+++ b/Doc/Zsh/filelist.yo
@@ -0,0 +1,15 @@
+sect(Files)
+cindex(files used)
+startlist()
+list(tt($ZDOTDIR/.zshenv))
+list(tt($ZDOTDIR/.zprofile))
+list(tt($ZDOTDIR/.zshrc))
+list(tt($ZDOTDIR/.zlogin))
+list(tt($ZDOTDIR/.zlogout))
+list(tt(${TMPPREFIX}*)   (default is /tmp/zsh*))
+list(tt(/etc/zshenv))
+list(tt(/etc/zprofile))
+list(tt(/etc/zshrc))
+list(tt(/etc/zlogin))
+list(tt(/etc/zlogout)   (installation-specific - tt(/etc) is the default))
+endlist()
diff --git a/Doc/Zsh/files.yo b/Doc/Zsh/files.yo
new file mode 100644
index 000000000..0d775a14f
--- /dev/null
+++ b/Doc/Zsh/files.yo
@@ -0,0 +1,26 @@
+texinode(Files)(Shell Grammar)(Invocation)(Top)
+chapter(Files)
+sect(Startup/Shutdown Files)
+cindex(files, startup)
+cindex(startup files)
+cindex(files, shutdown)
+cindex(shutdown files)
+pindex(NO_RCS, use of)
+Commands are first read from tt(/etc/zshenv).
+If the tt(RCS) option is unset
+within tt(/etc/zshenv), all other
+initialization files are skipped.
+Otherwise, commands are read
+from tt($ZDOTDIR/.zshenv).
+pindex(LOGIN, use of)
+If the shell is a login shell, commands
+are read from tt(/etc/zprofile) and then tt($ZDOTDIR/.zprofile).
+Then, if the shell is interactive,
+commands are read from tt(/etc/zshrc) and then tt($ZDOTDIR/.zshrc).
+Finally, if the shell is a login shell, tt(/etc/zlogin) and
+tt($ZDOTDIR/.zlogin) are read.
+
+If tt(ZDOTDIR) is unset, tt(HOME) is used instead.
+Those files listed above as being in tt(/etc) may be in another
+directory, depending on the installation.
+ifnzman(includefile(Zsh/filelist.yo))
diff --git a/Doc/Zsh/func.yo b/Doc/Zsh/func.yo
new file mode 100644
index 000000000..c2fc71d55
--- /dev/null
+++ b/Doc/Zsh/func.yo
@@ -0,0 +1,107 @@
+texinode(Functions)(Jobs & Signals)(Command Execution)(Top)
+chapter(Functions)
+ifzman(\
+sect(Functions)
+)\
+cindex(functions)
+findex(function)
+The tt(function) reserved word is used to define shell functions.
+Shell functions are read in and stored internally.
+Alias names are resolved when the function is read.
+Functions are executed like commands with the arguments
+passed as positional parameters.
+(See noderef(Command Execution).)
+
+Functions execute in the same process as the caller and
+share all files
+and present working directory with the
+caller.  A trap on tt(EXIT) set inside a function
+is executed after the function completes in the environment
+of the caller.
+
+findex(return, use of)
+The tt(return) builtin is used to return from function calls.
+
+findex(functions, use of)
+Function identifiers can be listed with the tt(functions) builtin.
+findex(unfunction, use of)
+Functions can be undefined with the tt(unfunction) builtin.
+sect(Autoloading Functions)
+findex(autoload, use of)
+cindex(autoloading functions)
+cindex(functions, autoloading)
+A function can be marked as em(undefined) using the tt(autoload) builtin
+(or `tt(functions -u)' or `tt(typeset -fu)').  Such a function has no
+body.  When the function is first executed, the tt(fpath)
+variable will be searched for a file with the same name as the
+function.
+
+pindex(KSH_AUTOLOAD, use of)
+If the tt(KSH_AUTOLOAD) option is set, or the file contains only a simple
+definition of the function, the file's contents will be
+executed.  It would normally define the function in question, but may
+also perform initialisation.
+It is executed in the context of the function
+execution, and may therefore define local parameters.
+
+Otherwise, the function is defined such that its body is the
+complete contents of the file.  This form allows the file to be
+used directly as an executable shell script.
+Initialisation code can be executed, but only as part of the first
+function execution, so the function would have to redefine itself to
+avoid reinitialising on the next execution.
+
+If this processing of the file results in the function being
+fully defined, the function itself is then executed.
+sect(Special Functions)
+The following functions, if defined, have special meaning to
+the shell:
+
+startitem()
+findex(chpwd)
+item(tt(chpwd))(
+Executed whenever the current working directory is changed.
+)
+findex(periodic)
+item(tt(periodic))(
+vindex(PERIOD)
+If the parameter tt(PERIOD)
+is set, this function is executed every tt($PERIOD)
+seconds, just before a prompt.
+)
+findex(precmd)
+item(tt(precmd))(
+Executed before each prompt.
+)
+findex(preexec)
+item(tt(preexec))(
+Executed just after a command has been read and is about to be
+executed.  If the history mechanism is active, the string to be
+executed is passed as an argument.
+)
+item(tt(TRAP)var(NAL))(
+cindex(signals, trapping)
+cindex(trapping signals)
+If defined and non-null,
+this function will be executed whenever the shell
+catches a signal tt(SIG)var(NAL), where var(NAL) is a signal
+name as specified for the tt(kill) builtin.
+The signal number will be passed as the first parameter to the function.
+
+If a function of this form is defined and null,
+the shell and processes spawned by it will ignore tt(SIG)var(NAL).
+)
+findex(TRAPDEBUG)
+item(tt(TRAPDEBUG))(
+Executed after each command.
+)
+findex(TRAPEXIT)
+item(tt(TRAPEXIT))(
+Executed when the shell exits,
+or when the current function exits if defined inside a function.
+)
+findex(TRAPZERR)
+item(tt(TRAPZERR))(
+Executed whenever a command has a non-zero exit status.
+)
+enditem()
diff --git a/Doc/Zsh/grammar.yo b/Doc/Zsh/grammar.yo
new file mode 100644
index 000000000..c78aed4b4
--- /dev/null
+++ b/Doc/Zsh/grammar.yo
@@ -0,0 +1,335 @@
+texinode(Shell Grammar)(Redirection)(Files)(Top)
+chapter(Shell Grammar)
+cindex(shell grammar)
+cindex(grammar, shell)
+startmenu()
+menu(Simple Commands & Pipelines)
+menu(Precommand Modifiers)
+menu(Complex Commands)
+menu(Alternate Forms For Complex Commands)
+menu(Reserved Words)
+menu(Comments)
+menu(Aliasing)
+menu(Quoting)
+endmenu()
+texinode(Simple Commands & Pipelines)(Precommand Modifiers)()(Shell Grammar)
+sect(Simple Commands & Pipelines)
+cindex(simple commands)
+cindex(commands, simple)
+A em(simple command) is a sequence of optional parameter
+assignments followed by blank-separated words,
+with optional redirections interspersed.
+The first word is the command to be executed, and the remaining
+words, if any, are arguments to the command.
+If a command name is given, the parameter assignments modify
+the environment of the command when it is executed.
+The value of a simple command is its exit status,
+or 128 plus the signal number if terminated by a signal.
+
+cindex(pipeline)
+A em(pipeline) is either a simple command, or a sequence of two or more
+simple commands where each command is separated from the next by `tt(|)'
+or `tt(|&)'.  Where commands are separated by `tt(|)', the standard
+output of the first command is connected to the
+standard input of the next.  `tt(|&)' is shorthand for `tt(2>&1 |)', which
+connects both the standard output and the standard error of the
+command to the standard input of the next.  The value of a pipeline
+is the value of the last command, unless the pipeline is preceded by
+`tt(!)' in which case the value is the logical inverse of the value of the
+last command.
+
+findex(coproc)
+cindex(coprocess)
+If a pipeline is preceded by `tt(coproc)', it is executed as a coprocess;
+a two-way pipe is established between it and the parent shell.  The
+shell can read from or write to the coprocess by means of the `tt(>&p)'
+and `tt(<&p)' redirection operators or with `tt(print -p)' and `tt(read -p)'.
+A pipeline cannot be preceded by both `tt(coproc)' and `tt(!)'.
+
+cindex(sublist)
+A em(sublist) is either a single pipeline, or a sequence of two or more
+pipelines separated by `tt(&&)' or `tt(||)'.  If two pipelines are separated
+by `tt(&&)', the second pipeline is executed only if the first succeeds
+(returns a zero value).  If two pipelines are separated by `tt(||)', the
+second is executed only if the first fails (returns a nonzero value).
+Both operators have equal precedence and are left associative.
+The value of the sublist is the value of the last pipeline executed.
+
+cindex(list)
+A em(list) is a sequence of zero or more sublists, in which each sublist
+is terminated by `tt(;)', `tt(&)', `tt(&|)', `tt(&!)', or a newline.
+This terminator
+may optionally be omitted from the last sublist in the list when the
+list appears as a complex command inside `tt(LPAR())...tt(RPAR())'
+or `tt({)...tt(})'.  When a
+sublist is terminated by `tt(;)' or newline, the shell waits for it to
+finish before executing the next sublist.  If a sublist is terminated
+by a `tt(&)', `tt(&|)', or `tt(&!)',
+the shell executes it in the background, and
+does not wait for it to finish.
+A backgrounded sublist returns a status of zero.
+texinode(Precommand Modifiers)(Complex Commands)(Simple Commands & Pipelines)(Shell Grammar)
+sect(Precommand Modifiers)
+cindex(precommand modifiers)
+cindex(modifiers, precommand)
+A simple command may be preceded by a em(precommand modifier),
+which will alter how the command is interpreted.  These modifiers are
+shell builtin commands with the exception of tt(nocorrect) which is
+a reserved word.
+
+startitem()
+item(tt(-))(
+The command is executed with a `tt(-)' prepended to its
+tt(argv[0]) string.
+)
+item(tt(noglob))(
+Filename generation (globbing) is not performed on any of
+the words.
+)
+item(tt(nocorrect))(
+Spelling correction is not done on any of the words.
+)
+item(tt(exec))(
+The command is executed in the parent shell without forking.
+)
+item(tt(command))(
+The command word is taken to be the name of an external command,
+rather than a shell function or builtin.
+)
+item(tt(builtin))(
+The command word is taken to be the name of a builtin command,
+rather than a shell function or external command.
+)
+enditem()
+texinode(Complex Commands)(Alternate Forms For Complex Commands)(Precommand Modifiers)(Shell Grammar)
+sect(Complex Commands)
+cindex(complex commands)
+cindex(commands, complex)
+A em(complex command) in zsh is one of the following:
+
+startitem()
+findex(if)
+cindex(if construct)
+item(tt(if) var(list) tt(then) var(list) [ tt(elif) var(list) tt(then) var(list) ] ... [ tt(else) var(list) ] tt(fi))(
+The tt(if) var(list) is executed, and if it returns a zero exit status,
+the tt(then) var(list) is executed.
+Otherwise, the tt(elif) var(list) is executed and if its value is zero,
+the tt(then) var(list) is executed.
+If each tt(elif) var(list) returns nonzero, the tt(else) var(list) is executed.
+)
+findex(for)
+cindex(for loops)
+cindex(loops, for)
+item(tt(for) var(name) [ tt(in) var(word) ... var(term) ] tt(do) var(list) tt(done))(
+where var(term) is at least one newline or tt(;).
+Expand the list of var(word)s, and set the parameter
+var(name) to each of them in turn, executing
+var(list) each time.  If the tt(in) var(word) is omitted,
+use the positional parameters instead of the var(word)s.
+)
+item(tt(for LPAR()LPAR()) [var(expr1)] tt(;) [var(expr2)] tt(;) [var(expr3)] tt(RPAR()RPAR() do) var(list) tt(done))(
+The arithmetic expression var(expr1) is evaluated first (see
+noderef(Arithmetic Evaluation)).  The arithmetic expression
+var(expr2) is repeatedly evaluated until it evaluates to zero and
+when non-zero, var(list) is executed and the arithmetic expression
+var(expr3) evaluated.  If any expression is omitted, then it behaves
+as if it evaluated to 1.
+)
+findex(while)
+cindex(while loops)
+cindex(loops, while)
+item(tt(while) var(list) tt(do) var(list) tt(done))(
+Execute the tt(do) var(list) as long as the tt(while) var(list)
+returns a zero exit status.
+)
+findex(until)
+cindex(until loops)
+cindex(loops, until)
+item(tt(until) var(list) tt(do) var(list) tt(done))(
+Execute the tt(do) var(list) as long as tt(until) var(list)
+returns a nonzero exit status.
+)
+findex(repeat)
+cindex(repeat loops)
+cindex(loops, repeat)
+item(tt(repeat) var(word) tt(do) var(list) tt(done))(
+var(word) is expanded and treated as an arithmetic expression,
+which must evaluate to a number var(n).
+var(list) is then executed var(n) times.
+)
+findex(case)
+cindex(case selection)
+cindex(selection, case)
+item(tt(case) var(word) tt(in) [ [tt(LPAR())] var(pattern) [ tt(|) var(pattern) ] ... tt(RPAR()) var(list) (tt(;;)|tt(;&)) ] ... tt(esac))(
+Execute the var(list) associated with the first var(pattern)
+that matches var(word), if any.  The form of the patterns
+is the same as that used for filename generation.  See
+noderef(Filename Generation).
+If the var(list) that is executed is terminated with tt(;&) rather than
+tt(;;), the following list is also executed.  This continues until either
+a list is terminated with tt(;;) or the tt(esac) is reached.
+)
+findex(select)
+cindex(user selection)
+cindex(selection, user)
+item(tt(select) var(name) [ tt(in) var(word) ... var(term) ] tt(do) var(list) tt(done))(
+where var(term) is one ore more newline or tt(;).
+Print the set of var(word)s, each preceded by a number.
+If the tt(in) var(word) is omitted, use the positional parameters.
+The tt(PROMPT3) prompt is printed and a line is read from standard
+input.  If this line consists of the number of one of the listed
+var(word)s, then the parameter var(name)
+is set to the var(word) corresponding to this number.
+If this line is empty, the selection list is printed again.
+Otherwise, the value of the parameter var(name) is set to null.
+The contents of the line read from standard input is saved
+in the parameter tt(REPLY).  var(list) is executed
+for each selection until a break or end-of-file is encountered.
+)
+cindex(subshells)
+item(tt(LPAR()) var(list) tt(RPAR()))(
+Execute var(list) in a subshell.  Traps set by the tt(trap) builtin
+are reset to their default values while executing var(list).
+)
+item(tt({) var(list) tt(}))(
+Execute var(list).
+)
+xitem(tt(function) var(word) ... [ tt(()) ] [ var(term) ] tt({) var(list) tt(}))
+xitem(var(word) ... tt(()) [ var(term) ] tt({) var(list) tt(}))
+item(var(word) ... tt(()) [ var(term) ] var(command))(
+where var(term) is one or more newline or tt(;).
+Define a function which is referenced by any one of var(word).
+Normally, only one var(word) is provided; multiple var(word)s
+are usually only useful for setting traps.
+The body of the function is the var(list) between
+the tt({) and tt(}).  See noderef(Functions).
+)
+cindex(timing)
+item(tt(time) [ var(pipeline) ])(
+The var(pipeline) is executed, and timing statistics are
+reported on the standard error in the form specified
+by the tt(TIMEFMT) parameter.
+If var(pipeline) is omitted, print statistics about the
+shell process and its children.
+)
+cindex(testing conditional expression)
+item(tt([[) var(exp) tt(]]))(
+Evaluates the conditional expression var(exp)
+and return a zero exit status if it is true.
+See noderef(Conditional Expressions)
+for a description of var(exp).
+)
+enditem()
+texinode(Alternate Forms For Complex Commands)(Reserved Words)(Complex Commands)(Shell Grammar)
+sect(Alternate Forms For Complex Commands)
+cindex(alternate forms for complex commands)
+cindex(commands, alternate forms for complex)
+Many of zsh's complex commands have alternate forms.  These particular
+versions of complex commands should be considered deprecated and may be
+removed in the future.  The versions in the previous section should be
+preferred instead.  The short versions below only work if var(sublist)
+is of the form `tt({) var(list) tt(})' or if the tt(SHORT_LOOPS)
+option is set.
+
+startitem()
+item(tt(if) var(list) tt({) var(list) tt(}) [ tt(elif) var(list) tt({) var(list) tt(}) ] ... [ tt(else {) var(list) tt(}) ])(
+An alternate form of tt(if).
+)
+item(tt(if) var(list) var(sublist))(
+A short form of the alternate `if'.
+)
+item(tt(for) var(name) tt(LPAR()) var(word) ... tt(RPAR()) var(sublist))(
+A short form of tt(for).
+)
+item(tt(for) var(name) [ tt(in) var(word) ... var(term) ] var(sublist))(
+where var(term) is at least one newline or tt(;).
+Another short form of tt(for).
+)
+item(tt(for LPAR()LPAR()) [var(expr1)] tt(;) [var(expr2)] tt(;) [var(expr3)] tt(RPAR()RPAR()) var(sublist))(
+A short form of the arithmetic tt(for) command.
+)
+item(tt(foreach) var(name) tt(LPAR()) var(word) ... tt(RPAR()) var(list) tt(end))(
+Another form of tt(for).
+)
+item(tt(while) var(list) tt({) var(list) tt(}))(
+An alternative form of tt(while).
+)
+item(tt(until) var(list) tt({) var(list) tt(}))(
+An alternative form of tt(until).
+)
+item(tt(repeat) var(word) var(sublist))(
+This is a short form of tt(repeat).
+)
+item(tt(case) var(word) tt({) [ [tt(LPAR())] var(pattern) [ tt(|) var(pattern) ] ... tt(RPAR()) var(list) (tt(;;)|tt(;&)) ] ... tt(}))(
+An alternative form of tt(case).
+)
+item(tt(select) var(name) [ tt(in) var(word) var(term) ] var(sublist))(
+where var(term) is at least one newline or tt(;).
+A short form of tt(select).
+)
+enditem()
+texinode(Reserved Words)(Comments)(Alternate Forms For Complex Commands)(Shell Grammar)
+sect(Reserved Words)
+cindex(reserved words)
+findex(disable, use of)
+The following words are recognized as reserved words when used as the first
+word of a command unless quoted or disabled using tt(disable -r):
+
+tt(do done esac then elif else fi for case
+if while function repeat time until
+select coproc nocorrect foreach end ! [[ { })
+
+Additionally, `tt(})' is recognized in any position if the tt(IGNORE_BRACES) option
+is not set.
+texinode(Comments)(Aliasing)(Reserved Words)(Shell Grammar)
+sect(Comments)
+cindex(comments)
+pindex(INTERACTIVE_COMMENTS, use of)
+vindex(histchars, use of)
+In noninteractive shells, or in interactive shells with the
+tt(INTERACTIVE_COMMENTS) option set, a word beginning
+with the third character of the tt(histchars) parameter
+(`tt(#)' by default) causes that word and all the following
+characters up to a newline to be ignored.
+texinode(Aliasing)(Quoting)(Comments)(Shell Grammar)
+sect(Aliasing)
+cindex(aliasing)
+Every token in the shell input is checked to see if there
+is an alias defined for it.
+If so, it is replaced by the text of the alias if it is in command
+position (if it could be the first word of a simple command),
+or if the alias is global.
+If the text ends with a space, the next word in the shell input
+is treated as though it were in command position for purposes of alias
+expansion.
+findex(alias, use of)
+cindex(aliases, global)
+An alias is defined using the tt(alias) builtin; global aliases
+may be defined using the tt(-g) option to that builtin.
+
+Alias substitution is done on the shell input before any
+other substitution except history substitution.  Therefore,
+if an alias is defined for the word tt(foo), alias substitution
+may be avoided by quoting part of the word, e.g. tt(\foo).
+But there is nothing to prevent an alias being defined
+for tt(\foo) as well.
+texinode(Quoting)()(Aliasing)(Shell Grammar)
+sect(Quoting)
+cindex(quoting)
+A character may be var(quoted) (that is, made
+to stand for itself) by preceding it with a `tt(\)'.
+`tt(\)' followed by a newline is ignored.
+
+A string enclosed between `tt($')' and `tt(')' is
+processed the same way as the string arguments of the
+tt(print) builtin, and the resulting string is considered to be
+entirely quoted.  A literal `tt(')' character can be included in the
+string by using the `tt(\')' escape.
+
+All characters enclosed between a pair of single quotes (tt('')) that
+is not preceded by a `tt($)' are quoted.  A single quote cannot appear
+within single quotes.
+
+Inside double quotes (tt("")), parameter and
+command substitution occurs, and `tt(\)' quotes the characters
+`tt(\)', `tt(`)', `tt(")', and `tt($)'.
diff --git a/Doc/Zsh/guide.yo b/Doc/Zsh/guide.yo
new file mode 100644
index 000000000..d38a0d308
--- /dev/null
+++ b/Doc/Zsh/guide.yo
@@ -0,0 +1,149 @@
+texiifinfo(\
+texinode(Top)(The Z Shell Guide)((dir))((dir))
+texitop(The Z Shell Guide)
+This Info file documents Zsh, a freely available UNIX command interpreter
+(shell), which of the standard shells most closely resembles the Korn shell
+(ksh), although it is not completely compatible.
+
+Version version(), last updated date().
+)\
+
+startmenu()
+menu(The Z Shell Guide)
+menu(Introduction)
+menu(Invocation)
+menu(Files)
+menu(Shell Grammar)
+menu(Redirection)
+menu(Command Execution)
+menu(Functions)
+menu(Jobs & Signals)
+menu(Arithmetic Evaluation)
+menu(Conditional Expressions)
+menu(Compatibility)
+menu(Prompt Expansion)
+menu(Restricted Shell)
+menu(Expansion)
+menu(Parameters)
+menu(Options)
+menu(Shell Builtin Commands)
+menu(Zsh Line Editor)
+menu(Programmable Completion)
+menu(Zsh Modules)
+
+ --- Indices ---
+
+menu(Concept Index)
+menu(Variables Index)
+menu(Options Index)
+menu(Functions Index)
+menu(Editor Functions Index)
+menu(Keystroke Index)
+
+ --- The Detailed Node Listing ---
+
+Introduction
+
+menu(Author)
+menu(Availability)
+menu(Mailing Lists)
+menu(The Zsh FAQ)
+menu(The Zsh Web Page)
+menu(See Also)
+
+Shell Grammar
+
+menu(Simple Commands & Pipelines)
+menu(Precommand Modifiers)
+menu(Complex Commands)
+menu(Alternate Forms For Complex Commands)
+menu(Reserved Words)
+menu(Comments)
+menu(Aliasing)
+menu(Quoting)
+
+Expansion
+
+menu(History Expansion)
+menu(Process Substitution)
+menu(Parameter Expansion)
+menu(Command Substitution)
+menu(Arithmetic Expansion)
+menu(Brace Expansion)
+menu(Filename Expansion)
+menu(Filename Generation)
+
+Parameters
+
+menu(Local Parameters)
+menu(Array Parameters)
+menu(Positional Parameters)
+menu(Parameters Set By The Shell)
+menu(Parameters Used By The Shell)
+
+Options
+
+menu(Description of Options)
+menu(Single Letter Options)
+
+Zsh Line Editor
+
+menu(Movement)
+menu(History Control)
+menu(Modifying Text)
+menu(Arguments)
+menu(Completion)
+menu(Miscellaneous)
+
+Programmable Completion
+
+menu(Command Flags)
+menu(Option Flags)
+menu(Alternative Completion)
+menu(Extended Completion)
+menu(Example)
+
+Zsh Modules
+
+menu(The cap Module)
+menu(The clone Module)
+menu(The comp1 Module)
+menu(The compctl Module)
+menu(The deltochar Module)
+menu(The example Module)
+menu(The files Module)
+menu(The sched Module)
+menu(The stat Module)
+menu(The zle Module)
+endmenu()
+texinode(The Z Shell Guide)(Introduction)(Top)(Top)
+chapter(The Z Shell Guide)
+This document has been produced from the texinfo file tt(zsh.texi),
+included in the tt(Doc) sub-directory of the Zsh distribution.
+sect(Producing documentation from zsh.texi)
+The texinfo source may be converted into several formats:
+
+startitem()
+item(The Info guide)(
+The Info format allows searching for topics, commands, functions, etc.
+from the many Indices. The command `tt(makeinfo zsh.texi)' is used to
+produce the Info documentation.
+)
+item(The printed guide)(
+The command `tt(texi2dvi zsh.texi)' will output tt(zsh.dvi) which can
+then be processed with bf(dvips) and optionally bf(gs) (Ghostscript) to
+produce a nicely formatted printed guide.
+)
+item(The HTML guide)(
+Mark Borges, tt(<mdb@cdc.noaa.gov), maintains an HTML version of this
+guide at tt(http://www.peak.org/zsh/Doc/zsh_toc.html).
+(The HTML version is produced with bf(texi2html), which may be obtained
+from tt(http://wwwcn.cern.ch/dci/texi2html/). The command is
+`tt(texi2html -split_chapter -expandinfo zsh.texi)'.)
+)
+enditem()
+
+For those who do not have the necessary tools to process texinfo,
+precompiled documentation (PostScript, dvi, info and HTML formats)
+is available from the zsh archive site or its mirrors, in the file
+tt(zsh-doc.tar.gz). (See noderef(Availability) for a list of sites.)
diff --git a/Doc/Zsh/index.yo b/Doc/Zsh/index.yo
new file mode 100644
index 000000000..7afa14d07
--- /dev/null
+++ b/Doc/Zsh/index.yo
@@ -0,0 +1,24 @@
+ifztexi(\
+def(printindex)(2)(\
+  NOTRANS(@unnumbered) ARG1NL()\
+  NL()\
+  NOTRANS(@printindex) ARG2\
+)\
+texinode(Concept Index)(Variables Index)(Top)(Top)
+printindex(Concept Index)(cp)
+
+texinode(Variables Index)(Options Index)(Concept Index)(Top)
+printindex(Variables Index)(vr)
+
+texinode(Options Index)(Functions Index)(Variables Index)(Top)
+printindex(Options Index)(pg)
+
+texinode(Functions Index)(Editor Functions Index)(Options Index)(Top)
+printindex(Functions Index)(fn)
+
+texinode(Editor Functions Index)(Keystroke Index)(Functions Index)(Top)
+printindex(Editor Functions Index)(tp)
+
+texinode(Keystroke Index)()(Editor Functions Index)(Top)
+printindex(Keystroke Index)(ky)
+)\
diff --git a/Doc/Zsh/intro.yo b/Doc/Zsh/intro.yo
new file mode 100644
index 000000000..ebb678f70
--- /dev/null
+++ b/Doc/Zsh/intro.yo
@@ -0,0 +1,38 @@
+texinode(Introduction)(Invocation)(The Z Shell Guide)(Top)
+chapter(Introduction)
+ifzman(\
+sect(Synopsis)
+Because zsh contains many features, the zsh manual has been split into
+a number of section+CHAR(s)\
+ifzshall(\
+.  This manual page includes all the separate manual pages in the
+following order\
+)\
+:
+
+startlist()
+ifzshone(\
+list(em(zsh)          Zsh overview (this section))
+)\
+list(em(zshmisc)      Anything not fitting into the other sections)
+list(em(zshexpn)      Zsh command and parameter expansion)
+list(em(zshparam)     Zsh parameters)
+list(em(zshoptions)   Zsh options)
+list(em(zshbuiltins)  Zsh built-in functions)
+list(em(zshzle)       Zsh command line editing)
+list(em(zshcompctl)   Zsh completion control)
+list(em(zshmodules)   Zsh loadable modules)
+ifzshone(\
+list(em(zshall)       Meta-man page containing all of the above)
+)\
+endlist()
+sect(Description)
+)\
+Zsh is a UNIX command interpreter (shell) usable as an interactive
+login shell and as a shell script command processor.  Of the standard shells,
+zsh most closely resembles bf(ksh) but includes many enhancements.  Zsh
+has command line editing, builtin spelling correction, programmable
+command completion, shell functions (with autoloading), a history
+mechanism, and a host of other features.
+includefile(Zsh/metafaq.yo)
+ifnzman(includefile(Zsh/seealso.yo))
diff --git a/Doc/Zsh/invoke.yo b/Doc/Zsh/invoke.yo
new file mode 100644
index 000000000..40a5513d0
--- /dev/null
+++ b/Doc/Zsh/invoke.yo
@@ -0,0 +1,23 @@
+texinode(Invocation)(Files)(Introduction)(Top)
+chapter(Invocation)
+cindex(invocation)
+sect(Invocation Options)
+cindex(flags, shell)
+cindex(shell flags)
+If the tt(-s) flag is not present and an argument is given,
+the first argument is taken to be the pathname of a script to
+execute.  The remaining arguments are assigned to the positional
+parameters.  The following flags are interpreted by the shell
+when invoked:
+
+startitem()
+item(tt(-c) var(string))(
+Read commands from var(string).
+)
+item(tt(-i))(
+Force shell to be interactive.
+)
+item(tt(-s))(
+Read command from the standard input.
+)
+enditem()
diff --git a/Doc/Zsh/jobs.yo b/Doc/Zsh/jobs.yo
new file mode 100644
index 000000000..752181f02
--- /dev/null
+++ b/Doc/Zsh/jobs.yo
@@ -0,0 +1,91 @@
+texinode(Jobs & Signals)(Arithmetic Evaluation)(Functions)(Top)
+chapter(Jobs & Signals)
+sect(Jobs)
+cindex(jobs)
+If the tt(MONITOR) option is set,
+an interactive shell associates a em(job) with each pipeline.
+It keeps a table of current jobs, printed by the tt(jobs)
+command, and assigns them small integer numbers.
+When a job is started asynchronously with `tt(&)',
+the shell prints a line which looks like:
+
+nofill(tt([1] 1234))
+
+indicating that the job which was started asynchronously was job number
+1 and had one (top-level) process, whose process ID was 1234.
+
+If a job is started with `tt(&|)' or `tt(&!)',
+then that job is immediately disowned.  After startup, it
+does not have a place in the job table, and is not subject
+to the job control features described here.
+
+If you are running a job and wish to do something else you may hit the key
+^Z (control-Z) which sends a tt(TSTP) signal to the current job.
+cindex(jobs, suspending)
+cindex(suspending jobs)
+The shell will then normally indicate that the job has been `suspended',
+and print another prompt.  You can then manipulate the state of this job,
+findex(bg, use of)
+putting it in the background with the tt(bg) command, or run some other
+commands and then eventually bring the job back into the foreground with
+findex(fg, use of)
+the foreground command tt(fg).  A ^Z takes effect immediately and
+is like an interrupt in that pending output and unread input are discarded
+when it is typed.
+
+A job being run in the background will suspend if it tries to read
+from the terminal.
+cindex(background jobs, I/O)
+cindex(jobs, background, I/O)
+Background jobs are normally allowed to produce output,
+but this can be disabled by giving the command `tt(stty tostop)'.
+If you set this
+tty option, then background jobs will suspend when they try to produce
+output like they do when they try to read input.
+
+cindex(jobs, referring to)
+cindex(referring to jobs)
+There are several ways to refer to jobs in the shell.
+A job can be referred to by the process ID of any process of the job
+or by one of the following:
+
+startsitem()
+sitem(tt(%)var(number))(The job with the given number.)
+sitem(tt(%)var(string))(Any job whose command line begins with var(string).)
+sitem(tt(%?)var(string))(Any job whose command line contains var(string).)
+sitem(tt(%%))(Current job.)
+sitem(tt(%PLUS()))(Equivalent to `tt(%%)'.)
+sitem(tt(%-))(Previous job.)
+endsitem()
+
+The shell learns immediately whenever a process changes state.
+pindex(NOTIFY, use of)
+It normally informs you whenever a job becomes blocked so that
+no further progress is possible.  If the tt(NOTIFY) option is not set,
+it waits until just before it prints a prompt before it informs you.
+
+When the monitor mode is on, each background job that completes
+triggers any trap set for tt(CHLD).
+
+When you try to leave the shell while jobs are running or suspended, you will
+be warned that `You have suspended (running) jobs'.
+You may use the tt(jobs) command to see what they are.
+If you do this or immediately try to
+exit again, the shell will not warn you a second time; the suspended
+jobs will be terminated, and the running jobs will be sent
+a tt(SIGHUP) signal, if the tt(HUP) option is set.
+pindex(HUP, use of)
+
+cindex(jobs, disowning)
+cindex(disowning jobs)
+findex(disown, use of)
+To avoid having the shell terminate the running jobs, either
+use the bf(nohup) command (see manref(nohup)(1))
+or the tt(disown) builtin.
+sect(Signals)
+The tt(INT) and tt(QUIT) signals for an invoked
+command are ignored if the command is followed by
+`tt(&)' and the tt(MONITOR) option is not active.
+Otherwise, signals have the values
+inherited by the shell from its parent
+(but see the tt(TRAP)var(NAL) special functions in noderef(Functions)).
diff --git a/Doc/Zsh/metafaq.yo b/Doc/Zsh/metafaq.yo
new file mode 100644
index 000000000..a9e0bbecf
--- /dev/null
+++ b/Doc/Zsh/metafaq.yo
@@ -0,0 +1,142 @@
+startmenu()
+menu(Author)
+menu(Availability)
+menu(Mailing Lists)
+menu(The Zsh FAQ)
+menu(The Zsh Web Page)
+menu(See Also)
+endmenu()
+texinode(Author)(Availability)()(Introduction)
+sect(Author)
+cindex(author)
+Zsh was originally written by Paul Falstad tt(<pf@zsh.org>).
+Zsh is now maintained by the members of the zsh-workers mailing
+list tt(<zsh-workers@math.gatech.edu>).  The development is currently
+coordinated by Andrew Main (Zefram) tt(<zefram@zsh.org>).  The coordinator
+can be contacted at tt(<coordinator@zsh.org>), but matters relating to
+the code should generally go to the mailing list.
+texinode(Availability)(Mailing Lists)(Author)(Introduction)
+sect(Availability)
+Zsh is available from the following anonymous FTP sites.  These mirror
+sites are kept frequently up to date.  The sites marked with em((G))
+may be mirroring tt(ftp.math.gatech.edu) instead of the primary site.
+The sites marked with em((H)) may be mirroring tt(ftp.cs.elte.hu)
+instead of the primary site.
+
+startitem()
+item(Primary site)(
+nofill(tt(ftp://ftp.zsh.org/pub/zsh/)
+tt(http://www.zsh.org/pub/zsh/))
+)
+item(Australia)(
+nofill(tt(ftp://ftp.zsh.org/pub/zsh/)
+tt(http://www.zsh.org/pub/zsh/)
+tt(ftp://ftp.ips.oz.au/pub/packages/zsh/)  em((G))  em((H)))
+)
+item(Denmark)(
+nofill(tt(ftp://sunsite.auc.dk/pub/unix/shells/zsh/))
+)
+item(Finland)(
+nofill(tt(ftp://ftp.funet.fi/pub/unix/shells/zsh/)  em((H)))
+)
+item(France)(
+nofill(tt(ftp://ftp.cenatls.cena.dgac.fr/pub/shells/zsh/))
+)
+item(Germany)(
+nofill(tt(ftp://ftp.fu-berlin.de/pub/unix/shells/zsh/)  em((H))
+tt(ftp://ftp.gmd.de/packages/zsh/)  em((H))
+tt(ftp://ftp.uni-trier.de/pub/unix/shell/zsh/)  em((H)))
+)
+item(Hungary)(
+nofill(tt(ftp://ftp.cs.elte.hu/pub/zsh/)
+tt(http://www.cs.elte.hu/pub/zsh/)
+tt(ftp://ftp.kfki.hu/pub/packages/zsh/)  em((H)))
+)
+item(Israel)(
+nofill(tt(ftp://ftp.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
+tt(http://www.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/))
+)
+item(Japan)(
+nofill(tt(ftp://ftp.tohoku.ac.jp/mirror/zsh/)  em((H))
+tt(ftp://ftp.nis.co.jp/pub/shells/zsh/)  em((H)))
+)
+item(Norway)(
+nofill(tt(ftp://ftp.uit.no/pub/unix/shells/zsh/)  em((H)))
+)
+item(Romania)(
+nofill(tt(ftp://ftp.roedu.net/pub/mirrors/ftp.zsh.org/pub/zsh/))
+)
+item(Slovenia)(
+nofill(tt(ftp://ftp.siol.net/pub/unix/shells/zsh/)  em((H)))
+)
+item(Sweden)(
+nofill(tt(ftp://ftp.lysator.liu.se/pub/unix/zsh/)  em((H)))
+)
+item(UK)(
+nofill(tt(ftp://ftp.net.lut.ac.uk/zsh/)  em((H))
+tt(ftp://sunsite.doc.ic.ac.uk/packages/unix/shells/zsh/)  em((G)))
+)
+item(USA)(
+nofill(tt(ftp://ftp.math.gatech.edu/pub/zsh/)
+tt(ftp://uiarchive.uiuc.edu/pub/packages/shells/zsh/)
+tt(ftp://ftp.sterling.com/zsh/)  em((G))  em((H))
+tt(ftp://ftp.rge.com/pub/shells/zsh/)  em((G))  em((H))
+tt(ftp://foad.org/pub/zsh/)
+tt(http://foad.org/zsh/))
+)
+enditem()
+texinode(Mailing Lists)(The Zsh FAQ)(Availability)(Introduction)
+sect(Mailing Lists)
+cindex(mailing lists)
+Zsh has 3 mailing lists:
+
+startitem()
+item(tt(<zsh-announce@math.gatech.edu>))(
+Announcements about releases, major changes in the shell and the
+monthly posting of the Zsh FAQ.  (moderated)
+)
+item(tt(<zsh-users@math.gatech.edu>))(
+User discussions.
+)
+item(tt(<zsh-workers@math.gatech.edu>))(
+Hacking, development, bug reports and patches.
+)
+enditem()
+
+To subscribe, send mail with the SUBJECT `tt(subscribe) var(<e-mail-address>)'
+to the associated administrative address for the mailing list.
+
+startlist()
+list(tt(<zsh-announce-request@math.gatech.edu>))
+list(tt(<zsh-users-request@math.gatech.edu>))
+list(tt(<zsh-workers-request@math.gatech.edu>))
+endlist()
+
+Unsubscribing is done similarly.
+
+YOU ONLY NEED TO JOIN ONE OF THE MAILING LISTS AS THEY ARE NESTED.
+All submissions to bf(zsh-announce) are automatically forwarded to
+bf(zsh-users).  All submissions to bf(zsh-users) are automatically
+forwarded to bf(zsh-workers).
+
+If you have problems subscribing/unsubscribing to any of the mailing
+lists, send mail to tt(<listmaster@zsh.org>).  The mailing lists are
+maintained by Richard Coleman tt(<coleman@zsh.org>).
+
+The mailing lists are archived; the archives can be accessed via the
+administrative addresses listed above.  There is also a hypertext
+archive, maintained by Geoff Wing tt(<gcw@zsh.org>), available at
+tt(http://www.zsh.org/mla/).
+texinode(The Zsh FAQ)(The Zsh Web Page)(Mailing Lists)(Introduction)
+sect(The Zsh FAQ)
+Zsh has a list of Frequently Asked Questions (FAQ), maintained by
+Peter Stephenson tt(<pws@zsh.org>).  It is regularly posted to the
+newsgroup bf(comp.unix.shell) and the bf(zsh-announce) mailing list.
+The latest version can be found at any of the Zsh FTP sites, or at
+tt(http://www.zsh.org/FAQ/).  The contact address for FAQ-related matters
+is tt(<faqmaster@zsh.org>).
+texinode(The Zsh Web Page)(See Also)(The Zsh FAQ)(Introduction)
+sect(The Zsh Web Page)
+Zsh has a web page which is located at tt(http://www.zsh.org/).  This is
+maintained by Karsten Thygesen tt(<karthy@zsh.org>), of SunSITE Denmark.
+The contact address for web-related matters is tt(<webmaster@zsh.org>).
diff --git a/Doc/Zsh/mod_cap.yo b/Doc/Zsh/mod_cap.yo
new file mode 100644
index 000000000..f6513b314
--- /dev/null
+++ b/Doc/Zsh/mod_cap.yo
@@ -0,0 +1,28 @@
+texinode(The cap Module)(The clone Module)()(Zsh Modules)
+sect(The cap Module)
+The tt(cap) module is used for manipulating POSIX.1e (POSIX.6) capability
+sets.  If the operating system does not support this interface, the
+builtins defined by this module will do nothing.
+The builtins in this module are:
+
+startitem()
+findex(cap)
+cindex(capabilities, setting)
+item(tt(cap) [ var(capabilities) ])(
+Change the shell's process capability sets to the specified var(capabilities),
+otherwise display the shell's current capabilities.
+)
+findex(getcap)
+cindex(capabilities, getting from files)
+item(tt(getcap) var(filename) ...)(
+This is a built-in implementation of the POSIX standard utility.  It displays
+the capability sets on each specified var(filename).
+)
+findex(setcap)
+cindex(capabilities, setting on files)
+item(tt(setcap) var(capabilities) var(filename) ...)(
+This is a built-in implementation of the POSIX standard utility.  It sets
+the capability sets on each specified var(filename) to the specified
+var(capabilities).
+)
+enditem()
diff --git a/Doc/Zsh/mod_clone.yo b/Doc/Zsh/mod_clone.yo
new file mode 100644
index 000000000..9bb7dc255
--- /dev/null
+++ b/Doc/Zsh/mod_clone.yo
@@ -0,0 +1,19 @@
+texinode(The clone Module)(The comp1 Module)(The cap Module)(Zsh Modules)
+sect(The clone Module)
+The tt(clone) module makes available one builtin command:
+
+startitem()
+findex(clone)
+cindex(shell, cloning)
+cindex(cloning the shell)
+cindex(terminal)
+item(tt(clone) var(tty))(
+Creates a forked instance of the current shell, attached to the specified
+var(tty).  In the new shell, the tt(PID), tt(PPID) and tt(TTY) special
+parameters are changed appropriately.  tt($!) is set to zero in the new
+shell, and to the new shell's PID in the original shell.
+
+The return value of the builtin is zero in both shells if successful,
+and non-zero on error.
+)
+enditem()
diff --git a/Doc/Zsh/mod_comp1.yo b/Doc/Zsh/mod_comp1.yo
new file mode 100644
index 000000000..879b6d927
--- /dev/null
+++ b/Doc/Zsh/mod_comp1.yo
@@ -0,0 +1,11 @@
+texinode(The comp1 Module)(The compctl Module)(The clone Module)(Zsh Modules)
+sect(The comp1 Module)
+The tt(comp1) module does nothing that is visible to the user.
+Its purpose is to provide the internal basis of the programmable
+completion mechanism.
+
+This module must be loaded before any module that
+provides a means of controlling completion (such as the tt(compctl)
+module), or that uses completions (such as the tt(zle) module).
+This is done automatically for modules distributed with zsh, and
+for other modules can be effected by the use of tt(zmodload -d).
diff --git a/Doc/Zsh/mod_compctl.yo b/Doc/Zsh/mod_compctl.yo
new file mode 100644
index 000000000..b7adf8fa6
--- /dev/null
+++ b/Doc/Zsh/mod_compctl.yo
@@ -0,0 +1,7 @@
+texinode(The compctl Module)(The deltochar Module)(The comp1 Module)(Zsh Modules)
+sect(The compctl Module)
+The tt(compctl) module makes available one builtin command, tt(compctl),
+which is the standard way to control completions for ZLE.  See
+ifzman(zmanref(zshcompctl))\
+ifnzman(noderef(Programmable Completion))\
+.
diff --git a/Doc/Zsh/mod_deltochar.yo b/Doc/Zsh/mod_deltochar.yo
new file mode 100644
index 000000000..f92a3da0d
--- /dev/null
+++ b/Doc/Zsh/mod_deltochar.yo
@@ -0,0 +1,12 @@
+texinode(The deltochar Module)(The example Module)(The compctl Module)(Zsh Modules)
+sect(The deltochar Module)
+The tt(deltochar) module makes available one ZLE function:
+
+startitem()
+tindex(delete-to-char)
+item(tt(delete-to-char))(
+Read a character from the keyboard, and
+delete from the cursor position up to and including the next
+(or, with repeat count var(n), the var(n)th) instance of that character.
+)
+enditem()
diff --git a/Doc/Zsh/mod_example.yo b/Doc/Zsh/mod_example.yo
new file mode 100644
index 000000000..5339253d9
--- /dev/null
+++ b/Doc/Zsh/mod_example.yo
@@ -0,0 +1,16 @@
+texinode(The example Module)(The files Module)(The deltochar Module)(Zsh Modules)
+sect(The example Module)
+The tt(example) module makes available one builtin command:
+
+startitem()
+findex(example)
+cindex(modules, example)
+cindex(modules, writing)
+cindex(writing modules)
+item(tt(example) [ tt(-flags) ] [ var(args) ... ])(
+Displays the flags and arguments it is invoked with.
+)
+enditem()
+
+The purpose of the module is to serve as an example of how to write a
+module.
diff --git a/Doc/Zsh/mod_files.yo b/Doc/Zsh/mod_files.yo
new file mode 100644
index 000000000..541ebb4a9
--- /dev/null
+++ b/Doc/Zsh/mod_files.yo
@@ -0,0 +1,100 @@
+texinode(The files Module)(The sched Module)(The example Module)(Zsh Modules)
+sect(The files Module)
+cindex(files, manipulating)
+The tt(files) module makes some standard commands available as builtins:
+
+startitem()
+findex(ln)
+xitem(tt(ln) [ tt(-dfis) ] var(filename) var(dest))
+item(tt(ln) [ tt(-dfis) ] var(filename) ... var(dir))(
+Creates hard (or, with tt(-s), symbolic) links.  In the first form, the
+specified var(dest)ination is created, as a link to the specified
+var(filename).  In the second form, each of the var(filename)s is
+taken in turn, and linked to a pathname in the specified var(dir)ectory
+that has the same last pathname component.
+
+Normally, tt(ln) will not attempt to create hard links to
+directories.  This check can be overridden using the tt(-d) option.
+Typically only the super-user can actually succeed in creating
+hard links to directories.
+This does not apply to symbolic links in any case.
+
+By default, existing files cannot be replaced by links.
+The tt(-i) option causes the user to be queried about replacing
+existing files.  The tt(-f) option causes existing files to be
+silently deleted, without querying.  tt(-f) takes precedence.
+)
+findex(mkdir)
+item(tt(mkdir) [ tt(-p) ] [ tt(-m) var(mode) ] var(dir) ...)(
+Creates directories.  With the tt(-p) option, non-existing parent
+directories are first created if necessary, and there will be
+no complaint if the directory already exists.
+The tt(-m) option can be used to specify (in octal) a set of file permissions
+for the created directories, otherwise mode 777 modified by the current
+tt(umask) (see manref(umask)(2)) is used.
+)
+findex(mv)
+xitem(tt(mv) [ tt(-fi) ] var(filename) var(dest))
+item(tt(mv) [ tt(-fi) ] var(filename) ... var(dir))(
+Moves files.  In the first form, the specified var(filename) is moved
+to the specified var(dest)ination.  In the second form, each of the
+var(filename)s is
+taken in turn, and moved to a pathname in the specified var(dir)ectory
+that has the same last pathname component.
+
+By default, the user will be queried before replacing any file
+that the user cannot write to, but writable files will be silently
+removed.
+The tt(-i) option causes the user to be queried about replacing
+any existing files.  The tt(-f) option causes any existing files to be
+silently deleted, without querying.  tt(-f) takes precedence.
+
+Note that this tt(mv) will not move files across devices.
+Historical versions of tt(mv), when actual renaming is impossible,
+fall back on copying and removing files; if this behaviour is desired,
+use tt(cp) and tt(rm) manually.  This may change in a future version.
+)
+findex(rm)
+item(tt(rm) [ tt(-dfirs) ] var(filename) ...)(
+Removes files and directories specified.
+
+Normally, tt(rm) will not remove directories (except with the tt(-r)
+option).  The tt(-d) option causes tt(rm) to try removing directories
+with tt(unlink) (see manref(unlink)(2)), the same method used for files.
+Typically only the super-user can actually succeed in unlinking
+directories in this way.
+tt(-d) takes precedence over tt(-r).
+
+By default, the user will be queried before removing any file
+that the user cannot write to, but writable files will be silently
+removed.
+The tt(-i) option causes the user to be queried about removing
+any files.  The tt(-f) option causes files to be
+silently deleted, without querying, and suppresses all error indications.
+tt(-f) takes precedence.
+
+The tt(-r) option causes tt(rm) to recursively descend into directories,
+deleting all files in the directory before removing the directory with
+the tt(rmdir) system call (see manref(rmdir)(2)).
+
+The tt(-s) option is a zsh extension to tt(rm) functionality.  It enables
+paranoid behaviour, intended to avoid common security problems involving
+a root-run tt(rm) being tricked into removing files other than the ones
+intended.  It will refuse to follow symbolic links, so that (for example)
+``tt(rm /tmp/foo/passwd)'' can't accidentally remove tt(/etc/passwd)
+if tt(/tmp/foo) happens to be a link to tt(/etc).  It will also check
+where it is after leaving directories, so that a recursive removal of
+a deep directory tree can't end up recursively removing tt(/usr) as
+a result of directories being moved up the tree.
+)
+findex(rmdir)
+item(tt(rmdir) var(dir) ...)(
+Removes empty directories specified.
+)
+findex(sync)
+item(tt(sync))(
+Calls the system call of the same name (see manref(sync)(2)), which
+flushes dirty buffers to disk.  It might return before the I/O has
+actually been completed.
+)
+enditem()
diff --git a/Doc/Zsh/mod_sched.yo b/Doc/Zsh/mod_sched.yo
new file mode 100644
index 000000000..1be550a79
--- /dev/null
+++ b/Doc/Zsh/mod_sched.yo
@@ -0,0 +1,17 @@
+texinode(The sched Module)(The stat Module)(The files Module)(Zsh Modules)
+sect(The sched Module)
+The tt(sched) module makes available one builtin command:
+
+startitem()
+findex(sched)
+cindex(timed execution)
+cindex(execution, timed)
+xitem(tt(sched) [tt(PLUS())]var(hh)tt(:)var(mm) var(command) ...)
+item(tt(sched) [ tt(-)var(item) ])(
+Make an entry in the scheduled list of commands to execute.
+The time may be specified in either absolute or relative time.
+With no arguments, prints the list of scheduled commands.
+With the argument `tt(-)var(item)', removes the given item
+from the list.
+)
+enditem()
diff --git a/Doc/Zsh/mod_stat.yo b/Doc/Zsh/mod_stat.yo
new file mode 100644
index 000000000..22fbe2a73
--- /dev/null
+++ b/Doc/Zsh/mod_stat.yo
@@ -0,0 +1,145 @@
+texinode(The stat Module)(The zle Module)(The sched Module)(Zsh Modules)
+sect(The stat Module)
+The tt(stat) module makes available one builtin command:
+
+startitem()
+findex(stat)
+cindex(files, listing)
+cindex(files, examining)
+item(tt(stat) [ tt(-gnNlLtTrs) ] [ tt(-f) var(fd) ] [ tt(-A) var(array) ] \
+    [ tt(-F) var(fmt) ] [ tt(PLUS())var(element) ] [ var(file) ... ])(
+The command acts as a front end to the tt(stat) system call (see
+manref(stat)(2)).
+If the tt(stat) call fails, the appropriate system error message
+printed and status 1 is returned.
+The fields of tt(struct stat) give information about
+the files provided as arguments to the command.  In addition to those
+available from the tt(stat) call, an extra element `tt(link)' is provided.
+These elements are:
+
+startitem()
+item(tt(device))(
+The number of the device on which the file resides.
+)
+item(tt(inode))(
+The unique number of the file on this device (`em(inode)' number).
+)
+item(tt(mode))(
+The mode of the file; that is, the file's type and access permissions.
+With the tt(-s) option, this will
+be returned as a string corresponding to the first column in the
+display of the tt(ls -l) command.
+)
+item(tt(nlink))(
+The number of hard links to the file.
+)
+item(tt(uid))(
+The user ID of the owner of the file.  With the tt(-s)
+option, this is displayed as a user name.
+)
+item(tt(gid))(
+The group ID of the file.  With the tt(-s) option, this
+is displayed as a group name.
+)
+item(tt(rdev))(
+The raw device number.  This is only useful for special devices.
+)
+item(tt(size))(
+The size of the file in bytes.
+)
+xitem(tt(atime))
+xitem(tt(mtime))
+item(tt(ctime))(
+The last access, modification and inode change times
+of the file, respectively, as the number of seconds since
+midnight GMT on 1st January, 1970.  With the tt(-s) option,
+these are printed as strings for the local time zone; the format
+can be altered with the tt(-F) option, and with the tt(-g)
+option the times are in GMT.
+)
+item(tt(blksize))(
+The number of bytes in one allocation block on the
+device on which the file resides.
+)
+item(tt(block))(
+The number of disk blocks used by the file.
+)
+item(tt(link))(
+If the file is a link and the tt(-L) option is in
+effect, this contains the name of the file linked to, otherwise
+it is empty.  Note that if this element is selected (``tt(stat PLUS()link)'')
+then the tt(-L) option is automatically used.
+)
+enditem()
+
+A particular element may be selected by including its name
+preceded by a `tt(PLUS())' in the option list; only one element is allowed.
+The element may be shortened to any unique set of leading
+characters.  Otherwise, all elements will be shown for all files.
+
+Options:
+
+startitem()
+item(tt(-A) var(array))(
+Instead of displaying the results on standard
+output, assign them to an var(array), one tt(struct stat) element per array
+element for each file in order.  In this case neither the name
+of the element nor the name of the files is provided unless the
+tt(-t) or tt(-n) options are provided, respectively.  In the
+former case the element name appears as a prefix to the
+appropriate array element and in the latter case the file name
+appears as a separate array element preceding all the others.
+Other formatting options are respected.
+)
+item(tt(-f) var(fd))(
+Use the file on file descriptor var(fd) instead of
+named files; no list of file names is allowed in this case.
+)
+item(tt(-F) var(fmt))(
+Supplies a tt(strftime) (see manref(strftime)(3)) string for the
+formatting of the time elements.  The tt(-s) option is implied.
+)
+item(tt(-g))(
+Show the time elements in the GMT time zone.  The
+tt(-s) option is implied.
+)
+item(tt(-l))(
+List the names of the type elements (to standard
+output or an array as appropriate) and return immediately;
+options other than tt(-A) and arguments are ignored.
+)
+item(tt(-L))(
+Perform an tt(lstat) (see manref(lstat)(2)) rather than a tt(stat)
+system call.  In this case, if the file is a link, information
+about the link itself rather than the target file is returned.
+This option is required to make the tt(link) element useful.
+)
+item(tt(-n))(
+Always show the names of files.  Usually these are
+only shown when output is to standard output and there is more
+than one file in the list.
+)
+item(tt(-N))(
+Never show the names of files.
+)
+item(tt(-r))(
+Print raw data (the default format) alongside string
+data (the tt(-s) format); the string data appears in parentheses
+after the raw data.
+)
+item(tt(-s))(
+Print tt(mode), tt(uid), tt(gid) and the three time
+elements as strings instead of numbers.  In each case the format
+is like that of tt(ls -l).
+)
+item(tt(-t))(
+Always show the type names for the elements of
+tt(struct stat).  Usually these are only shown when output is to
+standard output and no individual element has been selected.
+)
+item(tt(-T))(
+Never show the type names of the tt(struct stat) elements.
+)
+enditem()
+)
+enditem()
diff --git a/Doc/Zsh/mod_zftp.yo b/Doc/Zsh/mod_zftp.yo
new file mode 100644
index 000000000..a15be60d6
--- /dev/null
+++ b/Doc/Zsh/mod_zftp.yo
@@ -0,0 +1,421 @@
+texinode(The zftp Module)(The zle Module)(The stat Module)(Zsh Modules)
+sect(The zftp Module)
+The tt(zftp) module makes available one builtin command:
+
+startitem()
+findex(zftp)
+cindex(FTP)
+cindex(files, transferring)
+item(tt(zftp) var(subcommand) [ var(args) ])(
+The tt(zftp) module is a client for FTP (file transfer protocol).  It
+is implemented as a builtin to allow full use of shell command line
+editing, file I/O, and job control mechanisms.  Often, users will
+access it via shell functions providing higher level abilities such as
+username and password lookup.  However, it is entirely usable in its
+own right.
+
+All commands consist of the command name tt(zftp) followed by the name
+of a subcommand.  These are listed below.  The return status of each
+subcommand is supposed to reflect the success or failure of the remote
+operation.  See a description of the variable tt(ZFTP_VERBOSE) for
+more information on how responses from the server may be printed.
+)
+enditem()
+
+subsect(Subcommands)
+cindex(zftp, subcommands)
+
+startitem()
+cindex(FTP, starting a session)
+item(tt(open) var(host) [ var(user) [ var(password) [ var(account) ] ] ])(
+Open a new FTP session to var(host), which may be the name of a TCP/IP
+connected host or an IP number in the standard dot notation.
+Remaining arguments are passed to the tt(login) subcommand.  Note that
+if no arguments beyond var(host) are supplied, tt(open) will em(not)
+automatically call tt(login).  If no arguments at all are supplied,
+tt(open) will use the parameters set by the tt(params) subcommand.
+
+After a successful open, the shell variables tt(ZFTP_HOST),
+tt(ZFTP_IP) and tt(ZFTP_SYSTEM) are available; see `Variables'
+below.
+)
+xitem(tt(login) [ var(name) [ var(password) [ var(account) ] ] ])
+item(tt(user) [ var(name) [ var(password) [ var(account) ] ] ])(
+Login the user var(name) with parameters var(password) and var(account).
+Any of the parameters can be omitted, and will be read from standard
+input if needed (var(name) is always needed).  If 
+standard input is a terminal, a prompt for each one will be printed on
+standard error and var(password) will not be echoed.  If any of the
+parameters are not used, a warning message is printed.
+
+After a successful login, the shell variables tt(ZFTP_USER),
+tt(ZFTP_ACCOUNT) and tt(ZFTP_PWD) are available; see `Variables'
+below.
+
+This command may be re-issued when a user is already logged in, and
+the server will first be reinitialized for a new user.
+)
+xitem(tt(params) [ var(host) [ var(user) [ var(password) \
+[ var(account) ] ] ] ])
+item(tt(params) tt(-))(
+Store the given parameters for a later tt(open) command with no
+arguments.  Only those given on the command line will be remembered.
+Any of the parameters may, however, be specified as a `tt(?)', which
+may need to be quoted to protect it from shell expansion:  in this case,
+the appropriate parameter will be read from stdin as with the
+tt(login) subcommand, including special handling of var(password).
+
+If no arguments are given, the parameters currently set are printed,
+although the password will appear as a line of stars.
+
+If instead a single `tt(-)' is given, the existing parameters, if any,
+are deleted.  In that case, calling tt(open) with no arguments will
+cause an error.
+
+The list of parameters is not deleted after a tt(close), however it
+will be deleted if the tt(zftp) module is unloaded.
+
+For example,
+
+nofill(tt(zftp params ftp.elsewhere.xx juser '?'))
+
+will store the host tt(ftp.elsewhere.xx) and the user tt(juser) and
+then prompt the user for the corresponding password.
+
+This command may also be used to set up a transfer which then takes
+place completely in the background, freeing tt(zftp) for concurrent
+foreground use.  For example,
+
+nofill(tt(zftp params ftp.soreeyes.ca bubble squeak))
+nofill(tt(LPAR()zftp open; zftp get foo >bar; zftp close)tt(RPAR() &))
+
+--- here, the connection is restricted to a background subshell and
+you are free to open a simultaneous connection in the foreground.
+)
+item(tt(cd) var(directory))(
+Change the remote directory to var(directory).  Also alters the shell
+variable tt(ZFTP_PWD).
+)
+item(tt(cdup))(
+Change the remote directory to the one higher in the directory tree.
+Note that tt(cd ..) will also work correctly on non-UNIX systems.
+)
+item(tt(dir) [ var(args...) ])(
+Give a (verbose) listing of the remote directory.  The var(args) are
+passed directly to the server. The command's behaviour is implementation
+dependent, but a UNIX server will typically interpret var(args) as
+arguments to the tt(ls) command and with no arguments return the
+result of `tt(ls -l)'. The directory is listed to standard output.
+)
+item(tt(ls) [ var(args) ])(
+Give a (short) listing of the remote directory.  With no var(args),
+produces a raw list of the files in the directory, one per line.
+Otherwise, up to vagaries of the server implementation, behaves
+similar to tt(dir).
+)
+item(tt(type) [ var(type) ])(
+Change the type for transfer to var(type), or print the current type
+if var(type) is absent.  The allowed values are `tt(A)' (ASCII),
+`tt(I)' (Image, i.e. binary), or `tt(B)' (a synonym for `tt(I)').
+
+The FTP default for a transfer is ASCII.  However, if tt(zftp) finds
+that the remote host is a UNIX machine with 8-bit byes, it will
+automatically switch to using binary for file transfers upon
+tt(open).  This can subsequently be overridden.
+
+The transfer type is only passed to the remote host when a data
+connection is established; this command involves no network overhead.
+)
+item(tt(ascii))(
+The same as tt(type A).
+)
+item(tt(binary))(
+The same as tt(type I).
+)
+item(tt(mode) [ tt(S) | tt(B) ])(
+Set the mode type to stream (tt(S)) or block (tt(B)).  Stream mode is
+the default; block mode is not widely supported.
+)
+xitem(tt(remote) var(files...))
+item(tt(local) [ var(files...) ])(
+Print the size and last modification time of the remote or local
+files.  If there is more than one item on the list, the name of the
+file is printed first.  The first number is the file size, the second
+is the last modification time of the file in the format
+tt(CCYYMMDDhhmmSS) consisting of year, month, date, hour, minutes and
+seconds in GMT.  Note that this format, including the length, is
+guaranteed, so that time strings can be directly compared via the
+tt([[) builtin's tt(<) and tt(>) operators, even if they are too long
+to be represented as integers.
+
+Not all servers support the commands for retrieving this information.
+In that case, the tt(remote) command will print nothing and return
+status 2, compared with status 1 for a file not found.
+
+The tt(local) command (but not tt(remote)) may be used with no
+arguments, in which case the information comes from examining file
+descriptor zero.  This is the same file as seen by a tt(put) command
+with no further redirection.
+)
+item(tt(get) var(file) [...])(
+Retrieve all var(file)s from the server, concatenating them
+and sending them to standard output.
+)
+item(tt(put) var(file) [...])(
+For each var(file), read a file from standard input and send that to
+the remote host with the given name.
+)
+item(tt(append) var(file) [...])(
+As tt(put), but if the remote var(file) already exists, data is
+appended to it instead of overwriting it.
+)
+xitem(tt(getat) var(file) var(point))
+xitem(tt(putat) var(file) var(point))
+item(tt(appendat) var(file) var(point))(
+Versions of tt(get), tt(put) and tt(append) which will start the
+transfer at the given var(point) in the remote var(file).  This is
+useful for appending to an incomplete local file.  However, note that
+this ability is not universally supported by servers (and is not quite
+the behaviour specified by the standard).
+)
+item(tt(delete) var(file) [...])(
+Delete the list of files on the server.
+)
+item(tt(mkdir) var(directory))(
+Create a new directory var(directory) on the server.
+)
+item(tt(rmdir) var(directory))(
+Delete the diretory var(directory)  on the server.
+)
+item(tt(rename) var(old-name) var(new-name))(
+Rename file var(old-name) to var(new-name) on the server.
+)
+item(tt(site) var(args...))(
+Send a host-specific command to the server.  You will probably
+only need this if instructed by the server to use it.
+)
+item(tt(quote) var(args...))(
+Send the raw FTP command sequence to the server.  You should be
+familiar with the FTP command set as defined in RFC959 before doing
+this.  Useful comands may include tt(STAT) and tt(HELP).  Note also
+the mechanism for returning messages as described for the variable
+tt(ZFTP_VERBOSE) below, in particular that all messages from the
+control connection are sent to standard error.
+)
+xitem(tt(close))
+item(tt(quit))(
+Close the current data connection.  This unsets the shell parameters
+tt(ZFTP_HOST), tt(ZFTP_IP), tt(ZFTP_SYSTEM), tt(ZFTP_USER),
+tt(ZFTP_ACCOUNT) and tt(ZFTP_PWD).
+)
+enditem()
+
+subsect(Parameters)
+cindex(zftp, parameters)
+The following shell parameters are used by tt(zftp).  Currently none
+of them are special.
+
+startitem()
+item(tt(ZFTP_TMOUT))(
+Integer.  The time in seconds to wait for a network operation to
+complete before returning an error.  If this is not set when the
+module is loaded, it will be given the default value 60.  A value of
+zero turns off timeouts.  If a timeout occurs on the control
+connection it will be closed.  Use a larger value if this occurs too
+frequently.
+)
+vindex(ZFTP_IP)
+item(tt(ZFTP_IP))(
+Readonly.  The IP address of the current connection in dot notation.
+)
+vindex(ZFTP_HOST)
+item(tt(ZFTP_HOST))(
+Readonly.  The hostname of the current remote server.  If the host was
+opened as an IP number, tt(ZFTP_HOST) contains that instead; this
+saves the overhead for a name lookup, as IP numbers are most commonly
+used when a nameserver is unavailable.
+)
+vindex(ZFTP_SYSTEM)
+item(tt(ZFTP_SYSTEM))(
+Readonly.  The system type string returned by the server in response
+to an FTP tt(SYST) request.  The most interesting case is a string
+beginning tt("UNIX Type: L8"), which ensures maximum compatibility
+with a local UNIX host.
+)
+vindex(ZFTP_TYPE)
+item(tt(ZFTP_TYPE))(
+Readonly.  The type to be used for data transfers , either `tt(A)' or
+`tt(I)'.   Use the tt(type) subcommand to change this.
+)
+vindex(ZFTP_USER)
+item(tt(ZFTP_USER))(
+Readonly.  The username currently logged in, if any.
+)
+vindex(ZFTP_ACCT)
+item(tt(ZFTP_ACCT))(
+Readonly.  The account name of the current user, if any.  Most servers
+do not require an account name.
+)
+vindex(ZFTP_PWD)
+item(tt(ZFTP_PWD))(
+Readonly.  The current directory on the server.
+)
+vindex(ZFTP_CODE)
+item(tt(ZFTP_CODE))(
+Readonly.  The three digit code of the last FTP reply from the server
+as a string.  This can still be read after the connection is closed.
+)
+vindex(ZFTP_REPLY)
+item(tt(ZFTP_REPLY))(
+Readonly.  The last line of the last reply sent by the server.  This
+can still be read after the connection is closed.
+)
+vindex(ZFTP_PREFS)
+item(tt(ZFTP_PREFS))(
+A string of preferences for altering aspects of tt(zftp)'s behaviour.
+Each preference is a single character.  The following are defined:
+
+startitem()
+item(tt(P))(
+Passive:  attempt to make the remote server initiate data transfers.
+This is slightly more efficient than sendport mode.  If the letter
+tt(S) occurs later in the string, tt(zftp) will use sendport mode if
+passive mode is not available.
+)
+item(tt(S))(
+Sendport:  initiate transfers by the FTP tt(PORT) command.  If this
+occurs before any tt(P) in the string, passive mode will never be
+attempted.
+)
+item(tt(D))(
+Dumb:  use only the bare minimum of FTP commands.  This prevents
+the variables tt(ZFTP_SYSTEM) and tt(ZFTP_PWD) from being set, and
+will mean all connections default to ASCII type.  It may prevent
+tt(ZFTP_SIZE) from being set during a transfer if the server
+does not send it anyway (many servers do).
+)
+enditem()
+
+If tt(ZFTP_PREFS) is not set when tt(zftp) is loaded, it will be set to a
+default of `tt(PS)', i.e. use passive mode if available, otherwise
+fall back to sendport mode.
+)
+vindex(ZFTP_VERBOSE)
+item(tt(ZFTP_VERBOSE))(
+A string of digits between 0 and 5 inclusive, specifying which
+responses from the server should be printed.  All responses go to
+standard error.  If any of the numbers 1 to 5 appear in the string,
+raw responses from the server with reply codes beginning with that
+digit will be printed to standard error.  The first digit of the three
+digit reply code is defined by RFC959 to correspond to:
+
+startitem()
+item(1.)(
+A positive prelimnary reply.
+)
+item(2.)(
+A positive completion reply.
+)
+item(3.)(
+A positive intermediate reply.
+)
+item(4.)(
+A transient negative completion reply.
+)
+item(5.)(
+A permanent negative completion reply.
+)
+enditem()
+
+It should be noted that, for unknown reasons, the reply `Service not
+available', which forces termination of a connection, is classified as
+421, i.e. `transient negative', an interesting interpretation of the word
+`transient'.
+
+The code 0 is special:  it indicates that all but the last line of
+multiline replies read from the server will be printed to standard
+error in a processed format.  By convention, servers use this
+mechanism for sending information for the user to read.  The
+appropriate reply code, if it matches the same response, takes
+priority.
+
+If tt(ZFTP_VERBOSE) is not set when tt(zftp) is loaded, it will be
+set to the default value tt(450), i.e., messages destined for the user
+and all errors will be printed.  A null string is valid and
+specifies that no messages should be printed.
+)
+enditem()
+
+subsect(Functions)
+cindex(zftp, functions)
+
+startitem()
+findex(zftp_chpwd)
+item(tt(zftp_chpwd))(
+If this function is set by the user, it is called every time the
+directory changes on the server, including when a user is logged
+in, or when a connection is closed.  In the last case, tt($ZFTP_PWD)
+will be unset; otherwise it will reflect the new directory.
+)
+findex(zftp_progress)
+item(tt(zftp_progress))(
+If this function is set by the user, it will be called during
+a tt(get), tt(put) or tt(append) operation each time sufficient data
+has been received from the host.  During a tt(get), the data is sent
+to standard output, so it is vital that this function should write
+to standard error or directly to the terminal, em(not) to standard
+output.
+
+When it is called with a transfer in progress, the following
+additional shell parameters are set:
+
+startitem()
+vindex(ZFTP_FILE)
+item(tt(ZFTP_FILE))(
+The name of the remote file being transferred from or to.
+)
+vindex(ZFTP_TRANSFER)
+item(tt(ZFTP_TRANSFER))(
+A tt(G) for a tt(get) operation and a tt(P) for a tt(put) operation.
+)
+vindex(ZFTP_SIZE)
+item(tt(ZFTP_SIZE))(
+The total size of the complete file being transferred:
+the same as the first value provided by the
+tt(remote) and tt(local) subcommands for a particular file.
+If the server cannot supply this value for a remote file being
+retrieved, it will not be set.  If input is from a pipe the value may
+be incorrect and correspond simply to a full pipe buffer.
+)
+vindex(ZFTP_COUNT)
+item(tt(ZFTP_COUNT))(
+The amount of data so far transferred; a number between zero and
+tt($ZFTP_SIZE), if that is set.  This number is always available.
+)
+enditem()
+
+The function is initially called with tt(ZFTP_TRANSFER) set
+appropriately and tt(ZFTP_COUNT) set to zero.  After the transfer is
+finished, the function will be called one more time with
+tt(ZFTP_TRANSFER) set to tt(GF) or tt(PF), in case it wishes to tidy
+up.  It is otherwise never called twice with the same value of
+tt(ZFTP_COUNT).
+
+Sometimes the progress meter may cause disruption.  It is up to the
+user to decide whether the function should be defined and to use
+tt(unfunction) when necessary.
+)
+
+subsect(Problems)
+cindex(zftp, problems)
+
+With the exception noted for the tt(params) subcommand, a connection
+may not be opened in the left hand side of a pipe as this occurs in a
+subshell and the file information is not updated in the main shell.
+In the case of type or mode changes or closing the connection in a
+subshell, the information is returned but variables are not updated
+until the next call to tt(zftp).  Other status changes in subshells
+will not be reflected by changes to the variables (but should
+be otherwise harmless).
+
+enditem()
diff --git a/Doc/Zsh/mod_zle.yo b/Doc/Zsh/mod_zle.yo
new file mode 100644
index 000000000..9aa03f7f8
--- /dev/null
+++ b/Doc/Zsh/mod_zle.yo
@@ -0,0 +1,193 @@
+texinode(The zle Module)()(The stat Module)(Zsh Modules)
+sect(The zle Module)
+The tt(zle) module contains the Zsh Line Editor.  See
+ifzman(zmanref(zshzle))\
+ifnzman(noderef(Zsh Line Editor))\
+.  It also contains three related builtin commands:
+
+startitem()
+findex(bindkey)
+cindex(keys, rebinding)
+cindex(rebinding keys)
+cindex(keys, binding)
+cindex(binding keys)
+cindex(keymaps)
+xitem(tt(bindkey) [ var(options) ] tt(-l))
+xitem(tt(bindkey) [ var(options) ] tt(-d))
+xitem(tt(bindkey) [ var(options) ] tt(-D) var(keymap) ...)
+xitem(tt(bindkey) [ var(options) ] tt(-A) var(old-keymap new-keymap))
+xitem(tt(bindkey) [ var(options) ] tt(-N) var(new-keymap) [ var(old-keymap) ])
+xitem(tt(bindkey) [ var(options) ] tt(-m))
+xitem(tt(bindkey) [ var(options) ] tt(-r) var(in-string) ...)
+xitem(tt(bindkey) [ var(options) ] tt(-s) var(in-string out-string) ...)
+xitem(tt(bindkey) [ var(options) ] var(in-string command) ...)
+item(tt(bindkey) [ var(options) ] [ var(in-string) ])(
+tt(bindkey)'s options can be divided into three categories: keymap selection,
+operation selection, and others.  The keymap selection options are:
+
+startitem()
+item(tt(-e))(
+Selects keymap `tt(emacs)', and also links it to `tt(main)'.
+)
+item(tt(-v))(
+Selects keymap `tt(viins)', and also links it to `tt(main)'.
+)
+item(tt(-a))(
+Selects keymap `tt(vicmd)'.
+)
+item(tt(-M))(
+The first non-option argument is used as a keymap name,
+and does not otherwise count as an argument.
+)
+enditem()
+
+Some operations do not permit a keymap to be selected.
+If a keymap selection is required and none of the options above are used, the
+`tt(main)' keymap is used.  These operations do not permit a keymap to be
+selected:
+
+startitem()
+item(tt(-l))(
+List all existing keymap names.  If the tt(-L)
+option is used, list in the form of tt(bindkey)
+commands to create the keymaps.
+)
+item(tt(-d))(
+Delete all existing keymaps and reset to the default state.
+)
+item(tt(-D) var(keymap) ...)(
+Delete the named var(keymap)s.
+)
+item(tt(-A) var(old-keymap new-keymap))(
+Make the var(new-keymap) name an alias for var(old-keymap), so that
+both names refer to the same keymap.  The names have equal standing;
+if either is deleted, the other remains.  If there is already a keymap
+with the var(new-keymap) name, it is deleted.
+)
+item(tt(-N) var(new-keymap) [ var(old-keymap) ])(
+Create a new keymap, named var(new-keymap).  If a keymap already has that
+name, it is deleted.  If an var(old-keymap) name is given, the new keymap
+is initialised to be a duplicate of it, otherwise the new keymap will
+be empty.
+)
+enditem()
+
+The following operations require a keymap to be selected:
+
+startitem()
+item(tt(-m))(
+Add the built-in set of meta-key bindings to the selected keymap.
+Only keys that are unbound or bound to tt(self-insert) are affected.
+)
+item(tt(-r) var(in-string) ...)(
+Unbind the specified var(in-string)s in the selected keymap.
+This is exactly equivalent to binding the strings to tt(undefined-key).
+)
+item(tt(-s) var(in-string out-string) ...)(
+Bind each var(in-string) to each var(out-string).
+When var(in-string) is typed, var(out-string) will be
+pushed back and treated as input to the line editor.
+)
+item(var(in-string command) ...)(
+Bind each var(in-string) to each var(command).
+)
+item([ var(in-string) ])(
+List key bindings.  If an var(in-string) is specified, the binding of
+that string in the selected keymap is displayed.  Otherwise, all key
+bindings in the selected keymap are displayed.  As an exception,
+if the tt(-e) or tt(-v) options are used alone, the keymap is em(not)
+displayed - the implicit linking of keymaps is the only thing that happens.
+)
+enditem()
+
+In the binding operations, if the tt(-R) option is used, the var(in-string)s
+are interpreted as ranges, instead of plain strings.  A valid range
+consists of two characters, with an optional `tt(-)'
+between them.  All characters between the two specified, inclusive,
+are bound as specified.
+
+For either var(in-string) or var(out-string), the following
+escape sequences are recognised:
+
+startsitem()
+sitem(tt(\a))(bell character)
+sitem(tt(\b))(backspace)
+sitem(tt(\e), tt(\E))(escape)
+sitem(tt(\f))(form feed)
+sitem(tt(\n))(linefeed (newline))
+sitem(tt(\r))(carriage return)
+sitem(tt(\t))(horizontal tab)
+sitem(tt(\v))(vertical tab)
+sitem(tt(\)var(NNN))(character code in octal)
+sitem(tt(\x)var(NN))(character code in hexadecimal)
+sitem(tt(\M)[tt(-)]var(X))(character with meta bit set)
+sitem(tt(\C)[tt(-)]var(X))(control character)
+sitem(tt(^)var(X))(control character)
+endsitem()
+
+In all other cases, `tt(\)' escapes the following character.  Delete is
+written as `tt(^?)'.  Note that `tt(\M^?)' and `tt(^\M?)' are not the same.
+)
+findex(vared)
+cindex(parameters, editing)
+cindex(editing parameters)
+item(tt(vared) [ tt(-ch) ] [ tt(-p) var(prompt) ] [ tt(-r) var(rprompt) ] var(name))(
+The value of the parameter var(name) is loaded into the edit
+buffer, and the line editor is invoked.  When the editor exits,
+var(name) is set to the string value returned by the editor.
+If the tt(-c) flag is given, the parameter is created if it doesn't
+already exist.
+If the tt(-p) flag is given, the following string will be taken as
+the prompt to display at the left.  If the tt(-r) flag is given,
+the following string gives the prompt to display at the right.  If the
+tt(-h) flag is specified, the history can be accessed from ZLE.
+)
+findex(zle)
+cindex(widgets, rebinding)
+cindex(rebinding widgets)
+cindex(widgets, binding)
+cindex(binding widgets)
+cindex(widgets, invoking)
+cindex(invoking widgets)
+cindex(widgets, calling)
+cindex(calling widgets)
+cindex(widgets, defining)
+cindex(defining widgets)
+xitem(tt(zle) tt(-l) [ tt(-L) ])
+xitem(tt(zle) tt(-D) var(widget) ...)
+xitem(tt(zle) tt(-A) var(old-widget) var(new-widget))
+xitem(tt(zle) tt(-N) var(widget) [ var(function) ])
+item(tt(zle) var(widget))(
+The tt(zle) builtin performs a number of different actions concerning
+ZLE.  Which operation it performs depends on its options:
+
+startitem()
+item(tt(-l) [ tt(-L) ])(
+List all existing user-defined widgets.  If the tt(-L)
+option is used, list in the form of tt(zle)
+commands to create the widgets.
+Built-in widgets are not listed.
+)
+item(tt(-D) var(widget) ...)(
+Delete the named var(widget)s.
+)
+item(tt(-A) var(old-widget) var(new-widget))(
+Make the var(new-widget) name an alias for var(old-widget), so that
+both names refer to the same widget.  The names have equal standing;
+if either is deleted, the other remains.  If there is already a widget
+with the var(new-widget) name, it is deleted.
+)
+item(tt(-N) var(widget) [ var(function) ])(
+Create a user-defined widget.  If there is already a widget with the
+specified name, it is overwritten.  When the new
+widget is invoked from within the editor, the specified shell var(function)
+is called.  If no function name is specified, it defaults to
+the same name as the widget.
+)
+item(var(widget))(
+Invoke the specified widget.  This can only be done when ZLE is
+active; normally this will be within a user-defined widget.
+)
+enditem()
+)
+enditem()
diff --git a/Doc/Zsh/modules.yo b/Doc/Zsh/modules.yo
new file mode 100644
index 000000000..b44b00e6b
--- /dev/null
+++ b/Doc/Zsh/modules.yo
@@ -0,0 +1,64 @@
+texinode(Zsh Modules)()(Programmable Completion)(Top)
+chapter(Zsh Modules)
+cindex(modules)
+sect(Description)
+Some optional parts of zsh are in modules, separate from the core
+of the shell.  Each of these modules may be linked in to the
+shell at build time,
+or can be dynamically linked while the shell is running
+if the installation supports this feature.  The modules available are:
+
+startitem()
+item(tt(cap))(
+Builtins for manipulating POSIX.1e (POSIX.6) capability (privilege) sets.
+)
+item(tt(clone))(
+A builtin that can clone a running shell onto another terminal.
+)
+item(tt(comp1))(
+Base of the completion system.  Used by the tt(compctl) and tt(zle) modules.
+)
+item(tt(compctl))(
+The tt(compctl) builtin for controlling completion.
+)
+item(tt(deltochar))(
+A ZLE function duplicating EMACS' tt(zap-to-char).
+)
+item(tt(example))(
+An example of how to write a module.
+)
+item(tt(files))(
+Some basic file manipulation commands as builtins.
+)
+item(tt(sched))(
+A builtin that provides a timed execution facility within the shell.
+)
+item(tt(stat))(
+A builtin command interface to the tt(stat) system call.
+)
+item(tt(zle))(
+The Zsh Line Editor, including the tt(bindkey) and tt(vared) builtins.
+)
+enditem()
+startmenu()
+menu(The cap Module)
+menu(The clone Module)
+menu(The comp1 Module)
+menu(The compctl Module)
+menu(The deltochar Module)
+menu(The example Module)
+menu(The files Module)
+menu(The sched Module)
+menu(The stat Module)
+menu(The zle Module)
+endmenu()
+includefile(Zsh/mod_cap.yo)
+includefile(Zsh/mod_clone.yo)
+includefile(Zsh/mod_comp1.yo)
+includefile(Zsh/mod_compctl.yo)
+includefile(Zsh/mod_deltochar.yo)
+includefile(Zsh/mod_example.yo)
+includefile(Zsh/mod_files.yo)
+includefile(Zsh/mod_sched.yo)
+includefile(Zsh/mod_stat.yo)
+includefile(Zsh/mod_zle.yo)
diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo
new file mode 100644
index 000000000..0fdf78e8a
--- /dev/null
+++ b/Doc/Zsh/options.yo
@@ -0,0 +1,1039 @@
+texinode(Options)(Shell Builtin Commands)(Parameters)(Top)
+chapter(Options)
+cindex(options)
+startmenu()
+menu(Specifying Options)
+menu(Description of Options)
+menu(Option Aliases)
+menu(Single Letter Options)
+endmenu()
+texinode(Specifying Options)(Description of Options)()(Options)
+sect(Specifying Options)
+cindex(options, specifying)
+Options are primarily referred to by name.
+These names are case insensitive and underscores are ignored.
+For example, `tt(allexport)' is equivalent to `tt(A__lleXP_ort)'.
+
+The sense of an option name may be inverted by preceding it with
+`tt(no)', so `tt(setopt No_Beep)' is equivalent to `tt(unsetopt beep)'.
+This inversion can only be done once, so `tt(nonobeep)' is em(not)
+a synonym for `tt(beep)'.  Similarly, `tt(tify)' is not a synonym for
+`tt(nonotify)' (the inversion of `tt(notify)').
+
+Some options also have one or more single letter names.
+There are two sets of single letter options: one used by default,
+and another used to emulate bf(sh)/bf(ksh) (used when the
+tt(SH_OPTION_LETTERS) option is set).
+The single letter options can be used on the shell command line,
+or with the tt(set), tt(setopt) and tt(unsetopt)
+builtins, as normal Unix options preceded by `tt(-)'.
+
+The sense of the single letter options may be inverted by using
+`tt(PLUS())' instead of `tt(-)'.
+Some of the single letter option names refer to an option being off,
+in which case the inversion of that name refers to the option being on.
+For example, `tt(PLUS()n)' is the short name of `tt(exec)', and
+`tt(-n)' is the short name of its inversion, `tt(noexec)'.
+texinode(Description of Options)(Option Aliases)(Specifying Options)(Options)
+sect(Description of Options)
+cindex(options, description)
+startitem()
+pindex(ALL_EXPORT)
+cindex(export, automatic)
+item(tt(ALL_EXPORT) (tt(-a), ksh: tt(-a)))(
+All parameters subsequently defined are automatically exported.
+)
+pindex(ALWAYS_LAST_PROMPT)
+item(tt(ALWAYS_LAST_PROMPT))(
+If unset, key functions that list completions try to return to the last
+prompt if given a numeric argument. If set these functions try to
+return to the last prompt if given em(no) numeric argument.
+)
+pindex(ALWAYS_TO_END)
+item(tt(ALWAYS_TO_END))(
+If a completion is performed with the cursor within a word, and a
+full completion is inserted, the cursor is moved to the end of the
+word.  That is, the cursor is moved to the end of the word if either
+a single match is inserted or menu completion is performed.
+)
+pindex(APPEND_HISTORY)
+cindex(history, appending to a file)
+item(tt(APPEND_HISTORY))(
+If this is set, zsh sessions will append their history list to
+the history file, rather than overwrite it. Thus, multiple parallel
+zsh sessions will all have their history lists added to the
+history file, in the order they are killed.
+)
+pindex(AUTO_CD)
+cindex(cd, automatic)
+item(tt(AUTO_CD) (tt(-J)))(
+If a command is issued that can't be executed as a normal command,
+and the command is the name of a directory, perform the tt(cd)
+command to that directory.
+)
+pindex(AUTO_LIST)
+cindex(completion, listing choices)
+item(tt(AUTO_LIST) (tt(-9)))(
+Automatically list choices on an ambiguous completion.
+)
+pindex(AUTO_MENU)
+cindex(completion, menu)
+item(tt(AUTO_MENU))(
+Automatically use menu completion after the second consecutive request for
+completion, for example by pressing the tab key repeatedly. This option
+is overridden by tt(MENU_COMPLETE).
+)
+pindex(AUTO_NAME_DIRS)
+cindex(directories, named)
+item(tt(AUTO_NAME_DIRS))(
+Any parameter that is set to the absolute name of a directory
+immediately becomes a name for that directory, that will be used
+by the `tt(%~)'
+and related prompt sequences, and will be available when completion
+is performed on a word starting with `tt(~)'.
+(Otherwise, the parameter must be used in the form `tt(~)var(param)' first.)
+)
+pindex(AUTO_PARAM_KEYS)
+item(tt(AUTO_PARAM_KEYS))(
+If a parameter name was completed and a following character
+(normally a space) automatically
+inserted, and the next character typed is one
+of those that have to come directly after the name (like `tt(})', `tt(:)',
+etc.), the automatically added character is deleted, so that the character
+typed comes immediately after the parameter name.
+Completion in a brace expansion is affected similarly: the added character
+is a `tt(,)', which will be removed if `tt(})' is typed next.
+)
+pindex(AUTO_PARAM_SLASH)
+item(tt(AUTO_PARAM_SLASH))(
+If a parameter is completed whose content is the name of a directory,
+then add a trailing slash instead of a space.
+)
+pindex(AUTO_PUSHD)
+cindex(cd, behaving like pushd)
+cindex(pushd, making cd behave like)
+item(tt(AUTO_PUSHD) (tt(-N)))(
+Make tt(cd) push the old directory onto the directory stack.
+)
+pindex(AUTO_REMOVE_SLASH)
+cindex(slash, removing trailing)
+item(tt(AUTO_REMOVE_SLASH))(
+When the last character resulting from a completion is a slash and the next
+character typed is a word delimiter or a slash, remove the slash.
+)
+pindex(AUTO_RESUME)
+cindex(jobs, resuming automatically)
+cindex(resuming jobs automatically)
+item(tt(AUTO_RESUME) (tt(-W)))(
+Treat single word simple commands without redirection
+as candidates for resumption of an existing job.
+)
+pindex(BAD_PATTERN)
+cindex(globbing, bad pattern)
+cindex(filename generation, bad pattern)
+item(tt(BAD_PATTERN) (tt(PLUS()2)))(
+If a pattern for filename generation is badly formed, print an error message.
+(If this option is unset, the pattern will be left unchanged.)
+)
+pindex(BANG_HIST)
+cindex(history, enable substitution)
+cindex(enable history substitution)
+item(tt(BANG_HIST) (tt(PLUS()K)))(
+Perform textual history substitution, bf(csh)-style,
+treating the character `tt(!)' specially.
+)
+pindex(BARE_GLOB_QUAL)
+cindex(globbing qualifiers, enable)
+cindex(enable globbing qualifiers)
+item(tt(BARE_GLOB_QUAL))(
+In a glob pattern, treat a trailing set of parentheses as a qualifier
+list, if it contains no `tt(|)', `tt(LPAR())' or (if special) `tt(~)'
+characters.  See noderef(Filename Generation).
+)
+pindex(BEEP)
+cindex(beep, enabling)
+cindex(enabling the beep)
+item(tt(BEEP) (tt(PLUS()B)))(
+Beep on error in ZLE.
+)
+pindex(BG_NICE)
+cindex(jobs, background priority)
+cindex(background jobs, priority of)
+cindex(priority of background jobs)
+item(tt(BG_NICE) (tt(-6)))(
+Run all background jobs at a lower priority.  This option
+is set by default.
+)
+pindex(BRACE_CCL)
+cindex(brace expansion, extending)
+cindex(expansion, brace, extending)
+item(tt(BRACE_CCL))(
+Expand expressions in braces which would not otherwise undergo brace
+expansion to a lexically ordered list of all the characters.  See
+noderef(Brace Expansion).
+)
+pindex(BSD_ECHO)
+cindex(echo, BSD compatible)
+item(tt(BSD_ECHO))(
+Make the tt(echo) builtin compatible with the BSD manref(echo)(1) command.
+This disables backslashed escape sequences in echo strings unless the
+tt(-e) option is specified.
+)
+pindex(CDABLE_VARS)
+cindex(cd, to parameter)
+item(tt(CDABLE_VARS) (tt(-T)))(
+If the argument to a tt(cd) command (or an implied tt(cd) with the
+tt(AUTO_CD) option set) is not a directory, and does not begin with a
+slash, try to expand the expression as if it were preceded by a `tt(~)' (see
+noderef(Filename Expansion)).
+)
+pindex(CHASE_LINKS)
+cindex(links, symbolic)
+cindex(symbolic links)
+item(tt(CHASE_LINKS) (tt(-w)))(
+Resolve symbolic links to their true values when changing directory.
+)
+pindex(CLOBBER)
+cindex(clobbering, of files)
+cindex(file clobbering, allowing)
+item(tt(CLOBBER) (tt(PLUS()C), ksh: tt(PLUS()C)))(
+Allows `tt(>)' redirection to truncate existing files,
+and `tt(>>)' to create files.
+Otherwise `tt(>!)' or `tt(>|)' must be used to truncate a file,
+and `tt(>>!)' or `tt(>>|)' to create a file.
+)
+pindex(COMPLETE_ALIASES)
+cindex(aliases, completion of)
+item(tt(COMPLETE_ALIASES))(
+Prevents aliases on the command line from being internally substituted
+before completion is attempted.  The effect is to make the alias a
+distinct command for completion purposes.
+)
+pindex(COMPLETE_IN_WORD)
+item(tt(COMPLETE_IN_WORD))(
+If unset, the cursor is set to the end of the word if completion is
+started. Otherwise it stays there and completion is done from both ends.
+)
+pindex(CORRECT)
+cindex(correction, spelling)
+cindex(spelling correction)
+item(tt(CORRECT) (tt(-0)))(
+Try to correct the spelling of commands.
+)
+pindex(CORRECT_ALL)
+item(tt(CORRECT_ALL) (tt(-O)))(
+Try to correct the spelling of all arguments in a line.
+)
+pindex(CSH_JUNKIE_HISTORY)
+cindex(csh, history style)
+cindex(history style, csh)
+item(tt(CSH_JUNKIE_HISTORY))(
+A history reference without an event specifier will always refer to the
+previous command.  Without this option, such a history reference refers
+to the same event as the previous history reference, defaulting to the
+previous command.
+)
+pindex(CSH_JUNKIE_LOOPS)
+cindex(csh, loop style)
+cindex(loop style, csh)
+item(tt(CSH_JUNKIE_LOOPS))(
+Allow loop bodies to take the form `var(list); tt(end)' instead of
+`tt(do) var(list); tt(done)'.
+)
+pindex(CSH_JUNKIE_QUOTES)
+cindex(csh, quoting style)
+cindex(quoting style, csh)
+item(tt(CSH_JUNKIE_QUOTES))(
+Changes the rules for single- and double-quoted text to match that of
+bf(csh).  These require that embedded newlines be preceded by a backslash;
+unescaped newlines will cause an error message.
+In double-quoted strings, it is made impossible to escape `tt($)', `tt(`)'
+or `tt(")' (and `tt(\)' itself no longer needs escaping).
+Command substitutions are only expanded once, and cannot be nested.
+)
+pindex(CSH_NULL_GLOB)
+cindex(csh, null globbing style)
+cindex(null globbing style, csh)
+cindex(globbing, null, style, csh)
+item(tt(CSH_NULL_GLOB))(
+If a pattern for filename generation has no matches,
+delete the pattern from the argument list;
+do not report an error unless all the patterns
+in a command have no matches.
+Overrides tt(NULL_GLOB).
+)
+pindex(EQUALS)
+cindex(filename substitution, =)
+item(tt(EQUALS))(
+Perform tt(=) filename substitution.
+(See noderef(Filename Expansion).)
+)
+pindex(ERR_EXIT)
+cindex(exit status, trapping)
+item(tt(ERR_EXIT) (tt(-e), ksh: tt(-e)))(
+If a command has a non-zero exit status, execute the tt(ZERR)
+trap, if set, and exit.  This is disabled while running initialization
+scripts.
+)
+pindex(EXEC)
+cindex(command execution, enabling)
+item(tt(EXEC) (tt(PLUS()n), ksh: tt(PLUS()n)))(
+Do execute commands.  Without this option, commands are
+read and checked for syntax errors, but not executed.
+)
+pindex(EXTENDED_GLOB)
+cindex(globbing, extended)
+item(tt(EXTENDED_GLOB))(
+Treat the `tt(#)', `tt(~)' and `tt(^)' characters as part of patterns
+for filename generation, etc.  (An initial unquoted `tt(~)'
+always produces named directory expansion.)
+)
+pindex(EXTENDED_HISTORY)
+cindex(history, timestamping)
+item(tt(EXTENDED_HISTORY))(
+Save beginning and ending timestamps to the history file.
+The format of these timestamps is
+`tt(:)var(<beginning time>)tt(:)var(<ending time>)tt(:)var(<command>)'.
+)
+pindex(FLOW_CONTROL)
+cindex(flow control)
+item(tt(FLOW_CONTROL))(
+If this option is unset,
+output flow control via start/stop characters (usually assigned to
+^S/^Q) is disabled in the shell's editor.
+)
+pindex(FUNCTION_ARGZERO)
+cindex($0, setting)
+item(tt(FUNCTION_ARGZERO))(
+When executing a shell function or sourcing a script, set tt($0)
+temporarily to the name of the function/script.
+)
+pindex(GLOB)
+cindex(globbing, enabling)
+cindex(enabling globbing)
+item(tt(GLOB) (tt(PLUS()F), ksh: tt(PLUS()f)))(
+Perform filename generation (globbing).
+(See noderef(Filename Generation).)
+)
+pindex(GLOB_ASSIGN)
+item(tt(GLOB_ASSIGN))(
+If this option is set, filename generation (globbing) is
+performed on the right hand side of scalar parameter assignments of
+the form `var(name)tt(=)var(pattern) (e.g. `tt(foo=*)').
+If the result has more than one word the parameter will become an array
+with those words as arguments. This option is provided for backwards
+compatibility only: globbing is always performed on the right hand side
+of array assignments of the form `var(name)tt(=LPAR())var(value)tt(RPAR())'
+(e.g. `tt(foo=(*))') and this form is recommended for clarity;
+with this option set, it is not possible to predict whether the result
+will be an array or a scalar.
+)
+pindex(GLOB_COMPLETE)
+item(tt(GLOB_COMPLETE))(
+When the current word has a glob pattern, do not insert all the words
+resulting from the expansion but cycle through them like
+tt(MENU_COMPLETE). If no matches are found, a `tt(*)' is added to the end of the
+word or inserted at the cursor if tt(COMPLETE_IN_WORD) is set, and expansion
+is attempted again.  Using patterns works not only for files but for all
+completions, such as options, user names, etc.
+)
+pindex(GLOB_DOTS)
+cindex(globbing, of . files)
+item(tt(GLOB_DOTS) (tt(-4)))(
+Do not require a leading `tt(.)' in a filename to be matched explicitly.
+)
+pindex(GLOB_SUBST)
+item(tt(GLOB_SUBST))(
+Treat any characters resulting from parameter substitution as being
+eligible for file expansion and filename generation, and any
+characters resulting from command substitution as being eligible for
+filename generation.
+)
+pindex(HASH_CMDS)
+cindex(hashing, of commands)
+cindex(command hashing)
+item(tt(HASH_CMDS))(
+Note the location of each command the first time it is executed.
+Subsequent invocations of the same command will use the
+saved location, avoiding a path search.
+If this option is unset, no path hashing will be done at all.
+)
+pindex(HASH_DIRS)
+cindex(hashing, of directories)
+cindex(directories, hashing)
+item(tt(HASH_DIRS))(
+Whenever a command is executed, hash the directory containing it,
+as well as all directories that occur earlier in the path.
+Has no effect if tt(HASH_CMDS) is unset.
+)
+pindex(HASH_LIST_ALL)
+item(tt(HASH_LIST_ALL))(
+Whenever a command completion is attempted, make sure the entire
+command path is hashed first.  This makes the first completion slower.
+)
+pindex(HIST_ALLOW_CLOBBER)
+item(tt(HIST_ALLOW_CLOBBER))(
+Add `tt(|)' to output redirections in the history.  This allows history
+references to clobber files even when tt(CLOBBER) is unset.
+)
+pindex(HIST_BEEP)
+cindex(history beeping)
+cindex(beep, history)
+item(tt(HIST_BEEP))(
+Beep when an attempt is made to access a history entry which
+isn't there.
+)
+pindex(HIST_IGNORE_DUPS)
+cindex(history, ignoring duplicates)
+item(tt(HIST_IGNORE_DUPS) (tt(-h)))(
+Do not enter command lines into the history list
+if they are duplicates of the previous event.
+)
+pindex(HIST_IGNORE_SPACE)
+cindex(history, ignoring spaces)
+item(tt(HIST_IGNORE_SPACE) (tt(-g)))(
+Do not enter command lines into the history list
+if any command on the line begins with a blank.
+)
+pindex(HIST_NO_FUNCTIONS)
+item(tt(HIST_NO_FUNCTIONS))(
+Do not store function definitions in the history list.
+)
+pindex(HIST_NO_STORE)
+item(tt(HIST_NO_STORE))(
+Remove the tt(history) (tt(fc -l)) command from
+the history when invoked.
+)
+pindex(HIST_REDUCE_BLANKS)
+item(tt(HIST_REDUCE_BLANKS))(
+Remove superfluous blanks from each command line
+being added to the history list.
+)
+pindex(HIST_VERIFY)
+cindex(history, verifying substitution)
+item(tt(HIST_VERIFY))(
+Whenever the user enters a line with history substitution,
+don't execute the line directly; instead, perform
+history substitution and reload the line into the editing buffer.
+)
+pindex(HUP)
+cindex(jobs, HUP)
+item(tt(HUP))(
+Send the tt(HUP) signal to running jobs when the
+shell exits.
+)
+pindex(IGNORE_BRACES)
+cindex(disabling brace expansion)
+cindex(brace expansion, disabling)
+cindex(expansion, brace, disabling)
+item(tt(IGNORE_BRACES) (tt(-I)))(
+Do not perform brace expansion.
+)
+pindex(IGNORE_EOF)
+cindex(EOF, ignoring)
+item(tt(IGNORE_EOF) (tt(-7)))(
+Do not exit on end-of-file.  Require the use
+of tt(exit) or tt(logout) instead.
+However, ten consecutive EOFs will cause the shell to exit anyway,
+to avoid the shell hanging if its tty goes away.
+)
+pindex(INTERACTIVE)
+item(tt(INTERACTIVE) (tt(-i), ksh: tt(-i)))(
+This is an interactive shell.  This option is set upon initialisation if
+the standard input is a tty and commands are being read from standard input.
+(See the discussion of tt(SHIN_STDIN).)
+This heuristic may be overridden by specifying a state for this option
+on the command line.
+The value of this option cannot be changed anywhere other than the command line.
+)
+pindex(INTERACTIVE_COMMENTS)
+cindex(comments, in interactive shells)
+item(tt(INTERACTIVE_COMMENTS) (tt(-k)))(
+Allow comments even in interactive shells.
+)
+pindex(KSH_ARRAYS)
+cindex(arrays, ksh style)
+cindex(array style, ksh)
+cindex(ksh, array style)
+item(tt(KSH_ARRAYS))(
+Emulate bf(ksh) array handling as closely as possible.  If this option
+is set, array elements are numbered from zero, an array parameter
+without subscript refers to the first element instead of the whole array,
+and braces are required to delimit a subscript (`tt(${path[2]})' rather
+than just `tt($path[2])').
+)
+pindex(KSH_AUTOLOAD)
+item(tt(KSH_AUTOLOAD))(
+Emulate bf(ksh) function autoloading.  This means that when a function is
+autoloaded, the corresponding file is merely executed, and must define
+the function itself.  (By default, the function is defined to the contents
+of the file.  However, the most common bf(ksh)-style case - of the file
+containing only a simple definition of the function - is always handled
+in the bf(ksh)-compatible manner.)
+)
+pindex(KSH_GLOB)
+item(tt(KSH_GLOB))(
+In pattern matching, the interpretation of parentheses is affected by
+a preceding `tt(@)', `tt(*)', `tt(+)', `tt(?)' or `tt(!)'.
+See noderef(Filename Generation).
+)
+pindex(KSH_OPTION_PRINT)
+cindex(option printing, ksh style)
+cindex(option printing style, ksh)
+cindex(ksh, option printing style)
+item(tt(KSH_OPTION_PRINT))(
+Alters the way options settings are printed.
+)
+pindex(LIST_AMBIGUOUS)
+cindex(ambiguous completion)
+cindex(completion, ambiguous)
+item(tt(LIST_AMBIGUOUS))(
+If this option is set, completions are shown only if the completions
+don't have a unambiguous prefix or suffix that could be inserted in
+the command line.
+)
+pindex(LIST_BEEP)
+cindex(beep, ambiguous completion)
+cindex(completion, beep on ambiguous)
+item(tt(LIST_BEEP))(
+Beep on an ambiguous completion.
+)
+pindex(LIST_TYPES)
+cindex(marking file types)
+cindex(files, marking type of)
+item(tt(LIST_TYPES) (tt(-X)))(
+When listing files that are possible completions, show the
+type of each file with a trailing identifying mark.
+)
+pindex(LOCAL_OPTIONS)
+item(tt(LOCAL_OPTIONS))(
+If this option is set at the point of return from a shell function,
+all the options (including this one) which were in force upon entry to
+the function are restored.  Otherwise, only this option and the
+tt(XTRACE) and tt(PRINT_EXIT_VALUE) options are restored.  Hence
+if this is explicitly unset by a shell function the other options in
+force at the point of return will remain so.
+A shell function can also guarantee itself a known shell configuration
+with a formulation like `tt(emulate zsh; setopt localoptions)'.
+)
+pindex(LOGIN)
+item(tt(LOGIN) (tt(-l), ksh: tt(-l)))(
+This is a login shell.
+If this option is not explicitly set, the shell is a login shell if
+the first character of the tt(argv[0]) passed to the shell is a `tt(-)'.
+)
+pindex(LONG_LIST_JOBS)
+cindex(jobs, list format)
+item(tt(LONG_LIST_JOBS) (tt(-R)))(
+List jobs in the long format by default.
+)
+pindex(MAGIC_EQUAL_SUBST)
+item(tt(MAGIC_EQUAL_SUBST))(
+All unquoted arguments of the form `var(identifier)tt(=)var(expression)'
+appearing after the command name have filename expansion (that is,
+where var(expression) has a leading `tt(~)' or `tt(=)') performed on
+var(expression) as if it were a parameter assignment.  The argument is
+not otherwise treated specially; it is passed to the command as a single
+argument, and not used as an actual parameter assignment.
+)
+pindex(MAIL_WARNING)
+cindex(mail, warning of reading)
+item(tt(MAIL_WARNING) (tt(-U)))(
+Print a warning message if a mail file has been
+accessed since the shell last checked.
+)
+pindex(MARK_DIRS)
+cindex(directories, marking)
+cindex(marking directories)
+item(tt(MARK_DIRS) (tt(-8), ksh: tt(-X)))(
+Append a trailing `tt(/)' to all directory
+names resulting from filename generation (globbing).
+)
+pindex(MENU_COMPLETE)
+cindex(completion, menu)
+item(tt(MENU_COMPLETE) (tt(-Y)))(
+On an ambiguous completion, instead of listing possibilities or beeping,
+insert the first match immediately.  Then when completion is requested
+again, remove the first match and insert the second match, etc.
+When there are no more matches, go back to the first one again.
+tt(reverse-menu-complete) may be used to loop through the list
+in the other direction. This option overrides tt(AUTO_MENU).
+)
+pindex(MONITOR)
+cindex(job control, allowing)
+item(tt(MONITOR) (tt(-m), ksh: tt(-m)))(
+Allow job control.  Set by default in interactive shells.
+)
+pindex(MULTIOS)
+item(tt(MULTIOS))(
+Perform implicit bf(tee)s or bf(cat)s when multiple
+redirections are attempted (see noderef(Redirection)).
+)
+pindex(NOMATCH)
+cindex(globbing, no matches)
+item(tt(NOMATCH) (tt(PLUS()3)))(
+If a pattern for filename generation has no matches,
+print an error, instead of
+leaving it unchanged in the argument list.
+This also applies to file expansion
+of an initial `tt(~)' or `tt(=)'.
+)
+pindex(NOTIFY)
+cindex(background jobs, notification)
+cindex(notification of background jobs)
+item(tt(NOTIFY) (tt(-5), ksh: tt(-b)))(
+Report the status of background jobs immediately, rather than
+waiting until just before printing a prompt.
+)
+pindex(NULL_GLOB)
+cindex(globbing, no matches)
+item(tt(NULL_GLOB) (tt(-G)))(
+If a pattern for filename generation has no matches,
+delete the pattern from the argument list instead
+of reporting an error.  Overrides tt(NOMATCH).
+)
+pindex(NUMERIC_GLOB_SORT)
+cindex(globbing, sorting numerically)
+item(tt(NUMERIC_GLOB_SORT))(
+If numeric filenames are matched by a filename generation pattern,
+sort the filenames numerically rather than lexicographically.
+)
+pindex(OVERSTRIKE)
+cindex(editor, overstrike mode)
+cindex(overstrike mode, of editor)
+item(tt(OVERSTRIKE))(
+Start up the line editor in overstrike mode.
+)
+pindex(PATH_DIRS)
+cindex(path search, extended)
+item(tt(PATH_DIRS) (tt(-Q)))(
+Perform a path search even on command names with slashes in them.
+Thus if `tt(/usr/local/bin)' is in the user's path, and he types
+`tt(X11/xinit)', the command `tt(/usr/local/bin/X11/xinit)' will be executed
+(assuming it exists).
+Commands explicitly beginning with `tt(/)', `tt(./)' or `tt(../)'
+are not subject to the path search.
+This also applies to the tt(.) builtin,
+and searches for modules performed by the tt(zmodload) builtin.
+)
+pindex(POSIX_BUILTINS)
+item(tt(POSIX_BUILTINS))(
+When this option is set the tt(command) builtin can be used to execute
+shell builtin commands.  Parameter assignments specified before shell
+functions and special builtins are kept after the command completes unless
+the special builtin is prefixed with the tt(command) builtin.  Special
+builtins are
+tt(.),
+tt(:),
+tt(break),
+tt(continue),
+tt(declare),
+tt(eval),
+tt(exit),
+tt(export),
+tt(integer),
+tt(local),
+tt(readonly),
+tt(return),
+tt(set),
+tt(shift),
+tt(source),
+tt(times),
+tt(trap) and
+tt(unset).
+)
+pindex(PRINT_EIGHT_BIT)
+cindex(exit status, printing)
+item(tt(PRINT_EIGHT_BIT))(
+Print eight bit characters literally in completion lists, etc.
+This option is not necessary if your system correctly returns the
+printability of eight bit characters (see manref(ctype)(3)).
+)
+pindex(PRINT_EXIT_VALUE)
+cindex(exit status, printing)
+item(tt(PRINT_EXIT_VALUE) (tt(-1)))(
+Print the exit value of programs with non-zero exit status.
+)
+pindex(PRIVILEGED)
+cindex(privileged mode)
+cindex(mode, privileged)
+item(tt(PRIVILEGED) (tt(-p), ksh: tt(-p)))(
+Turn on privileged mode. This is enabled automatically on startup if the
+effective user (group) ID is not equal to the real user (group) ID.  Turning
+this option off causes the effective user and group IDs to be set to the
+real user and group IDs. This option disables sourcing user startup files.
+If zsh is invoked as `tt(sh)' or `tt(ksh)' with this option set,
+tt(/etc/suid_profile) is sourced (after tt(/etc/profile) on interactive
+shells). Sourcing tt(~/.profile) is disabled and the contents of the
+tt(ENV) variable is ignored. This option cannot be changed using the
+tt(-m) option of tt(setopt) and tt(unsetopt), and changing it inside a
+function always changes it globally regardless of the tt(LOCAL_OPTIONS)
+option.
+)
+pindex(PROMPT_BANG)
+cindex(prompt, ! expansion)
+item(tt(PROMPT_BANG))(
+If set, `tt(!)' is treated specially in prompt expansion.
+See noderef(Prompt Expansion).
+)
+pindex(PROMPT_CR)
+cindex(prompt, with CR)
+item(tt(PROMPT_CR) (tt(PLUS()V)))(
+Print a carriage return just before printing
+a prompt in the line editor.
+)
+pindex(PROMPT_PERCENT)
+cindex(prompt, % expansion)
+item(tt(PROMPT_PERCENT))(
+If set, `tt(%)' is treated specially in prompt expansion.
+See noderef(Prompt Expansion).
+)
+pindex(PROMPT_SUBST)
+cindex(prompt, parameter expansion)
+item(tt(PROMPT_SUBST))(
+If set, em(parameter expansion), em(command substitution) and
+em(arithmetic expansion) are performed in prompts.
+)
+pindex(PUSHD_IGNORE_DUPS)
+cindex(directory stack, ignoring duplicates)
+item(tt(PUSHD_IGNORE_DUPS))(
+Don't push multiple copies of the same directory onto the directory stack.
+)
+pindex(PUSHD_MINUS)
+cindex(directory stack, controlling syntax)
+item(tt(PUSHD_MINUS))(
+Exchanges the meanings of `tt(PLUS())' and `tt(-)'
+when used with a number to specify a directory in the stack.
+)
+pindex(PUSHD_SILENT)
+cindex(directory stack, silencing)
+item(tt(PUSHD_SILENT) (tt(-E)))(
+Do not print the directory stack after tt(pushd) or tt(popd).
+)
+pindex(PUSHD_TO_HOME)
+cindex(pushd, to home)
+item(tt(PUSHD_TO_HOME) (tt(-D)))(
+Have tt(pushd) with no arguments act like `tt(pushd $HOME)'.
+)
+pindex(RC_EXPAND_PARAM)
+cindex(rc, parameter expansion style)
+cindex(parameter expansion style, rc)
+item(tt(RC_EXPAND_PARAM) (tt(-P)))(
+Array expansions of the form
+`var(foo)tt(${)var(xx)tt(})var(bar)', where the parameter
+var(xx) is set to tt(LPAR())var(a b c)tt(RPAR()), are substituted with
+`var(fooabar foobbar foocbar)' instead of the default
+`var(fooa b cbar)'.
+)
+pindex(RC_QUOTES)
+cindex(rc, quoting style)
+cindex(quoting style, rc)
+item(tt(RC_QUOTES))(
+Allow the character sequence `tt('')' to signify a single quote
+within singly quoted strings.
+)
+pindex(RCS)
+cindex(startup files, sourcing)
+item(tt(RCS) (tt(PLUS()f)))(
+After tt(/etc/zshenv) is sourced on startup, source the
+tt(.zshenv), tt(/etc/zprofile), tt(.zprofile),
+tt(/etc/zshrc), tt(.zshrc), tt(/etc/zlogin), tt(.zlogin), and tt(.zlogout)
+files, as described in noderef(Files).
+If this option is unset, only the tt(/etc/zshenv) file is sourced.
+)
+pindex(REC_EXACT)
+cindex(completion, exact matches)
+item(tt(REC_EXACT) (tt(-S)))(
+In completion, recognize exact matches even
+if they are ambiguous.
+)
+pindex(RESTRICTED)
+cindex(restricted shell)
+item(tt(RESTRICTED) (tt(-r)))(
+Enables restricted mode.  This option cannot be changed using
+tt(unsetopt), and setting it inside a function always changes it
+globally regardless of the tt(LOCAL_OPTIONS) option.  See
+noderef(Restricted Shell).
+)
+pindex(RM_STAR_SILENT)
+cindex(rm *, querying before)
+cindex(querying before rm *)
+item(tt(RM_STAR_SILENT) (tt(-H)))(
+Do not query the user before executing `tt(rm *)' or `tt(rm path/*)'.
+)
+pindex(RM_STAR_WAIT)
+cindex(rm *, waiting before)
+cindex(waiting before rm *)
+item(tt(RM_STAR_WAIT))(
+If querying the user before executing `tt(rm *)' or `tt(rm path/*)',
+first wait ten seconds and ignore anything typed in that time.
+This avoids the problem of reflexively answering `yes' to the query
+when one didn't really mean it.  The wait and query can always be
+avoided by expanding the `tt(*)' in ZLE (with tab).
+)
+pindex(SH_FILE_EXPANSION)
+cindex(sh, expansion style)
+cindex(expansion style, sh)
+item(tt(SH_FILE_EXPANSION))(
+Perform filename expansion (e.g., ~ expansion) em(before)
+parameter expansion, command substitution, arithmetic expansion
+and brace expansion.
+If this option is unset, it is performed em(after)
+brace expansion, so things like `tt(~$USERNAME)' and
+`tt(~{pfalstad,rc})' will work.
+)
+pindex(SH_GLOB)
+cindex(sh, globbing style)
+cindex(globbing style, sh)
+item(tt(SH_GLOB))(
+Disables the special meaning of `tt(LPAR())', `tt(|)', `tt(RPAR())'
+and 'tt(<)' for globbing the result of parameter and command substitutions,
+and in some other places where
+the shell accepts patterns.  This option is set by default if zsh is
+invoked as tt(sh) or tt(ksh).
+)
+pindex(SHIN_STDIN)
+item(tt(SHIN_STDIN) (tt(-s), ksh: tt(-s)))(
+Commands are being read from the standard input.
+Commands are read from standard input if no command is specified with
+tt(-c) and no file of commands is specified.  If tt(SHIN_STDIN)
+is set explicitly on the command line,
+any argument that would otherwise have been
+taken as a file to run will instead be treated as a normal positional
+parameter.
+Note that setting or unsetting this option on the command line does not
+necessarily affect the state the option will have while the shell is
+running - that is purely an indicator of whether on not commands are
+em(actually) being read from standard input.
+The value of this option cannot be changed anywhere other than the command line.
+)
+pindex(SH_OPTION_LETTERS)
+cindex(sh, single letter options style)
+cindex(ksh, single letter options style)
+cindex(single letter options, ksh style)
+cindex(options, single letter, ksh style)
+item(tt(SH_OPTION_LETTERS))(
+If this option is set the shell tries to interpret single letter options
+(which are used with tt(set) and tt(setopt)) like bf(ksh) does.
+This also affects the value of the tt(-) special parameter.
+)
+pindex(SHORT_LOOPS)
+item(tt(SHORT_LOOPS))(
+Allow the short forms of tt(for), tt(select),
+tt(if), and tt(function) constructs.
+)
+pindex(SH_WORD_SPLIT)
+cindex(field splitting, sh style)
+cindex(sh, field splitting style)
+item(tt(SH_WORD_SPLIT) (tt(-y)))(
+Causes field splitting to be performed on unquoted parameter expansions.
+Note that this option has nothing to do with word splitting.
+(See noderef(Parameter Expansion).)
+)
+pindex(SINGLE_COMMAND)
+cindex(single command)
+pindex(INTERACTIVE, use of)
+item(tt(SINGLE_COMMAND) (tt(-t), ksh: tt(-t)))(
+If the shell is reading from standard input, it exits after a single command
+has been executed.  This also makes the shell non-interactive, unless the
+tt(INTERACTIVE) option is explicitly set on the command line.
+The value of this option cannot be changed anywhere other than the command line.
+)
+pindex(SINGLE_LINE_ZLE)
+cindex(editor, single line mode)
+item(tt(SINGLE_LINE_ZLE) (tt(-M)))(
+Use single-line command line editing instead of multi-line.
+)
+pindex(SUN_KEYBOARD_HACK)
+cindex(sun keyboard, annoying)
+cindex(annoying keyboard, sun)
+item(tt(SUN_KEYBOARD_HACK) (tt(-L)))(
+If a line ends with a backquote, and there are an odd number
+of backquotes on the line, ignore the trailing backquote.
+This is useful on some keyboards where the return key is
+too small, and the backquote key lies annoyingly close to it.
+)
+pindex(UNSET)
+cindex(parameters, substituting unset)
+cindex(unset parameters, substituting)
+item(tt(UNSET) (tt(PLUS()u), ksh: tt(PLUS()u)))(
+Treat unset parameters as if they were empty when substituting.
+Otherwise they are treated as an error.
+)
+pindex(VERBOSE)
+cindex(tracing, of input lines)
+cindex(input, tracing)
+item(tt(VERBOSE) (tt(-v), ksh: tt(-v)))(
+Print shell input lines as they are read.
+)
+pindex(XTRACE)
+cindex(tracing, of commands)
+cindex(commands, tracing)
+item(tt(XTRACE) (tt(-x), ksh: tt(-x)))(
+Print commands and their arguments as they are executed.
+)
+pindex(ZLE)
+cindex(editor, enabling)
+cindex(enabling the editor)
+item(tt(ZLE) (tt(-Z)))(
+Use the zsh line editor.
+)
+enditem()
+texinode(Option Aliases)(Single Letter Options)(Description of Options)(Options)
+sect(Option Aliases)
+cindex(options, aliases)
+Some options have alternative names.  These aliases are never used for
+output, but can be used just like normal option names when specifying
+options to the shell.
+
+startitem()
+pindex(BRACE_EXPAND)
+item(tt(BRACE_EXPAND))(
+em(NO_)tt(IGNORE_BRACES)
+(ksh and bash compatibility)
+)
+pindex(DOT_GLOB)
+item(tt(DOT_GLOB))(
+tt(GLOB_DOTS)
+(bash compatibility)
+)
+pindex(HASH_ALL)
+item(tt(HASH_ALL))(
+tt(HASH_CMDS)
+(bash compatibility)
+)
+pindex(HIST_APPEND)
+item(tt(HIST_APPEND))(
+tt(APPEND_HISTORY)
+(bash compatibility)
+)
+pindex(HIST_EXPAND)
+item(tt(HIST_EXPAND))(
+tt(BANG_HIST)
+(bash compatibility)
+)
+pindex(LOG)
+item(tt(LOG))(
+em(NO_)tt(HIST_NO_FUNCTIONS)
+(ksh compatibility)
+)
+pindex(MAIL_WARN)
+item(tt(MAIL_WARN))(
+tt(MAIL_WARNING)
+(bash compatibility)
+)
+pindex(ONE_CMD)
+item(tt(ONE_CMD))(
+tt(SINGLE_COMMAND)
+(bash compatibility)
+)
+pindex(PHYSICAL)
+item(tt(PHYSICAL))(
+tt(CHASE_LINKS)
+(ksh and bash compatibility)
+)
+pindex(PROMPT_VARS)
+item(tt(PROMPT_VARS))(
+tt(PROMPT_SUBST)
+(bash compatibility)
+)
+pindex(STDIN)
+item(tt(STDIN))(
+tt(SHIN_STDIN)
+(ksh compatibility)
+)
+pindex(TRACK_ALL)
+item(tt(TRACK_ALL))(
+tt(HASH_CMDS)
+(ksh compatibility)
+)
+enditem()
+texinode(Single Letter Options)()(Option Aliases)(Options)
+sect(Single Letter Options)
+cindex(options, single letter)
+cindex(single letter options)
+subsect(Default set)
+startsitem()
+sitem(tt(-0))(CORRECT)
+sitem(tt(-1))(PRINT_EXIT_VALUE)
+sitem(tt(-2))(em(NO_)BAD_PATTERN)
+sitem(tt(-3))(em(NO_)NOMATCH)
+sitem(tt(-4))(GLOB_DOTS)
+sitem(tt(-5))(NOTIFY)
+sitem(tt(-6))(BG_NICE)
+sitem(tt(-7))(IGNORE_EOF)
+sitem(tt(-8))(MARK_DIRS)
+sitem(tt(-9))(AUTO_LIST)
+sitem(tt(-B))(em(NO_)BEEP)
+sitem(tt(-C))(em(NO_)CLOBBER)
+sitem(tt(-D))(PUSHD_TO_HOME)
+sitem(tt(-E))(PUSHD_SILENT)
+sitem(tt(-F))(em(NO_)GLOB)
+sitem(tt(-G))(NULL_GLOB)
+sitem(tt(-H))(RM_STAR_SILENT)
+sitem(tt(-I))(IGNORE_BRACES)
+sitem(tt(-J))(AUTO_CD)
+sitem(tt(-K))(em(NO_)BANG_HIST)
+sitem(tt(-L))(SUN_KEYBOARD_HACK)
+sitem(tt(-M))(SINGLE_LINE_ZLE)
+sitem(tt(-N))(AUTO_PUSHD)
+sitem(tt(-O))(CORRECT_ALL)
+sitem(tt(-P))(RC_EXPAND_PARAM)
+sitem(tt(-Q))(PATH_DIRS)
+sitem(tt(-R))(LONG_LIST_JOBS)
+sitem(tt(-S))(REC_EXACT)
+sitem(tt(-T))(CDABLE_VARS)
+sitem(tt(-U))(MAIL_WARNING)
+sitem(tt(-V))(em(NO_)PROMPT_CR)
+sitem(tt(-W))(AUTO_RESUME)
+sitem(tt(-X))(LIST_TYPES)
+sitem(tt(-Y))(MENU_COMPLETE)
+sitem(tt(-Z))(ZLE)
+sitem(tt(-a))(ALL_EXPORT)
+sitem(tt(-e))(ERR_EXIT)
+sitem(tt(-f))(em(NO_)RCS)
+sitem(tt(-g))(HIST_IGNORE_SPACE)
+sitem(tt(-h))(HIST_IGNORE_DUPS)
+sitem(tt(-i))(INTERACTIVE)
+sitem(tt(-k))(INTERACTIVE_COMMENTS)
+sitem(tt(-l))(LOGIN)
+sitem(tt(-m))(MONITOR)
+sitem(tt(-n))(em(NO_)EXEC)
+sitem(tt(-p))(PRIVILEGED)
+sitem(tt(-r))(RESTRICTED)
+sitem(tt(-s))(SHIN_STDIN)
+sitem(tt(-t))(SINGLE_COMMAND)
+sitem(tt(-u))(em(NO_)UNSET)
+sitem(tt(-v))(VERBOSE)
+sitem(tt(-w))(CHASE_LINKS)
+sitem(tt(-x))(XTRACE)
+sitem(tt(-y))(SH_WORD_SPLIT)
+endsitem()
+subsect(sh/ksh emulation set)
+startsitem()
+sitem(tt(-C))(em(NO_)CLOBBER)
+sitem(tt(-X))(MARK_DIRS)
+sitem(tt(-a))(ALL_EXPORT)
+sitem(tt(-b))(NOTIFY)
+sitem(tt(-e))(ERR_EXIT)
+sitem(tt(-f))(em(NO_)GLOB)
+sitem(tt(-i))(INTERACTIVE)
+sitem(tt(-l))(LOGIN)
+sitem(tt(-m))(MONITOR)
+sitem(tt(-n))(em(NO_)EXEC)
+sitem(tt(-p))(PRIVILEGED)
+sitem(tt(-r))(RESTRICTED)
+sitem(tt(-s))(SHIN_STDIN)
+sitem(tt(-t))(SINGLE_COMMAND)
+sitem(tt(-u))(em(NO_)UNSET)
+sitem(tt(-v))(VERBOSE)
+sitem(tt(-x))(XTRACE)
+endsitem()
+subsect(Also note)
+startsitem()
+sitem(tt(-A))(Used by tt(set) for setting arrays)
+sitem(tt(-c))(Used on the command line to specify a single command)
+sitem(tt(-m))(Used by tt(setopt) for pattern-matching option setting)
+sitem(tt(-o))(Used in all places to allow use of long option names)
+sitem(tt(-s))(Used by tt(set) to sort positional parameters)
+endsitem()
diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo
new file mode 100644
index 000000000..4c25a18ef
--- /dev/null
+++ b/Doc/Zsh/params.yo
@@ -0,0 +1,812 @@
+texinode(Parameters)(Options)(Expansion)(Top)
+chapter(Parameters)
+cindex(parameters)
+sect(Description)
+A parameter has a name, a value, and a number of attributes.
+A name may be any sequence of alphanumeric
+characters and underscores, or the single characters
+`tt(*)', `tt(@)', `tt(#)', `tt(?)', `tt(-)', `tt($)', or `tt(!)'.
+The value may be a em(scalar) (a string),
+an integer, or an array.
+To assign a scalar or integer value to a parameter,
+use the tt(typeset) builtin.
+findex(typeset, use of)
+To assign an array value, use `tt(set -A) var(name) var(value) ...'.
+findex(set, use of)
+The value of a parameter may also be assigned by writing:
+
+nofill(var(name)tt(=)var(value))
+
+If the integer attribute, tt(-i), is set for var(name),
+the var(value) is subject to arithmetic evaluation.
+
+In the parameter lists, the mark `<S>' indicates that the parameter is special.
+Special parameters cannot have their type changed, and they stay special even
+if unset.  `<Z>' indicates that the parameter does not exist when the shell
+initialises in tt(sh) or tt(ksh) emulation mode.
+startmenu()
+menu(Local Parameters)
+menu(Array Parameters)
+menu(Positional Parameters)
+menu(Parameters Set By The Shell)
+menu(Parameters Used By The Shell)
+endmenu()
+texinode(Local Parameters)(Array Parameters)()(Parameters)
+sect(Local Parameters)
+Shell function executions delimit scopes for shell parameters.
+(Parameters are dynamically scoped.)  The tt(typeset) builtin, and its
+alternative forms tt(declare), tt(integer), tt(local) and tt(readonly)
+(but not tt(export)), can be used to declare a parameter as being local
+to the innermost scope.
+
+When a parameter is read or assigned to, the
+innermost existing parameter of that name is used.  (That is, the
+local parameter hides any less-local parameter.)  However, assigning
+to a non-existent parameter, or declaring a new parameter with tt(export),
+causes it to be created in the em(outer)most scope.
+
+Local parameters disappear when their scope ends.
+tt(unset) can be used to delete a parameter while it is still in scope; this
+will reveal the next outer parameter of the same name.  However, em(special)
+parameters are still special when unset.
+texinode(Array Parameters)(Positional Parameters)(Local Parameters)(Parameters)
+sect(Array Parameters)
+The value of an array parameter may be assigned by writing:
+
+nofill(var(name)tt(=LPAR())var(value) ...tt(RPAR()))
+
+Individual elements of an array may be selected using a
+subscript.  A subscript of the form `tt([)var(exp)tt(])'
+selects the single element var(exp), where var(exp) is
+an arithmetic expression which will be subject to arithmetic
+expansion as if it were surrounded by `tt($LPAR()LPAR())...tt(RPAR()RPAR())'.
+The elements are numbered beginning with 1 unless the
+tt(KSH_ARRAYS) option is set when they are numbered from zero.
+pindex(KSH_ARRAYS, use of)
+
+A subscript of the form `tt([*])' or `tt([@])' evaluates to all
+elements of an array; there is no difference between the two
+except when they appear within double quotes.
+`tt("$foo[*]")' evaluates to `tt("$foo[1] $foo[2] )...tt(")', while
+`tt("$foo[@]")' evaluates to `tt("$foo[1]" "$foo[2]")', etc.
+
+A subscript of the form `tt([)var(exp1)tt(,)var(exp2)tt(])'
+selects all elements in the range var(exp1) to var(exp2),
+inclusive.
+If one of the subscripts evaluates to a negative number,
+say tt(-)var(n), then the var(n)th element from the end
+of the array is used.  Thus `tt($foo[-3])' is the third element
+from the end of the array tt(foo), and
+`tt($foo[1,-1])' is the same as `tt($foo[*])'.
+
+Subscripting may also be performed on non-array values, in which
+case the subscripts specify a substring to be extracted.
+For example, if tt(FOO) is set to `tt(foobar)', then
+`tt(echo $FOO[2,5])' prints `tt(ooba)'.
+
+Subscripts may be used inside braces used to delimit a parameter name, thus
+`tt(${foo[2]})' is equivalent to `tt($foo[2])'.  If the tt(KSH_ARRAYS)
+option is set, the braced form is the only one that will
+work, the subscript otherwise not being treated specially.
+
+If a subscript is used on the left side of an assignment the selected
+range is replaced by the expression on the right side.
+
+If the opening bracket or the comma is directly followed by an opening
+parentheses the string up to the matching closing one is considered to
+be a list of flags. The flags currently understood are:
+
+startitem()
+item(tt(e))(
+this option has no effect and retained for backward compatibility only.
+)
+item(tt(w))(
+if the parameter subscripted is a scalar than this flag makes
+subscription work on a per-word basis instead of characters.
+)
+item(tt(s:)var(string)tt(:))(
+this gives the var(string) that separates words (for use with the
+tt(w) flag).
+)
+item(tt(p))(
+Recognize the same escape sequences as the tt(print) builtin in
+the string argument of a subsequent `tt(s)' flag.
+)
+item(tt(f))(
+if the parameter subscripted is a scalar than this flag makes
+subscription work on a per-line basis instead of characters.
+This is a shorthand for `tt(pws:\n:)'.
+)
+item(tt(r))(
+if this flag is given the var(exp) is taken as a pattern and the
+result is the first matching array element, substring or word (if the
+parameter is an array, if it is a scalar, or if it is a scalar and the
+`tt(w)' flag is given, respectively); note that this is like giving a
+number: `tt($foo[(r))var(??)tt(,3])' and `tt($foo[(r))var(??)tt(,(r)f*])' work.
+)
+item(tt(R))(
+like `tt(r)', but gives the last match.
+)
+item(tt(i))(
+like `tt(r)', but gives the index of the match instead; this may not
+be combined with a second argument.
+)
+item(tt(I))(
+like `tt(i), but gives the index of the last match.
+)
+item(tt(n:)var(expr)tt(:))(
+if combined with `tt(r)', `tt(R)', `tt(i)' or `tt(I)', makes them give
+the var(n)th or var(n)th last match (if var(expr) evaluates to
+var(n)).
+)
+enditem()
+texinode(Positional Parameters)(Parameters Set By The Shell)(Array Parameters)(Parameters)
+sect(Positional Parameters)
+Positional parameters are set by the shell on invocation,
+by the tt(set) builtin, or by direct assignment.
+The parameter var(n), where var(n) is a number,
+is the var(n)th positional parameter.
+The parameters tt(*), tt(@) and tt(argv) are
+arrays containing all the positional parameters;
+thus `tt($argv[)var(n)tt(])', etc., is equivalent to simply `tt($)var(n)'.
+
+texinode(Parameters Set By The Shell)(Parameters Used By The Shell)(Positional Parameters)(Parameters)
+sect(Parameters Set By The Shell)
+The following parameters are automatically set by the shell:
+
+startitem()
+vindex(!)
+item(tt(!) <S>)(
+The process ID of the last background command invoked.
+)
+vindex(#)
+item(tt(#) <S>)(
+The number of positional parameters in decimal.
+)
+vindex(ARGC)
+item(tt(ARGC) <S> <Z>)(
+Same as tt(#).
+)
+vindex($)
+item(tt($) <S>)(
+The process ID of this shell.
+)
+vindex(-)
+item(tt(-) <S>)(
+Flags supplied to the shell on invocation or by the tt(set)
+or tt(setopt) commands.
+)
+vindex(*)
+item(tt(*) <S>)(
+An array containing the positional parameters.
+)
+vindex(argv)
+item(tt(argv) <S> <Z>)(
+Same as tt(*).
+)
+vindex(@)
+item(tt(@) <S>)(
+Same as tt(argv[@]).
+)
+vindex(?)
+item(tt(?) <S>)(
+The exit value returned by the last command.
+)
+vindex(0)
+item(tt(0) <S>)(
+The name used to invoke the current shell.  If the tt(FUNCTION_ARGZERO) option
+is set, this is set temporarily within a shell function to the name of the
+function, and within a sourced script to the name of the script.
+)
+vindex(status)
+item(tt(status) <S> <Z>)(
+Same as tt(?).
+)
+vindex(_)
+item(tt(_) <S>)(
+The last argument of the previous command.
+Also, this parameter is set in the environment of every command
+executed to the full pathname of the command.
+)
+vindex(EGID)
+item(tt(EGID) <S>)(
+The effective group ID of the shell process.  If you have sufficient
+privileges, you may change the effective group ID of the shell
+process by assigning to this parameter.  Also (assuming sufficient
+privileges), you may start a single command with a different
+effective group ID by `tt(LPAR()EGID=)var(gid)tt(; command+RPAR())'
+)
+vindex(EUID)
+item(tt(EUID) <S>)(
+The effective user ID of the shell process.  If you have sufficient
+privileges, you may change the effective user ID of the shell process
+by assigning to this parameter.  Also (assuming sufficient privileges),
+you may start a single command with a different
+effective user ID by `tt(LPAR()EUID=)var(uid)tt(; command+RPAR())'
+)
+vindex(ERRNO)
+item(tt(ERRNO) <S>)(
+The value of errno (see manref(errno)(3))
+as set by the most recently failed system call.
+This value is system dependent and is intended for debugging
+purposes.
+)
+vindex(GID)
+item(tt(GID) <S>)(
+The real group ID of the shell process.  If you have sufficient privileges,
+you may change the group ID of the shell process by assigning to this
+parameter.  Also (assuming sufficient privileges), you may start a single
+command under a different
+group ID by `tt(LPAR()GID=)var(gid)tt(; command+RPAR())'
+)
+vindex(HOST)
+item(tt(HOST))(
+The current hostname.
+)
+vindex(LINENO)
+item(tt(LINENO) <S>)(
+The line number of the current line within the current script
+being executed.
+)
+vindex(LOGNAME)
+item(tt(LOGNAME))(
+If the corresponding variable is not set in the environment of the
+shell, it is initialized to the login name corresponding to the
+current login session. This parameter is exported by default but
+this can be disabled using the tt(typeset) builtin.
+)
+vindex(MACHTYPE)
+item(tt(MACHTYPE))(
+The machine type (microprocessor class or machine model),
+as determined at compile time.
+)
+vindex(OLDPWD)
+item(tt(OLDPWD))(
+The previous working directory.  This is set when the shell initialises
+and whenever the directory changes.
+)
+vindex(OPTARG)
+item(tt(OPTARG) <S>)(
+The value of the last option argument processed by the tt(getopts)
+command.
+)
+vindex(OPTIND)
+item(tt(OPTIND) <S>)(
+The index of the last option argument processed by the tt(getopts)
+command.
+)
+vindex(OSTYPE)
+item(tt(OSTYPE))(
+The operating system, as determined at compile time.
+)
+vindex(PPID)
+item(tt(PPID) <S>)(
+The process ID of the parent of the shell.
+)
+vindex(PWD)
+item(tt(PWD))(
+The present working directory.  This is set when the shell initialises
+and whenever the directory changes.
+)
+vindex(RANDOM)
+item(tt(RANDOM) <S>)(
+A random integer from 0 to 32767, newly generated each time
+this parameter is referenced.  The random number generator
+can be seeded by assigning a numeric value to tt(RANDOM).
+)
+vindex(SECONDS)
+item(tt(SECONDS) <S>)(
+The number of seconds since shell invocation.  If this parameter
+is assigned a value, then the value returned upon reference
+will be the value that was assigned plus the number of seconds
+since the assignment.
+)
+vindex(SHLVL)
+item(tt(SHLVL) <S>)(
+Incremented by one each time a new shell is started.
+)
+vindex(signals)
+item(tt(signals))(
+An array containing the names of the signals.
+)
+vindex(TTY)
+item(tt(TTY))(
+The name of the tty associated with the shell, if any.
+)
+vindex(TTYIDLE)
+item(tt(TTYIDLE) <S>)(
+The idle time of the tty associated with the shell in seconds or -1 if there
+is no such tty.
+)
+vindex(UID)
+item(tt(UID) <S>)(
+The real user ID of the shell process.  If you have sufficient privileges,
+you may change the user ID of the shell by assigning to this parameter.
+Also (assuming sufficient privileges), you may start a single command
+under a different
+user ID by `tt(LPAR()UID=)var(uid)tt(; command+RPAR())'
+)
+vindex(USERNAME)
+item(tt(USERNAME) <S>)(
+The username corresponding to the real user ID of the shell process.  If you
+have sufficient privileges, you may change the username (and also the
+user ID and group ID) of the shell by assigning to this parameter.
+Also (assuming sufficient privileges), you may start a single command
+under a different username (and user ID and group ID)
+by `tt(LPAR()USERNAME=)var(username)tt(; command+RPAR())'
+)
+vindex(VENDOR)
+item(tt(VENDOR))(
+The vendor, as determined at compile time.
+)
+vindex(ZSH_NAME)
+item(tt(ZSH_NAME))(
+Expands to the basename of the command used to invoke this instance
+of zsh.
+)
+vindex(ZSH_VERSION)
+item(tt(ZSH_VERSION))(
+The version number of this zsh.
+)
+enditem()
+texinode(Parameters Used By The Shell)()(Parameters Set By The Shell)(Parameters)
+sect(Parameters Used By The Shell)
+The following parameters are used by the shell:
+
+startitem()
+vindex(ARGV0)
+item(tt(ARGV0))(
+If exported, its value is used as tt(argv[0]) of external commands.
+Usually used in constructs like `tt(ARGV0=emacs nethack)'.
+)
+vindex(BAUD)
+item(tt(BAUD))(
+The baud rate of the current connection.  Used by the line editor
+update mechanism to compensate for a slow terminal by delaying
+updates until necessary.  This may be profitably set to a lower value
+in some circumstances, e.g.
+for slow modems dialing into a communications server which is connected
+to a host via a fast link; in this case, this variable
+would be set by default to the speed of the fast link, and not
+the modem.
+This parameter should be set to the baud
+rate of the slowest part of the link for best performance. The compensation
+mechanism can be turned off by setting the variable to zero.
+)
+vindex(cdpath)
+vindex(CDPATH)
+item(tt(cdpath) <S> <Z> (tt(CDPATH) <S>))(
+An array (colon-separated list)
+of directories specifying the search path for the tt(cd) command.
+)
+vindex(COLUMNS)
+item(tt(COLUMNS) <S>)(
+The number of columns for this terminal session.
+Used for printing select lists and for the line editor.
+)
+vindex(DIRSTACKSIZE)
+item(tt(DIRSTACKSIZE))(
+The maximum size of the directory stack.  If the
+stack gets larger than this, it will be truncated automatically.
+This is useful with the tt(AUTO_PUSHD) option.
+pindex(AUTO_PUSHD, use of)
+)
+vindex(FCEDIT)
+item(tt(FCEDIT))(
+The default editor for the tt(fc) builtin.
+)
+vindex(fignore)
+vindex(FIGNORE)
+item(tt(fignore) <S> <Z> (tt(FIGNORE) <S>))(
+An array (colon separated list)
+containing the suffixes of files to be ignored
+during filename completion.  However, if the completion generates only files
+which would match if this variable would be ignored, than these files are
+completed anyway.
+)
+vindex(fpath)
+vindex(FPATH)
+item(tt(fpath) <S> <Z> (tt(FPATH) <S>))(
+An array (colon separated list)
+of directories specifying the search path for
+function definitions.  This path is searched when a function
+with the tt(-u) attribute is referenced.  If an executable
+file is found, then it is read and executed in the current environment.
+)
+vindex(histchars)
+item(tt(histchars) <S>)(
+Three characters used by the shell's history and lexical analysis
+mechanism.  The first character signals the start of a history
+substitution (default `tt(!)').  The second character signals the
+start of a quick history substitution (default `tt(^)').  The third
+character is the comment character (default `tt(#)').
+)
+vindex(HISTCHARS)
+item(tt(HISTCHARS) <S> <Z>)(
+Same as tt(histchars).  (Deprecated.)
+)
+vindex(HISTFILE)
+item(tt(HISTFILE))(
+The file to save the history in when an interactive shell exits.
+If unset, the history is not saved.
+)
+vindex(HISTSIZE)
+item(tt(HISTSIZE) <S>)(
+The maximum size of the history list.
+)
+vindex(HOME)
+item(tt(HOME) <S>)(
+The default argument for the tt(cd) command.
+)
+vindex(IFS)
+item(tt(IFS) <S>)(
+Internal field separators (by default space, tab, newline and NUL), that
+are used to separate words which result from
+command or parameter substitution and words read by
+the tt(read) builtin.  Any characters from the set space, tab and
+newline that appear in the IFS are called em(IFS white space).
+One or more IFS white space characters or one non-IFS white space
+character together with any adjacent IFS white space character delimit
+a field.  If an IFS white space character appears twice consecutively
+in the IFS, this character is treated as if it were not an IFS white
+space character.
+)
+vindex(KEYTIMEOUT)
+item(tt(KEYTIMEOUT))(
+The time the shell waits, in hundredths of seconds, for another key to
+be pressed when reading bound multi-character sequences.
+)
+vindex(LANG)
+item(tt(LANG) <S>)(
+This variable determines the locale category for any category not
+specifically selected via a variable starting with `tt(LC_)'.
+)
+vindex(LC_ALL)
+item(tt(LC_ALL) <S>)(
+This variable overrides the value of the `tt(LANG)' variable and the value
+of any of the other variables starting with `tt(LC_)'.
+)
+vindex(LC_COLLATE)
+item(tt(LC_COLLATE) <S>)(
+This variable determines the locale category for character collation
+information within ranges in glob brackets and for sorting.
+)
+vindex(LC_CTYPE)
+item(tt(LC_CTYPE) <S>)(
+This variable determines the locale category for character handling
+functions.
+)
+vindex(LC_MESSAGES)
+item(tt(LC_MESSAGES) <S>)(
+This variable determines the language in which messages should be
+written.  Note that zsh does not use message catalogs.
+)
+vindex(LC_TIME)
+item(tt(LC_TIME) <S>)(
+This variable determines the locale category for date and time
+formatting in prompt escape sequences.
+)
+vindex(LINES)
+item(tt(LINES) <S>)(
+The number of lines for this terminal session.
+Used for printing select lists and for the line editor.
+)
+vindex(LISTMAX)
+item(tt(LISTMAX))(
+In the line editor, the number of filenames to list without asking first.
+If set to zero, the shell asks only if the top of the listing would scroll
+off the screen.
+)
+vindex(LOGCHECK)
+item(tt(LOGCHECK))(
+The interval in seconds between checks for login/logout activity
+using the tt(watch) parameter.
+)
+vindex(MAIL)
+item(tt(MAIL))(
+If this parameter is set and tt(mailpath) is not set,
+the shell looks for mail in the specified file.
+)
+vindex(MAILCHECK)
+item(tt(MAILCHECK))(
+The interval in seconds between checks for new mail.
+)
+vindex(mailpath)
+vindex(MAILPATH)
+item(tt(mailpath) <S> <Z> (tt(MAILPATH) <S>))(
+An array (colon-separated list) of filenames to check for
+new mail.  Each filename can be followed by a `tt(?)' and a
+message that will be printed.  The message will undergo
+parameter expansion, command substitution and arithmetic
+substitution with the variable tt($_) defined as the name
+of the file that has changed.  The default message is
+`tt(You have new mail)'.  If an element is a directory
+instead of a file the shell will recursively check every
+file in every subdirectory of the element.
+)
+vindex(manpath)
+vindex(MANPATH)
+item(tt(manpath) <S> <Z> (tt(MANPATH) <S> <Z>))(
+An array (colon-separated list)
+whose value is not used by the shell.  The tt(manpath)
+array can be useful, however, since setting it also sets
+tt(MANPATH), and vice versa.
+)
+vindex(module_path)
+vindex(MODULE_PATH)
+item(tt(module_path) <S> <Z> (tt(MODULE_PATH) <S>))(
+An array (colon-separated list)
+of directories that tt(zmodload)
+searches for dynamically loadable modules.
+This is initialised to a standard pathname,
+usually `tt(/usr/local/lib/zsh/$ZSH_VERSION)'.
+(The `tt(/usr/local/lib)' part varies from installation to installation.)
+For security reasons, any value set in the environment when the shell
+is started will be ignored.
+
+These parameters only exist if the installation supports dynamic
+module loading.
+)
+vindex(NULLCMD)
+cindex(null command style)
+cindex(csh, null command style)
+cindex(ksh, null command style)
+item(tt(NULLCMD) <S>)(
+The command name to assume if a redirection is specified
+with no command.  Defaults to tt(cat).  For bf(sh)/bf(ksh)
+behavior, change this to tt(:).  For bf(csh)-like
+behavior, unset this parameter; the shell will print an
+error message if null commands are entered.
+)
+vindex(path)
+vindex(PATH)
+item(tt(path) <S> <Z> (tt(PATH) <S>))(
+An array (colon-separated list)
+of directories to search for commands.
+When this parameter is set, each directory is scanned
+and all files found are put in a hash table.
+)
+vindex(POSTEDIT)
+item(tt(POSTEDIT) <S>)(
+This string is output whenever the line editor exits.
+It usually contains termcap strings to reset the terminal.
+)
+vindex(PS1)
+item(tt(PS1) <S>)(
+The primary prompt string, printed before a command is read.
+the default is `tt(%m%# )'.  It undergoes a special form of expansion
+before being displayed; see noderef(Prompt Expansion).
+)
+vindex(PS2)
+item(tt(PS2) <S>)(
+The secondary prompt, printed when the shell needs more information
+to complete a command.
+It is expanded in the same way as tt(PS1).
+The default is `tt(%_> )', which displays any shell constructs or quotation
+marks which are currently being processed.
+)
+vindex(PS3)
+item(tt(PS3) <S>)(
+Selection prompt used within a tt(select) loop.
+It is expanded in the same way as tt(PS1).
+The default is `tt(?# )'.
+)
+vindex(PS4)
+item(tt(PS4) <S>)(
+The execution trace prompt.  Default is `tt(PLUS() )'.
+)
+vindex(PROMPT)
+xitem(tt(PROMPT) <S> <Z>)
+vindex(PROMPT2)
+xitem(tt(PROMPT2) <S> <Z>)
+vindex(PROMPT3)
+xitem(tt(PROMPT3) <S> <Z>)
+vindex(PROMPT4)
+item(tt(PROMPT4) <S> <Z>)(
+Same as tt(PS1), tt(PS2), tt(PS3) and tt(PS4),
+respectively.
+)
+vindex(psvar)
+vindex(PSVAR)
+item(tt(psvar) <S> <Z> (tt(PSVAR) <S>))(
+An array (colon-separated list) whose first nine values can be used in
+tt(PROMPT) strings.  Setting tt(psvar) also sets tt(PSVAR), and
+vice versa.
+)
+vindex(prompt)
+item(tt(prompt) <S> <Z>)(
+Same as tt(PS1).
+)
+vindex(READNULLCMD)
+item(tt(READNULLCMD) <S>)(
+The command name to assume if a single input redirection
+is specified with no command.  Defaults to tt(more).
+)
+vindex(REPORTTIME)
+item(tt(REPORTTIME))(
+If nonnegative, commands whose combined user and system execution times
+(measured in seconds) are greater than this value have timing
+statistics printed for them.
+)
+vindex(RPROMPT)
+xitem(tt(RPROMPT) <S>)
+vindex(RPS1)
+item(tt(RPS1) <S>)(
+This prompt is displayed on the right-hand side of the screen
+when the primary prompt is being displayed on the left.
+This does not work if the tt(SINGLELINEZLE) option is set.
+It is expanded in the same way as tt(PS1).
+)
+vindex(SAVEHIST)
+item(tt(SAVEHIST))(
+The maximum number of history events to save in the history file.
+)
+vindex(SPROMPT)
+item(tt(SPROMPT) <S>)(
+The prompt used for spelling correction.  The sequence
+`tt(%R)' expands to the string which presumably needs spelling
+correction, and `tt(%r)' expands to the proposed correction.
+All other prompt escapes are also allowed.
+)
+vindex(STTY)
+item(tt(STTY))(
+If this parameter is set in a command's environment, the shell runs the
+tt(stty) command with the value of this parameter as arguments in order to
+set up the terminal before executing the command. The modes apply only to the
+command, and are reset when it finishes or is suspended. If the command is
+suspended and continued later with the tt(fg) or tt(wait) builtins it will
+see the modes specified by tt(STTY), as if it were not suspended.  This
+(intentionally) does not apply if the command is continued via `tt(kill -CONT)'.
+tt(STTY) is ignored if the command is run in the background, or if it is in the
+environment of the shell but not explicitly assigned to in the input line. This
+avoids running stty at every external command by accidentally exporting it.
+Also note that tt(STTY) should not be used for window size specifications; these
+will not be local to the command.
+)
+vindex(TERM)
+item(tt(TERM) <S>)(
+The type of terminal in use.  This is used when looking up termcap sequences.
+)
+vindex(TIMEFMT)
+item(tt(TIMEFMT))(
+The format of process time reports with the tt(time) keyword.
+The default is `tt(%E real  %U user  %S system  %P %J)'.
+Recognizes the following escape sequences:
+
+startsitem()
+sitem(tt(%%))(A `tt(%)'.)
+sitem(tt(%U))(CPU seconds spent in user mode.)
+sitem(tt(%S))(CPU seconds spent in kernel mode.)
+sitem(tt(%E))(Elapsed time in seconds.)
+sitem(tt(%P))(The CPU percentage, computed as (tt(%U)PLUS()tt(%S))/tt(%E).)
+sitem(tt(%J))(The name of this job.)
+endsitem()
+
+A star may be inserted between the percent sign and flags printing time.
+This cause the time to be printed in
+`var(hh)tt(:)var(mm)tt(:)var(ss)tt(.)var(ttt)'
+format (hours and minutes are only printed if they are not zero).
+)
+vindex(TMOUT)
+item(tt(TMOUT))(
+If this parameter is nonzero, the shell will receive an tt(ALRM)
+signal if a command is not entered within the specified number of
+seconds after issuing a prompt. If there is a trap on tt(SIGALRM), it
+will be executed and a new alarm is scheduled using the value of the
+tt(TMOUT) parameter after executing the trap.  If no trap is set, and
+the idle time of the terminal is not less than the value of the
+tt(TMOUT) parameter, zsh terminates.  Otherwise a new alarm is
+scheduled to tt(TMOUT) seconds after the last keypress.
+)
+vindex(TMPPREFIX)
+item(tt(TMPPREFIX))(
+A pathname prefix which the shell will use for all temporary files.
+Note that this should include an initial part for the file name as
+well as any directory names.  The default is `tt(/tmp/zsh)'.
+)
+vindex(watch)
+vindex(WATCH)
+item(tt(watch) <S> <Z> (tt(WATCH) <S>))(
+An array (colon-separated list) of login/logout events to report.
+If it contains the single word `tt(all)', then all login/logout events
+are reported.  If it contains the single word `tt(notme)', then all
+events are reported as with `tt(all)' except tt($USERNAME).
+An entry in this list may consist of a username,
+an `tt(@)' followed by a remote hostname,
+and a `tt(%)' followed by a line (tty).
+Any or all of these components may be present in an entry;
+if a login/logout event matches all of them,
+it is reported.
+)
+vindex(WATCHFMT)
+item(tt(WATCHFMT))(
+The format of login/logout reports if the tt(watch) parameter is set.
+Default is `tt(%n has %a %l from %m)'.
+Recognizes the following escape sequences:
+
+startitem()
+item(tt(%n))(
+The name of the user that logged in/out.
+)
+item(tt(%a))(
+The observed action, i.e. "logged on" or "logged off".
+)
+item(tt(%l))(
+The line (tty) the user is logged in on.
+)
+item(tt(%M))(
+The full hostname of the remote host.
+)
+item(tt(%m))(
+The hostname up to the first `tt(.)'.  If only the
+IP address is available or the utmp field contains
+the name of an X-windows display, the whole name is printed.
+
+em(NOTE:)
+The `tt(%m)' and `tt(%M)' escapes will work only if there is a host name
+field in the utmp on your machine.  Otherwise they are
+treated as ordinary strings.
+)
+item(tt(%S) LPAR()tt(%s)RPAR())(
+Start (stop) standout mode.
+)
+item(tt(%U) LPAR()tt(%u)RPAR())(
+Start (stop) underline mode.
+)
+item(tt(%B) LPAR()tt(%b)RPAR())(
+Start (stop) boldface mode.
+)
+xitem(tt(%t))
+item(tt(%@))(
+The time, in 12-hour, am/pm format.
+)
+item(tt(%T))(
+The time, in 24-hour format.
+)
+item(tt(%w))(
+The date in `var(day)tt(-)var(dd)' format.
+)
+item(tt(%W))(
+The date in `var(mm)tt(/)var(dd)tt(/)var(yy)' format.
+)
+item(tt(%D))(
+The date in `var(yy)tt(-)var(mm)tt(-)var(dd)' format.
+)
+item(tt(%LPAR())var(x)tt(:)var(true-text)tt(:)var(false-text)tt(RPAR()))(
+Specifies a ternary expression.
+The character following the var(x) is
+arbitrary; the same character is used to separate the text
+for the "true" result from that for the "false" result.
+Both the separator and the right parenthesis may be escaped
+with a backslash.
+Ternary expressions may be nested.
+
+The test character var(x) may be any one of `tt(l)', `tt(n)', `tt(m)'
+or `tt(M)', which indicate a `true' result if the corresponding
+escape sequence would return a non-empty value; or it may be `tt(a)',
+which indicates a `true' result if the watched user has logged in,
+or `false' if he has logged out.
+Other characters evaluate to neither true nor false; the entire
+expression is omitted in this case.
+
+If the result is `true', then the var(true-text)
+is formatted according to the rules above and printed,
+and the var(false-text) is skipped.
+If `false', the var(true-text) is skipped and the var(false-text)
+is formatted and printed.
+Either or both of the branches may be empty, but
+both separators must be present in any case.
+)
+enditem()
+)
+vindex(WORDCHARS)
+item(tt(WORDCHARS) <S>)(
+A list of non-alphanumeric characters considered part of a word
+by the line editor.
+)
+vindex(ZDOTDIR)
+item(tt(ZDOTDIR))(
+The directory to search for shell startup files (.zshrc, etc),
+if not tt($HOME).
+)
+enditem()
diff --git a/Doc/Zsh/prompt.yo b/Doc/Zsh/prompt.yo
new file mode 100644
index 000000000..e1628da86
--- /dev/null
+++ b/Doc/Zsh/prompt.yo
@@ -0,0 +1,209 @@
+texinode(Prompt Expansion)(Restricted Shell)(Compatibility)(Top)
+chapter(Prompt Expansion)
+ifzman(\
+sect(Prompt Expansion)
+)\
+Prompt sequences undergo a special form of expansion.  This type of expansion
+is also available using the tt(-P) option to the tt(print) builtin.
+
+pindex(PROMPT_SUBST, use of)
+If the tt(PROMPT_SUBST) option is set, the prompt string is first subjected to
+em(parameter expansion),
+em(command substitution) and
+em(arithmetic expansion).
+See
+ifzman(\
+zmanref(zshexpn).
+)\
+ifnzman(\
+noderef(Expansion).
+)\
+
+Certain escape sequences may be recognised in the prompt string.
+
+pindex(PROMPT_BANG, use of)
+If the tt(PROMPT_BANG) option is set, a `tt(!)' in the prompt is replaced
+by the current history event number.  A literal `tt(!)' may then be
+represented as `tt(!!)'.
+
+pindex(PROMPT_PERCENT, use of)
+If the tt(PROMPT_PERCENT) option is set, certain escape sequences that
+start with `tt(%)' are expanded.
+Some escapes take an optional integer argument, which
+should appear between the `tt(%)' and the next character of the
+sequence.  The following escape sequences are recognized:
+
+startitem()
+item(tt(%%))(
+A `tt(%)'.
+)
+item(tt(%RPAR()))(
+A `tt(RPAR())'.
+)
+xitem(tt(%d))
+item(tt(%/))(
+Present working directory (tt($PWD)).
+)
+item(tt(%~))(
+tt($PWD).
+If it has a named directory as its prefix, that part is replaced
+by a `tt(~)' followed by the name of the directory.
+If it starts with tt($HOME), that part is
+replaced by a `tt(~)'.
+)
+xitem(tt(%c))
+xitem(tt(%.))
+item(tt(%C))(
+Trailing component of tt($PWD).
+An integer may follow the `tt(%)' to get more than one component.
+Unless `tt(%C)' is used, tilde contraction is performed first.
+)
+xitem(tt(%h))
+item(tt(%!))(
+Current history event number.
+)
+item(tt(%L))(
+The current value of tt($SHLVL).
+)
+item(tt(%M))(
+The full machine hostname.
+)
+item(tt(%m))(
+The hostname up to the first `tt(.)'.
+An integer may follow the `tt(%)' to specify
+how many components of the hostname are desired.
+)
+item(tt(%S) LPAR()tt(%s)RPAR())(
+Start (stop) standout mode.
+)
+item(tt(%U) LPAR()tt(%u)RPAR())(
+Start (stop) underline mode.
+)
+item(tt(%B) LPAR()tt(%b)RPAR())(
+Start (stop) boldface mode.
+)
+xitem(tt(%t))
+item(tt(%@))(
+Current time of day, in 12-hour, am/pm format.
+)
+item(tt(%T))(
+Current time of day, in 24-hour format.
+)
+item(tt(%*))(
+Current time of day in 24-hour format, with seconds.
+)
+item(tt(%n))(
+tt($USERNAME).
+)
+item(tt(%w))(
+The date in var(day)tt(-)var(dd) format.
+)
+item(tt(%W))(
+The date in var(mm)tt(/)var(dd)tt(/)var(yy) format.
+)
+item(tt(%D))(
+The date in var(yy)tt(-)var(mm)tt(-)var(dd) format.
+)
+item(tt(%D{)var(string)tt(}))(
+var(string) is formatted using the tt(strftime) function.
+See manref(strftime)(3) for more details.  Three additional codes are
+available:  tt(%f) prints the day of the month, like tt(%e) but
+without any preceding space if the day is a single digit, and
+tt(%K)/tt(%L) correspond to tt(%k)/tt(%l) for the hour of the day
+(24/12 hour clock) in the same way.
+)
+item(tt(%l))(
+The line (tty) the user is logged in on.
+)
+item(tt(%?))(
+The return code of the last command executed just before the prompt.
+)
+item(tt(%_))(
+The status of the parser, i.e. the shell constructs (like `tt(if)' and
+`tt(for)') that have been started on the command line. If given an integer
+number that many strings will be printed; zero or no integer means
+print as many as there are.
+)
+item(tt(%E))(
+Clears to end of line.
+)
+item(tt(%#))(
+A `tt(#)' if the shell is running with privileges, a `tt(%)' if not.
+Equivalent to `tt(%(!.#.%%))'.
+The definition of `privileged', for these purposes, is that either the
+effective user ID is zero, or, if POSIX.1e capabilities are supported, that
+at least one capability is raised in either the Effective or Inheritable
+capability vectors.
+)
+item(tt(%v))(
+vindex(psvar, use of)
+The value of the first element of the tt(psvar) array parameter.  Following
+the `tt(%)' with an integer gives that element of the array.
+)
+item(tt(%{)...tt(%}))(
+Include a string as a literal escape sequence.
+The string within the braces should not change the cursor
+position.  Brace pairs can nest.
+)
+item(tt(%LPAR())var(x.true-text.false-text)tt(RPAR()))(
+Specifies a ternary expression.  The character following the var(x) is
+arbitrary; the same character is used to separate the text for the
+`true' result from that for the `false' result.
+This separator may not appear in the var(true-text), except as part of a
+%-escape
+sequence.  A `tt(RPAR())' may appear in the var(false-text) as `tt(%RPAR())'.
+var(true-text)
+and var(false-text) may both contain arbitrarily-nested escape
+sequences, including further ternary expressions.
+
+The left
+parenthesis may be preceded or followed by a positive integer var(n),
+which defaults to zero.  The test character var(x) may be any of the
+following:
+
+startsitem()
+sxitem(tt(c))
+sxitem(tt(.))
+sitem(tt(~))(True if the current path, with prefix replacement, has at least var(n) elements.)
+sxitem(tt(/))
+sitem(tt(C))(True if the current absolute path has at least var(n) elements.)
+sitem(tt(t))(True if the time in minutes is equal to var(n).)
+sitem(tt(T))(True if the time in hours is equal to var(n).)
+sitem(tt(d))(True if the day of the month is equal to var(n).)
+sitem(tt(D))(True if the month is equal to var(n) (January = 0).)
+sitem(tt(w))(True if the day of the week is equal to var(n) (Sunday = 0).)
+sitem(tt(?))(True if the exit status of the last command was var(n).)
+sitem(tt(#))(True if the effective uid of the current process is var(n).)
+sitem(tt(g))(True if the effective gid of the current process is var(n).)
+sitem(tt(L))(True if the tt(SHLVL) parameter is at least var(n).)
+sitem(tt(S))(True if the tt(SECONDS) parameter is at least var(n).)
+sitem(tt(v))(True if the array tt(psvar) has at least var(n) elements.)
+sitem(tt(_))(True if at least var(n) shell constructs were started.)
+sitem(tt(!))(True if the shell is running with privileges.)
+endsitem()
+)
+xitem(tt(%<)var(string)tt(<))
+xitem(tt(%>)var(string)tt(>))
+item(tt(%[)var(xstring)tt(]))(
+Specifies truncation behaviour.
+The third, deprecated, form is equivalent to `tt(%)var(xstringx)',
+i.e. var(x) may be `tt(<)' or `tt(>)'.
+The numeric argument, which in the third form may appear immediately
+after the `tt([)', specifies the maximum permitted length of
+the various strings that can be displayed in the prompt.  If this
+integer is zero, or missing, truncation is disabled.  Truncation is
+initially disabled.
+The var(string) will be displayed in
+place of the truncated portion of any string.
+
+The forms with `tt(<)' truncate at the left of the string,
+and the forms with `tt(>)' truncate at the right of the string.
+For example, if the current directory is `tt(/home/pike)',
+the prompt `tt(%8<..<%/)' will expand to `tt(..e/pike)'.
+In this string, the terminating character (`tt(<)', `tt(>)' or `tt(])'),
+or in fact any character, may be quoted by a preceding `tt(\)'.
+% escapes are em(not) recognised.
+If the var(string) is longer than the specified truncation length,
+it will appear in full, completely replacing the truncated string.
+)
+enditem()
diff --git a/Doc/Zsh/redirect.yo b/Doc/Zsh/redirect.yo
new file mode 100644
index 000000000..8955e67ac
--- /dev/null
+++ b/Doc/Zsh/redirect.yo
@@ -0,0 +1,183 @@
+texinode(Redirection)(Command Execution)(Shell Grammar)(Top)
+chapter(Redirection)
+cindex(redirection)
+ifzman(\
+sect(Redirection)
+)\
+cindex(file descriptors)
+cindex(descriptors, file)
+If a command is followed by tt(&)
+and job control is not active,
+then the default standard input
+for the command is the empty file tt(/dev/null).
+Otherwise, the environment for the execution of a command contains the
+file descriptors of the invoking shell as modified by
+input/output specifications.
+
+The following may appear anywhere in a simple command
+or may precede or follow a complex command.
+Substitution occurs before var(word) or var(digit)
+is used except as noted below.
+If the result of substitution on var(word)
+produces more than one filename,
+redirection occurs for each
+separate filename in turn.
+
+startitem()
+item(tt(<) var(word))(
+Open file var(word) for reading as standard input.
+)
+item(tt(<>) var(word))(
+Open file var(word) for reading and writing as standard input.
+If the file does not exist then it is created.
+)
+item(tt(>) var(word))(
+Open file var(word) for writing as standard output.
+If the file does not exist then it is created.
+If the file exists, and the tt(CLOBBER) option is unset,
+this causes an error;
+otherwise, it is truncated to zero length.
+)
+xitem(tt(>|) var(word))
+item(tt(>!) var(word))(
+Same as tt(>), except that the file is truncated to zero length
+if it exists, even if tt(CLOBBER) is unset.
+)
+item(tt(>>) var(word))(
+Open file var(word) for writing in append mode as standard output.
+If the file does not exist, and the tt(CLOBBER)
+option is unset, this causes an error;
+otherwise, the file is created.
+)
+xitem(tt(>>|) var(word))
+item(tt(>>!) var(word))(
+Same as tt(>>), except that the file is created if it does not
+exist, even if tt(CLOBBER) is unset.
+)
+item(tt(<<)[tt(-)] var(word))(
+The shell input is read up to a line that is the same as
+var(word), or to an end-of-file.
+No parameter substitution, command substitution or
+filename generation is performed on var(word).
+The resulting document, called a
+em(here-document), becomes the standard input.
+
+If any character of var(word) is quoted with
+single or double quotes or a `tt(\)',
+no interpretation is placed upon the characters of the document.
+Otherwise, parameter and command substitution
+occurs, `tt(\)' followed by a newline is removed,
+and `tt(\)' must be used to quote the characters
+`tt(\)', `tt($)', `tt(`)' and the first character of var(word).
+
+If tt(<<-) is used, then all leading
+tabs are stripped from var(word) and from the document.
+)
+item(tt(<<<) var(word))(
+Perform shell expansion on var(word) and pass the result
+to standard input.  This is known as a em(here-string).
+)
+xitem(tt(<&) var(digit))
+item(tt(>&) var(digit))(
+The standard input/output is duplicated from file descriptor
+var(digit) (see manref(dup)(2)).
+)
+xitem(tt(<& -))
+item(tt(>& -))(
+Close the standard input/output.
+)
+xitem(tt(<& p))
+item(tt(>& p))(
+The input/output from/to the coprocess is moved to the standard input/output.
+)
+item(tt(>&) var(word))(
+Same as `tt(>) var(word) tt(2>&1)'.
+)
+item(tt(>>&) var(word))(
+Same as `tt(>>) var(word) tt(2>&1)'.
+)
+enditem()
+
+If one of the above is preceded by a digit, then the file
+descriptor referred to is that specified by the digit
+instead of the default 0 or 1.
+The order in which redirections are specified is significant.
+The shell evaluates each redirection in terms of the
+(em(file descriptor), em(file))
+association at the time of evaluation.
+For example:
+
+nofill(... tt(1>)var(fname) tt(2>&1))
+
+first associates file descriptor 1 with file var(fname).
+It then associates file descriptor 2 with the file associated with file
+descriptor 1 (that is, var(fname)).
+If the order of redirections were reversed,
+file descriptor 2 would be associated
+with the terminal (assuming file descriptor 1 had been)
+and then file descriptor 1 would be associated with file var(fname).
+sect(Multios)
+pindex(MULTIOS, use of)
+If the user tries to open a file descriptor for writing more than once,
+the shell opens the file descriptor as a pipe to a process that copies
+its input to all the specified outputs, similar to bf(tee),
+provided the tt(MULTIOS) option is set.  Thus:
+
+nofill(tt(date >foo >bar))
+
+writes the date to two files, named `tt(foo)' and `tt(bar)'.
+Note that a pipe is an implicit redirection; thus
+
+nofill(tt(date >foo | cat))
+
+writes the date to the file `tt(foo)', and also pipes it to cat.
+
+If the tt(MULTIOS)
+option is set, the word after a redirection operator is also subjected
+to filename generation (globbing).  Thus
+
+nofill(tt(: > *))
+
+will truncate all files in the current directory,
+assuming there's at least one.  (Without the tt(MULTIOS)
+option, it would create an empty file called `tt(*)'.)
+Similarly, you can do
+
+nofill(tt(echo exit 0 >> *.sh))
+
+If the user tries to open a file descriptor for reading more than once,
+the shell opens the file descriptor as a pipe to a process that copies
+all the specified inputs to its output in the order
+specified, similar to bf(cat),
+provided the tt(MULTIOS) option is set.  Thus
+
+nofill(tt(sort <foo <fubar))
+
+or even
+
+nofill(tt(sort <f{oo,ubar}))
+
+is equivalent to `tt(cat foo fubar | sort)'.
+
+Note that a pipe is an implicit redirection; thus
+
+nofill(tt(cat bar | sort <foo))
+
+is equivalent to `tt(cat bar foo | sort)' (note the order of the inputs).
+
+If the tt(MULTIOS) option is em(un)set,
+each redirection replaces the previous redirection for that file descriptor.
+However, all files redirected to are actually opened, so
+
+nofill(tt(echo foo > bar > baz))
+
+when tt(MULTIOS) is unset will truncate bar, and write `tt(foo)' into baz.
+
+If a simple command consists of one or more redirection operators
+and zero or more parameter assignments, but no command name,
+the command named in the shell variable tt(READNULLCMD) is assumed.
+(If tt(READNULLCMD) is empty or not set, `tt(cat)' is used.)  Thus
+
+nofill(tt(< file))
+
+prints the contents of tt(file).
diff --git a/Doc/Zsh/restricted.yo b/Doc/Zsh/restricted.yo
new file mode 100644
index 000000000..a61fd4955
--- /dev/null
+++ b/Doc/Zsh/restricted.yo
@@ -0,0 +1,44 @@
+texinode(Restricted Shell)(Expansion)(Prompt Expansion)(Top)
+chapter(Restricted Shell)
+ifzman(\
+sect(Restricted Shell)
+)\
+cindex(restricted shell)
+pindex(RESTRICTED)
+When the basename of the command used to invoke zsh starts with the letter
+`tt(r)' or the `tt(-r)' command line option is supplied at invocation, the
+shell becomes restricted.  Emulation mode is determined after stripping the
+letter `tt(r)' from the invocation name.  The following are disabled in
+restricted mode:
+
+startitemize()
+itemiz(changing directories with the tt(cd) builtin)
+itemiz(changing or unsetting the tt(PATH), tt(path), tt(MODULE_PATH),
+tt(module_path), tt(SHELL), tt(HISTFILE), tt(HISTSIZE), tt(GID), tt(EGID),
+tt(UID), tt(EUID), tt(USERNAME), tt(LD_LIBRARY_PATH),
+tt(LD_AOUT_LIBRARY_PATH), tt(LD_PRELOAD) and  tt(LD_AOUT_PRELOAD)
+parameters)
+itemiz(specifying command names containing tt(/))
+itemiz(specifying command pathnames using tt(hash))
+itemiz(redirecting output to files)
+itemiz(using the tt(exec) builtin command to replace the shell with another
+command)
+itemiz(using tt(jobs -Z) to overwrite the shell process' argument and
+environment space)
+itemiz(using the tt(ARGV0) parameter to override tt(argv[0]) for external
+commands)
+itemiz(turning off restricted mode with tt(set +r) or tt(unsetopt
+RESTRICTED))
+itemiz(specifying modules to be loaded with an explicitly given
+pathname containing slashes)
+enditemize()
+
+These restrictions are enforced after processing the startup files.  The
+startup files should set up tt(PATH) to point to a directory of commands
+which can be safely invoked in the restricted environment.  They may also
+add further restrictions by disabling selected builtins.
+
+Restricted mode can also be activated any time by setting the
+tt(RESTRICTED) option.  This immediately enables all the restrictions
+described above even if the shell still have not processed all startup
+files.
diff --git a/Doc/Zsh/seealso.yo b/Doc/Zsh/seealso.yo
new file mode 100644
index 000000000..8289e6628
--- /dev/null
+++ b/Doc/Zsh/seealso.yo
@@ -0,0 +1,25 @@
+texinode(See Also)()(The Zsh Web Page)(Introduction)
+sect(See Also)
+manref(sh)(1),
+manref(csh)(1),
+manref(tcsh)(1),
+manref(rc)(1),
+manref(bash)(1),
+manref(ksh)(1)\
+ifzshone(\
+,
+zmanref(zshbuiltins),
+zmanref(zshcompctl),
+zmanref(zshexpn),
+zmanref(zshmisc),
+zmanref(zshmodules),
+zmanref(zshoptions),
+zmanref(zshparam),
+zmanref(zshzle)\
+)\
+
+
+bf(IEEE Standard for information Technology -
+Portable Operating System Interface (POSIX) -
+Part 2: Shell and Utilities),
+IEEE Inc, 1993, ISBN 1-55937-255-9.
diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
new file mode 100644
index 000000000..fccf538bd
--- /dev/null
+++ b/Doc/Zsh/zle.yo
@@ -0,0 +1,1076 @@
+texinode(Zsh Line Editor)(Programmable Completion)(Shell Builtin Commands)(Top)
+chapter(Zsh Line Editor)
+cindex(line editor)
+cindex(editor, line)
+sect(Description)
+pindex(ZLE, use of)
+If the tt(ZLE) option is set (it is by default)
+and the shell input is attached to the terminal, the user
+is allowed to edit command lines.
+
+There are two display modes.  The first, multiline mode, is the
+default.  It only works if the tt(TERM) parameter is set to a valid
+terminal type that can move the cursor up.  The second, single line
+mode, is used if tt(TERM) is invalid or incapable of moving the
+cursor up, or if the tt(SINGLE_LINE_ZLE) option is set.
+pindex(SINGLE_LINE_ZLE, use of)
+cindex(ksh, editor mode)
+cindex(editor ksh style)
+This mode
+is similar to bf(ksh), and uses no termcap sequences.  If tt(TERM) is
+"emacs", the tt(ZLE) option will be unset by default.
+sect(Keymaps)
+cindex(keymaps)
+cindex(key bindings)
+cindex(bindings, key)
+A keymap in ZLE contains a set of bindings between key sequences
+and ZLE commands.  The empty key sequence cannot be bound.
+
+There can be any number of keymaps at any time, and each keymap has one
+or more names.  If all of a keymap's names are deleted, it disappears.
+findex(bindkey, use of)
+tt(bindkey) can be used to manipulate keymap names.
+
+Initially, there are four keymaps:
+
+startsitem()
+sitem(tt(emacs))(EMACS emulation)
+sitem(tt(viins))(vi emulation - insert mode)
+sitem(tt(vicmd))(vi emulation - command mode)
+sitem(tt(.safe))(fallback keymap)
+endsitem()
+
+The `tt(.safe)' keymap is special.  It can never be altered, and the name
+can never be removed.  However, it can be linked to other names, which can
+be removed.  In the future other special keymaps may be added; users should
+avoid using names beginning with `tt(.)' for their own keymaps.
+
+vindex(VISUAL)
+vindex(EDITOR)
+In addition to these four names, either `tt(emacs)' or `tt(viins)' is
+also linked to the name `tt(main)'.  If one of the tt(VISUAL) or
+tt(EDITOR) environment variables contain the string `tt(vi)' when the shell
+starts up then it will be `tt(viins)', otherwise it will be `tt(emacs)'.
+tt(bindkey)'s tt(-e) and tt(-v)
+options provide a convenient way to override this default choice.
+
+When the editor starts up, it will select the `tt(main)' keymap.
+If that keymap doesn't exist, it will use `tt(.safe)' instead.
+
+In the `tt(.safe)' keymap, each single key is bound to tt(self-insert),
+except for ^J (line feed) and ^M (return) which are bound to tt(accept-line).
+This is deliberately not pleasant to use; if you are using it, it
+means you deleted the main keymap, and you should put it back.
+subsect(Reading Commands)
+When ZLE is reading a command from the terminal, it may read a sequence
+that is bound to some command and is also a prefix of a longer bound string.
+In this case ZLE will wait a certain time to see if more characters
+are typed, and if not (or they don't match any longer string) it will
+execute the binding.  This timeout is defined by the tt(KEYTIMEOUT) parameter;
+its default is 0.4 sec.  No timeout is done if the prefix string is not bound.
+
+As well as ZLE commands, key sequences can be bound to other strings, by using
+`tt(bindkey -s)'.
+When such a sequence is read, the replacement string is pushed back as input,
+and the command reading process starts again using these fake keystrokes.
+This input can itself invoke further replacement strings, but in order to
+detect loops the process will be stopped if there are twenty such replacements
+without a real command being read.
+sect(Widgets)
+cindex(widgets)
+All actions in the editor are performed by `widgets'.  A widget's job is
+simply to perform some small action.  The ZLE commands that key sequences
+in keymaps are bound to are in fact widgets.  Widgets can be user-defined
+or built in.
+
+There are 162 standard widgets built in to ZLE (see sectref(Standard Widgets)).
+Other built-in widgets can be defined by other modules (see
+ifzman(zmanref(zshmodules))\
+ifnzman(noderef(Zsh Modules))\
+).  Each built-in widget has two names: its normal canonical name, and the
+same name preceded by a `tt(.)'.  The `tt(.)' name is special: it can't be
+rebound to a different widget.  This makes the widget available even when
+its usual name has been redefined.
+
+User-defined widgets are defined using `tt(zle -N)', and implemented
+as shell functions.  When the widget is executed, the corresponding
+shell function is executed, and can perform editing (or other) actions.
+It is recommended that user-defined widgets should not have names
+starting with `tt(.)'.
+sect(User-Defined Widgets)
+cindex(widgets, user-defined)
+User-defined widgets, being implemented as shell functions,
+can execute any normal shell command.  They can also run other widgets
+(whether built-in or user-defined) using the tt(zle) builtin command.
+Finally, they can examine and edit the ZLE buffer being edited by
+reading and setting the special parameters described below.
+
+cindex(parameters, editor)
+cindex(parameters, zle)
+These special parameters are always available in widget functions, but
+are not in any way special outside ZLE.  If they have some normal value
+outside ZLE, that value is temporarily inaccessible, but will return
+when the widget function exits.  These special parameters in fact have
+local scope, like parameters created in a function using tt(local).
+
+startitem()
+vindex(BUFFER)
+item(tt(BUFFER) (scalar))(
+The entire contents of the edit buffer.  If it is written to, the
+cursor remains at the same offset, unless that would put it outside the
+buffer.
+)
+vindex(CURSOR)
+item(tt(CURSOR) (integer))(
+The offset of the cursor, within the edit buffer.  This is in the range
+0 to tt($#BUFFER), and is by definition equal to tt($#LBUFFER).
+Attempts to move the cursor outside the buffer will result in the
+cursor being moved to the appropriate end of the buffer.
+)
+vindex(LBUFFER)
+item(tt(LBUFFER) (scalar))(
+The part of the buffer that lies to the left of the cursor position.
+If it is assigned to, only that part of the buffer is replaced, and the
+cursor remains between the new tt($LBUFFER) and the old tt($RBUFFER).
+)
+vindex(RBUFFER)
+item(tt(RBUFFER) (scalar))(
+The part of the buffer that lies to the right of the cursor position.
+If it is assigned to, only that part of the buffer is replaced, and the
+cursor remains between the old tt($LBUFFER) and the new tt($RBUFFER).
+)
+enditem()
+sect(Standard Widgets)
+cindex(widgets, standard)
+The following is a list of all the standard widgets,
+and their default bindings in emacs mode,
+vi command mode and vi insert mode
+(the `tt(emacs)', `tt(vicmd)' and `tt(viins)' keymaps, respectively).
+startmenu()
+menu(Movement)
+menu(History Control)
+menu(Modifying Text)
+menu(Arguments)
+menu(Completion)
+menu(Miscellaneous)
+endmenu()
+texinode(Movement)(History Control)()(Zsh Line Editor)
+subsect(Movement)
+startitem()
+tindex(vi-backward-blank-word)
+item(tt(vi-backward-blank-word) (unbound) (B) (unbound))(
+Move backward one word, where a word is defined as a series of
+non-blank characters.
+)
+tindex(backward-char)
+item(tt(backward-char) (^B ESC-[D) (unbound) (unbound))(
+Move backward one character.
+)
+tindex(vi-backward-char)
+item(tt(vi-backward-char) (unbound) (^H h ^?) (unbound))(
+Move backward one character, without changing lines.
+)
+tindex(backward-word)
+item(tt(backward-word) (ESC-B ESC-b) (unbound) (unbound))(
+Move to the beginning of the previous word.
+)
+tindex(emacs-backward-word)
+item(tt(emacs-backward-word))(
+Move to the beginning of the previous word.
+)
+tindex(vi-backward-word)
+item(tt(vi-backward-word) (unbound) (b) (unbound))(
+Move to the beginning of the previous word, vi-style.
+)
+tindex(beginning-of-line)
+item(tt(beginning-of-line) (^A) (unbound) (unbound))(
+Move to the beginning of the line.  If already at the beginning
+of the line, move to the beginning of the previous line, if any.
+)
+tindex(vi-beginning-of-line)
+item(tt(vi-beginning-of-line))(
+Move to the beginning of the line, without changing lines.
+)
+tindex(end-of-line)
+item(tt(end-of-line) (^E) (unbound) (unbound))(
+Move to the end of the line.  If already at the end
+of the line, move to the end of the next line, if any.
+)
+tindex(vi-end-of-line)
+item(tt(vi-end-of-line) (unbound) ($) (unbound))(
+Move to the end of the line.
+If an argument is given to this command, the cursor will be moved to
+the end of the line (argument - 1) lines down.
+)
+tindex(vi-forward-blank-word)
+item(tt(vi-forward-blank-word) (unbound) (W) (unbound))(
+Move forward one word, where a word is defined as a series of
+non-blank characters.
+)
+tindex(vi-forward-blank-word-end)
+item(tt(vi-forward-blank-word-end) (unbound) (E) (unbound))(
+Move to the end of the current word, or, if at the end of the current word,
+to the end of the next word,
+where a word is defined as a series of non-blank characters.
+)
+tindex(forward-char)
+item(tt(forward-char) (^F ESC-[C) (unbound) (unbound))(
+Move forward one character.
+)
+tindex(vi-forward-char)
+item(tt(vi-forward-char) (unbound) (space l) (unbound))(
+Move forward one character.
+)
+tindex(vi-find-next-char)
+item(tt(vi-find-next-char) (^X^F) (f) (unbound))(
+Read a character from the keyboard, and move to
+the next occurrence of it in the line.
+)
+tindex(vi-find-next-char-skip)
+item(tt(vi-find-next-char-skip) (unbound) (t) (unbound))(
+Read a character from the keyboard, and move to
+the position just before the next occurrence of it in the line.
+)
+tindex(vi-find-prev-char)
+item(tt(vi-find-prev-char) (unbound) (F) (unbound))(
+Read a character from the keyboard, and move to
+the previous occurrence of it in the line.
+)
+tindex(vi-find-prev-char-skip)
+item(tt(vi-find-prev-char-skip) (unbound) (T) (unbound))(
+Read a character from the keyboard, and move to
+the position just after the previous occurrence of it in the line.
+)
+tindex(vi-first-non-blank)
+item(tt(vi-first-non-blank) (unbound) (^) (unbound))(
+Move to the first non-blank character in the line.
+)
+tindex(vi-forward-word)
+item(tt(vi-forward-word) (unbound) (w) (unbound))(
+Move forward one word, vi-style.
+)
+tindex(forward-word)
+item(tt(forward-word) (ESC-F ESC-f) (unbound) (unbound))(
+Move to the beginning of the next word.
+The editor's idea of a word is specified with the tt(WORDCHARS)
+parameter.
+)
+tindex(emacs-forward-word)
+item(tt(emacs-forward-word))(
+Move to the end of the next word.
+)
+tindex(vi-forward-word-end)
+item(tt(vi-forward-word-end) (unbound) (e) (unbound))(
+Move to the end of the next word.
+)
+tindex(vi-goto-column)
+item(tt(vi-goto-column) (ESC-|) (|) (unbound))(
+Move to the column specified by the numeric argument.
+)
+tindex(vi-goto-mark)
+item(tt(vi-goto-mark) (unbound) (`) (unbound))(
+Move to the specified mark.
+)
+tindex(vi-goto-mark-line)
+item(tt(vi-goto-mark-line) (unbound) (') (unbound))(
+Move to beginning of the line containing the specified mark.
+)
+tindex(vi-repeat-find)
+item(tt(vi-repeat-find) (unbound) (;) (unbound))(
+Repeat the last tt(vi-find) command.
+)
+tindex(vi-rev-repeat-find)
+item(tt(vi-rev-repeat-find) (unbound) (,) (unbound))(
+Repeat the last tt(vi-find) command in the opposite direction.
+)
+enditem()
+texinode(History Control)(Modifying Text)(Movement)(Zsh Line Editor)
+subsect(History Control)
+startitem()
+tindex(beginning-of-buffer-or-history)
+item(tt(beginning-of-buffer-or-history) (ESC-<) (unbound) (unbound))(
+Move to the beginning of the buffer, or if already there,
+move to the first event in the history list.
+)
+tindex(beginning-of-line-hist)
+item(tt(beginning-of-line-hist))(
+Move to the beginning of the line.  If already at the
+beginning of the buffer, move to the previous history line.
+)
+tindex(beginning-of-history)
+item(tt(beginning-of-history))(
+Move to the first event in the history list.
+)
+tindex(down-line-or-history)
+item(tt(down-line-or-history) (^N ESC-[B) (j) (unbound))(
+Move down a line in the buffer, or if already at the bottom line,
+move to the next event in the history list.
+)
+tindex(vi-down-line-or-history)
+item(tt(vi-down-line-or-history) (unbound) (PLUS()) (unbound))(
+Move down a line in the buffer, or if already at the bottom line,
+move to the next event in the history list.
+Then move to the first non-blank character on the line.
+)
+tindex(down-line-or-search)
+item(tt(down-line-or-search))(
+Move down a line in the buffer, or if already at the bottom line,
+search forward in the history for a line beginning with the first
+word in the buffer.
+)
+tindex(down-history)
+item(tt(down-history) (unbound) (^N) (unbound))(
+Move to the next event in the history list.
+)
+tindex(history-beginning-search-backward)
+item(tt(history-beginning-search-backward))(
+Search backward in the history for a line beginning with the current
+line up to the cursor.
+This leaves the cursor in its original position.
+)
+tindex(end-of-buffer-or-history)
+item(tt(end-of-buffer-or-history) (ESC->) (unbound) (unbound))(
+Move to the end of the buffer, or if already there,
+move to the last event in the history list.
+)
+tindex(end-of-line-hist)
+item(tt(end-of-line-hist))(
+Move to the end of the line.  If already at the end of
+the buffer, move to the next history line.
+)
+tindex(end-of-history)
+item(tt(end-of-history))(
+Move to the last event in the history list.
+)
+tindex(vi-fetch-history)
+item(tt(vi-fetch-history) (unbound) (G) (unbound))(
+Fetch the history line specified by the numeric argument.
+This defaults to the current history line
+(i.e. the one that isn't history yet).
+)
+tindex(history-incremental-search-backward)
+item(tt(history-incremental-search-backward) (^R ^Xr) (unbound) (unbound))(
+Search backward incrementally for a specified string.  The search is
+case-insensitive if the search string does not have uppercase letters and no
+numeric argument was given.  The string may begin with `tt(^)' to anchor the
+search to the beginning of the line.
+
+A restricted set of editing functions
+is available in the mini-buffer.  An interrupt signal, as defined by the stty
+setting, will stop the search and go back to the original line.  An undefined
+key will have the same effect. The supported functions are:
+tt(backward-delete-char),
+tt(vi-backward-delete-char),
+tt(clear-screen),
+tt(redisplay),
+tt(quoted-insert),
+tt(vi-quoted-insert),
+tt(accept-and-hold),
+tt(accept-and-infer-next-history),
+tt(accept-line) and
+tt(accept-line-and-down-history).
+
+tt(magic-space) just inserts a space.
+tt(vi-cmd-mode) toggles between the `tt(main)' and `tt(vicmd)' keymaps;
+the `tt(main)' keymap (insert mode) will be selected initially.
+tt(history-incremental-search-backward) will get the
+next occurrence of the contents of the mini-buffer.
+tt(history-incremental-search-forward) inverts the sense of the search.
+tt(vi-repeat-search) and tt(vi-rev-repeat-search) are similarly supported.
+The direction of the search is indicated in the mini-buffer.
+
+Any multi-character string
+that is not bound to one of the above functions will beep and interrupt the
+search, leaving the last found line in the buffer. Any single character that
+is not bound to one of the above functions, or tt(self-insert) or
+tt(self-insert-unmeta), will have the same effect but the function will be
+executed.
+)
+tindex(history-incremental-search-forward)
+item(tt(history-incremental-search-forward) (^S ^Xs) (unbound) (unbound))(
+Search forward incrementally for a specified string.  The search is
+case-insensitive if the search string does not have uppercase letters and no
+numeric argument was given.  The string may begin with `tt(^)' to anchor the
+search to the beginning of the line.  The functions available in the
+mini-buffer are the same as for tt(history-incremental-search-backward).
+)
+tindex(history-search-backward)
+item(tt(history-search-backward) (ESC-P ESC-p) (unbound) (unbound))(
+Search backward in the history for a line beginning with the first
+word in the buffer.
+)
+tindex(vi-history-search-backward)
+item(tt(vi-history-search-backward) (unbound) (/) (unbound))(
+Search backward in the history for a specified string.
+The string may begin with `tt(^)' to anchor the search to the
+beginning of the line.
+
+A restricted set of editing functions is available in
+the mini-buffer.  An interrupt signal, as defined by the stty setting,  will
+stop the search.
+The functions available in the mini-buffer are:
+tt(accept-line),
+tt(backward-delete-char),
+tt(vi-backward-delete-char),
+tt(backward-kill-word),
+tt(vi-backward-kill-word),
+tt(clear-screen),
+tt(redisplay),
+tt(quoted-insert)
+and
+tt(vi-quoted-insert).
+
+tt(vi-cmd-mode) is treated the same as accept-line, and
+tt(magic-space) is treated as a space.
+Any other character that is not bound to self-insert or
+self-insert-unmeta will beep and be ignored. If the function is called from vi
+command mode, the bindings of the current insert mode will be used.
+)
+tindex(history-search-forward)
+item(tt(history-search-forward) (ESC-N ESC-n) (unbound) (unbound))(
+Search forward in the history for a line beginning with the first
+word in the buffer.
+)
+tindex(vi-history-search-forward)
+item(tt(vi-history-search-forward) (unbound) (?) (unbound))(
+Search forward in the history for a specified string.
+The string may begin with `tt(^)' to anchor the search to the
+beginning of the line. The functions available in the mini-buffer are the same
+as for tt(vi-history-search-backward).
+)
+tindex(infer-next-history)
+item(tt(infer-next-history) (^X^N) (unbound) (unbound))(
+Search in the history list for a line matching the current one and
+fetch the event following it.
+)
+tindex(insert-last-word)
+item(tt(insert-last-word) (ESC-_ ESC-.) (unbound) (unbound))(
+Insert the last word from the previous history event at the
+cursor position.  If a positive numeric argument is given,
+insert that word from the end of the previous history event.
+If the argument is zero or negative insert that word from the
+left (zero inserts the previous command word).
+)
+tindex(vi-repeat-search)
+item(tt(vi-repeat-search) (unbound) (n) (unbound))(
+Repeat the last vi history search.
+)
+tindex(vi-rev-repeat-search)
+item(tt(vi-rev-repeat-search) (unbound) (N) (unbound))(
+Repeat the last vi history search, but in reverse.
+)
+tindex(up-line-or-history)
+item(tt(up-line-or-history) (^P ESC-[A) (k) (unbound))(
+Move up a line in the buffer, or if already at the top line,
+move to the previous event in the history list.
+)
+tindex(vi-up-line-or-history)
+item(tt(vi-up-line-or-history) (unbound) (-) (unbound))(
+Move up a line in the buffer, or if already at the top line,
+move to the previous event in the history list.
+Then move to the first non-blank character on the line.
+)
+tindex(up-line-or-search)
+item(tt(up-line-or-search))(
+Move up a line in the buffer, or if already at the top line,
+search backward in the history for a line beginning with the
+first word in the buffer.
+)
+tindex(up-history)
+item(tt(up-history) (unbound) (^P) (unbound))(
+Move to the previous event in the history list.
+)
+tindex(history-beginning-search-forward)
+item(tt(history-beginning-search-forward))(
+Search forward in the history for a line beginning with the current
+line up to the cursor.
+This leaves the cursor in its original position.
+)
+enditem()
+texinode(Modifying Text)(Arguments)(History Control)(Zsh Line Editor)
+subsect(Modifying Text)
+startitem()
+tindex(vi-add-eol)
+item(tt(vi-add-eol) (unbound) (A) (unbound))(
+Move to the end of the line and enter insert mode.
+)
+tindex(vi-add-next)
+item(tt(vi-add-next) (unbound) (a) (unbound))(
+Enter insert mode after the current cursor position, without changing lines.
+)
+tindex(backward-delete-char)
+item(tt(backward-delete-char) (^H ^?) (unbound) (unbound))(
+Delete the character behind the cursor.
+)
+tindex(vi-backward-delete-char)
+item(tt(vi-backward-delete-char) (unbound) (X) (^H))(
+Delete the character behind the cursor, without changing lines.
+If in insert mode, this won't delete past the point where insert mode was
+last entered.
+)
+tindex(backward-delete-word)
+item(tt(backward-delete-word))(
+Delete the word behind the cursor.
+)
+tindex(backward-kill-line)
+item(tt(backward-kill-line))(
+Kill from the beginning of the line to the cursor position.
+)
+tindex(backward-kill-word)
+item(tt(backward-kill-word) (^W ESC-^H ESC-^?) (unbound) (unbound))(
+Kill the word behind the cursor.
+)
+tindex(vi-backward-kill-word)
+item(tt(vi-backward-kill-word) (unbound) (unbound) (^W))(
+Kill the word behind the cursor, without going past the point where insert
+mode was last entered.
+)
+tindex(capitalize-word)
+item(tt(capitalize-word) (ESC-C ESC-c) (unbound) (unbound))(
+Capitalize the current word and move past it.
+)
+tindex(vi-change)
+item(tt(vi-change) (unbound) (c) (unbound))(
+Read a movement command from the keyboard, and kill
+from the cursor position to the endpoint of the movement.
+Then enter insert mode.
+If the command is tt(vi-change), change the current line.
+)
+tindex(vi-change-eol)
+item(tt(vi-change-eol) (unbound) (C) (unbound))(
+Kill to the end of the line and enter insert mode.
+)
+tindex(vi-change-whole-line)
+item(tt(vi-change-whole-line) (unbound) (S) (unbound))(
+Kill the current line and enter insert mode.
+)
+tindex(copy-region-as-kill)
+item(tt(copy-region-as-kill) (ESC-W ESC-w) (unbound) (unbound))(
+Copy the area from the cursor to the mark to the kill buffer.
+)
+tindex(copy-prev-word)
+item(tt(copy-prev-word) (ESC-^_) (unbound) (unbound))(
+Duplicate the word behind the cursor.
+)
+tindex(vi-delete)
+item(tt(vi-delete) (unbound) (d) (unbound))(
+Read a movement command from the keyboard, and kill
+from the cursor position to the endpoint of the movement.
+If the command is tt(vi-delete), kill the current line.
+)
+tindex(delete-char)
+item(tt(delete-char))(
+Delete the character under the cursor.
+)
+tindex(vi-delete-char)
+item(tt(vi-delete-char) (unbound) (x) (unbound))(
+Delete the character under the cursor,
+without going past the end of the line.
+)
+tindex(delete-word)
+item(tt(delete-word))(
+Delete the current word.
+)
+tindex(down-case-word)
+item(tt(down-case-word) (ESC-L ESC-l) (unbound) (unbound))(
+Convert the current word to all lowercase and move past it.
+)
+tindex(kill-word)
+item(tt(kill-word) (ESC-D ESC-d) (unbound) (unbound))(
+Kill the current word.
+)
+tindex(gosmacs-transpose-chars)
+item(tt(gosmacs-transpose-chars))(
+Exchange the two characters behind the cursor.
+)
+tindex(vi-indent)
+item(tt(vi-indent) (unbound) (>) (unbound))(
+Indent a number of lines.
+)
+tindex(vi-insert)
+item(tt(vi-insert) (unbound) (i) (unbound))(
+Enter insert mode.
+)
+tindex(vi-insert-bol)
+item(tt(vi-insert-bol) (unbound) (I) (unbound))(
+Move to the first non-blank character on the line and enter insert mode.
+)
+tindex(vi-join)
+item(tt(vi-join) (^X^J) (J) (unbound))(
+Join the current line with the next one.
+)
+tindex(kill-line)
+item(tt(kill-line) (^K) (unbound) (unbound))(
+Kill from the cursor to the end of the line.
+If already on the end of the line, kill the newline character.
+)
+tindex(vi-kill-line)
+item(tt(vi-kill-line) (unbound) (unbound) (^U))(
+Kill from the cursor back to wherever insert mode was last entered.
+)
+tindex(vi-kill-eol)
+item(tt(vi-kill-eol) (unbound) (D) (unbound))(
+Kill from the cursor to the end of the line.
+)
+tindex(kill-region)
+item(tt(kill-region))(
+Kill from the cursor to the mark.
+)
+tindex(kill-buffer)
+item(tt(kill-buffer) (^X^K) (unbound) (unbound))(
+Kill the entire buffer.
+)
+tindex(kill-whole-line)
+item(tt(kill-whole-line) (^U) (unbound) (unbound))(
+Kill the current line.
+)
+tindex(vi-match-bracket)
+item(tt(vi-match-bracket) (^X^B) (%) (unbound))(
+Move to the bracket character (one of tt({}), tt(()) or tt([])) that
+matches the one under the cursor.
+If the cursor is not on a bracket character, move forward without going
+past the end of the line to find one, and then go to the matching bracket.
+)
+tindex(vi-open-line-above)
+item(tt(vi-open-line-above) (unbound) (O) (unbound))(
+Open a line above the cursor and enter insert mode.
+)
+tindex(vi-open-line-below)
+item(tt(vi-open-line-below) (unbound) (o) (unbound))(
+Open a line below the cursor and enter insert mode.
+)
+tindex(vi-oper-swap-case)
+item(tt(vi-oper-swap-case))(
+Read a movement command from the keyboard, and swap
+the case of all characters
+from the cursor position to the endpoint of the movement.
+If the movement command is tt(vi-oper-swap-case),
+swap the case of all characters on the current line.
+)
+tindex(overwrite-mode)
+item(tt(overwrite-mode) (^X^O) (unbound) (unbound))(
+Toggle between overwrite mode and insert mode.
+)
+tindex(vi-put-before)
+item(tt(vi-put-before) (unbound) (P) (unbound))(
+Insert the contents of the kill buffer before the cursor.
+If the kill buffer contains a sequence of lines (as opposed to characters),
+paste it above the current line.
+)
+tindex(vi-put-after)
+item(tt(vi-put-after) (unbound) (p) (unbound))(
+Insert the contents of the kill buffer after the cursor.
+If the kill buffer contains a sequence of lines (as opposed to characters),
+paste it below the current line.
+)
+tindex(quoted-insert)
+item(tt(quoted-insert) (^V) (unbound) (unbound))(
+Insert the next character typed into the buffer literally.
+An interrupt character will not be inserted.
+)
+tindex(vi-quoted-insert)
+item(tt(vi-quoted-insert) (unbound) (unbound) (^Q ^V))(
+Display a `tt(^)' at the cursor position, and
+insert the next character typed into the buffer literally.
+An interrupt character will not be inserted.
+)
+tindex(quote-line)
+item(tt(quote-line) (ESC-') (unbound) (unbound))(
+Quote the current line; that is, put a `tt(')' character at the
+beginning and the end, and convert all `tt(')' characters
+to `tt('\'')'.
+)
+tindex(quote-region)
+item(tt(quote-region) (ESC-") (unbound) (unbound))(
+Quote the region from the cursor to the mark.
+)
+tindex(vi-replace)
+item(tt(vi-replace) (unbound) (R) (unbound))(
+Enter overwrite mode.
+)
+tindex(vi-repeat-change)
+item(tt(vi-repeat-change) (unbound) (.) (unbound))(
+Repeat the last vi mode text modification.
+If a count was used with the modification, it is remembered.
+If a count is given to this command, it overrides the remembered count,
+and is remembered for future uses of this command.
+The cut buffer specification is similarly remembered.
+)
+tindex(vi-replace-chars)
+item(tt(vi-replace-chars) (unbound) (r) (unbound))(
+Replace the character under the cursor with a character
+read from the keyboard.
+)
+tindex(self-insert)
+item(tt(self-insert) (printable characters) (unbound) (printable characters and some control characters))(
+Insert a character into the buffer at the cursor position.
+)
+tindex(self-insert-unmeta)
+item(tt(self-insert-unmeta) (ESC-^I ESC-^J ESC-^M) (unbound) (unbound))(
+Insert a character into the buffer after stripping the meta bit
+and converting ^M to ^J.
+)
+tindex(vi-substitute)
+item(tt(vi-substitute) (unbound) (s) (unbound))(
+Substitute the next characte+CHAR(r)(s).
+)
+tindex(vi-swap-case)
+item(tt(vi-swap-case) (unbound) (~) (unbound))(
+Swap the case of the character under the cursor and move past it.
+)
+tindex(transpose-chars)
+item(tt(transpose-chars) (^T) (unbound) (unbound))(
+Exchange the two characters to the left of the
+cursor if at end of line, else exchange the
+character under the cursor with the character
+to the left.
+)
+tindex(transpose-words)
+item(tt(transpose-words) (ESC-T ESC-t) (unbound) (unbound))(
+Exchange the current word with the one before it.
+)
+tindex(vi-unindent)
+item(tt(vi-unindent) (unbound) (<) (unbound))(
+Unindent a number of lines.
+)
+tindex(up-case-word)
+item(tt(up-case-word) (ESC-U ESC-u) (unbound) (unbound))(
+Convert the current word to all caps and move past it.
+)
+tindex(yank)
+item(tt(yank) (^Y) (unbound) (unbound))(
+Insert the contents of the kill buffer at the cursor position.
+)
+tindex(yank-pop)
+item(tt(yank-pop) (ESC-y) (unbound) (unbound))(
+Remove the text just yanked, rotate the kill-ring,
+and yank the new top.  Only works following
+tt(yank) or tt(yank-pop).
+)
+tindex(vi-yank)
+item(tt(vi-yank) (unbound) (y) (unbound))(
+Read a movement command from the keyboard, and copy the region
+from the cursor position to the endpoint of the movement
+into the kill buffer.
+If the command is tt(vi-yank), copy the current line.
+)
+tindex(vi-yank-whole-line)
+item(tt(vi-yank-whole-line) (unbound) (Y) (unbound))(
+Copy the current line into the kill buffer.
+)
+tindex(vi-yank-eol)
+item(tt(vi-yank-eol))(
+Copy the region from the cursor position to the end of the line
+into the kill buffer.
+Arguably, this is what Y should do in vi, but it isn't what it actually does.
+)
+enditem()
+texinode(Arguments)(Completion)(Modifying Text)(Zsh Line Editor)
+subsect(Arguments)
+startitem()
+tindex(digit-argument)
+item(tt(digit-argument) (ESC-0..ESC-9) (1-9) (unbound))(
+Start a new numeric argument, or add to the current one.
+See also tt(vi-digit-or-beginning-of-line).
+)
+tindex(neg-argument)
+item(tt(neg-argument) (ESC--) (unbound) (unbound))(
+Changes the sign of the following argument.
+)
+tindex(universal-argument)
+item(tt(universal-argument))(
+Multiply the argument of the next command by 4.  Alternatively, if
+this command is followed by an integer (positive or negative), use
+that as the argument for the next command.  Thus digits cannot be
+repeated using this command.  For example, if this command occurs
+twice, followed immediately by tt(forward-char), move forward sixteen
+spaces; if instead it is followed by tt(-2), then tt(forward-char),
+move backward two spaces.
+)
+enditem()
+texinode(Completion)(Miscellaneous)(Arguments)(Zsh Line Editor)
+subsect(Completion)
+startitem()
+tindex(accept-and-menu-complete)
+item(tt(accept-and-menu-complete))(
+In a menu completion, insert the current completion into the buffer,
+and advance to the next possible completion.
+)
+tindex(complete-word)
+item(tt(complete-word))(
+Attempt completion on the current word.
+)
+tindex(delete-char-or-list)
+item(tt(delete-char-or-list) (^D) (unbound) (unbound))(
+Delete the character under the cursor.  If the cursor
+is at the end of the line, list possible completions for the
+current word.
+)
+tindex(expand-cmd-path)
+item(tt(expand-cmd-path))(
+Expand the current command to its full pathname.
+)
+tindex(expand-or-complete)
+item(tt(expand-or-complete) (TAB) (unbound) (TAB))(
+Attempt shell expansion on the current word.
+If that fails,
+attempt completion.
+)
+tindex(expand-or-complete-prefix)
+item(tt(expand-or-complete-prefix))(
+Attempt shell expansion on the current word up to cursor.
+)
+tindex(expand-history)
+item(tt(expand-history) (ESC-space ESC-!) (unbound) (unbound))(
+Perform history expansion on the edit buffer.
+)
+tindex(expand-word)
+item(tt(expand-word) (^X*) (unbound) (unbound))(
+Attempt shell expansion on the current word.
+)
+tindex(list-choices)
+item(tt(list-choices) (ESC-^D) (^D =) (^D))(
+List possible completions for the current word.
+)
+tindex(list-expand)
+item(tt(list-expand) (^Xg ^XG) (^G) (^G))(
+List the expansion of the current word.
+)
+tindex(magic-space)
+item(tt(magic-space))(
+Perform history expansion and insert a space into the
+buffer.  This is intended to be bound to space.
+)
+tindex(menu-complete)
+pindex(MENU_COMPLETE, use of)
+item(tt(menu-complete))(
+Like tt(complete-word), except that menu completion is used.
+See the tt(MENU_COMPLETE) option.
+)
+tindex(menu-expand-or-complete)
+item(tt(menu-expand-or-complete))(
+Like tt(expand-or-complete), except that menu completion is used.
+)
+tindex(reverse-menu-complete)
+item(tt(reverse-menu-complete))(
+Perform menu completion, like tt(menu-complete), except that if
+a menu completion is already in progress, move to the em(previous)
+completion rather than the next.
+)
+enditem()
+texinode(Miscellaneous)()(Completion)(Zsh Line Editor)
+subsect(Miscellaneous)
+startitem()
+tindex(accept-and-hold)
+item(tt(accept-and-hold) (ESC-A ESC-a) (unbound) (unbound))(
+Push the contents of the buffer on the buffer stack
+and execute it.
+)
+tindex(accept-and-infer-next-history)
+item(tt(accept-and-infer-next-history))(
+Execute the contents of the buffer.
+Then search the history list for a line matching the current one
+and push the event following onto the buffer stack.
+)
+tindex(accept-line)
+item(tt(accept-line) (^J ^M) (^J ^M) (^J ^M))(
+Finish editing the buffer.  Normally this causes the buffer to be
+executed as a shell command.
+)
+tindex(accept-line-and-down-history)
+item(tt(accept-line-and-down-history) (^O) (unbound) (unbound))(
+Execute the current line, and push the next history
+event on the the buffer stack.
+)
+tindex(vi-cmd-mode)
+item(tt(vi-cmd-mode) (^X^V) (unbound) (^[))(
+Enter command mode; that is, select the `tt(vicmd)' keymap.
+Yes, this is bound by default in emacs mode.
+)
+tindex(vi-caps-lock-panic)
+item(tt(vi-caps-lock-panic))(
+Hang until any lowercase key is pressed.
+This is for vi users without the mental capacity to keep
+track of their caps lock key (like the author).
+)
+tindex(clear-screen)
+item(tt(clear-screen) (^L ESC-^L) (^L) (^L))(
+Clear the screen and redraw the prompt.
+)
+tindex(describe-key-briefly)
+item(tt(describe-key-briefly))(
+Reads a key sequence, then prints the function bound to that sequence.
+)
+tindex(exchange-point-and-mark)
+item(tt(exchange-point-and-mark) (^X^X) (unbound) (unbound))(
+Exchange the cursor position with the position of the mark.
+)
+tindex(execute-named-cmd)
+item(tt(execute-named-cmd) (ESC-x) (unbound) (unbound))(
+Read the name of an editor command and
+execute it.  A restricted set of editing functions is available in the
+mini-buffer.  An interrupt signal, as defined by the stty setting, will
+abort the function. The allowed functions are:
+tt(backward-delete-char),
+tt(vi-backward-delete-char),
+tt(clear-screen),
+tt(redisplay),
+tt(quoted-insert),
+tt(vi-quoted-insert),
+tt(backward-kill-word),
+tt(vi-backward-kill-word),
+tt(kill-whole-line),
+tt(vi-kill-line),
+tt(backward-kill-line),
+tt(list-choices),
+tt(delete-char-or-list),
+tt(complete-word),
+tt(accept-line),
+tt(expand-or-complete) and
+tt(expand-or-complete-prefix).
+
+tt(kill-region) kills the last word,
+and vi-cmd-mode is treated the same as accept-line.
+The space and tab characters, if not bound to one of
+these functions, will complete the name and then list the
+possibilities if the tt(AUTO_LIST) option is set.
+Any other character that is not bound to tt(self-insert) or
+tt(self-insert-unmeta) will beep and be ignored.
+The bindings of the current insert mode will be used.
+)
+tindex(execute-last-named-cmd)
+item(tt(execute-last-named-cmd) (ESC-z) (unbound) (unbound))(
+Redo the last function executed with tt(execute-named-cmd).
+)
+tindex(get-line)
+item(tt(get-line) (ESC-G ESC-g) (unbound) (unbound))(
+Pop the top line off the buffer stack and insert it at the
+cursor position.
+)
+tindex(pound-insert)
+item(tt(pound-insert) (unbound) (#) (unbound))(
+If there is no # character at the beginning of the buffer,
+add one to the beginning of each line.
+If there is one, remove a # from each line that has one.
+In either case, accept the current line.
+The tt(INTERACTIVE_COMMENTS) option must be set
+for this to have any usefulness.
+)
+tindex(vi-pound-insert)
+item(tt(vi-pound-insert))(
+If there is no # character at the beginning of the current line,
+add one.  If there is one, remove it.
+The tt(INTERACTIVE_COMMENTS) option must be set
+for this to have any usefulness.
+)
+tindex(push-input)
+item(tt(push-input))(
+Push the entire current multiline construct onto the buffer stack and
+return to the top-level (tt(PS1)) prompt.
+If the current parser construct is only a single line, this is exactly
+like tt(push-line).
+Next time the editor starts up or is popped with tt(get-line), the
+construct will be popped off the top of the buffer stack and loaded
+into the editing buffer.
+)
+tindex(push-line)
+item(tt(push-line) (^Q ESC-Q ESC-q) (unbound) (unbound))(
+Push the current buffer onto the buffer stack and clear
+the buffer.
+Next time the editor starts up, the buffer will be popped
+off the top of the buffer stack and loaded into the editing
+buffer.
+)
+tindex(push-line-or-edit)
+item(tt(push-line-or-edit))(
+At the top-level (tt(PS1)) prompt, equivalent to tt(push-line).
+At a secondary (tt(PS2)) prompt, move the entire current multiline
+construct into the editor buffer.
+The latter is equivalent to tt(push-input) followed by tt(get-line).
+)
+tindex(redisplay)
+item(tt(redisplay) (unbound) (^R) (^R))(
+Redisplays the edit buffer.
+)
+tindex(send-break)
+item(tt(send-break) (^G ESC-^G) (unbound) (unbound))(
+Abort the current editor function, e.g. tt(execute-named-command), or the
+editor itself, e.g. if you are in tt(vared). Otherwise abort the parsing of
+the current line.
+)
+tindex(run-help)
+item(tt(run-help) (ESC-H ESC-h) (unbound) (unbound))(
+Push the buffer onto the buffer stack, and execute the
+command `tt(run-help) var(cmd)', where var(cmd) is the current
+command.  tt(run-help) is normally aliased to var(man).
+)
+tindex(vi-set-buffer)
+item(tt(vi-set-buffer) (unbound) (") (unbound))(
+Specify a buffer to be used in the following command.
+There are 35 buffers that can be specified:
+the 26 `named' buffers tt("a) to tt("z)
+and the nine `queued' buffers tt("1) to tt("9).  The named buffers can also
+be specified as tt("A) to tt("Z).
+
+When a buffer is specified for a cut command, the text being cut replaces
+the previous contents of the specified buffer.  If a named buffer
+is specified using a capital, the newly cut text is appended to the buffer
+instead of overwriting it.
+
+If no buffer is specified for a cut command, tt("1) is used, and the
+contents of tt("1) to tt("8) are each shifted along one buffer; the contents of
+tt("9) is lost.
+)
+tindex(vi-set-mark)
+item(tt(vi-set-mark) (unbound) (m) (unbound))(
+Set the specified mark at the cursor position.
+)
+tindex(set-mark-command)
+item(tt(set-mark-command) (^@) (unbound) (unbound))(
+Set the mark at the cursor position.
+)
+tindex(spell-word)
+item(tt(spell-word) (ESC-$ ESC-S ESC-s) (unbound) (unbound))(
+Attempt spelling correction on the current word.
+)
+tindex(undefined-key)
+item(tt(undefined-key))(
+This command is executed when a key sequence that is not bound to any
+command is typed.  By default it beeps.
+)
+tindex(undo)
+item(tt(undo) (^_ ^Xu ^X^U) (unbound) (unbound))(
+Incrementally undo the last text modification.
+)
+tindex(redo)
+item(tt(redo))(
+Incrementally redo undone text modifications.
+)
+tindex(vi-undo-change)
+item(tt(vi-undo-change) (unbound) (u) (unbound))(
+Undo the last text modification.
+If repeated, redo the modification.
+)
+tindex(what-cursor-position)
+item(tt(what-cursor-position) (^X=) (unbound) (unbound))(
+Print the character under the cursor, its code as an octal, decimal and
+hexadecimal number, the current cursor position within the buffer and the
+column of the cursor in the current line.
+)
+tindex(where-is)
+item(tt(where-is))(
+Read the name of an editor command and and print the listing of key
+sequences that invoke the specified command.
+)
+tindex(which-command)
+item(tt(which-command) (ESC-?) (unbound) (unbound))(
+Push the buffer onto the buffer stack, and execute the
+command `tt(which-command) var(cmd)'. where var(cmd) is the current
+command.  tt(which-command) is normally aliased to var(whence).
+)
+tindex(vi-digit-or-beginning-of-line)
+item(tt(vi-digit-or-beginning-of-line) (unbound) (0) (unbound))(
+If the last command executed was a digit as part of an argument,
+continue the argument.  Otherwise, execute vi-beginning-of-line.
+)
+enditem()
diff --git a/Doc/intro.ms b/Doc/intro.ms
new file mode 100644
index 000000000..5024b9bfd
--- /dev/null
+++ b/Doc/intro.ms
@@ -0,0 +1,2701 @@
+.nr PI 0
+.nr LL 6.5i
+.de Ds
+.DS I .5i
+.ft C
+.ps 9
+.vs 11
+.ss 11
+..
+.de De
+.DE
+.ft R
+.ps
+.vs
+.ss
+..
+.de Sh
+.SH
+\\$1
+.XS
+\\$1
+.XE
+..
+.nr HM 4i
+.ce 99
+.ps 18
+.vs 20
+.ss 20
+\f3An Introduction to the Z Shell\fP
+
+.ps 14
+.vs 16
+.ss 16
+\f2Paul Falstad
+pf@software.com
+
+Bas de Bakker
+bas@phys.uva.nl\fP
+.ce 0
+.nr HM 1i
+.pn 1
+.bp
+.\" This blank page on the reverse of the cover.
+.sv |1i
+.pn 1
+.bp
+.TL
+An Introduction to the Z Shell
+.AU
+Paul Falstad
+pf@software.com
+.AU
+Bas de Bakker
+bas@phys.uva.nl
+.PP
+.Sh "Introduction"
+.PP
+\fBzsh\fP is a shell designed for interactive use, although it is also
+a powerful scripting language.  Many of the useful features of bash,
+ksh, and tcsh were incorporated into \fBzsh\fP; many original features were
+added.  This document details some of the unique features of \fBzsh\fP.  It
+assumes basic knowledge of the standard UNIX shells; the intent is to
+show a reader already familiar with one of the other major shells what
+makes \fBzsh\fP more useful or more powerful.  This document is not at all
+comprehensive; read the manual entry for a description of the shell
+that is complete and concise, although somewhat overwhelming and
+devoid of examples.
+.PP
+The text will frequently mention options that you can set to change
+the behaviour of \fBzsh\fP.  You can set these options with the
+command
+.Ds
+%\0setopt\0\fIoptionname\fC
+.De
+and unset them again with
+.Ds
+%\0unsetopt\0\fIoptionname\fC
+.De
+Case is ignored in option names, as are embedded underscores.
+.Sh "Filename Generation"
+.PP
+Otherwise known as \fIglobbing\fP, filename generation
+is quite extensive in \fBzsh\fP.  Of course, it has all the
+basics:
+.Ds
+%\0ls
+Makefile\0\0\0file.pro\0\0\0foo.o\0\0\0\0\0\0main.o\0\0\0\0\0q.c\0\0\0\0\0\0\0\0run234\0\0\0\0\0stuff
+bar.o\0\0\0\0\0\0foo\0\0\0\0\0\0\0\0link\0\0\0\0\0\0\0morestuff\0\0run123\0\0\0\0\0run240\0\0\0\0\0sub
+file.h\0\0\0\0\0foo.c\0\0\0\0\0\0main.h\0\0\0\0\0pipe\0\0\0\0\0\0\0run2\0\0\0\0\0\0\0run303
+%\0ls\0*.c
+foo.c\0\0q.c
+%\0ls\0*.[co]
+bar.o\0\0\0foo.c\0\0\0foo.o\0\0\0main.o\0\0q.c
+%\0ls\0foo.?
+foo.c\0\0foo.o
+%\0ls\0*.[^c]
+bar.o\0\0\0file.h\0\0foo.o\0\0\0main.h\0\0main.o
+%\0ls\0*.[^oh]
+foo.c\0\0q.c
+.De
+Also, if the \fIEXTENDEDGLOB\fP option is set,
+some new features are activated.
+For example, the \fC^\fP character negates the pattern following it:
+.Ds
+%\0setopt\0extendedglob
+%\0ls\0-d\0^*.c
+Makefile\0\0\0file.pro\0\0\0link\0\0\0\0\0\0\0morestuff\0\0run2\0\0\0\0\0\0\0run303
+bar.o\0\0\0\0\0\0foo\0\0\0\0\0\0\0\0main.h\0\0\0\0\0pipe\0\0\0\0\0\0\0run234\0\0\0\0\0stuff
+file.h\0\0\0\0\0foo.o\0\0\0\0\0\0main.o\0\0\0\0\0run123\0\0\0\0\0run240\0\0\0\0\0sub
+%\0ls\0-d\0^*.*
+Makefile\0\0\0link\0\0\0\0\0\0\0pipe\0\0\0\0\0\0\0run2\0\0\0\0\0\0\0run240\0\0\0\0\0stuff
+foo\0\0\0\0\0\0\0\0morestuff\0\0run123\0\0\0\0\0run234\0\0\0\0\0run303\0\0\0\0\0sub
+%\0ls\0-d\0^Makefile
+bar.o\0\0\0\0\0\0foo\0\0\0\0\0\0\0\0link\0\0\0\0\0\0\0morestuff\0\0run123\0\0\0\0\0run240\0\0\0\0\0sub
+file.h\0\0\0\0\0foo.c\0\0\0\0\0\0main.h\0\0\0\0\0pipe\0\0\0\0\0\0\0run2\0\0\0\0\0\0\0run303
+file.pro\0\0\0foo.o\0\0\0\0\0\0main.o\0\0\0\0\0q.c\0\0\0\0\0\0\0\0run234\0\0\0\0\0stuff
+%\0ls\0-d\0*.^c
+\&.rhosts\0\0\0bar.o\0\0\0\0\0file.h\0\0\0\0file.pro\0\0foo.o\0\0\0\0\0main.h\0\0\0\0main.o
+.De
+An expression of the form
+\fC<\fIx\fR\-\fIy\fC>\fR
+matches a range of integers:
+.Ds
+%\0ls\0run<200-300>
+run234\0\0run240
+%\0ls\0run<300-400>
+run303
+%\0ls\0run<-200>
+run123\0\0run2
+%\0ls\0run<300->
+run303
+%\0ls\0run<>
+run123\0\0run2\0\0\0\0run234\0\0run240\0\0run303
+.De
+The \fINUMERICGLOBSORT\fP option will sort files with numbers
+according to the number.  This will not work with \fCls\fP as it
+resorts its arguments:
+.Ds
+%\0setopt\0numericglobsort
+%\0echo\0run<>
+run2\0run123\0run234\0run240\0run303
+.De
+Grouping is possible:
+.Ds
+%\0ls\0(foo|bar).*
+bar.o\0\0foo.c\0\0foo.o
+%\0ls\0*.(c|o|pro)
+bar.o\0\0\0\0\0file.pro\0\0foo.c\0\0\0\0\0foo.o\0\0\0\0\0main.o\0\0\0\0q.c
+.De
+Also, the string \fC**/\fP forces a recursive search of
+subdirectories:
+.Ds
+%\0ls\0-R
+Makefile\0\0\0file.pro\0\0\0foo.o\0\0\0\0\0\0main.o\0\0\0\0\0q.c\0\0\0\0\0\0\0\0run234\0\0\0\0\0stuff
+bar.o\0\0\0\0\0\0foo\0\0\0\0\0\0\0\0link\0\0\0\0\0\0\0morestuff\0\0run123\0\0\0\0\0run240\0\0\0\0\0sub
+file.h\0\0\0\0\0foo.c\0\0\0\0\0\0main.h\0\0\0\0\0pipe\0\0\0\0\0\0\0run2\0\0\0\0\0\0\0run303
+
+morestuff:
+
+stuff:
+file\0\0xxx\0\0\0yyy
+
+stuff/xxx:
+foobar
+
+stuff/yyy:
+frobar
+%\0ls\0**/*bar
+stuff/xxx/foobar\0\0stuff/yyy/frobar
+%\0ls\0**/f*
+file.h\0\0\0\0\0\0\0\0\0\0\0\0foo\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0foo.o\0\0\0\0\0\0\0\0\0\0\0\0\0stuff/xxx/foobar
+file.pro\0\0\0\0\0\0\0\0\0\0foo.c\0\0\0\0\0\0\0\0\0\0\0\0\0stuff/file\0\0\0\0\0\0\0\0stuff/yyy/frobar
+%\0ls\0*bar*
+bar.o
+%\0ls\0**/*bar*
+bar.o\0\0\0\0\0\0\0\0\0\0\0\0\0stuff/xxx/foobar\0\0stuff/yyy/frobar
+%\0ls\0stuff/**/*bar*
+stuff/xxx/foobar\0\0stuff/yyy/frobar
+.De
+.PP
+It is possible to exclude certain files from the patterns using
+the ~ character.  A pattern of the form \fC*.c~bar.c\fP lists all
+files matching \fC*.c\fP, except for the file \fCbar.c\fP.
+.Ds
+%\0ls\0*.c
+foo.c\0\0\0\0foob.c\0\0\0\0bar.c
+%\0ls\0*.c~bar.c
+foo.c\0\0\0\0foob.c
+%\0ls\0*.c~f*
+bar.c
+.De
+.PP
+One can add a number of \fIqualifiers\fP to the end of
+any of these patterns, to restrict matches to certain
+file types.  A qualified pattern is of the form
+.DS
+\fIpattern\fC(\fR...\fC)\fR
+.De
+with single-character qualifiers inside the parentheses.
+.Ds
+%\0alias\0l='ls\0-dF'
+%\0l\0*
+Makefile\0\0\0\0foo*\0\0\0\0\0\0\0\0main.h\0\0\0\0\0\0q.c\0\0\0\0\0\0\0\0\0run240
+bar.o\0\0\0\0\0\0\0foo.c\0\0\0\0\0\0\0main.o\0\0\0\0\0\0run123\0\0\0\0\0\0run303
+file.h\0\0\0\0\0\0foo.o\0\0\0\0\0\0\0morestuff/\0\0run2\0\0\0\0\0\0\0\0stuff/
+file.pro\0\0\0\0link@\0\0\0\0\0\0\0pipe\0\0\0\0\0\0\0\0run234\0\0\0\0\0\0sub
+%\0l\0*(/)
+morestuff/\0\0stuff/
+%\0l\0*(@)
+link@
+%\0l\0*(*)
+foo*\0\0\0\0\0\0\0\0link@\0\0\0\0\0\0\0morestuff/\0\0stuff/
+%\0l\0*(x)
+foo*\0\0\0\0\0\0\0\0link@\0\0\0\0\0\0\0morestuff/\0\0stuff/
+%\0l\0*(X)
+foo*\0\0\0\0\0\0\0\0link@\0\0\0\0\0\0\0morestuff/\0\0stuff/
+%\0l\0*(R)
+bar.o\0\0\0\0\0\0\0foo*\0\0\0\0\0\0\0\0link@\0\0\0\0\0\0\0morestuff/\0\0run123\0\0\0\0\0\0run240
+file.h\0\0\0\0\0\0foo.c\0\0\0\0\0\0\0main.h\0\0\0\0\0\0pipe\0\0\0\0\0\0\0\0run2\0\0\0\0\0\0\0\0run303
+file.pro\0\0\0\0foo.o\0\0\0\0\0\0\0main.o\0\0\0\0\0\0q.c\0\0\0\0\0\0\0\0\0run234\0\0\0\0\0\0stuff/
+.De
+Note that \fC*(x)\fP and \fC*(*)\fP both match executables.
+\fC*(X)\fP matches files executable by others, as opposed to
+\fC*(x)\fP, which matches files executable by the owner.
+\fC*(R)\fP and \fC*(r)\fP match readable files;
+\fC*(W)\fP and \fC*(w)\fP, which checks for writable files.
+\fC*(W)\fP is especially important, since it checks for world-writable
+files:
+.Ds
+%\0l\0*(w)
+bar.o\0\0\0\0\0\0\0foo*\0\0\0\0\0\0\0\0link@\0\0\0\0\0\0\0morestuff/\0\0run123\0\0\0\0\0\0run240
+file.h\0\0\0\0\0\0foo.c\0\0\0\0\0\0\0main.h\0\0\0\0\0\0pipe\0\0\0\0\0\0\0\0run2\0\0\0\0\0\0\0\0run303
+file.pro\0\0\0\0foo.o\0\0\0\0\0\0\0main.o\0\0\0\0\0\0q.c\0\0\0\0\0\0\0\0\0run234\0\0\0\0\0\0stuff/
+%\0l\0*(W)
+link@\0\0\0run240
+%\0l\0-l\0link\0run240
+lrwxrwxrwx\0\01\0pfalstad\0\0\0\0\0\0\010\0May\023\018:12\0link\0->\0/usr/bin/
+-rw-rw-rw-\0\01\0pfalstad\0\0\0\0\0\0\0\00\0May\023\018:12\0run240
+.De
+If you want to have all the files of a certain type as well as all
+symbolic links pointing to files of that type, prefix the qualifier
+with a \fC-\fP:
+.Ds
+%\0l\0*(-/)
+link@\0\0\0\0\0\0\0morestuff/\0\0stuff/
+.De
+You can filter out the symbolic links with the \fC^\fP character:
+.Ds
+%\0l\0*(W^@)
+run240
+%\0l\0*(x)
+foo*\0\0\0\0\0\0\0\0link@\0\0\0\0\0\0\0morestuff/\0\0stuff/
+%\0l\0*(x^@/)
+foo*
+.De
+To find all plain files, you can use \fC.\fP:
+.Ds
+%\0l\0*(.)
+Makefile\0\0file.h\0\0\0\0foo*\0\0\0\0\0\0foo.o\0\0\0\0\0main.o\0\0\0\0run123\0\0\0\0run234\0\0\0\0run303
+bar.o\0\0\0\0\0file.pro\0\0foo.c\0\0\0\0\0main.h\0\0\0\0q.c\0\0\0\0\0\0\0run2\0\0\0\0\0\0run240\0\0\0\0sub
+%\0l\0*(^.)
+link@\0\0\0\0\0\0\0morestuff/\0\0pipe\0\0\0\0\0\0\0\0stuff/
+%\0l\0s*(.)
+stuff/\0\0\0sub
+%\0l\0*(p)
+pipe
+%\0l\0-l\0*(p)
+prw-r--r--\0\01\0pfalstad\0\0\0\0\0\0\0\00\0May\023\018:12\0pipe
+.De
+\fC*(U)\fP matches all files owned by you.
+To search for all files not owned by you, use \fC*(^U)\fP:
+.Ds
+%\0l\0-l\0*(^U)
+-rw-------\0\01\0subbarao\0\0\0\0\0\0\029\0May\023\018:13\0sub
+.De
+This searches for setuid files:
+.Ds
+%\0l\0-l\0*(s)
+-rwsr-xr-x\0\01\0pfalstad\0\0\0\0\0\0\016\0May\023\018:12\0foo*
+.De
+This checks for a certain user's files:
+.Ds
+%\0l\0-l\0*(u[subbarao])
+-rw-------\0\01\0subbarao\0\0\0\0\0\0\029\0May\023\018:13\0sub
+.De
+.Sh "Startup Files"
+.PP
+There are five startup files that \fBzsh\fP will read commands from:
+.Ds
+$ZDOTDIR/.zshenv
+$ZDOTDIR/.zprofile
+$ZDOTDIR/.zshrc
+$ZDOTDIR/.zlogin
+$ZDOTDIR/.zlogout
+.De
+If \fBZDOTDIR\fP is not set, then the value of \fBHOME\fP is used;
+this is the usual case.
+.\".KE    <--- missing .KS or .KF above
+.PP
+\&\fC.zshenv\fP is sourced on all invocations of the shell,
+unless the \fC-f\fP option is set.  It should contain commands to set
+the command search path, plus other important environment
+variables.
+\&\fC.zshenv\fP should not contain commands that produce output
+or assume the shell is attached to a tty.
+.PP
+\&\fC.zshrc\fP is sourced in interactive shells.  It should contain
+commands to set up aliases, functions, options, key bindings, etc.
+.PP
+\&\fC.zlogin\fP is sourced in login shells.  It should contain
+commands that should be executed only in login shells.
+\&\fC.zlogout\fP is sourced when login shells exit.
+\&\fC.zprofile\fP is similar to \fC.zlogin\fP, except that it is sourced before
+\&\fC.zshrc\fP.
+\&\fC.zprofile\fP is meant as an alternative to \fC.zlogin\fP for
+ksh fans;
+the two are not intended to be used together, although this
+could certainly be done if desired.
+\&\fC.zlogin\fP is not the place for alias definitions, options, environment
+variable settings, etc.;
+as a general rule, it should not change the shell environment
+at all.  Rather, it should be used to set the terminal type
+and run a series of external commands (\fCfortune\fP, \fCmsgs\fP, etc).
+.Sh "Shell Functions"
+.PP
+\fBzsh\fP also allows you to create your own commands by defining shell
+functions.  For example:
+.Ds
+%\0yp\0()\0{
+>\0\0\0\0\0\0\0ypmatch\0$1\0passwd.byname
+>\0}
+%\0yp\0pfalstad
+pfalstad:*:3564:35:Paul\0John\0Falstad:/u/pfalstad:/usr/princeton/bin/zsh
+.De
+This function looks up a user in the NIS password map.
+The \fC$1\fP expands to the first argument to \fCyp\fP.
+The function could have been equivalently defined in one of the following
+ways:
+.Ds
+%\0function\0yp\0{
+>\0\0\0\0\0\0\0ypmatch\0$1\0passwd.byname
+>\0}
+%\0function\0yp\0()\0{
+>\0\0\0\0\0\0\0ypmatch\0$1\0passwd.byname
+>\0}
+%\0function\0yp\0()\0ypmatch\0$1\0passwd.byname
+.De
+Note that aliases are expanded when the function definition is
+parsed, not when the function is executed.  For example:
+.Ds
+%\0alias\0ypmatch=echo
+%\0yp\0pfalstad
+pfalstad:*:3564:35:Paul\0John\0Falstad:/u/pfalstad:/usr/princeton/bin/zsh
+.De
+Since the alias was defined after the function was parsed, it has
+no effect on the function's execution.
+However, if we define the function again with the alias in place:
+.Ds
+%\0function\0yp\0()\0{\0ypmatch\0$1\0passwd.byname\0}
+%\0yp\0pfalstad
+pfalstad\0passwd.byname
+.De
+it is parsed with the new alias definition in place.
+Therefore, in general you must define aliases before functions.
+.\".KE    <--- missing .KS or .KF above
+.PP
+We can make the function take multiple arguments:
+.Ds
+%\0unalias\0ypmatch
+%\0yp\0()\0{
+>\0\0\0\0\0\0\0for\0i
+>\0\0\0\0\0\0\0do\0ypmatch\0$i\0passwd.byname
+>\0\0\0\0\0\0\0done
+>\0}
+%\0yp\0pfalstad\0subbarao\0sukthnkr
+pfalstad:*:3564:35:Paul\0John\0Falstad:/u/pfalstad:/usr/princeton/bin/zsh
+subbarao:*:3338:35:Kartik\0Subbarao:/u/subbarao:/usr/princeton/bin/zsh
+sukthnkr:*:1267:35:Rahul\0Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
+.De
+The \fCfor i\fP loops through each of the function's arguments,
+setting \fCi\fP equal to each of them in turn.
+We can also make the function do something sensible
+if no arguments are given:
+.Ds
+%\0yp\0()\0{
+>\0\0\0\0\0\0\0if\0((\0$#\0==\00\0))
+>\0\0\0\0\0\0\0then\0echo\0usage:\0yp\0name\0...;\0fi
+>\0\0\0\0\0\0\0for\0i;\0do\0ypmatch\0$i\0passwd.byname;\0done
+>\0}
+%\0yp
+usage:\0yp\0name\0...
+%\0yp\0pfalstad\0sukthnkr
+pfalstad:*:3564:35:Paul\0John\0Falstad:/u/pfalstad:/usr/princeton/bin/zsh
+sukthnkr:*:1267:35:Rahul\0Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
+.De
+\fC$#\fP is the number of arguments supplied to the function.
+If it is equal to zero, we print a usage message; otherwise,
+we loop through the arguments, and \fCypmatch\fP all of them.
+.\".KE    <--- missing .KS or .KF above
+.PP
+Here's a function that selects a random line from a file:
+.Ds
+%\0randline\0()\0{
+>\0\0\0\0\0\0\0integer\0z=$(wc\0-l\0<$1)
+>\0\0\0\0\0\0\0sed\0-n\0$[RANDOM\0%\0z\0+\01]p\0$1
+>\0}
+%\0randline\0/etc/motd
+PHOENIX\0WILL\0BE\0DOWN\0briefly\0Friday\0morning,\05/24/91\0from\08\0AM\0to
+%\0randline\0/etc/motd
+SunOS\0Release\04.1.1\0(PHOENIX)\0#19:\0Tue\0May\014\019:03:15\0EDT\01991
+%\0randline\0/etc/motd
+|\0Please\0use\0the\0"msgs"\0command\0to\0read\0announcements.\0\0Refer\0to\0the\0\0\0|
+%\0echo\0$z
+
+%
+.De
+\fCrandline\fP has a local variable, \fCz\fP, that holds the number of
+lines in the file.  \fC$[RANDOM % z + 1]\fP expands to a random number
+between 1 and \fCz\fP.  An expression of the form \fC$[\fR...\fC]\fR
+expands to the value of the arithmetic expression within the brackets,
+and the \fBRANDOM\fP variable returns a random number each time it
+is referenced.  \fC%\fP is the modulus operator, as in C.
+Therefore, \fCsed -n $[RANDOM%z+1]p\fP picks a random line from its
+input, from 1 to \fCz\fP.
+.PP
+Function definitions can be viewed with the \fCfunctions\fP builtin:
+.Ds
+%\0functions\0randline
+randline\0()\0{
+\0\0\0\0\0\0\0\0integer\0z=$(wc\0-l\0<$1)
+\0\0\0\0\0\0\0\0sed\0-n\0$[RANDOM\0%\0z\0+\01]p\0$1
+
+}
+%\0functions
+yp\0()\0{
+\0\0\0\0\0\0\0\0if\0let\0$#\0==\00\0
+\0\0\0\0\0\0\0\0
+\0\0\0\0\0\0\0\0then
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0echo\0usage:\0yp\0name\0...
+\0\0\0\0\0\0\0\0
+\0\0\0\0\0\0\0\0fi
+\0\0\0\0\0\0\0\0for\0i
+\0\0\0\0\0\0\0\0do
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ypmatch\0$i\0passwd.byname
+\0\0\0\0\0\0\0\0
+\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0done
+
+}
+randline\0()\0{
+\0\0\0\0\0\0\0\0integer\0z=$(wc\0-l\0<$1)
+\0\0\0\0\0\0\0\0sed\0-n\0$[RANDOM\0%\0z\0+\01]p\0$1
+
+}
+.De
+Here's another one:
+.Ds
+%\0cx\0()\0{\0chmod\0+x\0$*\0}
+%\0ls\0-l\0foo\0bar
+-rw-r--r--\0\01\0pfalstad\0\0\0\0\0\0\029\0May\024\004:38\0bar
+-rw-r--r--\0\01\0pfalstad\0\0\0\0\0\0\029\0May\024\004:38\0foo
+%\0cx\0foo\0bar
+%\0ls\0-l\0foo\0bar
+-rwxr-xr-x\0\01\0pfalstad\0\0\0\0\0\0\029\0May\024\004:38\0bar
+-rwxr-xr-x\0\01\0pfalstad\0\0\0\0\0\0\029\0May\024\004:38\0foo
+.De
+Note that this could also have been implemented as an alias:
+.Ds
+%\0chmod\0644\0foo\0bar
+%\0alias\0cx='chmod\0+x'
+%\0cx\0foo\0bar
+%\0ls\0-l\0foo\0bar
+-rwxr-xr-x\0\01\0pfalstad\0\0\0\0\0\0\029\0May\024\004:38\0bar
+-rwxr-xr-x\0\01\0pfalstad\0\0\0\0\0\0\029\0May\024\004:38\0foo
+.De
+.PP
+Instead of defining a lot of functions in your \fC.zshrc\fP,
+all of which you may not use,
+it is often better to use the \fCautoload\fP builtin.
+The idea is, you create a directory where function
+definitions are stored, declare the names in
+your \fC.zshrc\fP, and tell the shell where to look for them.
+Whenever you reference a function, the shell
+will automatically load it into memory.
+.Ds
+%\0mkdir\0/tmp/funs
+%\0cat\0>/tmp/funs/yp
+ypmatch\0$1\0passwd.byname
+^D
+%\0cat\0>/tmp/funs/cx
+chmod\0+x\0$*
+^D
+%\0FPATH=/tmp/funs
+%\0autoload\0cx\0yp
+%\0functions\0cx\0yp
+undefined\0cx\0()
+undefined\0yp\0()
+%\0chmod\0755\0/tmp/funs/{cx,yp}
+%\0yp\0egsirer
+egsirer:*:3214:35:Emin\0Gun\0Sirer:/u/egsirer:/bin/sh
+%\0functions\0yp
+yp\0()\0{
+\0\0\0\0\0\0\0\0ypmatch\0$1\0passwd.byname
+}
+.De
+This idea has other benefits.  By adding a \fC#!\fP header
+to the files, you can make them double as shell scripts.
+(Although it is faster to use them as functions, since a
+separate process is not created.)
+.Ds
+%\0ed\0/tmp/funs/yp
+25
+i
+#!\0/usr/local/bin/zsh
+.
+w
+42
+q
+%\0</tmp/funs/yp
+#!\0/usr/local/bin/zsh
+ypmatch\0$1\0passwd.byname
+%\0/tmp/funs/yp\0sukthnkr
+sukthnkr:*:1267:35:Rahul\0Sukthankar:/u/sukthnkr:/usr/princeton/bin/tcsh
+.De
+Now other people, who may not use \fBzsh\fP, or who don't want to
+copy all of your \fC.zshrc\fP, may use these functions as shell
+scripts.
+.Sh "Directories"
+.PP
+One nice feature of \fBzsh\fP is the way it prints directories.
+For example, if we set the prompt like this:
+.Ds
+phoenix%\0PROMPT='%~>\0'
+~>\0cd\0src
+~/src>
+.De
+the shell will print the current directory in the prompt,
+using the \fC~\fP character.
+However, \fBzsh\fP is smarter than most other shells in this respect:
+.Ds
+~/src>\0cd\0~subbarao
+~subbarao>\0cd\0~maruchck
+~maruchck>\0cd\0lib
+~maruchck/lib>\0cd\0fun
+~maruchck/lib/fun>\0foo=/usr/princeton/common/src
+~maruchck/lib/fun>\0cd\0~foo
+~foo>\0cd\0..
+/usr/princeton/common>\0cd\0src
+~foo>\0cd\0news/nntp
+~foo/news/nntp>\0cd\0inews
+~foo/news/nntp/inews>
+.De
+Note that \fBzsh\fP prints \fIother\fP users' directories 
+in the form \fC~user\fP.  Also note that you can
+set a parameter and use it as a directory name;
+\fBzsh\fP will act as if \fCfoo\fP is a user
+with the login directory \fC/usr/princeton/common/src\fP.
+This is convenient, especially if you're sick of seeing
+prompts like this:
+.Ds
+phoenix:/usr/princeton/common/src/X.V11R4/contrib/clients/xv/docs>
+.De
+If you get stuck in this position, you can give the current
+directory a short name, like this:
+.Ds
+/usr/princeton/common/src/news/nntp/inews>\0inews=$PWD
+/usr/princeton/common/src/news/nntp/inews>\0echo\0~inews
+/usr/princeton/common/src/news/nntp/inews
+~inews>
+.De
+When you reference a directory in the form \fC~inews\fP,
+the shell assumes that you want the directory displayed
+in this form; thus simply typing \fCecho ~inews\fP or
+\fCcd ~inews\fP causes the prompt to be shortened.
+You can define a shell function for this purpose:
+.Ds
+~inews>\0namedir\0()\0{\0$1=$PWD\0;\0\0:\0~$1\0}
+~inews>\0cd\0/usr/princeton/bin
+/usr/princeton/bin>\0namedir\0pbin
+~pbin>\0cd\0/var/spool/mail
+/var/spool/mail>\0namedir\0spool
+~spool>\0cd\0.msgs
+~spool/.msgs>
+.De
+You may want to add this one-line function to your \fC.zshrc\fP.
+
+\fBzsh\fP can also put the current directory in your title bar,
+if you are using a windowing system.
+One way to do this is with the \fCchpwd\fP function, which is
+automatically executed by the shell whenever you change
+directory.  If you are using xterm, this will work:
+.Ds
+chpwd\0()\0{\0print\0-Pn\0'^[]2;%~^G'\0}
+.De
+The \fC-P\fP option tells \fCprint\fP to treat its arguments like a prompt
+string; otherwise the \fC%~\fP would not be expanded.
+The \fC-n\fP option suppresses the terminating newline, as with \fCecho\fP.
+.PP
+If you are using an IRIS \fCwsh\fP, do this:
+.Ds
+chpwd\0()\0{\0print\0-Pn\0'\e2201.y%~\e234'\0}
+.De
+The \fCprint -D\fP command has other uses.  For example, to
+print the current directory to standard output in short form,
+you can do this:
+.Ds
+%\0print\0-D\0$PWD
+~subbarao/src
+.De
+and to print each component of the path in short form:
+.Ds
+%\0print\0-D\0$path
+/bin\0/usr/bin\0~locbin\0~locbin/X11\0~/bin
+.De
+.Sh "Directory Stacks"
+.PP
+If you use csh, you may know about directory stacks.
+The \fCpushd\fP command puts the current directory on the
+stack, and changes to a new directory; the \fCpopd\fP command
+pops a directory off the stack and changes to it.
+.Ds
+phoenix%\0cd\0
+phoenix%\0PROMPT='Z\0%~>\0'
+Z\0~>\0pushd\0/tmp
+/tmp\0~
+Z\0/tmp>\0pushd\0/usr/etc
+/usr/etc\0/tmp\0~
+Z\0/usr/etc>\0pushd\0/usr/bin
+/usr/bin\0/usr/etc\0/tmp\0~
+Z\0/usr/bin>\0popd
+/usr/etc\0/tmp\0~
+Z\0/usr/etc>\0popd
+/tmp\0~
+Z\0/tmp>\0pushd\0/etc
+/etc\0/tmp\0~
+Z\0/etc>\0popd\0
+/tmp\0~
+.De
+\fBzsh\fP's directory stack commands work similarly.  One
+difference is the way \fCpushd\fP is handled if no arguments
+are given.  As in csh, this exchanges the top two elements
+of the directory stack:
+.Ds
+Z\0/tmp>\0dirs
+/tmp\0~
+Z\0/tmp>\0pushd
+~\0/tmp
+.De
+unless the stack only has one entry:
+.Ds
+Z\0~>\0popd
+/tmp
+Z\0/tmp>\0dirs
+/tmp
+Z\0/tmp>\0pushd
+~\0/tmp
+Z\0~>
+.De
+or unless the \fIPUSHDTOHOME\fP option is set:
+.Ds
+Z\0~>\0setopt\0pushdtohome
+Z\0~>\0pushd
+~\0~\0/tmp
+.De
+.PP
+As an alternative to using directory stacks in this manner,
+we can get something like a \fIdirectory history\fP
+by setting a few more options and parameters:
+.Ds
+~>\0DIRSTACKSIZE=8
+~>\0setopt\0autopushd\0pushdminus\0pushdsilent\0pushdtohome
+~>\0alias\0dh='dirs\0-v'
+~>\0cd\0/tmp
+/tmp>\0cd\0/usr
+/usr>\0cd\0bin
+/usr/bin>\0cd\0../pub
+/usr/pub>\0dh
+0\0\0\0\0\0\0\0/usr/pub
+1\0\0\0\0\0\0\0/usr/bin
+2\0\0\0\0\0\0\0/usr
+3\0\0\0\0\0\0\0/tmp
+4\0\0\0\0\0\0\0~
+/usr/pub>\0cd\0-3
+/tmp>\0dh
+0\0\0\0\0\0\0\0/tmp
+1\0\0\0\0\0\0\0/usr/pub
+2\0\0\0\0\0\0\0/usr/bin
+3\0\0\0\0\0\0\0/usr
+4\0\0\0\0\0\0\0~
+/tmp>\0ls\0=2/df
+/usr/bin/df
+/tmp>\0cd\0-4
+~>
+.De
+Note that \fC=2\fP expanded to the second directory in the
+history list, and that \fCcd -3\fP recalled the third
+directory in the list.
+.PP
+You may be wondering what all those options do.
+\fIAUTOPUSHD\fP made \fCcd\fP act like \fCpushd\fP.
+(\fCalias cd=pushd\fP is not sufficient, for various reasons.)
+\fIPUSHDMINUS\fP swapped the meaning of \fCcd +1\fP and
+\fCcd -1\fP; we want them to mean the opposite of what they mean in csh,
+because it makes more sense in this scheme, and it's easier to type:
+.Ds
+~>\0dh
+0\0\0\0\0\0\0\0~
+1\0\0\0\0\0\0\0/tmp
+2\0\0\0\0\0\0\0/usr/pub
+3\0\0\0\0\0\0\0/usr/bin
+4\0\0\0\0\0\0\0/usr
+~>\0unsetopt\0pushdminus
+~>\0cd\0+1
+/tmp>\0dh
+0\0\0\0\0\0\0\0/tmp
+1\0\0\0\0\0\0\0~
+2\0\0\0\0\0\0\0/usr/pub
+3\0\0\0\0\0\0\0/usr/bin
+4\0\0\0\0\0\0\0/usr
+/tmp>\0cd\0+2
+/usr/pub>
+.De
+\fIPUSHDSILENT\fP keeps the shell from printing
+the directory stack each time we do a \fCcd\fP,
+and \fIPUSHDTOHOME\fP we mentioned earlier:
+.Ds
+/usr/pub>\0unsetopt\0pushdsilent
+/usr/pub>\0cd\0/etc
+/etc\0/usr/pub\0/tmp\0~\0/usr/bin\0/usr
+/etc>\0cd
+~\0/etc\0/usr/pub\0/tmp\0~\0/usr/bin\0/usr
+~>\0unsetopt\0pushdtohome
+~>\0cd
+/etc\0~\0/usr/pub\0/tmp\0~\0/usr/bin\0/usr
+/etc>
+.De
+\fBDIRSTACKSIZE\fP keeps the directory stack
+from getting too large, much like \fIHISTSIZE\fP:
+.Ds
+/etc>\0setopt\0pushdsilent
+/etc>\0cd\0/
+/>\0cd\0/
+/>\0cd\0/
+/>\0cd\0/
+/>\0cd\0/
+/>\0cd\0/
+/>\0cd\0/
+/>\0cd\0/
+/>\0dh
+0\0\0\0\0\0\0\0/
+1\0\0\0\0\0\0\0/
+2\0\0\0\0\0\0\0/
+3\0\0\0\0\0\0\0/
+4\0\0\0\0\0\0\0/
+5\0\0\0\0\0\0\0/
+6\0\0\0\0\0\0\0/
+7\0\0\0\0\0\0\0/
+.De
+.Sh "Command/Process Substitution"
+.PP
+Command substitution in \fBzsh\fP can take two forms.
+In the traditional form, a command enclosed in
+backquotes (\fC`\fP...\fC`\fP) is replaced on the command line with its output.
+This is the form used by the older shells.
+Newer shells (like \fBzsh\fP) also provide another form,
+\fC$(\fR...\fC)\fR.  This form is much easier to nest.
+.Ds
+%\0ls\0-l\0`echo\0/vmunix`
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\01209702\0May\014\019:04\0/vmunix
+%\0ls\0-l\0$(echo\0/vmunix)
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\01209702\0May\014\019:04\0/vmunix
+%\0who\0|\0grep\0mad
+subbarao\0ttyt7\0\0\0May\023\015:02\0\0\0(mad55sx15.Prince)
+pfalstad\0ttyu1\0\0\0May\023\016:25\0\0\0(mad55sx14.Prince)
+subbarao\0ttyu6\0\0\0May\023\015:04\0\0\0(mad55sx15.Prince)
+pfalstad\0ttyv3\0\0\0May\023\016:25\0\0\0(mad55sx14.Prince)
+%\0who\0|\0grep\0mad\0|\0awk\0'{print\0$2}'
+ttyt7
+ttyu1
+ttyu6
+ttyv3
+%\0cd\0/dev;\0ls\0-l\0$(who\0|
+>\0grep\0$(echo\0mad)\0|
+>\0awk\0'{\0print\0$2\0}')
+crwx-w----\0\01\0subbarao\0\020,\0\071\0May\023\018:35\0ttyt7
+crw--w----\0\01\0pfalstad\0\020,\0\081\0May\023\018:42\0ttyu1
+crwx-w----\0\01\0subbarao\0\020,\0\086\0May\023\018:38\0ttyu6
+crw--w----\0\01\0pfalstad\0\020,\0\099\0May\023\018:41\0ttyv3
+.De
+Many common uses of command substitution, however, are
+superseded by other mechanisms of \fBzsh\fP:
+.Ds
+%\0ls\0-l\0`tty`
+crw-rw-rw-\0\01\0root\0\0\0\0\0\020,\0\028\0May\023\018:35\0/dev/ttyqc
+%\0ls\0-l\0$TTY
+crw-rw-rw-\0\01\0root\0\0\0\0\0\020,\0\028\0May\023\018:35\0/dev/ttyqc
+%\0ls\0-l\0`which\0rn`
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\0\0172032\0Mar\0\06\018:40\0/usr/princeton/bin/rn
+%\0ls\0-l\0=rn
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\0\0172032\0Mar\0\06\018:40\0/usr/princeton/bin/rn
+.De
+A command name with a \fC=\fP prepended is replaced with its full
+pathname.  This can be very convenient.  If it's not convenient
+for you, you can turn it off:
+.Ds
+%\0ls
+=foo\0\0\0\0=bar
+%\0ls\0=foo\0=bar
+zsh:\0foo\0not\0found
+%\0setopt\0noequals
+%\0ls\0=foo\0=bar
+=foo\0\0\0\0=bar
+.De
+.PP
+Another nice feature is process substitution:
+.Ds
+%\0who\0|\0fgrep\0-f\0=(print\0-l\0root\0lemke\0shgchan\0subbarao)
+root\0\0\0\0\0console\0May\019\010:41
+lemke\0\0\0\0ttyq0\0\0\0May\022\010:05\0\0\0(narnia:0.0)
+lemke\0\0\0\0ttyr7\0\0\0May\022\010:05\0\0\0(narnia:0.0)
+lemke\0\0\0\0ttyrd\0\0\0May\022\010:05\0\0\0(narnia:0.0)
+shgchan\0\0ttys1\0\0\0May\023\016:52\0\0\0(gaudi.Princeton.)
+subbarao\0ttyt7\0\0\0May\023\015:02\0\0\0(mad55sx15.Prince)
+subbarao\0ttyu6\0\0\0May\023\015:04\0\0\0(mad55sx15.Prince)
+shgchan\0\0ttyvb\0\0\0May\023\016:51\0\0\0(gaudi.Princeton.)
+.De
+A command of the form \fC=(\fR...\fC)\fR is replaced with the name of a \fIfile\fP
+containing its output.  (A command substitution, on the other
+hand, is replaced with the output itself.)
+\fCprint -l\fP is like \fCecho\fP, excepts that it prints its arguments
+one per line, the way \fCfgrep\fP expects them:
+.Ds
+%\0print\0-l\0foo\0bar
+foo
+bar
+.De
+We could also have written:
+.Ds
+%\0who\0|\0fgrep\0-f\0=(echo\0'root
+>\0lemke
+>\0shgchan
+>\0subbarao')
+.De
+Using\0process\0substitution,
+you\0can\0edit\0the\0output\0of\0a\0command:
+.Ds
+%\0ed\0=(who\0|\0fgrep\0-f\0~/.friends)
+355
+g/lemke/d
+w\0/tmp/filbar
+226
+q
+%\0cat\0/tmp/filbar
+root\0\0\0\0\0console\0May\019\010:41
+shgchan\0\0ttys1\0\0\0May\023\016:52\0\0\0(gaudi.Princeton.)
+subbarao\0ttyt7\0\0\0May\023\015:02\0\0\0(mad55sx15.Prince)
+subbarao\0ttyu6\0\0\0May\023\015:04\0\0\0(mad55sx15.Prince)
+shgchan\0\0ttyvb\0\0\0May\023\016:51\0\0\0(gaudi.Princeton.)
+.De
+or easily read archived mail:
+.Ds
+%\0mail\0-f\0=(zcat\0~/mail/oldzshmail.Z)
+"/tmp/zsha06024":\084\0messages,\00\0new,\043\0unread
+>\0\01\0\0U\0\0TO:\0pfalstad,\0zsh\0(10)
+\0\0\02\0\0U\0\0nytim!tim@uunet.uu.net,\0Re:\0Zsh\0on\0Sparc1\0/SunOS\04.0.3
+\0\0\03\0\0U\0\0JAM%TPN@utrcgw.utc.com,\0zsh\0fix\0(15)
+\0\0\04\0\0U\0\0djm@eng.umd.edu,\0way\0to\0find\0out\0if\0running\0zsh?\0(25)
+\0\0\05\0\0U\0\0djm@eng.umd.edu,\0Re:\0way\0to\0find\0out\0if\0running\0zsh?\0(17)
+\0\0\06\0\0\0r\0djm@eng.umd.edu,\0Meta\0.\0(18)
+\0\0\07\0\0U\0\0jack@cs.glasgow.ac.uk,\0Re:\0problem\0building\0zsh\0(147)
+\0\0\08\0\0U\0\0nytim!tim@uunet.uu.net,\0Re:\0Zsh\0on\0Sparc1\0/SunOS\04.0.3
+\0\0\09\0\0\0\0\0ursa!jmd,\0Another\0fix...\0(61)
+\0\010\0\0U\0\0pplacewa@bbn.com,\0Re:\0v18i084:\0Zsh\02.00\0-\0A\0small\0complaint\0(36)
+\0\011\0\0U\0\0lubkin@cs.rochester.edu,\0POSIX\0job\0control\0(34)
+\0\012\0\0U\0\0yale!bronson!tan@uunet.UU.NET
+\0\013\0\0U\0\0brett@rpi.edu,\0zsh\0(36)
+\0\014\0\0S\0\0subbarao,\0zsh\0sucks!!!!\0(286)
+\0\015\0\0U\0\0snibru!d241s008!d241s013!ala@relay.EU.net,\0zsh\0(165)
+\0\016\0\0U\0\0nytim!tim@uunet.UU.NET,\0Re:\0Zsh\0on\0Sparc1\0/SunOS\04.0.3
+\0\017\0\0U\0\0subbarao,\0zsh\0is\0a\0junk\0shell\0(43)
+\0\018\0\0U\0\0amaranth@vela.acs.oakland.edu,\0zsh\0(33)
+43u/84\01:\0x
+%\0ls\0-l\0/tmp/zsha06024
+/tmp/zsha06024\0not\0found
+.De
+Note that the shell creates a temporary file, and deletes it
+when the command is finished.
+.Ds
+%\0diff\0=(ls)\0=(ls\0-F)
+3c3
+<\0fortune
+---
+>\0fortune*
+10c10
+<\0strfile
+---
+>\0strfile*
+.De
+If you read \fBzsh\fP's man page, you may notice that \fC<(\fR...\fC)\fR
+is another form of process substitution which is similar to
+\fC=(\fR...\fC)\fR.
+There is an important difference between the two.
+In the \fC<(\fR...\fC)\fR case, the shell creates a named pipe (FIFO)
+instead of a file.  This is better, since it does not
+fill up the file system; but it does not work in all cases.
+In fact, if we had replaced \fC=(\fR...\fC)\fR with \fC<(\fR...\fC)\fR in 
+the examples above, all of them would have stopped working
+except for \fCfgrep -f <(\fR...\fC)\fR.
+You can not edit a pipe, or open it as a mail folder;
+\fCfgrep\fP, however, has no problem with reading
+a list of words from a pipe.
+You may wonder why \fCdiff <(foo) bar\fP doesn't work, since
+\fCfoo | diff - bar\fP works; this is because \fCdiff\fP creates
+a temporary file if it notices that one of its arguments
+is \fC-\fP, and then copies its standard input to the temporary
+file.
+.PP
+\fC>(\fR...\fC)\fR is just like \fC<(\fR...\fC)\fR except that the
+command between the parentheses will get its input from the named
+pipe.
+.Ds
+%\0dvips\0-o\0>(lpr)\0zsh.dvi
+.De
+.Sh "Redirection"
+.PP
+Apart from all the regular redirections like the Bourne shell has,
+\fBzsh\fP can do more.  You can send the output of a command to more
+than one file, by specifying more redirections like
+.Ds
+%\0echo\0Hello\0World\0>file1\0>file2
+.De
+and the text will end up in both files.  Similarly, you can send the
+output to a file and into a pipe:
+.Ds
+%\0make\0>\0make.log\0|\0grep\0Error
+.De
+The same goes for input.  You can make the input of a command come
+from more than one file.
+.Ds
+%\0sort\0<file1\0<file2\0<file3
+.De
+The command will first get the contents of file1 as its standard
+input, then those of file2 and finally the contents of file3.  This,
+too, works with pipes.
+.Ds
+%\0cut\0-d:\0-f1\0/etc/passwd\0|\0sort\0<newnames
+.De
+The sort will get as its standard input first the output of \fCcut\fP
+and then the contents of \fCnewnames\fP.
+.PP
+Suppose you would like to watch the standard output of a command on
+your terminal, but want to pipe the standard error to another command.
+An easy way to do this in \fBzsh\fP is by redirecting the standard
+error using \fC2> >(\fR...\fC)\fR.
+.Ds
+%\0find\0/\0-name\0games\02>\0>(grep\0-v\0'Permission'\0>\0realerrors)
+.De
+The above redirection will actually be implemented with a regular
+pipe, not a temporary named pipe.
+.Sh "Aliasing"
+.PP
+Often-used commands can be abbreviated with an alias:
+.Ds
+%\0alias\0uc=uncompress
+%\0ls
+hanoi.Z
+%\0uc\0hanoi
+%\0ls
+hanoi
+.De
+or commands with certain desired options:
+.Ds
+%\0alias\0fm='finger\0-m'
+%\0fm\0root
+Login\0name:\0root\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0In\0real\0life:\0Operator
+Directory:\0/\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Shell:\0/bin/csh
+On\0since\0May\019\010:41:15\0on\0console\0\0\0\0\03\0days\05\0hours\0Idle\0Time
+No\0unread\0mail
+No\0Plan.
+
+%\0alias\0lock='lock\0-p\0-60000'
+%\0lock
+lock:\0/dev/ttyr4\0on\0phoenix.\0timeout\0in\060000\0minutes
+time\0now\0is\0Fri\0May\024\004:23:18\0EDT\01991
+Key:\0
+
+%\0alias\0l='ls\0-AF'
+%\0l\0/
+\&.bash_history\0\0\0\0\0\0\0\0\0\0\0\0\0\0kadb*
+\&.bashrc\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0lib@
+\&.cshrc\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0licensed/
+\&.exrc\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0lost+found/
+\&.login\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0macsyma
+\&\fR...
+.De
+Aliases can also be used to replace old commands:
+.Ds
+%\0alias\0grep=egrep\0ps=sps\0make=gmake
+%\0alias\0whoami='echo\0root'
+%\0whoami
+root
+.De
+or to define new ones:
+.Ds
+%\0cd\0/
+%\0alias\0sz='ls\0-l\0|\0sort\0-n\0+3\0|\0tail\0-10'
+%\0sz
+drwxr-sr-x\0\07\0bin\0\0\0\0\0\0\0\0\0\03072\0May\023\011:59\0etc
+drwxrwxrwx\026\0root\0\0\0\0\0\0\0\0\05120\0May\024\004:20\0tmp
+drwxr-xr-x\0\02\0root\0\0\0\0\0\0\0\0\08192\0Dec\026\019:34\0lost+found
+drwxr-sr-x\0\02\0bin\0\0\0\0\0\0\0\0\014848\0May\023\018:48\0dev
+-r--r--r--\0\01\0root\0\0\0\0\0\0\0140520\0Dec\026\020:08\0boot
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\0\0311172\0Dec\026\020:08\0kadb
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\01209695\0Apr\016\015:33\0vmunix.old
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\01209702\0May\014\019:04\0vmunix
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\01209758\0May\021\012:23\0vmunix.new.kernelmap.old
+-rwxr-xr-x\0\01\0root\0\0\0\0\0\01711848\0Dec\026\020:08\0vmunix.org
+%\0cd
+%\0alias\0rable='ls\0-AFtrd\0*(R)'\0nrable='ls\0-AFtrd\0*(^R)'
+%\0rable
+README\0\0\0\0\0\0func/\0\0\0\0\0\0\0bin/\0\0\0\0\0\0\0\0pub/\0\0\0\0\0\0\0\0News/\0\0\0\0\0\0\0src/
+nicecolors\0\0etc/\0\0\0\0\0\0\0\0scr/\0\0\0\0\0\0\0\0tmp/\0\0\0\0\0\0\0\0iris/\0\0\0\0\0\0\0zsh*
+%\0nrable
+Mailboxes/\0\0mail/\0\0\0\0\0\0\0notes
+.De
+(The pattern \fC*(R)\fP matches all readable files in the current
+directory, and \fC*(^R)\fP matches all unreadable files.)
+.PP
+Most other shells have aliases of this kind (\fIcommand\fP aliases).
+However, \fBzsh\fP also has \fIglobal\fP aliases, which are substituted
+anywhere on a line.
+Global aliases can be used to abbreviate frequently-typed
+usernames, hostnames, etc.
+.Ds
+%\0alias\0-g\0me=pfalstad\0gun=egsirer\0mjm=maruchck
+%\0who\0|\0grep\0me
+pfalstad\0ttyp0\0\0\0May\024\003:39\0\0\0(mickey.Princeton)
+pfalstad\0ttyp5\0\0\0May\024\003:42\0\0\0(mickey.Princeton)
+%\0fm\0gun
+Login\0name:\0egsirer\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0In\0real\0life:\0Emin\0Gun\0Sirer
+Directory:\0/u/egsirer\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Shell:\0/bin/sh
+Last\0login\0Thu\0May\023\019:05\0on\0ttyq3\0from\0bow.Princeton.ED
+New\0mail\0received\0Fri\0May\024\002:30:28\01991;
+\0\0unread\0since\0Fri\0May\024\002:30:27\01991
+%\0alias\0-g\0phx=phoenix.princeton.edu\0warc=wuarchive.wustl.edu
+%\0ftp\0warc
+Connected\0to\0wuarchive.wustl.edu.
+.De
+Here are some more interesting uses.
+.Ds
+%\0alias\0-g\0M='|\0more'\0GF='|\0fgrep\0-f\0~/.friends'
+%\0who\0M\0\0\0#\0\fIpipes\0the\0output\0of\0\fCwho\fI\0through\0\fCmore
+%\0who\0GF\0\0#\0\fIsee\0if\0your\0friends\0are\0on\fC
+%\0w\0GF\0\0\0\0#\0\fIsee\0what\0your\0friends\0are\0doing
+.De
+Another example makes use of \fBzsh\fP's process substitution.
+If you run NIS, and you miss being able to do this:
+.Ds
+%\0grep\0pfalstad\0/etc/passwd
+.De
+you can define an alias that will seem more natural
+than \fCypmatch pfalstad passwd\fP:
+.Ds
+%\0alias\0-g\0PASS='<(ypcat\0passwd)'
+%\0grep\0pfalstad\0PASS
+pfalstad:*:3564:35:Paul\0John\0Falstad:/u/pfalstad:/usr/princeton/bin/zsh
+.De
+If you're really crazy, you can even call it \fC/etc/passwd\fP:
+.Ds
+%\0alias\0-g\0/etc/passwd='<(ypcat\0passwd)'
+%\0grep\0pfalstad\0/etc/passwd
+pfalstad:*:3564:35:Paul\0John\0Falstad:/u/pfalstad:/usr/princeton/bin/zsh
+.De
+The last example shows one of the perils of global aliases;
+they have a lot of potential to cause confusion.
+For example, if you defined a global alias called \fC|\fP (which is
+possible), \fBzsh\fP would begin to act very strangely; every pipe
+symbol would be replaced with the text of your alias.
+To some extent, global aliases are like macros in C;
+discretion is advised in using them and in choosing names for them.
+Using names in all caps is not a bad idea, especially
+for aliases which introduce shell metasyntax (like \fCM\fP and \fCGF\fP
+above).
+.PP
+Note that \fBzsh\fP aliases are not like csh aliases.  The syntax for
+defining them is different, and they do not have arguments.
+All your favorite csh aliases will probably not work under \fBzsh\fP.
+For example, if you try:
+.Ds
+alias\0rm\0mv\0'\e!*\0/tmp/wastebasket'
+.De
+no aliases will be defined, but \fBzsh\fP will not report an error.
+In csh, this line defines an alias that makes \fCrm\fP safe---files
+that are \fCrm\fP'd will be moved to a temporary directory instead of
+instantly destroyed.  In \fBzsh\fP's syntax, however, this line asks
+the shell to print any existing alias definitions for \fCrm\fP,
+\fCmv\fP, or \fC!*\ /tmp/wastebasket\fP.  Since there are none, most
+likely, the shell will not print anything, although \fCalias\fP will
+return a nonzero exit code.  The proper syntax is this:
+.Ds
+alias\0rm='mv\0\e!*\0/tmp/wastebasket'
+.De
+However, this won't work either:
+.Ds
+%\0rm\0foo.dvi
+zsh:\0no\0matches\0found:\0!*
+.De
+While this makes \fCrm\fP safe, it is certainly not what the user
+intended.  In \fBzsh\fP, you must use a shell function for this:
+.Ds
+%\0unalias\0rm
+%\0rm\0()\0{\0mv\0$*\0/tmp/wastebasket\0}
+%\0rm\0foo.dvi
+%\0ls\0/tmp/wastebasket
+foo.dvi
+.De
+While this is much cleaner and easier to read (I hope you will
+agree), it is not csh-compatible.  Therefore, a script to convert
+csh aliases and variables has been provided.  You should only need to use it
+once, to convert all your csh aliases and parameters to \fBzsh\fP format:
+.Ds
+%\0csh
+csh>\0alias
+l\0\0\0\0\0\0\0ls\0-AF
+more\0\0\0\0less
+on\0\0\0\0\0\0last\0-2\0!:1\0;\0who\0|\0grep\0!:1
+csh>\0exit
+%\0c2z\0>neat_zsh_aliases
+%\0cat\0neat_zsh_aliases
+alias\0l='ls\0-AF'
+alias\0more='less'
+on\0()\0{\0last\0-2\0$1\0;\0who\0|\0grep\0$1\0}
+\&...
+.De
+The first two aliases were converted to regular \fBzsh\fP aliases, while
+the third, since it needed to handle arguments, was converted to
+a function.  \fCc2z\fP can convert most aliases to \fBzsh\fP format without
+any problems.  However, if you're using some really arcane csh tricks,
+or if you have an alias with a name like \fCdo\fP (which is reserved
+in \fBzsh\fP), you may have to fix some of the aliases by hand.
+.PP
+The \fCc2z\fP script checks your csh setup, and produces a list
+of \fBzsh\fP commands which replicate your aliases and parameter settings
+as closely as possible.  You could include its output in your
+startup file, \fC.zshrc\fP.
+.Sh "History"
+.PP
+There are several ways to manipulate history in \fBzsh\fP.
+One way is to use csh-style \fC!\fP history:
+.Ds
+%\0/usr/local/bin/!:0\0!-2*:s/foo/bar/\0>>!$
+.De
+If you don't want to use this, you can turn it off
+by typing \fCsetopt nobanghist\fP.  If you are afraid of accidentally
+executing the wrong command you can set the \fIHISTVERIFY\fP option.
+If this option is set, commands that result from history expansion
+will not be executed immediately, but will be put back into the editor
+buffer for further consideration.
+.PP
+If you're not familiar with \fC!\fP history, here follows some
+explanation.  History substitutions always start with a \fC!\fP,
+commonly called \*Qbang\*U.  After the \fC!\fP comes an (optional)
+designation of which \*Qevent\*U (command) to use, then a colon, and
+then a designation of what word of that command to use.  For example,
+\fC!-\fIn\fR refers to the command \fIn\fP commands ago.
+.Ds
+%\0ls
+foo\0\0bar
+%\0cd\0foo
+%\0!-2
+ls
+baz\0\0bam
+.De
+No word designator was used, which means that the whole command
+referred to was repeated.  Note that the shell will echo the result of
+the history substitution.  The word designator can, among other
+things, be a number indicating the argument to use, where \fC0\fP is
+the command.
+.Ds
+%\0/usr/bin/ls\0foo
+foo
+%\0!:0\0bar
+/usr/bin/ls\0bar
+bar
+.De
+In this example, no event designator was used, which tells \fBzsh\fP
+to use the previous command.  A \fC$\fP specifies the last argument
+.Ds
+%\0mkdir\0/usr/local/lib/emacs/site-lisp/calc
+%\0cd\0!:$
+cd\0/usr/local/lib/emacs/site-lisp/calc
+.De
+If you use more words of the same command, only the first \fC!\fP
+needs an event designator.
+.Ds
+%\0make\0prig\0>>\0make.log
+make:\0***\0No\0rule\0to\0make\0target\0`prig'.\0\0Stop.
+%\0cd\0src
+%\0!-2:0\0prog\0>>\0!:$
+make\0prog\0>>\0make.log
+.De
+This is different from csh, where a bang with no event designator
+always refers to the previous command.  If you actually like this
+behaviour, set the \fICSHJUNKIEHISTORY\fP option.
+.Ds
+%\0setopt\0cshjunkiehistory
+%\0!-2:0\0prog2\0>>\0!:$
+make\0prog2\0>>\0cshjunkiehistory
+.De
+Another way to use history is to use the \fCfc\fP command.  For
+example, if you type an erroneous command:
+.Ds
+%\0for\0i\0in\0`cat\0/etc/clients`\0
+\0do\0
+\0rpu\0$i\0
+\0done
+zsh:\0command\0not\0found:\0rpu
+zsh:\0command\0not\0found:\0rpu
+zsh:\0command\0not\0found:\0rpu
+\&\fR...
+.De
+typing \fCfc\fP will execute an editor on this command, allowing
+you to fix it.  (The default editor is \fCvi\fP, by the way,
+not \fCed\fP).
+.Ds
+%\0fc
+49
+/rpu/s//rup/p
+\0rup\0$i\0
+w
+49
+q
+for\0i\0in\0`cat\0/etc/clients`\0
+\0do\0
+\0rup\0$i\0
+\0done
+\0\0\0\0\0\0\0\0beam\0\0\0\0up\0\02\0days,\010:17,\0\0\0\0load\0average:\00.86,\00.80,\00.50
+\0\0\0\0\0\0\0\0\0bow\0\0\0\0up\0\04\0days,\0\08:41,\0\0\0\0load\0average:\00.91,\00.80,\00.50
+\0\0\0\0\0\0\0\0burn\0\0\0\0up\0\0\0\0\0\0\0\0\0\017:18,\0\0\0\0load\0average:\00.91,\00.80,\00.50
+\0\0\0\0\0\0\0burst\0\0\0\0up\0\09\0days,\0\01:49,\0\0\0\0load\0average:\00.95,\00.80,\00.50
+\0\0\0\0\0\0\0\0\0tan\0\0\0\0up\0\0\0\0\0\0\0\0\0\011:14,\0\0\0\0load\0average:\00.91,\00.80,\00.50
+\0\0\0\0\0\0\0bathe\0\0\0\0up\0\03\0days,\017:49,\0\0\0\0load\0average:\01.84,\01.79,\01.50
+\0\0\0\0\0\0\0\0bird\0\0\0\0up\0\01\0day,\0\0\09:13,\0\0\0\0load\0average:\01.95,\01.82,\01.51
+\0\0\0\0\0\0bonnet\0\0\0\0up\0\02\0days,\021:18,\0\0\0\0load\0average:\00.93,\00.80,\00.50
+\&\fR...
+.De
+A variant of the \fCfc\fP command is \fCr\fP, which redoes the last
+command, with optional changes:
+.Ds
+%\0echo\0foo
+foo
+%\0r
+echo\0foo
+foo
+
+%\0echo\0foo
+foo
+%\0r\0foo=bar
+echo\0bar
+bar
+.De
+.Sh "Command Line Editing"
+.PP
+\fBzsh\fP's command line editor, \fBZLE\fP, is quite powerful.
+It is designed to emulate either emacs or vi; the default
+is emacs.  To set the bindings for vi mode, type \fCbindkey -v\fP.  If
+your \fBEDITOR\fP or \fBVISUAL\fP environment variable is vi,
+\fBzsh\fP will use vi emulation by default.  You can then switch to
+emacs mode with \fCbindkey -e\fP.
+.PP
+In addition to basic editing, the shell allows you to 
+recall previous lines in the history.  In emacs mode,
+this is done with \fI^P\fP (control-P) or (on many terminals) with the
+cursor-up key:
+.Ds
+%\0ls\0~
+-\0\0\0\0\0\0\0\0\0\0\0README\0\0\0\0\0\0file\0\0\0\0\0\0\0\0mail\0\0\0\0\0\0\0\0pub\0\0\0\0\0\0\0\0\0tmp
+Mailboxes\0\0\0bin\0\0\0\0\0\0\0\0\0func\0\0\0\0\0\0\0\0nicecolors\0\0scr\0\0\0\0\0\0\0\0\0zsh
+News\0\0\0\0\0\0\0\0etc\0\0\0\0\0\0\0\0\0iris\0\0\0\0\0\0\0\0notes\0\0\0\0\0\0\0src
+%\0echo\0foobar
+foobar
+%\0\fI^P\fC
+%\0echo\0foobar\fI^P\fC
+%\0ls\0~_
+.De
+Pressing \fI^P\fP once brings up the previous line (\fCecho foobar\fP);
+pressing it again brings up the line before that (\fCls ~\fP).
+The cursor is left at the end of the line, allowing you to
+edit the line if desired before executing it.
+In many cases, \fBZLE\fP eliminates the need for the \fCfc\fP command,
+since it is powerful enough to handle even multiline commands:
+.Ds
+%\0for\0i\0in\0a\0b\0c\0d\0e
+>\0do
+>\0echo\0$i
+>\0done
+a
+b
+c
+d
+e
+%\0\fI^P\fC
+%\0for\0i\0in\0a\0b\0c\0d\0e\0
+\0do\0
+\0echo\0$i\0
+\0done_
+.De
+Now you can just move up to the part you want to change...
+.Ds
+%\0for\0i\0in\0\kxa\l'|\nxu\(ul'\0b\0c\0d\0e
+\0do\0
+\0echo\0$i\0
+\0done
+.De
+change it, and execute the new command.
+.Ds
+%\0for\0i\0in\0f\0g\0h\0i\0j
+\0do\0
+\0echo\0$i\0
+\0done
+f
+g
+h
+i
+j
+.De
+Also, you can search the history for a certain command using
+\fIESC-P\fP, this will look for the last command that started with the
+(part of the) word at the beginning of the current line.  Hitting
+\fIESC-P\fP another time gets you the command before that, etc.
+.Ds
+%\0set\0\fIESC-P\fC
+%\0setopt\0autolist\0\fIESC-P\fC
+%\0setopt\0nocorrect_
+.De
+Another way is to do an incremental search, emacs-style:
+.Ds
+%\0\fI^R\fC
+%\0_
+i-search:
+
+%\0l\kxs\l'|\nxu\(ul'\0/usr/bin
+i-search:\0l
+
+%\0date\0>\0foofile\kx.\l'|\nxu\(ul'c
+i-search:\0le
+.De
+Suppose you have retrieved an old history event in one of these ways
+and would like to execute several consecutive old commands starting
+with this one.  \fC^O\fP will execute the current command and then put
+the next command from the history into the editor buffer.  Typing
+\fC^O\fP several times will therefore reexecute several consecutive
+commands from the history.  Of course, you can edit some of those
+commands in between.
+.PP
+In addition to completion (see below), \fITAB\fP performs expansion if
+possible.
+.Ds
+%\0ls\0*.c\fITAB\fC
+%\0ls\0foofile.c\0fortune.c\0rnd.c\0strfile.c\0unstr.c_
+.De
+For example, suppose you have a bunch of weird files in an important
+directory:
+.Ds
+%\0ls
+\0\0*\0*\0*\0\0\0\0\0\0\0;\0&\0%\0$??foo\0\0dspfok\0\0\0\0\0\0\0\0foo.c
+\0\0!"foo"!\0\0\0\0\0\0\0`\0\e\0`\0\0\0\0\0\0\0\0\0foo\0\0\0\0\0\0\0\0\0\0\0rrr
+.De
+You want to remove them, but you don't want to damage \fCfoo.c\fP.
+Here is one way to do this:
+.Ds
+%\0rm\0*\fITAB\fC
+%\0rm\0\e\0\e\0\e*\e\0\e*\e\0\e*\e\0\e\0\e\0\0\e!\e"foo\e"\e!\0\e;\e\0\e&\e\0%\e\0\e$'
+''
+'foo\0\e`\e\0\e\e\e\0\e`\0dspfok\0foo\0foo.c\0rrr_
+.De
+When you expand \fC*\fP, \fBzsh\fP inserts the names of all the files
+into the editing buffer, with proper shell quoting.
+Now, just move back and remove \fCfoo.c\fP from the buffer:
+.Ds
+%\0rm\0\e\0\e\0\e*\e\0\e*\e\0\e*\e\0\e\0\e\0\0\e!\e"foo\e"\e!\0\e;\e\0\e&\e\0%\e\0\e$'
+''
+'foo\0\e`\e\0\e\e\e\0\e`\0dspfok\0foo\0\kxr\l'|\nxu\(ul'rr
+.De
+and press return.
+Everything except \fCfoo.c\fP will be deleted from the directory.  If
+you do not want to actually expand the current word, but would like to
+see what the matches are, type \fC^Xg\fP.
+.Ds
+%\0rm\0f*\fI^Xg\fP
+foo\0\0\0\0foo.c
+%\0rm\0f*_
+.De
+Here's another trick; let's say you have typed this command in:
+.Ds
+%\0gcc\0-o\0x.out\0foob.c\0-g\0-Wpointer-arith\0-Wtrigraphs_
+.De
+and you forget which library you want.  You need to escape
+out for a minute and check by typing
+\fCls /usr/lib\fP, or some other such command;
+but you don't want to retype the whole command again,
+and you can't press return now because the current command
+is incomplete.
+In \fBzsh\fP, you can put the line on the \fIbuffer stack\fP, using
+\fIESC-Q\fP, and type some other commands.  The next time a prompt is printed,
+the \fCgcc\fP line will be popped off the stack and put
+in the editing buffer automatically; you can then enter the
+proper library name and press return (or, \fIESC-Q\fP again and look
+for some other libraries whose names you forgot).
+.PP
+A similar situation: what if you forget the option to gcc that
+finds bugs using AI techniques?  You could either use \fIESC-Q\fP
+again, and type \fCman gcc\fP, or you could press \fIESC-H\fP, which
+essentially does the same thing; it puts the current line on
+the buffer stack, and executes the command \fCrun-help gcc\fP,
+where \fCrun-help\fP is an alias for \fCman\fP.
+.PP
+Another interesting command is \fIESC-A\fP.  This executes the
+current line, but retains it in the buffer, so that it appears
+again when the next prompt is printed.
+Also, the cursor stays in the same place.
+This is useful for executing a series of similar commands:
+.Ds
+%\0cc\0grok.c\0-g\0-lc\0-lgl\0-lsun\0-lmalloc\0-Bstatic\0-o\0b.out
+%\0cc\0fubar.c\0-g\0-lc\0-lgl\0-lsun\0-lmalloc\0-Bstatic\0-o\0b.out
+%\0cc\0fooble.c\0-g\0-lc\0-lgl\0-lsun\0-lmalloc\0-Bstatic\0-o\0b.out
+.De
+.PP
+The \fIESC-'\fP command is useful for managing the shell's quoting
+conventions.  Let's say you want to print this string:
+.Ds
+don't\0do\0that;\0type\0'rm\0-rf\0\e*',\0with\0a\0\e\0before\0the\0*.
+.De
+All that is necessary is to type it into the editing buffer:
+.Ds
+%\0don't\0do\0that;\0type\0'rm\0-rf\0\e*',\0with\0a\0\e\0before\0the\0*.
+.De
+press \fIESC-'\fP (escape-quote):
+.Ds
+%\0'don'\e''t\0do\0that;\0type\0'\e''rm\0-rf\0\e*'\e'',\0with\0a\0\e\0before\0the\0*.'
+.De
+then move to the beginning and add the \fCecho\fP command.
+.Ds
+%\0echo\0'don'\e''t\0do\0that;\0type\0'\e''rm\0-rf\0\e*'\e'',\0with\0a\0\e\0before\0the\0*.'
+don't\0do\0that;\0type\0'rm\0-rf\0\e*',\0with\0a\0\e\0before\0the\0*.
+.De
+Let's say you want to create an alias to do this \fCecho\fP command.
+This can be done by recalling the line with \fI^P\fP and pressing
+\fIESC-'\fP again:
+.Ds
+%\0'echo\0'\e''don'\e''\e'\e'''\e''t\0do\0that;\0type\0'\e''\e'\e'''\e''rm\0-rf
+\e*'\e''\e'\e'''\e'',\0with\0a\0\e\0before\0the\0*.'\e'''
+.De
+and then move to the beginning and add the command to create
+an alias.
+.Ds
+%\0alias\0zoof='echo\0'\e''don'\e''\e'\e'''\e''t\0do\0that;\0type\0'\e''\e'\e'''\e''rm
+-rf\0\e*'\e''\e'\e'''\e'',\0with\0a\0\e\0before\0the\0*.'\e'''
+%\0zoof
+don't\0do\0that;\0type\0'rm\0-rf\0\e*',\0with\0a\0\e\0before\0the\0*.
+.De
+If one of these fancy editor commands changes your command line in a
+way you did not intend, you can undo changes with \fC^_\fP, if you can
+get it out of your keyboard, or \fC^X^U\fP, otherwise.
+.PP
+Another use of the editor is to edit the value of variables.
+For example, an easy way to change your path is to use
+the \fCvared\fP command:
+.Ds
+%\0vared\0PATH
+>\0/u/pfalstad/scr:/u/pfalstad/bin/sun4:/u/maruchck/scr:/u/subbarao/bin:/u/maruc
+hck/bin:/u/subbarao/scripts:/usr/princeton/bin:/usr/ucb:/usr/bin:/bin:/usr/host
+s:/usr/princeton/bin/X11:/./usr/lang:/./usr/etc:/./etc
+.De
+You can now edit the path.  When you press return, the contents
+of the edit buffer will be assigned to \fBPATH\fP.
+.Sh "Completion"
+.PP
+Another great \fBzsh\fP feature is completion.  If you hit \fITAB\fP, \fBzsh\fP
+will complete all kinds of stuff.  Like commands or filenames:
+.Ds
+%\0comp\fITAB\fC
+%\0compress\0_
+
+%\0ls\0nic\fITAB\fC
+%\0ls\0nicecolors\0_
+
+%\0ls\0/usr/pr\fITAB\fC
+%\0ls\0/usr/princeton/_
+
+%\0ls\0-l\0=com\fITAB\fC
+%\0ls\0-l\0=compress\0_
+.De
+If the completion is ambiguous, the editor will beep.  If you find
+this annoying, you can set the \fINOLISTBEEP\fP option.  Completion
+can even be done in the middle of words.  To use this, you will have
+to set the \fICOMPLETEINWORD\fP option:
+.Ds
+%\0setopt\0completeinword
+%\0ls\0/usr/p\kxt\l'|\nxu\(ul'on\fITAB\fC
+%\0ls\0/usr/prince\kxt\l'|\nxu\(ul'on/
+%\0setopt\0alwaystoend
+%\0ls\0/usr/p\kxt\l'|\nxu\(ul'on\fITAB\fC
+%\0ls\0/usr/princeton/_
+.De
+You can list possible completions by pressing \fI^D\fP:
+.Ds
+%\0ls\0/vmu\fITAB\0\(embeep\(em\fC
+%\0ls\0/vmunix_
+%\0ls\0/vmunix\fI^D\fC
+vmunix\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0vmunix.old\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
+vmunix.new.kernelmap.old\0\0vmunix.org
+.De
+Or, you could just set the \fIAUTOLIST\fP option:
+.Ds
+%\0setopt\0autolist
+%\0ls\0/vmu\fITAB\0\(embeep\(em\fC
+vmunix\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0vmunix.old\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
+vmunix.new.kernelmap.old\0\0vmunix.org
+%\0ls\0/vmunix_
+.De
+If you like to see the types of the files in these lists, like in
+\fCls\ -F\fP, you can set the \fILISTTYPES\fP option.  Together with
+\fIAUTOLIST\fP you can use \fILISTAMBIGUOUS\fP.  This will only list
+the possibilities if there is no unambiguous part to add:
+.Ds
+%\0setopt\0listambiguous
+%\0ls\0/vmu\fITAB\0\(embeep\(em\fC
+%\0ls\0/vmunix_\fITAB\0\(embeep\(em\fC
+vmunix\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0vmunix.old\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
+vmunix.new.kernelmap.old\0\0vmunix.org
+.De
+If you don't want several of these listings to scroll the screen so
+much, the \fIALWAYSLASTPROMPT\fP option is useful.  If set, you can
+continue to edit the line you were editing, with the completion
+listing appearing beneath it.
+.PP
+Another interesting option is \fIMENUCOMPLETE\fP.  This affects the
+way \fITAB\fP works.  Let's look at the \fC/vmunix\fP example again:
+.Ds
+%\0setopt\0menucomplete
+%\0ls\0/vmu\fITAB\fC
+%\0ls\0/vmunix\fITAB\fC
+%\0ls\0/vmunix.new.kernelmap.old\fITAB\fC
+%\0ls\0/vmunix.old_
+.De
+Each time you press \fITAB\fP, it displays the next possible completion.
+In this way, you can cycle through the possible completions until
+you find the one you want.
+.PP
+The \fIAUTOMENU\fP option makes a nice compromise between this method
+of completion and the regular method.  If you set this option,
+pressing \fITAB\fP once completes the unambiguous part normally,
+pressing the \fITAB\fP key repeatedly after an ambiguous completion
+will cycle through the possible completions.
+.PP
+Another option you could set is \fIRECEXACT\fP, which causes
+exact matches to be accepted, even if there are other possible
+completions:
+.Ds
+%\0setopt\0recexact
+%\0ls\0/vmu\fITAB\0\(embeep\(em\fC
+vmunix\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0vmunix.old\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
+vmunix.new.kernelmap.old\0\0vmunix.org
+%\0ls\0/vmunix_\fITAB\fC
+%\0ls\0/vmunix\0_
+.De
+To facilitate the typing of pathnames, a slash will be added whenever
+a directory is completed.  Some computers don't like the spurious
+slashes at the end of directory names.  In that case, the
+\fIAUTOREMOVESLASH\fP option comes to rescue.  It will remove these
+slashes when you type a space or return after them.
+.PP
+The \fIfignore\fP variable lists suffixes of files to ignore
+during completion.
+.Ds
+%\0ls\0foo\fITAB\0\(embeep\(em\fC
+foofile.c\0\0foofile.o
+%\0fignore=(\0.o\0\e~\0.bak\0.junk\0)
+%\0ls\0foo\fITAB\fP
+%\0ls\0foofile.c\0_
+.De
+Since \fCfoofile.o\fP has a suffix that is in the \fCfignore\fP list,
+it was not considered a possible completion of \fCfoo\fP.
+.PP
+Username completion is also supported:
+.Ds
+%\0ls\0~pfal\fITAB\fC
+%\0ls\0~pfalstad/_
+.De
+and parameter name completion:
+.Ds
+%\0echo\0$ORG\fITAB\fC
+%\0echo\0$ORGANIZATION\0_
+%\0echo\0${ORG\fITAB\fC
+%\0echo\0${ORGANIZATION\0_
+.De
+Note that in the last example a space is added after the completion as
+usual.  But if you want to add a colon or closing brace, you probably
+don't want this extra space.  Setting the \fIAUTOPARAMKEYS\fP option
+will automatically remove this space if you type a colon or closing
+brace after such a completion.
+.PP
+There is also option completion:
+.Ds
+%\0setopt\0nocl\fITAB\fC
+%\0setopt\0noclobber\0_
+.De
+and binding completion:
+.Ds
+%\0bindkey\0'^X^X'\0pu\fITAB\fC
+%\0bindkey\0'^X^X'\0push-line\0_
+.De
+The \fCcompctl\fP command is used to control completion of the
+arguments of specific commands.  For example, to specify that certain
+commands take other commands as arguments, you use \fCcompctl -c\fP:
+.Ds
+%\0compctl\0-c\0man\0nohup
+%\0man\0upt\fITAB\fC
+%\0man\0uptime\0_
+.De
+To specify that a command should complete filenames, you should use
+\fCcompctl -f\fP.  This is the default.  It can be combined with \fC-c\fP,
+as well.
+.Ds
+%\0compctl\0-cf\0echo
+%\0echo\0upt\fITAB\fC
+%\0echo\0uptime\0_
+
+%\0echo\0fo\fITAB\fC
+%\0echo\0foo.c
+.De
+Similarly, use \fC-o\fP to specify options, \fC-v\fP to specify
+variables, and \fC-b\fP to specify bindings.
+.Ds
+%\0compctl\0-o\0setopt\0unsetopt
+%\0compctl\0-v\0typeset\0vared\0unset\0export
+%\0compctl\0-b\0bindkey
+.De
+You can also use \fC-k\fP to specify a custom list of keywords to use
+in completion.  After the \fC-k\fP comes either the name of an array
+or a literal array to take completions from.
+.Ds
+%\0ftphosts=(ftp.uu.net\0wuarchive.wustl.edu)
+%\0compctl\0-k\0ftphosts\0ftp
+%\0ftp\0wu\fITAB\fC
+%\0ftp\0wuarchive.wustl.edu\0_
+
+%\0compctl\0-k\0'(cpirazzi\0subbarao\0sukthnkr)'\0mail\0finger
+%\0finger\0cp\fITAB\fC
+%\0finger\0cpirazzi\0_
+.De
+To better specify the files to complete for a command, use the
+\fC-g\fP option which takes any glob pattern as an argument.  Be sure
+to quote the glob patterns as otherwise they will be expanded when the
+\fCcompctl\fP command is run.
+.Ds
+%\0ls
+letter.tex\0\0letter.dvi\0\0letter.aux\0\0letter.log\0\0letter.toc
+%\0compctl\0-g\0'*.tex'\0latex
+%\0compctl\0-g\0'*.dvi'\0xdvi\0dvips
+%\0latex\0l\fITAB\fC
+%\0latex\0letter.tex\0_
+%\0xdvi\0l\fITAB\fC
+%\0xdvi\0letter.dvi\0_
+.De
+Glob patterns can include qualifiers within parentheses.  To rmdir
+only directories and cd to directories and symbolic links pointing to
+them:
+.Ds
+%\0compctl\0-g\0'*(-/)'\0cd
+%\0compctl\0-g\0'*(/)'\0rmdir
+.De
+RCS users like to run commands on files which are not in the current
+directory, but in the RCS subdirectory where they all get \fC,v\fP
+suffixes.  They might like to use
+.Ds
+%\0compctl\0-g\0'RCS/*(:t:s/\e,v//)'\0co\0rlog\0rcs
+%\0ls\0RCS
+builtin.c,v\0\0lex.c,v\0\0\0\0\0\0zle_main.c,v
+%\0rlog\0bu\fITAB\fC
+%\0rlog\0builtin.c\0_
+.De
+The \fC:t\fP modifier keeps only the last part of the pathname and the
+\fC:s/\e,v//\fP will replace any \fC,v\fP by nothing.
+.PP
+The \fC-s\fP flag is similar to \fC-g\fP, but it uses all expansions,
+instead of just globbing, like brace expansion, parameter substitution
+and command substitution.
+.Ds
+%\0compctl\0-s\0'$(setopt)'\0unsetopt
+.De
+will only complete options which are actually set to be arguments to
+\fCunsetopt\fP.
+.PP
+Sometimes a command takes another command as its argument.  You can
+tell \fBzsh\fP to complete commands as the first argument to such a
+command and then use the completion method of the second command.  The
+\fC-l\fP flag with a null-string argument is used for this.
+.Ds
+%\0compctl\0-l\0''\0nohup\0exec
+%\0nohup\0comp\fITAB\fC
+%\0nohup\0compress\0_
+%\0nohup\0compress\0fil\fITAB\fC
+%\0nohup\0compress\0filename\0_
+.De
+Sometimes you would like to run really complicated commands to find
+out what the possible completions are.  To do this, you can specify a
+shell function to be called that will assign the possible completions
+to a variable called reply.  Note that this variable must be an array.
+Here's another (much slower) way to get the completions for \fCco\fP
+and friends:
+.Ds
+%\0function\0getrcs\0{
+>\0reply=()
+>\0for\0i\0in\0RCS/*
+>\0\0\0do
+>\0\0\0reply=($reply[*]\0$(basename\0$i\0,v))
+>\0\0\0done
+>\0}
+%\0compctl\0-K\0getrcs\0co\0rlog\0rcs
+.De
+Some command arguments use a prefix that is not a part of the things
+to complete.  The kill builtin command takes a signal name after a
+\fC-\fP.  To make such a prefix be ignored in the completion process,
+you can use the \fC-P\fP flag.
+.Ds
+%\0compctl\0-P\0-\0-k\0signals\0kill
+%\0kill\0-H\fITAB\fP
+%\0kill\0-HUP\0_
+.De
+TeX is usually run on files ending in \fC.tex\fP, but also sometimes
+on other files.  It is somewhat annoying to specify that the arguments
+of TeX should end in \fC.tex\fP and then not be able to complete these
+other files.  Therefore you can specify things like \*QComplete to
+files ending in \fC.tex\fP if available, otherwise complete to any
+filename.\*U.  This is done with \fIxor\fPed completion:
+.Ds
+%\0compctl\0-g\0'*.tex'\0+\0-f\0tex
+.De
+The \fC+\fP tells the editor to only take the next thing into account
+if the current one doesn't generate any matches.  If you have not
+changed the default completion, the above example is in fact
+equivalent to
+.Ds
+%\0compctl\0-g\0'*.tex'\0+\0tex
+.De
+as a lone \fC+\fP at the end is equivalent to specifying the default
+completion after the \fC+\fP.  This form of completion is also
+frequently used if you want to run some command only on a certain type
+of files, but not necessarily in the current directory.  In this case
+you will want to complete both files of this type and directories.
+Depending on your preferences you can use either of
+.Ds
+%\0compctl\0-g\0'*.ps'\0+\0-g\0'*(-/)'\0ghostview
+%\0compctl\0-g\0'*.ps\0*(-/)'\0ghostview
+.De
+where the first one will only complete directories (and symbolic links
+pointing to directories) if no postscript file matches the already
+typed part of the argument.
+.Sh "Extended completion"
+.PP
+If you play with completion, you will soon notice that you would like
+to specify what to complete, depending on what flags you give to the
+command and where you are on the command line.  For example, a command
+could take any filename argument after a \fC-f\fP flag, a username
+after a \fC-u\fP flag and an executable after a \fC-x\fP flag.  This
+section will introduce you to the ways to specify these things.  To
+many people it seems rather difficult at first, but taking the trouble
+to understand it can save you lots of typing in the end.  Even I keep
+being surprised when \fBzsh\fP manages to complete a small or even
+empty prefix to the right file in a large directory.
+.PP
+To tell \fBzsh\fP about these kinds of completion, you use \*Qextended
+completion\*U by specifying the \fC-x\fP flag to compctl.  The
+\fC-x\fP flag takes a list of patterns/flags pairs.  The patterns
+specify when to complete and the flags specify what.  The flags are
+simply those mentioned above, like \fC-f\fP or \fC-g \fIglob
+pattern\fR.
+.PP
+As an example, the \fCr[\fIstring1\fC,\fIstring2\fC]\fR pattern
+matches if the cursor is after something that starts with
+\fIstring1\fP and before something that starts with \fIstring2\fP.
+The \fIstring2\fP is often something that you do not want to match
+anything at all.
+.Ds
+%\0ls
+foo1\0\0\0bar1\0\0\0foo.Z\0\0bar.Z
+%\0compctl\0-g\0'^*.Z'\0-x\0'r[-d,---]'\0-g\0'*.Z'\0--\0compress
+%\0compress\0f\fITAB\fP
+%\0compress\0foo1\0_
+%\0compress\0-d\0f\fITAB\fP
+%\0compress\0-d\0foo.Z\0_
+.De
+In the above example, if the cursor is after the \fC-d\fP the pattern
+will match and therefore \fBzsh\fP uses the \fC-g *.Z\fP flag that will only
+complete files ending in \fC.Z\fP.  Otherwise, if no pattern matches,
+it will use the flags before the \fC-x\fP and in this case complete
+every file that does not end in \fC.Z\fP.
+.PP
+The \fCs[\fIstring\fC]\fR pattern matches if the current word starts
+with \fIstring\fP.  The \fIstring\fP itself is not considered to be
+part of the completion.
+.Ds
+%\0compctl\0-x\0's[-]'\0-k\0signals\0--\0kill
+%\0kill\0-H\fITAB\fP
+%\0kill\0-HUP\0_
+.De
+The \fCtar\fP command takes a tar file as an argument after the
+\fC-f\fP option.  The \fCc[\fIoffset\fC,\fIstring\fC]\fR pattern
+matches if the word in position \fIoffset\fP relative to the current
+word is \fIstring\fP.  More in particular, if \fIoffset\fP is -1, it
+matches if the previous word is \fIstring\fP.  This suggests
+.Ds
+%\0compctl\0-f\0-x\0'c[-1,-f]'\0-g\0'*.tar'\0--\0tar
+.De
+But this is not enough.  The \fC-f\fP option could be the last of a
+longer string of options.  \fCC[\fR...\fC,\fR...\fC]\fR is just like
+\fCc[\fR...\fC,\fR...\fC]\fR, except that it uses glob-like pattern
+matching for \fIstring\fP.  So
+.Ds
+%\0compctl\0-f\0-x\0'C[-1,-*f]'\0-g\0'*.tar'\0--\0tar
+.De
+will complete tar files after any option string ending in an \fCf\fP.
+But we'd like even more.  Old versions of tar used all options as the
+first argument, but without the minus sign.  This might be
+inconsistent with option usage in all other commands, but it is still
+supported by newer versions of \fCtar\fP.  So we would also like to
+complete tar files if the first argument ends in an \fCf\fP and we're
+right behind it.
+.PP
+We can `and' patterns by putting them next to each other with a space
+between them.  We can `or' these sets by putting comma's between them.
+We will also need some new patterns.  \fCp[\fInum\fC]\fR will match if
+the current argument (the one to be completed) is the \fInum\fPth
+argument.  \fCW[\fIindex\fC,\fIpattern\fC]\fR will match if the
+argument in place \fIindex\fP matches the \fIpattern\fP.  This gives
+us
+.Ds
+%\0compctl\0-f\0-x\0'C[-1,-*f]\0,\0W[1,*f]\0p[2]'\0-g\0'*.tar'\0--\0tar
+.De
+In words: If the previous argument is an option string that ends in an
+\fCf\fP, or the first argument ended in an \fCf\fP and it is now the
+second argument, then complete only filenames ending in \fC.tar\fP.
+.PP
+All the above examples used only one set of patterns with one
+completion flag.  You can use several of these pattern/flag pairs
+separated by a \fC-\fP.  The first matching pattern will be used.
+Suppose you have a version of \fCtar\fP that supports compressed files
+by using a \fC-Z\fP option.  Leaving the old tar syntax aside for a
+moment, we would like to complete files ending in \fC.tar.Z\fP if a
+\fC-Z\fP option has been used and files ending in \fC.tar\fP
+otherwise, all this only after a \fC-f\fP flag.  Again, the \fC-Z\fP
+can be alone or it can be part of a longer option string, perhaps the
+same as that of the \fC-f\fP flag.  Here's how to do it; note the
+backslash and the secondary prompt which are not part of the
+\fCcompctl\fP command.
+.Ds
+%\0compctl\0-f\0-x\0'C[-1,-*Z*f]\0,\0R[-*Z*,---]\0C[-1,-*f]'\0-g\0'*.tar.Z'\0-\0\e
+>\0'C[-1,-*f]'\0-g\0'*.tar'\0--\0tar
+.De
+The first pattern set tells us to match if either the previous
+argument was an option string including a \fCZ\fP and ending in an
+\fCf\fP or there was an option string with a \fCZ\fP somewhere and the
+previous word was any option string ending in an \fCf\fP.  If this is
+the case, we need a compressed tar file.  Only if this is not the case
+the second pattern set will be considered.  By the way,
+\fCR[\fIpattern1\fC,\fIpattern2\fC]\fR is just like
+\fCr[\fR...\fC,\fR...\fC]\fR except that it uses pattern matching with
+shell metacharacters instead of just strings.
+.PP
+You will have noticed the \fC--\fP before the command name.  This ends
+the list of pattern/flag pairs of \fC-x\fP.  It is usually used just
+before the command name, but you can also use an extended completion
+as one part of a list of xored completions, in which case the \fC--\fP
+appears just before one of the \fC+\fP signs.
+.PP
+Note the difference between using extended completion as part of a
+list of xored completions as in
+.Ds
+%\0ls
+foo\0\0bar
+%\0compctl\0-x\0'r[-d,---]'\0-g\0'*.Z'\0--\0+\0-g\0'^*.Z'\0compress
+%\0compress\0-d\0f\fITAB\fP
+%\0compress\0-d\0foo\0_
+.De
+and specifying something before the \fC-x\fP as in
+.Ds
+%\0compctl\0-g\0'^*.Z'\0-x\0'r[-d,---]'\0-g\0'*.Z'\0--\0compress
+%\0compress\0-d\0f\fITAB\fP
+%\0compress\0-d\0f_
+.De
+In the first case, the alternative glob pattern (\fC^*.Z\fP) will be
+used if the first part does not generate any possible completions,
+while in the second case the alternative glob pattern will only be
+used if the \fCr[\fR...\fC]\fR pattern doesn't match.
+.Sh "Bindings"
+.PP
+Each of the editor commands we have seen was actually a function bound
+by default to a certain key.  The real names of the commands are:
+.Ds
+\fCexpand-or-complete\0\0\0\fITAB\fR
+\fCpush-line\0\0\0\0\0\0\0\0\0\0\0\0\fIESC-Q\fR
+\fCrun-help\0\0\0\0\0\0\0\0\0\0\0\0\0\fIESC-H\fR
+\fCaccept-and-hold\0\0\0\0\0\0\fIESC-A\fR
+\fCquote-line\0\0\0\0\0\0\0\0\0\0\0\fIESC-'\fR
+.De
+These bindings are arbitrary; you could change them if you want.
+For example, to bind \fCaccept-line\fP to \fI^Z\fP:
+.Ds
+%\0bindkey\0'^Z'\0accept-line
+.De
+Another idea would be to bind the delete key to \fCdelete-char\fP;
+this might be convenient if you use \fI^H\fP for backspace.
+.Ds
+%\0bindkey\0'^?'\0delete-char
+.De
+Or, you could bind \fI^X\fP\fI^H\fP to \fCrun-help\fP:
+.Ds
+%\0bindkey\0'^X^H'\0run-help
+.De
+Other examples:
+.Ds
+%\0bindkey\0'^X^Z'\0universal-argument
+%\0bindkey\0'\0'\0magic-space
+%\0bindkey\0-s\0'^T'\0'uptime
+>\0'
+%\0bindkey\0'^Q'\0push-line-or-edit
+.De
+\fCuniversal-argument\fP multiplies the next command by 4.
+Thus \fI^X\fP\fI^Z\fP\fI^W\fP might delete the last four words on the line.
+If you bind space to \fCmagic-space\fP, then csh-style history
+expansion is done on the line whenever you press the space bar.
+.PP
+Something that often happens is that I am typing a multiline command
+and discover an error in one of the previous lines.  In this case,
+\fCpush-line-or-edit\fP will put the entire multiline construct into
+the editor buffer.  If there is only a single line, it is equivalent
+to \fCpush-line\fP.
+.PP
+The \fC-s\fP flag to \fCbindkey\fP specifies that you are binding the key
+to a string, not a command.  Thus \fCbindkey -s '^T' 'uptime\en'\fP
+lets you VMS lovers get the load average whenever you press \fI^T\fP.
+.PP
+If you have a NeXT keyboard, the one with the \fC|\fP and \fC\e\fP keys
+very inconveniently placed, the following
+bindings may come in handy:
+.Ds
+%\0bindkey\0-s\0'\ee/'\0'\e\e'
+%\0bindkey\0-s\0'\ee='\0'|'
+.De
+Now you can type \fIALT-/\fP to get a backslash, and \fIALT-=\fP to
+get a vertical bar.  This only works inside \fBzsh\fP, of course;
+\fCbindkey\fP has no effect on the key mappings inside \fCtalk\fP
+or \fCmail\fP, etc.
+.PP
+Some people like to bind \fC^S\fP and \fC^Q\fP to editor commands.
+Just binding these has no effect, as the terminal will catch them and
+use them for flow control.  You could unset them as stop and start
+characters, but most people like to use these for external commands.
+The solution is to set the \fINOFLOWCONTROL\fP option.  This will
+allow you to bind the start and stop characters to editor commands,
+while retaining their normal use for external commands.
+.Sh "Parameter Substitution"
+.PP
+In \fBzsh\fP, parameters are set like this:
+.Ds
+%\0foo=bar
+%\0echo\0$foo
+bar
+.De
+Spaces before or after the \fC=\fP are frowned upon:
+.Ds
+%\0foo\0=\0bar
+zsh:\0command\0not\0found:\0foo
+.De
+Also, \fCset\fP doesn't work for setting parameters:
+.Ds
+%\0set\0foo=bar
+%\0set\0foo\0=\0bar
+%\0echo\0$foo
+
+%
+.De
+Note that no error message was printed.  This is because both
+of these commands were perfectly valid; the \fCset\fP builtin
+assigns its arguments to the \fIpositional parameters\fP
+(\fC$1\fP, \fC$2\fP, etc.).
+.Ds
+%\0set\0foo=bar
+%\0echo\0$1
+foo=bar
+%\0set\0foo\0=\0bar
+%\0echo\0$3\0$2
+bar\0=
+.De
+If you're really intent on using the csh syntax, define a
+function like this:
+.Ds
+%\0set\0()\0{
+>\0\0\0\0eval\0"$1$2$3"
+>\0}
+%\0set\0foo\0=\0bar
+%\0set\0fuu=brrr
+%\0echo\0$foo\0$fuu
+bar\0brrr
+.De
+But then, of course you can't use the form of \fCset\fP with
+options, like \fCset -F\fP (which turns off filename generation).
+Also, the \fCset\fP command by itself won't list all the parameters
+like it should.
+To get around that you need a \fCcase\fP statement:
+.Ds
+%\0set\0()\0{
+>\0\0\0\0case\0$1\0in
+>\0\0\0\0-*|+*|'')\0builtin\0set\0$*\0;;
+>\0\0\0\0*)\0eval\0"$1$2$3"\0;;
+>\0\0\0\0esac
+>\0}
+.De
+For the most part, this should make csh users happy.
+.PP
+The following sh-style operators are supported in \fBzsh\fP:
+.Ds
+%\0unset\0null
+%\0echo\0${foo-xxx}
+bar
+%\0echo\0${null-xxx}
+xxx
+%\0unset\0null
+%\0echo\0${null=xxx}
+xxx
+%\0echo\0$null
+xxx
+%\0echo\0${foo=xxx}
+bar
+%\0echo\0$foo
+bar
+%\0unset\0null
+%\0echo\0${null+set}
+
+%\0echo\0${foo+set}
+set
+.De
+Also, csh-style \fC:\fP modifiers may be appended to a parameter
+substitution.
+.Ds
+%\0echo\0$PWD
+/home/learning/pf/zsh/zsh2.00/src
+%\0echo\0$PWD:h
+/home/learning/pf/zsh/zsh2.00
+%\0echo\0$PWD:h:h
+/home/learning/pf/zsh
+%\0echo\0$PWD:t
+src
+%\0name=foo.c
+%\0echo\0$name
+foo.c
+%\0echo\0$name:r
+foo
+%\0echo\0$name:e
+c
+.De
+The equivalent constructs in ksh (which are also supported in \fBzsh\fP)
+are a bit more general and easier to remember.
+When the shell expands \fC${foo#\fR\fIpat\fR\fC}\fR,
+it checks to see if \fIpat\fP matches a substring at the beginning
+of the value
+of \fCfoo\fP.  If so, it removes that portion of \fCfoo\fP, using the shortest
+possible match.
+With \fC${foo##\fR\fIpat\fR\fC}\fR, the longest possible match is removed.
+\fC${foo%\fR\fIpat\fR\fC}\fR and \fC${foo%%\fR\fIpat\fR\fC}\fR remove the match
+from the end.
+Here are the ksh equivalents of the \fC:\fP modifiers:
+.Ds
+%\0echo\0${PWD%/*}
+/home/learning/pf/zsh/zsh2.00
+%\0echo\0${PWD%/*/*}
+/home/learning/pf/zsh
+%\0echo\0${PWD##*/}
+src
+%\0echo\0${name%.*}
+foo
+%\0echo\0${name#*.}
+c
+.De
+\fBzsh\fP also has upper/lowercase modifiers:
+.Ds
+%\0xx=Test
+%\0echo\0$xx:u
+TEST
+%\0echo\0$xx:l
+test
+.De
+and a substitution modifier:
+.Ds
+%\0echo\0$name:s/foo/bar/
+bar.c
+%\0ls
+foo.c\0\0\0\0foo.h\0\0\0\0foo.o\0\0\0\0foo.pro
+%\0for\0i\0in\0foo.*;\0mv\0$i\0$i:s/foo/bar/
+%\0ls
+bar.c\0\0\0\0bar.h\0\0\0\0bar.o\0\0\0\0bar.pro
+.De
+There is yet another syntax to modify substituted parameters.  You can
+add certain modifiers in parentheses after the opening brace like:
+.Ds
+${(\fImodifiers\fC)\fIparameter\fC}
+.De
+For example, \fCo\fP sorts the words resulting from the expansion:
+.Ds
+%\0echo\0${path}
+/usr/bin\0/usr/bin/X11\0/etc
+%\0echo\0${(o)path}
+/etc\0/usr/bin\0/usr/bin/X11
+.De
+One possible source of confusion is the fact that in \fBzsh\fP,
+the result of parameter substitution is \fInot\fP split into
+words.  Thus, this will not work:
+.Ds
+%\0srcs='glob.c\0exec.c\0init.c'
+%\0ls\0$srcs
+glob.c\0exec.c\0init.c\0not\0found
+.De
+This is considered a feature, not a bug.
+If splitting were done by default, as it is in most other shells,
+functions like this would not work properly:
+.Ds
+$\0ll\0()\0{\0ls\0-F\0$*\0}
+$\0ll\0'fuu\0bar'
+fuu\0not\0found
+bar\0not\0found
+
+%\0ll\0'fuu\0bar'
+fuu\0bar\0not\0found
+.De
+Of course, a hackish workaround is available in sh (and \fBzsh\fP):
+.Ds
+%\0setopt\0shwordsplit
+%\0ll\0()\0{\0ls\0-F\0"$@"\0}
+%\0ll\0'fuu\0bar'
+fuu\0bar\0not\0found
+.De
+If you like the sh behaviour, \fBzsh\fP can accomodate you:
+.Ds
+%\0ls\0${=srcs}
+exec.c\0\0glob.c\0\0init.c
+%\0setopt\0shwordsplit
+%\0ls\0$srcs
+exec.c\0\0glob.c\0\0init.c
+.De
+Another way to get the \fC$srcs\fP trick to work is to use an array:
+.Ds
+%\0unset\0srcs
+%\0srcs=(\0glob.c\0exec.c\0init.c\0)\0\0
+%\0ls\0$srcs
+exec.c\0\0glob.c\0\0init.c
+.De
+or an alias:
+.Ds
+%\0alias\0-g\0SRCS='exec.c\0glob.c\0init.c'
+%\0ls\0SRCS
+exec.c\0\0glob.c\0\0init.c
+.De
+Another option that modifies parameter expansion is
+\fIRCEXPANDPARAM\fP:
+.Ds
+%\0echo\0foo/$srcs
+foo/glob.c\0exec.c\0init.c
+%\0setopt\0rcexpandparam
+%\0echo\0foo/$srcs
+foo/glob.c\0foo/exec.c\0foo/init.c
+%\0echo\0foo/${^srcs}
+foo/glob.c\0foo/exec.c\0foo/init.c
+%\0echo\0foo/$^srcs
+foo/glob.c\0foo/exec.c\0foo/init.c
+.De
+.Sh "Shell Parameters"
+.PP
+The shell has many predefined parameters that may be
+accessed.  Here are some examples:
+.Ds
+%\0sleep\010\0&
+[1]\03820
+%\0echo\0$!
+3820
+%\0set\0a\0b\0c
+%\0echo\0$#
+3
+%\0echo\0$ARGC
+3
+%\0(\0exit\020\0)\0;\0echo\0$?
+20
+%\0false;\0echo\0$status
+1
+.De
+(\fC$?\fP and \fC$status\fP are equivalent.)
+.Ds
+%\0echo\0$HOST\0$HOSTTYPE
+dendrite\0sun4
+%\0echo\0$UID\0$GID
+701\060
+%\0cd\0/tmp
+%\0cd\0/home
+%\0echo\0$PWD\0$OLDPWD
+/home\0/tmp
+%\0ls\0$OLDPWD/.getwd\0
+/tmp/.getwd
+.De
+\fC~+\fP and \fC~-\fP are short for \fC$PWD\fP and \fC$OLDPWD\fP, respectively.
+.Ds
+%\0ls\0~-/.getwd
+/tmp/.getwd
+%\0ls\0-d\0~+/learning
+/home/learning
+%\0echo\0$RANDOM
+4880
+%\0echo\0$RANDOM
+11785
+%\0echo\0$RANDOM
+2062
+%\0echo\0$TTY
+/dev/ttyp4
+%\0echo\0$VERSION
+zsh\0v2.00.03
+%\0echo\0$USERNAME
+pf
+.De
+.PP
+The \fCcdpath\fP variable sets the search path for the \fCcd\fP command.
+If you do not specify \fC.\fP somewhere in the path, it is assumed to
+be the first component.
+.Ds
+%\0cdpath=(\0/usr\0~\0~/zsh\0)
+%\0ls\0/usr
+5bin\0\0\0\0\0\0\0\0\0dict\0\0\0\0\0\0\0\0\0lang\0\0\0\0\0\0\0\0\0net\0\0\0\0\0\0\0\0\0\0sccs\0\0\0\0\0\0\0\0\0sys
+5include\0\0\0\0\0etc\0\0\0\0\0\0\0\0\0\0lector\0\0\0\0\0\0\0nserve\0\0\0\0\0\0\0services\0\0\0\0\0tmp
+5lib\0\0\0\0\0\0\0\0\0export\0\0\0\0\0\0\0lib\0\0\0\0\0\0\0\0\0\0oed\0\0\0\0\0\0\0\0\0\0share\0\0\0\0\0\0\0\0ucb
+adm\0\0\0\0\0\0\0\0\0\0games\0\0\0\0\0\0\0\0local\0\0\0\0\0\0\0\0old\0\0\0\0\0\0\0\0\0\0skel\0\0\0\0\0\0\0\0\0ucbinclude
+bin\0\0\0\0\0\0\0\0\0\0geac\0\0\0\0\0\0\0\0\0lost+found\0\0\0openwin\0\0\0\0\0\0spool\0\0\0\0\0\0\0\0ucblib
+boot\0\0\0\0\0\0\0\0\0hosts\0\0\0\0\0\0\0\0macsyma_417\0\0pat\0\0\0\0\0\0\0\0\0\0src\0\0\0\0\0\0\0\0\0\0xpg2bin
+demo\0\0\0\0\0\0\0\0\0include\0\0\0\0\0\0man\0\0\0\0\0\0\0\0\0\0princeton\0\0\0\0stand\0\0\0\0\0\0\0\0xpg2include
+diag\0\0\0\0\0\0\0\0\0kvm\0\0\0\0\0\0\0\0\0\0mdec\0\0\0\0\0\0\0\0\0pub\0\0\0\0\0\0\0\0\0\0swap\0\0\0\0\0\0\0\0\0xpg2lib
+%\0cd\0spool
+/usr/spool
+%\0cd\0bin
+/usr/bin
+%\0cd\0func
+~/func
+%\0cd\0
+%\0cd\0pub
+%\0pwd
+/u/pfalstad/pub
+%\0ls\0-d\0/usr/pub
+/usr/pub
+.De
+\fBPATH\fP and \fBpath\fP both set the search path for commands.
+These two variables are equivalent, except that one is a string
+and one is an array.  If the user modifies \fBPATH\fP, the shell
+changes \fBpath\fP as well, and vice versa.
+.Ds
+%\0PATH=/bin:/usr/bin:/tmp:.
+%\0echo\0$path
+/bin\0/usr/bin\0/tmp\0.
+%\0path=(\0/usr/bin\0.\0/usr/local/bin\0/usr/ucb\0)
+%\0echo\0$PATH
+/usr/bin:.:/usr/local/bin:/usr/ucb
+.De
+The same is true of \fBCDPATH\fP and \fBcdpath\fP:
+.Ds
+%\0echo\0$CDPATH
+/usr:/u/pfalstad:/u/pfalstad/zsh
+%\0CDPATH=/u/subbarao:/usr/src:/tmp
+%\0echo\0$cdpath
+/u/subbarao\0/usr/src\0/tmp
+.De
+In general, predefined parameters with names in all lowercase are
+arrays; assignments to them take the form:
+.Ds
+\fIname\fR\fC=(\fR\0\fIelem\fR\0...\\0\fC)\fR
+.De
+Predefined parameters with names in all uppercase are strings.  If
+there is both an array and a string version of the same parameter, the
+string version is a colon-separated list, like \fBPATH\fP.
+.PP
+\fBHISTFILE\fP is the name of the history file, where the history
+is saved when a shell exits.
+.Ds
+%\0zsh
+phoenix%\0HISTFILE=/tmp/history
+phoenix%\0SAVEHIST=20
+phoenix%\0echo\0foo
+foo
+phoenix%\0date
+Fri\0May\024\005:39:35\0EDT\01991
+phoenix%\0uptime
+\0\05:39am\0\0up\04\0days,\020:02,\0\040\0users,\0\0load\0average:\02.30,\02.20,\02.00
+phoenix%\0exit
+%\0cat\0/tmp/history
+HISTFILE=/tmp/history
+SAVEHIST=20
+echo\0foo
+date
+uptime
+exit
+%\0HISTSIZE=3
+%\0history
+\0\0\028\0\0rm\0/tmp/history
+\0\0\029\0\0HISTSIZE=3
+\0\0\030\0\0history
+.De
+If you have several incantations of \fBzsh\fP running at the same
+time, like when using the X window system, it might be preferable to
+append the history of each shell to a file when a shell exits instead
+of overwriting the old contents of the file.  You can get this
+behaviour by setting the \fIAPPENDHISTORY\fP option.
+.PP
+In \fBzsh\fP, if you say
+.Ds
+%\0>file
+.De
+the command \fCcat\fP is normally assumed:
+.Ds
+%\0>file
+foo!\0\0\0\0
+^D
+%\0cat\0file
+foo!
+.De
+Thus, you can view a file simply by typing:
+.Ds
+%\0<file
+foo!
+.De
+However, this is not csh or sh compatible.  To correct this,
+change the value of the parameter \fBNULLCMD\fP,
+which is \fCcat\fP by default.
+.Ds
+%\0NULLCMD=:
+%\0>file
+%\0ls\0-l\0file
+-rw-r--r--\0\01\0pfalstad\0\0\0\0\0\0\0\00\0May\024\005:41\0file
+.De
+If \fCNULLCMD\fP is unset, the shell reports an error if no
+command is specified (like csh).
+.Ds
+%\0unset\0NULLCMD
+%\0>file
+zsh:\0redirection\0with\0no\0command
+.De
+Actually, \fBREADNULLCMD\fP is used whenever you have a null command
+reading input from a single file.  Thus, you can set \fBREADNULLCMD\fP
+to \fCmore\fP or \fCless\fP rather than \fCcat\fP.  Also, if you
+set \fBNULLCMD\fP to \fC:\fP for sh compatibility, you can still read
+files with \fC< file\fP if you leave \fBREADNULLCMD\fP set to \fCmore\fP.
+.Sh "Prompting"
+.PP
+The default prompt for \fBzsh\fP is:
+.Ds
+phoenix%\0echo\0$PROMPT
+%m%#\0
+.De
+The \fC%m\fP stands for the short form of the current hostname,
+and the \fC%#\fP stands for a \fC%\fP or a \fC#\fP, depending on whether
+the shell is running as root or not.
+\fBzsh\fP supports many other control sequences
+in the \fBPROMPT\fP variable.
+.Ds
+%\0PROMPT='%/>\0'
+/u/pfalstad/etc/TeX/zsh>
+
+%\0PROMPT='%~>\0'\0\0\0
+~/etc/TeX/zsh>\0
+
+%\0PROMPT='%h\0%~>\0'
+6\0~/etc/TeX/zsh>\0
+.De
+\fC%h\fP\0represents\0the\0number\0of\0current\0history\0event.
+.Ds
+%\0PROMPT='%h\0%~\0%M>\0'
+10\0~/etc/TeX/zsh\0apple-gunkies.gnu.ai.mit.edu>\0
+
+%\0PROMPT='%h\0%~\0%m>\0'
+11\0~/etc/TeX/zsh\0apple-gunkies>\0
+
+%\0PROMPT='%h\0%t>\0'
+12\06:11am>\0
+
+%\0PROMPT='%n\0%w\0tty%l>'
+pfalstad\0Fri\024\0ttyp0>
+.De
+\fBPROMPT2\fP is used in multiline commands, like for-loops.  The
+\fC%_\fP escape sequence was made especially for this prompt.  It is
+replaced by the kind of command that is being entered.
+.Ds
+%\0PROMPT2='%_>\0'
+%\0for\0i\0in\0foo\0bar
+for>
+
+%\0echo\0'hi
+quote>
+.De
+Also available is the \fBRPROMPT\fP parameter.
+If this is set, the shell puts a prompt on the \fIright\fP side
+of the screen.
+.Ds
+%\0RPROMPT='%t'
+%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\06:14am
+
+%\0RPROMPT='%~'
+%\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0~/etc/TeX/zsh
+
+%\0PROMPT='%l\0%T\0%m[%h]\0'\0RPROMPT='\0%~'
+p0\06:15\0phoenix[5]\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0~/etc/TeX/zsh
+.De
+These special escape sequences can also be used with the
+\fC-P\fP option to \fCprint\fP:
+.Ds
+%\0print\0-P\0%h\0tty%l
+15\0ttyp1
+.De
+.PP
+The \fBPOSTEDIT\fP parameter is printed whenever the editor exits.
+This can be useful for termcap tricks.  To highlight the prompt
+and command line while leaving command output unhighlighted, try this:
+.Ds
+%\0POSTEDIT=`echotc\0se`
+%\0PROMPT='%S%%\0'
+.De
+.Sh "Login/logout watching"
+.PP
+You can specify login or logout events to monitor
+by setting the \fBwatch\fP variable.
+Normally, this is done by specifying a list of usernames.
+.Ds
+%\0watch=(\0pfalstad\0subbarao\0sukthnkr\0egsirer\0)
+.De
+The \fClog\fP command reports all people logged in
+that you are watching for.
+.Ds
+%\0log
+pfalstad\0has\0logged\0on\0p0\0from\0mickey.
+pfalstad\0has\0logged\0on\0p5\0from\0mickey.
+%\0\fR...\fC
+subbarao\0has\0logged\0on\0p8\0from\0phoenix.
+%\0\fR...\fC
+subbarao\0has\0logged\0off\0p8\0from\0phoenix.
+%\0\fR...\fC
+sukthnkr\0has\0logged\0on\0p8\0from\0dew.
+%\0\fR...\fC
+sukthnkr\0has\0logged\0off\0p8\0from\0dew.
+.De
+If you specify hostnames with an \fC@\fP prepended,
+the shell will watch for all users logging in from
+the specified host.
+.Ds
+%\0watch=(\0@mickey\0@phoenix\0)
+%\0log
+djthongs\0has\0logged\0on\0q2\0from\0phoenix.
+pfalstad\0has\0logged\0on\0p0\0from\0mickey.
+pfalstad\0has\0logged\0on\0p5\0from\0mickey.
+.De
+If you give a tty name with a \fC%\fP prepended, the shell
+will watch for all users logging in on that tty.
+.Ds
+%\0watch=(\0%ttyp0\0%console\0)
+%\0log
+root\0has\0logged\0on\0console\0from\0.
+pfalstad\0has\0logged\0on\0p0\0from\0mickey.
+.De
+The format of the reports may also be changed.
+.Ds
+%\0watch=(\0pfalstad\0gettes\0eps\0djthongs\0jcorr\0bdavis\0)
+%\0log
+jcorr\0has\0logged\0on\0tf\0from\0128.112.176.3:0.
+jcorr\0has\0logged\0on\0r0\0from\0128.112.176.3:0.
+gettes\0has\0logged\0on\0p4\0from\0yo:0.0.
+djthongs\0has\0logged\0on\0pe\0from\0grumpy:0.0.
+djthongs\0has\0logged\0on\0q2\0from\0phoenix.
+bdavis\0has\0logged\0on\0qd\0from\0BRUNO.
+eps\0has\0logged\0on\0p3\0from\0csx30:0.0.
+pfalstad\0has\0logged\0on\0p0\0from\0mickey.
+pfalstad\0has\0logged\0on\0p5\0from\0mickey.
+%\0WATCHFMT='%n\0on\0tty%l\0from\0%M'
+%\0log
+jcorr\0on\0ttytf\0from\0128.112.176.3:0.
+jcorr\0on\0ttyr0\0from\0128.112.176.3:0.
+gettes\0on\0ttyp4\0from\0yo:0.0
+djthongs\0on\0ttype\0from\0grumpy:0.0
+djthongs\0on\0ttyq2\0from\0phoenix.Princeto
+bdavis\0on\0ttyqd\0from\0BRUNO.pppl.gov
+eps\0on\0ttyp3\0from\0csx30:0.0
+pfalstad\0on\0ttyp0\0from\0mickey.Princeton
+pfalstad\0on\0ttyp5\0from\0mickey.Princeton
+%\0WATCHFMT='%n\0fm\0%m'
+%\0log
+jcorr\0fm\0128.112.176.3:0
+jcorr\0fm\0128.112.176.3:0
+gettes\0fm\0yo:0.0
+djthongs\0fm\0grumpy:0.0
+djthongs\0fm\0phoenix
+bdavis\0fm\0BRUNO
+eps\0fm\0csx30:0.0
+pfalstad\0fm\0mickey
+pfalstad\0fm\0mickey
+%\0WATCHFMT='%n\0%a\0at\0%t\0%w.'
+%\0log
+jcorr\0logged\0on\0at\03:15pm\0Mon\020.
+jcorr\0logged\0on\0at\03:16pm\0Wed\022.
+gettes\0logged\0on\0at\06:54pm\0Wed\022.
+djthongs\0logged\0on\0at\07:19am\0Thu\023.
+djthongs\0logged\0on\0at\07:20am\0Thu\023.
+bdavis\0logged\0on\0at\012:40pm\0Thu\023.
+eps\0logged\0on\0at\04:19pm\0Thu\023.
+pfalstad\0logged\0on\0at\03:39am\0Fri\024.
+pfalstad\0logged\0on\0at\03:42am\0Fri\024.
+.De
+If you have a \fC.friends\fP file in your home directory,
+a convenient way to make \fBzsh\fP watch for all your friends
+is to do this:
+.Ds
+%\0watch=(\0$(<\0~/.friends)\0)
+%\0echo\0$watch
+subbarao\0maruchck\0root\0sukthnkr\0\fR...
+.De
+If watch is set to \fCall\fP, then all users logging in or out
+will be reported.
+.Sh "Options"
+.PP
+Some options have already been mentioned; here are a few more:
+.PP
+Using the \fIAUTOCD\fP option, you can simply type the name
+of a directory, and it will become the current directory.
+.Ds
+%\0cd\0/
+%\0setopt\0autocd
+%\0bin
+%\0pwd
+/bin
+%\0../etc
+%\0pwd
+/etc
+.De
+With \fICDABLEVARS\fP, if the argument to \fCcd\fP is the name of a
+parameter whose value is a valid directory, it will become
+the current directory.
+.Ds
+%\0setopt\0cdablevars
+%\0foo=/tmp
+%\0cd\0foo
+/tmp
+.De
+\fICORRECT\fP turns on spelling correction for commands,
+and the \fICORRECTALL\fP option turns on spelling correction
+for all arguments.
+.Ds
+%\0setopt\0correct
+%\0sl
+zsh:\0correct\0`sl'\0to\0`ls'\0[nyae]?\0y
+%\0setopt\0correctall
+%\0ls\0x.v11r4
+zsh:\0correct\0`x.v11r4'\0to\0`X.V11R4'\0[nyae]?\0n
+/usr/princton/src/x.v11r4\0not\0found
+%\0ls\0/etc/paswd
+zsh:\0correct\0to\0`/etc/paswd'\0to\0`/etc/passwd'\0[nyae]?\0y
+/etc/passwd
+.De
+If you press \fCy\fP
+when the shell asks you if you want to correct a word, it will
+be corrected.  If you press \fCn\fP, it will be left alone.
+Pressing \fCa\fP aborts the command, and pressing \fCe\fP brings the line
+up for editing again, in case you agree the word is spelled wrong
+but you don't like the correction.
+.PP
+Normally, a quoted expression may contain a newline:
+.Ds
+%\0echo\0'
+>\0foo
+>\0'
+
+foo
+
+%
+.De
+With \fICSHJUNKIEQUOTES\fP set, this is illegal, as it is
+in csh.
+.Ds
+%\0setopt\0cshjunkiequotes
+%\0ls\0'foo
+zsh:\0unmatched\0'
+.De
+\fIGLOBDOTS\fP lets files beginning with a \fC.\fP be matched without
+explicitly specifying the dot.
+.Ds
+%\0ls\0-d\0*x*
+Mailboxes
+%\0setopt\0globdots
+%\0ls\0-d\0*x*
+\&.exrc\0\0\0\0\0\0\0\0\0.pnewsexpert\0\0.xserverrc
+\&.mushexpert\0\0\0.xinitrc\0\0\0\0\0\0Mailboxes
+.De
+\fIHISTIGNOREDUPS\fP prevents the current line from being
+saved in the history if it is the same as the previous one;
+\fIHISTIGNORESPACE\fP prevents the current line from being
+saved if it begins with a space.
+.Ds
+%\0PROMPT='%h>\0'
+39>\0setopt\0histignoredups
+40>\0echo\0foo
+foo
+41>\0echo\0foo
+foo
+41>\0echo\0foo
+foo
+41>\0echo\0bar
+bar
+42>\0setopt\0histignorespace
+43>\0\0echo\0foo
+foo
+43>\0\0echo\0fubar
+fubar
+43>\0\0echo\0fubar
+fubar
+.De
+\fIIGNOREBRACES\fP turns off csh-style brace expansion.
+.Ds
+%\0echo\0x{y{z,a},{b,c}d}e
+xyze\0xyae\0xbde\0xcde
+%\0setopt\0ignorebraces
+%\0echo\0x{y{z,a},{b,c}d}e
+x{y{z,a},{b,c}d}e
+.De
+\fIIGNOREEOF\fP forces the user to type \fCexit\fP or \fClogout\fP,
+instead of just pressing \fI^D\fP.
+.Ds
+%\0setopt\0ignoreeof
+%\0^D
+zsh:\0use\0'exit'\0to\0exit.
+.De
+\fIINTERACTIVECOMMENTS\fP turns on interactive comments;
+comments begin with a \fC#\fP.
+.Ds
+%\0setopt\0interactivecomments
+%\0date\0#\0this\0is\0a\0comment
+Fri\0May\024\006:54:14\0EDT\01991
+.De
+\fINOBEEP\fP makes sure the shell never beeps.
+.PP
+\fINOCLOBBER\fP prevents you from accidentally
+overwriting an existing file.
+.Ds
+%\0setopt\0noclobber
+%\0cat\0/dev/null\0>~/.zshrc
+zsh:\0file\0exists:\0/u/pfalstad/.zshrc
+.De
+If you really do want to clobber a file, you can use the
+\fC>!\fP operator.
+To make things easier in this case, the \fC>\fP is stored in
+the history list as a \fC>!\fP:
+.Ds
+%\0cat\0/dev/null\0>!\0~/.zshrc
+%\0cat\0/etc/motd\0>\0~/.zshrc
+zsh:\0file\0exists:\0/u/pfalstad/.zshrc
+%\0!!
+cat\0/etc/motd\0>!\0~/.zshrc
+%\0\fR...
+.De
+\fIRCQUOTES\fP lets you use a more elegant method for including
+single quotes in a singly quoted string:
+.Ds
+%\0echo\0'"don'\e''t\0do\0that."'
+"don't\0do\0that."
+%\0echo\0'"don''t\0do\0that."'
+"dont\0do\0that."
+%\0setopt\0rcquotes
+%\0echo\0'"don''t\0do\0that."'
+"don't\0do\0that."
+.De
+Finally,
+\fISUNKEYBOARDHACK\fP wins the award for the strangest option.
+If a line ends with \fC`\fP, and there are an odd number of them
+on the line, the shell will ignore the trailing \fC`\fP.  This
+is provided for keyboards whose RETURN key is too small,
+and too close to the \fC`\fP key.
+.Ds
+%\0setopt\0sunkeyboardhack
+%\0date`
+Fri\0May\024\006:55:38\0EDT\01991
+.De
+.Sh "Closing Comments"
+.PP
+I (Bas de Bakker) would be happy to receive mail if anyone has any
+tricks or ideas to add to this document, or if there are some points
+that could be made clearer or covered more thoroughly.  Please notify
+me of any errors in this document.
+.if o \{\
+.bp
+.sv 1i
+.\}
+.pn 1
+.bp
+.PX
diff --git a/Doc/zmacros.yo b/Doc/zmacros.yo
new file mode 100644
index 000000000..c6df3d551
--- /dev/null
+++ b/Doc/zmacros.yo
@@ -0,0 +1,32 @@
+STARTDEF()
+
+DEFINEMACRO(includefile)(1)(\
+  TYPEOUT(Including file ARG1)\
+  comment(Yodl file: ARG1)NL()\
+  INCLUDEFILE(ARG1)\
+)
+
+DEFINEMACRO(def)(3)(\
+  DEFINEMACRO(ARG1)(ARG2)(ARG3)\
+)
+DEFINEMACRO(undef)(1)(\
+  UNDEFINEMACRO(ARG1)\
+)
+DEFINEMACRO(redef)(3)(\
+  UNDEFINEMACRO(ARG1)\
+  DEFINEMACRO(ARG1)(ARG2)(ARG3)\
+)
+
+DEFINEMACRO(LPAR)(0)(CHAR(40))
+DEFINEMACRO(RPAR)(0)(CHAR(41))
+DEFINEMACRO(PLUS)(0)(CHAR(+))
+
+DEFINEMACRO(NL)(0)(
+)
+
+DEFINEMACRO(ifzman)(1)()
+DEFINEMACRO(ifnzman)(1)(ARG1)
+DEFINEMACRO(ifztexi)(1)()
+DEFINEMACRO(ifnztexi)(1)(ARG1)
+
+ENDDEF()
diff --git a/Doc/zman.yo b/Doc/zman.yo
new file mode 100644
index 000000000..7d7fc120e
--- /dev/null
+++ b/Doc/zman.yo
@@ -0,0 +1,192 @@
+STARTDEF()
+
+TYPEOUT(Zsh Yodl-to-man converter)
+DEFINESYMBOL(zman)
+
+INCLUDEFILE(zmacros)
+redef(ifzman)(1)(ARG1)
+redef(ifnzman)(1)()
+
+def(CMT)(0)(NOTRANS(.'))
+
+COMMENT(--- character translation ---)
+
+DEFINECHARTABLE(standard)(
+  '' = ".' (avoiding a yodl bug)"
+  '\\' = "\\e"
+  '.' = "\\&."
+  '-' = "\\-"
+)
+USECHARTABLE(standard)
+
+def(STDPAR)(0)(\
+  redef(PARAGRAPH)(0)(NL()NOTRANS(.PP)NL())\
+)
+
+COMMENT(--- emphasised text ---)
+
+def(em)(1)(NOTRANS(\fI)ARG1NOTRANS(\fP))
+def(bf)(1)(NOTRANS(\fB)ARG1NOTRANS(\fP))
+def(tt)(1)(NOTRANS(\fB)ARG1NOTRANS(\fP))
+def(var)(1)(NOTRANS(\fI)ARG1NOTRANS(\fP))
+
+COMMENT(--- man page headers ---)
+
+def(manpage)(4)(\
+  NOTRANS(.TH ")ARG1" "ARG2" "ARG3" "ARG4"\
+)
+def(manpagename)(2)(\
+  sect(NAME)NL()\
+  ARG1 - ARG2\
+)
+
+COMMENT(--- TeXinfo headers and conditionals ---)
+
+def(texinfo)(2)(CMT())
+
+def(texiifinfo)(1)()
+def(texiiftex)(1)()
+
+def(texipage)(0)(CMT())
+def(texititlepage)(0)(CMT())
+def(texiendtitlepage)(0)(CMT())
+def(texititle)(1)(CMT())
+def(texisubtitle)(1)(CMT())
+def(texiauthor)(1)(CMT())
+
+def(texinode)(4)(CMT())
+def(texitop)(1)(CMT())
+
+COMMENT(--- section divisions ---)
+
+def(chapter)(1)(CMT())
+
+def(sect)(1)(\
+  NOTRANS(.SH ")UPPERCASE(ARG1)(0)"NL()\
+  STDPAR()\
+  CMT()\
+)
+
+def(subsect)(1)(\
+  NOTRANS(.SS ")ARG1"NL()\
+  CMT()\
+)
+
+COMMENT(--- comment output ---)
+
+DEFINECHARTABLE(roffcomment)(
+  '\n' = "\n.\\\" "
+)
+def(comment)(1)(\
+  USECHARTABLE(roffcomment)\
+  NOTRANS(.\" )ARG1\
+  USECHARTABLE(standard)\
+)
+
+COMMENT(--- cross-references ---)
+
+def(manref)(2)(\
+  NOTRANS(\fI)ARG1NOTRANS(\fP)(ARG2)\
+)
+def(zmanref)(1)(manref(ARG1)(1))
+def(noderef)(1)(the section `ARG1')
+
+COMMENT(--- lists ---)
+
+def(startitem)(0)(\
+  NOTRANS(.PD 0)\
+  redef(ITEM)(0)(NOTRANS(.PD)NL())\
+)
+def(enditem)(0)(\
+  ENDITEM()\
+  STDPAR()\
+  redef(ENDITEM)(0)(NOTRANS(.RE)STDPAR())\
+)
+def(item)(2)(\
+  NOTRANS(.TP)NL()\
+  ITEM()\
+  redef(ITEM)(0)()\
+  ARG1\
+  redef(ENDITEM)(0)(CMT())\
+  redef(PARAGRAPH)(0)(\
+    NL()NOTRANS(.RS)NL()NOTRANS(.PP)NL()\
+    STDPAR()\
+    redef(ENDITEM)(0)(NOTRANS(.RE)STDPAR())\
+  )\
+  ARG2\
+  ENDITEM()\
+)
+def(xitem)(1)(\
+  NOTRANS(.TP)NL()\
+  NOTRANS(.PD 0)NL()\
+  redef(ITEM)(0)(NOTRANS(.PD)NL())\
+  ARG1\
+)
+
+def(startsitem)(0)(\
+  NOTRANS(.PD 0)\
+)
+def(endsitem)(0)(\
+  NOTRANS(.PD)\
+)
+def(sitem)(2)(\
+  NOTRANS(.TP)NL()\
+  ARG1NL()\
+  ARG2\
+)
+def(sxitem)(1)(\
+  NOTRANS(.TP)NL()\
+  ARG1\
+)
+
+def(startlist)(0)(\
+  NOTRANS(.PD 0)\
+)
+def(endlist)(0)(\
+  NOTRANS(.PD)\
+)
+def(list)(1)(\
+  NOTRANS(.TP)NL()\
+  ARG1\
+)
+
+def(startitemize)(0)(\
+  startitem()\
+)
+def(enditemize)(0)(\
+  enditem()\
+)
+def(itemiz)(1)(\
+  item(NOTRANS(\)LPAR()NOTRANS(bu))(NL()ARG1NL())\
+)
+
+COMMENT(--- special effects ---)
+
+def(nofill)(1)(\
+  NOTRANS(.nf)NL()\
+  ARG1\
+  NL()NOTRANS(.fi)\
+)
+
+def(indent)(1)(\
+  NOTRANS(.RS)\
+  ARG1\
+  NOTRANS(.RE)\
+)
+
+COMMENT(--- hyperlink menus ---)
+
+def(startmenu)(0)(CMT())
+def(endmenu)(0)(CMT())
+def(menu)(1)(CMT())
+
+COMMENT(--- indices ---)
+
+def(cindex)(1)(CMT())
+def(findex)(1)(CMT())
+def(kindex)(1)(CMT())
+def(pindex)(1)(CMT())
+def(tindex)(1)(CMT())
+def(vindex)(1)(CMT())
+
+ENDDEF()\
diff --git a/Doc/zsh.yo b/Doc/zsh.yo
new file mode 100644
index 000000000..a97f023e7
--- /dev/null
+++ b/Doc/zsh.yo
@@ -0,0 +1,83 @@
+ifzman(\
+IFDEF(ZSHALL)(\
+def(ifzshone)(1)()\
+def(ifzshall)(1)(ARG1)\
+manpage(ZSHALL)(1)(date())(zsh version())
+manpagename(zshall)(the Z shell meta-man page)
+)(\
+def(ifzshone)(1)(ARG1)\
+def(ifzshall)(1)()\
+manpage(ZSH)(1)(date())(zsh version())
+manpagename(zsh)(the Z shell)
+)\
+)\
+ifnzman(\
+def(ifzshone)(1)()\
+def(ifzshall)(1)()\
+)\
+ifztexi(\
+texinfo(zsh.info)(zsh)
+NOTRANS(@setchapternewpage odd
+@iftex
+@finalout
+@afourpaper
+@end iftex)
+texititlepage()
+texititle(The Z Shell Guide)
+texisubtitle(Version version())
+texisubtitle(Updated date())
+texiauthor(Original documentation by Paul Falstad)
+texipage()
+This is a texinfo version of the documentation for the Z Shell, originally by 
+Paul Falstad.
+
+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 also 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.
+texiendtitlepage()
+)\
+ifnzman(includefile(Zsh/guide.yo))
+includefile(Zsh/intro.yo)
+includefile(Zsh/invoke.yo)
+includefile(Zsh/files.yo)
+ifnzman(includefile(Zsh/grammar.yo))
+ifnzman(includefile(Zsh/redirect.yo))
+ifnzman(includefile(Zsh/exec.yo))
+ifnzman(includefile(Zsh/func.yo))
+ifnzman(includefile(Zsh/jobs.yo))
+ifnzman(includefile(Zsh/arith.yo))
+ifnzman(includefile(Zsh/cond.yo))
+ifnzman(includefile(Zsh/compat.yo))
+ifnzman(includefile(Zsh/prompt.yo))
+ifnzman(includefile(Zsh/restricted.yo))
+ifnzman(includefile(Zsh/expn.yo))
+ifnzman(includefile(Zsh/params.yo))
+ifnzman(includefile(Zsh/options.yo))
+ifnzman(includefile(Zsh/builtins.yo))
+ifnzman(includefile(Zsh/zle.yo))
+ifnzman(includefile(Zsh/compctl.yo))
+ifnzman(includefile(Zsh/modules.yo))
+ifzshall(\
+def(source)(1)(NOTRANS(.so )man1/ARG1NOTRANS(.)1)\
+CMT()
+source(zshmisc)
+source(zshexpn)
+source(zshparam)
+source(zshoptions)
+source(zshbuiltins)
+source(zshzle)
+source(zshcompctl)
+source(zshmodules)
+manpage(ZSHALL)(1)(date())(zsh version())
+)\
+ifzman(includefile(Zsh/filelist.yo))
+ifzman(includefile(Zsh/seealso.yo))
+ifnzman(includefile(Zsh/index.yo))
diff --git a/Doc/zshbuiltins.yo b/Doc/zshbuiltins.yo
new file mode 100644
index 000000000..557ba7995
--- /dev/null
+++ b/Doc/zshbuiltins.yo
@@ -0,0 +1,3 @@
+manpage(ZSHBUILTINS)(1)(date())(zsh version())
+manpagename(zshbuiltins)(zsh built-in commands)
+includefile(Zsh/builtins.yo)
diff --git a/Doc/zshcompctl.yo b/Doc/zshcompctl.yo
new file mode 100644
index 000000000..3e3bedf5a
--- /dev/null
+++ b/Doc/zshcompctl.yo
@@ -0,0 +1,3 @@
+manpage(ZSHCOMPCTL)(1)(date())(zsh version())
+manpagename(zshcompctl)(zsh programmable completion)
+includefile(Zsh/compctl.yo)
diff --git a/Doc/zshexpn.yo b/Doc/zshexpn.yo
new file mode 100644
index 000000000..aa8decebb
--- /dev/null
+++ b/Doc/zshexpn.yo
@@ -0,0 +1,3 @@
+manpage(ZSHEXPN)(1)(date())(zsh version())
+manpagename(zshexpn)(zsh expansion and substitution)
+includefile(Zsh/expn.yo)
diff --git a/Doc/zshmisc.yo b/Doc/zshmisc.yo
new file mode 100644
index 000000000..332df1e25
--- /dev/null
+++ b/Doc/zshmisc.yo
@@ -0,0 +1,12 @@
+manpage(ZSHMISC)(1)(date())(zsh version())
+manpagename(zshmisc)(everything and then some)
+includefile(Zsh/grammar.yo)
+includefile(Zsh/redirect.yo)
+includefile(Zsh/exec.yo)
+includefile(Zsh/func.yo)
+includefile(Zsh/jobs.yo)
+includefile(Zsh/arith.yo)
+includefile(Zsh/cond.yo)
+includefile(Zsh/compat.yo)
+includefile(Zsh/prompt.yo)
+includefile(Zsh/restricted.yo)
diff --git a/Doc/zshmodules.yo b/Doc/zshmodules.yo
new file mode 100644
index 000000000..9def096ca
--- /dev/null
+++ b/Doc/zshmodules.yo
@@ -0,0 +1,3 @@
+manpage(ZSHMODULES)(1)(date())(zsh version())
+manpagename(zshmodules)(zsh loadable modules)
+includefile(Zsh/modules.yo)
diff --git a/Doc/zshoptions.yo b/Doc/zshoptions.yo
new file mode 100644
index 000000000..266d32ac0
--- /dev/null
+++ b/Doc/zshoptions.yo
@@ -0,0 +1,3 @@
+manpage(ZSHOPTIONS)(1)(date())(zsh version())
+manpagename(zshoptions)(zsh options)
+includefile(Zsh/options.yo)
diff --git a/Doc/zshparam.yo b/Doc/zshparam.yo
new file mode 100644
index 000000000..ac39e9267
--- /dev/null
+++ b/Doc/zshparam.yo
@@ -0,0 +1,3 @@
+manpage(ZSHPARAM)(1)(date())(zsh version())
+manpagename(zshparam)(zsh parameters)
+includefile(Zsh/params.yo)
diff --git a/Doc/zshzle.yo b/Doc/zshzle.yo
new file mode 100644
index 000000000..66e1d588f
--- /dev/null
+++ b/Doc/zshzle.yo
@@ -0,0 +1,3 @@
+manpage(ZSHZLE)(1)(date())(zsh version())
+manpagename(zshzle)(zsh command line editor)
+includefile(Zsh/zle.yo)
diff --git a/Doc/ztexi.yo b/Doc/ztexi.yo
new file mode 100644
index 000000000..b8e115ec0
--- /dev/null
+++ b/Doc/ztexi.yo
@@ -0,0 +1,246 @@
+STARTDEF()
+
+TYPEOUT(Zsh Yodl-to-TeXinfo converter)
+DEFINESYMBOL(ztexi)
+
+INCLUDEFILE(zmacros)
+redef(ifztexi)(1)(ARG1)
+redef(ifnztexi)(1)()
+
+def(CMT)(0)(NOTRANS(@c))
+
+ATEXIT(\
+  NL()\
+  NOTRANS(@setchapternewpage odd)NL()\
+  NOTRANS(@contents)NL()\
+  NOTRANS(@bye)NL()\
+)
+
+COMMENT(--- character translation ---)
+
+DEFINECHARTABLE(standard)(
+  '' = "@c (avoiding a yodl bug)"
+  '@' = "@@"
+  '{' = "@{"
+  '}' = "@}"
+)
+USECHARTABLE(standard)
+SUBST('')(NOTRANS(@value{dsq}))
+
+def(STDPAR)(0)(redef(PARAGRAPH)(0)(NL()NL()NOTRANS(@noindent)NL()))
+
+COMMENT(--- emphasised text ---)
+
+def(em)(1)(NOTRANS(@emph{)ARG1NOTRANS(}))
+def(bf)(1)(NOTRANS(@cite{)ARG1NOTRANS(}))
+def(tt)(1)(NOTRANS(@code{)ARG1NOTRANS(}))
+def(var)(1)(NOTRANS(@var{)ARG1NOTRANS(}))
+
+COMMENT(--- man page headers ---)
+
+def(manpage)(4)(STDPAR())
+def(manpagename)(2)()
+
+COMMENT(--- TeXinfo headers and conditionals ---)
+
+def(texinfo)(2)(\
+  STDPAR()\
+  NOTRANS(\input texinfo.tex)NL()\
+  NOTRANS(@c %**start of header)NL()\
+  NOTRANS(@setfilename )ARG1NL()\
+  NOTRANS(@settitle )ARG2NL()\
+  NOTRANS(@c %**end of header)NL()\
+  NL()\
+  NOTRANS(@ifinfo)NL()\
+  NOTRANS(@set dsq @'@')NL()\
+  NOTRANS(@end ifinfo)NL()\
+  NOTRANS(@iftex)NL()\
+  NOTRANS(@set dsq '{}')NL()\
+  NOTRANS(@end iftex)NL()\
+)
+
+def(texiifinfo)(1)(\
+  NOTRANS(@ifinfo)NL()\
+  ARG1\
+  NOTRANS(@end ifinfo)NL()\
+)
+def(texiiftex)(1)(\
+  NOTRANS(@iftex)NL()\
+  ARG1\
+  NOTRANS(@end iftex)NL()\
+)
+
+def(texipage)(0)(\
+  NOTRANS(@page)\
+)
+def(texititlepage)(0)(\
+  NOTRANS(@titlepage)\
+)
+def(texiendtitlepage)(0)(\
+  NOTRANS(@end titlepage)\
+)
+def(texititle)(1)(\
+  NOTRANS(@title )ARG1\
+)
+def(texisubtitle)(1)(\
+  NOTRANS(@subtitle )ARG1\
+)
+def(texiauthor)(1)(\
+  NOTRANS(@author )ARG1\
+)
+
+def(texinode)(4)(\
+  NOTRANS(@node )ARG1, ARG2, ARG3, ARG4\
+)
+def(texitop)(1)(\
+  NOTRANS(@top )ARG1\
+)
+
+COMMENT(--- section divisions ---)
+
+def(chapter)(1)(\
+  NL()\
+  NOTRANS(@chapter )ARG1NL()\
+  NOTRANS(@noindent)\
+)
+
+def(sect)(1)(\
+  NL()\
+  NOTRANS(@section )ARG1NL()\
+  NOTRANS(@noindent)\
+)
+
+def(subsect)(1)(\
+  NL()\
+  NOTRANS(@subsection )ARG1NL()\
+  NOTRANS(@noindent)\
+)
+
+COMMENT(--- comment output ---)
+
+DEFINECHARTABLE(texicomment)(
+  '\n' = "\n@c "
+)
+def(comment)(1)(\
+  USECHARTABLE(texicomment)\
+  NOTRANS(@c )ARG1\
+  USECHARTABLE(standard)\
+)
+
+COMMENT(--- cross-references ---)
+
+def(manref)(2)(man page ARG1LPAR()ARG2RPAR())
+def(zmanref)(1)(manref(ARG1)(1))
+def(noderef)(1)(\
+  NOTRANS(@ref{)ARG1NOTRANS(})\
+)
+
+COMMENT(--- lists ---)
+
+def(startitem)(0)(\
+  NOTRANS(@table @asis)\
+  redef(ITEMX)(0)()\
+)
+def(enditem)(0)(\
+  NOTRANS(@end table)\
+)
+def(item)(2)(\
+  NOTRANS(@item)ITEMX() ARG1\
+  ARG2\
+  redef(ITEMX)(0)()\
+)
+def(xitem)(1)(\
+  NOTRANS(@item)ITEMX() ARG1\
+  redef(ITEMX)(0)(x)\
+)
+
+def(startsitem)(0)(\
+  startitem()\
+)
+def(endsitem)(0)(\
+  enditem()\
+)
+def(sitem)(2)(\
+  item(ARG1)(NL()ARG2)\
+)
+def(sxitem)(1)(\
+  xitem(ARG1)\
+)
+
+def(startlist)(0)(\
+  startitem()\
+)
+def(endlist)(0)(\
+  enditem()\
+)
+def(list)(1)(\
+  item(ARG1)()\
+)
+
+def(startitemize)(0)(\
+  NOTRANS(@itemize @bullet)NL()\
+)
+def(enditemize)(0)(\
+  NOTRANS(@end itemize)\
+)
+def(itemiz)(1)(\
+  sitem()(ARG1)\
+)
+  
+COMMENT(--- special effects ---)
+
+DEFINECHARTABLE(nofillchars)(
+  '@' = "@@"
+  '{' = "@{"
+  '}' = "@}"
+  '\n' = "@*\n"
+)
+def(nofill)(1)(\
+  USECHARTABLE(nofillchars)\
+  ARG1\
+  USECHARTABLE(standard)\
+)
+
+def(indent)(1)(\
+  ARG1\
+)
+
+COMMENT(--- hyperlink menus ---)
+
+def(startmenu)(0)(\
+  NOTRANS(@menu)\
+)
+def(endmenu)(0)(\
+  NOTRANS(@end menu)\
+)
+def(menu)(1)(\
+  * ARG1NOTRANS(::)\
+)
+
+COMMENT(--- indices ---)
+
+def(cindex)(1)(\
+  NOTRANS(@cindex )ARG1\
+)
+
+def(findex)(1)(\
+  NOTRANS(@findex )ARG1\
+)
+
+def(kindex)(1)(\
+  NOTRANS(@kindex )ARG1\
+)
+
+def(pindex)(1)(\
+  NOTRANS(@pindex )ARG1\
+)
+
+def(tindex)(1)(\
+  NOTRANS(@tindex )ARG1\
+)
+
+def(vindex)(1)(\
+  NOTRANS(@vindex )ARG1\
+)
+
+ENDDEF()\
diff --git a/Etc/.cvsignore b/Etc/.cvsignore
new file mode 100644
index 000000000..9f48d4e1b
--- /dev/null
+++ b/Etc/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+FAQ
+FAQ.html
diff --git a/Etc/.distfiles b/Etc/.distfiles
new file mode 100644
index 000000000..1eb7c1a50
--- /dev/null
+++ b/Etc/.distfiles
@@ -0,0 +1,5 @@
+DISTFILES_SRC='
+    .cvsignore .distfiles Makefile.in
+    BUGS CONTRIBUTORS FAQ FAQ.yo FEATURES MACHINES NEWS
+    FTP-README pubring.pgp
+'
diff --git a/Etc/BUGS b/Etc/BUGS
new file mode 100644
index 000000000..2a255444f
--- /dev/null
+++ b/Etc/BUGS
@@ -0,0 +1,41 @@
+-----------------
+KNOWN BUGS IN ZSH
+-----------------
+
+------------------------------------------------------------------------
+Completion has a habit of doing the wrong thing after a
+backslash/newline.
+------------------------------------------------------------------------
+If you suspend "man", zle seems to get into cooked mode.  It works ok
+for plain "less".
+It is not specific neither to man nor to zsh.
+E.g. call the following program foo:
+#include <sys/wait.h>
+#include <unistd.h>
+
+int main(int argc, char *argv[])
+{
+    int status;
+
+    if (!fork())	/* child */
+	execvp(argv[1], argv + 1);
+    else		/* parent */
+	wait(&status);
+}
+Then if you suspend
+% foo less something
+from zsh/bash, zle/readline gets into cooked mode.
+------------------------------------------------------------------------
+% zsh -c 'cat a_long_file | less ; :'
+can be interrupted with ^C. The prompt comes back and less is orphaned.
+If you go to the end of the file with less and cat terminates, ^C
+will not terminate less. The `; :' after less forces zsh to fork before
+executing less.
+------------------------------------------------------------------------
+The pattern %?* matches names beginning with %? instead of names with at
+least two characters beginning with %. This is a hack to allow %?foo job
+substitution without quoting. This behaviour is incompatible with sh
+and ksh and may be removed in the future. A good fix would be to keep
+such patterns unchanged if they do not match regardless of the state of
+the nonomatch and nullglob options.
+------------------------------------------------------------------------
diff --git a/Etc/CONTRIBUTORS b/Etc/CONTRIBUTORS
new file mode 100644
index 000000000..52d664fad
--- /dev/null
+++ b/Etc/CONTRIBUTORS
@@ -0,0 +1,127 @@
+----------------
+ZSH CONTRIBUTORS
+----------------
+
+Zsh was originally written by Paul Falstad <pf@zsh.org>.  Zsh is
+now maintained by the members of the zsh-workers mailing list
+<zsh-workers@math.gatech.edu>.  The development is currently coordinated
+by Andrew Main (Zefram) <zefram@zsh.org>.
+
+This file credits only the major contributors to the current release.
+See the ChangeLog files for a complete list of people who have submitted
+patches.  Note that email addresses below and in the ChangeLog file
+are included for disambiguation purposes only, and are not guaranteed
+to be currently accurate.  If you feel that you or someone else have
+been unfairly omitted from this list please mail the current maintainer
+at <coordinator@zsh.org>.
+
+Version 3.0
+-----------
+
+* Richard Coleman <coleman@math.gatech.edu> maintained the code till the
+  release of zsh-2.6-beta16.  Converted zsh to use autoconf thus greatly
+  improving the portability.  Rewrote signal handling code.  Reorganized
+  internal hash tables and rewrote the related builtins (enable, disable,
+  hash, unhash).  Made some cleanups in exec.c.
+
+* Zoltán Hidvégi <hzoli@cs.elte.hu> maintained zsh from version
+  2.6-beta16.  Rewrote most of the lexer and substitution and the related
+  completion code.  Improved sh/ksh/POSIX compatibility.  Fixed lots
+  of bugs in completion, parameter and history code.  Made zsh fully
+  8-bit clean.  Made some reorganizations in exec.c.  Fixed signal
+  handling bugs.  Fixed lots of bugs in various places.
+
+* Peter W. Stephenson <pws@ifh.de> the maintainer of the zsh FAQ.
+  Reorganizations in exec.c.  Rewrote and reorganized the history code.
+  Rewrote the zshcompctl manual page.  Fixed several bugs related to
+  programmable completion.  Fixed several signal handling bugs.  Rewrote
+  test and read builtins.  Lots of other bugfixes.
+
+* Andrew Main (Zefram) <zefram@fysh.org> reorganized builtin.c.
+  Rewrote large parts of the zle vi mode.  Redirection fixes.  Reorganized
+  parts of the completion code, added some enhancements and fixed lots of
+  bugs.  Made zle fully 8-bit clean.  Fixed several zle bugs.  Reorganized
+  zsh option handling.  Lots of other bugfixes.
+
+* Sven Wischnowsky <wischnow@informatik.hu-berlin.de> wrote most of the
+  programmable completion code in zsh-2.5.0.  Several bugfixes in exec.c
+  and jobs.c.  Lots of completion bugfixes and enhancements.
+
+* Geoff Wing <mason@werple.net.au> rewrote most of zle_refresh.c.  Some
+  other bugfixes.
+
+* Clive Messer <clive@epos.demon.co.uk> brought the texinfo documentation
+  up-to-date.
+
+* Mark Borges <mdb@cdc.noaa.gov> maintains the zsh web page
+  (http://www.mal.com/zsh/).  Several documentation fixes.  Maintains the
+  texinfo documentation together with Clive.
+
+* Wayne Davison <wayne@clari.net> improved the the zle search functions
+  and made them 8-bit clean.  Some other little bugfixes.
+
+* Bart Schaefer <schaefer@candle.brasslantern.com> submitted several
+  bugfixes, reported lots of bugs and gave many very useful suggestions.
+
+Version 2.5
+-----------
+
+Bas de Bakker maintained zsh till the release of zsh-2.5.0.  People who
+have contributed to zsh-2.5.0 are (in lexical order):
+
+Chris.Moore@src.bae.co.uk (Chris Moore)
+Harald.Eikrem@delab.sintef.no
+Irving_Wolfe@happy-man.com (Irving Wolfe)
+Jarkko.Hietaniemi@hut.fi (Jarkko Hietanimi)
+P.Stephenson@swansea.ac.uk (Peter Stephenson)
+Richard.Sharman@software.mitel.com (Richard Sharman)
+Tero_Kivinen@hut.FI (Tero Kivinen)
+arf@maths.nott.ac.uk (Anthony Iano-Fletcher)
+bas@phys.uva.nl (Bas de Bakker)
+benson@odi.com (Benson Margulies)
+billb@bedford.progress.com (Bill Burton)
+brown@wi.extrel.com (M. Brown)
+carlos@snfep1.if.usp.br (Carlos Carvalho)
+cedman@capitalist.princeton.edu (Carl Edman)
+chip%fin@myrddin.sybus.com (Chip Salzenberg)
+chs@apu.fi (Hannu Strang)
+coleman@math.gatech.edu (Richard Coleman)
+cross@eng.umd.edu (Chris Ross)
+dm@cs.brown.edu (Dimitris Michailidis)
+dmm0t@rincewind.mech.virginia.edu (David M. Meyer)
+esky@CS.UCLA.EDU (Eskandar Ensafi)
+franl@centerline.com (Fran Litterio)
+gansevle@cs.utwente.nl (Fred Gansevles)
+gnohmon@ssiny.com (Ralph Betza)
+guillaum@clipper.ens.fr (Florent Guillaume)
+guthrie@math.upenn.edu (John Guthrie)
+hegedus@celeste.eng.yale.edu (Peter Hegedus)
+henryg@tusc.com.au (Henry Guillaume)
+hoh@approve.se (Goran Larsson)
+hooft@chem.ruu.nl (Rob Hooft)
+hsw1@papa.attmail.com (Stephen Harris)
+irving@happy-man.com (Irving Wolfe)
+jch@cs.cmu.edu (Jonathan Hardwick)
+jos@oce.nl (Jos Backus)
+liblit@cs.psu.edu (Benjamin Liblit)
+marc@cam.org (Marc Boucher)
+mason@werple.apana.org.au (Geoff Wing)
+mycroft@gnu.ai.mit.edu (Charles Hannum)
+mystic@axposf.pa.dec.com (D. Hall)
+norbert@i3.informatik.rwth-aachen.de (Norbert Kiesel)
+oberon@cs.tu-berlin.de (Sven Wischnowsky)
+pclink@qld.tne.oz.au (Rick)
+pem@aaii.oz.au (Paul Maisano)
+per@efd.lth.se (Per Foreby)
+pf@z-code.com (Paul Falstad)
+roderick@ibcinc.com (Roderick Schertler)
+schaefer@z-code.com (Bart Schaefer)
+schlangm@informatik.uni-muenchen.de (Harald Schlangmann)
+seniorr@teleport.com (Russell Senior)
+sinclair@dcs.gla.ac.uk (Duncan Sinclair)
+sterling@oldcolo.com (Bruce Sterling Woodcock)
+suzuki@otsl.oki.co.jp (Hisao Suzuki)
+tsm@cs.brown.edu (Timothy Miller)
+vogelke@c17mis.wpafb.af.mil (Karl E. Vogel)
+wacker@physik.uni-dortmund.de (Klaus Wacker)
+wacren@cis10.ens-cachan.fr (Laurent Wacrenier)
diff --git a/Etc/FAQ.yo b/Etc/FAQ.yo
new file mode 100644
index 000000000..3bb53de39
--- /dev/null
+++ b/Etc/FAQ.yo
@@ -0,0 +1,2018 @@
+mailto(pws@ifh.de)\
+whentxt(notableofcontents())\
+COMMENT(-- mytt is like tt but adds quotes `like this' for plain text --)\
+def(mytt)(1)(\
+  whentxt(`ARG1')\
+  whenhtml(tt(ARG1))\
+  whenlatex(tt(ARG1))\
+  whenms(tt(ARG1))\
+  whensgml(tt(ARG1)))\
+COMMENT(-- mybf/em are like bf/em but add *emphasis* for text too --)\
+def(mybf)(1)(\
+  whentxt(*ARG1*)\
+  whenhtml(bf(ARG1))\
+  whenlatex(bf(ARG1))\
+  whenms(bf(ARG1))\
+  whensgml(bf(ARG1)))
+def(myem)(1)(\
+  whentxt(_ARG1_)\
+  whenhtml(em(ARG1))\
+  whenlatex(em(ARG1))\
+  whenms(em(ARG1))\
+  whensgml(em(ARG1)))\
+COMMENT(-- mydit is like dit but no `o' for text mode --)\
+def(mydit)(1)(\
+    whenlatex(dit(ARG1))\
+    whenhtml(dit(ARG1))\
+    whentxt(ARG1)\
+    whenman(dit(ARG1))\
+    whenms(dit(ARG1))\
+    whensgml(dit(ARG1)))\
+COMMENT(-- myeit is like eit but fancier text formatting --)\
+def(myeit)(0)(\
+    whenlatex(eit())whenhtml(eit())whenman(eit())whenms(eit())whensgml(eit())\
+    whentxt(USECOUNTER(XXenumcounter)CHAR(41)))\
+def(myeitd)(0)(\
+    whenlatex(eit())whenhtml(eit())whenman(eit())whenms(eit())whensgml(eit())\
+    whentxt(USECOUNTER(XXenumcounter).))\
+COMMENT(-- don't want headers for text, USENET headers must come first --)\
+def(myreport)(3)(\
+whentxt(report()()())\
+whenhtml(report(ARG1)(ARG2)(ARG3))\
+whenlatex(report(ARG1)(ARG2)(ARG3))\
+whenman(report(ARG1)(ARG2)(ARG3))\
+whenms(report(ARG1)(ARG2)(ARG3))\
+whensgml(report(ARG1)(ARG2)(ARG3)))
+myreport(Z-Shell Frequently-Asked Questions)(Peter Stephenson)(1998/10/26)
+COMMENT(-- the following are for Usenet and must appear first)\
+description(
+mydit(Archive-Name:) unix-faq/shell/zsh
+mydit(Last-Modified:) 1998/10/26
+mydit(Submitted-By:) email(pws@amtp.liv.ac.uk (Peter Stephenson))
+mydit(Version:) $Id: FAQ.yo,v 1.1 1999/04/15 18:05:37 akr Exp $
+mydit(Frequency:) Monthly
+mydit(Copyright:) (C) P.W. Stephenson, 1995, 1996, 1997, 1998 \
+(see end of document)
+)
+
+bf(Changes since issue posted September 1998:)
+description(
+mydit(2.1)  Another mytt(typeset) difference turned up.
+mydit(5.4)  Slight addition to Y2K item (prompt formatting)
+)
+
+This document contains a list of frequently-asked (or otherwise
+significant) questions concerning the Z-shell, a command interpreter
+for many UNIX systems which is freely available to anyone with FTP
+access.  Zsh is among the most powerful freely available Bourne-like
+shell for interactive use.
+
+If you have never heard of mytt(sh), mytt(csh) or mytt(ksh), then you are
+probably better off to start by reading a general introduction to UNIX
+rather than this document.
+
+If you just want to know how to get your hands on the latest version,
+skip to question link(1.6)(16); if you want to know what to do with
+insoluble problems, go to link(5.2)(52).
+
+whentxt(Notation: Quotes `like this' are ordinary textual quotation
+marks.  Other uses of quotation marks are input to the shell.)
+
+COMMENT(-- need to do this specially in text since it should go here --)
+whentxt(Contents:
+Chapter 1:  Introducing zsh and how to install it
+1.1. Sources of information
+1.2. What is it?
+1.3. What is it good at?
+1.4. On what machines will it run?  (Plus important compilation notes)
+1.5. What's the latest version?
+1.6. Where do I get it?
+1.7. I don't have root access: how do I make zsh my login shell?
+
+Chapter 2:  How does zsh differ from...?
+2.1. sh and ksh?
+2.2. csh?
+2.3. Why do my csh aliases not work?  (Plus other alias pitfalls.)
+2.4. tcsh?
+2.5. bash?
+2.6. Shouldn't zsh be more/less like ksh/(t)csh?
+
+Chapter 3:  How to get various things to work
+3.1. Why does `$var' where `var="foo bar"' not do what I expect?
+3.2. What is the difference between `export' and the ALL_EXPORT option?
+3.3. How do I turn off spelling correction/globbing for a single command?
+3.4. How do I get the meta key to work on my xterm?
+3.5. How do I automatically display the directory in my xterm title bar?
+3.6. How do I make the completion list use eight bit characters?
+3.7. Why do the cursor (arrow) keys not work?
+3.8. Why does my terminal act funny in some way?
+3.9. Why does zsh not work in an Emacs shell mode any more?
+3.10. Why do my autoloaded functions not autoload [the first time]?
+3.11. How does base arithmetic work?
+3.12. How do I get a newline in my prompt?
+3.13. Why does `bindkey ^a command-name' or 'stty intr ^-' do something funny?
+3.14. Why can't I bind \C-s and \C-q any more?
+3.15. How do I execute command `foo' within function `foo'?
+3.16. Why do history substitutions with single bangs do something funny?
+3.17. Why does zsh kill off all my background jobs when I logout?
+3.18. How do I list all my history entries?
+3.19. How does the alternative loop syntax, e.g. mytt(while {...} {...}) work?
+3.20. Why is my history not being saved?
+
+Chapter 4:  The mysteries of completion
+4.1. What is completion?
+4.2. What sorts of things can be completed?
+4.3. How does zsh deal with ambiguous completions?
+4.4. How do I complete in the middle of words / just what's before the cursor?
+4.5. How do I get started with programmable completion?
+4.6. And if programmable completion isn't good enough?
+
+Chapter 5:  The future of zsh
+5.1. What bugs are currently known and unfixed? (Plus recent important changes)
+5.2. Where do I report bugs, get more info / who's working on zsh?
+5.3. What's on the wish-list?
+5.4. Will zsh have problems in the year 2000?
+
+Acknowledgments
+
+Copyright
+--- End of Contents ---
+)
+
+chapter(Introducing zsh and how to install it)
+
+sect(Sources of information)
+label(11)
+
+  Information on zsh is available via the World Wide Web.  The URL
+  is url(http://sunsite.auc.dk/zsh/)(http://sunsite.auc.dk/zsh/) (note the \
+  change of address from the
+  end of April 1998).  The server provides this FAQ and much else and is
+  now maintained by Karsten Thygesen and others (mail \
+  email(zsh@sunsite.auc.dk)
+  with any related messages).  The FAQ is at \
+url(http://sunsite.auc.dk/zsh/FAQ/)(http://sunsite.auc.dk/zsh/FAQ/) .
+  The site also contains some contributed zsh scripts and functions;
+  we are delighted to add more, or simply links to your own collection.
+
+  This document was originally written in YODL, allowing it to be
+  converted easily into various other formats.  The master source
+  file lives at url(http://sunsite.auc.dk/zsh/FAQ/zshfaq.yo)
+(http://sunsite.auc.dk/zsh/FAQ/zshfaq.yo) .
+
+  Another useful source of information is the collection of FAQ articles
+  posted frequently to the Usenet news groups comp.unix.questions,
+  comp.unix.shells and comp.answers with answers to general questions
+  about UNIX.  The fifth of the seven articles deals with shells,
+  including zsh, with a brief description of differences.  (This article
+  also talks about shell startup files which would otherwise rate a
+  mention here.)  There is also a separate FAQ on shell differences
+  and how to change your shell.  Usenet FAQs are available via FTP
+  from rtfm.mit.edu and mirrors and also on the World Wide Web; see
+  description(
+    mydit(USA)         url(http://www.cis.ohio-state.edu/hypertext/faq/usenet/top.html)
+    (http://www.cis.ohio-state.edu/hypertext/faq/usenet/top.html)
+    mydit(UK)          url(http://www.lib.ox.ac.uk/internet/news/faq/comp.unix.shell.html)
+    (http://www.lib.ox.ac.uk/internet/news/faq/comp.unix.shell.html)
+    mydit(Netherlands) url(http://www.cs.ruu.nl/wais/html/na-dir/unix-faq/shell/.html)
+    (http://www.cs.ruu.nl/wais/html/na-dir/unix-faq/shell/.html)
+  )
+
+  The latest version of this FAQ is also available directly from any
+  of the zsh archive sites listed in question link(1.6)(16).
+
+  There is now a preliminary version of a reference card for
+  zsh 3.0, which you can find (while it's being developed) at
+    url(http://www.ifh.de/~pws/computing/refcard.ps)
+    (http://www.ifh.de/~pws/computing/refcard.ps)
+  This is optimised for A4 paper. The tt(LaTeX) source is in the
+  same place with the extension tt(.tex).  It is not a good place
+  from which to learn zsh for the first time.
+
+  (As a method of reading the following in Emacs, you can type tt(\M-2
+  \C-x $) to make all the indented text vanish, then tt(\M-0 \C-x $)
+  when you are on the title you want.)
+
+  For any more eclectic information, you should contact the mailing
+  list:  see question link(5.2)(52).
+
+
+sect(What is it?)
+
+  Zsh is a UNIX command interpreter (shell) which of the standard
+  shells most resembles the Korn shell (ksh); its compatibility with
+  the 1988 Korn shell has been gradually increasing.  It includes
+  enhancements of many types, notably in the command-line editor,
+  options for customising its behaviour, filename globbing, features
+  to make C-shell (csh) users feel more at home and extra features
+  drawn from tcsh (another `custom' shell).
+
+  It was written by Paul Falstad when a student at Princeton; however,
+  Paul doesn't maintain it any more and enquiries should be sent to
+  the mailing list (see question link(5.2)(52)).  Zsh is distributed under a
+  standard Berkeley style copyright.
+
+  For more information, the files Doc/intro.txt or Doc/intro.troff
+  included with the source distribution are highly recommended.  A list
+  of features is given in FEATURES, also with the source.
+
+
+sect(What is it good at?)
+
+  Here are some things that zsh is particularly good at.  No claim of
+  exclusivity is made, especially as shells copy one another, though
+  in the areas of command line editing and globbing zsh is well ahead
+  of the competition.  I am not aware of a major interactive feature
+  in any other freely-available shell which zsh does not also have
+  (except smallness).
+
+  itemize(
+  it() Command line editing:
+  itemize(
+    it() programmable completion: incorporates the ability to use
+       the full power of zsh globbing (compctl -g),
+    it() multi-line commands editable as a single buffer (even files!),
+    it() variable editing (vared),
+    it() command buffer stack,
+    it() print text straight into the buffer for immediate editing (print -z),
+    it() execution of unbound commands,
+    it() menu completion,
+    it() variable, editing function and option name completion,
+    it() inline expansion of variables, history commands.  
+  )
+  it() Globbing --- extremely powerful, including:
+  itemize(
+    it() recursive globbing (cf. find),
+    it() file attribute qualifiers (size, type, etc. also cf. find),
+    it() full alternation and negation of patterns.
+  )
+  it() Handling of multiple redirections (simpler than tee).
+  it() Large number of options for tailoring.
+  it() Path expansion (=foo -> /usr/bin/foo).
+  it() Adaptable messages for spelling, watch, time as well as prompt
+     (including conditional expressions).
+  it() Named directories.
+  it() Comprehensive integer arithmetic.
+  it() Manipulation of arrays (including reverse subscripting).
+  it() Spelling correction.
+  )
+
+
+sect(On what machines will it run?)
+
+  From version 3.0, zsh uses GNU autoconf as the installation
+  mechanism.  This considerably increases flexibility over the old
+  `buildzsh' mechanism.  Consequently, zsh should compile and run on
+  any modern version of UNIX, and a great many not-so-modern versions
+  too.  The file Etc/MACHINES in the distribution has more details.
+
+  There are also now separate ports for Windows and OS/2, see `Where
+  do I get it' below.
+
+  If you need to change something to support a new machine, it would be
+  appreciated if you could add any necessary preprocessor code and
+  alter configure.in and config.h.in to configure zsh automatically,
+  then send the required context diffs to the list (see question
+  link(5.2)(52)).  Changes based on version 2.5 are very unlikely to
+  be useful.
+
+  To get it to work, retrieve the source distribution (see question
+  link(1.6)(16)), un-gzip it, un-tar it and read the INSTALL file in the top
+  directory.  Also read the Etc/MACHINES file for up-to-date
+  information on compilation on certain architectures.
+
+  mybf(Note for users of nawk) (The following information comes from Zoltan
+  Hidvegi): On some systems nawk is broken and produces an incorrect
+  signames.h file. This makes the signals code unusable. This often happens
+  on Ultrix, HP-UX, IRIX (?). Install gawk if you experience such problems.
+
+
+sect(What's the latest version?)
+
+  Zsh 3.0.5 is the latest production version. The new major number 3.0
+  largely reflects the considerable internal changes in zsh to make it
+  more reliable, consistent and (where possible) compatible.  Those
+  planning on upgrading their zsh installation should take a look at
+  the list of incompatibilities at the end of link(5.1)(51).  This is
+  longer than usual due to enhanced sh, ksh and POSIX compatibility.
+
+  The beta version 3.1.4 is also available.  Development of zsh is
+  usually patch by patch, with each intermediate version publicly
+  available.  Note that this `open' development system does mean bugs
+  are sometimes introduced into the most recent archived version.
+  These are usually fixed quickly.
+
+  Note also that as the shell changes, it may become incompatible with
+  older versions; see the end of question link(5.1)(51) for a partial list.
+  Changes of this kind are almost always forced by an awkward or
+  unnecessary feature in the original design (as perceived by current
+  users), or to enhance compatibility with other Bourne shell
+  derivatives, or (most recently) to provide POSIX compliancy.
+
+
+sect(Where do I get it?)
+label(16)
+
+  The archive is now run by email(Andrew Main <zefram@tao.co.uk>).
+  The following are known mirrors (kept frequently up to date); the
+  first is the official archive site, currently in Australia.  All are
+  available by anonymous FTP.  The major sites keep test versions in
+  the 'testing' subdirectory: such up-to-the-minute development
+  versions should only be retrieved if you actually plan to help test
+  the latest version of the shell.  The following list also appears
+  on the WWW at url(http://www.zsh.org)(http://www.zsh.org) .
+
+  description(
+    mydit(Home site) url(ftp://ftp.zsh.org)(ftp://ftp.zsh.org)
+    mydit(Australia) url(ftp://ftp.ips.gov.au/mirror/zsh/)
+(ftp://ftp.ips.gov.au/mirror/zsh/)
+    mydit(Denmark)   url(ftp://sunsite.auc.dk/pub/unix/shells/zsh)
+(ftp://sunsite.auc.dk/pub/unix/shells/zsh)
+    mydit(Finland)   url(ftp://ftp.funet.fi/pub/unix/shells/zsh/)
+(ftp://ftp.funet.fi/pub/unix/shells/zsh/)
+    mydit(France)    url(ftp://ftp.cenatls.cena.dgac.fr/pub/shells/zsh/)
+(ftp://ftp.cenatls.cena.dgac.fr/pub/shells/zsh/)
+    mydit(Germany)   url(ftp://ftp.fu-berlin.de/pub/unix/shells/zsh/)
+(ftp://ftp.fu-berlin.de/pub/unix/shells/zsh/)
+    mydit()          url(ftp://ftp.gmd.de/packages/zsh/)
+(ftp://ftp.gmd.de/packages/zsh/)
+    mydit()          url(ftp://ftp.uni-trier.de/pub/unix/shell/zsh/)
+(ftp://ftp.uni-trier.de/pub/unix/shell/zsh/)
+    mydit(Hungary)   url(ftp://ftp.cs.elte.hu/pub/zsh/)
+(ftp://ftp.cs.elte.hu/pub/zsh/)
+    mydit()          (also url(http://www.cs.elte.hu/pub/zsh/)
+                   (http://www.cs.elte.hu/pub/zsh/) )
+    mydit(Israel)    \
+url(ftp://ftp.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
+(ftp://ftp.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
+    mydit()          \
+url(http://www.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
+(http://www.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
+    mydit(Japan)     url(ftp://ftp.tohoku.ac.jp/mirror/zsh/)
+(ftp://ftp.tohoku.ac.jp/mirror/zsh/)
+    mydit()          url(ftp://ftp.nis.co.jp/pub/shells/zsh/)
+(ftp://ftp.nis.co.jp/pub/shells/zsh/)
+    mydit(Norway)    url(ftp://ftp.uit.no/pub/unix/shells/zsh/)
+(ftp://ftp.uit.no/pub/unix/shells/zsh/)
+    mydit(Romania)   url(ftp://ftp.roedu.net/pub/mirrors/ftp.zsh.org/pub/zsh/)
+(ftp://ftp.roedu.net/pub/mirrors/ftp.zsh.org/pub/zsh/)
+    mydit(Slovenia)  url(ftp://ftp.siol.net/pub/unix/shells/zsh/)
+(ftp://ftp.siol.net/pub/unix/shells/zsh/)
+    mydit(Sweden)    url(ftp://ftp.lysator.liu.se/pub/unix/zsh/)
+(ftp://ftp.lysator.liu.se/pub/unix/zsh/)
+    mydit(UK)        url(ftp://ftp.net.lut.ac.uk/zsh/)
+(ftp://ftp.net.lut.ac.uk/zsh/)
+    mydit()          (also by FSP at port 21)
+    mydit()          url(ftp://src.doc.ic.ac.uk/packages/unix/shells/zsh/)
+(ftp://src.doc.ic.ac.uk/packages/unix/shells/zsh/)
+    mydit(USA)       url(ftp://ftp.math.gatech.edu/pub/zsh/)
+(ftp://ftp.math.gatech.edu/pub/zsh/)
+    mydit()          url(ftp://uiarchive.uiuc.edu/pub/packages/shells/zsh/)
+(ftp://uiarchive.uiuc.edu/pub/packages/shells/zsh/)
+    mydit()          url(ftp://ftp.sterling.com/zsh/)
+(ftp://ftp.sterling.com/zsh/)
+    mydit()          url(ftp://ftp.rge.com/pub/shells/zsh/)
+(ftp://ftp.rge.com/pub/shells/zsh/)
+  )
+
+  The Windows port mentioned above is maintained separately by email(Amol
+  Deshpande <amold@microsoft.com>); please mail Amol directly about any
+  Windows-specific problems.  This is quite new, so don't expect it to
+  be perfect.  You can get it from:
+
+  description(
+    mydit()        url(ftp://ftp.blarg.net/users/amol/zsh)
+(ftp://ftp.blarg.net/users/amol/zsh)  
+  )
+
+  Likewise the OS/2 port is available from email(TAMURA Kent
+  <kent@tril.ibm.co.jp>) at
+
+  description(
+    mydit()        url(http://cgi.din.or.jp/~tkent/tmp/zsh-3.0.0-os2-a01.zip)
+(http://cgi.din.or.jp/~tkent/tmp/zsh-3.0.0-os2-a01.zip)
+  )
+
+  Starting from mid-October 1997, there is an archive of patches sent
+  to the maintainers' mailing list.  Note that these may not all be
+  added to the shell, and some may already have been; you simply have
+  to search for something you might want which is not in the version
+  you have.  Also, there may be some prerequisites earlier in the
+  archive.  It can be found on the zsh WWW pages (as described in
+  link(1.1)(11)) at:
+
+  description(
+    mydit()        url(http://sunsite.auc.dk/zsh/Patches/)
+(http://sunsite.auc.dk/zsh/Patches/)
+  )
+     
+sect(I don't have root access: how do I make zsh my login shell?)
+
+  Unfortunately, on many machines you can't use mytt(chsh) to change your
+  shell unless the name of the shell is contained in /etc/shells, so if
+  you have your own copy of zsh you need some sleight-of-hand to use it
+  when you log on.  (Simply typing mytt(zsh) is not really a solution since
+  you still have your original login shell waiting for when you exit.)
+
+  The basic idea is to use mytt(exec <zsh-path>) to replace the current
+  shell with zsh.  Often you can do this in a login file such as .profile 
+  (if your shell is sh or ksh) or .login (if it's csh).  Make sure you
+  have some way of altering the file (e.g. via FTP) before you try this as
+  mytt(exec) is often rather unforgiving. 
+
+  If you have zsh in a subdirectory mytt(bin) of your home directory,
+  put this in .profile:
+  verb(
+    [ -f $HOME/bin/zsh ] && exec $HOME/bin/zsh -l
+  )
+  or if your login shell is csh or tcsh, put this in .login:
+  verb(
+    if ( -f ~/bin/zsh ) exec ~/bin/zsh -l
+  )
+  (in each case the mytt(-l) tells zsh it is a login shell).
+
+  If you want to check this works before committing yourself to it,
+  you can make the login shell ask whether to exec zsh.  The following
+  work for Bourne-like shells:
+  verb(
+    [ -f $HOME/bin/zsh ] && {
+            echo "Type Y to run zsh: \c"
+            read line
+            [ "$line" = Y ] && exec $HOME/bin/zsh -l
+    }
+  )
+  and for C-shell-like shells:
+  verb(
+    if ( -f ~/bin/zsh ) then
+            echo -n "Type Y to run zsh: "
+            if ( "$<" == Y ) exec ~/bin/zsh -l
+    endif
+  )
+
+
+  It's not a good idea to put this (even without the -l) into .cshrc,
+  at least without some tests on what the csh is supposed to be doing,
+  as that will cause _every_ instance of csh to turn into a zsh and
+  will cause csh scripts (yes, unfortunately some people write these)
+  which do not call `csh -f' to fail.  If you want to tell xterm to
+  run zsh, change the SHELL environment variable to the full path of
+  zsh at the same time as you exec zsh (in fact, this is sensible for
+  consistency even if you aren't using xterm).  If you have to exec
+  zsh from your .cshrc, a minimum safety check is mytt(if ($?prompt) exec
+  zsh).
+
+  If you like your login shell to appear in the process list as mytt(-zsh),
+  you can link mytt(zsh) to mytt(-zsh) (e.g. by mytt(ln -s ~/bin/zsh 
+  ~/bin/-zsh)) and change the exec to mytt(exec -zsh).  (Make sure
+  mytt(-zsh) is in your path.) This has the same effect as the mytt(-l)
+  option. 
+
+  Footnote: if you DO have root access, make sure zsh goes in
+  /etc/shells on all appropriate machines, including NIS clients, or you
+  may have problems with FTP to that machine.
+
+
+chapter(How does zsh differ from...?)
+
+As has already been mentioned, zsh is most similar to ksh, while many
+of the additions are to please csh users.  Here are some more detailed
+notes.  See also the article `UNIX shell differences and how to change
+your shell' posted frequently to the USENET group comp.unix.shell.
+
+sect(Differences from sh and ksh)
+label(21)
+
+  Most features of ksh (and hence also of sh) are implemented in zsh;
+  problems can arise because the implementation is slightly different.
+  Note also that not all ksh's are the same either.  I have based this
+  on the 11/16/88f version of ksh; differences from ksh93 will be more
+  substantial.
+
+  As a summary of the status:
+  enumerate(
+  myeit() because of all the options it is not safe to assume a general
+     zsh run by a user will behave as if sh or ksh compatible;
+  myeit() invoking zsh as sh or ksh (or if either is a symbolic link to
+     zsh) sets appropriate options and improves compatibility (from
+     within zsh itself, calling mytt(ARGV0=sh zsh) will also work);
+  myeit() from version 3.0 onward the degree of compatibility with sh
+     under these circumstances is very high:  zsh can now be used
+     with GNU configure or perl's Configure, for example;
+  myeit() the degree of compatibility with ksh is also high, but a few
+     things are missing:  for example the more sophisticated
+     pattern-matching expressions are different for versions before
+     3.1.3 --- see the detailed list below;
+  myeit() also from 3.0, the command `emulate' is available: `emulate
+     ksh' and `emulate sh' set various options as well as changing the
+     effect of single-letter option flags as if the shell had been
+     invoked with the appropriate name.  Including the commands
+     `emulate sh; setopt localoptions' in a shell function will
+     turn on sh emulation for that function only.
+   )
+
+  The classic difference is word splitting, discussed in link(3.1)(31); this
+  catches out very many beginning zsh users.  As explained there, this
+  is actually a bug in every other shell.  The answer is to set
+  SH_WORD_SPLIT for backward compatibility.  The next most classic
+  difference is that unmatched glob patterns cause the command to
+  abort; set NO_NOMATCH for those.
+
+  Here is a list of various options which will increase ksh
+  compatibility, though maybe decrease zsh's abilities: see the manual
+  entries for GLOB_SUBST, IGNORE_BRACES (though brace expansion occurs
+  in some versions of ksh), KSH_ARRAYS, KSH_GLOB, KSH_OPTION_PRINT,
+  LOCAL_OPTIONS, NO_BAD_PATTERN, NO_BANG_HIST, NO_EQUALS, NO_HUP,
+  NO_NOMATCH, NO_RCS, NO_SHORT_LOOPS, PROMPT_SUBST, RM_STAR_SILENT,
+  POSIX_BUILTINS, SH_FILE_EXPANSION, SH_GLOB, SH_OPTION_LETTERS,
+  SH_WORD_SPLIT (see question link(3.1)(31)) and SINGLE_LINE_ZLE.
+  Note that you can also disable any built-in commands which get in
+  your way.  If invoked as `ksh', the shell will try and set suitable
+  options.
+
+  Here are some differences from ksh which might prove significant for
+  ksh programmers, some of which may be interpreted as bugs; there
+  must be more.  Note that this list is deliberately rather full and
+  that most of the items are fairly minor.  Those marked `*' perform
+  in a ksh-like manner if the shell is invoked with the name `ksh', or
+  if `emulate ksh' is in effect.  Capitalised words with underlines
+  refer to shell options. 
+
+  itemize(
+  it() Syntax:
+  itemize(
+    it()* Shell word splitting: see question link(3.1)(31).
+    it()* Arrays are (by default) more csh-like than ksh-like:
+        subscripts start at 1, not 0; tt(array[0]) refers to tt(array[1]);
+        mytt($array) refers to the whole array, not tt($array[0]);
+        braces are unnecessary: tt($a[1] == ${a[1]}), etc.
+        The KSH_ARRAYS option is now available.
+    it()  Coprocesses are established by mytt(coproc); mytt(|&) behaves like
+        csh.  Handling of coprocess file descriptors is also different.
+    it()  In mytt(cmd1 && cmd2 &), only mytt(cmd2) instead of the whole
+        expression is run in the background in zsh.  The manual implies
+        this is a bug.  Use mytt({ cmd1 && cmd2 } &) as a workaround.
+  )
+  it() Command line substitutions, globbing etc.:
+  itemize(
+    it()* Failure to match a globbing pattern causes an error (use
+        NO_NOMATCH).
+    it()* The results of parameter substitutions are treated as plain text:
+        mytt(foo="*"; print $foo) prints all files in ksh but mytt(*) in zsh.
+        (GLOB_SUBST has been added to fix this.)
+    it()  The backslash in tt($(echo '\$x')) is treated differently:  in \
+ksh, it
+        is not stripped, in zsh it is.  (The tt(`...`) form gives the same in
+        both shells.)
+    it()* tt($PSn) do not do parameter substitution by default (use \
+PROMPT_SUBST).
+    it()* Standard globbing does not allow ksh-style `pattern-lists'.
+        Equivalents:
+  verb(
+----------------------------------------------------------------------
+      ksh             zsh          Meaning
+      -----           -----        ---------
+     !(foo)            ^foo        Anything but foo.
+                or   foo1~foo2     Anything matching foo1 but foo2[1].
+@(foo1|foo2|...)  (foo1|foo2|...)  One of foo1 or foo2 or ...
+     ?(foo)           (foo|)       Zero or one occurrences of foo.
+     *(foo)           (foo)#       Zero or more occurrences of foo.
+     +(foo)           (foo)##      One or more occurrences of foo.
+----------------------------------------------------------------------
+      )
+      The mytt(^), mytt(~) and mytt(#) (but not mytt(|))forms require \
+EXTENDED_GLOB.
+      From version 3.1.3, the ksh forms are fully supported when the
+      option KSH_GLOB is in effect; for previous versions you
+      must use the table above.
+
+      [1] Note that mytt(~) is the only globbing operator to have a lower
+        precedence than mytt(/).  For example, mytt(**/foo~*bar*) matches any
+        file in a subdirectory called mytt(foo), except where mytt(bar)
+        occurred somewhere in the path (e.g. mytt(users/barstaff/foo) will
+        be excluded by the mytt(~) operator).  As the mytt(**) operator cannot
+        be grouped (inside parentheses it is treated as mytt(*)), this is
+        the way to exclude some subdirectories from matching a mytt(**).
+    it()  Unquoted assignments do file expansion after mytt(:)s (intended for
+        PATHs). 
+    it()  mytt(integer) does not allow mytt(-i).
+    it()  mytt(typeset) and mytt(integer) have special behaviour for
+        assignments in ksh, but not in zsh.  For example, this doesn't
+        work in zsh:
+  verb(
+          integer k=$(wc -l ~/.zshrc)
+      )
+        because the return value from tt(wc) includes leading
+        whitespace which causes wordsplitting.  Ksh handles the
+        assignment specially as a single word.
+  )
+  it() Command execution:
+  itemize(
+    it()* There is no tt($ENV) variable (use tt(/etc/zshrc), tt(~/.zshrc); 
+        note also tt($ZDOTDIR)).
+    it()  tt($PATH) is not searched for commands specified
+        at invocation without -c.
+  )
+  it() Aliases and functions:
+  itemize(
+    it()  The order in which aliases and functions are defined is significant:
+        function definitions with () expand aliases -- see question \
+link(2.3)(23).
+    it()  Aliases and functions cannot be exported.
+    it()  There are no tracked aliases: command hashing replaces these.
+    it()  The use of aliases for key bindings is replaced by `bindkey'.
+    it()* Options are not local to functions (use LOCAL_OPTIONS; note this
+        may always be unset locally to propagate options settings from a
+        function to the calling level).
+  )
+    it() Traps and signals:
+  itemize(
+    it()  Traps are not local to functions.
+    it()  TRAPERR has become TRAPZERR (this was forced by UNICOS which
+        has SIGERR).
+  )
+  it() Editing:
+  itemize(
+    it()  The options tt(emacs), tt(gmacs), tt(viraw) are not supported.
+        Use bindkey to change the editing behaviour: mytt(set -o {emacs,vi})
+        becomes mytt(bindkey -{e,v}); for gmacs, go to emacs mode and use
+        mytt(bindkey \^t gosmacs-transpose-characters).
+    it()  The mytt(keyword) option does not exist and mytt(-k) is instead
+        interactivecomments.  (mytt(keyword) will not be in the next ksh
+        release either.)
+    it()  Management of histories in multiple shells is different:
+        the history list is not saved and restored after each command.
+    it()  mytt(\) does not escape editing chars (use mytt(^V)).
+    it()  Not all ksh bindings are set (e.g. mytt(<ESC>#); try mytt(<ESC>q)).
+    it()* mytt(#) in an interactive shell is not treated as a comment by
+        default. 
+  )
+  it() Built-in commands:
+  itemize(
+    it()  Some built-ins (tt(r), tt(autoload), tt(history), tt(integer) ...)
+        were aliases in ksh. 
+    it()  There is no built-in command newgrp: use e.g. mytt(alias
+        newgrp="exec newgrp")
+    it()  mytt(jobs) has no mytt(-n) flag.
+    it()  mytt(read) has no mytt(-s) flag.
+  )
+  it() Other idiosyncrasies:
+  itemize(
+    it()  mytt(select) always redisplays the list of selections on each loop.
+  )
+  )
+
+
+sect(Similarities with csh)
+
+  Although certain features aim to ease the withdrawal symptoms of csh
+  (ab)users, the syntax is in general rather different and you should
+  certainly not try to run scripts without modification.  The c2z script
+  is provided with the source (in Misc/c2z) to help convert .cshrc
+  and .login files; see also the next question concerning aliases,
+  particularly those with arguments.
+
+  Csh-compatibility additions include:
+  itemize(
+  it()  tt(logout), tt(rehash), tt(source), tt((un)limit) built-in commands.
+  it()  tt(*rc) file for interactive shells.
+  it()  Directory stacks.
+  it()  tt(cshjunkie*), tt(ignoreeof) options.
+  it()  The CSH_NULL_GLOB option.
+  it()  tt(>&), tt(|&) etc. redirection.
+      (Note that mytt(>file 2>&1) is the standard Bourne shell command for
+      csh's mytt(>&file).)
+  it()  tt(foreach ...) loops; alternative syntax for other loops.
+  it()  Alternative syntax mytt(if ( ... ) ...), though this still doesn't
+      work like csh: it expects a command in the parentheses.  Also
+      mytt(for), mytt(which).
+  it()  tt($PROMPT) as well as tt($PS1), tt($status) as well as tt($?),
+      tt($#argv) as well as tt($#), .... 
+  it()  Escape sequences via tt(%) for prompts.
+  it()  Special array variables tt($PATH) etc. are colon-separated, tt($path)
+      are arrays.
+  it()  tt(!)-type history (which may be turned off via mytt(setopt
+      nobanghist)).
+  it()  Arrays have csh-like features (see under link(2.1)(21)).
+  )
+
+
+sect(Why do my csh aliases not work?  (Plus other alias pitfalls.))
+label(23)
+
+  First of all, check you are using the syntax
+  verb(
+    alias newcmd='list of commands'
+  )
+  and not
+  verb(
+    alias newcmd 'list of commands'
+  )
+  which won't work. (It tells you if `newcmd' and `list of commands' are
+  already defined as aliases.)
+
+  Otherwise, your aliases probably contain references to the command
+  line of the form mytt(\!*), etc.  Zsh does not handle this behaviour as it
+  has shell functions which provide a way of solving this problem more
+  consistent with other forms of argument handling.  For example, the
+  csh alias
+  verb(
+    alias cd 'cd \!*; echo $cwd'
+  )
+  can be replaced by the zsh function,
+  verb(
+    cd() { builtin cd $*; echo $PWD; }
+  )
+  (the `builtin' tells zsh to use its own `cd', avoiding an infinite loop)
+  or, perhaps better,
+  verb(
+    cd() { builtin cd $*; print -D $PWD; }
+  )
+  (which converts your home directory to a tt(~)).  In fact, this problem is
+  better solved by defining the special function chpwd() (see the manual).
+  Note also that the mytt(;) at the end of the function is optional in zsh,
+  but not in ksh or sh (for sh's where it exists).
+
+  Here is Bart Schaefer's guide to converting csh aliases for zsh.
+
+  SETCOUNTER(XXenumcounter)(0)
+  enumerate(
+  myeit() If the csh alias references "parameters" (tt(\!:1), tt(\!*) etc.),
+     then in zsh you need a function (referencing tt($1), tt($*) etc.).
+     Otherwise, you can use a zsh alias.
+
+  myeit() If you use a zsh function, you need to refer _at_least_ to
+     tt($*) in the body (inside the tt({ })).  Parameters don't magically
+     appear inside the tt({ }) the way they get appended to an alias.
+
+  myeit() If the csh alias references its own name (tt(alias rm "rm -i")),
+     then in a zsh function you need the "command" keyword
+     (function tt(rm() { command rm -i $* })), but in a zsh alias
+     you don't (tt(alias rm="rm -i")).
+
+  myeit() If you have aliases that refer to each other (tt(alias ls "ls -C";
+     alias lf "ls -F" ==> lf == ls -C -F)) then you must either:
+  itemize(
+        it() convert all of them to zsh functions; or
+        it() after converting, be sure your .zshrc defines all of your
+           aliases before it defines any of your functions.
+         )
+
+     Those first four are all you really need, but here are four more for
+     heavy csh alias junkies:
+
+  myeit() Mapping from csh alias "parameter referencing" into zsh function
+     (assuming shwordsplit and ksharrays are NOT set in zsh):
+       verb(
+      csh             zsh
+     =====         ==========
+     \!*           $*              (or $argv)
+     \!^           $1              (or $argv[1])
+     \!:1          $1
+     \!:2          $2              (or $argv[2], etc.)
+     \!$           $*[$#]          (or $argv[$#], or $*[-1])
+     \!:1-4        $*[1,4]
+     \!:1-         $*[1,$#-1]      (or $*[1,-2])
+     \!^-          $*[1,$#-1]
+     \!*:q         "$@"            ($*:q doesn't work (yet))
+     \!*:x         $=*             ($*:x doesn't work (yet))
+        )
+
+  myeit() Remember that it is NOT a syntax error in a zsh function to
+     refer to a position (tt($1), tt($2), etc.) greater than the number of
+     parameters. (E.g., in a csh alias, a reference to tt(\!:5) will
+     cause an error if 4 or fewer arguments are given; in a zsh
+     function, tt($5) is the empty string if there are 4 or fewer
+     parameters.)
+
+  myeit() To begin a zsh alias with a - (dash, hyphen) character, use
+     mytt(alias --):
+      verb(
+             csh                            zsh
+        ===============             ==================
+        alias - "fg %-"             alias -- -="fg %-"
+      )
+
+  myeit() Stay away from mytt(alias -g) in zsh until you REALLY know what
+     you're doing.
+  )
+
+  There is one other serious problem with aliases: consider
+  verb(
+    alias l='/bin/ls -F'
+    l() { /bin/ls -la $* | more }
+  )
+  mytt(l) in the function definition is in command position and is expanded
+  as an alias, defining mytt(/bin/ls) and mytt(-F) as functions which call
+  mytt(/bin/ls), which gets a bit recursive.  This can be avoided if you use
+  mytt(function) to define a function, which doesn't expand aliases.  It is
+  possible to argue for extra warnings somewhere in this mess.  Luckily,
+  it is not possible to define mytt(function) as an alias.
+
+  Bart Schaefer's rule is:  Define first those aliases you expect to
+  use in the body of a function, but define the function first if the
+  alias has the same name as the function.
+
+
+sect(Similarities with tcsh)
+
+  (The sections on csh apply too, of course.)  Certain features have
+  been borrowed from tcsh, including tt($watch), tt(run-help), tt($savehist),
+  tt($histlit), periodic commands etc., extended prompts, tt(sched)
+  and tt(which) built-ins.  Programmable completion was inspired by,
+  but is entirely different to, tcsh's mytt(complete).  (There is a perl
+  script called tt(lete2ctl) in the Misc directory of the source
+  distribution to convert mytt(complete) to mytt(compctl) statements.)
+  This list is not definitive:  some features have gone in the other
+  direction. 
+
+  If you're missing the editor function tt(run-fg-editor), try something
+  with mytt(bindkey -s) (which binds a string to a keystroke), e.g.
+  verb(
+    bindkey -s '^z' '\eqfg %$EDITOR:t\n'
+  )
+  which pushes the current line onto the stack and tries to bring a job
+  with the basename of your editor into the foreground.  mytt(bindkey -s)
+  allows limitless possibilities along these lines.  You can execute
+  any command in the middle of editing a line in the same way,
+  corresponding to tcsh's mytt(-c) option:
+  verb(
+    bindkey -s '^p' '\eqpwd\n'
+  )
+  In both these examples, the mytt(\eq) saves the current input line to
+  be restored after the command runs; a better effect with multiline
+  buffers is achieved if you also have
+  verb(
+    bindkey '\eq' push-input
+  )
+  to save the entire buffer.
+
+
+sect(Similarities with bash)
+
+  The Bourne-Again Shell, bash, is another enhanced Bourne-like shell;
+  the most obvious difference from zsh is that it does not attempt to
+  emulate the Korn shell.  Since both shells are under active
+  development it is probably not sensible to be too specific here.
+  Broadly, bash has paid more attention to standards compliancy
+  (i.e. POSIX) for longer, and has so far avoided the more abstruse
+  interactive features (programmable completion, etc.) that zsh has.
+
+
+sect(Shouldn't zsh be more/less like ksh/(t)csh?)
+
+  People often ask why zsh has all these `unnecessary' csh-like features,
+  or alternatively why zsh doesn't understand more csh syntax.  This is
+  far from a definitive answer and the debate will no doubt continue.
+
+  Paul's object in writing zsh was to produce a ksh-like shell which
+  would have features familiar to csh users.  For a long time, csh was
+  the preferred interactive shell and there is a strong resistance to
+  changing to something unfamiliar, hence the additional syntax and
+  CSH_JUNKIE options.  This argument still holds.  On the other hand,
+  the arguments for having what is close to a plug-in replacement for ksh
+  are, if anything, even more powerful:  the deficiencies of csh as a
+  programming language are well known (look in any Usenet FAQ archive, e.g.
+    url(http://www.cis.ohio-state.edu/hypertext/faq/usenet/unix-faq/\ 
+        shell/csh-whynot/faq.html)
+(http://www.cis.ohio-state.edu/hypertext/faq/usenet/unix-faq/shell/csh-whynot/faq.html)
+  if you are in any doubt) and zsh is able to run many standard
+  scripts such as /etc/rc.
+
+  Of course, this makes zsh rather large and feature-ridden so that it
+  seems to appeal mainly to hackers.  The only answer, perhaps not
+  entirely satisfactory, is that you have to ignore the bits you don't
+  want.  The introduction of loadable in modules in version 3.1 should
+  help.
+
+
+chapter(How to get various things to work)
+
+sect(Why does mytt($var) where mytt(var="foo bar") not do what I expect?)
+label(31)
+
+  In most Bourne-shell derivatives, multiple-word variables such as
+  verb(
+    var="foo bar"
+  )
+  are split into words when passed to a command or used in a mytt(for foo in
+  $var) loop.  By default, zsh does not have that behaviour: the
+  variable remains intact.  (This is not a bug!  See below.)  An option
+  (SHWORDSPLIT) exists to provide compatibility.
+
+  For example, defining the function args to show the number of its
+  arguments:
+  verb(
+    args() { echo $#; }
+  )
+  and with our definition of `var',
+  verb(
+    args $var
+  )
+  produces the output `1'.  After
+  verb(
+    setopt shwordsplit
+  )
+  the same function produces the output `2', as with sh and ksh.
+
+  Unless you need strict sh/ksh compatibility, you should ask yourself
+  whether you really want this behaviour, as it can produce unexpected
+  effects for variables with entirely innocuous embedded spaces.  This
+  can cause horrendous quoting problems when invoking scripts from
+  other shells.  The natural way to produce word-splitting behaviour
+  in zsh is via arrays.  For example,
+  verb(
+    set -A array one two three twenty
+  )
+  (or
+  verb(
+    array=(one two three twenty)
+  )
+  if you prefer), followed by
+  verb(
+    args $array
+  )
+  produces the output `4', regardless of the setting of SHWORDSPLIT.
+  Arrays are also much more versatile than single strings.  Probably
+  if this mechanism had always been available there would never have
+  been automatic word splitting in scalars, which is a sort of
+  uncontrollable poor man's array.
+
+  Note that this happens regardless of the value of the internal field
+  separator, tt($IFS); in other words, with mytt(IFS=:; foo=a:b; args $foo)
+  you get the answer 1.
+
+  Other ways of causing word splitting include a judicious use of
+  `eval':
+  verb(
+    sentence="Longtemps, je me suis couch\\'e de bonne heure."
+    eval "words=($sentence)"
+  )
+  after which $words is an array with the words of $sentence (note
+  characters special to the shell, such as the mytt(') in this example,
+  must already be quoted), or, less standard but more reliable,
+  turning on SHWORDSPLIT for one variable only:
+  verb(
+    args ${=sentence}
+  )
+  always returns 8 with the above definition of mytt(args).  (In older
+  versions of zsh, tt(${=foo}) toggled SHWORDSPLIT; now it forces it on.)
+
+  Note also the tt("$@") method of word splitting is always available in zsh
+  functions and scripts (though strictly this does array splitting, not
+  word splitting).
+
+  SHWORDSPLIT is set when zsh is invoked with the names `ksh' or `sh',
+  or (entirely equivalent) when mytt(emulate ksh) or mytt(emulate sh) is in
+  effect.
+
+
+sect(What is the difference between `export' and the ALL_EXPORT option?)
+
+  Normally, you would put a variable into the environment by using
+  mytt(export var).  The command mytt(setopt allexport) causes all
+  variables which are subsequently set (N.B. not all the ones which
+  already exist) to be put into the environment.
+
+  This may seem a useful shorthand, but in practice it can have
+  unhelpful side effects:
+  SETCOUNTER(XXenumcounter)(0)
+  enumerate(
+  myeit() Since every variable is in the environment as well as remembered
+     by the shell, the memory for it needs to be allocated twice.
+     This is bigger as well as slower.
+  myeit() It really is mybf(every) variable which is exported, even loop
+     variables in mytt(for) loops.  This is probably a waste.
+  myeit() An arbitrary variable created by the user might have a special
+     meaning to a command.  Since all shell variables are visible to
+     commands, there is no protection against this.
+  )
+  For these reasons it is usually best to avoid ALL_EXPORT unless you
+  have a specific use for it.  One safe use is to set it before
+  creating a list of variables in an initialisation file, then unset
+  it immediately afterwards.  Only those variables will be automatically
+  exported.
+
+
+sect(How do I turn off spelling correction/globbing for a single command?)
+
+  In the first case, you presumably have mytt(setopt correctall) in an
+  initialisation file, so that zsh checks the spelling of each word in
+  the command line.  You probably do not want this behaviour for
+  commands which do not operate on existing files.
+
+  The answer is to alias the offending command to itself with
+  mytt(nocorrect) stuck on the front, e.g.
+  verb(
+    alias mkdir='nocorrect mkdir'
+  )
+
+  To turn off globbing, the rationale is identical:
+  verb(
+    alias mkdir='noglob mkdir'
+  )
+  You can have both tt(nocorrect) and tt(noglob), if you like, but the
+  tt(nocorrect) must come first, since it is needed by the line editor,
+  while tt(noglob) is only handled when the command is examined.
+
+  Note also that a shell function won't work: the no... directives must
+  be expanded before the rest of the command line is parsed.
+
+
+sect(How do I get the meta key to work on my xterm?)
+label(34)
+
+  As stated in the manual, zsh needs to be told about the meta key by
+  using mytt(bindkey -me) or mytt(bindkey -mv) in your .zshrc or on the
+  command line.  You probably also need to tell the terminal driver to
+  allow the `meta' bit of the character through; mytt(stty pass8) is the
+  usual incantation.  Sample .zshrc entry:
+  verb(
+    [[ $TERM = "xterm" ]] && stty pass8 && bindkey -me
+  )
+  or, on SYSVR4-ish systems without pass8,
+  verb(
+    [[ $TERM = "xterm" ]] && stty -parenb -istrip cs8 && bindkey -me
+  )
+  (disable parity detection, don't strip high bit, use 8-bit characters).
+  Make sure this comes myem(before) any bindkey entries in your .zshrc which
+  redefine keys normally defined in the emacs/vi keymap.
+
+  You don't need the mytt(bindkey) to be able to define your own sequences
+  with the meta key, though you still need the mytt(stty).
+
+
+sect(How do I automatically display the directory in my xterm title bar?)
+
+  You should use the special function mytt(chpwd), which is called when
+  the directory changes.  The following checks that standard output is
+  a terminal, then puts the directory in the title bar if the terminal
+  is an tt(xterm) or a tt(sun-cmd).
+  
+  verb(
+  chpwd() {
+    [[ -t 1 ]] || return
+    case $TERM in
+      sun-cmd+CHAR(41) print -Pn "\e]l%~\e\\"
+        ;;
+      xterm+CHAR(41) print -Pn "\e]2;%~\a"
+        ;;
+    esac
+  }
+  )
+
+  Change mytt(%~) if you want the message to be different.  (The mytt(-P)
+  option interprets such sequences just like in prompts, in this case
+  producing the current directory; you can of course use mytt($PWD) here,
+  but that won't use the mytt(~) notation which I find clearer.)  Note that
+  when the tt(xterm) starts up you will probably want to call tt(chpwd)
+  directly: just put mytt(chpwd) in tt(.zshrc) after it is defined or \
+  autoloaded.
+
+
+sect(How do I make the completion list use eight bit characters?)
+
+  A traditional UNIX environment (character terminal and ASCII
+  character sets) is not sufficient to be able to handle non-ASCII
+  characters, and there are so many possible enhancements that in
+  general this is hard.  However, if you have something like an xterm
+  using a standard character set like ISO-8859-1 (which is often the
+  default for xterm), read on.  You should also note question
+  link(3.4)(34) on the subject of eight bit characters.
+
+  You are probably creating files with names including non-ASCII
+  accented characters, and find they show up in the completion list as
+  verb(\M-i) or something such.  This is because the library routines
+  (not zsh itself) which test whether a character is printable have
+  replied that it is not; zsh has simply found a way to show them
+  anyway.
+
+  The answer, under a modern POSIXy operating system, is to find a
+  locale where these are treated as printable characters.  Zsh has
+  handling for locales built in and will recognise when you set a
+  relevant variable. You need to look in /usr/lib/locale to find one
+  which suits you; the subdirectories correspond to the locale names.
+  The simplest possibility is likely to be en_US, so that the simplest
+  answer to your problem is to set
+
+  verb(
+    LC_CTYPE=en_US
+  )
+
+  when your terminal is capable of showing eight bit characters.  If
+  you only have a default domain (called C), you may need to have some
+  additional files installed on your system.
+
+
+sect(Why do the cursor (arrow) keys not work?)
+
+  The cursor keys send different codes depending on the terminal; zsh
+  only binds the most well known versions.  If you see these problems,
+  try putting the following in your tt(.zshrc):
+
+  verb(
+    bindkey "$(echotc kl)" backward-char
+    bindkey "$(echotc kr)" forward-char
+    bindkey "$(echotc ku)" up-line-or-history
+    bindkey "$(echotc kd)" down-line-or-history
+  )
+  
+  If you use vi mode, use mytt(vi-backward-char) and mytt(vi-forward-char)
+  where appropriate.
+
+  Note, however, that up to version 3.0 binding arbitrary multiple key
+  sequences can cause problems, so check that this works with your set
+  up first.  Also, from version 3.1.3, more sequences are supported by
+  default, namely those in the form mytt(<ESC>O) followed by tt(A),
+  tt(B), tt(C) or tt(D), as well as the corresponding set beginning
+  mytt(<ESC>[), so this may be redundant.
+
+
+sect(Why does my terminal act funny in some way?)
+
+  If you are using an OpenWindows cmdtool as your terminal, any
+  escape sequences (such as those produced by cursor keys) will be
+  swallowed up and never reach zsh.  Either use shelltool or avoid
+  commands with escape sequences.  You can also disable scrolling from
+  the cmdtool pane menu (which effectively turns it into a shelltool).
+  If you still want scrolling, try using an xterm with the scrollbar
+  activated.
+
+  If that's not the problem, and you are using stty to change some tty
+  settings, make sure you haven't asked zsh to freeze the tty settings:
+  type
+  verb(
+    ttyctl -u
+  )
+  before any stty commands you use.
+
+  On the other hand, if you aren't using stty and have problems you may
+  need the opposite:  mytt(ttyctl -f) freezes the terminal to protect it
+  from hiccups introduced by other programmes (kermit has been known to
+  do this).
+
+  If myem(that)'s not the problem, and you are having difficulties with
+  external commands (not part of zsh), and you think some terminal
+  setting is wrong (e.g. tt(^V) is getting interpreted as `literal next
+  character' when you don't want it to be), try
+  verb(
+    ttyctl -u
+    STTY='lnext "^-"' commandname
+  )
+  (in this example), or just export STTY for all commands to see.  Note
+  that zsh doesn't reset the terminal completely afterwards: just the
+  modes it uses itself and a number of special processing characters
+  (see the tt(stty(1)) manual page).
+
+  At some point there may be an overhaul which allows the terminal
+  modes used by the shell to be modified separately from those seen by
+  external programmes.  This is partially implemented already: from 2.5,
+  the shell is less susceptible to mode changes inherited from
+  programmes than it used to be.
+
+
+sect(Why does zsh not work in an Emacs shell mode any more?)
+
+  (This information comes from Bart Schaefer and other zsh-workers.)
+
+  Emacs 19.29 or thereabouts stopped using a terminal type of "emacs"
+  in shell buffers, and instead sets it to "dumb".  Zsh only kicks in
+  its special I'm-inside-emacs initialization when the terminal type
+  is "emacs".
+
+  Probably the most reliable way of dealing with this is to look for
+  the environment variable mytt($EMACS), which is set to mytt(t) in
+  Emacs' shell mode.  Putting
+  verb(
+    [[ $EMACS = t ]] && unsetopt zle
+  )
+  in your .zshrc should be sufficient.
+
+  Another method is to put
+  verb(
+    #!/bin/sh
+    TERM=emacs exec zsh
+  )
+  into a file ~/bin/eshell, then mytt(chmod +x ~/bin/eshell), and
+  tell emacs to use that as the shell by adding
+  verb(
+    (setenv "ESHELL" "~/bin/eshell")
+  )
+  to ~/.emacs.
+
+
+sect(Why do my autoloaded functions not autoload [the first time]?)
+
+  The problem is that there are two possible ways of autoloading a
+  function (see the AUTOLOADING FUNCTIONS section of the zsh manual
+  page zshmisc for more detailed information):
+  SETCOUNTER(XXenumcounter)(0)
+  enumerate(
+  myeit() The file contains just the body of the function, i.e.
+     there should be no line at the beginning saying mytt(function foo {)
+     or mytt(foo () {), and consequently no matching mytt(}) at the end.
+     This is the traditional zsh method.  The advantage is that the
+     file is called exactly like a script, so can double as both.
+     To define a function mytt(xhead () { print -n "\033]2;$*\a"; }),
+     the file would just contain mytt(print -n "\033]2;$*\a").  
+  myeit() The file contains the entire definition, and maybe even
+     other code:  it is run when the function needs to be loaded, then
+     the function itself is called up.  This is the method in ksh.
+     To define the same function mytt(xhead), the whole of the
+     usual definition should be in the file.
+  )
+
+  In old versions of zsh, before 3.0, only the first behaviour was
+  allowed, so you had to make sure the file found for autoload just
+  contained the function body.  You could still define other functions
+  in the file with the standard form for definitions, though they
+  would be redefined each time you called the main function.
+
+  In version 3.0.x, the second behaviour is activated if the file
+  defines the autoloaded function.  Unfortunately, this is
+  incompatible with the old zsh behaviour which allowed you to
+  redefine the function when you called it.
+
+  From version 3.1, there is an option KSHAUTOLOAD to allow full ksh
+  compatiblity, i.e. the function myem(must) be in the second form
+  above.  If that is not set, zsh tries to guess which form you are
+  using:  if the file contains only a complete definition of the
+  function in the second form, and nothing else apart from comments
+  and whitespace, it will use the function defined in the file;
+  otherwise, it will assume the old behaviour.  The option is set
+  if mytt(emulate ksh) is in effect, of course.
+  
+  (A neat trick to autoload all functions in a given directory is to
+  include a line like mytt(autoload ~/fns/*(:t)) in .zshrc; the bit in
+  parentheses removes the directory part of the filenames, leaving
+  just the function names.)
+
+
+sect(How does base arithmetic work?)
+
+  The ksh syntax is now understood, i.e.
+  verb(
+    let 'foo = 16#ff'
+  )
+  or equivalently
+  verb(
+    (( foo = 16#ff ))
+  )
+  or even
+  verb(
+    foo=$[16#ff]
+  )
+  (note that `foo=$((16#ff))' is now supported).  The original syntax was
+  verb(
+    (( foo = [16]ff ))
+  )
+  --- this was based on a misunderstanding of the ksh manual page.  It
+  still works but its use is deprecated.  Then
+  verb(
+    echo $foo
+  )
+  gives the answer `255'.  It is possible to declare variables explicitly
+  to be integers, via
+  verb(
+    typeset -i foo
+  )
+  which has a different effect: namely the base used in the first
+  assignment (hexadecimal in the example) is subsequently used whenever
+  `foo' is displayed (although the internal representation is unchanged).
+  To ensure foo is always displayed in decimal, declare it as
+  verb(
+    typeset -i 10 foo
+  )
+  which requests base 10 for output.  You can change the output base of an
+  existing variable in this fashion.  Using the mytt($(( ... ))) method will
+  always display in decimal.
+
+
+sect(How do I get a newline in my prompt?)
+
+  You can place a literal newline in quotes, i.e.
+  verb(
+    PROMPT="Hi Joe,
+    what now?%# "
+  )
+  If you have the bad taste to set the option cshjunkiequotes, which
+  inhibits such behaviour, you will have to bracket this with
+  mytt(unsetopt cshjunkiequotes) and mytt(setopt cshjunkiequotes), or put it
+  in your tt(.zshrc) before the option is set.
+
+  Arguably the prompt code should handle `print'-like escapes.  Feel
+  free to write this :-CHAR(41).  Otherwise, you can use
+  verb(
+    PROMPT=$(print "Hi Joe,\nwhat now?%# ")
+  )
+  in your initialisation file.
+
+
+sect(Why does mytt(bindkey ^a command-name) or mytt(stty intr ^-) do something funny?)
+
+  You probably have the extendedglob option set in which case tt(^) and tt(#)
+  are metacharacters.  tt(^a) matches any file except one called tt(a), so the
+  line is interpreted as bindkey followed by a list of files.  Quote the
+  tt(^) with a backslash or put quotation marks around tt(^a).
+
+
+sect(Why can't I bind tt(\C-s) and tt(\C-q) any more?)
+
+  The control-s and control-q keys now do flow control by default,
+  unless you have turned this off with mytt(stty -ixon) or redefined the
+  keys which control it with mytt(stty start) or mytt(stty stop).  (This is
+  done by the system, not zsh; the shell simply respects these
+  settings.)  In other words, tt(\C-s) stops all output to the terminal,
+  while tt(\C-q) resumes it.
+
+  There is an option NO_FLOW_CONTROL to stop zsh from allowing flow
+  control and hence restoring the use of the keys: put mytt(setopt
+  noflowcontrol) in your tt(.zshrc) file.
+
+
+sect(How do I execute command mytt(foo) within function mytt(foo)?)
+
+  The command mytt(command foo) does just that.  You don't need this with
+  aliases, but you do with functions.  Note that error messages like
+  verb(
+    zsh: job table full or recursion limit exceeded
+  )
+  are a good sign that you tried calling `foo' in function `foo' without
+  using `command'.  If mytt(foo) is a builtin rather than an external
+  command, use mytt(builtin foo) instead.
+
+
+sect(Why do history substitutions with single bangs do something funny?)
+
+  If you have a command like "tt(echo !-2:$ !$)", the first history
+  substitution then sets a default to which later history substitutions
+  with single unqualified bangs refer, so that !$ becomes equivalent to
+  tt(!-2:$).  The option CSH_JUNKIE_HISTORY makes all single bangs refer
+  to the last command.
+
+
+sect(Why does zsh kill off all my background jobs when I logout?)
+
+  Simple answer: you haven't asked it not to.  Zsh (unlike [t]csh) gives
+  you the option of having background jobs killed or not: the mytt(nohup)
+  option exists if you don't want them killed.  Note that you can always
+  run programs with mytt(nohup) in front of the pipeline whether or not the
+  option is set, which will prevent that job from being killed on
+  logout.  (mytt(nohup) is actually an external command.)
+
+  The mytt(disown) builtin is very useful in this respect: if zsh informs
+  you that you have background jobs when you try to logout, you can
+  mytt(disown) all the ones you don't want killed when you exit.  This is
+  also a good way of making jobs you don't need the shell to know about
+  (such as commands which create new windows) invisible to the shell.
+  Likewise, you can start a background job with mytt(&!) instead of just
+  mytt(&) at the end, which will automatically disown the job.
+
+
+sect(How do I list all my history entries?)
+
+  Tell zsh to start from entry 1: mytt(history 1).  Those entries at the
+  start which are no longer in memory will be silently omitted.
+
+
+sect(How does the alternative loop syntax, e.g. mytt(while {...} {...}) \
+work?)
+
+  Zsh provides an alternative to the traditional sh-like forms with mytt(do),
+  verb(
+    while TEST; do COMMANDS; done
+  )
+  allowing you to have the COMMANDS delimited with some other command
+  structure, often mytt({...}).  The rules are quite complicated and
+  in most scripts it is probably safer --- and certainly more
+  compatible --- to stick with the sh-like rules.  If you are
+  wondering, the following is a rough guide.
+
+  To make it work you must make sure the TEST itself is clearly
+  delimited.  For example, this works:
+  verb(
+    while (( i++ < 10 )) { echo i is $i; }
+  )
+  but this does myem(not):
+  verb(
+    while let "i++ < 10"; { echo i is $i; }   # Wrong!
+  )
+  The reason is that after mytt(while), any sort of command list is valid.
+  This includes the whole list mytt(let "i++ < 10"; { echo i $i; });
+  the parser simply doesn't know when to stop.  Furthermore, it is
+  wrong to miss out the semicolon, as this makes the mytt({...}) part
+  of the argument to mytt(let).  A newline behaves the same as a
+  semicolon, so you can't put the brace on the next line as in C.
+
+  So when using this syntax, the test following the mytt(while) must
+  be wrapped up:  any of mytt(((...))), mytt([[...]]), mytt({...}) or
+  mytt((...)) will have this effect.  (They have their usual syntactic
+  meanings too, of course; they are not interchangeable.)  Note that
+  here too it is wrong to put in the semicolon, as then the case
+  becomes identical to the preceding one:
+  verb(
+    while (( i++ < 10 )); { echo i is $i; }   # Wrong!
+  )
+
+  The same is true of the mytt(if) and mytt(until) constructs:
+  verb(
+    if { true } { echo yes } else { echo no }
+  )
+  but with mytt(for), which only needs a list of words, you can get
+  away with it:
+  verb(
+    for foo in a b; { echo foo is $a; bar=$foo; }
+  )
+  since the parser knows it only needs everything up to the first
+  semicolon. For the same reason, there is no problem with the mytt(repeat),
+  mytt(case) or mytt(select) constructs; in fact, mytt(repeat) doesn't even
+  need the semicolon since it knows the repeat count is just one word.
+
+  This is independent of the behaviour of the SHORTLOOPS option (see
+  manual), which you are in any case encouraged even more strongly not
+  to use in programs as it can be very confusing.
+
+
+sect(Why is my history not being saved?)
+
+  In zsh, you need to set three variables to make sure your history is
+  written out when the shell exits.  For example,
+  verb(
+    HISTSIZE=200
+    HISTFILE=~/.zsh_history
+    SAVEHIST=200
+  )
+  tt($HISTSIZE) tells the shell how many lines to keep internally,
+  tt($HISTFILE) tells it where to write the history, and tt($SAVEHIST),
+  the easiest one to forget, tells it how many to write out.  The
+  simplest possibility is to set it to the same as tt($HISTSIZE) as
+  above.  There are also various options affecting history; see the
+  manual.
+
+
+chapter(The mysteries of completion)
+
+Programmable completion using the `compctl' command is one of the most
+powerful, and also potentially confusing, features of zsh; here I give
+a short introduction.  There is a set of example completions supplied
+with the source in Misc/compctl-examples; completion definitions for
+many of the most obvious commands can be found there.
+
+sect(What is completion?)
+
+  `Completion' is where you hit a particular command key (TAB is the
+  standard one) and the shell tries to guess the word you are typing
+  and finish it for you --- a godsend for long file names, in
+  particular, but in zsh there are many, many more possibilities than
+  that.
+
+  There is also a related process, `expansion', where the shell sees
+  you have typed something which would be turned by the shell into
+  something else, such as a variable turning into its value ($PWD
+  becomes /home/users/mydir) or a history reference (!! becomes
+  everything on the last command line).  In zsh, when you hit TAB it
+  will look to see if there is an expansion to be done; if there is,
+  it does that, otherwise it tries to perform completion.  (You can
+  see if the word would be expanded --- not completed --- by TAB by
+  typing mytt(\C-x g), which lists expansions.)  Expansion is generally
+  fairly intuitive and not under user control; for the rest of the
+  chapter I will discuss completion only.
+
+
+sect(What sorts of things can be completed?)
+label(42)
+
+  The simplest sort is filename completion, mentioned above.  Unless
+  you have made special arrangements, as described below, then after
+  you type a command name, anything else you type is assumed by the
+  completion system to be a filename.  If you type part of a word and
+  hit TAB, zsh will see if it matches the first part a file name and
+  if it does it will automatically insert the rest.
+
+  The other simple type is command completion, which applies
+  (naturally) to the first word on the line.  In this case, zsh
+  assumes the word is some command to be executed lying in your $PATH
+  (or something else you can execute, like a builtin command, a
+  function or an alias) and tries to complete that.
+
+  Other forms of completion have to be set up by special arrangement.
+  See the manual entry for compctl for a list of all the flags:  you
+  can make commands complete variable names, user names, job names,
+  etc., etc.
+
+  For example, one common use is that you have an array variable,
+  tt($hosts), which contains names of other machines you use frequently on
+  the network:
+  verb(
+    hosts=(fred.ph.ku.ac.uk snuggles.floppy-bunnies.com here.there.edu)
+  )
+  then you can tell zsh that when you use telnet (or ftp, or ...), the
+  argument will be one of those names:
+  verb(
+    compctl -k hosts telnet ftp ...
+  )
+  so that if you type mytt(telnet fr) and hit TAB, the rest of the name
+  will appear by itself.
+
+  An even more powerful option to tt(compctl) (tt(-g)) is to tell zsh that
+  only certain sorts of filename are allowed.  The argument to tt(-g) is
+  exactly like a glob pattern, with the usual wildcards mytt(*), mytt(?), etc.
+  In the compctl statement it needs to be quoted to avoid it being
+  turned into filenames straight away.  For example,
+  verb(
+    compctl -g '*.(ps|eps)' ghostview
+  )
+  tells zsh that if you type TAB on an argument after a ghostview
+  command, only files ending in mytt(.ps) or mytt(.eps) should be considered
+  for completion.
+
+  A useful addition for zsh from version 3.1 is directory completion:
+  verb(
+    compctl -/ cd
+  )
+  Before, you had to use tt(-g), but this is neater: it takes care of
+  things like ignoring directories beginning with a dot unless you've
+  typed the dot yourself, and whole directory paths are understood.
+
+  Note that flags may be combined; if you have more than one, all the
+  possible completions for all of them are put into the same list, all
+  of them being possible completions.  So
+  verb(
+    compctl -k hosts -f rcp
+  )
+  tells zsh that rcp can have a hostname or a filename after it.  (You
+  really need to be able to handle host:file, which is where
+  programmable completion comes in, see link(4.5)(45).)  Also, from
+  version 3.1 you can always handle directories at the same time as
+  other files just by adding tt(-/) to the list.
+
+
+sect(How does zsh deal with ambiguous completions?)
+
+  Often there will be more than one possible completion: two files
+  start with the same characters, for example.  Zsh has a lot of
+  flexibility for what it does here via its options.  The default is
+  for it to beep and completion to stop until you type another
+  character.  You can type tt(\C-D) to see all the possible completions.
+  (That's assuming your at the end of the line, otherwise tt(\C-D) will
+  delete the next character and you have to use tt(ESC-\C-D).)  This can be
+  changed by the following options, among others:
+  itemize(
+   it() with nobeep set, that annoying beep goes away
+   it() with nolistbeep, beeping is only turned off for ambiguous completions
+   it() with autolist set, when the completion is ambiguous you get a
+      list without having to type tt(\C-D)
+   it() with listambigous, this is modified so that nothing is listed if
+      there is an unambiguous prefix or suffix to be inserted
+   it() with menucomplete set, one completion is always inserted
+      completely, then when you hit TAB it changes to the next, and so
+      on until you get back to where you started
+   it() with automenu, you only get the menu behaviour when you hit TAB
+      again on the ambiguous completion.
+   it() Finally, although it affects all completion lists, including
+      those explicitly requested, note also alwayslastprompt, which
+      causes the cursor to return to the line you were editing after
+      printing the list, provided that is short enough.
+  )
+  Combinations of these are possible; for example, autolist and
+  automenu together give an intuitive combination.  Note that
+  from version 3.1 listambiguous is set by default; if you use
+  autolist, you may well want to `unsetopt listambiguous'.
+
+
+sect(How do I complete in the middle of words / just what's before the cursor?)
+
+  Sometimes you have a word on the command-line (let's stick to file
+  names) which is incomplete in the middle.  Normally if you hit tab
+  in zsh, it will simply go to the end of the word and try to complete
+  there.  However, there are two ways of changing this.
+
+  First, there is the option COMPLETE_IN_WORD.  This tries to fill in
+  the word at the point of the cursor.  For example, if the current
+  directory contains mytt(foobar), then with the option set, you can
+  complete mytt(fbar) to mytt(foobar) by moving the cursor to the
+  mytt(b) and hitting tab.
+
+  That's not the full story, however.  Sometimes you just want the
+  part of the word before the cursor completed.  For example, the word
+  is mytt(/usr/loc/b), which you want to complete to mytt(/usr/local/bin).
+  Normally, zsh won't do this in one go because there are two bits
+  missing (but see below!), so you need to complete the mytt(/usr/loc)
+  on its own first.  For this you need the function
+  tt(expand-or-complete-prefix): it works mostly like the usual
+  function bound to tab, but it ignores anything on the right of the
+  cursor.  If you always want this behaviour (some other shells do
+  this), bind it to tab; otherwise put another binding, e.g. mytt(^X
+  TAB) in tt(~/.zshrc):
+  verb(
+    bindkey "^X^I" expand-or-complete-prefix
+  )
+  then in the example you can move to just after mytt(/usr/loc), hit
+  whatever key you've just bound, move to the end, and hit tab.
+  (Note that AUTO_REMOVE_SLASH behaviour applies here, see the manual.)
+
+  Even that doesn't exhaust the possibilities.  Included with the
+  source distribution is the file tt(Functions/multicomp), a function
+  which you can bind as an alternative form of default completion (see
+  below for a description of alternative completion), e.g.
+  verb(
+    compctl -D -f + -U -Q -K multicomp
+  )
+  and whole sequences of directories, like mytt(/usr/loc/b) or even
+  mytt(/u/l/b) can be completed in one go.  It works best with
+  menucompletion if the result is ambiguous.
+
+
+sect(How do I get started with programmable completion?)
+label(45)
+
+  Finally, the hairiest part of completion.  It is possible to get zsh
+  to consider different completions not only for different commands,
+  but for different words of the same command, or even to look at
+  other words on the command line (for example, if the last word was a
+  particular flag) and decide then.
+
+  There are really two sorts of things to worry about.  The simpler is
+  alternative completion:  that just means zsh will try one
+  alternative, and only if there are no possible completions try the
+  next.  For example
+  verb(
+    compctl -g '*.ps' + -f lpr
+  )
+  says that after lpr you'd prefer to find only mytt(.ps) files, so if
+  there are any, only those are used, but if there aren't any, any
+  old file is a possibility.  You can also have a tt(+) with no flags
+  after it, which tells zsh that it's to treat the command like any
+  other if nothing was found.  That's only really useful if your
+  default completion is fancy, i.e. you have done something with
+  mytt(compctl -D) to tell zsh how commands which aren't specially handled
+  are to have their arguments completed.
+
+  The second sort is the hard one.  Following a mytt(-x), zsh expects that
+  the next thing will be some completion code, which is a single
+  letter followed by an argument in square brackets.  For example
+  mytt(p[1]): mytt(p) is for position, and the argument tells it to look at
+  position 1; that says that this completion only applies to the word
+  immediately after the command.  You can also say mytt(p[1,3]) which says
+  the completion only applies to the word if it's between the first
+  and third words, inclusive, after the command, and so on.  See the
+  list in the `compctl' manual entry for a list of these conditions:
+  some conditions take one argument in the square brackets, some two.
+  Usually, negative numeric arguments count backwards from the end
+  (for example, mytt(p[-1]) applies to the last word on the line).
+
+  (Note the difference in the ways mytt(+) and mytt(-x) work.  A mytt(+)
+  completion will always try and find completions for what's before
+  the mytt(+) first; it will only produce a list for what's after if
+  the first list was empty.  On the other hand, if a condition for a
+  mytt(-x) matches, the appropriate set of completions is always used,
+  even if the list of completions produced is empty.)
+
+  The condition is then followed by the flags as usual (as in link(4.2)(42)),
+  and possibly other condition/flag sets following a single -; the
+  whole lot ends with a double -- before the command name.  In other
+  words, each extended completion section looks like this:
+  verb(
+    -x <pattern> <flags>... [ - <pattern> <flags>... ...] --
+  )
+
+  Let's look at rcp again: this assumes you've set up tt($hosts) as above.
+  This uses the mytt(n[<n>,<string>]) flag, which tells zsh to look for
+  the tt(<n>)'th occurrence of <string> in the word, ignoring anything up
+  to and including that.  We'll use it for completing the bits of
+  rcp's mytt(user@host:file) combination.  (Of course, the file name is on
+  the local machine, not mytt(host), but let's ignore that; it may still
+  be useful.)
+  COMMENT(-- note space after backslash --)
+  verb(
+    compctl -k hosts -S ':' + -f -x 'n[1,:]' -f - \ 
+          'n[1,@]' -k hosts -S ':' -- rcp
+  )
+  This means: (1) try and complete a hostname (the bit before the
+  mytt(+)), if successful add a mytt(:) (tt(-S) for suffix); (2) if that fails
+  move on to try the code after the mytt(+):  look and see if there is a
+  mytt(:) in a word (the mytt(n[1,:])); if there is, complete filenames
+  (tt(-f)) after the first of them; (3) otherwise look for an mytt(@) and
+  complete hostnames after the first of them (the mytt(n[1,@])), adding a
+  mytt(:) if successful; (4) if all else fails use the mytt(-f) before the
+  mytt(-x) and try to complete files.
+
+  So the rules for order are (1) try anything before a mytt(+) before
+  anything after it (2) try the conditions after a tt(-x) in order until
+  one succeeds (3) use the default flags before the tt(-x) if none of the
+  conditions was true.
+
+  Different conditions can also be combined.  There are three levels
+  of this (in decreasing order of precedence):
+  SETCOUNTER(XXenumcounter)(0)
+  enumerate(
+   myeit() multiple square brackets after a single condition give
+      alternatives:  for example, mytt(s[foo][bar]) says apply the
+      completion if the word begins with mytt(foo) or mytt(bar),
+   myeit() spaces between conditions mean both must match:  for example,
+      mytt(p[1] s[-]) says this completion only applies for the first word
+      after the command and only if it begins with a mytt(-),
+   myeit() commas between conditions mean either can match:  for example,
+      mytt(c[-1,-f], s[-f]) means either the previous word (-1 relative to
+      the current one) is tt(-f), or the current word begins with tt(-f) ---
+      useful to use the same completion whether or not the tt(-f) has a
+      space after it.
+  )
+  You must be careful to put the whole expression inside quotation
+  marks, so that it appears as a single argument to tt(compctl).
+
+  Here's a useless example just to show a general mytt(-x) completion.
+  verb(
+    compctl -f -x 'c[-1,-u][-1,-U] p[2], s[-u]' -u - \ 
+      'c[-1,-j]' -P % -j -- foobar
+  )
+  The way to read this is:  for command mytt(foobar), look and see if (((the
+  word before the current one is tt(-u)) or (the word before the current
+  one is tt(-U))) and (the current word is 2)) or (the current word begins
+  with tt(-u)); if so, try to complete user names.  If the word before
+  the current one is tt(-j), insert the prefix mytt(%) before the current word
+  if it's not there already and complete job names.  Otherwise, just
+  complete file names.
+
+
+sect(And if programmable completion isn't good enough?)
+
+  ...then your last resort is to write a shell function to do it for
+  you.  By combining the mytt(-U) and mytt(-K func) flags you can get
+  almost unlimited power.  The mytt(-U) tells zsh that whatever the
+  completion produces is to be used, even if it doesn't fit what's
+  there already (so that gets deleted when the completion is
+  inserted).  The mytt(-K func) tells zsh a function name.  The
+  function is passed the part of the word already typed, and can read
+  the rest of the line with mytt(read -c).  It can return a set of
+  completions via the mytt(reply) array, and this becomes the set of
+  possible completions.  The best way to understand this is to look at
+  mytt(multicomp) and other functions supplied with the zsh
+  distribution.
+
+
+chapter(The future of zsh)
+
+sect(What bugs are currently known and unfixed? (Plus recent \
+important changes))
+label(51)
+
+  Here are some of the more well-known ones, very roughly in
+  decreasing order of significance.  Many of these can also be counted
+  against differences from ksh in question link(2.1)(21); note that \
+this applies
+  to the latest beta version and that simple bugs are often fixed
+  quite quickly.  There is a file Etc/BUGS in the source distribution
+  with more detail.
+
+  itemize(
+  it() mytt(time) is ignored with builtins and can't be used with mytt({...}).
+  it() mytt(set -x) (mytt(setopt xtrace)) still has a few glitches.
+  it() Zsh's notion of the current line number (via tt($LINENO)) is
+     sometimes not well handled, particularly when using functions and traps.
+  it() In vi mode, mytt(u) can go past the original modification point.
+  it() The singlelinezle option has problems with prompts containing escapes.
+  it() The mytt(r) command does not work inside mytt($(...)) or mytt(`...`)
+     expansions.   (This is fixed in 3.1.)
+  it() mytt(typeset) handling is non-optimal, particularly with regard to
+     flags, and is ksh-incompatible in unpredictable ways. 
+  it() Nested closures in extended globbing and pattern matching, such as
+  verb(
+      [[ fofo = (fo#)# ]]
+  )
+     were not correctly handled, and there were problems with
+     complicated exclusions using mytt(^) or mytt(~).  (These
+     are fixed in version 3.1.3.)
+  )
+
+  Note that a few recent changes introduce incompatibilities (these
+  are not bugs):
+
+  Changes after zsh 3.0 (3.1.x is still currently in beta):
+  itemize(
+  it() The options ALWAYS_LAST_PROMPT (return to the line you were
+     editing after displaying completion lists) and LIST_AMBIGUOUS
+     (show matching files when there are several) are now set by
+     default.  This is in response to complaints that too many zsh
+     features are never noticed by many users.  To turn them off,
+     just put mytt(unsetopt alwayslastprompt listambiguous) in your
+     tt(.zshrc) file.
+  it() tt(history-search-{forward,backward}) now only find previous
+     lines where the first word is the same as the current one.  For
+     example, 
+    verb(
+      comp<ESC>p
+    )
+     will find lines in the history like mytt(comp -edit emacs), but not
+     mytt(compress file) any more.  For this reason, mytt(\M-n) and
+     mytt(\M-p) use tt(history-beginning-search-{forward,backward}) which
+     search for a line with the same prefix up to the cursor position.
+     It is possible to write functions which go a little closer to the
+     original behaviour; further changes are still possible.
+  it() In vi insert mode, the cursor keys no longer work.  The following
+     will bind them:
+      COMMENT(-- note space after backslash --)
+      verb(
+       bindkey -M viins '^[[D' vi-backward-char '^[[C' vi-forward-char \ 
+                      '^[[A' up-line-or-history '^[[B' down-line-or-history
+      )
+     (unless your terminal requires mytt(^[O) instead of mytt(^[[)).  The
+     rationale is that the insert mode and command mode keymaps for
+     keys with prefixes are now separate.
+  )
+
+  Changes since zsh 2.5:
+  itemize(
+  it() The left hand of an assignment is no longer substituted.  Thus,
+     mytt($1=$2) will not work.  You can use something like mytt(eval
+     "$1=\$2"), which should have the identical effect.
+  it() Signal traps established with the `trap' builtin are now called with
+     the environment of the caller, as in ksh, instead of as a new
+     function level.  Traps established as functions (e.g. mytt(TRAPINT()
+     {...})) work as before.
+  it() The NO_CLOBBER option is now -C and PRINT_EXIT_VALUE -1; they used
+     to be the other way around.  (Use of names rather than letters is
+     generally recommended.)
+  it() mytt([[) is a reserved word, hence must be separated from
+     other characters by whitespace; mytt({) and mytt(}) are also reserved
+     words if the IGNORE_BRACES option is set.
+  it() The option CSH_JUNKIE_PAREN has been removed:  csh-like code now
+     always does what it looks like it does, so mytt(if ( ... ) ...)
+     executes the code in parentheses in a subshell.  To make this
+     useful, the syntax expected after an mytt(if), etc., is less strict
+     than in other shells.
+  it() mytt(foo=*) does not perform globbing immediately on the right
+     hand side of the assignment; the old behaviour now requires the
+     option GLOB_ASSIGN.  (mytt(foo=(*)) is and has always been the
+     consistent way of doing this.)
+  it() tt(<>) performs redirection of input and output to the specified file.
+     For numeric globs, you now need tt(<->).
+  it() The command line qualifiers tt(exec), tt(noglob), tt(command), \
+     tt(-) are now
+     treated more like builtin commands:  previously they were
+     syntactically special.  This should make it easier to perform
+     tricks with them (disabling, hiding in parameters, etc.).
+  it() The pushd builtin has been rewritten for compatibility with other
+     shells.  The old behavour can be achieved with a shell function.
+  it() The current version now uses tt(~)'s for directory stack substitution
+     instead of tt(=)'s.  This is for consistency:  all other directory
+     substitution (tt(~user), tt(~name), tt(~+), ...) used a tilde, while
+     tt(=<number>) caused problems with tt(=program) substitution.
+  it() The `HISTLIT' option was broken in various ways and has been removed:
+     the rewritten history mechanism doesn't alter history lines, making
+     the option unnecessary.
+  it() History expansion is disabled in single-quoted strings, like other
+     forms of expansion -- hence exclamation marks there should not be
+     backslashed.
+  it() The mytt($HISTCHARS) variable is now mytt($histchars).  Currently both
+     are tied together for compatibility.
+  it() The PROMPT_SUBST option now performs backquote expansion -- hence
+     you should quote these in prompts.  (SPROMPT has changed as a result.)
+  it() Quoting in prompts has changed: close parentheses inside ternary
+     expressions should be quoted with a tt(%); history is now tt(%!), not
+     tt(!).  Backslashes are no longer special.
+  )
+
+
+sect(Where do I report bugs, get more info / who's working on zsh?)
+label(52)
+
+  The shell is being maintained by various (entirely self-appointed)
+  subscribers to the mailing list,
+  verb(
+    zsh-workers@math.gatech.edu
+  )
+  so mail on any issues (bug reports, suggestions, complaints...)
+  related to the development of the shell should be sent there.  If
+  you want someone to mail you directly, say so.  Most patches to zsh
+  appear there first.
+
+  Please note when reporting bugs that many exist only on certain
+  architectures, which the developers may not have access to.  In
+  this case debugging information, as detailed as possible, is
+  particularly welcome.
+
+  Two progressively lower volume lists exist, one with messages
+  concerning the use of zsh,
+  verb(
+    zsh-users@math.gatech.edu
+  )
+  and one just containing announcements:  about releases, about major
+  changes in the shell, or this FAQ, for example,
+  verb(
+    zsh-announce@math.gatech.edu
+  )
+  (posting to the last one is currently restricted).
+
+  Note that you should only join one of these lists:  people on
+  zsh-workers receive all the lists, and people on zsh-users will
+  also receive the announcements list.
+
+  The lists are handled by an automated server.  The instructions for
+  zsh-announce and zsh-users are the same as for zsh-workers: just
+  change zsh-workers to whatever in the following.
+
+  To join zsh-workers, send email to
+  verb(
+    zsh-workers-request@math.gatech.edu
+  )
+  with the mybf(subject) line (this is a change from the old list)
+  verb(
+    subscribe <your-email-address>
+  )
+  e.g.
+  verb(
+    Subject:  subscribe P.Stephenson@swansea.ac.uk
+  )
+  and you can unsubscribe in the same way.
+  The list maintainer, Richard Coleman, can be reached at
+  email(coleman@math.gatech.edu).
+
+  The list from May 1992 to May 1995 is archived in
+    url(ftp://ftp.sterling.com/zsh/zsh-list/YY-MM)
+(ftp://ftp.sterling.com/zsh/zsh-list/YY-MM)
+  where YY-MM are the year and month in digits.  More recent
+  mailings up to date are to be found at
+    url(http://www.zsh.org/mla/)(http://www.zsh.org/mla/)
+  at the main zsh archive in Australia.
+
+  Of course, you can also post zsh queries to the Usenet group
+  comp.unix.shell; if all else fails, you could even e-mail me.
+
+
+sect(What's on the wish-list?)
+
+  With version 3, the code is much cleaner than before, but still
+  bears the marks of the ages and many things could be done much
+  better with a rewrite.  A more efficient set of code for
+  lexing/parsing/execution might also be an advantage.  Volunteers are
+  particularly welcome for these tasks.
+
+  An improved line editor, with user-definable functions and binding
+  of multiple functions to keystrokes, is being developed.
+
+  itemize(
+  it() Loadable module support (will be in 3.1 but much work still needs doing).
+  it() Ksh compatibility could be improved.
+  it() Option for glob qualifiers to follow perl syntax (a traditional item).
+  it() Binding of shell functions to key strokes, accessing editing
+     buffer from functions, executing zle functions as a command:  now
+     under development for 3.1. 
+  it() Users should be able to create their own foopath/FOOPATH array/path
+     combinations.
+  )
+
+
+sect(Will zsh have problems in the year 2000?)
+
+  (This information was written by Bart Schaefer.  Note it is a
+  description of the state of affairs as seen by the developers, it is
+  not a guarantee!)
+
+  You can confirm the following by looking at the source code yourself
+  if necessary; there's no other definitive reference:
+
+  Zsh uses UNIX/POSIX time_t, timeval, and tm data types for internal
+  date manipulations.  These types either do not store year values at
+  all (for example, time_t is measured in seconds since midnight, Jan
+  1, 1970) or store them as integer types and NOT as pairs of digits.
+  Thus there can be no overflows at year 2000.  On some unix systems,
+  time_t is a 32-bit value and will overflow during the year 2038, but
+  more modern systems use a 64-bit time_t.
+
+  The only input and output of dates that zsh performs for its own use
+  is optional history time-stamping.  This is performed using time_t
+  values converted to long integers, which are either 32 or 64 bits,
+  see above.
+
+  Note, however, that zsh does provide facilities for formatted date
+  output, in particular in prompt escapes such as mytt(%W) and
+  mytt(%D) using mytt(print -P), so it's possible that scripts written
+  for zsh might employ 2-digit years.  Shell scripts should always be
+  considered separate programs and therefore evaluated individually.
+
+
+nsect(Acknowledgments:)
+
+Thanks to zsh-list, in particular Bart Schaefer, for suggestions
+regarding this document.  Zsh has been in the hands of archivists Jim
+Mattson, Bas de Bakker, Richard Coleman, Zoltan Hidvegi and Andrew
+Main, and the mailing list has been run by Peter Gray, Rick Ohnemus
+and Richard Coleman, all of whom deserve thanks.  The world is
+eternally in the debt of Paul Falstad for inventing zsh in the first
+place (though the wizzo extended completion is by Sven Wischnowsky).
+
+
+nsect(Copyright Information:)
+
+This document is copyright (C) P.W. Stephenson, 1995, 1996, 1997,
+1998. This text originates in the U.K. and the author asserts his
+moral rights under the Copyrights, Designs and Patents Act, 1988.
+
+Permission is hereby granted, without written agreement and without
+license or royalty fees, to use, copy, modify, and distribute this
+documentation for any purpose, provided that the above copyright
+notice appears in all copies of this documentation.  Remember,
+however, that this document changes monthly and it may be more useful
+to provide a pointer to it rather than the entire text.  A suitable
+pointer is "information on the Z-shell can be obtained on the World
+Wide Web at URL http://sunsite.auc.dk/zsh/".
diff --git a/Etc/FEATURES b/Etc/FEATURES
new file mode 100644
index 000000000..1953a5de1
--- /dev/null
+++ b/Etc/FEATURES
@@ -0,0 +1,74 @@
+------------
+ZSH FEATURES
+------------
+
+very close to ksh/sh grammar, with csh additions
+most features of ksh, bash, and tcsh
+can emulate ksh or POSIX sh
+81 builtins, 102 options, 162 key bindings
+short for loops, ex: for i (*.c) echo $i
+select
+shell functions
+conditional expressions (test builtin, [ ... ], and ksh-style [[ ... ]])
+global aliases (may be expanded anywhere on the line)
+directory stack access with =num
+process substitution (vi =(cmd) edits the output of cmd)
+generalized pipes (ls foo >>(cmd1) 2>>(cmd2) pipes stdout to cmd1
+  and stderr to cmd2)
+arithmetic expressions
+advanced globbing:
+  ls **/file  searches recursively for "file" in subdirectories
+  ls file<20->  matches file20, file30, file100, etc.
+  ls *.(c|pro)  matches *.c and *.pro
+  ls *(R)  matches only world-readable files
+  ls *.c~lex.c  matches all .c files except lex.c
+null command shorthands:
+  "< file" is same as "more <file"
+  "> file" is same as "cat >file"
+  ">> file" is same as "cat >>file"
+ksh-style coprocesses
+automatic file stream teeing (ls >foo >bar puts output in two places)
+chpwd() function run every time you change directory (useful for
+  updating the status line)
+job control
+csh-style history
+full vi line editing, including "c2w" and "y$" and such things
+full emacs line editing
+incremental history search
+magic-space history
+spelling correction
+array parameters
+$MACHTYPE, $VENDOR and $OSTYPE identify the host machine
+$LINENO, $RANDOM, $SECONDS, $cdpath, $COLUMNS, $fignore, $HISTCHARS, $mailpath
+$UID, $EUID, $GID, $EGID and $USERNAME can be assigned to
+with autocd option, typing a directory name by itself is the same as
+  typing "cd dirname"
+menu completion: pressing TAB repeatedly cycles through the possible matches
+incremental path hashing
+automatic process time reporting for commands that run over a certain limit
+full tcsh-style prompt substitution
+utmp login/logout reporting
+with histverify option, performing csh-style history expansions causes the
+  input line to be brought up for editing instead of being executed
+with sunkeyboardhack option, accidentally typed trailing ` characters
+  are removed from the input line (for those of you with Sun keyboards :-) )
+autoloaded functions (loaded from a file when they are first referenced)
+"cd old new" replaces "old" with "new" in directory string
+generalized argument completion, including:
+  - command name completion
+  - filename and path completion
+  - hostname completion
+  - key binding completion
+  - option completion
+  - variable name completion
+  - user-specified keyword completion
+  - anything else you can think of
+prompt on right side of screen
+directory stacks
+history datestamps and execution time records
+command scheduling (like at(1), but in the shell's context)
+tty mode freezing
+up to 9 startup files (but you only need 1 or 2)
+really 8-bit clean, and we mean it this time
+which -a cmd lists all occurrences of "cmd" in the path
+dynamically loadable binary modules
diff --git a/Etc/FTP-README b/Etc/FTP-README
new file mode 100644
index 000000000..a87bc74fc
--- /dev/null
+++ b/Etc/FTP-README
@@ -0,0 +1,61 @@
+-------------------
+FTP ARCHIVE FOR ZSH
+-------------------
+
+General
+-------
+
+README
+   You're reading it.
+
+META-FAQ
+   Information about zsh ftp sites, web sites, and mailing lists.
+
+FAQ
+   The zsh Frequently Asked Questions (FAQ) list.
+
+pubring.pgp
+   PGP keys of some major Zsh developers.
+
+MD5SUM
+   MD5 checksums of each file.
+
+Source Code
+-----------
+
+zsh.tar.gz
+   Latest production release of zsh.  Includes the source files of all
+   documentation.
+
+zsh-beta.tar.gz
+   The current development version of zsh.  Not guaranteed to be stable.
+
+zsh-*.tar.gz
+   Specific zsh versions.  If you just want the latest zsh then use
+   zsh.tar.gz or zsh-beta.tar.gz.
+
+zsh-*-*.diff.gz
+   Context diffs between releases.  Note that if you use this for
+   upgrading and you do not have the latest version of GNU autoconf
+   installed on your system you have to touch stamp.h.in and configure
+   in the main directory after applying the patches otherwise make will
+   think that these files are not up-to-date and will try to remake them.
+   Do not forget to specify the -p0 flag to patch.  Without -p0 new
+   files will be created in the current directory.
+
+old/*
+   Older zsh versions.  Of historical interest only.
+
+Documentation
+-------------
+
+zsh-doc.tar.gz
+   Pre-built Postscript, Info, DVI and HTML versions of the documentation
+   contained in the stable zsh distribution zsh.tar.gz.
+
+zsh-beta-doc.tar.gz
+   Pre-built Postscript, Info, DVI and HTML versions of the documentation
+   contained in the beta zsh distribution zsh-beta.tar.gz.
+
+zsh-*-doc.tar.gz
+   Pre-built documentation for specific zsh versions.
diff --git a/Etc/MACHINES b/Etc/MACHINES
new file mode 100644
index 000000000..303508a93
--- /dev/null
+++ b/Etc/MACHINES
@@ -0,0 +1,94 @@
+-----------------------------
+ZSH ON SPECIFIC ARCHITECTURES
+-----------------------------
+
+These are the OSes that zsh has been tried on.  If you succeed in getting
+zsh to work on an OS not listed, let us know.
+
+On all machines if you use gcc and upgrade your OS you must rebuild gcc
+after the OS upgrade.  A gcc left from a previous OS may seem to work
+but compiling more complex programs may fail mysteriously.
+
+The format of entries is thus:
+
+	Vendor: OS & version (hardware type) [zsh version tried]
+		information
+
+Machines
+--------
+
+Cray: Unicos (C90 and T90)
+	Should build `out-of-the-box'.
+
+Data General: DG/UX 5.4R3.10 MU01 (various AViiONs)
+	Should build `out-of-the-box'.
+
+DEC: Ultrix (Alpha or DECstation)
+DEC: Mach 3.0 (DECstation 5000/25)
+DEC: OSF/1 1.2, 1.3, 2.0, 3.*, DEC Unix 4.* (Alpha)
+	In OSF/1 3.x, there is apparently a bug in the header file
+	/usr/include/rpcsvc/ypclnt.h; the prototype for yp_all() has a
+	struct ypall_callback as its final argument, which should be a
+	pointer (struct ypall_callback *).  This prevents compilation of
+	one of zsh' files (zle_tricky.c).  If you can't modify the header
+	file, create a directory called `rpcsvc' in zsh's Src subdirectory
+	and put a fixed version of the header file to it before compiling.
+
+	The strip coming with gcc-2.7.2 seems to create unusable binaries.
+	This problem is not related to zsh.  If you have such problems,
+	remove the bogus strip and use /bin/strip instead.
+
+FreeBSD: FreeBSD 2.2.7 [3.1.4]
+	Should build `out-of-the-box'.
+
+HP: HP-UX 9, 10.20
+	Should build `out-of-the-box'.
+
+IBM: AIX
+	Should build `out-of-the-box'.
+
+Linux: Linux (i386) [3.1.4]
+	If you are using an early minor version of libc 5, then a bug
+	in the auto-configuration process may cause zsh to think that
+	your system doesn't support the lstat function.  If the configure
+	process reports that there is no lstat, edit config.h and change
+	HAVE_LSTAT to 1.  libc-5.2.18 or later does not have this problem.
+
+NetBSD: NetBSD 1.*
+	Should build `out-of-the-box'.
+
+Next: NextStep 3.*
+	Should build `out-of-the-box', but the zsh malloc routines are
+	not recommended.
+
+Reliant: Reliant UNIX
+	Should build `out-of-the-box'.
+
+Reliant: SINIX
+	Should build `out-of-the-box'.	There is a bad combination of
+	static and shared libraries that prevents the use of dynamic
+	linking; configure now detects this and will disable dynamic
+	linking even if you requested it.
+
+SGI: IRIX 5.1.1.1, 5.2, 5.3, 6.2, 6.3
+	Should build `out-of-the-box'.
+
+Sun: SunOS 4.1.*
+	Under 4.1.3 if yellow pages is used, username completion may cause
+	segmentation violation.  This is a bug in the shared library not
+	in zsh.  Some libc.so.1.9.* has this bug (it fails in yp_all).
+	Statically linked binaries will work if linked with libc.so.1.8.1
+	(which means that if you can get a statically linked binary
+	compiled under 4.1.2 that it will probably work).  An alternative
+	but untested solution may be to undefine HAVE_NIS in config.h.
+	This may work, but the first username completion will be _very_
+	slow (as slow as in tcsh).
+
+Sun: Solaris 2.*
+	The UCB versions of the routines for reading directories are not
+	usable (the struct definitions are incompatible with the ones
+	assumed by zsh).  The symptom of this is that globbed filenames in
+	the compiled version of zsh will be missing the first two letters.
+	To avoid this, make sure you compile zsh without any reference
+	to /usr/ucblib in your LD_LIBRARY_PATH.  You can easily do this
+	by just unsetting LD_LIBRARY_PATH before building zsh.
diff --git a/Etc/Makefile.in b/Etc/Makefile.in
new file mode 100644
index 000000000..bdb9234fd
--- /dev/null
+++ b/Etc/Makefile.in
@@ -0,0 +1,59 @@
+#
+# Makefile for Etc subdirectory
+#
+# Copyright (c) 1995-1997 Richard Coleman
+# All rights reserved.
+#
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall Richard Coleman or the Zsh Development Group be liable
+# to any party for direct, indirect, special, incidental, or consequential
+# damages arising out of the use of this software and its documentation,
+# even if Richard Coleman and the Zsh Development Group have been advised of
+# the possibility of such damage.
+#
+# Richard Coleman and the Zsh Development Group specifically disclaim any
+# warranties, including, but not limited to, the implied warranties of
+# merchantability and fitness for a particular purpose.  The software
+# provided hereunder is on an "as is" basis, and Richard Coleman and the
+# Zsh Development Group have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+#
+
+subdir = Etc
+dir_top = ..
+SUBDIRS =
+
+@@version.mk@@
+@@defs.mk@@
+
+# ========== DEPENDENCIES FOR BUILDING ==========
+
+all: FAQ
+
+FAQ: FAQ.yo
+	cd $(sdir) && $(YODL2TXT) FAQ.yo && mv -f FAQ.txt FAQ
+
+FAQ.html: FAQ.yo
+	$(YODL2HTML) $(sdir)/FAQ.yo
+
+# ========== DEPENDENCIES FOR CLEANUP ==========
+
+@@clean.mk@@
+
+mostlyclean-here:
+	rm -f FAQ.html
+
+distclean-here:
+	rm -f Makefile
+
+realclean-here:
+	rm -f FAQ
+
+# ========== DEPENDENCIES FOR MAINTENANCE ==========
+
+@@config.mk@@
diff --git a/Etc/NEWS b/Etc/NEWS
new file mode 100644
index 000000000..e4bafc08d
--- /dev/null
+++ b/Etc/NEWS
@@ -0,0 +1,203 @@
+-------------------------------------
+CHANGES FROM PREVIOUS VERSIONS OF ZSH
+-------------------------------------
+
+New features in zsh version 3.1 (beta version)
+----------------------------------------------
+
+On most operating systems zsh can load binary modules dynamically at
+run-time.  ZLE and the compctl builtin are now reside in a separate
+module which is loaded automatically on demand.
+
+for ((expr; expr; expr)) do ... done loop syntax from AT&T ksh93 is
+now supported.
+
+POSIX globbing character classes ([:alnum:] etc.) are now supported.
+
+ksh's case fall-through feature (;&) is supported.
+
+ksh93's $'' quoting syntax is supported.
+
+Restricted mode is now supported.  This is controlled by the new option
+RESTRICTED (-r).
+
+New options BARE_GLOB_QUAL, HIST_NO_FUNCTIONS (alias NO_LOG), KSH_GLOB,
+PRINT_EIGHT_BIT, PROMPT_BANG, PROMPT_PERCENT, RM_STAR_WAIT.
+
+Options ALWAYS_LAST_PROMPT, APPEND_HISTORY, AUTO_LIST, AUTO_MENU,
+AUTO_PARAM_KEYS, AUTO_PARAM_SLASH, AUTO_REMOVE_SLASH, LIST_AMBIGUOUS
+and LIST_TYPES are now on by default.
+
+In ZLE, arbitrarily many keymaps can be defined.  Multi-character
+keybindings now work.
+
+Completion can be performed within a brace expansion.
+
+EMACS-like universal-argument function.
+
+
+New features in zsh version 3.0
+-------------------------------
+
+Trailing "/" in a glob pattern now works like in other shell thus it
+can no longer be used as a sorthand for "(/)".
+
+Much improved sh/ksh emulation.  When zsh is invoked as sh it mostly
+conforms to POSIX 1003.2.
+
+Enhanced parameter expansion features: new flags: A, @, e, W, p, f, F.
+Expansions can be nested.  For example,
+"${${(M)${(f@)$(<builtin.pro)}:#char*}[2][(w)3]}" expands to the third
+word of the second line of builtin.pro which begins with char.  See
+zshexpn(1) for the details.
+
+***/foo glob does recursive directory search following symbolic links.
+
+Traps defined by the trap builtin are now executed in the current shell
+environment and not as a shell function.  This means that $1 is not set
+to the signal number.  Of course the TRAPxxx functions continue working
+as before.
+
+Traps defined by the trap builtin are reset to their default values in
+subshells.
+
+Option names can be prefixed by `no' to unset an option.
+setopt no_option_name is the same as unsetopt option_name.
+This change affects the output of the setopt and unsetopt
+builtins when these are invoked without arguments.  See
+the zshoptions manual page for more explanation.
+
+!, {, } and [[ are now reserved words.  Things like [[-z $foo]] or {foo}
+should not be used.  {foo} still works if the IGNORE_BRACES option is not
+set but this feature may be removed in the future.  [[ -z $foo ]] and
+{ foo } should be used instead.
+
+HOSTTYPE special parameter is removed.  The new OSTYPE, MACHTYPE and
+VENDOR parameters should be used instead.
+
+VERSION parameter is renamed to ZSH_VERSION
+
+exec now saves the history in interactive shells.  If you do not like this
+behaviour you can alias exec to 'unset HISTFILE ; exec'.
+
+${~spec}, ${=spec} and ${^spec} used to toggle the effect of
+globsubst/shwordsplit/rcexpandparam.  Now these force the corresponding
+option on. ~, = or ^ can be doubled to force the relevant option off for
+the substitution.
+
+Explicitly requested word splitting like ${=spec} or ${(s:delim:)spec}
+will be executed even if the substitution is double quoted.
+
+The right-hand side of assignments are no longer globbed by default hence
+assignment foo=* will assign '*' as a value of foo.  Use the foo=( * )
+array assignment syntax to get the old behaviour.  Alternatively the
+GLOB_ASSIGN can be set to emulate the old behaviour but the usage of this
+option is strongly discouraged and this option may be completely removed in
+the future.
+
+foo=$bar no longer creates an array even if bar is an array.  Use
+foo=( $bar ) or even better, foo=( "$bar[@]" ) instead.
+
+When foo is an array parameter ${#foo} will always return the length of the
+array even if the substitution is double quoted.  ${(c)#foo} should be used
+to get back the old behaviour.
+
+When the prompt_subst option is set prompts are fully expanded using
+parameter expansion, command substitution and arithmetic expansion.
+In 2.5 backquote substitution was not performed in the prompts so this
+change might cause problems in some startup scripts if ` is used literally
+in prompts.
+
+History substitution is now not performed if the history escape character
+appears in a single-quoted string.  This may break some interactive shell
+functions which use \! in single-quoted strings.
+
+The UID, EUID, GID, EGID parameters can be assigned now. The assignment
+executes the setuid(), seteuid(), setgid(), setegid() respectively.  On
+systems where setuid and seteuid is not supported these functions are
+emulated using setreuid or setresuid which may result in a different
+behaviour.
+
+Assigning the USERNAME parameter will call setuid(uid) where uid is the
+user id of the specified user.
+
+The privileged (-p) option is automatically set on invocation if euid != uid
+or egid != gid.  If this option is set no user startup files are sourced.
+The shell will drop privileges when this option is unset by resetting its
+euid to uid and its egid to gid.
+
+The =number substitution for accessing the directory stack is changed to
+~number to allow =command substitution when a command name begins with a 
+digit.
+
+<> is a redirection operator which opens the standard input for both
+reading and writing.  To match a number use <->.
+
+Option letters -1 and -C for PRINT_EXIT_VALUE and NO_CLOBBER are swapped:
+`set -C' sets NO_CLOBBER and `set -1' sets PRINT_EXIT_VALUE.
+
+AUTO_PUSHD behaviour is changed.  Now cd without arguments will always go
+to the $HOME directory even if AUTO_PUSHD is set and PUSHD_TO_HOME is not
+set.  If you preferred the old behaviour you can alias cd to pushd.
+
+IFS word splitting with SH_WORD_SPLIT and the splitting of the input in the
+read builtin has changed in cases when IFS contains characters other than
+<space>, <tab>, <newline>.  See the description of IFS in the zshparam
+manual page for more details.
+
+
+New features in zsh version 2.5
+-------------------------------
+
+Greatly expanded completion possibilities.  Programmable completion
+allows detailed control over what arguments of what commands can be
+completed to what.  See dots/zcomp in the distribution for examples.
+
+Expand filenames with ~ and = on the right hand side of parameter
+assignments.  New option MAGIC_EQUAL_SUBST to do it in all
+identifier=expression arguments.
+
+${+name} becomes 1 or 0 if name is set or unset.  ${~spec} toggles
+GLOB_SUBST in substitution.  Parameter substitution takes lots
+of flags in the format ${(flags)name}.
+
+New glob qualifiers for block/character special files, times in glob
+qualifiers can be in months, weeks, days, hours, minutes.  Qualifiers can
+work on links or on what they point to.  Qualifiers separated by commas
+are or-ed.
+
+New parameter substitution modifiers (fFwW) to repeat actions.  New
+option CSH_JUNKIE_HISTORY.
+
+New line editor functions history-beginning-search-backward,
+history-beginning-search-forward, expand-or-complete-prefix, push-input,
+push-line-or-edit.
+
+Assign to part of a string, use qualifiers on string subscription with
+$foo[(qual)2,5]
+
+New parameters: EGID, EUID, KEYTIMEOUT
+
+New prompt escape sequence %_ to get constructs like for and while in
+the secondary prompt.  %E in prompt clears to end of screen.
+
+Conditional expressions in PROMPT and WATCHFMT.
+
+New options ALWAYS_LAST_PROMPT, ALWAYS_TO_END, AUTO_PARAM_KEYS,
+COMPLETE_ALIASES, COMPLETE_IN_WORD, CSH_JUNKIE_HISTORY, GLOB_SUBST,
+LIST_AMBIGUOUS, MAGIC_EQUAL_SUBST, NO_FLOW_CONTROL, PROMPT_SUBST
+
+New option -m to many builtins makes arguments subject to pattern
+matching.
+
+Bindkey can now bind both key sequences and prefixes of those.  You can
+for example bind ESC and function keys sending ESC sequences.
+
+Additional options to read builtin to use in functions called by
+completion.
+
+New options to print to sort arguments and print them in columns.
+
+Some additional resource limits can be specified.
+
+Some editor functions now work in the minibuffer.
diff --git a/Etc/pubring.pgp b/Etc/pubring.pgp
new file mode 100644
index 000000000..526d1a66e
--- /dev/null
+++ b/Etc/pubring.pgp
@@ -0,0 +1,150 @@
+Type Bits KeyID      Created    Expires    Algorithm       Use
+pub  2048 0x8E1E1EC1 1997-05-15 ---------- RSA             Sign & Encrypt 
+uid  Andrew Main <zefram@fysh.org>
+
+pub  2048 0x0FD2FDD5 1998-04-22 ---------- RSA             Sign & Encrypt 
+uid  Geoff C. Wing <gcw@pobox.com>
+
+pub  1024 0xEE305E20 1998-04-22 ---------- DSS             Sign & Encrypt 
+sub  2048 0xB1A6D227 1998-04-22 ---------- Diffie-Hellman                 
+uid  Geoff C. Wing <mason@primenet.com.au>
+
+pub  1024 0x71FB29E1 1994-10-10 ---------- RSA             Sign & Encrypt 
+uid  Richard J. Coleman <coleman@math.gatech.edu>
+
+pub  1024 0x8B37BE3D 1995-11-20 ---------- RSA             Sign & Encrypt 
+uid  Zoltan Hidvegi <hzoli@cs.elte.hu>
+
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: PGPfreeware 5.0i for non-commercial use
+
+mQCNAzCw9pkAAAEEAKzybIrP6bvoDF7kJjTVgErU59QOsDQuQAFyPYxx9TrGST9Y
+5kVtimMFiHmOaePtLzEMlJvAqHNnYGQge2WmH7V/jC678wdTlSouBoPN/6U8qq5N
++9BsW/pVvFOEJ4vhEXdOnj5Jcmp4+M6/Tb4c/rS5SdyZPP9yhQupSCiLN749AAUR
+tCFab2x0YW4gSGlkdmVnaSA8aHpvbGlAY3MuZWx0ZS5odT6JAJUDBRAwv1zNC6lI
+KIs3vj0BAaObA/9nFIIRGrP9wlCAuxQDwqGTuNKVUeKVyzuaj9zwsUULABGITZGT
+tASMEb0X1HA2I822PZ8b6m1xj7idlwOSmCrO9gNgWr2VblynZo9LAZflwcTxr/9e
+0oC+3owLFXadg7zUrYeRc9EJrhQ299nNoqkjOZbUQtZ97xcRfoMs0brpHpkAjQMu
+mbisAAABBADshMnQari3rUDdHrxfSUlCO/nWJ4E/pcKPOnft2SUWaTC5q6IzaTUK
+FauLy0DxRSIgO3w2Cd7ynm8rwtSXIvUvJg3X+fO1lm8MwePazh3A0DQxqSV2IsXb
+I7yLq5IUWHSFIEZkQ9+hR7mi1Sx0dJ3WfnEh8LA/glkOAgIJcfsp4QAFEbQsUmlj
+aGFyZCBKLiBDb2xlbWFuIDxjb2xlbWFuQG1hdGguZ2F0ZWNoLmVkdT6JAJUDBRAw
+sPeuC6lIKIs3vj0BAZNeA/4pezBr5xMV/HX1P/u1YZMkFE/XV33svOggOUOhui0F
+m1MD64D6oofjO2j0L8cV/YWwzT+pNB0JANH67MPaeK/zPffFDeq1yVumR6jmBoWR
+L2IgTS5t2+5oC7T7lXRKu1JF0F8lY+jfDc+ZnjwL/WIcZqf0PYoLwWBcA3bES1T/
+yIkAlQMFEC8TK1KxPDjWo/GviQEBGgwEAJvnaxkio5hj4I55NSDVFlvr98OttR5C
+awR/TmWoAPUumpJ4QfErnnS7Ucv8thGRb62Mj+nF+T9/Tyj2piv1yHYPdyWqlhps
+L3oxU7WG4dqv1KrfaxvLulHyrveYTdW1BQ+WzD7tQ4DOxpCUcfTxAwZ61cAQEiVd
+JepcOUVes+SjiQCVAwUQLw9QuQ4CAglx+ynhAQGi9gQAxBOzT2OwGu7Ri9NuIk47
+BfONzb0mPIrEPG6ztKNN0h5m/VZxqKh0kQSXTk4QCt5LCBqdunZY86DJxHckHYd0
+l5Tt22gALhmJL0+pi7t6A5YOonW83LXxYlxpCPxoElxerE/gfb5xiXZ9qgL1GGvO
+HD8l8WTImMGlkGDdRqNYn0GZAaIENT3vPBEEANHaBoXO7hHxcynHhNPxG+4NvPb9
+RhINSM1t+yC9GFKWNXv4mSbGqEIcFo0jsOQQFd3m5ETMBHbFy2hwlzxOYQTSzgGO
+b5ULWJeGCYQ1tsZwAAdyFFh5hwOWiB9+KM5NXT8WcvF8KLZbvY3cFVSGJFnxtRn4
+olWhtdzMx1WRa+4/AKD/+KLMt958vS/YWxeKC+wt822GgwP+PpW2NeAHpheDoNnP
+P/wpPjuYytdc2M+XwNaq1bcxJXfrOqT6ZY1QnwxzHIeGCgZ78XR5kduRJHDkq7/X
+zYaEooCuuKZf8+raJ+egycYS/Oqc9fQitsQbvetzvGDJUIBYXrePwKpK9QxMh77+
+OeaOV8n+MjA8RA4nPWmhw7540twEAIzn42webcFtUbTWy+zXCp7fPw4lBDAXMRPZ
+D8wIjzzn4z/c9o0ypiwAjKVu5V8aWwjcVJICyvCU4H34yoUb3xFg2UL/VGa72LbY
+sccmuGdAsqkn1nCVnjV/IACVVZLfYZMBGQQdAmkKBDQ040itSse2Z3+ND9OlN1d/
+DnCGa4cwtCVHZW9mZiBDLiBXaW5nIDxtYXNvbkBwcmltZW5ldC5jb20uYXU+iQBL
+BBARAgALBQI1Pe88BAsDAQIACgkQs67qk+4wXiA3+wCfWwTNkmLlcR8amztHk6Nu
+KA4LPusAoIkx+pq8j7762htEs6tGfyscJqFGiQEVAwUQNT3vnw8wSIEP0v3VAQHs
+nQf8CzJbDpKHSYSUf12dsJdLa6ewcacf9OKVobl3EIbpNdov+1C6QgAQsWogPrcA
+z/2bzLPCJ+CilxcK4Rk4vywi8riuJm7ROEiBSsdhIDY0nBQHL4rqFFGlnq5/DzXO
+jyLmJs4X6noWKJ1rFWxPFGzy8kICuKAXuQvzX0a1VqgKgIovCgbUJJg8Et1MHZsS
+LeHhenNLAT0lNRbEyizDgxkZWvTqsmkLtlKkVxEyGjtl2l+2hSLgT6zuaSWNqQjB
+XFyo4wzQLy+zmqTEseI3bVqYVsQv8LCkLNn8dCDqysbTd1bIbOzcGIxBlZYML2a6
+MxAebh2GTfkRnJE+2fQ7Tw6GKrkCDQQ1Pe9AEAgA9kJXtwh/CBdyorrWqULzBej5
+UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt90xkhkn4DIO9ZekX1KHTUPj1
+WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcwYc58yWb/Ffm7/ZFexwGq01ue
+jaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZrM2w4DUUdD3yIsxx8Wy2O9vPJ
+I8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEstSr/POGxKUAYEY18hKcKctaG
+xAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8vYlLIhkmuquiXsNV6TILOwAC
+AggA9d0Df2yhKHDKkEejKtPIDlgaAcHMOzNekpzLwiRYv9C/mpTtbcWg4wMcP2WX
+7rbkhsqXrQdcSqGtRDR83bt2ku1wu+bWyjcXeoR5azGjl5as/0oqD9qhl0yANnia
+F+LwSrpjf8fn/Xor3TIQIOkNIUsYndVlsSws+OlWzZNsuT5leuL2ULIkf3IkkaxN
+QuoZJfb5t+MHGzTmPr+nv2aufoIsgrMkYIjRU66jfaB+8t9dec8dusXDbxYdzkMw
+rZ2FopY555yWGa35gIqlR0vLicqMVCxKlBGdVywgm88ivvRM0zIsQeKrDwjVX+72
+c6DpgGsUewyCVTcKrg6uAoxT24kAPwMFGDU970CzruqT7jBeIBEC8XoAoI+NzBGk
+7TyKFeRu6cs9QanAlxd5AKDImBDYzuBL6Emr96VkyNXTMtOPK5kBDQM1PexvAAAB
+CAC85eki1QHZQTQ10nYQ9Obu436/limVDqgCcefn7863bUFveY8uYhdB+rmd0+wa
+ltUYHWrA4e7Tt0v/2V40KDB9xQeQlU4rXVGVSg9ffzuVHhBObvzCbyAQWVRezv8S
+p4b7e/9nJSthy/Sovy/WE6svuwbiL2y3mFyYYE3z5WUCIXwpNXnTmmwyExduNtvy
+GzLhiieVsQKLFnGiRgadzJxPu3bXxomJTbqeC91s5vtTL2X5pmFNVL+jWL2O4sev
+E66XFPFdHSDnj9jnXBc051TGmemuyRsukAknXQCApRTc3nyiK8rVQP27OwEmy4rq
+xe8MgnDTWq6QiQ8wSIEP0v3VAAURtB1HZW9mZiBDLiBXaW5nIDxnY3dAcG9ib3gu
+Y29tPokBFQMFEDU97G8PMEiBD9L91QEBn74H/3e6mzIU5oIljf6Ycs00HP0MRHqh
+pSvOeDR7oHZOVJTIWy/qkQ8QxCw9zyA+GQ/zWc/Db9VlUZvdYZbnHJG19WyVB3Y/
+nVYwP6TQqq/sfgweHhFlUvRJStbGXYdTjGPWxpd6Qn+G8XwCr9/4tS23rM9VPd4I
+gMUbQH6ruCzrHI+G5BJE1IHShbK7i2RmZfdB6Yv06PpddB1BetJO77E/fwPneTvk
+A7dD3s5El2RHTM2c0Z1Jpvg8YHLrUcXmfNKXa8hD8wRRavyIoHfvPtmjHj+dt1lE
+T8B0o6bH/DPT027nT7Qo5k6rmHg3Qk1398794vhpBgwxpEC77OVUzMwOPhqJAD8D
+BRA1Pe+0s67qk+4wXiARAoXsAJ9DYXxh0GN9FbE7Z2U5beFf37BPGgCeJPVD9rSr
+gGtuca/4DEhDAGSAfn+ZAQ0DM3r8XAAAAQgApHzqec/wFmjoEDIX93y8L4fvVs13
+qzKFvdsGeTSiPAjKfEyw9rELlzAwtqWdkDUBeU6tld342GjcDCVKKY5snun1746Z
+Ui6rkjnFdPimv8fwJc6tAC4NoWerVC9bbpdsDbbzdaxf1RATmB8B81vY7+3NNegk
+WuxTBwl/QV7aS5qZ+kFpsP5ANYnjcBQeL2ejzmmLMU9ntdRa7XAHUvsUobV3bgP7
+8fdz6w+LEs5wHcD5FGBEOrmr5rk9AYErds/i2vCOKB66QrqzfXSg8AfY9CqfVn8p
+o3os/GiXtLYS86vg44S8P9Vel2ajW8kWwjQhXLxjBB422B6ZpPRnjh4ewQAFEbQd
+QW5kcmV3IE1haW4gPHplZnJhbUBmeXNoLm9yZz6JAJUDBRA0Ygop5kcdJXa50hkB
+ARugBACiuBehrCsCJ9eskOIGYijVyOkw0ds+Rl/f491CoK4At7oAQzESR4sfBKRo
+PpnCLGVen01dgshcf00lM+Yp8qrjT/BSrD58L98aaig7pBD5t5KwePjwhS+kB/tc
+41SiCsXhcuzsacqsUhhZ0SoUtD7Dq901KCrhvmSLK0DGrI+dr4kAlQMFEDRfSDpL
+2cze8VY7wQEBt0AD/06seQfvtDwduYd9xoUc9EHFmtJH1RkR4fn+KKngyKPZVUwn
+38cHa5CfbEUhF2bD0ADFHcOMiaO2k6yHT9EG3FWRyGsF6lAAlUK6NqtTymA2sFig
+R7VTbq25V4CjOFRSti8d2yeDPJ5nyj5YzTzkx0XHl2//hF6QrROIv3YYh16wiQCV
+AgUQNF9FqnCjAd4lTWyNAQGAzgQAguA8BzjPfca6TDJbuj5fQdTwEJuMHZ9asQQf
+zy43q9qHUINRy0LlyqiIEQtggQIbp20pvHtnUwBaK00y2wOToe3kprCym4NEuT/g
+wMRXGiGF2cBJzWNXWn7aNXnGp1UP1Yb9C9zHIgCApFHd8d0qzQNQONN5vYTa6BRS
+UzkCvkqJARUDBRAzhKKK1b5+4POEA70BASZqB/49jNe6xRyUe+3u3IiOiYjLRRLz
+VkyA4x9xIURHsKE3oUa0vI6wyGhQzHWFuKom9mqQKDR12T9LYoVvNi94qixTgBlD
+Fw+Tm+FfxmguQCTPgY9MRGGS6A9fuSd/kbyjn+w1HY9nVM4B2Nrn0xPQ/7uUZ0a1
+7cUBi5+jk6r9xDTfRkP7wn+LEA3rg6tNkn6apfsDyHOSHPr8GZKBdmqthAJQP6eF
+im3k6pPzv+232XyejDBlHiPloGrX4bA6C69pqazyoH4YD5knZU0gYsF6DJfRsruB
+lw9YIKj+lw6AwYRAO+2PgHjIY9sEFDuCZn2IFr/gwGSAVBRVtG9YZkA+l23ziQCV
+AwUQM4HINSV6yMkAhfdJAQFBYQQAsu0G4HUtlUM92p4qxAVjG9mmdZRmb9YNfr1G
+AQX9vgx7R2oJ+CwiGfmO1lUtvhJUQNbjZTCmF3n14/5gbJ1loOh7KUGE/wJHqeUJ
+n6ziMkpR4Rzff6LmCr5zDsW8ZjTz+B8Cfar+SFWuNbue35tFmqVOvxv724eSCb47
+aHwlMkOJAJUDBRAzg6nxc4ScsTlXuf0BAST+A/4vQUMaVFYuKyNcgOkilcSOLHYE
+g+jIlGoBBi6Khi+P0iFVUde0xr61WiSxsbTSTYLmHnGi7fQ+iqPBFzb6NuyJ4R3t
+96SiFeD3Oe3znN11gF1AtR86wc3m3cymvwrMOzfK0vkN7iudv9jkrtbk4x8JAPTL
+MfT6adD4NkFr7pZA6IkBFQMFEDOC9G+ZamtmIJq5/QEBN6wH/3isXVyHRue7uKDA
+vsGnb4GmTazwuK1lmREaZ1ZL/609VCp0zo0osrjrDsWiqnU9zve1ZHrImr3BELCG
+LrkaE+mjoK80reGc0hdQF0/mwBZrIkT8Pcncjv8vE6b9IuacWJf+S/HpFnfv+RxB
+k57A7uAOJLP1vhI/Mq9B/TARdkmqDmKcTpYGIxYjhvRPV07aD/K7fRivhNBibCgm
+n97sSBEdf4Nq3NTbByetTuktUoPEn3MpqnUjxnqrmt7HztRq96XXjz/gZdYVtI9o
+nzuP92H6YKJcCUVZMt4zzhEOw8iDsrIGfGcje5UW3qSHI6JUOTmyGCd1mzLDsqMK
+kaElcWiJAJUDBRAzgYq2TQiMTNnrYBEBAS1OBACOdN3qf88fl7bJtsZNqY6jQEQ3
+GPJrtUroP7vWSxnV8jKO2egxfAbmp+UGZoD6imoH89TU9Ny/E1/nsRWriWx4hZOJ
+hUDA4TOUOX0nhfeeC43u2t+D/v36JDjUzipWL2mGe6B8jrElgqb71gT/qgT/yV81
+wPuHDO9zih/m69p2rokBFQMFEDOAxoyGWkrM32Hp2QEBGnMIAJ4k3kL3xVOxa+bM
+5uXe57leOX6dsut4QKnrsQ862VYHhF7N4ZYQs3lv4ygLguqTZ02fcZyr6l9q102s
+87AoY8RfE/ESewepTcqLT4Dm5K7EAoRdGZ/2yWrA8fHdVGKHl7UO5IqcTLQ5AOOg
+lhAgy+GPx3UcN+EPNgLNd3pMvIG2NnBGwhP88sa4R9JfvK0eGAE9ElbTdbR6xBKn
+JneuAQPUIdO0GVgowrDfiSlupjFhW+CeKfDix3isJEnRbohNq4BawSL2aC88UOIE
+X7osbVd8nFufPlEKaN6EhaIWiixF1W3LI/wiF5HV0u3nwaN4Qy15OXjcD/7urbuQ
+cU+B2yCJAJUDBRAzgN6EolKYYFEYdpEBAZc2BAClMzFxU50TN54jp444QicsjtlS
+IioqQMchFq30WSwxkeZOE7QGAqX9pBxSoCjbK0mf2UXM/V+8dhIfl0Y/EQchNFyL
+qv01GnMiW5r/pXm4eZoMw9atpXx+kuvEO7N5VgvdrBgix3PUSX9pYHSxeNVhrV9M
+YZMzMaPoB36t1B+rkokBFQMFEDOA3nnZ/s5HNAtHpQEBXxcH/RoVXW1jg9PoJhTh
+Ab4xO95QKPILKwNGUBTdMOZbwDKFmbfjAxOU0VSJqp7U5aQeHCHsm3lLCF/4gWE/
+FDEq7goNj/COivg6egB1ZTfgBFdpHbGqQhPJgvUoh7uufPIqNej2h0Vi4JeLyyp/
+Pdw8i7lvaMRp8W8q9votJ6ma3Nm8zNOXbr7hNl9LBLNrL6928s9RCT8GbrPoZqDZ
+vs5AUhUxOuVgLmqxsw2jjQp9grqkIPsC46ANlyyGe+Iyfhnyc2EGuF0TpBSjJC8e
+uQKmLagjGaW5qBZPqnut24z2YAyPxpPffQbkKmNuy0DCYM1vMeW3/5uPvHPsIA7w
+/Tp++UiJAJUDBRAze0HFa/97sSWYQUUBAUp5A/9Ae02CVK2dTO2uNWE5V4DgFIcq
+85xTd2LFw3lWs8dP5wNCINo+FYaxhQxlj7uzE7InVSMTmO1nOlHo/SB4DmwIRSEh
+q2mZCMABjbQW1AyU0q8VRgtY3y/wfGpzeXTKNsf7ab2BkjLf63XeZcIY3UDjoJts
+XHO8K5Z8CnUu8e4HMYkAlQMFEDN6/Yxw//hyU6VP4QEBvWsD+wWXB8Xtu0DPIvoy
+ZvgjuhLcmibLcUNeD7piEh5WrXdjiUIJxwkw4X7eMqirvqCQLaKEoN6XJob+8KT9
+NCOB4ErTPGnzWM2vYApy8sra833xP3evOmN4bT5DuZpkN+RVRAGLa95RU4Q4eZnY
+MSxtEk/f09l5pWyuPvDJUCZdzYD/iQEVAwUQM3r8XJmk9GeOHh7BAQEUmAgAly7y
+5pNJBs24zzr46fGBLLwhrkzTRyhwIkgEI9cYMpRbV1E5XgqaOjS11vKnmSu+pEql
+XMJUV7MlM5p52YtaEx7C5u+WK6eK6hIP0eFi6kehuegqdRfIKfAz6aeu80Zutu/K
+i2vOA0O2+hRJnDRsqGBlx8KRQl5c8Vo2OkK8kxk+PVbbgYf5HZRF0yGxdaE4kxG2
+F14sL0DKmY99b+RPeu4v3Gz1rPz8lTetlIXaXJoFrgF8gCk+IDNB5aen69WoAQeP
+yHE6uCn6a1RC+rM8Jhv/PI/lKEQabekGYC5gP7QEIYqcmwdKTv0pzP1FY9/tmVsB
+C4+RT5QRIxKJMxXh6Q==
+=/T9G
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/Functions/.distfiles b/Functions/.distfiles
new file mode 100644
index 000000000..1aa4fbc89
--- /dev/null
+++ b/Functions/.distfiles
@@ -0,0 +1,5 @@
+DISTFILES_SRC='
+    .distfiles
+    acx cat cdmatch cdmatch2 checkmail cx harden mere multicomp proto
+    pushd randline run-help yp yu zed zls
+'
diff --git a/Functions/acx b/Functions/acx
new file mode 100755
index 000000000..f7c680bb0
--- /dev/null
+++ b/Functions/acx
@@ -0,0 +1,6 @@
+#! /bin/sh
+#
+# zsh shell function to make its arguments 755
+# also works as an sh script
+#
+chmod 755 $*
diff --git a/Functions/cat b/Functions/cat
new file mode 100644
index 000000000..612deac03
--- /dev/null
+++ b/Functions/cat
@@ -0,0 +1,16 @@
+#! /usr/local/bin/zsh -f
+
+local file
+
+if ((! ARGC)) then
+	set -- -
+fi
+
+for file
+do
+	if [[ "$file" == - ]] then
+		while read -u0ek 4096; do ; done
+	else
+		while read -u0ek 4096; do ; done < "$file"
+	fi
+done
diff --git a/Functions/cdmatch b/Functions/cdmatch
new file mode 100755
index 000000000..7c4bb9ae7
--- /dev/null
+++ b/Functions/cdmatch
@@ -0,0 +1,23 @@
+# Start of cdmatch.
+# Save in your functions directory and autoload, then do
+# compctl -x 'S[/][~][./][../]' -g '*(-/)' - \
+#         'n[-1,/], s[]' -K cdmatch -S '/' -- cd pushd
+#
+# Completes directories for cd, pushd, ... anything which knows about cdpath.
+# You do not have to include `.' in your cdpath.
+#
+# It works properly only if $ZSH_VERSION > 3.0-pre4.  Remove `emulate -R zsh'
+# for all other values of $ZSH_VERSION > 2.6-beta2. For earlier versions
+# it still works if RC_EXPAND_PARAM is not set or when cdpath is empty.
+emulate -R zsh
+setopt localoptions
+local narg pref cdp
+
+read -nc narg
+read -Ac pref
+
+cdp=(. $cdpath)
+reply=( ${^cdp}/${pref[$narg]%$2}*$2(-/DN^M:t) )
+
+return
+# End of cdmatch.
diff --git a/Functions/cdmatch2 b/Functions/cdmatch2
new file mode 100644
index 000000000..c70357a34
--- /dev/null
+++ b/Functions/cdmatch2
@@ -0,0 +1,15 @@
+# This function should be called from compctl to complete the
+# second argument of cd and pushd.
+
+emulate -R zsh				# Requires zsh 3.0-pre4 or later
+setopt localoptions
+local from
+
+read -Ac from
+from="${from[2]}"
+
+eval "reply=( \${PWD:s@$from@$1*$2@}~$PWD(ND-/:) )"
+reply=( "${${reply[@]#${PWD%%$from*}}%${PWD#*$from}}" )
+[[ ${#reply[(r),-1]} != 0 ]] && reply[(r)]="''"
+
+return
diff --git a/Functions/checkmail b/Functions/checkmail
new file mode 100644
index 000000000..9cc743db4
--- /dev/null
+++ b/Functions/checkmail
@@ -0,0 +1,26 @@
+#! /usr/local/bin/zsh
+#
+# This autoloadable function checks the folders specified as arguments
+# for new mails.  The arguments are interpeted in exactly the same way
+# as the mailpath special zsh parameter (see zshparam(1)).
+#
+# If no arguments are given mailpath is used.  If mailpath is empty, $MAIL
+# is used and if that is also empty, /var/spool/mail/$LOGNAME is used.
+# This function requires zsh-3.0.1 or newer.
+#
+
+local file message
+
+for file in "${@:-${mailpath[@]:-${MAIL:-/var/spool/mail/$LOGNAME}}}"
+do
+	message="${${(M)file%%\?*}#\?}"
+	file="${file%%\?*}"
+	if [[ -d "$file" ]] then
+		file=( "$file"/**/*(.ND) )
+		if (($#file)) then
+			checkmail "${^file}\?$message"
+		fi
+	elif test -s "$file" -a -N "$file"; then  # this also sets $_ to $file
+		print -r -- "${(e)message:-You have new mail.}"
+	fi
+done
diff --git a/Functions/cx b/Functions/cx
new file mode 100755
index 000000000..a0b34a4f0
--- /dev/null
+++ b/Functions/cx
@@ -0,0 +1,6 @@
+#! /bin/sh
+#
+# zsh shell function to make its arguments executable
+# also works as a sh script
+#
+chmod +x $*
diff --git a/Functions/harden b/Functions/harden
new file mode 100755
index 000000000..c02689362
--- /dev/null
+++ b/Functions/harden
@@ -0,0 +1,6 @@
+#! /bin/sh
+# harden a link (convert it to a singly linked file)
+cp $1 $1.foo
+rm $1
+mv $1.foo $1
+
diff --git a/Functions/mere b/Functions/mere
new file mode 100755
index 000000000..cf8d8ad14
--- /dev/null
+++ b/Functions/mere
@@ -0,0 +1,3 @@
+#! /bin/sh
+# read a man page in the current directory
+nroff -man -Tman $1 | less -s
diff --git a/Functions/multicomp b/Functions/multicomp
new file mode 100755
index 000000000..ab206de0d
--- /dev/null
+++ b/Functions/multicomp
@@ -0,0 +1,80 @@
+# multicomp() {
+# Completes all manner of files given prefixes for each path segment.
+# e.g. s/z/s -> src/zsh-2.4/src
+#
+# Usage: e.g.
+# compctl -D -f + -U -Q -S '' -K multicomp
+#
+# Note that exactly matched directories are not expanded, e.g.
+# s/zsh-2.4/s<TAB> will not expand to src/zsh-2.4old/src.
+# Will expand glob patterns already in the word, but use complete-word,
+# not TAB (expand-or-complete), or you will get ordinary glob expansion.
+# Requires the -U option to compctl.
+# Menucompletion is highly recommended for ambiguous matches.
+# Liable to screw up escaped metacharacters royally.
+# $fignore is not used: feel free to add your own bit.
+
+emulate -R zsh				# Requires zsh 3.0-pre4 or later
+local pref head sofar origtop newtop globdir="(-/)" wild
+setopt localoptions nullglob rcexpandparam globdots
+unsetopt markdirs globsubst shwordsplit nounset
+
+pref="${1}$2"
+# Hack to allow programmable completion to select multicomp after a :
+# (e.g.
+# compctl -D -f -x 's[:]' -U -Q -S '' -K multicomp
+# )
+pref="${pref#:}"
+
+sofar=('')
+reply=('')
+
+if [[ "$pref" = \~* ]]; then
+  # If the string started with ~, save the head and what it will become.
+  origtop="${pref%%/*}"
+  eval "newtop=$origtop"
+  # Save the expansion as the bit matched already
+  sofar=($newtop)
+  pref="${pref#$origtop}"
+fi
+
+while [[ -n "$pref" ]]; do
+  [[ "$pref" = /* ]] && sofar=(${sofar}/) && pref="${pref#/}"
+  head="${pref%%/*}"
+  pref="${pref#$head}"
+  if [[ -n "$pref" && -z $sofar[2] && -d "${sofar}$head" ]]; then
+    # Exactly matched directory: don't try to glob
+    reply=("${sofar}$head")
+  else
+    [[ -z "$pref" ]] && globdir=
+    # if path segment contains wildcards, don't add another.
+    if [[ "$head" = *[\[\(\*\?\$\~]* || -z "$head" ]]; then
+      wild=$head
+    else
+      # Simulate case-insensitive globbing for ASCII characters
+      wild="[${(j(][))${(s())head:l}}]*"	# :gs/a/[a]/ etc.
+      # The following could all be one expansion, but for readability:
+      wild=$wild:gs/a/aA/:gs/b/bB/:gs/c/cC/:gs/d/dD/:gs/e/eE/:gs/f/fF/
+      wild=$wild:gs/g/gG/:gs/h/hH/:gs/i/iI/:gs/j/jJ/:gs/k/kK/:gs/l/lL/
+      wild=$wild:gs/m/mM/:gs/n/nN/:gs/o/oO/:gs/p/pP/:gs/q/qQ/:gs/r/rR/
+      wild=$wild:gs/s/sS/:gs/t/tT/:gs/u/uU/:gs/v/vV/:gs/w/wW/:gs/x/xX/
+      wild=$wild:gs/y/yY/:gs/z/zZ/:gs/-/_/:gs/_/-_/:gs/[]//
+
+      # Expand on both sides of '.' (except when leading) as for '/'
+      wild="${${wild:gs/[.]/*.*/}#\*}"
+    fi
+
+    reply=(${sofar}"${wild}${globdir}")
+    reply=(${~reply})
+  fi
+
+  [[ -z $reply[1] ]] && reply=() && break
+  [[ -n $pref ]] && sofar=($reply)
+done
+
+# Restore ~'s in front if there were any.
+# There had better not be anything funny in $newtop.
+[[ -n "$origtop" ]] && reply=("$origtop"${reply#$newtop})
+
+# }
+
diff --git a/Functions/proto b/Functions/proto
new file mode 100755
index 000000000..df1826506
--- /dev/null
+++ b/Functions/proto
@@ -0,0 +1,8 @@
+#! /bin/sh
+# generate prototypes, if your style is the same as mine
+for i
+do
+	rm $i:r.pro 2>/dev/null
+	grep -v '[{};:#]' $i | grep '^[A-Za-z]' |
+		grep -v static | sed 's/$/;/' >! $i:r.pro
+done
diff --git a/Functions/pushd b/Functions/pushd
new file mode 100644
index 000000000..965c774bf
--- /dev/null
+++ b/Functions/pushd
@@ -0,0 +1,13 @@
+# pushd function to emulate the old zsh behaviour.  With this function
+# pushd +/-n just lifts the selected element to the top of the stack
+# instead of just cycling the stack.
+
+emulate -R zsh
+setopt localoptions
+
+if [[ ARGC -eq 1 && "$1" == [+-]<-> ]] then
+	setopt pushdignoredups
+	builtin pushd ~$1
+else
+	builtin pushd "$@"
+fi
diff --git a/Functions/randline b/Functions/randline
new file mode 100755
index 000000000..9af714fa2
--- /dev/null
+++ b/Functions/randline
@@ -0,0 +1,3 @@
+# get a random line from a file
+integer z=$(wc -l <$1)
+sed -n $[RANDOM%z+1]p $1
diff --git a/Functions/run-help b/Functions/run-help
new file mode 100755
index 000000000..a8109e3ea
--- /dev/null
+++ b/Functions/run-help
@@ -0,0 +1,72 @@
+#!/usr/local/bin/zsh
+#
+# Figure out where to get the best help, and get it.
+#
+# Install this function by placing it in your FPATH and then
+# adding to your .zshrc the lines:
+#	unalias run-help
+#	autoload run-help
+#
+
+emulate -R zsh
+setopt localoptions
+
+# Check whether Util/helpfiles has been used to generate zsh help
+if [[ $1 == "-l" ]]
+then
+    if [[ -n "${HELPDIR:-}" ]]
+    then
+	echo 'Here is a list of topics for which help is available:'
+	echo ""
+	print -rc $HELPDIR/*(:t)
+    else
+	echo 'There is no list of help topics available at this time'
+    fi
+    return 0
+elif [[ -n "${HELPDIR:-}" && -r $HELPDIR/$1 && $1 != compctl ]]
+then
+    ${=PAGER:-more} $HELPDIR/$1
+    return $?
+fi
+
+# No zsh help, use "whence" to figure out where else we might look
+local what places newline='
+'
+integer i=0 didman=0
+
+places=( "${(@f)$(builtin whence -va $1)}" )
+
+while ((i++ < $#places))
+do
+    what=$places[$i]
+    builtin print -r $what
+    case $what in
+    (*( is an alias)*)
+	[[ ${what[(w)6]:t} != ${what[(w)1]} ]] && run-help ${what[(w)6]:t}
+	;;
+    (*( is a * function))
+	builtin functions ${what[(w)1]} | ${=PAGER:-more}
+	;;
+    (*( is a * builtin))
+	case ${what[(w)1]} in
+	(compctl) man zshcompctl;;
+	(bindkey) man zshzle;;
+	(*setopt) man zshoptions;;
+	(*) man zshbuiltins;;
+	esac
+	;;
+    (*( is hashed to *))
+	man ${what[(w)-1]:t}
+	;;
+    (*)
+	((! didman++)) && man $1
+	;;
+    esac
+    if ((i < $#places && ! didman))
+    then
+	builtin print -nP "%SPress any key for more help or q to quit%s"
+	builtin read -k what
+	[[ $what != $newline ]] && echo
+	[[ $what == [qQ] ]] && break
+    fi
+done
diff --git a/Functions/yp b/Functions/yp
new file mode 100755
index 000000000..7e09613ef
--- /dev/null
+++ b/Functions/yp
@@ -0,0 +1,2 @@
+#! /bin/sh
+ypmatch $1 passwd
diff --git a/Functions/yu b/Functions/yu
new file mode 100755
index 000000000..3c5f170cf
--- /dev/null
+++ b/Functions/yu
@@ -0,0 +1,2 @@
+#! /bin/sh
+ypmatch $1 passwd.byuid
diff --git a/Functions/zed b/Functions/zed
new file mode 100755
index 000000000..e8e7212ef
--- /dev/null
+++ b/Functions/zed
@@ -0,0 +1,65 @@
+#
+# zed
+#
+# No other shell could do this.
+# Edit small files with the command line editor.
+# Use ^X^W to save, ^C to abort.
+# Option -f: edit shell functions.  (Also if called as fned.)
+#
+# Completion: use
+# compctl -f -x 'w[1,-f]' -F -- zed
+#
+
+local var fun cleanup
+# We do not want timeout while we are editing a file
+integer TMOUT=0
+
+[[ $1 = -f || $0 = fned ]] && fun=1
+[[ $1 = -(|-|f) ]] && shift
+
+[[ -z "$1" ]] && echo 'Usage: "zed filename" or "zed -f function"' && return 1
+
+# catch interrupts
+cleanup="$(bindkey -L "^M"; bindkey -L -M emacs "^X^W"; bindkey -aL "ZZ"
+    echo "trap - INT EXIT"; trap)"
+trap "return 130" INT
+trap "$cleanup" EXIT
+
+# don't mangle !'s
+setopt localoptions nobanghist
+
+bindkey "^M" self-insert-unmeta
+# Depending on your stty's, you may be able to use ^J as accept-line, else:
+bindkey -M emacs "^X^W" accept-line
+bindkey -a "ZZ" accept-line
+
+if ((fun)) then
+  var="$(functions $1)"
+  # If function is undefined but autoloadable, load it
+  if [[ $var = undefined* ]] then
+    local dir
+    for dir in $fpath; do
+      if [[ -f $dir/$1 ]] then
+	var="$1() {
+$(<$dir/$1)
+}"
+	break
+      fi
+    done
+  elif [[ -z $var ]] then
+    var="$1() {
+}"
+  fi
+  vared var && eval function "$var"
+else
+  [[ -f $1 ]] && var="$(<$1)"
+  while vared var
+  do
+    (print -r -- "$var" >| $1) && break
+    echo -n -e '\a'
+  done
+fi
+
+return 0
+
+# End of zed
diff --git a/Functions/zls b/Functions/zls
new file mode 100644
index 000000000..da6eff856
--- /dev/null
+++ b/Functions/zls
@@ -0,0 +1,55 @@
+# zls () {
+# simple internal ls using the stat module
+
+zmodload -i stat || return 1
+
+emulate -R zsh
+setopt localoptions
+
+local f stat opts='' L=L mod=: dirs list
+
+dirs=()
+list=()
+
+while getopts ailLFd f
+do
+    opts=$opts$f
+    if [[ $f == '?' ]] then
+	echo Usage: $0 [ -ailLFd ] [ filename ... ]
+	return 1
+    fi
+done
+shift OPTIND-1
+
+[[ $opts == *L* ]] && L=''
+[[ $opts == *F* ]] && mod=T$mod
+[[ $opts == *a* ]] && setopt globdots
+
+if ((! ARGC)) then
+    set *
+    opts=d$opts
+fi
+
+for f in $*
+do
+    stat -s$L -A stat -F "%b %e %H:%M" - $f || continue
+    if [[ $opts != *d* && $stat[3] == d* ]] then
+	dirs=( $dirs $f )
+    elif [[ $opts == *l* ]] then
+	[[ $opts == *i* ]] && print -n "${(l:7:)stat[2]} "
+	[[ -n $stat[14] ]] && f=( $f '->' $stat[14] ) || f=( $f($mod) )
+	print -r -- "$stat[3] ${(l:3:)stat[4]} ${(r:8:)stat[5]} " \
+		    "${(r:8:)stat[6]} ${(l:8:)stat[8]} $stat[10] $f"
+    else
+	f=( $f($mod) )
+	list=( "$list[@]" "${${(M)opts:%*i*}:+${(l:7:)stat[2]} }$f" )
+    fi
+done
+(($#list)) && print -cr -- "$list[@]"
+while (($#dirs)) do
+    ((ARGC > $#dirs)) && echo
+    ((ARGC > 1)) && echo $dirs[1]:
+    (cd $dirs[1] && $0 -d$opts)
+    shift dirs
+done
+# }
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 000000000..4019a16b8
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,242 @@
+--------------
+INSTALLING ZSH
+--------------
+
+Check MACHINES File
+-------------------
+
+Check the file MACHINES in the subdirectory Etc to see the architectures
+that zsh is known to compile on, as well as any special instructions
+for your particular architecture.  Most architectures will not require any
+special instructions.
+
+Configuring Zsh
+---------------
+
+To configure zsh, from the top level directory, do the command:
+    ./configure
+
+Configure accepts several options (explained below).  To display
+currently available options, do the command:
+    ./configure --help
+
+Most of the interesting configuration options can be added after running
+configure by editing the user configuration section of config.h and the
+top level Makefile.
+
+Dynamic loading
+---------------
+
+Zsh-3.1 has support for dynamically loadable modules.  To enable this run
+configure with the --enable-dynamic option.  Note that dynamic loading
+does not work on all systems.  On these systems this option will have no
+effect, so it is always safe to use --enable-dynamic.  When dynamic
+loading is enabled, major parts of zsh (including the Zsh Line Editor) are
+compiled into modules and not included into the main zsh binary.  Zsh
+autoloads these modules when they are required.  This means that you have
+to execute make install.modules before you try the newly compiled zsh
+executable.
+
+Adding more modules
+-------------------
+
+The zsh distribution contains several modules, in the Src/Builtins,
+Src/Modules and Src/Zle directories.  If you have any additional zsh
+modules that you wish to compile for this version of zsh, create another
+subdirectory of the Src directory and put them there.  You can create
+as many extra subdirectory hierarchies as you need.  The subdirectories
+must be actual directories; symbolic links will not work.
+
+If you wish to add or remove modules or module directories after you
+have already run make, then after adding or removing the modules run:
+    make prep
+
+Controlling what is compiled into the main zsh binary
+-----------------------------------------------------
+
+By default the comp1, compctl, zle, sched and rlimits modules are compiled
+into non-dynamic zsh and no modules are compiled into the main binary if
+dynamic loading is available.  This can be overridden by creating the
+Src/modules-bltin file with the list of modules which are to be compiled
+into the main binary.  See the zshmodules manual page for the list of
+available modules.
+
+Compiler Options or Using a Different Compiler
+----------------------------------------------
+
+By default, configure will use the "gcc" compiler if found.  You can use a
+different compiler, or add unusual options for compiling or linking that
+the "configure" script does not know about, by either editing the user
+configuration section of the top level Makefile (after running configure)
+or giving "configure" initial values for these variables by setting them
+in the environment.  Using a Bourne-compatible shell (such as sh,ksh,zsh),
+
+you can do that on the command line like this:
+    CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the "env" program, you can do it like this:
+    env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Check Generated Files
+---------------------
+
+Configure will probe your system and create a "config.h" header file.
+You should  check the user configuration section at the beginning of
+this include file.  You should also examine the values (determined by
+configure) of HOSTTYPE, OSTYPE, MACHTYPE, and VENDOR to make sure they
+are correct.  The value of these #defines's is used only to initialize
+the corresponding default shell parameters.  Since these shell parameters
+are only for informational purposes, you can change them to whatever
+you feel is appropriate.
+
+Also configure will create a Makefile in the top level directory as well
+as in the various subdirectories.  You should check the user configuration
+section of the top level Makefile.
+
+Compiling Zsh
+-------------
+
+After configuring, to build zsh, do the command:
+    make
+
+Installing Zsh
+--------------
+
+If no make/compilation errors occur, then to install the zsh binary, do
+the command:
+    make install.bin
+
+Any previous copy of zsh will be renamed "zsh.old"
+                   
+To install the dynamically-loadable modules, do the command:
+    make install.modules
+
+To install the zsh man page, do the command:
+    make install.man
+
+To install the zsh info files, do the command:
+    make install.info
+
+Or alternatively, you can install all the above with the command:
+    make install
+
+"make install.info" will only move the info files into the info directory.
+You will have to edit the topmost node of the info tree "dir" manually
+in order to have the zsh info files available to your info reader.
+
+Building Zsh On Additional Architectures
+----------------------------------------
+
+To build zsh on additional architectures, you can do a "make distclean".
+This should restore the zsh source distribution back to its original
+state.  You can then configure zsh as above on other architectures in
+which you wish to build zsh.  Or alternatively, you can use a different
+build directory for each architecture.
+
+Using A Different Build Directory
+---------------------------------
+
+You can compile the zsh in a different directory from the one containing
+the source code.  Doing so allows you to compile it on more than one
+architecture at the same time.  To do this, you must use a version of
+"make" that supports the "VPATH" variable, such as GNU "make".  "cd" to
+the directory where you want the object files and executables to go and
+run the "configure" script.  "configure" automatically checks for the
+source code in the directory that "configure" is in.  For example,
+
+    cd /usr/local/SunOS/zsh
+    /usr/local/src/zsh-3.0/configure
+    make
+
+Memory Routines
+---------------
+
+Included in this release are alternate malloc and associated functions
+which reduce memory usage on some systems. To use these, add the option
+  --enable-zsh-mem
+when invoking "configure".
+
+You should check Etc/MACHINES to see if there are specific recommendations
+about using the zsh malloc routines on your particular architecture.
+
+Debugging Routines
+------------------
+
+You can turn on various debugging options when invoking "configure".
+
+To turn on some extra checking in the memory management routines, you
+can use the following options when invoking "configure".
+ --enable-zsh-mem-warning      # turn on warnings of memory allocation errors
+ --enable-zsh-secure-free      # turn on memory checking of free()
+
+If you are using zsh's memory allocation routines (--enable-zsh-mem), you
+can turn on debugging of this code.  This enables the builtin "mem".
+ --enable-zsh-mem-debug        # debug zsh's memory allocators
+
+You can turn on some debugging information of zsh's internal hash tables.
+This enables the builtin "hashinfo".
+ --enable-zsh-hash-debug       # turn on debugging of internal hash tables
+
+To add some sanity checks and generate debugging information for debuggers
+you can use the following option.  This also disables optimization.
+ --enable-zsh-debug            # use it if you want to debug zsh
+
+Startup/shutdown files
+----------------------
+
+Zsh has several startup/shutdown files which are in /etc by default.  This
+can be overriden using one of the options below when invoking "configure".
+
+ --enable-etcdir=directory    # default directory for global zsh scripts
+ --enable-zshenv=pathname     # the full pathname of the global zshenv script
+ --enable-zshrc=pathname      # the full pathname of the global zshrc script
+ --enable-zlogin=pathname     # the full pathname of the global zlogin script
+ --enable-zprofile=pathname   # the full pathname of the global zprofile script
+ --enable-zlogout=pathname    # the full pathname of the global zlogout script
+
+Any startup/shutdown script can be disabled by giving the
+--disable-scriptname option to "configure".  The --disable-etcdir option
+disables all startup/shutdown files which are not explicitely enabled.
+
+
+Options For Configure
+---------------------
+
+The `configure' program accepts many options, not all of which are useful
+or relevant to zsh.  To get the complete list of configure options, run
+"./configure --help".  The following list should contain most of the
+options of interest for configuring zsh.
+
+Configuration:
+  --cache-file=FILE      # cache test results in FILE
+  --help                 # print a help message
+  --version              # print the version of autoconf that create configure
+  --quiet, --silent      # do not print `checking...' messages
+  --no-create            # do not create output files
+
+Directories:
+  --prefix=PREFIX        # install host independent files in PREFIX [/usr/local]
+  --exec-prefix=EPREFIX  # install host dependent files in EPREFIX [same as prefix]
+  --bindir=DIR           # install user executables in DIR [EPREFIX/bin]
+  --infodir=DIR          # install info documentation in DIR [PREFIX/info]
+  --mandir=DIR           # install man documentation in DIR [PREFIX/man]
+  --srcdir=DIR           # find the sources in DIR [configure dir or ..]
+
+Features:
+  --enable-FEATURE       # enable use of this feature
+  --disable-FEATURE      # disable use of this feature
+
+     The FEATURES currently supported are:
+     zsh-debug           # use it if you want to debug zsh
+     zsh-mem             # use zsh's memory allocators
+     zsh-mem-debug       # debug zsh's memory allocators
+     zsh-mem-warning     # turn on warnings of memory allocation errors
+     zsh-secure-free     # turn on memory checking of free()
+     zsh-hash-debug      # turn on debugging of internal hash tables
+     etcdir=directory    # default directory for global zsh scripts
+     zshenv=pathname     # the full pathname of the global zshenv script
+     zshrc=pathname      # the full pathname of the global zshrc script
+     zlogin=pathname     # the full pathname of the global zlogin script
+     zprofile=pathname   # the full pathname of the global zprofile script
+     zlogout=pathname    # the full pathname of the global zlogout script
+     dynamic             # allow dynamically loaded binary modules
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 000000000..c91ddcf56
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,124 @@
+#
+# Makefile for top level of zsh distribution
+#
+# Copyright (c) 1995-1997 Richard Coleman
+# All rights reserved.
+#
+# Permission is hereby granted, without written agreement and without
+# license or royalty fees, to use, copy, modify, and distribute this
+# software and to distribute modified versions of this software for any
+# purpose, provided that the above copyright notice and the following
+# two paragraphs appear in all copies of this software.
+#
+# In no event shall Richard Coleman or the Zsh Development Group be liable
+# to any party for direct, indirect, special, incidental, or consequential
+# damages arising out of the use of this software and its documentation,
+# even if Richard Coleman and the Zsh Development Group have been advised of
+# the possibility of such damage.
+#
+# Richard Coleman and the Zsh Development Group specifically disclaim any
+# warranties, including, but not limited to, the implied warranties of
+# merchantability and fitness for a particular purpose.  The software
+# provided hereunder is on an "as is" basis, and Richard Coleman and the
+# Zsh Development Group have no obligation to provide maintenance,
+# support, updates, enhancements, or modifications.
+#
+
+subdir = .
+dir_top = .
+SUBDIRS = Doc Etc Src
+
+@@version.mk@@
+@@defs.mk@@
+
+# ========== DEPENDENCIES FOR BUILDING ==========
+
+# default target
+all: config.h
+	@for subdir in Src Doc; do \
+	  (cd $$subdir && $(MAKE) $(MAKEDEFS) $@) || exit 1; \
+	done
+
+check test:
+	@echo zsh test suite not available yet
+
+# prepare module configuration
+prep:
+	@cd Src && $(MAKE) $(MAKEDEFS) $@
+
+META-FAQ: FORCE
+	@cd Doc && $(MAKE) $(MAKEDEFS) ../META-FAQ
+
+# ========== DEPENDENCIES FOR INSTALLING ==========
+
+# install/uninstall everything
+install: install.bin install.modules install.man install.info
+uninstall: uninstall.bin uninstall.modules uninstall.man uninstall.info
+
+# install/uninstall just the binary
+install.bin uninstall.bin:
+	@cd Src && $(MAKE) $(MAKEDEFS) $@
+
+# install/uninstall just the modules
+install.modules uninstall.modules:
+	@cd Src && $(MAKE) $(MAKEDEFS) $@
+
+# install/uninstall just the man pages
+install.man uninstall.man:
+	@cd Doc && $(MAKE) $(MAKEDEFS) $@
+
+# install/uninstall just the info pages
+install.info uninstall.info:
+	@cd Doc && $(MAKE) $(MAKEDEFS) $@
+
+# ========== DEPENDENCIES FOR CLEANUP ==========
+
+@@clean.mk@@
+
+distclean-here:
+	rm -f Makefile config.h config.status config.log config.cache stamp-h
+
+realclean-here:
+	cd $(sdir) && rm -f config.h.in stamp-h.in configure
+
+# ========== DEPENDENCIES FOR MAINTENANCE ==========
+
+@@config.mk@@
+
+config: config.h
+
+config.status: configure
+	./config.status --recheck
+
+configure: configure.in aclocal.m4 aczsh.m4
+	cd $(sdir) && autoconf
+
+config.h: stamp-h
+stamp-h: config.h.in config.status
+	cd $(dir_top) && \
+	  CONFIG_FILES= CONFIG_HEADERS=$(subdir)/config.h ./config.status
+
+config.h.in: stamp-h.in
+stamp-h.in: configure.in acconfig.h aclocal.m4 aczsh.m4
+	cd $(sdir) && autoheader
+	echo > $@
+
+# ========== DEPENDENCIES FOR DISTRIBUTION ==========
+
+DISTNAME = zsh-$(VERSION)
+
+targz-src: $(DISTNAME).tar.gz
+$(DISTNAME).tar.gz: FORCE
+	@$(sdir_top)/Util/mkdisttree.sh $(DISTNAME) $(sdir_top) $(dir_top) SRC \
+	    $(MAKE) $(MAKEDEFS)
+	tar cf - $(DISTNAME) | gzip -9 > $@
+	rm -rf $(DISTNAME)
+
+targz-doc: $(DISTNAME)-doc.tar.gz
+$(DISTNAME)-doc.tar.gz: FORCE
+	@$(sdir_top)/Util/mkdisttree.sh $(DISTNAME) $(sdir_top) $(dir_top) DOC \
+	    $(MAKE) $(MAKEDEFS)
+	tar cf - $(DISTNAME) | gzip -9 > $@
+	rm -rf $(DISTNAME)
+
+FORCE:
diff --git a/Misc/.distfiles b/Misc/.distfiles
new file mode 100644
index 000000000..a02614511
--- /dev/null
+++ b/Misc/.distfiles
@@ -0,0 +1,4 @@
+DISTFILES_SRC='
+    .distfiles
+    c2z compctl-examples globtests globtests.ksh lete2ctl
+'
diff --git a/Misc/.lastloc b/Misc/.lastloc
new file mode 100644
index 000000000..8ba7dd946
--- /dev/null
+++ b/Misc/.lastloc
@@ -0,0 +1,2 @@
+(("/home/user2/pws/src/zsh-3.1.5/Misc/globtests.ksh" . 2763)
+ ("/home/user2/pws/src/zsh-3.1.5/Misc/globtests" . 3123))
diff --git a/Misc/c2z b/Misc/c2z
new file mode 100755
index 000000000..8a90d5fd8
--- /dev/null
+++ b/Misc/c2z
@@ -0,0 +1,128 @@
+#! /bin/sh
+#
+# c2z - environment conversion tool
+# Contributed by Bart Schaefer
+# (Tweaked a bit by Paul Falstad)
+#
+# This is a quick script to convert csh aliases to zsh aliases/functions.
+# It also converts the csh environment and local variables to zsh.  c2z
+# uses the csh to parse its own dot-files, then processes csh output to
+# convert the csh settings to zsh.
+#
+# When run as a zsh fuction, c2z runs csh as if it were an interactive
+# shell whenever the parent zsh is interactive.  When run as a shell
+# script, the -i switch can be used to force this behavior.
+#
+# The -l (login) switch causes csh to run as if it were a login shell.
+# This is done "properly" if c2z is used as a zsh function, otherwise
+# it's faked by explicitly sourcing .login.  Use with caution if your
+# .login initializes an X server or does other one-time-only startup
+# procedures.
+#
+# usage:
+#	c2z [-i | -l | filename]
+#
+# You can use this script in your .zshrc or .zlogin files to load your
+# regular csh environment into zsh; for example, in .zlogin:
+#
+#	. =(c2z -l)
+#
+# This is not perfect, but it gets most common aliases and variables.
+# It's also rather time-consuming to do this every time you log in.
+# However, if you're moving from csh to zsh for the first time, this
+# can get you started with a familiar environment right away.
+#
+# In case your mailer eats tabs, $T is set to expand to a tab.
+#
+T="`echo x | tr x '\011'`"
+
+# If we're zsh, we can run "- csh" to get the complete environment.
+#
+MINUS=""
+LOADFILE=""
+INTERACT=""
+CSH=csh
+case "$ZSH_NAME$ZSH_VERSION$VERSION" in
+zsh*)
+    case $1 in
+    -l*) MINUS="-" ;;
+    -i*) INTERACT="-i" ;;
+    *) LOADFILE="source $1" CSH="csh -f";;
+    esac
+    if [[ -o INTERACTIVE ]]; then INTERACT="-i"; fi
+    setopt nobanghist
+    ;;
+*)
+    case $1 in
+    -l*) LOADFILE="source ~/.login" ;;
+    -i*) INTERACT="-i" ;;
+    *) LOADFILE="source $1" CSH="csh -f";;
+    esac
+    ;;
+esac
+
+( eval $MINUS $CSH $INTERACT ) <<EOF 2>&1 >/dev/null
+$LOADFILE
+alias >! /tmp/cz$$.a
+setenv >! /tmp/cz$$.e
+set >! /tmp/cz$$.v
+EOF
+
+# save stdin
+exec 9<&0
+
+# First convert aliases
+exec < /tmp/cz$$.a
+
+# Taken straight from ctoz except for $T and "alias --"
+sed -e 's/'"$T"'(\(.*\))/'"$T"'\1/' >/tmp/cz$$.1
+grep ! /tmp/cz$$.1 >/tmp/cz$$.2
+grep -v ! /tmp/cz$$.1 >/tmp/cz$$.3
+sed -e "s/'/'"\\\\"''"/g \
+    -e 's/^\([^'"$T"']*\)'"$T"'\(.*\)$/alias -- \1='"'\2'/" \
+    /tmp/cz$$.3
+sed -e 's/![:#]*/$/g' \
+    -e 's/\$cwd/$PWD/' \
+    -e 's/^\([^'"$T"']*\)'"$T"'\(.*\)$/\1 () { \2 }/' \
+    /tmp/cz$$.2
+
+# Next, convert environment variables
+exec < /tmp/cz$$.e
+
+# Would be nice to deal with embedded newlines, e.g. in TERMCAP, but ...
+sed -e '/^SHLVL/d' \
+    -e '/^PWD/d' \
+    -e "s/'/'"\\\\"''"/g \
+    -e "s/^\([A-Za-z0-9_]*=\)/export \1'/" \
+    -e "s/$/'/"
+
+# Finally, convert local variables
+exec < /tmp/cz$$.v
+
+sed -e 's/'"$T"'/=/' \
+    -e "s/'/'"\\\\"''"/g \
+    -e '/^[A-Za-z0-9_]*=[^(]/{
+	s/=/='"'/"'
+	s/$/'"'/"'
+	}' |
+sed -e '/^argv=/d' -e '/^cwd=/d' -e '/^filec=/d' -e '/^status=/d' \
+	 -e '/^autolist=/s/.*/setopt autolist/' \
+	 -e '/^correct=all/s//setopt correctall/' \
+	 -e '/^correct=/s//setopt correct/' \
+	 -e '/^histchars=/s//HISTCHARS=/' \
+	 -e '/^history=/s//HISTSIZE=/' \
+	 -e '/^home=/s//HOME=/' \
+	 -e '/^ignoreeof=/s/.*/setopt ignoreeof/' \
+	 -e '/^noclobber=/s/.*/setopt noclobber/' \
+	 -e '/^notify=/d' \
+	 -e '/^prompt=/s/!/%h/' \
+	 -e 's/^prompt/PROMPT/' \
+	 -e '/^showdots=/s/.*/setopt globdots/' \
+	 -e '/^savehist=/s//HISTFILE=\~\/.zhistory SAVEHIST=/' \
+	 -e '/^who=/s//WATCHFMT=/'
+
+
+exec 0<&9
+
+rm /tmp/cz$$.?
+exit
diff --git a/Misc/compctl-examples b/Misc/compctl-examples
new file mode 100644
index 000000000..e84a37fbb
--- /dev/null
+++ b/Misc/compctl-examples
@@ -0,0 +1,716 @@
+#
+# This file gives examples of possible programmable completions (compctl).
+# You can either put the compctl commands in your .zshrc file, or put them
+# in a separate file (say .zcompctl) and source it from your .zshrc file.
+#
+# These are just examples. Use and modify to personal taste.  Copying
+# this file without thought will needlessly increase zsh's memory usage
+# and startup time.
+#
+# For a detailed description of how these work, check the zshcompctl man
+# page.
+#
+#------------------------------------------------------------------------------
+hosts=("${${(s: :)${(s:	:)${${(f)$(</etc/hosts)}%%\#*}#*[ 	]*}}:#}")
+ports=( "${${${(f)$(</etc/services)}:#\#*}%%[ 	]*}" )
+
+# groups=( $(cut -d: -f1 /etc/group) )
+# groups=( $(ypcat group.byname | cut -d: -f1) ) # if you use NIS
+
+# It can be done without forking, but it used too much memory in old zsh's:
+groups=( "${${(f)$(</etc/group)}%%:*}" )
+#groups=( "${${(f)$(ypcat groups)}%%:*}" ) # if you use NIS
+
+# Completion for zsh builtins.
+compctl -z -P '%' bg
+compctl -j -P '%' fg jobs disown
+compctl -j -P '%' + -s '`ps -x | tail +2 | cut -c1-5`' wait
+compctl -A shift
+compctl -c type whence where which
+compctl -m -x 'W[1,-*d*]' -n - 'W[1,-*a*]' -a - 'W[1,-*f*]' -F -- unhash
+compctl -m -q -S '=' -x 'W[1,-*d*] n[1,=]' -/ - \
+	'W[1,-*d*]' -n -q -S '=' - 'n[1,=]' -/g '*(*)' -- hash
+compctl -F functions unfunction
+compctl -k '(al dc dl do le up al bl cd ce cl cr
+	dc dl do ho is le ma nd nl se so up)' echotc
+compctl -a unalias
+compctl -v getln getopts read unset vared
+compctl -v -S '=' -q declare export integer local readonly typeset
+compctl -eB -x 'p[1] s[-]' -k '(a f m r)' - \
+	'C[1,-*a*]' -ea - 'C[1,-*f*]' -eF - 'C[-1,-*r*]' -ew -- disable
+compctl -dB -x 'p[1] s[-]' -k '(a f m r)' - \
+	'C[1,-*a*]' -da - 'C[1,-*f*]' -dF - 'C[-1,-*r*]' -dw -- enable
+compctl -k "(${(j: :)${(f)$(limit)}%% *})" limit unlimit
+compctl -l '' -x 'p[1]' -f -- . source
+# Redirection below makes zsh silent when completing unsetopt xtrace
+compctl -s '$({ unsetopt kshoptionprint; setopt } 2>/dev/null)' + -o + -x 's[no]' -o -- unsetopt
+compctl -s '$({ unsetopt kshoptionprint; unsetopt } 2>/dev/null)' + -o + -x 's[no]' -o -- setopt
+compctl -s '${^fpath}/*(N:t)' autoload
+compctl -b -x 'W[1,-*[DAN]*],C[-1,-*M]' -s '$(bindkey -l)' -- bindkey
+compctl -c -x 'C[-1,-*k]' -A - 'C[-1,-*K]' -F -- compctl
+compctl -x 'C[-1,-*e]' -c - 'C[-1,-[ARWI]##]' -f -- fc
+compctl -x 'p[1]' - 'p[2,-1]' -l '' -- sched
+compctl -x 'C[-1,[+-]o]' -o - 'c[-1,-A]' -A -- set
+compctl -b -x 'w[1,-N] p[3]' -F -- zle
+compctl -s '${^module_path}/*(N:t:r)' -x \
+	'W[1,-*(a*u|u*a)*],W[1,-*a*]p[3,-1]' -B - \
+	'W[1,-*u*]' -s '$(zmodload)' -- zmodload
+
+# Anything after nohup is a command by itself with its own completion
+compctl -l '' nohup noglob exec nice eval - time rusage
+compctl -l '' -x 'p[1]' -eB -- builtin
+compctl -l '' -x 'p[1]' -em -- command
+compctl -x 'p[1]' -c - 'p[2,-1]' -k signals -- trap
+#------------------------------------------------------------------------------
+# kill takes signal names as the first argument after -, but job names after %
+# or PIDs as a last resort
+compctl -j -P '%' + -s '`ps -x | tail +2 | cut -c1-5`' + \
+	-x 's[-] p[1]' -k "($signals[1,-3])" -- kill
+#------------------------------------------------------------------------------
+compctl -s '$(groups)' + -k groups newgrp
+compctl -f -x 'p[1], p[2] C[-1,-*]' -k groups -- chgrp
+compctl -f -x 'p[1] n[-1,.], p[2] C[-1,-*] n[-1,.]' -k groups - \
+	'p[1], p[2] C[-1,-*]' -u -S '.' -q -- chown
+compctl -/g '*.x' rpcgen
+compctl -u -x 's[+] c[-1,-f],s[-f+]' -W ~/Mail -f - \
+	's[-f],c[-1,-f]' -f -- mail elm
+compctl -x 'c[-1,-f]' -W ~/Mail -f -- pine
+#------------------------------------------------------------------------------
+compctl -s "\$(awk '/^[a-zA-Z0-9][^ 	]+:/ {print \$1}' FS=: [mM]akefile)" -x \
+	'c[-1,-f]' -f -- make gmake pmake
+#------------------------------------------------------------------------------
+# tar
+tarnames () {
+	# Completion function for use with tar:
+	# get the names of files in the tar archive to extract.
+	#
+	# The main claim to fame of this particular function is that it
+	# completes directories in the tar-file in a manner very roughly
+	# consistent with `compctl -f'.  There are two bugs:  first, the whole
+	# path prefix up to the present is listed with ^D, not just the new
+	# part to add; second, after a unique completion a space is always
+	# inserted, even if the completion ends with a slash.  These are
+	# currently limitations of zsh.
+	#
+	# This only works for the (fairly common) tar argument style where
+	# the arguments are bunched into the first argument, and the second
+	# argument is the name of the tarfile.  For example,
+	#  tar xvzf zsh-3.1.2.tar.gz ...
+	# You can only use compressed/gzipped files if tar is GNU tar,
+	# although the correct name for the tar programme will be inferred.
+
+	local line list=tf
+	read -cA line
+	# $line[2] is the first argument:  check for possible compression args.
+	# (This is harmless when used with non-GNU tar, but then the file must
+	# be uncompressed to be able to use it with tar anyway.)
+	[[ $line[2] = *[Zz]* ]] && list=tfz
+	# $line[1] is the command name:  something like tar or gnutar.
+	# $line[3] is the name of the tar archive.
+
+	# cache contents for multiple completion: note tar_cache_name
+	# and tar_cache_list are not local.  Assumes all files with the
+	# same name are the same file, even if in different directories:
+	# you can trick it with $PWD/file on the command line.
+	if [[ $line[3] != $tar_cache_name ]]; then
+	  tar_cache_list=($($line[1] $list $line[3]))
+	  tar_cache_name=$line[3]
+	fi
+
+	# Now prune the list to include only appropriate directories.
+	local file new
+	reply=()
+	if [[ $1 = */* ]]; then
+	  local sofar=${1%/*}/
+	  for file in $tar_cache_list; do
+	    if [[ $file = $sofar* ]]; then
+	      new=${file#$sofar}
+	      if [[ $new = */* ]]; then
+		new=$sofar${new%%/*}/
+	      else
+		new=$file
+	      fi
+	      if [[ $1 != */ || $new != $1 ]]; then
+		reply=($reply $new)
+	      fi
+	    fi
+	  done
+	else
+	  for file in $tar_cache_list; do
+	    if [[ $file = */* ]]; then
+	      new=${file%%/*}/
+	    else
+	      new=$file
+	    fi
+	    reply=($reply $new)
+	  done
+	fi
+}
+
+compctl -f \
+	-x 'p[2] C[-1,*(z*f|f*z)*]' -/g '*.(taz|tar.(gz|z|Z)|tgz)' \
+	- 'p[2] C[-1,*(Z*f|f*Z)*]' -/g '*.(tar.Z|taz)' \
+	- 'p[2] C[-1,*f*]' -/g '*.tar' \
+	- 'p[1] N[-1,ctxvzZ]' -k "(v z f)" \
+	- 'p[1] s[]' -k "(c t x)" -S '' \
+	- 'p[3,-1] W[1,*x*]' -K tarnames \
+	-- tar gtar gnutar
+#------------------------------------------------------------------------------
+# rmdir only real directories
+compctl -/g '*(/)' rmdir dircmp
+#------------------------------------------------------------------------------
+# cd/pushd only directories or symbolic links to directories
+compctl -/ cd chdir dirs pushd
+
+# Another possibility for cd/pushd is to use it in conjunction with the
+# cdmatch function (in the Functions subdirectory of zsh distribution).
+compctl -K cdmatch -S '/' -q -x 'p[2]' -Q -K cdmatch2 - \
+	'S[/][~][./][../]' -g '*(-/)' + -g '*(-/D)' - \
+	'n[-1,/]' -K cdmatch -S '/' -q -- cd chdir pushd
+#------------------------------------------------------------------------------
+# If the command is rsh, make the first argument complete to hosts and treat the
+# rest of the line as a command on its own.
+compctl -k hosts -x 'p[2,-1]' -l '' -- rsh
+
+# rlogin takes hosts and users after `-l'
+compctl -k hosts -x 'c[-1,-l]' -u -- rlogin
+
+# rcp: match users, hosts and files initially.  Match files after a :, or hosts
+# after an @.  If one argument contains a : then the other matches files only.
+# Not quite perfect; compctl just isn't up to it yet.
+compctl -u -k hosts -f -x 'n[1,:]' -f - 'n[1,@]' -k hosts -S ':' - \
+	'p[1] W[2,*:*]' -f - 'p[1] W[2,*?*]' -u -k hosts -S ':' - \
+	'p[2] W[1,*:*]' -f - 'p[2] W[1,*?*]' -u -k hosts -S ':' -- rcp
+
+compctl -k hosts host rup rusers ping
+#------------------------------------------------------------------------------
+# strip, profile, and debug only executables.  The compctls for the
+# debuggers could be better, of course.
+compctl -/g '*(*)' strip gprof adb dbx xdbx ups
+compctl -/g '*.[ao]' -/g '*(*)' nm
+#------------------------------------------------------------------------------
+# shells: compctl needs some more enhancement to do -c properly.
+compctl -f -x 'C[-1,-*c]' -c - 'C[-1,[-+]*o]' -o -- bash ksh sh zsh
+#------------------------------------------------------------------------------
+# su takes a username and args for the shell.
+compctl -u -x 'w[1,-]p[3,-1]' -l sh - 'w[1,-]' -u - 'p[2,-1]' -l sh -- su
+#------------------------------------------------------------------------------
+# Run ghostscript on postscript files, but if no postscript file matches what
+# we already typed, complete directories as the postscript file may not be in
+# the current directory.
+compctl -/g '*.(e|E|)(ps|PS)' \
+	gs ghostview nup psps pstops psmulti psnup psselect
+#------------------------------------------------------------------------------
+# Similar things for tex, texinfo and dvi files.
+compctl -/g '*.tex*' {,la,gla,ams{la,},{g,}sli}tex texi2dvi
+compctl -/g '*.dvi' xdvi dvips
+#------------------------------------------------------------------------------
+# For rcs users, co and rlog from the RCS directory.  We don't want to see
+# the RCS and ,v though.
+compctl -g 'RCS/*(:s@RCS/@@:s/,v//)' co rlog rcs rcsdiff
+#------------------------------------------------------------------------------
+# gzip uncompressed files, but gzip -d only gzipped or compressed files
+compctl -x 'R[-*[dt],^*]' -/g '*.(gz|z|Z|t[agp]z|tarZ|tz)' + -f - \
+    's[]' -/g '^*(.(tz|gz|t[agp]z|tarZ|zip|ZIP|jpg|JPG|gif|GIF|[zZ])|[~#])' \
+    + -f -- gzip
+compctl -/g '*.(gz|z|Z|t[agp]z|tarZ|tz)' gunzip gzcat zcat
+compctl -/g '*.Z' uncompress zmore
+compctl -/g '*.F' melt fcat
+#------------------------------------------------------------------------------
+# ftp takes hostnames
+ftphosts=(prep.ai.mit.edu wuarchive.wustl.edu ftp.uu.net ftp.math.gatech.edu)
+compctl -k ftphosts ftp
+
+# Some systems have directories containing indices of ftp servers.
+# For example: we have the directory /home/ftp/index/INDEX containing
+# files of the form `<name>-INDEX.Z', this leads to:
+#compctl -g '/home/ftp/index/INDEX/*-INDEX.Z(:t:r:s/-INDEX//)' ftp tftp
+#------------------------------------------------------------------------------
+# Change default completion (see the multicomp function in the Function
+# subdirectory of the zsh distribution).
+#compctl -D -f + -U -K multicomp
+# If completion of usernames is slow for you, you may want to add something
+# like
+#    -x 'C[0,*/*]' -f - 's[~]' -S/ -k users + -u
+# where `users' contains the names of the users you want to complete often.
+# If you want to use this and to be able to complete named directories after
+# the `~' you should add `+ -n' at the end
+#------------------------------------------------------------------------------
+# This is to complete all directories under /home, even those that are not
+# yet mounted (if you use the automounter).
+
+# This is for NIS+ (e.g. Solaris 2.x)
+#compctl -Tx 's[/home/] C[0,^/home/*/*]'  -S '/' -s '$(niscat auto_home.org_dir | \
+#	awk '\''/export\/[a-zA-Z]*$/ {print $NF}'\'' FS=/)'
+
+# And this is for YP (e.g. SunOS4.x)
+#compctl -Tx 's[/home/] C[0,^/home/*/*]' -S '/' -s '$(ypcat auto.home | \
+#	awk '\''/export\/[a-zA-Z]*$/ {print $NF}'\'' FS=/)'
+#------------------------------------------------------------------------------
+# Find is very system dependent, this one is for GNU find.
+# Note that 'r[-exec,;]' must come first
+if [[ -r /proc/filesystems ]]; then
+    # Linux
+    filesystems='"${${(f)$(</proc/filesystems)}#*	}"'
+else
+    filesystems='ufs 4.2 4.3 nfs tmp mfs S51K S52K'
+fi
+compctl -x 'r[-exec,;][-ok,;]' -l '' - \
+'s[-]' -s 'daystart {max,min,}depth follow noleaf version xdev
+	{a,c,}newer {a,c,m}{min,time} empty false {fs,x,}type gid inum links
+	{i,}{l,}name {no,}{user,group} path perm regex size true uid used
+	exec {f,}print{f,0,} ok prune ls' - \
+	'p[1]' -g '. .. *(-/)' - \
+	'C[-1,-((a|c|)newer|fprint(|0|f))]' -f - \
+	'c[-1,-fstype]' -s $filesystems - \
+	'c[-1,-group]' -k groups - \
+	'c[-1,-user]' -u -- find
+#------------------------------------------------------------------------------
+# Generic completion for C compiler.
+compctl -/g "*.[cCoa]" -x 's[-I]' -/ - \
+	's[-l]' -s '${(s.:.)^LD_LIBRARY_PATH}/lib*.a(:t:r:s/lib//)' -- cc
+#------------------------------------------------------------------------------
+# GCC completion, by Andrew Main
+# completes to filenames (*.c, *.C, *.o, etc.); to miscellaneous options after
+# a -; to various -f options after -f (and similarly -W, -g and -m); and to a
+# couple of other things at different points.
+# The -l completion is nicked from the cc compctl above.
+# The -m completion should be tailored to each system; the one below is i386.
+compctl -/g '*.([cCmisSoak]|cc|cxx|ii|k[ih])' -x \
+	's[-l]' -s '${(s.:.)^LD_LIBRARY_PATH}/lib*.a(:t:r:s/lib//)' - \
+	'c[-1,-x]' -k '(none c objective-c c-header c++ cpp-output
+	assembler assembler-with-cpp)' - \
+	'c[-1,-o]' -f - \
+	'C[-1,-i(nclude|macros)]' -/g '*.h' - \
+	'C[-1,-i(dirafter|prefix)]' -/ - \
+	's[-B][-I][-L]' -/ - \
+	's[-fno-],s[-f]' -k '(all-virtual cond-mismatch dollars-in-identifiers
+	enum-int-equiv external-templates asm builtin strict-prototype
+	signed-bitfields signd-char this-is-variable unsigned-bitfields
+	unsigned-char writable-strings syntax-only pretend-float caller-saves
+	cse-follow-jumps cse-skip-blocks delayed-branch elide-constructors
+	expensive-optimizations fast-math float-store force-addr force-mem
+	inline-functions keep-inline-functions memoize-lookups default-inline
+	defer-pop function-cse inline peephole omit-frame-pointer
+	rerun-cse-after-loop schedule-insns schedule-insns2 strength-reduce
+	thread-jumps unroll-all-loops unroll-loops)' - \
+	's[-g]' -k '(coff xcoff xcoff+ dwarf dwarf+ stabs stabs+ gdb)' - \
+	's[-mno-][-mno][-m]' -k '(486 soft-float fp-ret-in-387)' - \
+	's[-Wno-][-W]' -k '(all aggregate-return cast-align cast-qual
+	char-subscript comment conversion enum-clash error format id-clash-6
+	implicit inline missing-prototypes missing-declarations nested-externs
+	import parentheses pointer-arith redundant-decls return-type shadow
+	strict-prototypes switch template-debugging traditional trigraphs
+	uninitialized unused write-strings)' - \
+	's[-]' -k '(pipe ansi traditional traditional-cpp trigraphs pedantic
+	pedantic-errors nostartfiles nostdlib static shared symbolic include
+	imacros idirafter iprefix iwithprefix nostdinc nostdinc++ undef)' \
+	-X 'Use "-f", "-g", "-m" or "-W" for more options' -- gcc g++
+#------------------------------------------------------------------------------
+# There are (at least) two ways to complete manual pages.  This one is
+# extremely memory expensive if you have lots of man pages
+man_var() {
+    man_pages=( ${^manpath}/man*/*(N:t:r) )
+    compctl -k man_pages -x 'C[-1,-P]' -m - \
+	    'R[-*l*,;]' -/g '*.(man|[0-9](|[a-z]))' -- man
+    reply=( $man_pages )
+}
+compctl -K man_var -x 'C[-1,-P]' -m - \
+	'R[-*l*,;]' -/g '*.(man|[0-9](|[a-z]))' -- man
+
+# This one isn't that expensive but somewhat slower
+man_glob () {
+   local a
+   read -cA a
+   if [[ $a[2] = -s ]] then         # Or [[ $a[2] = [0-9]* ]] for BSD
+     reply=( ${^manpath}/man$a[3]/$1*$2(N:t:r) )
+   else
+     reply=( ${^manpath}/man*/$1*$2(N:t:r) )
+   fi
+}
+#compctl -K man_glob -x 'C[-1,-P]' -m - \
+#	'R[-*l*,;]' -/g '*.(man|[0-9nlpo](|[a-z]))' -- man
+#------------------------------------------------------------------------------
+# xsetroot: gets possible colours, cursors and bitmaps from wherever.
+# Uses two auxiliary functions.  You might need to change the path names.
+Xcolours() {
+  reply=( ${(L)$(awk '{ if (NF = 4) print $4 }' \
+	< /usr/openwin/lib/X11/rgb.txt)} )
+}
+Xcursor() {
+  reply=( $(sed -n 's/^#define[	 ][ 	]*XC_\([^ 	]*\)[ 	].*$/\1/p' \
+	  < /usr/include/X11/cursorfont.h) )
+}
+compctl -k '(-help -def -display -cursor -cursor_name -bitmap -mod -fg -bg
+	-grey -rv -solid -name)' -x \
+	'c[-1,-display]' -s '$DISPLAY' -k hosts -S ':0' - \
+	'c[-1,-cursor]' -f -  'c[-2,-cursor]' -f - \
+	'c[-1,-bitmap]' -g '/usr/include/X11/bitmaps/*' - \
+	'c[-1,-cursor_name]' -K Xcursor - \
+	'C[-1,-(solid|fg|bg)]' -K Xcolours -- xsetroot
+#------------------------------------------------------------------------------
+# dd
+compctl -k '(if of conv ibs obs bs cbs files skip file seek count)' \
+	-S '=' -x 's[if=], s[of=]' -f - 'C[0,conv=*,*] n[-1,,], s[conv=]' \
+	-k '(ascii ebcdic ibm block unblock lcase ucase swap noerror sync)' \
+	-q -S ',' - 'n[-1,=]' -X '<number>'  -- dd
+#------------------------------------------------------------------------------
+# Various MH completions by Peter Stephenson
+# You may need to edit where it says *Edit Me*.
+
+# The following three functions are best autoloaded.
+# mhcomp completes folders (including subfolders),
+# mhfseq completes sequence names and message numbers,
+# mhfile completes files in standard MH locations.
+
+function mhcomp {
+  # Completion function for MH folders.
+  # Works with both + (rel. to top) and @ (rel. to current).
+  local nword args pref char mhpath
+  read -nc nword
+  read -cA args
+
+  pref=$args[$nword]
+  char=$pref[1]
+  pref=$pref[2,-1]
+
+  # The $(...) here accounts for most of the time spent in this function.
+  if [[ $char = + ]]; then
+  #    mhpath=$(mhpath +)
+  # *Edit Me*: use a hard wired value here: it's faster.
+    mhpath=~/Mail
+  elif [[ $char = @ ]]; then
+    mhpath=$(mhpath)
+  fi
+
+  eval "reply=($mhpath/$pref*(N-/))"
+
+  # I'm frankly amazed that this next step works, but it does.
+  reply=(${reply#$mhpath/})
+}
+
+mhfseq() {
+  # Extract MH message names and numbers for completion.  Use of the
+  # correct folder, if it is not the current one, requires that it
+  # should be the previous command line argument.  If the previous
+  # argument is `-draftmessage', a hard wired draft folder name is used.
+
+  local folder foldpath words pos nums
+  read -cA words
+  read -cn pos
+
+  # Look for a folder name.
+  # First try the previous word.
+  if [[ $words[$pos-1] = [@+]* ]]; then
+    folder=$words[$pos-1]
+  # Next look and see if we're looking for a draftmessage
+  elif [[ $words[$pos-1] = -draftmessage ]]; then
+    # *Edit Me*:  shortcut -- hard-wire draftfolder here
+    # Should really look for a +draftfolder argument.
+    folder=+drafts
+  fi
+  # Else use the current folder ($folder empty)
+
+  if [[ $folder = +* ]]; then
+  # *Edit Me*:  use hard-wired path with + for speed.
+    foldpath=~/Mail/$folder[2,-1]
+  else
+    foldpath=$(mhpath $folder)
+  fi
+
+  # Extract all existing message numbers from the folder.
+  nums=($foldpath/<->(N:t))
+  # If that worked, look for marked sequences.
+  # *Edit Me*: if you never use non-standard sequences, comment out
+  # or delete the next three lines.
+  if (( $#nums )); then
+    nums=($nums $(mark $folder | awk -F: '{print $1}'))
+  fi
+
+  # *Edit Me*:  `unseen' is the value of Unseen-Sequence, if it exists;
+  set -A reply next cur prev first last all unseen $nums
+
+}
+
+mhfile () {
+  # Find an MH file; for use with -form arguments and the like.
+  # Use with compctl -K mhfile.
+
+  local mhfpath file
+  # *Edit Me*:  Array containing all the places MH will look for templates etc.
+  mhfpath=(~/Mail /usr/local/lib/MH)
+
+  # Emulate completeinword behaviour as appropriate
+  local wordstr
+  if [[ -o completeinword ]]; then
+    wordstr='$1*$2'
+  else
+    wordstr='$1$2*'
+  fi
+
+  if [[ $1$2 = */* ]]; then
+    # path given: don't search MH locations
+    eval "reply=($wordstr(.N))"
+  else
+    # no path:  only search MH locations.
+    eval "reply=(\$mhfpath/$wordstr(.N:t))"
+  fi
+}
+
+# Note: you must type the initial + or @ of a folder name to get
+# completion, even in places where only folder names are allowed.
+# Abbreviations for options are not recognised.  Hit tab to complete
+# the option name first.
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \
+  's[-]' -k "(all fast nofast header noheader help list nolist \
+  pack nopack pop push recurse norecurse total nototal)" -- folder
+compctl -K mhfseq -x 's[+][@],c[-1,-draftfolder] s[+][@]' \
+  -K mhcomp -S / -q - 'c[-1,-draftmessage]' -K mhfseq - \
+  'C[-1,-(editor|whatnowproc)]' -c - \
+  's[-]' -k "(draftfolder draftmessage nodraftfolder editor noedit \
+  file form use nouse whatnowproc nowhatnowproc help)" - \
+  'c[-1,-form]' -K mhfile -- comp
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \
+  's[-]' -k "(audit noaudit changecur nochangecur form format \
+  file silent nosilent truncate notruncate width help)" - \
+  'C[-1,-(audit|form)]' -K mhfile - 'c[-1,-file]' -f + -- inc
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \
+  's[-]' -k "(sequence add delete list public nopublic zero nozero help)" -- \
+  mark
+compctl -K mhfseq -x 's[+][@]' \
+  -K mhcomp -S / -q - 'c[-1,-file]' -f - 'c[-1,-rmmprov]' -c - \
+  's[-]' -k "(draft link nolink preserve nopreserve src file \
+  rmmproc normmproc help)" -- refile
+compctl -K mhfseq -x 's[+][@]' \
+  -K mhcomp -S / -q - 'c[-1,-draftmessage]'  -K mhfseq -\
+  's[-]' -k "(annotate noannotate cc nocc draftfolder nodraftfolder \
+  draftmessage editor noedit fcc filter form inplace noinplace query \
+  noquery width whatnowproc nowhatnowproc help)" - 'c[-1,(cc|nocc)]' \
+  -k "(all to cc me)" - 'C[-1,-(filter|form)]' -K mhfile - \
+  'C[-1,-(editor|whatnowproc)]' -c -- repl
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \
+  's[-]' -k "(clear noclear form format header noheader reverse noreverse \
+  file help width)" - 'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile -- scan
+compctl -K mhfseq -x 's[+][@]'  -K mhcomp -S / -q - \
+  's[-]' -k "(draft form moreproc nomoreproc header noheader \
+   showproc noshowproc length width help)" - 'C[-1,-(show|more)proc]' -c - \
+   'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - \
+   'c[-1,-length]' -s '$LINES' - 'c[-1,-width]' -s '$COLUMNS' -- show next prev
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \
+  -k "(help)" -- rmm
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - \
+  's[-]' -k "(after before cc date datefield from help list nolist \
+  public nopublic search sequence subject to zero nozero not or and \
+  lbrace rbrace)" -- pick
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \
+  -k "(alias check draft draftfolder draftmessage help nocheck \
+  nodraftfolder)" -- whom
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' \
+  -k "(file part type list headers noheaders realsize norealsize nolist \
+  show serialonly noserialonly form pause nopause noshow store auto noauto \
+  nostore cache nocache rcache wcache check nocheck ebcdicsafe noebcdicsafe \
+  rfc934mode norfc934mode verbose noverbose help)" - \
+  'c[-1,-file]' -f - 'c[-1,-form]' -K mhfile - \
+  'C[-1,-[rw]cache]' -k '(public private never ask)' -- mhn
+compctl -K mhfseq -x 's[+][@]' -K mhcomp -S / -q - 's[-]' -k '(help)' -- mhpath
+#------------------------------------------------------------------------------
+# CVS
+#
+cvscmds=(add admin rcs checkout commit diff rdiff export history import log rlog
+         release remove status tag rtag update annotate)
+cvsignore="*~ *# .#* *.o *.a CVS . .."
+
+compctl -k cvscmds \
+    -x "c[-1,-D]" -k '(today yesterday 1\ week\ ago)' \
+    - "c[-1,-m]" -k '(bugfix cosmetic\ fix ... added\ functionality foo)' \
+    - "c[-1,-F]" -f \
+    - "c[-1,-r]" -K cvsrevisions \
+    - "c[-1,-I]" -f \
+    - "R[add,;]" -K cvsaddp \
+    - "R[(admin|rcs),;]" -/K cvstargets \
+    - "R[(checkout|co),;]" -K cvsrepositories \
+    - "R[(commit|ci),;]" -/K cvstargets \
+    - "R[(r|)diff,;]" -/K cvstargets \
+    - "R[export,;]" -f \
+    - "R[history,;]" -/K cvstargets \
+    - "R[history,;] c[-1,-u]" -u \
+    - "R[import,;]" -K cvsrepositories \
+    - "R[(r|)log,;]" -/K cvstargets \
+    - 'R[(r|)log,;] s[-w] n[-1,,],s[-w]' -u -S , -q \
+    - "R[rel(|ease),;]" -f \
+    - "R[(remove|rm),;] R[-f,;]" -/K cvstargets \
+    - "R[(remove|rm),;]" -K cvsremovep \
+    - "R[status,;]" -/K cvstargets \
+    - "R[(r|)tag,;]" -/K cvstargets \
+    - "R[up(|date),;]" -/K cvstargets \
+    - "R[annotate,;]" -/K cvstargets \
+    -- cvs 
+
+compctl -/K cvstargets cvstest 
+
+cvsprefix() {
+    local nword args f
+    read -nc nword; read -Ac args
+    pref=$args[$nword]
+    if [[ -d $pref:h && ! -d $pref ]]; then
+	pref=$pref:h
+    elif [[ $pref != */* ]]; then
+	pref=
+    fi
+    [[ -n "$pref" && "$pref" != */ ]] && pref=$pref/
+}
+
+cvsentries() {
+    setopt localoptions nullglob unset
+    if [[ -f ${pref}CVS/Entries ]]; then
+	reply=( "${pref}${^${${${(f@)$(<${pref}CVS/Entries)}:#D*}#/}%%/*}" )
+    fi
+}
+
+cvstargets() {
+    local pref
+    cvsprefix
+    cvsentries
+}
+
+cvsrevisions() {
+    reply=( "${${${(M)${(f)$(cvs -q status -vl .)}:#	*}##[ 	]##}%%[ 	]*}" )
+}
+
+cvsrepositories() {
+    local root=$CVSROOT
+    [[ -f CVS/Root ]] && root=$(<CVS/Root)
+    reply=(
+	$root/^CVSROOT(:t)
+	"${${(M)${(f)$(<$root/CVSROOT/modules)}:#[^#]*}%%[ 	]*}"
+    )
+}
+
+cvsremovep() {
+    local pref
+    cvsprefix
+    cvsentries
+    setopt localoptions unset
+    local omit
+    omit=( ${pref}*(D) )
+    eval 'reply=( ${reply:#('${(j:|:)omit}')} )'
+}
+
+cvsaddp() {
+    local pref
+    cvsprefix
+    cvsentries
+    setopt localoptions unset
+    local all omit
+    all=( ${pref}*(D) )
+    omit=( $reply ${pref}${^${=cvsignore}} )
+    [[ -r ~/.cvsignore ]] && omit=( $omit ${pref}${^$(<~/.cvsignore)} )
+    [[ -r ${pref}.cvsignore ]] && omit=( $omit ${pref}${^$(<${pref}.cvsignore)} )
+    eval 'reply=( ${all:#('${(j:|:)omit}')} )' 
+}
+
+#------------------------------------------------------------------------------
+# RedHat Linux rpm utility
+#
+compctl -s '$(rpm -qa)' \
+	-x 's[--]' -s 'oldpackage percent replacefiles replacepkgs noscripts
+		       root excludedocs includedocs test upgrade test clean
+		       short-circuit sign recompile rebuild resign querytags
+		       queryformat version help quiet rcfile force hash' - \
+	's[ftp:]' -P '//' -s '$(</u/zsh/ftphosts)' -S '/' - \
+	'c[-1,--root]' -/ - \
+	'c[-1,--rcfile]' -f - \
+	'p[1] s[-b]' -k '(p l c i b a)' - \
+	'c[-1,--queryformat] N[-1,{]' \
+		-s '"${${(f)$(rpm --querytags)}#RPMTAG_}"' -S '}' - \
+	'W[1,-q*] C[-1,-([^-]*|)f*]' -f - \
+	'W[1,-i*], W[1,-q*] C[-1,-([^-]*|)p*]' \
+		-/g '*.rpm' + -f -- rpm
+#------------------------------------------------------------------------------
+compctl -u -x 'c[-1,-w]' -f -- ac
+compctl -/g '*.m(.)' mira
+#------------------------------------------------------------------------------
+# talk completion: complete local users, or users at hosts listed via rwho
+compctl -K talkmatch talk ytalk ytalk3
+function talkmatch {
+    local u
+    reply=($(users))
+    for u in "${${(f)$(rwho 2>/dev/null)}%%:*}"; do
+	reply=($reply ${u%% *}@${u##* })
+    done
+}
+#------------------------------------------------------------------------------
+# Linux mount
+comp_fsmount () {
+    local tmp; if [[ $UID = 0 ]]; then tmp=""; else tmp="user"; fi
+    sed -n -e "s|^[^# 	][^ 	]*[ 	][ 	]*\(/[^ 	]*\)[ 	].*$tmp.*|\1|p" /etc/fstab
+}
+comp_nfsmount () {
+    local cmd args host
+    read -Ac cmd; read -cn where
+    host=${${cmd[$where]}%%:*}
+    reply=("${(@f)$(showmount -e $host | sed -n -e "s|^/\([^ ]*\) .*|$host:/\1|p")}")
+}
+compctl -s '$(mount | \
+	      sed -e "s/^[^ ]* on \\([^ ]*\\) type.*/\\1/"'"$(
+	      if [[ ! $UID = 0 ]]; then
+		  echo ' | egrep "^${(j:|:)$(comp_fsmount)}\$"'
+	      fi)"')' umount
+compctl -s '$(comp_fsmount)' + \
+	-x 'S[/]' -f -- + \
+	-x 'C[0,*:*]' -K comp_nfsmount -- + \
+	-s '$(< /etc/hosts)' \
+	mount
+#------------------------------------------------------------------------------
+# Lynx (web browser)
+compctl -k '(http:// file: ftp:// gopher:// news://)' -S '' \
+        -x 's[ftp://]' -k ftphosts -S/ \
+        - 'n[1,://]' -k hosts -S/ \
+        - 's[file:/]' -/g '*.html' -W/ \
+	- 's[file:]' -s '~+' -S '/' \
+        - 's[-]' -k '(anonymous auth base book buried_news cache case
+		cfg child cookies crawl display dump editor emacskeys
+		enable_scrollback error_file fileversions force_html
+		from ftp get_data head help historical homepage
+		image_links index link localhost locexec mime_header
+		minimal newschunksize newsmaxchunk nobrowse noexec
+		nofilereferer nofilereferer nolist nolog nopause
+		noprint noredir noreferer nosocks nostatus number_links
+		popup post_data print pseudo_inlines raw realm reload
+		restrictions resubmit_posts rlogin selective show_cursor
+		source startfile_ok telnet term trace traversal underscore
+		validate version vikeys)' \
+        -- lynx
+#------------------------------------------------------------------------------
+# ssh (secure shell)
+compctl -k hosts \
+	-x "c[-1,-l]" -u \
+	- "c[-1,-i]" -f \
+	- "c[-1,-e]" -k "(~ none)" \
+	- "c[-1,-c]" -k "(idea des 3des tss arcfour none)" \
+	- "c[-1,-p]" -k ports \
+	- "c[-1,-L] c[-1,-R] c[-1,-o]" -k "()" \
+	-- ssh
+#------------------------------------------------------------------------------
+# network stuff
+compctl -k hosts \
+	-x "s[-class=]" -k "(any in chaos hesiod)" \
+	- "s[-query=]" -k "(a cname hinfo md mx mb mg minfo ns ptr soa txt uinfo wks any)" \
+	- "s[-]" -Q -S '' -k "(query= all\  class= d2\  nod2\  debug\  nodebug\  defname\  nodefname\  domain= ignoretc\  noignoretc\ )" \
+	-- nslookup
+
+compctl -k hosts \
+	-x "C[-1,[^-]*] p[2,-1]" -k ports \
+	-- telnet
+
+compctl -x 'N[-1,@]' -k hosts - 's[]' -u -qS '@' -- finger
+#------------------------------------------------------------------------------
+# gdb
+compctl -/g "*(*)" \
+	-x "s[-]" -k "(help nx q batch cd f b tty exec se core symbols c x d)" \
+	- "C[-1,(-cd|-directory)]" -/ \
+	- "C[-1,(-core|-c)]" -/g 'core*' \
+	- "C[-1,(-se|-exec)]" -f \
+	- "C[-1,(-symbols|-command|-x)]" -f \
+	- "p[2,-1] C[-1,[^-]*]" -/g "core*" \
+	-- gdb
diff --git a/Misc/globtests b/Misc/globtests
new file mode 100755
index 000000000..728aee5ae
--- /dev/null
+++ b/Misc/globtests
@@ -0,0 +1,107 @@
+#!/usr/local/bin/zsh -f
+
+setopt extendedglob badpattern
+unsetopt kshglob
+
+failed=0
+while read res str pat; do
+  [[ $res = '#' ]] && continue
+  [[ $str = ${~pat} ]]
+  ts=$?
+  [[ $1 = -q ]] || print "$ts:  [[ $str = $pat ]]"
+  if [[ ( $ts -gt 0 && $res = t) || ($ts -eq 0 && $res = f) ]]; then
+    print "Test failed:  [[ $str = $pat ]]"
+    (( failed++ ))
+  fi
+done <<EOT
+t fofo                (fo#)#
+t ffo                 (fo#)#
+t foooofo             (fo#)#
+t foooofof            (fo#)#
+t fooofoofofooo       (fo#)#
+f foooofof            (fo##)#
+f xfoooofof           (fo#)#
+f foooofofx           (fo#)#
+t ofxoofxo            ((ofo#x)#o)#
+f ofooofoofofooo      (fo#)#
+t foooxfooxfoxfooox   (fo#x)#
+f foooxfooxofoxfooox  (fo#x)#
+t foooxfooxfxfooox    (fo#x)#
+t ofxoofxo            ((ofo#x)#o)#
+t ofoooxoofxo         ((ofo#x)#o)#
+t ofoooxoofxoofoooxoofxo            ((ofo#x)#o)#
+t ofoooxoofxoofoooxoofxoo           ((ofo#x)#o)#
+f ofoooxoofxoofoooxoofxofo          ((ofo#x)#o)#
+t ofoooxoofxoofoooxoofxooofxofxo    ((ofo#x)#o)#
+t aac    ((a))#a(c)
+t ac     ((a))#a(c)
+f c      ((a))#a(c)
+t aaac   ((a))#a(c)
+f baaac  ((a))#a(c)
+t abcd   ?(a|b)c#d
+t abcd   (ab|ab#)c#d
+t acd    (ab|ab#)c#d
+t abbcd  (ab|ab#)c#d
+t effgz  (bc##d|ef#g?|(h|)i(j|k))
+t efgz   (bc##d|ef#g?|(h|)i(j|k))
+t egz    (bc##d|ef#g?|(h|)i(j|k))
+t egzefffgzbcdij    (bc##d|ef#g?|(h|)i(j|k))#
+f egz    (bc##d|ef##g?|(h|)i(j|k))
+t ofoofo (ofo##)#
+t oxfoxoxfox    (oxf(ox)##)#
+f oxfoxfox      (oxf(ox)##)#
+t ofoofo        (ofo##|f)#
+# The following is supposed to match only as fo+ofo+ofo
+t foofoofo      (foo|f|fo)(f|ofo##)#
+t oofooofo      (of|oofo##)#
+t fffooofoooooffoofffooofff     (f#o#)#
+# If the following is really slow, that's a bug.
+f fffooofoooooffoofffooofffx     (f#o#)#
+# The following tests backtracking in alternation matches
+t fofoofoofofoo (fo|foo)#
+# Exclusion: test both types
+t foo           ((^x))
+t foo           ((^x)*)
+f foo           ((^foo))
+t foo           ((^foo)*)
+t foobar        ((^foo))
+t foobar        ((^foo)*)
+f foot          z*~*x
+t zoot          z*~*x
+f foox          z*~*x
+f zoox          z*~*x
+t moo.cow       (*~*.*).(*~*.*)
+f mad.moo.cow   (*~*.*).(*~*.*)
+t moo.cow       (^*.*).(^*.*)
+f sane.moo.cow  (^*.*).(^*.*)
+f mucca.pazza   mu(^c#)?.pa(^z#)?
+t fff           ((^f))
+t fff           ((^f)#)
+t fff           ((^f)##)
+t ooo           ((^f))
+t ooo           ((^f)#)
+t ooo           ((^f)##)
+t foo           ((^f))
+t foo           ((^f)#)
+t foo           ((^f)##)
+f f             ((^f))
+f f             ((^f)#)
+f f             ((^f)##)
+t foot          (^z*|*x)
+f zoot          (^z*|*x)
+t foox          (^z*|*x)
+t zoox          (^z*|*x)
+t foo           (^foo)#
+f foob          (^foo)b*
+t foobb         (^foo)b*
+f zsh           ^z*
+t a%1X          [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]]
+f a%1           [[:alpha:][:punct:]]#[[:digit:]][^[:lower:]]
+t [:            [[:]#
+t :]            []:]#
+t :]            [:]]#
+t [             [[]
+t ]             []]
+t []            [^]]]
+EOT
+print "$failed tests failed."
diff --git a/Misc/globtests.ksh b/Misc/globtests.ksh
new file mode 100755
index 000000000..b03cc488e
--- /dev/null
+++ b/Misc/globtests.ksh
@@ -0,0 +1,91 @@
+#!/usr/local/bin/zsh -f
+
+setopt kshglob
+
+failed=0
+while read res str pat; do
+  [[ $res = '#' ]] && continue
+  [[ $str = ${~pat} ]]
+  ts=$?
+  [[ $1 = -q ]] || print "$ts:  [[ $str = $pat ]]"
+  if [[ ( $ts -gt 0 && $res = t) || ($ts -eq 0 && $res = f) ]]; then
+    print "Test failed:  [[ $str = $pat ]]"
+    (( failed++ ))
+  fi
+done <<EOT
+t fofo                *(f*(o))
+t ffo                 *(f*(o))
+t foooofo             *(f*(o))
+t foooofof            *(f*(o))
+t fooofoofofooo       *(f*(o))
+f foooofof            *(f+(o))
+f xfoooofof           *(f*(o))
+f foooofofx           *(f*(o))
+t ofxoofxo            *(*(of*(o)x)o)
+f ofooofoofofooo      *(f*(o))
+t foooxfooxfoxfooox   *(f*(o)x)
+f foooxfooxofoxfooox  *(f*(o)x)
+t foooxfooxfxfooox    *(f*(o)x)
+t ofxoofxo            *(*(of*(o)x)o)
+t ofoooxoofxo         *(*(of*(o)x)o)
+t ofoooxoofxoofoooxoofxo            *(*(of*(o)x)o)
+t ofoooxoofxoofoooxoofxoo           *(*(of*(o)x)o)
+f ofoooxoofxoofoooxoofxofo          *(*(of*(o)x)o)
+t ofoooxoofxoofoooxoofxooofxofxo    *(*(of*(o)x)o)
+t aac    *(@(a))a@(c)
+t ac     *(@(a))a@(c)
+f c      *(@(a))a@(c)
+t aaac   *(@(a))a@(c)
+f baaac  *(@(a))a@(c)
+t abcd   ?@(a|b)*@(c)d
+t abcd   @(ab|a*@(b))*(c)d
+t acd    @(ab|a*(b))*(c)d
+t abbcd  @(ab|a*(b))*(c)d
+t effgz  @(b+(c)d|e*(f)g?|?(h)i@(j|k))
+t efgz   @(b+(c)d|e*(f)g?|?(h)i@(j|k))
+t egz    @(b+(c)d|e*(f)g?|?(h)i@(j|k))
+t egzefffgzbcdij    *(b+(c)d|e*(f)g?|?(h)i@(j|k))
+f egz    @(b+(c)d|e+(f)g?|?(h)i@(j|k))
+t ofoofo *(of+(o))
+t oxfoxoxfox    *(oxf+(ox))
+f oxfoxfox      *(oxf+(ox))
+t ofoofo        *(of+(o)|f)
+# The following is supposed to match only as fo+ofo+ofo
+t foofoofo      @(foo|f|fo)*(f|of+(o))
+t oofooofo      *(of|oof+(o))
+t fffooofoooooffoofffooofff      *(*(f)*(o))
+# If the following is really slow, that's a bug.
+f fffooofoooooffoofffooofffx     *(*(f)*(o))
+# The following tests backtracking in alternation matches
+t fofoofoofofoo *(fo|foo)
+# Exclusion
+t foo           !(x)
+t foo           !(x)*
+f foo           !(foo)
+t foo           !(foo)*
+t foobar        !(foo)
+t foobar        !(foo)*
+t moo.cow       !(*.*).!(*.*)
+f mad.moo.cow   !(*.*).!(*.*)
+f mucca.pazza   mu!(*(c))?.pa!(*(z))?
+t fff           !(f)
+t fff           *(!(f))
+t fff           +(!(f))
+t ooo           !(f)
+t ooo           *(!(f))
+t ooo           +(!(f))
+t foo           !(f)
+t foo           *(!(f))
+t foo           +(!(f))
+f f             !(f)
+f f             *(!(f))
+f f             +(!(f))
+t foot          @(!(z*)|*x)
+f zoot          @(!(z*)|*x)
+t foox          @(!(z*)|*x)
+t zoox          @(!(z*)|*x)
+t foo           *(!(foo))
+f foob          !(foo)b*
+t foobb         !(foo)b*
+EOT
+print "$failed tests failed."
diff --git a/Misc/lete2ctl b/Misc/lete2ctl
new file mode 100755
index 000000000..ca00b8aee
--- /dev/null
+++ b/Misc/lete2ctl
@@ -0,0 +1,301 @@
+#!/usr/local/bin/perl -w
+#
+#   ``Wee have also Shelles, thee Lyke of whych you knowe not, wherein
+#     thee User may with thee merest Presse of thee Tabbe-Keye expande
+#     or compleat al Maner of Wordes and such-like Diversities.''
+#            - Francis Bacon, `New Atlantis' (or not).
+#
+# Convert tcsh "complete" statements to zsh "compctl" statements.
+# Runs as a filter.  Should ignore anything which isn't a "complete".
+# It expects each "complete" statement to be the first thing on a line.
+# All the examples in the tcsh manual give sensible results.
+#
+# Option:
+# -x (exact): only applies in the case of command disambiguation (is
+#    that really a word?)  If you have lines like
+#       complete '-co*' 'p/0/(compress)'
+#    (which makes co<TAB> always complete to `compress') then the
+#    resulting "compctl" statements will produce one of two behaviours:
+#    (1) By default (like tcsh), com<TAB> etc. will also complete to
+#        "compress" and nothing else.
+#    (2) With -x, com<TAB> does ordinary command completion: this is
+#        more flexible.
+#    I don't understand what the hyphen in complete does and I've ignored it.
+#
+# Notes:
+# (1) The -s option is the way to do backquote expansion.  In zsh,
+#     "compctl -s '`users`' talk" works (duplicates are removed).
+# (2) Complicated backquote completions should definitely be rewritten as
+#     shell functions (compctl's "-K func" option).  Although most of
+#     these will be translated correctly, differences in shell syntax
+#     are not handled.
+# (3) Replacement of $:n with the n'th word on the current line with
+#     backquote expansion now works; it is not necessarily the most
+#     efficient way of doing it in any given case, however.
+# (4) I have made use of zsh's more sophisticated globbing to change
+#     things like ^foo.{a,b,c,d} to ^foo.(a|b|c|d), which works better.
+#     It's just possible in some cases you may want to change it back.
+# (5) Make sure all command names with wildcards are processed together --
+#     they need to be lumped into one "compctl -C" or "compctl -D"
+#     statement for zsh.
+
+# Handle options
+if (@ARGV) {
+    ($ARGV[0] eq '-x') && shift && ($opt_x = 1);
+    ($ARGV[0] =~ /^-+$/) && shift;
+}
+
+# Function names used (via magic autoincrement) when cmdline words are needed
+$funcnam = 'compfn001';
+
+# Read next word on command line
+sub getword {
+    local($word, $word2, $ret);
+    ($_) = /^\s*(.*)$/;
+    while ($_ =~ /^\S/) {
+	if (/^[\']/) {
+	    ($word, $_) = /^\'([^\']*).(.*)$/;
+	} elsif (/^[\"]/) {
+	    ($word, $_) = /^\"([^\"]*).(.*)$/;
+	    while ($word =~ /\\$/) {
+		chop($word);
+		($word2, $_) = /^([^\"]*).(.*)$/;
+		$word .= '"' . $word2;
+	    }
+	} elsif (/\S/) {
+	    ($word, $_) = /^([^\s\\\'\"\#;]*)(.*)$/;
+	    # Backslash: literal next character
+	    /^\\(.)/ && (($word .= substr($_,1,1)),
+			 ($_ = substr($_,2)));
+	    # Rest of line quoted or end of command
+	    /^[\#;]/ && ($_ = '');
+	} else {
+	    return undef;
+	}
+	length($word) && ($ret = defined($ret) ? $ret . $word : $word);
+    }
+    $ret;
+}
+
+# Interpret the x and arg in 'x/arg/type/'
+sub getpat {
+    local($pat,$arg) = @_;
+    local($ret,$i);
+    if ($pat eq 'p') {
+	$ret = "p[$arg]";
+    } elsif ($pat eq 'n' || $pat eq 'N') {
+	$let = ($arg =~ /[*?|]/) ? 'C' : 'c';
+	$num = ($pat eq 'N') ? 2 : 1;
+	$ret = "${let}[-${num},$arg]";
+    } elsif ($pat eq 'c' || $pat eq 'C') {
+	# A few tricks to get zsh to ignore up to the end of
+	# any matched pattern.
+	if (($pat eq 'c' && $arg =~ /^\*([^*?]*)$/)) {
+	    $ret = "n[-1,$1]";
+	} elsif ($arg =~ /[*?]([^*?]*)$/) {
+	    length($1) && ($ret = " n[-1,$1]");
+	    $ret = "C[0,$arg] $ret";
+	} else {
+	    $let = ($pat eq 'c') ? 's' : 'S';
+	    $ret = "${let}[$arg]";
+	}
+    }
+    $ret =~ s/'/'\\''/g;
+    $ret;
+}
+
+# Interpret the type in 'x/arg/type/'
+sub gettype {
+    local ($_) = @_;
+    local($qual,$c,$glob,$ret,$b,$m,$e,@m);
+    $c = substr($_,0,1);
+    ($c =~ /\w/) && (substr($_,1,1) eq ':') && ($glob = substr($_,2));
+# Nothing (n) can be handled by returning nothing.  (C.f. King Lear, I.i.)
+    if ($c =~ /[abcjuv]/) {
+	$ret = "-$c";
+    } elsif ($c eq 'S') {
+	$ret = '-k signals';
+    } elsif ($c eq 'd') {
+	if (defined($glob)) {
+	    $qual = '-/';
+	} else {
+	    $ret = '-/';
+	}
+    } elsif ($c eq 'e') {
+	$ret = '-E';
+    } elsif ($c eq 'f' && !$glob) {
+	$ret = '-f';
+    } elsif ($c eq 'l') {
+	$ret = q!-k "(`limit | awk '{print $1}'`)"!;
+    } elsif ($c eq 'p') {
+	$ret = "-W $glob -f", undef($glob) if defined($glob);
+    } elsif ($c eq 's') {
+	$ret = '-p';
+    } elsif ($c eq 't') {
+	$qual = '.';
+    } elsif ($c eq 'x') {
+	$glob =~ s/'/'\\''/g;
+	$ret = "-X '$glob'";
+	undef($glob);
+    } elsif ($c eq '$') {     # '){
+	$ret = "-k " . substr($_,1);
+    } elsif ($c eq '(') {
+	s/'/'\\''/g;
+	$ret = "-k '$_'";
+    } elsif ($c eq '`') {
+	# this took some working out...
+	if (s/\$:(\d+)/$foo=$1+1,"\${word[$foo]}"/ge) {
+	    $ret = "-K $funcnam";
+	    $genfunc .= <<"HERE";
+function $funcnam {
+    local word
+    read -cA word
+    reply=($_)
+}
+HERE
+	    $funcnam++;
+	} else {
+	    s/'/'\\''/g;
+	    $ret = "-s '$_'";
+	}
+    }
+
+    # foo{bar,ba,blak,sheap} -> foo(bar|ba|blak|sheap).
+    # This saves a lot of mess, since in zsh brace expansion occurs
+    # before globbing.  I'm sorry, but I don't trust $` and $'.
+    while (defined($glob) && (($b,$m,$e) = ($glob =~ /^(.*)\{(.*)\}(.*)$/))
+	   && $m =~ /,/) {
+	@m = split(/,/, $m);
+	for ($i = 0; $i < @m; $i++) {
+	    while ($m[$i] =~ /\\$/) {
+		substr($m[$i],-1,1) = "";
+		splice(@m,$i,2,"$m[$i]\\,$m[$i+1]");
+	    }
+	}
+	$glob = $b . "(" . join('|',@m) . ")" . $e;
+    }
+
+    if ($qual) {
+	$glob || ($glob = '*');
+	$glob .= "($qual)";
+    }
+    $glob && (($glob =~ s/'/'\\''/g),($glob = "-g '$glob'"));
+
+    defined($ret) && defined($glob) && ($ret .= " $glob");
+    defined($ret) ? $ret : $glob;
+}
+
+# Quoted array separator for extended completions
+$" = " - ";
+
+while (<>) {
+    if (/^\s*complete\s/) {
+	undef(@stuff); 
+	$default = '';
+	$_ = $';
+	while (/\\$/) {
+	    # Remove backslashed newlines: in principle these should become
+	    # real newlines inside quotes, but what the hell.
+	    ($_) = /^(.*)\\$/;
+	    $_ .= <>;
+	}
+	$command = &getword;
+	if ($command =~ /^-/ || $command =~ /[*?]/) {
+	    # E.g. complete -co* ...
+	    $defmatch = $command;
+	    ($defmatch =~ /^-/) && ($defmatch = substr($defmatch,1));
+	} else {
+	    undef($defmatch);
+	}
+	while (defined($word = &getword)) {
+	    # Loop over remaining arguments to "complete".
+	    $sep = substr($word,1,1);
+	    $sep =~ s/(\W)/\\$1/g;
+	    @split = split(/$sep/,$word);
+	    for ($i = 0; $i < 3; $i++) {
+		while ($split[$i] =~ /\\$/) {
+		    substr($split[$i],-1,1) = "";
+		    splice(@split,$i,2,"$split[$i]\\$sep$split[$i+1]");
+		}
+	    }
+	    ($pat,$arg,$type,$suffix) = @split;
+	    defined($suffix) && ($suffix =~ /^\s*$/) && undef($suffix);
+	    if (($word =~ /^n$sep\*$sep/) &&
+		 (!defined($defmatch))) {
+		 # The "complete" catch-all:  treat this as compctl\'s
+		 # default (requiring no pattern matching).
+		$default .= &gettype($type) . ' ';
+		defined($suffix) && ($defsuf .= $suffix);
+	    } else {
+		$pat = &getpat($pat,$arg);
+		$type = &gettype($type);
+		if (defined($defmatch)) {
+		    # The command is a pattern: use either -C or -D option.
+		    if ($pat eq 'p[0]') {
+			# Command word (-C): 'p[0]' is redundant.
+			if ($defmatch eq '*') {
+			    $defcommand = $type;
+			} else {
+			    ($defmatch =~ /\*$/) && chop($defmatch);
+			    if ($opt_x) {
+				$c = ($defmatch =~ /[*?]/) ? 'C' : 'c';
+				$pat = $c . "[0,${defmatch}]";
+			    } else {
+				$pat = ($defmatch =~ /[*?]/) ?
+				    "C[0,${defmatch}]" : "S[${defmatch}]";
+			    }
+			    push(@commandword,defined($suffix) ?
+				 "'$pat' $type -S '$suffix'" : "'$pat' $type");
+			}
+		    } elsif ($pat eq "C[-1,*]") {
+			# Not command word completion, but match
+			# command word (only)
+			if ($defmatch eq "*") {
+			    # any word of any command
+			    $defaultdefault .= " $type";
+			} else {
+			    $pat = "W[0,$defmatch]";
+			    push(@defaultword,defined($suffix) ?
+				 "'$pat' $type -S '$suffix'" : "'$pat' $type");
+			}
+		    } else {
+		        # Not command word completion, but still command
+			# word with pattern
+			($defmatch eq '*') || ($pat = "W[0,$defmatch] $pat");
+			push(@defaultword,defined($suffix) ?
+			     "'$pat' $type -S '$suffix'" : "'$pat' $type");
+		    }
+		} else {
+		    # Ordinary command
+		    push(@stuff,defined($suffix) ?
+			 "'$pat' $type -S '$suffix'" : "'$pat' $type");
+		}
+	    }
+	}
+        if (!defined($defmatch)) {
+	    # Ordinary commands with no pattern
+	    print("compctl $default");
+	    defined($defsuf) && print("-S '$defsuf' ") && undef($defsuf);
+	    defined(@stuff) && print("-x @stuff -- ");
+	    print("$command\n");
+	}
+	if (defined($genfunc)) {
+	    print $genfunc;
+	    undef($genfunc);
+	}
+    }
+}
+
+(defined(@commandword) || defined($defcommand)) &&
+    print("compctl -C ",
+	  defined($defcommand) ? $defcommand : '-c',
+	  defined(@commandword) ? " -x @commandword\n" : "\n");
+
+if (defined($defaultdefault) || defined(@defaultword)) {
+    defined($defaultdefault) || ($defaultdefault = "-f");
+    print "compctl -D $defaultdefault";
+    defined(@defaultword) && print(" -x @defaultword");
+    print "\n";
+}
+
+__END__
diff --git a/README b/README
new file mode 100644
index 000000000..6a591b263
--- /dev/null
+++ b/README
@@ -0,0 +1,135 @@
+-----------------
+THE Z SHELL (ZSH)
+-----------------
+
+Version
+-------
+
+This is zsh version 3.1 (beta)
+
+Note that this is a beta version.  The latest stable version is zsh-3.0.5.
+
+Installing Zsh
+--------------
+
+The instructions for compiling zsh are in the file INSTALL.  You should
+also check the file MACHINES in the subdirectory Etc to see if there
+are any special instructions for your particular architecture.
+
+Features
+--------
+
+Zsh is a shell with lots of features.  For a list of these, see the
+file Etc/FEATURES.  For more details, see the documentation.
+
+Documentation
+-------------
+
+There are a number of documents about zsh in this distribution:
+
+Doc/Zsh/*.yo	The master source for the zsh documentation is written in
+		yodl.  Yodl is a document language written by Karel Kubat.
+		It is not required by zsh but but it is a nice program so
+		you might want to get it anyway, especially if you are a
+		zsh developer.  It can be downloaded from
+		ftp://ftp.icce.rug.nl/pub/unix/yodl*
+
+Doc/zsh*.1	Man pages in nroff format.  These will be installed
+		by "make install.man" or "make install".  By default,
+		these will be installed in /usr/local/man/man1, although
+		you can change this with the --mandir option to configure
+		or editing the user configuration section of the top level
+		Makefile.
+
+Doc/zsh.texi	Everything the man pages have, but in texinfo format.  These
+		will be installed by "make install.info" or "make install".
+		By default, these will be installed in /usr/local/info,
+		although you can change this with the --infodir option to
+		configure or editing the user configuration section of the
+		top level Makefile.
+
+Also include in the distribution are:
+
+Doc/intro.ms	An introduction to zsh in troff format using the ms
+		macros.  This document explains many of the features
+		that make zsh more equal than other shells.
+		Unfortunately this is based on zsh-2.5 so some examples
+		may not work without changes but it is still a good
+		introduction.
+
+If you do not have the necessary tools to process these documents,
+PostScript, ASCII, Info and DVI versions are available in the separate
+file zsh-beta-doc.tar.gz at the archive sites listed in the META-FAQ.
+
+The distribution also contains a Perl script in Utils/helpfiles which
+can be used to extract the descriptions of builtin commands from the
+zshbuiltins manual page.  See the comments at the beginning of the
+script about its usage.  The files created by this script can be used
+by example function run-help located in the subdirectory Functions to
+show information about zsh builtins and run `man' on external commands.
+For this the shell variable HELPDIR should point to a directory containing
+the fileles generated by the helpfiles script.  run-help should be
+unaliased before loading the run-help function.  After that this function
+will be executed by the run-help ZLE function which is by default bound
+to ESC-h in emacs mode.
+
+Examples
+--------
+
+Examples of zsh startup files are located in the subdirectory
+StartupFiles.  Examples of zsh functions and scripts are located in
+the subdirectory Functions.  Examples of completion control commands
+(compctl) are located in the file Misc/compctl-examples.
+
+Zsh FTP Sites, Web Pages, and Mailing Lists
+-------------------------------------------
+
+The current list of zsh FTP sites, web pages, and mailing lists can be
+found in the META-FAQ.  A copy is included in this distribution and is
+available separately at any of the zsh FTP sites.
+
+Common Problems and Frequently Asked Questions
+----------------------------------------------
+
+Zsh has a list of Frequently Asked Questions (FAQ) maintained by Peter
+Stephenson <pws@zsh.org>.  It covers many common problems encountered
+when building, installing, and using zsh.  A copy is included in this
+distribution in Etc/FAQ and is available separately at any of the zsh
+ftp sites.
+
+Zsh Maintenance and Bug Reports
+-------------------------------
+
+Zsh is currently maintained by the members of the zsh-workers mailing list
+and coordinated by Andrew Main (Zefram) <zefram@zsh.org>.  Please send
+any feedback and bugs reports to <zsh-workers@math.gatech.edu>.
+
+There is a script "reporter" in the subdirectory Util which will print
+out your current shell environment/setup.  If you report a bug, please
+use this script and include the output from sourcing this file.  This way,
+the problem you are reporting can be recreated.
+
+You can help even more if you can reproduce the bug starting zsh with
+the -f option.  This skips the execution of local startup files except
+/etc/zshenv.  If a bug occurs only when some options set try to locate
+the option which triggers the bug.
+
+The known bugs in zsh are listed in the file Etc/BUGS.  Check this as
+well as the Frequently Asked Questions (FAQ) list before sending a bug
+report.  Note that zsh has some features which are not compatible with
+sh but these are not bugs.  Most of these incompatibilities go away
+when zsh is invoked as sh or ksh (e.g. using a symbolic link).
+
+If you send a bug report to the list and are not a subscriber, please
+mention this in your message if you want a response.
+
+If you would like to contribute to the development and maintenance of zsh,
+then you should join the zsh-workers mailing list (check the META-FAQ
+for info on this).  You should also read the "zsh-development-guide"
+located in the subdirectory Util.
+
+Contributors
+------------
+
+The people who have contributed to this software project are listed
+in Etc/CONTRIBUTORS.
diff --git a/acconfig.h b/acconfig.h
new file mode 100644
index 000000000..c74d33966
--- /dev/null
+++ b/acconfig.h
@@ -0,0 +1,221 @@
+
+/***** begin user configuration section *****/
+
+/* Define this to be the location of your password file */
+#define PASSWD_FILE "/etc/passwd"
+
+/* Define this to be the name of your NIS/YP password *
+ * map (if applicable)                                */
+#define PASSWD_MAP "passwd.byname"
+
+/* Define to 1 if you want user names to be cached */
+#define CACHE_USERNAMES 1
+
+/* Define to 1 if system supports job control */
+#define JOB_CONTROL 1
+
+/* Define this if you use "suspended" instead of "stopped" */
+#define USE_SUSPENDED 1
+ 
+/* The default history buffer size in lines */
+#define DEFAULT_HISTSIZE 30
+
+/* The default editor for the fc builtin */
+#define DEFAULT_FCEDIT "vi"
+
+/* The default prefix for temporary files */
+#define DEFAULT_TMPPREFIX "/tmp/zsh"
+
+
+/***** end of user configuration section            *****/
+/***** shouldn't have to change anything below here *****/
+@TOP@
+
+/* The global file to source absolutely first whenever zsh is run; *
+ * if undefined, don't source anything                             */
+#undef GLOBAL_ZSHENV
+
+/* The global file to source whenever zsh is run; *
+ * if undefined, don't source anything            */
+#undef GLOBAL_ZSHRC
+
+/* The global file to source whenever zsh is run as a login shell; *
+ * if undefined, don't source anything                             */
+#undef GLOBAL_ZLOGIN
+
+/* The global file to source whenever zsh is run as a login shell, *
+ * before zshrc is read; if undefined, don't source anything       */
+#undef GLOBAL_ZPROFILE
+
+/* The global file to source whenever zsh was run as a login shell.  *
+ * This is sourced right before exiting.  If undefined, don't source *
+ * anything                                                          */
+#undef GLOBAL_ZLOGOUT
+
+/* Define to 1 if compiler could initialise a union */
+#undef HAVE_UNION_INIT
+
+/* Define to 1 if compiler incorrectly cast signed to unsigned */
+#undef BROKEN_SIGNED_TO_UNSIGNED_CASTING
+
+/* Define to 1 if compiler supports variable-length arrays */
+#undef HAVE_VARIABLE_LENGTH_ARRAYS
+
+/* Define if your system defines TIOCGWINSZ in sys/ioctl.h.  */
+#undef GWINSZ_IN_SYS_IOCTL
+
+/* Define to 1 if you have NIS */
+#undef HAVE_NIS
+
+/* Define to 1 if you have NISPLUS */
+#undef HAVE_NIS_PLUS
+
+/* Define to 1 if you have RFS superroot directory. */
+#undef HAVE_SUPERROOT
+
+/* Define to the path of the /dev/fd filesystem */
+#undef PATH_DEV_FD
+
+/* Define if sys/time.h and sys/select.h cannot be both included */
+#undef TIME_H_SELECT_H_CONFLICTS
+
+/* Define to be the machine type (microprocessor class or machine model) */
+#undef MACHTYPE
+
+/* Define to be the name of the operating system */
+#undef OSTYPE
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+
+/* Define to be location of utmp file. */
+#undef PATH_UTMP_FILE
+
+/* Define to be location of utmpx file. */
+#undef PATH_UTMPX_FILE
+
+/* Define to be location of wtmp file. */
+#undef PATH_WTMP_FILE
+
+/* Define to be location of wtmpx file. */
+#undef PATH_WTMPX_FILE
+
+/* Define to 1 if struct utmp is defined by a system header */
+#undef HAVE_STRUCT_UTMP
+
+/* Define to 1 if struct utmpx is defined by a system header */
+#undef HAVE_STRUCT_UTMPX
+
+/* Define if your system's struct utmp has a member named ut_host.  */
+#undef HAVE_STRUCT_UTMP_UT_HOST
+
+/* Define if your system's struct utmpx has a member named ut_host.  */
+#undef HAVE_STRUCT_UTMPX_UT_HOST
+
+/* Define if your system's struct utmpx has a member named ut_xtime.  */
+#undef HAVE_STRUCT_UTMPX_UT_XTIME
+
+/* Define if your system's struct utmpx has a member named ut_tv.  */
+#undef HAVE_STRUCT_UTMPX_UT_TV
+
+/* Define if your system's struct dirent has a member named d_ino.  */
+#undef HAVE_STRUCT_DIRENT_D_INO
+
+/* Define if your system's struct dirent has a member named d_stat.  */
+#undef HAVE_STRUCT_DIRENT_D_STAT
+
+/* Define if your system's struct direct has a member named d_ino.  */
+#undef HAVE_STRUCT_DIRECT_D_INO
+
+/* Define if your system's struct direct has a member named d_stat.  */
+#undef HAVE_STRUCT_DIRECT_D_STAT
+
+/* Define to be a string corresponding the vendor of the machine */
+#undef VENDOR
+
+/* Define if your system defines `struct winsize' in sys/ptem.h.  */
+#undef WINSIZE_IN_PTEM
+
+/* Define to 1 if you want to debug zsh */
+#undef DEBUG
+
+/* Define to 1 if you want to use zsh's own memory allocation routines */
+#undef ZSH_MEM
+
+/* Define to 1 if you want to debug zsh memory allocation routines */
+#undef ZSH_MEM_DEBUG
+
+/* Define to 1 if you want to turn on warnings of memory allocation errors */
+#undef ZSH_MEM_WARNING
+
+/* Define to 1 if you want to turn on memory checking for free() */
+#undef ZSH_SECURE_FREE
+
+/* Define to 1 if you want to get debugging information on internal *
+ * hash tables.  This turns on the `hashinfo' builtin.              */
+#undef ZSH_HASH_DEBUG
+
+/* Define to 1 if your termcap library has the ospeed variable */
+#undef HAVE_OSPEED
+/* Define to 1 if you have ospeed, but it is not defined in termcap.h */
+#undef MUST_DEFINE_OSPEED
+
+/* Define to 1 if tgetent() accepts NULL as a buffer */
+#undef TGETENT_ACCEPTS_NULL
+
+/* Define to 1 if you use POSIX style signal handling */
+#undef POSIX_SIGNALS
+
+/* Define to 1 if you use BSD style signal handling (and can block signals) */
+#undef BSD_SIGNALS
+
+/* Define to 1 if you use SYS style signal handling (and can block signals) */
+#undef SYSV_SIGNALS
+
+/* Define to 1 if you have no signal blocking at all (bummer) */
+#undef NO_SIGNAL_BLOCKING
+
+/* Define to `unsigned int' if <sys/types.h> or <signal.h> doesn't define */
+#undef sigset_t
+
+/* Define to 1 if struct timezone is defined by a system header */
+#undef HAVE_STRUCT_TIMEZONE
+
+/* Define if your system's typeahead disappears from the shell editor. */
+#undef CLOBBERS_TYPEAHEAD
+
+/* Define to 1 if there is a prototype defined for brk() on your system */
+#undef HAVE_BRK_PROTO
+
+/* Define to 1 if there is a prototype defined for sbrk() on your system */
+#undef HAVE_SBRK_PROTO
+
+/* Define to 1 if there is a prototype defined for ioctl() on your system */
+#undef HAVE_IOCTL_PROTO
+
+/* Define to 1 if system has working FIFO's */
+#undef HAVE_FIFOS
+
+/* Define to 1 if struct rlimit use quad_t */
+#undef RLIM_T_IS_QUAD_T
+
+/* Define to 1 if rlimit use unsigned */
+#undef RLIM_T_IS_UNSIGNED
+
+/* Define to the type used in struct rlimit */
+#undef rlim_t
+
+/* Define to 1 if /bin/sh does not interpret \ escape sequences */
+#undef SH_USE_BSD_ECHO
+
+/* Define to 1 if an underscore has to be prepended to dlsym() argument */
+#undef DLSYM_NEEDS_UNDERSCORE
+
+/* Define to 1 if multiple modules defining the same symbol are OK */
+#undef DYNAMIC_NAME_CLASH_OK
+
+/* The exension used for dynamically loaded modules */
+#undef DL_EXT
+
+/* Define to 1 if you want to use dynamically loaded modules */
+#undef DYNAMIC
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 000000000..672341b58
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,52 @@
+# Local additions to Autoconf macros.
+# Copyright (C) 1992, 1994 Free Software Foundation, Inc.
+# Francois Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# @defmac fp_PROG_CC_STDC
+# @maindex PROG_CC_STDC
+# @ovindex CC
+# If the C compiler in not in ANSI C mode by default, try to add an option
+# to output variable @code{CC} to make it so.  This macro tries various
+# options that select ANSI C on some system or another.  It considers the
+# compiler to be in ANSI C mode if it defines @code{__STDC__} to 1 and
+# handles function prototypes correctly.
+# 
+# If you use this macro, you should check after calling it whether the C
+# compiler has been set to accept ANSI C; if not, the shell variable
+# @code{fp_cv_prog_cc_stdc} is set to @samp{no}.  If you wrote your source
+# code in ANSI C, you can make an un-ANSIfied copy of it by using the
+# program @code{ansi2knr}, which comes with Ghostscript.
+# @end defmac
+
+define(fp_PROG_CC_STDC,
+[AC_CACHE_CHECK(for ${CC-cc} option to accept ANSI C,
+fp_cv_prog_cc_stdc,
+[fp_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX			-Aa -D_HPUX_SOURCE
+# SVR4			-Xc
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  AC_TRY_COMPILE(
+[#ifndef __STDC__
+choke me
+#endif	
+], [int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};],
+[fp_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CFLAGS="$ac_save_CFLAGS"
+])
+case "x$fp_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $fp_cv_prog_cc_stdc" ;;
+esac
+])
+
+builtin(include, aczsh.m4)
diff --git a/aczsh.m4 b/aczsh.m4
new file mode 100644
index 000000000..44dd81f27
--- /dev/null
+++ b/aczsh.m4
@@ -0,0 +1,433 @@
+dnl
+dnl  Autconf tests for zsh.
+dnl
+dnl  Copyright (c) 1995-1997 Richard Coleman
+dnl  All rights reserved.
+dnl
+dnl  Permission is hereby granted, without written agreement and without
+dnl  license or royalty fees, to use, copy, modify, and distribute this
+dnl  software and to distribute modified versions of this software for any
+dnl  purpose, provided that the above copyright notice and the following
+dnl  two paragraphs appear in all copies of this software.
+dnl
+dnl  In no event shall Richard Coleman or the Zsh Development Group be liable
+dnl  to any party for direct, indirect, special, incidental, or consequential
+dnl  damages arising out of the use of this software and its documentation,
+dnl  even if Richard Coleman and the Zsh Development Group have been advised of
+dnl  the possibility of such damage.
+dnl
+dnl  Richard Coleman and the Zsh Development Group specifically disclaim any
+dnl  warranties, including, but not limited to, the implied warranties of
+dnl  merchantability and fitness for a particular purpose.  The software
+dnl  provided hereunder is on an "as is" basis, and Richard Coleman and the
+dnl  Zsh Development Group have no obligation to provide maintenance,
+dnl  support, updates, enhancements, or modifications.
+dnl
+
+dnl
+dnl zsh_SYS_DYNAMIC_BROKEN
+dnl   Check whether static/shared library linking is broken.
+dnl
+dnl   On some systems, static modifiable library symbols (such as environ)
+dnl   may appear only in statically linked libraries.  If this is the case,
+dnl   then two shared libraries that reference the same symbol, each linked
+dnl   with the static library, could be given distinct copies of the symbol.
+dnl   If this is the case then dynamic linking is FUBAR.
+dnl
+
+AC_DEFUN(zsh_SYS_DYNAMIC_BROKEN,
+[AC_CACHE_CHECK([if static/shared library linking is broken],
+zsh_cv_sys_dynamic_broken,
+[if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
+    us=_
+else
+    us=
+fi
+echo '
+	extern char **environ;
+	void *symlist1[] = {
+		(void *)&environ,
+		(void *)0
+	};
+' > conftest1.c
+sed 's/symlist1/symlist2/' < conftest1.c > conftest2.c
+if $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
+$DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS 1>&5 2>&5 &&
+$CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&5 2>&5 &&
+$DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&5 2>&5; then
+    AC_TRY_RUN([
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+
+main()
+{
+    void *handle1, *handle2;
+    void **symlist1, **symlist2;
+    handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle1) exit(1);
+    handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle2) exit(1);
+    symlist1 = (void **) dlsym(handle1, "${us}symlist1");
+    symlist2 = (void **) dlsym(handle2, "${us}symlist2");
+    if(!symlist1 || !symlist2) exit(1);
+    for(; *symlist1; symlist1++, symlist2++)
+	if(*symlist1 != *symlist2)
+	    exit(1);
+    exit(0);
+}
+], [zsh_cv_sys_dynamic_broken=no],
+[zsh_cv_sys_dynamic_broken=yes],
+[zsh_cv_sys_dynamic_broken=yes]
+)
+else
+    zsh_cv_sys_dynamic_broken=yes
+fi
+])
+])
+
+dnl
+dnl zsh_SYS_DYNAMIC_CLASH
+dnl   Check whether symbol name clashes in shared libraries are acceptable.
+dnl
+
+AC_DEFUN(zsh_SYS_DYNAMIC_CLASH,
+[AC_CACHE_CHECK([if name clashes in shared objects are OK],
+zsh_cv_sys_dynamic_clash_ok,
+[if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
+    us=_
+else
+    us=
+fi
+echo 'int fred () { return 42; }' > conftest1.c
+echo 'int fred () { return 69; }' > conftest2.c
+if $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
+$DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS 1>&5 2>&5 &&
+$CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&5 2>&5 &&
+$DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&5 2>&5; then
+    AC_TRY_RUN([
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+
+main()
+{
+    void *handle1, *handle2;
+    int (*fred1)(), (*fred2)();
+    handle1 = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle1) exit(1);
+    handle2 = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle2) exit(1);
+    fred1 = (int (*)()) dlsym(handle1, "${us}fred");
+    fred2 = (int (*)()) dlsym(handle2, "${us}fred");
+    if(!fred1 || !fred2) exit(1);
+    exit((*fred1)() != 42 || (*fred2)() != 69);
+}
+], [zsh_cv_sys_dynamic_clash_ok=yes],
+[zsh_cv_sys_dynamic_clash_ok=no],
+[zsh_cv_sys_dynamic_clash_ok=no]
+)
+else
+    zsh_cv_sys_dynamic_clash_ok=no
+fi
+])
+if test "$zsh_cv_sys_dynamic_clash_ok" = yes; then
+    AC_DEFINE(DYNAMIC_NAME_CLASH_OK)
+fi
+])
+
+dnl
+dnl zsh_SYS_DYNAMIC_GLOBAL
+dnl   Check whether symbols in one dynamically loaded library are
+dnl   available to another dynamically loaded library.
+dnl
+
+AC_DEFUN(zsh_SYS_DYNAMIC_GLOBAL,
+[AC_CACHE_CHECK([for working RTLD_GLOBAL],
+zsh_cv_sys_dynamic_rtld_global,
+[if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
+    us=_
+else
+    us=
+fi
+echo 'int fred () { return 42; }' > conftest1.c
+echo 'extern int fred(); int barney () { return fred() + 27; }' > conftest2.c
+if $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
+$DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS 1>&5 2>&5 &&
+$CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest2.c 1>&5 2>&5 &&
+$DLLD -o conftest2.$DL_EXT $LDFLAGS $DLLDFLAGS conftest2.o $LIBS 1>&5 2>&5; then
+    AC_TRY_RUN([
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+
+main()
+{
+    void *handle;
+    int (*barneysym)();
+    handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle) exit(1);
+    handle = dlopen("./conftest2.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle) exit(1);
+    barneysym = (int (*)()) dlsym(handle, "${us}barney");
+    if(!barneysym) exit(1);
+    exit((*barneysym)() != 69);
+}
+], [zsh_cv_sys_dynamic_rtld_global=yes],
+[zsh_cv_sys_dynamic_rtld_global=no],
+[zsh_cv_sys_dynamic_rtld_global=no]
+)
+else
+    zsh_cv_sys_dynamic_rtld_global=no
+fi
+])
+])
+
+dnl
+dnl zsh_SYS_DYNAMIC_EXECSYMS
+dnl   Check whether symbols in the executable are available to dynamically
+dnl   loaded libraries.
+dnl
+
+AC_DEFUN(zsh_SYS_DYNAMIC_EXECSYMS,
+[AC_CACHE_CHECK([whether symbols in the executable are available],
+zsh_cv_sys_dynamic_execsyms,
+[if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
+    us=_
+else
+    us=
+fi
+echo 'extern int fred(); int barney () { return fred() + 27; }' > conftest1.c
+if $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
+$DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS 1>&5 2>&5; then
+    save_ldflags=$LDFLAGS
+    LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
+    AC_TRY_RUN([
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+
+main()
+{
+    void *handle;
+    int (*barneysym)();
+    handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle) exit(1);
+    barneysym = (int (*)()) dlsym(handle, "${us}barney");
+    if(!barneysym) exit(1);
+    exit((*barneysym)() != 69);
+}
+
+int fred () { return 42; }
+], [zsh_cv_sys_dynamic_execsyms=yes],
+[zsh_cv_sys_dynamic_execsyms=no],
+[zsh_cv_sys_dynamic_execsyms=no]
+)
+    LDFLAGS=$save_ldflags
+else
+    zsh_cv_sys_dynamic_execsyms=no
+fi
+])
+])
+
+dnl
+dnl zsh_SYS_DYNAMIC_STRIP_EXE
+dnl   Check whether it is safe to strip executables.
+dnl
+
+AC_DEFUN(zsh_SYS_DYNAMIC_STRIP_EXE,
+[AC_REQUIRE([zsh_SYS_DYNAMIC_EXECSYMS])
+AC_CACHE_CHECK([whether executables can be stripped],
+zsh_cv_sys_dynamic_strip_exe,
+[if test "$zsh_cv_sys_dynamic_execsyms" != yes; then
+    zsh_cv_sys_dynamic_strip_exe=yes
+elif
+    if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
+	us=_
+    else
+	us=
+    fi
+    echo 'extern int fred(); int barney() { return fred() + 27; }' > conftest1.c
+    $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
+    $DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS conftest1.o $LIBS 1>&5 2>&5; then
+    save_ldflags=$LDFLAGS
+    LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS -s"
+    AC_TRY_RUN([
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+
+main()
+{
+    void *handle;
+    int (*barneysym)();
+    handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle) exit(1);
+    barneysym = (int (*)()) dlsym(handle, "${us}barney");
+    if(!barneysym) exit(1);
+    exit((*barneysym)() != 69);
+}
+
+int fred () { return 42; }
+], [zsh_cv_sys_dynamic_strip_exe=yes],
+[zsh_cv_sys_dynamic_strip_exe=no],
+[zsh_cv_sys_dynamic_strip_exe=no]
+)
+    LDFLAGS=$save_ldflags
+else
+    zsh_cv_sys_dynamic_strip_exe=no
+fi
+])
+])
+
+dnl
+dnl zsh_SYS_DYNAMIC_STRIP_EXE
+dnl   Check whether it is safe to strip dynamically loaded libraries.
+dnl
+
+AC_DEFUN(zsh_SYS_DYNAMIC_STRIP_LIB,
+[AC_CACHE_CHECK([whether libraries can be stripped],
+zsh_cv_sys_dynamic_strip_lib,
+[if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
+    us=_
+else
+    us=
+fi
+echo 'int fred () { return 42; }' > conftest1.c
+if $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest1.c 1>&5 2>&5 &&
+$DLLD -o conftest1.$DL_EXT $LDFLAGS $DLLDFLAGS -s conftest1.o $LIBS 1>&5 2>&5; then
+    AC_TRY_RUN([
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+#ifndef RTLD_GLOBAL
+#define RTLD_GLOBAL 0
+#endif
+
+main()
+{
+    void *handle;
+    int (*fredsym)();
+    handle = dlopen("./conftest1.$DL_EXT", RTLD_LAZY | RTLD_GLOBAL);
+    if(!handle) exit(1);
+    fredsym = (int (*)()) dlsym(handle, "${us}fred");
+    if(!fredsym) exit(1);
+    exit((*fredsym)() != 42);
+}
+], [zsh_cv_sys_dynamic_strip_lib=yes],
+[zsh_cv_sys_dynamic_strip_lib=no],
+[zsh_cv_sys_dynamic_strip_lib=no]
+)
+else
+    zsh_cv_sys_dynamic_strip_lib=no
+fi
+])
+])
+
+dnl
+dnl zsh_PATH_UTMP(filename)
+dnl   Search for a specified utmp-type file.
+dnl
+
+AC_DEFUN(zsh_PATH_UTMP,
+[AC_CACHE_CHECK([for $1 file], [zsh_cv_path_$1],
+[for dir in /etc /usr/etc /var/adm /usr/adm /var/run ./conftest; do
+  zsh_cv_path_$1=${dir}/$1
+  test -f $zsh_cv_path_$1 && break
+  zsh_cv_path_$1=no
+done
+])
+if test $zsh_cv_path_$1 != no; then
+  AC_DEFINE_UNQUOTED(PATH_[]translit($1, [a-z], [A-Z])[]_FILE, "$zsh_cv_path_$1")
+fi
+])
+
+dnl
+dnl zsh_TYPE_EXISTS(#includes, type name)
+dnl   Check whether a specified type exists.
+dnl
+
+AC_DEFUN(zsh_TYPE_EXISTS,
+[AC_CACHE_CHECK([for $2], [zsh_cv_type_exists_[]translit($2, [ ], [_])],
+[AC_TRY_COMPILE([$1], [$2 testvar;],
+[zsh_cv_type_exists_[]translit($2, [ ], [_])=yes],
+[zsh_cv_type_exists_[]translit($2, [ ], [_])=no])
+])
+if test $zsh_cv_type_exists_[]translit($2, [ ], [_]) = yes; then
+  AC_DEFINE(HAVE_[]translit($2, [ a-z], [_A-Z]))
+fi
+])
+
+dnl
+dnl zsh_STRUCT_MEMBER(#includes, type name, member name)
+dnl   Check whether a specified aggregate type exists and contains
+dnl   a specified member.
+dnl
+
+AC_DEFUN(zsh_STRUCT_MEMBER,
+[AC_CACHE_CHECK([for $3 in $2], [zsh_cv_struct_member_[]translit($2, [ ], [_])_$3],
+[AC_TRY_COMPILE([$1], [$2 testvar; testvar.$3;],
+[zsh_cv_struct_member_[]translit($2, [ ], [_])_$3=yes],
+[zsh_cv_struct_member_[]translit($2, [ ], [_])_$3=no])
+])
+if test $zsh_cv_struct_member_[]translit($2, [ ], [_])_$3 = yes; then
+  AC_DEFINE(HAVE_[]translit($2_$3, [ a-z], [_A-Z]))
+fi
+])
diff --git a/config.guess b/config.guess
new file mode 100755
index 000000000..92b77bc52
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,698 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc.
+#
+# This 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:*:*)
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
+	exit 0 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-cbm-sysv4
+	exit 0;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    amiga:OpenBSD:*:*)
+      echo m68k-cbm-openbsd${UNAME_RELEASE}
+      exit 0 ;;
+    sa110:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-unknown-linux
+	exit 0;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    NILE:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit 0 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:NetBSD:*:*)
+	echo m68k-atari-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    atari*:OpenBSD:*:*)
+	echo m68k-atari-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sun3*:NetBSD:*:*)
+	echo m68k-sun-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    sun3*:OpenBSD:*:*)
+	echo m68k-sun-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:NetBSD:*:*)
+	echo m68k-apple-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    mac68k:OpenBSD:*:*)
+	echo m68k-apple-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit 0 ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit 0 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	sed 's/^	//' << EOF >dummy.c
+	int main (argc, argv) int argc; char **argv; {
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	${CC-cc} dummy.c -o dummy \
+	  && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm dummy.c dummy && exit 0
+	rm -f dummy.c dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit 0 ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit 0 ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit 0 ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+        if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+	if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+	     -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	fi
+        else echo i586-dg-dgux${UNAME_RELEASE}
+        fi
+ 	exit 0 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit 0 ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit 0 ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+	exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+	echo i386-ibm-aix
+	exit 0 ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		sed 's/^		//' << EOF >dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+		rm -f dummy.c dummy
+		echo rs6000-ibm-aix3.2.5
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit 0 ;;
+    *:AIX:*:4)
+	if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=4.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit 0 ;;
+    9000/[3478]??:HP-UX:*:*)
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
+	    9000/8?? )            HP_ARCH=hppa1.0 ;;
+	esac
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    3050*:HI-UX:*:*)
+	sed 's/^	//' << EOF >dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+	rm -f dummy.c dummy
+	echo unknown-hitachi-hiuxwe2
+	exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit 0 ;;
+    i?86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit 0 ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE}
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+	echo m68k-hp-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    hp3[0-9][05]:OpenBSD:*:*)
+	echo m68k-hp-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i?86:BSD/386:*:* | *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit 0 ;;
+    *:NetBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    *:OpenBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	exit 0 ;;
+    i*:CYGWIN*:*)
+	echo i386-pc-cygwin32
+	exit 0 ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin32
+	exit 0 ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit 0 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    *:Linux:*:*)
+	# The BFD linker knows what the default object file format is, so
+	# first see if it will tell us.
+	ld_help_string=`ld --help 2>&1`
+	if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then
+	  echo "${UNAME_MACHINE}-pc-linux" ; exit 0
+	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32arm"; then
+	  echo "arm-unknown-linux" ; exit 0
+	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then
+	  echo "${UNAME_MACHINE}-pc-linuxaout" ; exit 0
+	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then
+	  echo "${UNAME_MACHINE}-pc-linuxcoff" ; exit 0
+	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
+	  echo "${UNAME_MACHINE}-unknown-linux" ; exit 0
+	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
+	  echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0
+	elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then
+	  echo "powerpc-unknown-linux" ; exit 0
+	elif test "${UNAME_MACHINE}" = "alpha" ; then
+	  echo alpha-unknown-linux ; exit 0
+	elif test "${UNAME_MACHINE}" = "sparc" ; then
+	  echo sparc-unknown-linux ; exit 0
+	else
+	  # Either a pre-BFD a.out linker (linuxoldld) or one that does not give us
+	  # useful --help.  Gcc wants to distinguish between linuxoldld and linuxaout.
+	  test ! -d /usr/lib/ldscripts/. \
+	    && echo "${UNAME_MACHINE}-pc-linuxoldld" && exit 0
+	  # Determine whether the default compiler is a.out or elf
+	  cat >dummy.c <<EOF
+main(argc, argv)
+int argc;
+char *argv[];
+{
+#ifdef __ELF__
+  printf ("%s-pc-linux\n", argv[1]);
+#else
+  printf ("%s-pc-linuxaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	  ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+	  rm -f dummy.c dummy
+	fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+	fi
+	exit 0 ;;
+    i?86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit 0 ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit 0 ;;
+    M68*:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i?86:LynxOS:2.*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit 0 ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit 0 ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit 0 ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit 0 ;;
+    R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
+	if [ -d /usr/nec ]; then
+	        echo mips-nec-sysv${UNAME_RELEASE}
+	else
+	        echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+        exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+	  ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit 0 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit 0 ;;
+    c34*)
+	echo c34-convex-bsd
+	exit 0 ;;
+    c38*)
+	echo c38-convex-bsd
+	exit 0 ;;
+    c4*)
+	echo c4-convex-bsd
+	exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.sub b/config.sub
new file mode 100755
index 000000000..c5aecfe37
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,924 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+	echo Configuration name missing. 1>&2
+	echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+	echo "or     $0 ALIAS" 1>&2
+	echo where ALIAS is a recognized configuration type. 1>&2
+	exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+	*local*)
+		echo $1
+		exit 0
+		;;
+	*)
+	;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple)
+		os=
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco5)
+		os=sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \
+		| arme[lb] | pyramid \
+		| tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
+		| alpha | we32k | ns16k | clipper | i370 | sh \
+		| powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
+		| pdp11 | mips64el | mips64orion | mips64orionel \
+		| sparc | sparclet | sparclite | sparc64)
+		basic_machine=$basic_machine-unknown
+		;;
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i[3456]86)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
+	      | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+	      | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+	      | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
+	      | mips64el-* | mips64orion-* | mips64orionel-* | f301-*)
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-cbm
+		;;
+	amigados)
+		basic_machine=m68k-cbm
+		os=-amigados
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-cbm
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	cray2)
+		basic_machine=cray2-cray
+		os=-unicos
+		;;
+	[ctj]90-cray)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i[3456]86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i[3456]86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i[3456]86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i[3456]86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+        pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pentium | p5)
+		basic_machine=i586-intel
+		;;
+	pentiumpro | p6)
+		basic_machine=i686-intel
+		;;
+	pentium-* | p5-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	k5)
+		# We don't have specific support for AMD's K5 yet, so just call it a Pentium
+		basic_machine=i586-amd
+		;;
+	nexen)
+		# We don't have specific support for Nexgen yet, so just call it a Pentium
+		basic_machine=i586-nexgen
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=rs6000-ibm
+		;;
+	ppc)	basic_machine=powerpc-unknown
+	        ;;
+	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+	        ;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	xmp)
+		basic_machine=xmp-cray
+		os=-unicos
+		;;
+        xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	mips)
+		basic_machine=mips-mips
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sparc)
+		basic_machine=sparc-sun
+		;;
+        cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-unixware* | svr4*)
+		os=-sysv4
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -linux* | -uxpv*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-ns2 )
+	        os=-nextstep2
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigados
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+        *-gould)
+		os=-sysv
+		;;
+        *-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+        *-sgi)
+		os=-irix
+		;;
+        *-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f301-fujitsu)
+		os=-uxpv
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-vxsim* | -vxworks*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
diff --git a/configure.in b/configure.in
new file mode 100644
index 000000000..aa3170732
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,1113 @@
+dnl
+dnl  configure.in: Configure template for zsh.
+dnl  Process this file with autoconf to produce a configure script.
+dnl
+dnl  Copyright (c) 1995-1997 Richard Coleman
+dnl  All rights reserved.
+dnl
+dnl  Permission is hereby granted, without written agreement and without
+dnl  license or royalty fees, to use, copy, modify, and distribute this
+dnl  software and to distribute modified versions of this software for any
+dnl  purpose, provided that the above copyright notice and the following
+dnl  two paragraphs appear in all copies of this software.
+dnl
+dnl  In no event shall Richard Coleman or the Zsh Development Group be liable
+dnl  to any party for direct, indirect, special, incidental, or consequential
+dnl  damages arising out of the use of this software and its documentation,
+dnl  even if Richard Coleman and the Zsh Development Group have been advised of
+dnl  the possibility of such damage.
+dnl
+dnl  Richard Coleman and the Zsh Development Group specifically disclaim any
+dnl  warranties, including, but not limited to, the implied warranties of
+dnl  merchantability and fitness for a particular purpose.  The software
+dnl  provided hereunder is on an "as is" basis, and Richard Coleman and the
+dnl  Zsh Development Group have no obligation to provide maintenance,
+dnl  support, updates, enhancements, or modifications.
+dnl
+
+AC_INIT(Src/zsh.h)
+AC_CONFIG_HEADER(config.h)
+
+dnl What version of zsh are we building ?
+. ${srcdir}/Config/version.mk
+echo "configuring for zsh $VERSION"
+
+dnl ----------------------------------------------
+dnl CHECK FOR MACHINE/VENDOR/OPERATING SYSTEM TYPE
+dnl ----------------------------------------------
+dnl Find out machine type, vendor, and operating system
+dnl What type of host is this?
+AC_CANONICAL_HOST
+AC_DEFINE_UNQUOTED(MACHTYPE, "$host_cpu")
+AC_DEFINE_UNQUOTED(VENDOR,   "$host_vendor")
+AC_DEFINE_UNQUOTED(OSTYPE,   "$host_os")
+
+dnl -----------------------------
+dnl CHECKING COMMAND LINE OPTIONS
+dnl -----------------------------
+dnl Do you want to debug zsh?
+undefine([zsh-debug])dnl
+AC_ARG_ENABLE(zsh-debug,
+[  --enable-zsh-debug         use it if you want to debug zsh],
+[if test x$enableval = xyes; then
+  AC_DEFINE(DEBUG)
+fi])
+
+dnl Do you want zsh memory allocation routines.
+undefine([zsh-mem])dnl
+AC_ARG_ENABLE(zsh-mem,
+[  --enable-zsh-mem           use zsh memory allocation routines],
+[if test x$enableval = xyes; then
+  AC_DEFINE(ZSH_MEM)
+fi])
+
+dnl Do you want to debug zsh memory allocation routines.
+undefine([zsh-mem-debug])dnl
+AC_ARG_ENABLE(zsh-mem-debug,
+[  --enable-zsh-mem-debug     debug zsh memory allocation routines],
+[if test x$enableval = xyes; then
+  AC_DEFINE(ZSH_MEM_DEBUG)
+fi])
+
+dnl Do you want to print warnings when errors in memory allocation.
+undefine([zsh-mem-warning])dnl
+AC_ARG_ENABLE(zsh-mem-warning,
+[  --enable-zsh-mem-warning   print warnings when error in memory allocation],
+[if test x$enableval = xyes; then
+  AC_DEFINE(ZSH_MEM_WARNING)
+fi])
+
+dnl Do you want to turn on error checking for free().
+undefine([zsh-secure-free])dnl
+AC_ARG_ENABLE(zsh-secure-free,
+[  --enable-zsh-secure-free   turn on error checking for free()],
+[if test x$enableval = xyes; then
+  AC_DEFINE(ZSH_SECURE_FREE)
+fi])
+
+dnl Do you want debugging information on internal hash tables.
+dnl This turns on the `hashinfo' builtin command.
+undefine([zsh-hash-debug])dnl
+AC_ARG_ENABLE(zsh-hash-debug,
+[  --enable-zsh-hash-debug    turn on debugging of internal hash tables],
+[if test x$enableval = xyes; then
+  AC_DEFINE(ZSH_HASH_DEBUG)
+fi])
+
+dnl Pathnames for global zsh scripts
+undefine([zshenv])dnl
+AC_ARG_ENABLE(etcdir,
+[  --enable-etcdir=directory  default directory for global zsh scripts],
+[etcdir="$enableval"], [etcdir=/etc])
+
+undefine([zshenv])dnl
+AC_ARG_ENABLE(zshenv,
+[  --enable-zshenv=pathname   the full pathname of the global zshenv script],
+[zshenv="$enableval"],
+[if test "x$etcdir" = xno; then
+  zshenv=no
+else
+  zshenv="$etcdir/zshenv"
+fi])
+if test "x$zshenv" != xno; then
+  AC_DEFINE_UNQUOTED(GLOBAL_ZSHENV, "$zshenv")
+fi
+
+undefine([zshrc])dnl
+AC_ARG_ENABLE(zshrc,
+[  --enable-zshrc=pathname    the full pathname of the global zshrc script],
+[zshrc="$enableval"],
+[if test "x$etcdir" = xno; then
+  zshrc=no
+else
+  zshrc="$etcdir/zshrc"
+fi])
+if test "x$zshrc" != xno; then
+  AC_DEFINE_UNQUOTED(GLOBAL_ZSHRC, "$zshrc")
+fi
+
+undefine([zprofile])dnl
+AC_ARG_ENABLE(zprofile,
+[  --enable-zprofile=pathname the full pathname of the global zprofile script],
+[zprofile="$enableval"],
+[if test "x$etcdir" = xno; then
+  zprofile=no
+else
+  zprofile="$etcdir/zprofile"
+fi])
+if test "x$zprofile" != xno; then
+  AC_DEFINE_UNQUOTED(GLOBAL_ZPROFILE, "$zprofile")
+fi
+
+undefine([zlogin])dnl
+AC_ARG_ENABLE(zlogin,
+[  --enable-zlogin=pathname   the full pathname of the global zlogin script],
+[zlogin="$enableval"],
+[if test "x$etcdir" = xno; then
+  zlogin=no
+else
+  zlogin="$etcdir/zlogin"
+fi])
+if test "x$zlogin" != xno; then
+  AC_DEFINE_UNQUOTED(GLOBAL_ZLOGIN, "$zlogin")
+fi
+
+undefine([zlogout])dnl
+AC_ARG_ENABLE(zlogout,
+[  --enable-zlogout=pathname  the full pathname of the global zlogout script],
+[zlogout="$enableval"],
+[if test "x$etcdir" = xno; then
+  zlogout=no
+else
+  zlogout="$etcdir/zlogout"
+fi])
+if test "x$zlogout" != xno; then
+  AC_DEFINE_UNQUOTED(GLOBAL_ZLOGOUT, "$zlogout")
+fi
+
+AC_SUBST(zshenv)dnl
+AC_SUBST(zshrc)dnl
+AC_SUBST(zprofile)dnl
+AC_SUBST(zlogin)dnl
+AC_SUBST(zlogout)dnl
+
+dnl Do you want dynamically loaded binary modules.
+undefine([dynamic])dnl
+AC_ARG_ENABLE(dynamic,
+[  --enable-dynamic           allow dynamically loaded binary modules],
+[dynamic="$enableval"], [dynamic=no])
+
+dnl Do you want to compile as K&R C.
+AC_ARG_ENABLE(ansi2knr,
+[  --enable-ansi2knr          translate source to K&R C before compiling],
+[ansi2knr="$enableval"], [ansi2knr=default])
+
+dnl ------------------
+dnl CHECK THE COMPILER
+dnl ------------------
+dnl We want these before the checks, so the checks can modify their values.
+test -z "${CFLAGS+set}"  && CFLAGS=  auto_cflags=1
+test -z "${LDFLAGS+set}" && LDFLAGS= auto_ldflags=1
+
+AC_PROG_CC
+
+dnl if the user hasn't specified CFLAGS, then
+dnl   if compiler is gcc, then use -O2 and some warning flags
+dnl   else use -O
+if test -n "$auto_cflags"; then
+  if test "${enable_zsh_debug}" = yes; then
+    if test -n "$GCC"; then
+      CFLAGS="$CFLAGS -Wall -Wno-implicit -Wmissing-prototypes -pedantic -ggdb"
+    else
+      CFLAGS="$CFLAGS -g"
+    fi
+  else
+    if test -n "$GCC"; then
+      CFLAGS="$CFLAGS -Wall -Wno-implicit -Wmissing-prototypes -O2"
+    else
+      CFLAGS="$CFLAGS -O"
+    fi
+  fi
+fi
+if test -n "$auto_ldflags"; then
+  if test "${enable_zsh_debug}" = yes; then
+    LDFLAGS=-g
+  else
+    LDFLAGS=-s
+  fi
+fi
+
+dnl ----------
+dnl SCO KLUDGE
+dnl ----------
+dnl Sco doesn't define any useful compiler symbol,
+dnl so we will check for sco and define __sco if
+dnl found.
+case "$host_os" in
+  sco*) CFLAGS="-D__sco $CFLAGS" ;;
+esac
+
+sed=':1
+     s/ -s / /g
+     t1
+     s/^ *//
+     s/ *$//'
+
+case " $LDFLAGS " in
+  *" -s "*) strip_exeldflags=true strip_libldflags=true
+    LDFLAGS=`echo " $LDFLAGS " | sed "$sed"` ;;
+  *) strip_exeldflags=false strip_libldflags=false ;;
+esac
+
+case " ${EXELDFLAGS+$EXELDFLAGS }" in
+  " ") ;;
+  *" -s "*) strip_exeldflags=true
+    EXELDFLAGS=`echo " $EXELDFLAGS " | sed "$sed"` ;;
+  *) strip_exeldflags=false ;;
+esac
+
+case " ${LIBLDFLAGS+$LIBLDFLAGS }" in
+  " ") ;;
+  *" -s "*) strip_libldflags=true
+    LIBLDFLAGS=`echo " $LIBLDFLAGS " | sed "$sed"` ;;
+  *) strip_libldflags=false ;;
+esac
+
+AC_SUBST(CFLAGS)dnl
+AC_SUBST(LDFLAGS)dnl
+AC_SUBST(EXELDFLAGS)dnl
+AC_SUBST(LIBLDFLAGS)dnl
+
+AC_PROG_CPP                 dnl Figure out how to run C preprocessor.
+AC_PROG_GCC_TRADITIONAL     dnl Do we need -traditional flag for gcc.
+AC_C_CONST                  dnl Does compiler support `const'.
+
+fp_PROG_CC_STDC
+AC_MSG_CHECKING([whether to use prototypes])
+if test ."$ansi2knr" = .yes || test ."$ansi2knr" = .no; then
+  msg="(overridden) "
+else
+  msg=
+  if test ."$fp_cv_prog_cc_stdc" = .no; then
+    ansi2knr=yes
+  else
+    ansi2knr=no
+  fi
+fi
+if test "$ansi2knr" = yes; then
+  AC_MSG_RESULT(${msg}no)
+  U=_
+else
+  AC_MSG_RESULT(${msg}yes)
+  AC_DEFINE(PROTOTYPES)
+  U=
+fi
+AC_SUBST(U)
+
+AC_FUNC_ALLOCA              dnl Check how to get `alloca'.
+
+dnl If the compiler supports union initialisation
+AC_CACHE_CHECK(if the compiler supports union initialisation,
+zsh_cv_c_have_union_init,
+[AC_TRY_COMPILE([union{void *p;long l;}u={0};], [u.l=1;],
+  zsh_cv_c_have_union_init=yes,
+  zsh_cv_c_have_union_init=no)])
+if test $zsh_cv_c_have_union_init = yes; then
+  AC_DEFINE(HAVE_UNION_INIT)
+fi
+
+dnl  Checking if compiler correctly cast signed to unsigned.
+AC_CACHE_CHECK(if signed to unsigned casting is broken,
+zsh_cv_c_broken_signed_to_unsigned_casting,
+[AC_TRY_RUN([main(){return((int)(unsigned char)((char) -1) == 255);}],
+  zsh_cv_c_broken_signed_to_unsigned_casting=yes,
+  zsh_cv_c_broken_signed_to_unsigned_casting=no,
+  zsh_cv_c_broken_signed_to_unsigned_casting=no)])
+if test $zsh_cv_c_broken_signed_to_unsigned_casting = yes; then
+  AC_DEFINE(BROKEN_SIGNED_TO_UNSIGNED_CASTING)
+fi
+
+dnl Checking if the compiler supports variable-length arrays
+AC_CACHE_CHECK(if the compiler supports variable-lenth arrays,
+zsh_cv_c_variable_length_arrays,
+[AC_TRY_COMPILE([int foo();], [int i[foo()];],
+  zsh_cv_c_variable_length_arrays=yes,
+  zsh_cv_c_variable_length_arrays=no)])
+if test $zsh_cv_c_variable_length_arrays = yes; then
+  AC_DEFINE(HAVE_VARIABLE_LENGTH_ARRAYS)
+fi
+
+dnl ------------------
+dnl CHECK FOR PROGRAMS
+dnl ------------------
+AC_PROG_MAKE_SET            dnl Does make define $MAKE
+AC_PROG_INSTALL             dnl Check for BSD compatible `install'
+AC_PROG_AWK                 dnl Check for mawk,gawk,nawk, then awk.
+AC_CHECK_PROGS([YODL], [yodl], [:])
+
+dnl ------------------
+dnl CHECK HEADER FILES
+dnl ------------------
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_HEADER_TIME
+AC_HEADER_STAT
+AC_HEADER_SYS_WAIT
+AC_CHECK_HEADERS(sys/time.h sys/times.h sys/select.h termcap.h termio.h \
+		 termios.h sys/param.h sys/filio.h string.h memory.h \
+		 limits.h fcntl.h libc.h sys/utsname.h sys/resource.h \
+		 locale.h errno.h stdlib.h unistd.h sys/capability.h \
+		 utmp.h utmpx.h sys/types.h pwd.h grp.h)
+if test $dynamic = yes; then
+  AC_CHECK_HEADERS(dlfcn.h)
+fi
+
+dnl Some SCO systems cannot include both sys/time.h and sys/select.h
+if test $ac_cv_header_sys_time_h = yes -a $ac_cv_header_sys_select_h = yes; then
+  AC_CACHE_CHECK(for conflicts in sys/time.h and sys/select.h,
+  zsh_cv_header_time_h_select_h_conflicts,
+  [AC_TRY_COMPILE([#include <sys/time.h>
+#include <sys/select.h>], [int i;],
+  zsh_cv_header_time_h_select_h_conflicts=no,
+  zsh_cv_header_time_h_select_h_conflicts=yes)])
+  if test $zsh_cv_header_time_h_select_h_conflicts = yes; then
+    AC_DEFINE(TIME_H_SELECT_H_CONFLICTS)
+  fi
+fi
+
+AC_CACHE_CHECK(POSIX termios, zsh_cv_sys_posix_termios,
+[AC_TRY_LINK([#include <sys/types.h>
+#include <unistd.h>
+#include <termios.h>],
+[/* SunOS 4.0.3 has termios.h but not the library calls.  */
+tcgetattr(0, 0);],
+  zsh_cv_sys_posix_termios=yes, zsh_cv_sys_posix_termios=no)])
+
+if test $zsh_cv_sys_posix_termios = yes; then
+  AC_CACHE_CHECK(TIOCGWINSZ in termios.h,
+  zsh_cv_header_termios_h_tiocgwinsz,
+  [AC_TRY_LINK([#include <sys/types.h>
+#include <termios.h>],
+  [int x = TIOCGWINSZ;],
+  zsh_cv_header_termios_h_tiocgwinsz=yes,
+  zsh_cv_header_termios_h_tiocgwinsz=no)])
+else
+  zsh_cv_header_termios_h_tiocgwinsz=no
+fi
+ 
+if test $zsh_cv_header_termios_h_tiocgwinsz = no; then
+  AC_CACHE_CHECK(TIOCGWINSZ in sys/ioctl.h,
+  zsh_cv_header_sys_ioctl_h_tiocgwinsz,
+  [AC_TRY_LINK([#include <sys/types.h>
+#include <sys/ioctl.h>],
+  [int x = TIOCGWINSZ;],
+  zsh_cv_header_sys_ioctl_h_tiocgwinsz=yes,
+  zsh_cv_header_sys_ioctl_h_tiocgwinsz=no)])
+  if test $zsh_cv_header_sys_ioctl_h_tiocgwinsz = yes; then
+    AC_DEFINE(GWINSZ_IN_SYS_IOCTL)
+  fi
+fi
+ 
+AC_CHECK_HEADER([sys/ptem.h], AC_DEFINE(WINSIZE_IN_PTEM))
+
+dnl -------------------
+dnl CHECK FOR LIBRARIES
+dnl -------------------
+
+dnl On some systems, modules need to be linked against libc explicitly,
+dnl in case they require objects that exist only in the static version
+dnl and might not be compiled into the zsh executable.
+AC_CHECK_LIB(c, printf)
+
+dnl Prefer BSD termcap library to SysV curses library, except on certain
+dnl versions of AIX and HP-UX.
+if test `echo $host_os | sed 's/^.*\(aix\)[[1-9]]\.[[0-9]].*$/\1/'` = aix ||
+    test `echo $host_os | sed 's/^.*\(hpux\)10\..*$/\1/'` = hpux; then
+  termcap_curses_order="curses ncurses termcap"
+else
+  termcap_curses_order="termcap curses ncurses"
+fi
+
+for lib in $termcap_curses_order; do
+  AC_CHECK_LIB(${lib}, tgetent, [LIBS="-l$lib $LIBS"; break])
+done
+
+dnl Some systems (Solaris 2.x, Linux Redhat 5.x) require
+dnl libnsl (Network Services Library) to find yp_all
+AC_CHECK_FUNCS(yp_all)
+if test $ac_cv_func_yp_all = no; then
+  AC_CHECK_LIB(nsl, yp_all)
+fi
+
+dnl I am told that told that unicos reqire these for nis_list
+if test `echo $host_os | sed 's/^\(unicos\).*/\1/'` = unicos; then
+  LIBS="-lcraylm -lkrb -lnisdb -lnsl -lrpcsvc $LIBS"
+fi
+
+if test "x$dynamic" = xyes; then
+  AC_CHECK_LIB(dl, dlopen)
+fi
+
+AC_CHECK_LIB(cap, cap_get_proc)
+
+dnl ---------------------
+dnl CHECK TERMCAP LIBRARY
+dnl ---------------------
+dnl Checks for external variable ospeed in the termcap library.
+AC_CACHE_CHECK(if an include file defines ospeed,
+zsh_cv_decl_ospeed_include_defines,
+[AC_TRY_LINK(
+[#include <sys/types.h>
+#if HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+#if HAVE_TERMCAP_H
+#include <termcap.h>
+#endif], [ospeed = 0;],
+zsh_cv_decl_ospeed_include_defines=yes,
+zsh_cv_decl_ospeed_include_defines=no)])
+
+if test $zsh_cv_decl_ospeed_include_defines = no; then
+  AC_CACHE_CHECK(if you must define ospeed,
+  zsh_cv_decl_ospeed_must_define,
+  [AC_TRY_LINK( ,[extern short ospeed; ospeed = 0;],
+  zsh_cv_decl_ospeed_must_define=yes,
+  zsh_cv_decl_ospeed_must_define=no)])
+fi
+
+if test $zsh_cv_decl_ospeed_include_defines = yes; then
+  AC_DEFINE(HAVE_OSPEED)
+elif test $zsh_cv_decl_ospeed_must_define = yes; then
+  AC_DEFINE(HAVE_OSPEED)
+  AC_DEFINE(MUST_DEFINE_OSPEED)
+fi
+
+dnl  Check if tgetent accepts NULL (and will allocate its own termcap buffer)
+AC_CACHE_CHECK(if tgetent accepts NULL,
+zsh_cv_func_tgetent_accepts_null,
+[AC_TRY_RUN([main(){int i = tgetent((char*)0,"vt100");exit(!i || i == -1);}],
+  zsh_cv_func_tgetent_accepts_null=yes,
+  zsh_cv_func_tgetent_accepts_null=no,
+  zsh_cv_func_tgetent_accepts_null=no)])
+if test $zsh_cv_func_tgetent_accepts_null = yes; then
+  AC_DEFINE(TGETENT_ACCEPTS_NULL)
+fi
+
+dnl --------------
+dnl CHECK TYPEDEFS
+dnl --------------
+
+AC_TYPE_SIGNAL
+AC_TYPE_PID_T
+AC_TYPE_OFF_T
+AC_TYPE_MODE_T
+AC_TYPE_UID_T
+AC_TYPE_SIZE_T
+
+dnl Check for sigset_t.  Currently I'm looking in
+dnl <sys/types.h> and <signal.h>.  Others might need
+dnl to be added.
+AC_CACHE_CHECK(for sigset_t, zsh_cv_type_sigset_t,
+[AC_TRY_COMPILE(
+[#include <sys/types.h>
+#include <signal.h>], [sigset_t tempsigset;],
+  zsh_cv_type_sigset_t=yes, zsh_cv_type_sigset_t=no)])
+if test $zsh_cv_type_sigset_t = no; then
+  AC_DEFINE(sigset_t, unsigned int)
+fi
+
+dnl Check for struct timezone since some old SCO versions do not define it
+zsh_TYPE_EXISTS([
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+], struct timezone)
+
+dnl Check for utmp structures, for watch
+zsh_TYPE_EXISTS([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UTMP_H
+# include <utmp.h>
+#endif
+], struct utmp)
+zsh_TYPE_EXISTS([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UTMPX_H
+# include <utmpx.h>
+#endif
+], struct utmpx)
+
+dnl Check contents of utmp structures
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UTMP_H
+# include <utmp.h>
+#endif
+], struct utmp, ut_host)
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UTMPX_H
+# include <utmpx.h>
+#endif
+], struct utmpx, ut_host)
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UTMPX_H
+# include <utmpx.h>
+#endif
+], struct utmpx, ut_xtime)
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_UTMPX_H
+# include <utmpx.h>
+#endif
+], struct utmpx, ut_tv)
+
+dnl Check for inode numbers in directory entry structures
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+#endif
+], struct dirent, d_ino)
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+#endif
+], struct dirent, d_stat)
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+#endif
+#ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+#endif
+#ifdef HAVE_NDIR_H
+# include <ndir.h>
+#endif
+], struct direct, d_ino)
+zsh_STRUCT_MEMBER([
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_NDIR_H
+# include <sys/ndir.h>
+#endif
+#ifdef HAVE_SYS_DIR_H
+# include <sys/dir.h>
+#endif
+#ifdef HAVE_NDIR_H
+# include <ndir.h>
+#endif
+], struct direct, d_stat)
+
+dnl ---------------
+dnl CHECK FUNCTIONS
+dnl ---------------
+AC_FUNC_GETPGRP
+AC_FUNC_STRCOLL
+
+dnl need to integrate this function
+dnl AC_FUNC_STRFTIME
+
+AC_CHECK_FUNCS(memcpy memmove \
+              strftime waitpid select tcsetpgrp tcgetattr strstr lstat \
+              getlogin setpgid gettimeofday gethostname mkfifo wait3 difftime \
+              sigblock sigsetmask sigrelse sighold killpg sigaction getrlimit \
+              sigprocmask setuid seteuid setreuid setresuid setsid strerror \
+              nis_list initgroups fchdir cap_get_proc readlink nice \
+	      getgrgid getgrnam getpwent getpwnam getpwuid)
+if test $dynamic = yes; then
+  AC_CHECK_FUNCS(dlopen dlerror dlsym dlclose)
+fi
+
+
+dnl -------------
+dnl CHECK SIGNALS
+dnl -------------
+dnl What style of signal do you have (POSIX, BSD, or SYSV)?
+AC_MSG_CHECKING(what style of signals to use)
+if test $ac_cv_func_sigaction = yes -a $ac_cv_func_sigprocmask = yes; then
+  signals_style=POSIX_SIGNALS
+  AC_DEFINE(POSIX_SIGNALS)
+elif test $ac_cv_func_sigblock = yes -a $ac_cv_func_sigsetmask = yes; then
+  signals_style=BSD_SIGNALS
+  AC_DEFINE(BSD_SIGNALS)
+elif test $ac_cv_func_sighold = yes -a $ac_cv_func_sigrelse = yes; then
+  signals_style=SYSV_SIGNALS
+  AC_DEFINE(SYSV_SIGNALS)
+else
+  signals_style=NO_SIGNAL_BLOCKING
+  AC_DEFINE(NO_SIGNAL_BLOCKING)
+fi
+AC_DEFINE_UNQUOTED($signals_style)
+AC_MSG_RESULT($signals_style)
+
+dnl Where is <signal.h> located?  Needed as input for signals.awk
+AC_CACHE_CHECK(where signal.h is located, zsh_cv_path_signal_h,
+[for SIGNAL_H in /usr/include/bsd/sys/signal.h  dnl Next
+                 /usr/include/asm/signum.h      dnl alpha-Linux
+                 /usr/include/asm/signal.h      dnl Linux 1.3.0 and above
+                 /usr/include/linux/signal.h    dnl Linux up to 1.2.11
+                 /usr/include/sys/signal.h      dnl Almost everybody else
+                 /dev/null;                     dnl Just in case we fall through
+do
+  test -f $SIGNAL_H && \
+  grep '#[ 	]*define[ 	][ 	]*SIG[0-9A-Z]*[ 	]*[0-9][0-9]*' $SIGNAL_H > /dev/null && \
+  break
+done
+zsh_cv_path_signal_h=$SIGNAL_H
+])
+SIGNAL_H=$zsh_cv_path_signal_h
+AC_SUBST(SIGNAL_H)dnl
+
+dnl -----------------------------------------------------
+dnl Look for the file containing the RLIMIT_* definitions
+dnl -----------------------------------------------------
+dnl CALL FOR MORE (FEWER?) LOCATIONS:  I've just copied the signal checking.
+AC_CACHE_CHECK(where the RLIMIT macros are located,zsh_cv_path_rlimit_h,
+[for RESOURCE_H in /usr/include/bsd/sys/resource.h   dnl
+                   /usr/include/asm/resource.h	     dnl
+                   /usr/include/linux/resource.h     dnl
+                   /usr/include/sys/resource.h       dnl
+                   /usr/include/resourcebits.h       dnl
+                   /dev/null;
+do
+  test -f $RESOURCE_H && \
+  grep '#[ 	]*define[ 	][ 	]*RLIMIT_[A-Z]*[ 	]*[0-9A-Z][0-9]*' $RESOURCE_H > /dev/null && \
+  break
+done
+zsh_cv_path_rlimit_h=$RESOURCE_H
+if test $RESOURCE_H = "/dev/null" -a $ac_cv_func_getrlimit = yes; then
+  echo "RLIMIT MACROS NOT FOUND:  please report to developers"
+fi])
+RLIMITS_INC_H=$zsh_cv_path_rlimit_h
+dnl rlimits.h only appears in dependencies if we are actually using it.
+dnl We are using it any time we have getrlimit, though if the macros were
+dnl not found we simply awk through /dev/null and fail to find them.
+dnl Thus, limit won't work, but at least the shell will compile.
+AC_SUBST(RLIMITS_INC_H)dnl
+
+dnl ------------------
+dnl rlimit type checks
+dnl ------------------
+DEFAULT_RLIM_T=long
+AC_CACHE_CHECK(if rlim_t is quad_t,
+zsh_cv_rlim_t_is_quad_t,
+[AC_TRY_RUN([
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <sys/resource.h>
+main(){struct rlimit r;exit(sizeof(r.rlim_cur) <= sizeof(long));}],
+zsh_cv_rlim_t_is_quad_t=yes,
+zsh_cv_rlim_t_is_quad_t=no,
+zsh_cv_rlim_t_is_quad_t=yes)])
+if test $zsh_cv_rlim_t_is_quad_t = yes; then
+  AC_DEFINE(RLIM_T_IS_QUAD_T)
+  DEFAULT_RLIM_T=quad_t
+else
+  AC_CACHE_CHECK(if the rlim_t is unsigned,
+  zsh_cv_type_rlim_t_is_unsigned,
+  [AC_TRY_RUN([
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <sys/resource.h>
+  main(){struct rlimit r;r.rlim_cur=-1;exit(r.rlim_cur<0);}],
+  zsh_cv_type_rlim_t_is_unsigned=yes,
+  zsh_cv_type_rlim_t_is_unsigned=no,
+  zsh_cv_type_rlim_t_is_unsigned=no)])
+  if test $zsh_cv_type_rlim_t_is_unsigned = yes; then
+    AC_DEFINE(RLIM_T_IS_UNSIGNED)
+    DEFAULT_RLIM_T="unsigned $DEFAULT_RLIM_T"
+  fi
+fi
+
+AC_CACHE_CHECK(for rlim_t, zsh_cv_type_rlim_t,
+[AC_TRY_COMPILE([
+#include <sys/types.h>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <sys/resource.h>],
+[rlim_t l;],
+zsh_cv_type_rlim_t=yes,
+zsh_cv_type_rlim_t=no)])
+if test $zsh_cv_type_rlim_t = no; then
+  AC_DEFINE_UNQUOTED(rlim_t, $DEFAULT_RLIM_T)
+fi
+
+dnl ----------------------------
+dnl CHECK FOR /dev/fd FILESYSTEM
+dnl ----------------------------
+AC_CACHE_CHECK(for /dev/fd filesystem, zsh_cv_sys_path_dev_fd,
+[for zsh_cv_sys_path_dev_fd in /proc/self/fd /dev/fd no; do
+   test x`echo ok|cat $zsh_cv_sys_path_dev_fd/0 2>/dev/null` = xok && break
+ done])
+if test $zsh_cv_sys_path_dev_fd != no; then
+  AC_DEFINE_UNQUOTED(PATH_DEV_FD, "$zsh_cv_sys_path_dev_fd")
+fi
+
+dnl ---------------------------------
+dnl CHECK FOR RFS SUPERROOT DIRECTORY
+dnl ---------------------------------
+AC_CACHE_CHECK(for RFS superroot directory, zsh_cv_sys_superroot,
+[test -d /../.LOCALROOT && zsh_cv_sys_superroot=yes || zsh_cv_sys_superroot=no])
+if test $zsh_cv_sys_superroot = yes; then
+  AC_DEFINE(HAVE_SUPERROOT)
+fi
+
+dnl -------------
+dnl CHECK FOR NIS
+dnl -------------
+AC_CACHE_CHECK(for NIS, zsh_cv_sys_nis,
+[test -f /usr/bin/ypcat && /usr/bin/ypcat passwd.byname > /dev/null 2>&1 && \
+zsh_cv_sys_nis=yes || zsh_cv_sys_nis=no])
+if test $zsh_cv_sys_nis = yes; then
+  AC_DEFINE(HAVE_NIS)
+fi
+
+dnl -----------------
+dnl CHECK FOR NISPLUS
+dnl -----------------
+AC_CACHE_CHECK(for NIS+, zsh_cv_sys_nis_plus,
+[test $ac_cv_func_nis_list = yes && test -f /usr/bin/nisls && \
+ /usr/bin/nisls > /dev/null 2>&1 && \
+zsh_cv_sys_nis_plus=yes || zsh_cv_sys_nis_plus=no])
+if test $zsh_cv_sys_nis_plus = yes; then
+  AC_DEFINE(HAVE_NIS_PLUS)
+fi
+
+dnl ----------------------------------------
+dnl CHECK FOR LOCATION OF {U,W}TMP{,X} FILES
+dnl ----------------------------------------
+zsh_PATH_UTMP(utmp)
+zsh_PATH_UTMP(wtmp)
+zsh_PATH_UTMP(utmpx)
+zsh_PATH_UTMP(wtmpx)
+
+dnl ----------------
+dnl TYPEAHEAD KLUDGE
+dnl ----------------
+dnl Some systems clobber typeahead when you go from canonical input
+dnl processing to non-canonical, so we need a FIONREAD ioctl.
+dnl I don't know how to check this with configure, so I am using the
+dnl system names directly.
+dnl The doubled square brackets are necessary because autoconf uses m4.
+AC_CACHE_CHECK(if typeahead needs FIONREAD, zsh_cv_sys_clobbers_typeahead,
+[case x-$host_vendor-$host_os in
+    x-*-ultrix* | x-*-dgux* | x-sni-sysv4*)
+	zsh_cv_sys_clobbers_typeahead=yes;;
+    *)
+	zsh_cv_sys_clobbers_typeahead=no;;
+esac])
+if test $zsh_cv_sys_clobbers_typeahead = yes; then
+  AC_DEFINE(CLOBBERS_TYPEAHEAD)
+fi
+
+dnl -------------------
+dnl brk/sbrk PROTOTYPES
+dnl -------------------
+AC_CACHE_CHECK(for brk() prototype in <unistd.h>,
+zsh_cv_header_unistd_h_brk_proto,
+[AC_TRY_COMPILE([#include <unistd.h>
+double brk();], [int i;],
+zsh_cv_header_unistd_h_brk_proto=no, zsh_cv_header_unistd_h_brk_proto=yes)])
+if test $zsh_cv_header_unistd_h_brk_proto = yes; then
+  AC_DEFINE(HAVE_BRK_PROTO)
+fi
+
+AC_CACHE_CHECK(for sbrk() prototype in <unistd.h>,
+zsh_cv_header_unistd_h_sbrk_proto,
+[AC_TRY_COMPILE([#include <unistd.h>
+double sbrk();], [int i;],
+zsh_cv_header_unistd_h_sbrk_proto=no, zsh_cv_header_unistd_h_sbrk_proto=yes)])
+if test $zsh_cv_header_unistd_h_sbrk_proto = yes; then
+  AC_DEFINE(HAVE_SBRK_PROTO)
+fi
+
+dnl ------------------------
+dnl ioctl prototypes for OSF
+dnl ------------------------
+
+if test "$ac_cv_prog_cc_stdc" != no; then
+  AC_CACHE_CHECK(for ioctl prototype in <sys/ioctl.h>,
+  zsh_cv_header_sys_ioctl_h_ioctl_proto,
+  [AC_TRY_COMPILE([#include <sys/ioctl.h>
+   int ioctl(double x);], [int i;],
+  zsh_cv_header_sys_ioctl_h_ioctl_proto=no,
+  zsh_cv_header_sys_ioctl_h_ioctl_proto=yes)])
+  if test $zsh_cv_header_sys_ioctl_h_ioctl_proto = yes; then
+    AC_DEFINE(HAVE_IOCTL_PROTO)
+  fi
+fi
+
+dnl -----------
+dnl named FIFOs
+dnl -----------
+AC_CACHE_CHECK(if named FIFOs work,
+zsh_cv_sys_fifo,
+[AC_TRY_RUN([
+#include <fcntl.h>
+#include <signal.h>
+main()
+{
+    char c;
+    int fd;
+    int pid, ret;
+    unlink("/tmp/fifo$$");
+#ifdef HAVE_MKFIFO
+    if(mkfifo("/tmp/fifo$$", 0600) < 0)
+#else
+    if(mknod("/tmp/fifo$$", 0010600, 0) < 0)
+#endif
+	exit(1);
+    pid = fork();
+    if(pid < 0)
+	exit(1);
+    if(pid) {
+	fd = open("/tmp/fifo$$", O_RDONLY);
+	exit(fd < 0 || read(fd, &c, 1) != 1 || c != 'x');
+    }
+    fd = open("/tmp/fifo$$", O_WRONLY);
+    ret = (fd < 0 || write(fd, "x", 1) < 1);
+    unlink("/tmp/fifo$$");
+    exit(ret);
+}
+],
+  zsh_cv_sys_fifo=yes,
+  zsh_cv_sys_fifo=no,
+  zsh_cv_sys_fifo=yes)])
+if test $zsh_cv_sys_fifo = yes; then
+  AC_DEFINE(HAVE_FIFOS)
+fi
+dnl ---------------------
+dnl echo style of /bin/sh
+dnl ---------------------
+AC_CACHE_CHECK(if echo in /bin/sh interprets escape sequences,
+zsh_cv_prog_sh_echo_escape,
+[if test "`/bin/sh -c \"echo '\\n'\"`" = "\\n"; then
+  zsh_cv_prog_sh_echo_escape=no
+else
+  zsh_cv_prog_sh_echo_escape=yes
+fi])
+if test $zsh_cv_prog_sh_echo_escape = no; then
+  AC_DEFINE(SH_USE_BSD_ECHO)
+fi
+
+dnl ---------------
+dnl dynamic loading
+dnl ---------------
+L=N
+if test "$ac_cv_func_dlopen" != yes; then
+  dynamic=no
+elif test "$ac_cv_func_dlsym" != yes; then
+  dynamic=no
+elif test "$ac_cv_func_dlerror" != yes; then
+  dynamic=no
+fi
+if test "x$dynamic" = xyes; then
+  AC_CACHE_CHECK(if your system use ELF binaries,
+   zsh_cv_sys_elf,
+   [AC_TRY_RUN([/* Test for whether ELF binaries are produced */
+#include <fcntl.h>
+#include <stdlib.h>
+main(argc, argv)
+int argc;
+char *argv[];
+{
+	char b[4];
+	int i = open(argv[0],O_RDONLY);
+	if(i == -1) 
+		exit(1); /* fail */
+	if(read(i,b,4)==4 && b[0]==127 && b[1]=='E' && b[2]=='L' && b[3]=='F')
+		exit(0); /* succeed (yes, it's ELF) */
+	else
+		exit(1); /* fail */
+}],
+  zsh_cv_sys_elf=yes,
+  zsh_cv_sys_elf=no,
+  zsh_cv_sys_elf=yes)])
+  DL_EXT="${DL_EXT=so}"
+  if test $zsh_cv_sys_elf = yes; then
+    DLLD="${DLLD=$CC}"
+  else
+    DLLD="${DLLD=ld}"
+  fi
+  if test -n "$GCC"; then
+    DLCFLAGS="${DLCFLAGS=-fpic}"
+  else
+    case "$host_os" in
+      hpux*)                 DLCFLAGS="${DLCFLAGS=+z}" ;;
+      sunos*)                DLCFLAGS="${DLCFLAGS=-pic}" ;;
+      solaris*|sysv4*|esix*) DLCFLAGS="${DLCFLAGS=-Kpic}" ;;
+    esac
+  fi
+  case "$host_os" in
+    hpux*)        DLLDFLAGS="${DLLDFLAGS=-b}" ;;
+    linux*|irix*|osf*) DLLDFLAGS="${DLLDFLAGS=-shared}" ;;
+    solaris*)     DLLDFLAGS="${DLLDFLAGS=-G}" ;;
+    sunos*)       DLLDFLAGS="${DLLDFLAGS=-assert nodefinitions}" ;;
+    sysv4*|esix*) DLLDFLAGS="${DLLDFLAGS=-G $ldflags}" ;;
+    netbsd*)      DLLDFLAGS="${DLLDFLAGS=-x -shared --whole-archive}" ;;
+  esac
+  case "$host_os" in
+    hpux*)  EXTRA_LDFLAGS="${EXTRA_LDFLAGS=-Wl,-E}" ;;
+    linux*) EXTRA_LDFLAGS="${EXTRA_LDFLAGS=-rdynamic}" ;;
+  esac
+  AC_CACHE_CHECK(if your dlsym() needs a leading underscore,
+   zsh_cv_func_dlsym_needs_underscore,
+   [cat >conftest.c <<EOM
+fred () { }
+EOM
+    $CC -c $CFLAGS $CPPFLAGS $DLCFLAGS conftest.c 1>&5 2>&5 &&
+    $DLLD -o conftest.$DL_EXT $LDFLAGS $DLLDFLAGS conftest.o 1>&5 2>&5 &&
+    AC_TRY_RUN([
+#include <stdio.h>
+#ifdef HAVE_DLFCN_H
+#include <dlfcn.h>
+#else
+#include <sys/types.h>
+#include <nlist.h>
+#include <link.h>
+#endif
+#ifndef RTLD_LAZY
+#define RTLD_LAZY 1
+#endif
+
+extern int fred() ;
+
+main()
+{
+    void * handle ;
+    void * symbol ;
+    FILE *f=fopen("conftestval", "w");
+    if (!f) exit(1);
+    handle = dlopen("./conftest.$DL_EXT", RTLD_LAZY) ;
+    if (handle == NULL) {
+        fprintf (f, "dlopen failed") ;
+            exit(1);
+    }
+    symbol = dlsym(handle, "fred") ;
+    if (symbol == NULL) {
+                /* try putting a leading underscore */
+        symbol = dlsym(handle, "_fred") ;
+        if (symbol == NULL) {
+            fprintf (f, "dlsym failed") ;
+                exit(1);
+                }
+        fprintf (f, "yes") ;
+    }
+    else
+        fprintf (f, "no") ;
+    exit(0);
+}], zsh_cv_func_dlsym_needs_underscore=`cat conftestval`,
+    zsh_cv_func_dlsym_needs_underscore=failed
+    dynamic=no,
+    zsh_cv_func_dlsym_needs_underscore=no)])
+  if test "$zsh_cv_func_dlsym_needs_underscore" = yes; then
+    AC_DEFINE(DLSYM_NEEDS_UNDERSCORE)
+  fi
+fi
+
+if test "x$dynamic" = xyes; then
+  zsh_SYS_DYNAMIC_BROKEN
+  test "$zsh_cv_sys_dynamic_broken" = no || dynamic=no
+fi
+
+if test "x$dynamic" = xyes; then
+  zsh_SYS_DYNAMIC_CLASH
+  zsh_SYS_DYNAMIC_GLOBAL
+  RTLD_GLOBAL_OK=$zsh_cv_sys_dynamic_rtld_global
+  zsh_SYS_DYNAMIC_EXECSYMS
+  if test "$zsh_cv_sys_dynamic_execsyms" != yes; then
+    L=L
+  fi
+  zsh_SYS_DYNAMIC_STRIP_EXE
+  zsh_SYS_DYNAMIC_STRIP_LIB
+  if $strip_exeldflags && test "$zsh_cv_sys_dynamic_strip_exe" = yes; then
+    EXELDFLAGS="$EXELDFLAGS -s"
+  fi
+  if $strip_libldflags && test "$zsh_cv_sys_dynamic_strip_lib" = yes; then
+    LIBLDFLAGS="$LIBLDFLAGS -s"
+  fi
+else
+  $strip_exeldflags && EXELDFLAGS="$EXELDFLAGS -s"
+  $strip_libldflags && LIBLDFLAGS="$LIBLDFLAGS -s"
+  RTLD_GLOBAL_OK=no
+fi
+
+if test "x$dynamic" = xyes; then
+  D=D
+  AC_DEFINE(DYNAMIC)dnl
+else
+  D=N
+fi
+
+AC_DEFINE_UNQUOTED(DL_EXT, "$DL_EXT")dnl
+AC_SUBST(D)dnl
+AC_SUBST(DL_EXT)dnl
+AC_SUBST(DLLD)dnl
+AC_SUBST(DLCFLAGS)dnl
+AC_SUBST(DLLDFLAGS)dnl
+AC_SUBST(EXTRA_LDFLAGS)dnl
+AC_SUBST(L)dnl
+AC_SUBST(RTLD_GLOBAL_OK)dnl
+
+real_no_create=$no_create
+no_create=yes
+AC_OUTPUT(Makefile Doc/Makefile Etc/Makefile Src/Makefile, \
+[test -z "$CONFIG_HEADERS" || echo > stamp-h])
+
+dnl The standard config.status is missing some essential features.
+dnl So add them now.
+[(
+  echo '1,$s@^#( *ac_file_inputs=#).*$@#1`echo $ac_file_in | sed -e "s%^%:%" -e "s%:##([^!]##)% $ac_given_srcdir/##1%g" -e "s%:!% %"`@'
+  echo '/ac_sed_cmds=cat/+a'
+  echo ''
+  echo 'ac_sed_inc_cmds="'
+  quote_sed='s,\.,#.,g'
+  for name in `echo '' ${srcdir}/Config/*.mk | sed "s, ${srcdir}/Config/, ,g"`; do
+    echo '/^@@'`echo $name | sed -e "$quote_sed"`'@@#$/{r $ac_given_srcdir/Config/'$name
+    echo 'd;}'
+  done
+  echo '"'
+  echo '.'
+  echo '1,$s@^#( *#)#(sed -e "#$ac_comsub *#)$@#1sed -e "$ac_sed_inc_cmds" $ac_file_inputs | #2@'
+  echo '1,$s@^#( *"#)  *$ac_file_inputs |@#1 |@'
+  echo 'w'
+  echo 'q'
+) | tr '#' '\\' | ed $CONFIG_STATUS >/dev/null 2>/dev/null]
+
+test "$real_no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+eval "zshbin1=${bindir}"
+eval "zshbin2=${zshbin1}"
+eval "zshman=${mandir}"
+eval "zshinfo=${infodir}"
+
+echo "
+zsh configuration
+-----------------
+zsh version               : ${VERSION}
+host operating system     : ${host_cpu}-${host_vendor}-${host_os}
+source code location      : ${srcdir}
+compiler                  : ${CC}
+executable compiler flags : ${CFLAGS}"
+if test "$dynamic" = yes; then
+  echo "\
+module compiler flags     : ${CFLAGS} ${DLCFLAGS}"
+fi
+echo "\
+executable linker flags   : ${LDFLAGS} ${EXELDFLAGS} ${EXTRA_LDFLAGS}"
+if test "$dynamic" = yes; then
+  echo "\
+module linker flags       : ${LDFLAGS} ${LIBLDFLAGS} ${DLLDFLAGS}"
+fi
+echo "\
+library flags             : ${LIBS}
+binary install path       : ${zshbin2}
+man page install path     : ${zshman}
+info install path         : ${zshinfo}
+"
diff --git a/install-sh b/install-sh
new file mode 100755
index 000000000..58719246f
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+	-c) instcmd="$cpprog"
+	    shift
+	    continue;;
+
+	-d) dir_arg=true
+	    shift
+	    continue;;
+
+	-m) chmodcmd="$chmodprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-o) chowncmd="$chownprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-g) chgrpcmd="$chgrpprog $2"
+	    shift
+	    shift
+	    continue;;
+
+	-s) stripcmd="$stripprog"
+	    shift
+	    continue;;
+
+	-t=*) transformarg=`echo $1 | sed 's/-t=//'`
+	    shift
+	    continue;;
+
+	-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+	    shift
+	    continue;;
+
+	*)  if [ x"$src" = x ]
+	    then
+		src=$1
+	    else
+		# this colon is to work around a 386BSD /bin/sh bug
+		:
+		dst=$1
+	    fi
+	    shift
+	    continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+	echo "install:	no input file specified"
+	exit 1
+else
+	true
+fi
+
+if [ x"$dir_arg" != x ]; then
+	dst=$src
+	src=""
+	
+	if [ -d $dst ]; then
+		instcmd=:
+	else
+		instcmd=mkdir
+	fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+	if [ -f $src -o -d $src ]
+	then
+		true
+	else
+		echo "install:  $src does not exist"
+		exit 1
+	fi
+	
+	if [ x"$dst" = x ]
+	then
+		echo "install:	no destination specified"
+		exit 1
+	else
+		true
+	fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+	if [ -d $dst ]
+	then
+		dst="$dst"/`basename $src`
+	else
+		true
+	fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='	
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+	pathcomp="${pathcomp}${1}"
+	shift
+
+	if [ ! -d "${pathcomp}" ] ;
+        then
+		$mkdirprog "${pathcomp}"
+	else
+		true
+	fi
+
+	pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+	$doit $instcmd $dst &&
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+	if [ x"$transformarg" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		dstfile=`basename $dst $transformbasename | 
+			sed $transformarg`$transformbasename
+	fi
+
+# don't allow the sed command to completely eliminate the filename
+
+	if [ x"$dstfile" = x ] 
+	then
+		dstfile=`basename $dst`
+	else
+		true
+	fi
+
+# Make a temp file name in the proper directory.
+
+	dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+	$doit $instcmd $src $dsttmp &&
+
+	trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+	if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+	if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+	if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+	if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+	$doit $rmcmd -f $dstdir/$dstfile &&
+	$doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 000000000..0801ec2c9
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,32 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do 
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d in ${1+"$@"} ; do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+        mkdir "$pathcomp" || errstatus=$?
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/patchlist.txt b/patchlist.txt
new file mode 100644
index 000000000..fc471a727
--- /dev/null
+++ b/patchlist.txt
@@ -0,0 +1,41 @@
+This version of zsh is based on 3.1.5 and includes the following
+patches.  (The version number built into the shell has not been changed.)
+
+  Old stuff:
+
+Zoli's AIX dynamic loading patch from 3933, slightly updated, without
+some hunks which weren't needed on AIX 3.x so I don't know how to
+update properly.
+
+My completion widgets patch
+
+  Patches which have appeared since 3.1.5 (it's already a week, after
+  all...):
+
+Bart's addon collection 4473 (excluding the bit from 4105), 4475, 4476
+
+My patch in 4477 to rename three functions to avoid clashes when
+dynamic loading (particularly necessary on IRIX and AIX), including
+the effect of Sven's additional fix in 4488
+
+My patch 4513 for case-insensitive globbing via flags, plus fixlet 4552
+
+Sven's magna opera patch-or 4510 and patch-match 4509 to add control of
+alternative matches and arbitrary mapping between characters in the
+command line and the matched, plus all known fixes 4526, 4527, 4534,
+4555, 4557
+
+My ~PWD patch 4533
+
+My suggestion for fixing the suffix on a yank in 4564
+
+Bart's deltochar patch including new flags to allow commands not to
+interrupt cumulative effects in 4570
+
+Bart's doc fiz 4574
+
+Sven's latest word on the fixsuffix() horror in 4576, plus a
+fixsuffix() added by hand in delcharorlist() which I've somehow missed
+along the way
+
+My latest version of lete2ctl, not posted