Archive-Name: zsh.FAQ
Submitted-By: pws@s-a.amtp.liv.ac.uk (Peter Stephenson)

$Id: FAQ,v 1.3 1993/02/04 10:17:55 pws Exp pws $

This document contains a list of frequently-asked (or otherwise
significant) questions concerning the Z-shell, a powerful command
interpreter for many UNIX systems.

If you have never heard of `sh', `csh' or `ksh', then you are probably
better off to start by reading a general introduction to UNIX rather
than this document.

Another useful source of information is the collection of FAQ articles
posted bi-weekly to the Usenet news groups comp.unix.questions,
comp.unix.shells and news.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.)

If you just want to know how to get your hands on the latest version,
skip to question 4; if you want to know what to do with insoluble
problems, go to 17.

Notation: Quotes `like this' are ordinary textual quotation
marks.  Other uses of quotation marks are input to the shell.

Contents:
1) What is it?
2) On what machines will it run?
3) What's the latest version?
4) Where do I get it?
5) How does zsh differ from sh, ksh, csh,...?
6) Why do my csh aliases not work?
7) How do I get the meta key to work on my xterm?
8) Why does my terminal act funny in way x?
9) Why does `$vble' where vble="foo bar" not do what I expect?
10) How does base arithmetic work?
11) How do I get a newline in my prompt?
12) Why does `bindkey ^a command-name' do something funny?
13) How do I reference command `foo' from within function `foo'?
14) I don't have root access: how do I make zsh my login shell?
15) What bugs are currently known and unfixed?
16) Where do I report bugs, get more info / who's working on zsh?
17) What's on the wish-list?


1) What is it?

  Zsh is a UNIX command interpreter (shell) which of the standard shells
  most resembles the Korn shell (ksh), although it is not completely
  compatible.  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 <pf@ttisms.com> when a student at
  Princeton; however, Paul doesn't maintain it any more and enquiries
  should be sent to the mailing list (see question 17).  It is freely
  available to anyone under unrestrictive conditions.

  For more information, the files doc/intro.txt or doc/intro.troff
  included with the source distribution are highly recommended.  The
  files intro.ps.Z and intro.txt.Z can also be FTP'd separately from the
  archive (see 4).  A list of features is given in FEATURES, also with
  the source.


