This file describes changes made during the 4.3 series of releases; it is superseded by the description of changes between 4.2 and 5.0 in the main NEWS file. Changes since 4.3.15 -------------------- The option HASH_EXECUTABLES_ONLY has been added. When this is set, directories in the command path will be checked for executables before they are added to the command table (hash); otherwise, all files in the directory are added. The effect of this option was present in 4.3.15, which could cause significant delays when hashing on systems with network directories in the path. Changes since 4.3.12 -------------------- There are no significant feature changes to the shell itself, although many bug fixes and improvements to functions. Changes since 4.3.11 -------------------- The zsh/parameter module has a new readonly associative array $usergroups whose keys are the names of system groups of which the current user is a member and whose values are the corresponding group identifiers. The region_highlight array, which controls highlighting of the command line from zle widgets, is now updated dynamically as the command line is edited. In POSIX emulation ("emulate sh") the shell is more accurate about when it should or should not exit on errors. The ${NAME:OFFSET:LENGTH} syntax now supports negative LENGTH, which counts back from the end of the string. The (g:opts:) flag in parameter expansion processes escape sequences like the echo and print builtins. opts can be any combination of o, e and c. With e, acts like print rather than echo except for octal escapes which are controlled separately by the o option. With c, interpret control sequences like "^X" as bindkey does. Regardless of the opts, \c is not interpreted. Changes between versions 4.3.10 and 4.3.11 ------------------------------------------ When the shell is invoked with the base name of a script, for example as `zsh scriptname', previous versions of zsh have used the name directly, whereas other shells use the value of $PATH to find the script. The option PATH_SCRIPT has been added to provide the alternative behaviour. This is turned on where appropriate in compatibility modes. Parameters, globbing, etc. -+-+-+-+-+-+-+-+-+-+-+-+-+ Parameter expansion has been enhanced to provide the ${NAME:OFFSET} and ${NAME:OFFSET:LENGTH} syntax for substrings and subarrays present in several other shells. OFFSET always uses zero-based indexing. The only clash with existing zsh syntax occurs if OFFSET begins with an alphabetic character or `&', which is not likely. The (D) flag in parameter expansion abbreviates directories in the substituted value. The (q-) flag does minimal shell quotation of arguments for maximum human readability of the result. The (Z) flag in parameter expansion is an enhanced version of the (z) flag that takes an argument indicating how the string to be split is treated. (Z:c:) parses comments as strings; (Z:C:) parses comments and strips them; (Z:n:) treats newlines as ordinary whitespace: (z) has always treated unquoted newlines as shell delimiters and turned them into semicolons, though this was not previously documented. Numeric expansion with braces has been extended so that a step may be given, as in {3..9..2}. The step may be negative as may the start and end of the range (this is also new). The glob qualifier P can be used to add a separate word before each match. For example, *(P:-f:) produces the command line `-f file1 -f file2 ...'. Regular expression matches now use the same variables for storing matched components as shell pattern matching. The function system now provides the function regexp-replace for replacing text using regular expressions. The zle widget functions replace-string, replace-string-again, if defined with regex in the name (e.g. "zle -N replace-regexp replace-string"), perform regular expression matches. In replacement text \& and \1 have the standard meaning. Line editor and completion -+-+-+-+-+-+-+-+-+-+-+-+-+ The completion system now has a style path-completion. Setting this to false inhibits completion of paths before the current path component, e.g. /u/b/z no longer completes to /usr/bin/zsh. This is useful on systems where this form of completion is pathologically slow due to network performance. With the MULTIBYTE option, the line editor now highlights bytes in the input that are not part of a valid character in the current locale in hex as for hex digits X; highlighting is controlled by the "special" keyword in the zle_highlight array. These can be distinguished from unprintable Unicode characters which also use "special" highlighting as the latter are always two or four bytes long, e.g. , . zle_highlight also controls highlighting of a removable completion suffix, e.g. the "/" automatically appended to directories. This uses the keyword "suffix". The line editor now sets the variable ZLE_LINE_ABORTED if there is an error when editing the line. The following code can be used to create a bindable editor widget to restore the aborted line: recover-line() { LBUFFER=$ZLE_LINE_ABORTED RBUFFER=; } zle -N recover-line and then either bind recover-line to a key sequence or use `M-x recover-line '. The parameter ZLE_STATE, available in user-defined line editor widgets, gives information on the state of the line editor. Currently this is whether the line editor is in insert or overwrite mode. Miscellaneous options -+-+-+-+-+-+-+-+-+-+- The new shell option HIST_LEX_WORDS causes history lines read in from a file to be split in the same way as normal shell lines, instead of simply on whitespace. It's an option as although the result is more accurate it can take a long time when the history size is large. The shell option MONITOR can be set in non-interactive shells, and also in subshells (as created by surrounding commands with parentheses), turning on job control for that subshell. The initial behaviour of a subshell is still to turn job control off, however if the new POSIX_JOBS option is set MONITOR remains active in subshells. The new shell option POSIX_CD, active in emulations of POSIX-based shells, makes the cd builtin POSIX-compatible. The POSIX_JOBS option already referred to has various other compatibility enchancements. The new shell option POSIX_STRINGS makes a null character in $'...' expansion terminate the string, as is already the case in bash. This is not particularly useful behaviour but may become a POSIX requirement. The new shell option POSIX_TRAPS causes the EXIT trap to behave in the same way as in other shells, i.e. it is only run when the shell exits. The new shell option SOURCE_TRACE causes the shell to report files containing shell code that the shell executes directly, i.e. startup files or files run with the `source' or `.' builtins. The shell option SUN_KEYBOARD_HACK has been supplemented by a more general mechanism: the KEYBOARD_HACK variable defines the character to be ignored. Add-on modules and function -+-+-+-+-+-+-+-+-+-+-+-+-+- The module zsh/system has a new "zsystem" builtin whose subcommands perform system level tasks. Currently "zsystem flock" performs advisory file locking (for aficionados, this uses the fcntl() system call so works over the network on Linux). This is a particularly convenient way of locking files for the length of a subshell. "zsystem supports flock" provides a test for this feature. There is now a function system for recording and restoring recently entered directories in a persistent fashion, with support in completion and (if explicitly installed) dynamic directory expansion. See the entry for cdr in the zshcontrib manual page. Changes between versions 4.3.9 and 4.3.10 ----------------------------------------- The command "emulate -c ..." evaluates an expression in a given emulation. The emulation is sticky for functions defined within the expression. The variable CORRECT_IGNORE gives a pattern that can be ignored in spelling correction. CORRECT_IGNORE='_*' ignores completion functions. The option POSIX_ALIASES improves compatibility of aliases with other shells. The variable ZSH_PATCHLEVEL can be used to test for unreleased versions of the shell; it is present but less useful in released versions. The variables ZLE_REMOVE_SUFFIX_CHARS and ZLE_SPACE_SUFFIX_CHARS allow more control over the way automatically removed suffixes are treated in completion. Major changes between versions 4.3.6 and 4.3.9 ---------------------------------------------- The option COMBINING_CHARS has been added. When it is set, the line editor assumes the terminal is capable of displaying zero-width combining characters (typically accents) correctly as modifications to the base character, and will act accordingly. Note it is not set by default owing to vagaries of terminals. The system is reported to work on MacOS, where this is particularly important as accented characters in file names are stored in their decomposed form (i.e. with base and combining characters). The option HIST_FCNTL_LOCK has been added to provide locking of history files using the system call fcntl(). On recent NFS implementations this may provide better reliability. The syntax ~[...] provides a dynamic form of directory naming, supplementing the existing static ~name syntax. A user-defined shell function, zsh_directory_name, is used to handle both expansion of names to directories and contraction of directories to names. Patterns can now be used in incremental searches with the new widgets history-incremental-pattern-search-backward and history-incremental-pattern-search-forward. These are not bound to keys by default. Highlighting and colouring of sections of the command line is now supported, controlled by the array parameter zle_highlight and the ZLE special parameter region_highlight. Colouring of prompts is now supported within the shell by prompt escapes. The prompt theme system has been updated. Various changes have been added to make debugging of shell code easier: - As noted in README, the option DEBUG_BEFORE_CMD is now set by default. - In DEBUG traps, $ZSH_DEBUG_CMD gives the code for which the trap is called as a string. - "setopt ERR_EXIT" in a DEBUG trap causes the code not to be executed. - $ZSH_SUBSHELL indicates the subshell level at which code is being executed. - The zsh/parameter module has various additional arrays similar to the existing $funcstack and $functrace, namely $funcsourcetrace and $funcfiletrace. The consistency and informativeness of the output of all these arrays has been improved. - Prompt escapes %x and %I show the source file and line number in debug prompts (compare %N and %i which show names and line numbers in the execution environment). - The option NO_MULTI_FUNCDEF can turn off multiple definition of functions at once, a rarely used feature that can cause problems with misplaced "()". - The "fc" builtin has been enhanced to make non-interactive use possible and output consistent when the history is manipulated with "print -s". The completion style accept-exact-dirs has been added. When true, this suppresses attempts to complete non-final directory segments of a filename path when the directory exists. (For example, /home/pws/src/zsh/ discovers that /home/pws/src/zsh exists and leaves the directory component alone, while /h/p/s/z/ completes to /home/pws/src/zsh/... as before.) This should improve completion behaviour noticeably in special cases, such as remote paths under Cygwin. Major changes between versions 4.3.5 and 4.3.6 ---------------------------------------------- cd, chdir, pushd and popd now take a -q option to suppress side effects including printing the directory stack (for pushd and popd) and executing the chpwd hook functions (for all four). The parameter subscript (e) flag now forces the argument to be treated as a string where it would previously have been treated as a pattern, for example ${array[(ie)*]} substitutes the index of the element whose value is "*". Major changes between versions 4.3.4 and 4.3.5 ---------------------------------------------- - The new extended globbing flag (#cN,M) behaves similarly to the extended regular expression syntax {N,M}. - The zsh/datetime module has been enhanced and a calendar function system has been added along the lines of (but much enhanced from) the traditional Unix "calendar" utility. This is still under development. See the zshcalsys manual. (The calendar functions were in 4.3.4 but were not listed in this file. There have been significant enhancements since 4.3.4.) - A new module zsh/curses provides a builtin zcurses for access to to the curses screen manipulation package. See the entry for zsh/curses in the zshmodules manual. - The module system has been enhanced to support the notion of "features" that give more control over which builtins, parameters, conditions and math functions are loaded from a module. In particular, "zmodload -F zsh/stat b:zstat" makes the builtin previously called "stat" available as "zstat" (only) to avoid clashes with a system command named "stat". Major changes between versions 4.2 and 4.3.4 -------------------------------------------- - There is support for multibyte character sets. This is now reasonably close to complete, although Unicode combining characters don't work properly. See Multibyte Character Support in INSTALL. - The shell can now run an installation function for a new user (a user with no .zshrc, .zshenv, .zprofile or .zlogin file) without any additional setting up by the administrator. See "THE ZSH/NEWUSER MODULE" in the zshmodules manual page. - The manual now has a Roadmap section (manual page zshroadmap) to give new users an indication of the most interesting parts of the manual. - New option PROMPT_SP (on by default): works around the problem that the line editor can overwrite output with no newline at the end. See the zshoptions manual page. - New option HIST_SAVE_BY_COPY (on by default): history is saved by copying and renaming instead of directly overwriting. See the zshoptions manual page. - New redirection syntax e.g. {myfd}>file opens a new file descriptor and stores the number in $myfd, so that >&$myfd will work. Chosen not to break existing code (and to be compatible with proposals for the Korn shell). See the section REDIRECTION in the zshmisc manual page. - Substitutions of the form ${var:-"$@"}, ${var:+"$@"} and similar where word-splitting is applied to the text after the :- or :+ (in particular, where the SH_WORD_SPLIT option is in effect for compatibility) now behave as in other Bourne- and POSIX-compatible shells when in the appropriate emulation mode. - New Posix-style zsh-specific tests [[:IDENT:]], [[:IFS:]], [[:IFSSPACE:]], [[:WORD:]] test if character can appear in identifier, is an IFS character, is an IFS whitespace character, or is considered as part of a word (is alphanumeric or appears in $WORDCHARS). These works correctly on multibyte characters if the appropriate support is present. See the section FILENAME GENERATION in the zshexpn manual page. - Time comparisons on files when sorting or using test operators will use high-resolution timestamps when available. This gives a resolution of a nanosecond instead of a second. - The idiom =(<<<...) is optimised so that the shell internally turns the ... into the contents of a file whose name is then substituted. The syntax has always been usable by means of the NULLCMD feature, but previously it generated an intermediate process; it has now been rewritten along the same lines as the optimisation for $(<...) that inserts a file into the command line without the use of an external programme. - Supplied functions catch and throw provide limited support for exception handling using the `{ ... } always { ... }' syntax. See the section EXCEPTION HANDLING in the zshcontrib manual page. - Signals now accept the SIG as part of the name for compatibility with other shells. - Editor function argument-base allows non-decimal arguments for editor widgets. See the entry in the zshzle manual page. - As always, there are many enhancements to completion functions.