2) On what machines will it run?

  Zsh was written for machines of the Berkeley UNIX family; most such
  machines (and all the most popular) will run it without major surgery.
  Modifications have been made so that it should work under SYSVR4-based
  operating systems such as Solaris 2.x.  This best thing is to suck it
  and see.  You may not have to change too much:  if you do change
  anything,  arrange for the shell script `buildzsh' to set the
  necessary #define's, etc., without human intervention.


3) What's the latest version?
  
  The latest production version is 2.3.1, which has just been released.
  New patches occur frequently and are added to the archive (next
  question).


4) Where do I get it?

  The current release is available for anonymous FTP from
	cs.ucsd.edu (132.239.51.3):pub/zsh/zsh2.3.1.tar.Z
  The archive maintainer currently is Jim Mattson <mattson@cs.UCSD.EDU>,
  who also reads the mailing list.

  Bas de Bakker (bas@phys.uva.nl) will shortly be taking over the archive
  and new patches are likely to be available from:
	carlo.phys.uva.nl (145.18.220.25):/pub/bas/zsh
  
  Richard Ohnemus will probably have a North American reflector at
  ftp.sterling.com.


5) How does zsh differ from sh, ksh, csh,...?

  As mentioned, zsh is most similar to ksh, while many of the additions are
  to please csh users.

  i) ksh:
  Most features of ksh are implemented in zsh; problems can arise
  because the implementation is slightly different.  Note also not all
  ksh's are the same either.  I have based this on SunOS 4, which is
  essentially the 11/16/88 version of ksh.

  Differences from ksh which might prove significant for ksh
  programmers, some of which may be interpreted as bugs (there must be
  more) include:
    Shell word splitting: see question 14.
    Arrays are more csh-like than ksh-like:
      subscripts start at 1, not 0; array[0] refers to array[1];
      `$array' refers to the whole array, not $array[0];
      braces are unnecessary: $a[1] == ${a[1]}, etc.
    Path not searched for commands specified at invocation without -c.
    Management of histories in multiple shells may be different.
    Coprocesses are established by `coproc'; `|&' behaves like csh.
    PS1 does not do parameter substitution.
    Globbing does not allow ksh-style `pattern-lists'.
    The options emacs, gmacs, privileged, trackall, viraw are not supported.
    The `keyword' option does not exist and -k is instead interactivecomments.
    [ ] is a shell built-in, rather than a call to /bin/test.
    There is no built-in command newgrp: use a shell function.
    The order in which aliases and functions are defined is significant.
    Some built-ins (true, false, r, ...) were aliases in ksh.
    Aliases and functions cannot be exported.
    There are no tracked aliases.
    There is no ENV variable.
    No built-in commands cause automatic termination of a script.
    The -- flag to terminate option processing is not recognised
       as an argument to the shell (it is recognised by set).
    `jobs' has no `-n' flag.
    Treatment of backslashes within backquotes is different.
    Variable assignments with tilde expansions are special-cased.
    Editing:
      \ does not escape editing chars (use ^V).
      Not all ksh bindings are set (e.g. `<ESC>#').
  The following is particularly near the feature/bug borderline:
    To turn off signal traps, use `trap - <signo>', not `trap <signo>'.
    "$@" always indicates at least one argument (older sh's do this too).

  ii) 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 scripts/c2z) to help convert .cshrc
  and .login files; see also the next question concerning aliases.

  Csh-compatibility additions include:
    Logout, rehash, source, (un)limit built-in commands.
    *rc file for interactive shells.
    Directory stacks.
    Cshjunkie*, ignoreeof options.
    The nonomatch option.
    >&, |& etc. redirection.
    foreach ... loops.
    $PROMPT as well as $PS1, $status as well as $?, $#argv as well as $#, ....
    Escape sequences via % for prompts.
    Special array variables $PATH etc. are colon-separated, $path are arrays.
    !-type history (which may be turned off).
    Arrays have csh-like features (see i)).

  iii) tcsh:

  Certain features have been borrowed from tcsh, including $watch,
  run-help, $savehist, $histlit, periodic commands etc., extended
  prompts, sched and which/where built-ins.  This list is not
  definitive: some features have gone in the other direction.

  iv) specific features:

  Things that zsh is particularly good at (no claim of exclusivity is made,
  especially as shells copy one another) include:
    Command line editing:
      multi-line commands,
      variable editing,
      command buffer stack,
      execution of unbound commands,
      menu completion,
      variable, host, editing function and option name completion,
      inline expansion of variables, history commands,
      path expansion (=foo).
    Globbing:
      recursive globbing (c.f find),
      file attribute qualifiers,
      full alternation and negation of patterns.
    Large number of options for tailoring.
    Adaptable messages for spelling, watch, time as well as prompt.
    Named directories.
    Comprehensive integer arithmetic.
    Manipulation of arrays.
    Spelling correction.


6) Why do my csh aliases not work?

  First of all, check you are using the syntax
	alias newcmd='list of commands'
  and not
	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 `\!*', 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
	alias cd 'cd \!*; echo $cwd'
  can be replaced by the zsh function,
	cd() { builtin cd $*; echo $PWD; }
  (the `builtin' tells zsh to use its own `cd', avoiding an infinite loop)
  or, perhaps better,
	cd() { builtin cd $*; print -D $PWD; }
  (which converts your home directory to a ~).  In fact, this problem is
  better solved by defining the special function chpwd() (see the manual).

  Note also that the `;' 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.

    1.  If the csh alias references "parameters" (\!:1 \!* etc.),
        then in zsh you need a function (referencing $1 $* etc.).
        Otherwise, you can use a zsh alias.

    2.  If you use a zsh function, you need to refer _at_least_ to
        $* in the body (inside the { }).  Parameters don't magically
        appear inside the { } the way they get appended to an alias.
    
    3.  If the csh alias references its own name (alias rm "rm -i"),
        then in a zsh function you need the "command" keyword
        (function rm() { command rm -i $* }), but in a zsh alias
        you don't (alias rm="rm -i").

    4.  If you have aliases that refer to each other (alias ls "ls -C";
        alias lf "ls -F" ==> lf == ls -C -F) then you must either:
        a.  convert all of them to zsh functions; or
        b.  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:

    5.  Mapping from csh alias "parameter referencing" into zsh function
        (assuming shwordsplit is NOT set in zsh):
             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))

    6.  Remember that it is NOT a syntax error in a zsh function to
        refer to a position ($1, $2, etc.) greater than the number of
        parameters. (E.g., in a csh alias, a reference to \!:5 will
        cause an error if 4 or fewer arguments are given; in a zsh
	function, $5 is the empty string if there are 4 or fewer
	parameters.)

    7.  To begin a zsh alias with a - (dash, hyphen) character, use
        "alias --":
                 csh                            zsh
            ===============             ==================
            alias - "fg %-"             alias -- -="fg %-"

    8.  Stay away from "alias -g" in zsh until you REALLY know what
        you're doing.


7) How do I get the meta key to work on my xterm?

  As stated in the manual, zsh needs to be told about the meta key by
  using `bindkey -me' or `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; `stty pass8' is the usual
  incantation.  Sample .zshrc entry:
	[[ $TERM = "xterm" ]] && stty pass8 && bindkey -me
  Make sure this comes *before* any bindkey entries in your .zshrc which
  redefine keys normally defined in the emacs/vi keymap.


8) Why does my terminal act funny in way x?

  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
	ttyctl -u
  before any stty commands you use.

  If _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. ignpar should be -ignpar: see the stty(1)
  manual page), try:
	ttyctl -u
	STTY='-ignpar' commandname
  (in this not-very-useful example).  Note that zsh doesn't reset the
  terminal completely afterwards: just the modes it uses itself.


9) Why does `$var' where var="foo bar" not do what I expect?

  In most Bourne-shell derivatives, multi-word variables such as
	var="foo bar"
  are split into words when passed to a command or used in a `for foo in $var'
  loop.  By default, zsh does not have that behaviour:  the variable remains
  intact.  An option (shwordsplit) exists to provide compatibility.
  
  For example, defining the function args to show the number of its
  arguments:
	args() { echo $#; }
  and with our definition of vble,
	args $vble
  produces the output `1'.  After
	setopt shwordsplit
  the same function produces the output `2', like 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.  The
  natural way to produce word-splitting behaviour in zsh is via arrays.
  For example,
	set -A array one two three twenty
  (or
        array=(one two three twenty)
  if you prefer), followed by
	args $array
  produces the output `4', regardless of the setting of shwordsplit.
  Arrays are also much more versatile than single strings.
  
  Note also the "$@" method of word splitting is always available in zsh
  functions and scripts (though strictly this does array splitting, not
  word splitting), also the substitution ${=foo} to toggle word
  splitting on variable `foo'.


10) How does base arithmetic work?

  The syntax (e.g. using the `let' builtin is)
	let 'foo = [16]ff'
  or equivalently
	(( foo = [16]ff ))
  Then
	echo $foo
  gives the answer `255'.  It is possible to declare variables explicitly
  to be integers, via
	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
	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 `$[ ... ]' method will
  always display in decimal.


11) How do I get a newline in my prompt?

  You can place a literal newline in quotes, i.e.
	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 
  `unsetopt cshjunkiequotes' and `setopt cshjunkiequotes', or put it in
  your .zshrc before the option is set.


12) Why does `bindkey ^a command-name' do something funny?

  You probably have the extendedglob option set in which case ^ and #
  are metacharacters.  ^a matches any file except one called a, so the
  line is interpreted as bindkey followed by a list of files.  Quote the
  ^ with a backslash or put quotation marks around ^a.


13) How do I reference command `foo' from within function `foo'?

  The command `command foo' does just that.  You don't need this with
  aliases, but you do with functions.  Note that the error message
        zsh: job table full or recursion limit exceeded
  is a good sign that you tried calling `foo' in function `foo' without
  using `command'.


14) I don't have root access: how do I make zsh my login shell?

  Unfortunately, on many machines you can't use `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 `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 `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 `exec' is often rather unforgiving.

  In .profile, try something like
	[ -f $HOME/bin/zsh ] && exec $HOME/bin/zsh -l
  and in .login, try something like
	if ( -f ~/bin/zsh ) exec ~/bin/zsh -l
  (in each case the -l tells zsh it is a login shell).  

  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, some people write these) to fail.  If you want
  to tell xterm to run zsh, change the SHELL environment variable to the
  full path of zsh.

  If you like your login shell to appear in the process list as '-zsh',
  you can link zsh to -zsh (e.g. by `ln -s ~/bin/zsh ~/bin/-zsh') and
  change the exec to `exec -zsh'.  (Make sure -zsh is in your path.)
  This has the same effect as the `-l' option.


15) What bugs are currently known and unfixed?

  Here are some of the more well-known ones, very roughly in decreasing
  order of significance.  A fuller bug list is now maintained by Carlos
  Carvalho <carlos@snfep1.if.usp.br>. Many of these can also be counted
  against differences from ksh in question 5).  Bugs marked [2.4] are
  fixed in patches which should appear in early versions of the next
  release.

  Unsetting multiply-named functions via a name other than the first
    crashes the shell. [2.4]
  Functions are a bit half-hearted about local variables. [2.4]
  `return' in a trap simply returns from the trap. [2.4]
  `return' in a shell script should act as `exit'.
  Pipelines ending in a while/until/for loop are uninterruptible.
  Certain built-ins won't allow the `VAR=value command ...' assignment.
  The ones that do don't unset VAR after use.
  Killing a command substitution in a loop doesn't kill the loop. [2.4]
  Assigments in a typeset are overenthusiastic about tildes.
  `bindkey -a -[ed]' modifies the alternate keymap.
  `echo  !-2:$ !$' substitutes !-2:$ twice.
  The :q modifier doesn't split words and -q and -x don't work for variables.
  `echo -n ^V^J!<return>' causes a shell crash [2.4]
  Command line editing in vi mode:
    `.' doesn't repeat `x' (repeats command before `x').
    `u' can go past original modification point.
    `.' doesn't repeat count for `s', `cw', `dw', `r' (and others?).
  If a command has both file and command completion enabled,
    completion of a word that is a directory finds only commands in
    the directory, not files and commands.
  $_ returns the last unexpanded word from the previous line (not command).
  Autocd won't use globbed filenames and sometimes refuses to work.
  `if (( 1 )) command' and `if (( 1 )) { ...' do not work
    (and related syntax problems).
  The rmstar feature doesn't handle shell variables properly.


16) Where do I report bugs, get more info / who's working on zsh?

  Zsh is now maintained by a motley collection of enthusiasts who
  subscribe to the mailing list, so any suggestions, complaints,
  questions and matters for discussion should be addressed to:
	zsh-list@cs.uow.edu.au
  (if you want someone to mail you directly, say so).  If you wish to
  subscribe to the mailing list, ask
	zsh-request@cs.uow.edu.au
  which is in the hands of Peter Gray, who also reads the list.  It is
  by no means restricted to source-code hackers.


17) What's on the wish-list?

  `compctl' to be enhanced to shut up tcsh-users.
  Option for glob qualifiers to follow perl syntax.
  Selective expansion of history, variables, globs on <TAB>.
  Option to quote !-history lexically via '' but not "" (hard).
  Binding of external commands to zle functions (arg-passing mechanism??).
  Ksh compatibility could be improved if required.


Acknowledgments:

Thanks to zsh-list, in particular Bart Schaefer, for suggestions
regarding this document; thanks to Jim Mattson for his hard work as
archivist.
