diff options
Diffstat (limited to 'Doc/zshcontrib.1')
-rw-r--r-- | Doc/zshcontrib.1 | 5558 |
1 files changed, 5558 insertions, 0 deletions
diff --git a/Doc/zshcontrib.1 b/Doc/zshcontrib.1 new file mode 100644 index 000000000..573822d46 --- /dev/null +++ b/Doc/zshcontrib.1 @@ -0,0 +1,5558 @@ +.TH "ZSHCONTRIB" "1" "May 1, 2022" "zsh 5\&.8\&.1\&.3-test" +.SH "NAME" +zshcontrib \- user contributions to zsh +.\" Yodl file: Zsh/contrib.yo +.SH "DESCRIPTION" +.PP +The Zsh source distribution includes a number of items contributed by the +user community\&. These are not inherently a part of the shell, and some +may not be available in every zsh installation\&. The most significant of +these are documented here\&. For documentation on other contributed items +such as shell functions, look for comments in the function source files\&. +.PP +.PP +.SH "UTILITIES" +.PP +.SS "Accessing On\-Line Help" +.PP +The key sequence \fBESC h\fP is normally bound by ZLE to execute the +\fBrun\-help\fP widget (see +\fIzshzle\fP(1))\&. This invokes the \fBrun\-help\fP command with the command word from the +current input line as its argument\&. By default, \fBrun\-help\fP is an alias +for the \fBman\fP command, so this often fails when the command word is a +shell builtin or a user\-defined function\&. By redefining the \fBrun\-help\fP +alias, one can improve the on\-line help provided by the shell\&. +.PP +The \fBhelpfiles\fP utility, found in the \fBUtil\fP directory of the +distribution, is a Perl program that can be used to process the zsh manual +to produce a separate help file for each shell builtin and for many other +shell features as well\&. The autoloadable \fBrun\-help\fP function, found in +\fBFunctions/Misc\fP, searches for these helpfiles and performs several +other tests to produce the most complete help possible for the command\&. +.PP +Help files are installed by default to a subdirectory of \fB/usr/share/zsh\fP +or \fB/usr/local/share/zsh\fP\&. +.PP +To create your own help files with \fBhelpfiles\fP, choose or create a +directory where the individual command help files will reside\&. For +example, you might choose \fB~/zsh_help\fP\&. If you unpacked the zsh +distribution in your home directory, you would use the commands: +.PP +.RS +.nf +\fBmkdir ~/zsh_help +perl ~/zsh\-5\&.8\&.1\&.3\-test/Util/helpfiles ~/zsh_help\fP +.fi +.RE +.PP +The \fBHELPDIR\fP parameter tells \fBrun\-help\fP where to look for the help +files\&. When unset, it uses the default installation path\&. +To use your own set of help files, set this to the appropriate path +in one of your startup files: +.PP +.RS +.nf +\fBHELPDIR=~/zsh_help\fP +.fi +.RE +.PP +To use the \fBrun\-help\fP function, you need to add lines something +like the following to your \fB\&.zshrc\fP or equivalent startup file: +.PP +.RS +.nf +\fBunalias run\-help +autoload run\-help\fP +.fi +.RE +.PP +Note that in order for `\fBautoload run\-help\fP\&' to work, the \fBrun\-help\fP +file must be in one of the directories named in your \fBfpath\fP array (see +\fIzshparam\fP(1))\&. This should already be the case if you have a standard zsh +installation; if it is not, copy \fBFunctions/Misc/run\-help\fP to an +appropriate directory\&. +.PP +.SS "Recompiling Functions" +.PP +If you frequently edit your zsh functions, or periodically update your zsh +installation to track the latest developments, you may find that function +digests compiled with the \fBzcompile\fP builtin are frequently out of date +with respect to the function source files\&. This is not usually a problem, +because zsh always looks for the newest file when loading a function, but +it may cause slower shell startup and function loading\&. Also, if a digest +file is explicitly used as an element of \fBfpath\fP, zsh won\&'t check whether +any of its source files has changed\&. +.PP +The \fBzrecompile\fP autoloadable function, found in \fBFunctions/Misc\fP, can +be used to keep function digests up to date\&. +.PP +.PD 0 +.TP +.PD 0 +\fBzrecompile\fP [ \fB\-qt\fP ] [ \fIname\fP \&.\&.\&. ] +.TP +.PD +\fBzrecompile\fP [ \fB\-qt\fP ] \fB\-p\fP \fIarg\fP \&.\&.\&. [ \fB\-\fP\fB\-\fP \fIarg\fP \&.\&.\&. ] +This tries to find \fB*\&.zwc\fP files and automatically re\-compile them if at +least one of the original files is newer than the compiled file\&. This +works only if the names stored in the compiled files are full paths or are +relative to the directory that contains the \fB\&.zwc\fP file\&. +.RS +.PP +In the first form, each \fIname\fP is the name of a compiled file or a +directory containing \fB*\&.zwc\fP files that should be checked\&. If no +arguments are given, the directories and \fB*\&.zwc\fP files in \fBfpath\fP are +used\&. +.PP +When \fB\-t\fP is given, no compilation is performed, but a return status of +zero (true) is set if there are files that need to be re\-compiled and +non\-zero (false) otherwise\&. The \fB\-q\fP option quiets the chatty output +that describes what \fBzrecompile\fP is doing\&. +.PP +Without the \fB\-t\fP option, the return status is zero if all files that +needed re\-compilation could be compiled and non\-zero if compilation for at +least one of the files failed\&. +.PP +If the \fB\-p\fP option is given, the \fIarg\fPs are interpreted as one +or more sets of arguments for \fBzcompile\fP, separated by `\fB\-\fP\fB\-\fP\&'\&. +For example: +.PP +.RS +.nf +\fBzrecompile \-p \e + \-R ~/\&.zshrc \-\- \e + \-M ~/\&.zcompdump \-\- \e + ~/zsh/comp\&.zwc ~/zsh/Completion/*/_*\fP +.fi +.RE +.PP +This compiles \fB~/\&.zshrc\fP into \fB~/\&.zshrc\&.zwc\fP if that doesn\&'t exist or +if it is older than \fB~/\&.zshrc\fP\&. The compiled file will be marked for +reading instead of mapping\&. The same is done for \fB~/\&.zcompdump\fP and +\fB~/\&.zcompdump\&.zwc\fP, but this compiled file is marked for mapping\&. The +last line re\-creates the file \fB~/zsh/comp\&.zwc\fP if any of the files +matching the given pattern is newer than it\&. +.PP +Without the \fB\-p\fP option, \fBzrecompile\fP does not create function digests +that do not already exist, nor does it add new functions to the digest\&. +.RE +.PP +The following shell loop is an example of a method for creating function +digests for all functions in your \fBfpath\fP, assuming that you have write +permission to the directories: +.PP +.RS +.nf +\fBfor ((i=1; i <= $#fpath; ++i)); do + dir=$fpath[i] + zwc=${dir:t}\&.zwc + if [[ $dir == (\&.|\&.\&.) || $dir == (\&.|\&.\&.)/* ]]; then + continue + fi + files=($dir/*(N\-\&.)) + if [[ \-w $dir:h && \-n $files ]]; then + files=(${${(M)files%/*/*}#/}) + if ( cd $dir:h && + zrecompile \-p \-U \-z $zwc $files ); then + fpath[i]=$fpath[i]\&.zwc + fi + fi +done\fP +.fi +.RE +.PP +The \fB\-U\fP and \fB\-z\fP options are appropriate for functions in the default +zsh installation \fBfpath\fP; you may need to use different options for your +personal function directories\&. +.PP +Once the digests have been created and your \fBfpath\fP modified to refer to +them, you can keep them up to date by running \fBzrecompile\fP with no +arguments\&. +.PP +.SS "Keyboard Definition" +.PP +The large number of possible combinations of keyboards, workstations, +terminals, emulators, and window systems makes it impossible for zsh to +have built\-in key bindings for every situation\&. The \fBzkbd\fP utility, +found in \fBFunctions/Misc\fP, can help you quickly create key bindings for your +configuration\&. +.PP +Run \fBzkbd\fP either as an autoloaded function, or as a shell script: +.PP +.RS +.nf +\fBzsh \-f ~/zsh\-5\&.8\&.1\&.3\-test/Functions/Misc/zkbd\fP +.fi +.RE +.PP +When you run \fBzkbd\fP, it first asks you to enter your terminal type; if +the default it offers is correct, just press return\&. It then asks you to +press a number of different keys to determine characteristics of your +keyboard and terminal; \fBzkbd\fP warns you if it finds anything out of the +ordinary, such as a Delete key that sends neither \fB^H\fP nor \fB^?\fP\&. +.PP +The keystrokes read by \fBzkbd\fP are recorded as a definition for an +associative array named \fBkey\fP, written to a file in the subdirectory +\fB\&.zkbd\fP within either your \fBHOME\fP or \fBZDOTDIR\fP directory\&. The name +of the file is composed from the \fBTERM\fP, \fBVENDOR\fP and \fBOSTYPE\fP +parameters, joined by hyphens\&. +.PP +You may read this file into your \fB\&.zshrc\fP or another startup file with +the `\fBsource\fP\&' or `\fB\&.\fP' commands, then reference the \fBkey\fP parameter +in bindkey commands, like this: +.PP +.RS +.nf +\fBsource ${ZDOTDIR:\-$HOME}/\&.zkbd/$TERM\-$VENDOR\-$OSTYPE +[[ \-n ${key[Left]} ]] && bindkey "${key[Left]}" backward\-char +[[ \-n ${key[Right]} ]] && bindkey "${key[Right]}" forward\-char +# etc\&.\fP +.fi +.RE +.PP +Note that in order for `\fBautoload zkbd\fP\&' to work, the \fBzkdb\fP file must +be in one of the directories named in your \fBfpath\fP array (see +\fIzshparam\fP(1))\&. This should already be the case if you have a standard zsh +installation; if it is not, copy \fBFunctions/Misc/zkbd\fP to an +appropriate directory\&. +.PP +.SS "Dumping Shell State" +.PP +Occasionally you may encounter what appears to be a bug in the shell, +particularly if you are using a beta version of zsh or a development +release\&. Usually it is sufficient to send a description of the +problem to one of the zsh mailing lists (see +\fIzsh\fP(1)), but sometimes one of the zsh developers will need to recreate your +environment in order to track the problem down\&. +.PP +The script named \fBreporter\fP, found in the \fBUtil\fP directory of the +distribution, is provided for this purpose\&. (It is also possible to +\fBautoload reporter\fP, but \fBreporter\fP is not installed in \fBfpath\fP +by default\&.) This script outputs a detailed dump of the shell state, +in the form of another script that can be read with `\fBzsh \-f\fP\&' to +recreate that state\&. +.PP +To use \fBreporter\fP, read the script into your shell with the `\fB\&.\fP\&' +command and redirect the output into a file: +.PP +.RS +.nf +\fB\&. ~/zsh\-5\&.8\&.1\&.3\-test/Util/reporter > zsh\&.report\fP +.fi +.RE +.PP +You should check the \fBzsh\&.report\fP file for any sensitive information +such as passwords and delete them by hand before sending the script to the +developers\&. Also, as the output can be voluminous, it\&'s best to wait for +the developers to ask for this information before sending it\&. +.PP +You can also use \fBreporter\fP to dump only a subset of the shell state\&. +This is sometimes useful for creating startup files for the first time\&. +Most of the output from reporter is far more detailed than usually is +necessary for a startup file, but the \fBaliases\fP, \fBoptions\fP, and +\fBzstyles\fP states may be useful because they include only changes from +the defaults\&. The \fBbindings\fP state may be useful if you have created +any of your own keymaps, because \fBreporter\fP arranges to dump the keymap +creation commands as well as the bindings for every keymap\&. +.PP +As is usual with automated tools, if you create a startup file with +\fBreporter\fP, you should edit the results to remove unnecessary commands\&. +Note that if you\&'re using the new completion system, you should \fInot\fP +dump the \fBfunctions\fP state to your startup files with \fBreporter\fP; use +the \fBcompdump\fP function instead (see +\fIzshcompsys\fP(1))\&. +.PP +.PD 0 +.TP +.PD +\fBreporter\fP [ \fIstate\fP \&.\&.\&. ] +Print to standard output the indicated subset of the current shell state\&. +The \fIstate\fP arguments may be one or more of: +.RS +.PP +.PD 0 +.TP +\fBall\fP +Output everything listed below\&. +.TP +\fBaliases\fP +Output alias definitions\&. +.TP +\fBbindings\fP +Output ZLE key maps and bindings\&. +.TP +\fBcompletion\fP +Output old\-style \fBcompctl\fP commands\&. +New completion is covered by \fBfunctions\fP and \fBzstyles\fP\&. +.TP +\fBfunctions\fP +Output autoloads and function definitions\&. +.TP +\fBlimits\fP +Output \fBlimit\fP commands\&. +.TP +\fBoptions\fP +Output \fBsetopt\fP commands\&. +.TP +\fBstyles\fP +Same as \fBzstyles\fP\&. +.TP +\fBvariables\fP +Output shell parameter assignments, plus \fBexport\fP +commands for any environment variables\&. +.TP +\fBzstyles\fP +Output \fBzstyle\fP commands\&. +.PD +.PP +If the \fIstate\fP is omitted, \fBall\fP is assumed\&. +.RE +.PP +With the exception of `\fBall\fP\&', every \fIstate\fP can be abbreviated by +any prefix, even a single letter; thus \fBa\fP is the same as \fBaliases\fP, +\fBz\fP is the same as \fBzstyles\fP, etc\&. +.PP +.SS "Manipulating Hook Functions" +.PP +.PD 0 +.TP +.PD +\fBadd\-zsh\-hook\fP [ \fB\-L\fP | \fB\-dD\fP ] [ \fB\-Uzk\fP ] \fIhook\fP \fIfunction\fP +Several functions are special to the shell, as described in the section +SPECIAL FUNCTIONS, see \fIzshmisc\fP(1), +in that they are automatically called at specific points during shell execution\&. +Each has an associated array consisting of names of functions to be +called at the same point; these are so\-called `hook functions\&'\&. +The shell function \fBadd\-zsh\-hook\fP provides a simple way of adding or +removing functions from the array\&. +.RS +.PP +\fIhook\fP is one of \fBchpwd\fP, \fBperiodic\fP, \fBprecmd\fP, \fBpreexec\fP, +\fBzshaddhistory\fP, \fBzshexit\fP, or \fBzsh_directory_name\fP, +the special functions in question\&. Note that \fBzsh_directory_name\fP +is called in a different way from the other functions, but may +still be manipulated as a hook\&. +.PP +\fIfunction\fP is name of an ordinary shell function\&. If no options +are given this will be added to the array of functions to be executed +in the given context\&. +Functions are invoked in the order they were added\&. +.PP +If the option \fB\-L\fP is given, the current values for the hook arrays +are listed with \fBtypeset\fP\&. +.PP +If the option \fB\-d\fP is given, the \fIfunction\fP is removed from +the array of functions to be executed\&. +.PP +If the option \fB\-D\fP is given, the \fIfunction\fP is treated as a pattern +and any matching names of functions are removed from the array of +functions to be executed\&. +.PP +The options \fB\-U\fP, \fB\-z\fP and \fB\-k\fP are passed as arguments to +\fBautoload\fP for \fIfunction\fP\&. For functions contributed with zsh, the +options \fB\-Uz\fP are appropriate\&. +.RE +.TP +\fBadd\-zle\-hook\-widget\fP [ \fB\-L\fP | \fB\-dD\fP ] [ \fB\-Uzk\fP ] \fIhook\fP \fIwidgetname\fP +Several widget names are special to the line editor, as described in the section +Special Widgets, see \fIzshzle\fP(1), +in that they are automatically called at specific points during editing\&. +Unlike function hooks, these do not use a predefined array of other names +to call at the same point; the shell function \fBadd\-zle\-hook\-widget\fP +maintains a similar array and arranges for the special widget to invoke +those additional widgets\&. +.RS +.PP +\fIhook\fP is one of \fBisearch\-exit\fP, \fBisearch\-update\fP, +\fBline\-pre\-redraw\fP, \fBline\-init\fP, \fBline\-finish\fP, \fBhistory\-line\-set\fP, +or \fBkeymap\-select\fP, corresponding to each of the special widgets +\fBzle\-isearch\-exit\fP, etc\&. The special widget names are also accepted +as the \fIhook\fP argument\&. +.PP +\fIwidgetname\fP is the name of a ZLE widget\&. If no options are given this +is added to the array of widgets to be invoked in the given hook context\&. +Widgets are invoked in the order they were added, with +.RS +.nf +\fB\fBzle \fP\fIwidgetname\fP\fB \-Nw \-f "nolast" \-\- "$@"\fP\fP +.fi +.RE +.PP +Note that this means that the `\fBWIDGET\fP\&' special parameter tracks the +\fIwidgetname\fP when the widget function is called, rather than tracking +the name of the corresponding special hook widget\&. +.PP +If the option \fB\-d\fP is given, the \fIwidgetname\fP is removed from +the array of widgets to be executed\&. +.PP +If the option \fB\-D\fP is given, the \fIwidgetname\fP is treated as a pattern +and any matching names of widgets are removed from the array\&. +.PP +If \fIwidgetname\fP does not name an existing widget when added to the +array, it is assumed that a shell function also named \fIwidgetname\fP is +meant to provide the implementation of the widget\&. This name is therefore +marked for autoloading, and the options \fB\-U\fP, \fB\-z\fP and \fB\-k\fP are +passed as arguments to \fBautoload\fP as with \fBadd\-zsh\-hook\fP\&. The +widget is also created with `\fBzle \-N \fP\fIwidgetname\fP\&' to cause the +corresponding function to be loaded the first time the hook is called\&. +.PP +The arrays of \fIwidgetname\fP are currently maintained in \fBzstyle\fP +contexts, one for each \fIhook\fP context, with a style of `\fBwidgets\fP\&'\&. +If the \fB\-L\fP option is given, this set of styles is listed with +`\fBzstyle \-L\fP\&'\&. This implementation may change, and the special widgets +that refer to the styles are created only if \fBadd\-zle\-hook\-widget\fP is +called to add at least one widget, so if this function is used for any +hooks, then all hooks should be managed only via this function\&. +.RE +.PP +.SH "REMEMBERING RECENT DIRECTORIES" +.PP +The function \fBcdr\fP allows you to change the working directory to a +previous working directory from a list maintained automatically\&. It is +similar in concept to the directory stack controlled by the \fBpushd\fP, +\fBpopd\fP and \fBdirs\fP builtins, but is more configurable, and as it stores +all entries in files it is maintained across sessions and (by default) +between terminal emulators in the current session\&. Duplicates are +automatically removed, so that the list reflects the single most recent +use of each directory\&. +.PP +Note that the \fBpushd\fP directory stack is not actually modified or used +by \fBcdr\fP unless you configure it to do so as described in the +configuration section below\&. +.PP +.SS "Installation" +.PP +The system works by means of a hook function that is called every time the +directory changes\&. To install the system, autoload the required functions +and use the \fBadd\-zsh\-hook\fP function described above: +.PP +.RS +.nf +\fBautoload \-Uz chpwd_recent_dirs cdr add\-zsh\-hook +add\-zsh\-hook chpwd chpwd_recent_dirs\fP +.fi +.RE +.PP +Now every time you change directly interactively, no matter which +command you use, the directory to which you change will be remembered +in most\-recent\-first order\&. +.PP +.SS "Use" +.PP +All direct user interaction is via the \fBcdr\fP function\&. +.PP +The argument to cdr is a number \fIN\fP corresponding to the \fIN\fPth most +recently changed\-to directory\&. 1 is the immediately preceding directory; +the current directory is remembered but is not offered as a destination\&. +Note that if you have multiple windows open 1 may refer to a directory +changed to in another window; you can avoid this by having per\-terminal +files for storing directory as described for the +\fBrecent\-dirs\-file\fP style below\&. +.PP +If you set the \fBrecent\-dirs\-default\fP style described below \fBcdr\fP +will behave the same as \fBcd\fP if given a non\-numeric argument, or more +than one argument\&. The recent directory list is updated just the same +however you change directory\&. +.PP +If the argument is omitted, 1 is assumed\&. This is similar to \fBpushd\fP\&'s +behaviour of swapping the two most recent directories on the stack\&. +.PP +Completion for the argument to \fBcdr\fP is available if compinit has been +run; menu selection is recommended, using: +.PP +.RS +.nf +\fBzstyle \&':completion:*:*:cdr:*:*' menu selection\fP +.fi +.RE +.PP +to allow you to cycle through recent directories; the order is preserved, +so the first choice is the most recent directory before the current one\&. +The verbose style is also recommended to ensure the directory is shown; this +style is on by default so no action is required unless you have changed it\&. +.PP +.SS "Options" +.PP +The behaviour of \fBcdr\fP may be modified by the following options\&. +.PP +.PD 0 +.TP +.PD +\fB\-l\fP +lists the numbers and the corresponding directories in +abbreviated form (i\&.e\&. with \fB~\fP substitution reapplied), one per line\&. +The directories here are not quoted (this would only be an issue if a +directory name contained a newline)\&. This is used by the completion +system\&. +.TP +\fB\-r\fP +sets the variable \fBreply\fP to the current set of directories\&. Nothing +is printed and the directory is not changed\&. +.TP +\fB\-e\fP +allows you to edit the list of directories, one per line\&. The +list can be edited to any extent you like; no sanity checking is +performed\&. Completion is available\&. No quoting is necessary (except for +newlines, where I have in any case no sympathy); directories are in +unabbreviated form and contain an absolute path, i\&.e\&. they start with \fB/\fP\&. +Usually the first entry should be left as the current directory\&. +.TP +\fB\-p \&'\fP\fIpattern\fP\fB'\fP +Prunes any items in the directory list that match the given extended glob +pattern; the pattern needs to be quoted from immediate expansion on the +command line\&. The pattern is matched against each completely expanded +file name in the list; the full string must match, so wildcards at the +end (e\&.g\&. \fB\&'*removeme*'\fP) are needed to remove entries with a given +substring\&. +.RS +.PP +If output is to a terminal, then the function will print the new list +after pruning and prompt for confirmation by the user\&. This output and +confirmation step can be skipped by using \fB\-P\fP instead of \fB\-p\fP\&. +.RE +.PP +.SS "Configuration" +.PP +Configuration is by means of the styles mechanism that should be familiar +from completion; if not, see the description of the \fBzstyle\fP command in +see \fIzshmodules\fP(1)\&. The context for setting styles +should be \fB\&':chpwd:*'\fP in case the meaning of the context is extended in +future, for example: +.PP +.RS +.nf +\fBzstyle \&':chpwd:*' recent\-dirs\-max 0\fP +.fi +.RE +.PP +sets the value of the \fBrecent\-dirs\-max\fP style to 0\&. In practice the +style name is specific enough that a context of \&'*' should be fine\&. +.PP +An exception is \fBrecent\-dirs\-insert\fP, which is used exclusively by the +completion system and so has the usual completion system context +(\fB\&':completion:*'\fP if nothing more specific is needed), though again +\fB\&'*'\fP should be fine in practice\&. +.PP +.PD 0 +.TP +.PD +\fBrecent\-dirs\-default\fP +If true, and the command is expecting a recent directory index, and +either there is more than one argument or the argument is not an +integer, then fall through to "cd"\&. This allows the lazy to use only +one command for directory changing\&. Completion recognises this, too; +see recent\-dirs\-insert for how to control completion when this option +is in use\&. +.TP +\fBrecent\-dirs\-file\fP +The file where the list of directories is saved\&. The default +is \fB${ZDOTDIR:\-$HOME}/\&.chpwd\-recent\-dirs\fP, i\&.e\&. this is in your +home directory unless you have set the variable \fBZDOTDIR\fP to point +somewhere else\&. Directory names are saved in \fB$\&'\fP\fI\&.\&.\&.\fP\fB'\fP quoted +form, so each line in the file can be supplied directly to the shell as an +argument\&. +.RS +.PP +The value of this style may be an array\&. In this case, the first +file in the list will always be used for saving directories while any +other files are left untouched\&. When reading the recent directory +list, if there are fewer than the maximum number of entries in the +first file, the contents of later files in the array will be appended +with duplicates removed from the list shown\&. The contents of the two +files are not sorted together, i\&.e\&. all the entries in the first file +are shown first\&. The special value \fB+\fP can appear in the list to +indicate the default file should be read at that point\&. This allows +effects like the following: +.PP +.RS +.nf +\fBzstyle \&':chpwd:*' recent\-dirs\-file \e +~/\&.chpwd\-recent\-dirs\-${TTY##*/} +\fP +.fi +.RE +.PP +Recent directories are read from a file numbered according to +the terminal\&. If there are insufficient entries the list +is supplemented from the default file\&. +.PP +It is possible to use \fBzstyle \-e\fP to make the directory configurable +at run time: +.PP +.RS +.nf +\fBzstyle \-e \&':chpwd:*' recent\-dirs\-file pick\-recent\-dirs\-file +pick\-recent\-dirs\-file() { + if [[ $PWD = ~/text/writing(|/*) ]]; then + reply=(~/\&.chpwd\-recent\-dirs\-writing) + else + reply=(+) + fi +}\fP +.fi +.RE +.PP +In this example, if the current directory is \fB~/text/writing\fP or a +directory under it, then use a special file for saving recent +directories, else use the default\&. +.RE +.TP +\fBrecent\-dirs\-insert\fP +Used by completion\&. If \fBrecent\-dirs\-default\fP is true, then setting +this to \fBtrue\fP causes the actual directory, rather than its index, to +be inserted on the command line; this has the same effect as using +the corresponding index, but makes the history clearer and the line +easier to edit\&. With this setting, if part of an argument was +already typed, normal directory completion rather than recent +directory completion is done; this is because recent directory +completion is expected to be done by cycling through entries menu +fashion\&. +.RS +.PP +If the value of the style is \fBalways\fP, then only recent directories will +be completed; in that case, use the \fBcd\fP command when you want to +complete other directories\&. +.PP +If the value is \fBfallback\fP, recent directories will be tried first, then +normal directory completion is performed if recent directory completion +failed to find a match\&. +.PP +Finally, if the value is \fBboth\fP then both sets of completions are +presented; the usual tag mechanism can be used to distinguish results, with +recent directories tagged as \fBrecent\-dirs\fP\&. Note that the recent +directories inserted are abbreviated with directory names where appropriate\&. +.RE +.TP +\fBrecent\-dirs\-max\fP +The maximum number of directories to save to the file\&. If +this is zero or negative there is no maximum\&. The default is 20\&. +Note this includes the current directory, which isn\&'t offered, +so the highest number of directories you will be offered +is one less than the maximum\&. +.TP +\fBrecent\-dirs\-prune\fP +This style is an array determining what directories should (or should +not) be added to the recent list\&. Elements of the array can include: +.RS +.PP +.PD 0 +.TP +.PD +\fBparent\fP +Prune parents (more accurately, ancestors) from the recent list\&. +If present, changing directly down by any number of directories +causes the current directory to be overwritten\&. For example, +changing from ~pws to ~pws/some/other/dir causes ~pws not to be +left on the recent directory stack\&. This only applies to direct +changes to descendant directories; earlier directories on the +list are not pruned\&. For example, changing from ~pws/yet/another +to ~pws/some/other/dir does not cause ~pws to be pruned\&. +.TP +\fBpattern:\fP\fIpattern\fP +Gives a zsh pattern for directories that should not be +added to the recent list (if not already there)\&. This element +can be repeated to add different patterns\&. For example, +\fB\&'pattern:/tmp(|/*)'\fP stops \fB/tmp\fP or its descendants +from being added\&. The \fBEXTENDED_GLOB\fP option is always turned on +for these patterns\&. +.RE +.TP +\fBrecent\-dirs\-pushd\fP +If set to true, \fBcdr\fP will use \fBpushd\fP instead of \fBcd\fP to change the +directory, so the directory is saved on the directory stack\&. As the +directory stack is completely separate from the list of files saved +by the mechanism used in this file there is no obvious reason to do +this\&. +.PP +.SS "Use with dynamic directory naming" +.PP +It is possible to refer to recent directories using the dynamic directory +name syntax by using the supplied function \fBzsh_directory_name_cdr\fP +a hook: +.PP +.RS +.nf +\fBautoload \-Uz add\-zsh\-hook +add\-zsh\-hook \-Uz zsh_directory_name zsh_directory_name_cdr\fP +.fi +.RE +.PP +When this is done, \fB~[1]\fP will refer to the most recent +directory other than $PWD, and so on\&. Completion after \fB~[\fP\fI\&.\&.\&.\fP +also works\&. +.PP +.SS "Details of directory handling" +.PP +This section is for the curious or confused; most users will not +need to know this information\&. +.PP +Recent directories are saved to a file immediately and hence are +preserved across sessions\&. Note currently no file locking is applied: +the list is updated immediately on interactive commands and nowhere else +(unlike history), and it is assumed you are only going to change +directory in one window at once\&. This is not safe on shared accounts, +but in any case the system has limited utility when someone else is +changing to a different set of directories behind your back\&. +.PP +To make this a little safer, only directory changes instituted from the +command line, either directly or indirectly through shell function calls +(but not through subshells, evals, traps, completion functions and the +like) are saved\&. Shell functions should use \fBcd \-q\fP or \fBpushd \-q\fP to +avoid side effects if the change to the directory is to be invisible at the +command line\&. See the contents of the function \fBchpwd_recent_dirs\fP for +more details\&. +.PP +.SH "ABBREVIATED DYNAMIC REFERENCES TO DIRECTORIES" +.PP +The dynamic directory naming system is described in the subsection +\fIDynamic named directories\fP of +the section \fIFilename Expansion\fP in \fIzshexpn\fP(1)\&. In this, a reference to +\fB~[\fP\fI\&.\&.\&.\fP\fB]\fP is expanded by a function found by the hooks +mechanism\&. +.PP +The contributed function \fBzsh_directory_name_generic\fP provides a +system allowing the user to refer to directories with only a limited +amount of new code\&. It supports all three of the standard interfaces +for directory naming: converting from a name to a directory, converting +in the reverse direction to find a short name, and completion of names\&. +.PP +The main feature of this function is a path\-like syntax, +combining abbreviations at multiple levels separated by ":"\&. +As an example, ~[g:p:s] might specify: +.PD 0 +.TP +.PD +\fBg\fP +The top level directory for your git area\&. This first component +has to match, or the function will return indicating another +directory name hook function should be tried\&. +.TP +\fBp\fP +The name of a project within your git area\&. +.TP +\fBs\fP +The source area within that project\&. +This allows you to collapse references to long hierarchies to a very +compact form, particularly if the hierarchies are similar across different +areas of the disk\&. +.PP +Name components may be completed: if a description is shown at the top +of the list of completions, it includes the path to which previous +components expand, while the description for an individual completion +shows the path segment it would add\&. No additional configuration is +needed for this as the completion system is aware of the dynamic +directory name mechanism\&. +.PP +.SS "Usage" +.PP +To use the function, first define a wrapper function for your specific +case\&. We\&'ll assume it's to be autoloaded\&. This can have any name but +we\&'ll refer to it as zdn_mywrapper\&. This wrapper function will define +various variables and then call this function with the same arguments +that the wrapper function gets\&. This configuration is described below\&. +.PP +Then arrange for the wrapper to be run as a zsh_directory_name hook: +.PP +.RS +.nf +\fBautoload \-Uz add\-zsh\-hook zsh_directory_name_generic zdn_mywrapper +add\-zsh\-hook \-U zsh_directory_name zdn_mywrapper\fP +.fi +.RE +.PP +.SS "Configuration" +.PP +The wrapper function should define a local associative array zdn_top\&. +Alternatively, this can be set with a style called \fBmapping\fP\&. The +context for the style is \fB:zdn:\fP\fIwrapper\-name\fP where +\fIwrapper\-name\fP is the function calling zsh_directory_name_generic; +for example: +.PP +.RS +.nf +\fBzstyle :zdn:zdn_mywrapper: mapping zdn_mywrapper_top\fP +.fi +.RE +.PP +The keys in this associative array correspond to the first component of +the name\&. The values are matching directories\&. They may have an +optional suffix with a slash followed by a colon and the name of a +variable in the same format to give the next component\&. (The slash +before the colon is to disambiguate the case where a colon is needed in +the path for a drive\&. There is otherwise no syntax for escaping this, +so path components whose names start with a colon are not supported\&.) A +special component \fB:default:\fP specifies a variable in the form +\fB/:\fP\fIvar\fP (the path section is ignored and so is usually empty) +that will be used for the next component if no variable is given for the +path\&. Variables referred to within \fBzdn_top\fP have the same format as +\fBzdn_top\fP itself, but contain relative paths\&. +.PP +For example, +.PP +.RS +.nf +\fBlocal \-A zdn_top=( + g ~/git + ga ~/alternate/git + gs /scratch/$USER/git/:second2 + :default: /:second1 +)\fP +.fi +.RE +.PP +This specifies the behaviour of a directory referred to as \fB~[g:\&.\&.\&.]\fP +or \fB~[ga:\&.\&.\&.]\fP or \fB~[gs:\&.\&.\&.]\fP\&. Later path components are optional; +in that case \fB~[g]\fP expands to \fB~/git\fP, and so on\&. \fBgs\fP expands +to \fB/scratch/$USER/git\fP and uses the associative array \fBsecond2\fP to +match the second component; \fBg\fP and \fBga\fP use the associative array +\fBsecond1\fP to match the second component\&. +.PP +When expanding a name to a directory, if the first component is not \fBg\fP or +\fBga\fP or \fBgs\fP, it is not an error; the function simply returns 1 so that a +later hook function can be tried\&. However, matching the first component +commits the function, so if a later component does not match, an error +is printed (though this still does not stop later hooks from being +executed)\&. +.PP +For components after the first, a relative path is expected, but note that +multiple levels may still appear\&. Here is an example of \fBsecond1\fP: +.PP +.RS +.nf +\fBlocal \-A second1=( + p myproject + s somproject + os otherproject/subproject/:third +)\fP +.fi +.RE +.PP +The path as found from \fBzdn_top\fP is extended with the matching +directory, so \fB~[g:p]\fP becomes \fB~/git/myproject\fP\&. The slash between +is added automatically (it\&'s not possible to have a later component +modify the name of a directory already matched)\&. Only \fBos\fP specifies +a variable for a third component, and there\&'s no \fB:default:\fP, so it's +an error to use a name like \fB~[g:p:x]\fP or \fB~[ga:s:y]\fP because +there\&'s nowhere to look up the \fBx\fP or \fBy\fP\&. +.PP +The associative arrays need to be visible within this function; the +generic function therefore uses internal variable names beginning +\fB_zdn_\fP in order to avoid clashes\&. Note that the variable \fBreply\fP +needs to be passed back to the shell, so should not be local in the +calling function\&. +.PP +The function does not test whether directories assembled by component +actually exist; this allows the system to work across automounted +file systems\&. The error from the command trying to use a non\-existent +directory should be sufficient to indicate the problem\&. +.PP +.SS "Complete example" +.PP +Here is a full fictitious but usable autoloadable definition of the +example function defined by the code above\&. So \fB~[gs:p:s]\fP expands +to \fB/scratch/$USER/git/myscratchproject/top/srcdir\fP (with \fB$USER\fP +also expanded)\&. +.PP +.RS +.nf +\fBlocal \-A zdn_top=( + g ~/git + ga ~/alternate/git + gs /scratch/$USER/git/:second2 + :default: /:second1 +) + +local \-A second1=( + p myproject + s somproject + os otherproject/subproject/:third +) + +local \-A second2=( + p myscratchproject + s somescratchproject +) + +local \-A third=( + s top/srcdir + d top/documentation +) + +# autoload not needed if you did this at initialisation\&.\&.\&. +autoload \-Uz zsh_directory_name_generic +zsh_directory_name_generic "$@\fP +.fi +.RE +.PP +It is also possible to use global associative arrays, suitably named, +and set the style for the context of your wrapper function to +refer to this\&. Then your set up code would contain the following: +.PP +.RS +.nf +\fBtypeset \-A zdn_mywrapper_top=(\&.\&.\&.) +# \&.\&.\&. and so on for other associative arrays \&.\&.\&. +zstyle \&':zdn:zdn_mywrapper:' mapping zdn_mywrapper_top +autoload \-Uz add\-zsh\-hook zsh_directory_name_generic zdn_mywrapper +add\-zsh\-hook \-U zsh_directory_name zdn_mywrapper\fP +.fi +.RE +.PP +and the function \fBzdn_mywrapper\fP would contain only the following: +.PP +.RS +.nf +\fBzsh_directory_name_generic "$@"\fP +.fi +.RE +.PP +.SH "GATHERING INFORMATION FROM VERSION CONTROL SYSTEMS" +.PP +In a lot of cases, it is nice to automatically retrieve information from +version control systems (VCSs), such as subversion, CVS or git, to be able +to provide it to the user; possibly in the user\&'s prompt\&. So that you can +instantly tell which branch you are currently on, for example\&. +.PP +In order to do that, you may use the \fBvcs_info\fP function\&. +.PP +The following VCSs are supported, showing the abbreviated name by which +they are referred to within the system: +.PD 0 +.TP +Bazaar (\fBbzr\fP) +\fBhttps://bazaar\&.canonical\&.com/\fP +.TP +Codeville (\fBcdv\fP) +\fBhttp://freecode\&.com/projects/codeville/\fP +.TP +Concurrent Versioning System (\fBcvs\fP) +\fBhttps://www\&.nongnu\&.org/cvs/\fP +.TP +Darcs (\fBdarcs\fP) +\fBhttp://darcs\&.net/\fP +.TP +Fossil (\fBfossil\fP) +\fBhttps://fossil\-scm\&.org/\fP +.TP +Git (\fBgit\fP) +\fBhttps://git\-scm\&.com/\fP +.TP +GNU arch (\fBtla\fP) +\fBhttps://www\&.gnu\&.org/software/gnu\-arch/\fP +.TP +Mercurial (\fBhg\fP) +\fBhttps://www\&.mercurial\-scm\&.org/\fP +.TP +Monotone (\fBmtn\fP) +\fBhttps://monotone\&.ca/\fP +.TP +Perforce (\fBp4\fP) +\fBhttps://www\&.perforce\&.com/\fP +.TP +Subversion (\fBsvn\fP) +\fBhttps://subversion\&.apache\&.org/\fP +.TP +SVK (\fBsvk\fP) +\fBhttps://svk\&.bestpractical\&.com/\fP +.PD +.PP +There is also support for the patch management system \fBquilt\fP +(\fBhttps://savannah\&.nongnu\&.org/projects/quilt\fP)\&. See +\fBQuilt Support\fP +below for details\&. +.PP +To load \fBvcs_info\fP: +.PP +.RS +.nf +\fBautoload \-Uz vcs_info\fP +.fi +.RE +.PP +It can be used in any existing prompt, because it does not require any +specific \fB$psvar\fP entries to be available\&. +.PP +.PP +.SS "Quickstart" +.PP +To get this feature working quickly (including colors), you can do the +following (assuming, you loaded \fBvcs_info\fP properly \- see above): +.PP +.RS +.nf +\fBzstyle \&':vcs_info:*' actionformats \e + \&'%F{5}(%f%s%F{5})%F{3}\-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f ' +zstyle \&':vcs_info:*' formats \e + \&'%F{5}(%f%s%F{5})%F{3}\-%F{5}[%F{2}%b%F{5}]%f ' +zstyle \&':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r' +precmd () { vcs_info } +PS1=\&'%F{5}[%F{2}%n%F{5}] %F{3}%3~ ${vcs_info_msg_0_}%f%# '\fP +.fi +.RE +.PP +Obviously, the last two lines are there for demonstration\&. You need to +call \fBvcs_info\fP from your \fBprecmd\fP function\&. Once that is done you need +a \fIsingle quoted\fP \fB\&'${vcs_info_msg_0_}'\fP in your prompt\&. +.PP +To be able to use \fB\&'${vcs_info_msg_0_}'\fP directly in your prompt like +this, you will need to have the \fBPROMPT_SUBST\fP option enabled\&. +.PP +Now call the \fBvcs_info_printsys\fP utility from the command line: +.PP +.RS +.nf +\fB% vcs_info_printsys +## list of supported version control backends: +## disabled systems are prefixed by a hash sign (#) +bzr +cdv +cvs +darcs +fossil +git +hg +mtn +p4 +svk +svn +tla +## flavours (cannot be used in the enable or disable styles; they +## are enabled and disabled with their master [git\-svn \-> git]) +## they *can* be used in contexts: \&':vcs_info:git\-svn:*'\&. +git\-p4 +git\-svn +hg\-git +hg\-hgsubversion +hg\-hgsvn\fP +.fi +.RE +.PP +You may not want all of these because there is no point in running the +code to detect systems you do not use\&. So there is a way to disable +some backends altogether: +.PP +.RS +.nf +\fBzstyle \&':vcs_info:*' disable bzr cdv darcs mtn svk tla\fP +.fi +.RE +.PP +You may also pick a few from that list and enable only those: +.PP +.RS +.nf +\fBzstyle \&':vcs_info:*' enable git cvs svn\fP +.fi +.RE +.PP +If you rerun \fBvcs_info_printsys\fP after one of these commands, you will +see the backends listed in the \fBdisable\fP style (or backends not in the +\fBenable\fP style \- if you used that) marked as disabled by a hash sign\&. +That means the detection of these systems is skipped \fIcompletely\fP\&. No +wasted time there\&. +.PP +.SS "Configuration" +.PP +The \fBvcs_info\fP feature can be configured via \fBzstyle\fP\&. +.PP +First, the context in which we are working: +.RS +.nf +\fB:vcs_info:\fIvcs\-string\fP:\fIuser\-context\fP:\fIrepo\-root\-name\fP\fP +.fi +.RE +.PP +.PD 0 +.TP +.PD +\fIvcs\-string\fP +is one of: \fBgit\fP, \fBgit\-svn\fP, \fBgit\-p4\fP, \fBhg\fP, \fBhg\-git\fP, +\fBhg\-hgsubversion\fP, \fBhg\-hgsvn\fP, \fBdarcs\fP, \fBbzr\fP, \fBcdv\fP, \fBmtn\fP, +\fBsvn\fP, \fBcvs\fP, \fBsvk\fP, \fBtla\fP, \fBp4\fP or \fBfossil\fP\&. +This is followed by `\fB\&.quilt\-\fP\fIquilt\-mode\fP\&' in Quilt mode +(see \fBQuilt Support\fP for details) +and by `\fB+\fP\fIhook\-name\fP\&' while hooks are active +(see \fBHooks in vcs_info\fP for details)\&. +.RS +.PP + +Currently, hooks in quilt mode don\&'t add the `\fB\&.quilt\-\fP\fIquilt\-mode\fP' information\&. +This may change in the future\&. +.RE +.TP +\fIuser\-context\fP +is a freely configurable string, assignable by +the user as the first argument to \fBvcs_info\fP (see its description +below)\&. +.TP +\fIrepo\-root\-name\fP +is the name of a repository in which you want a +style to match\&. So, if you want a setting specific to \fB/usr/src/zsh\fP, +with that being a CVS checkout, you can set \fIrepo\-root\-name\fP to +\fBzsh\fP to make it so\&. +.PP +There are three special values for \fIvcs\-string\fP: The first is named +\fB\-init\-\fP, that is in effect as long as there was no decision what VCS +backend to use\&. The second is \fB\-preinit\-\fP; it is used \fIbefore\fP +\fBvcs_info\fP is run, when initializing the data exporting variables\&. The +third special value is \fBformats\fP and is used by the \fBvcs_info_lastmsg\fP +for looking up its styles\&. +.PP +The initial value of \fIrepo\-root\-name\fP is \fB\-all\-\fP and it is replaced +with the actual name, as soon as it is known\&. Only use this part of the +context for defining the \fBformats\fP, \fBactionformats\fP or +\fBbranchformat\fP styles, as it is guaranteed that \fIrepo\-root\-name\fP is +set up correctly for these only\&. For all other styles, just use \fB\&'*'\fP +instead\&. +.PP +There are two pre\-defined values for \fIuser\-context\fP: +.PD 0 +.TP +\fBdefault\fP +the one used if none is specified +.TP +\fBcommand\fP +used by vcs_info_lastmsg to lookup its styles +.PD +.PP +You can of course use \fB\&':vcs_info:*'\fP to match all VCSs in all +user\-contexts at once\&. +.PP +This is a description of all styles that are looked up\&. +.PP +.PD 0 +.TP +.PD +\fBformats\fP +A list of formats, used when actionformats is not used +(which is most of the time)\&. +.TP +\fBactionformats\fP +A list of formats, used if there is a special +action going on in your current repository; like an interactive rebase or +a merge conflict\&. +.TP +\fBbranchformat\fP +Some backends replace \fB%b\fP in the formats and +actionformats styles above, not only by a branch name but also by a +revision number\&. This style lets you modify how that string should look\&. +.TP +\fBnvcsformats\fP +These "formats" are set when we didn\&'t detect a version control system +for the current directory or \fBvcs_info\fP was disabled\&. This is useful if +you want \fBvcs_info\fP to completely take over the generation of your +prompt\&. You would do something like \fBPS1=\&'${vcs_info_msg_0_}'\fP to +accomplish that\&. +.TP +\fBhgrevformat\fP +\fBhg\fP uses both a hash and a revision number to reference a specific +changeset in a repository\&. With this style you can format the revision +string (see \fBbranchformat\fP) to include either or both\&. It\&'s only +useful when \fBget\-revision\fP is true\&. Note, the full 40\-character revision id +is not available (except when using the \fBuse\-simple\fP option) because +executing hg more than once per prompt is too slow; you may customize this +behavior using hooks\&. +.TP +\fBmax\-exports\fP +Defines the maximum number of +\fBvcs_info_msg_*_\fP variables \fBvcs_info\fP will set\&. +.TP +\fBenable\fP +A list of backends you want to use\&. Checked in the \fB\-init\-\fP context\&. If +this list contains an item called \fBNONE\fP no backend is used at all and +\fBvcs_info\fP will do nothing\&. If this list contains \fBALL\fP, \fBvcs_info\fP +will use all known backends\&. Only with \fBALL\fP in \fBenable\fP will the +\fBdisable\fP style have any effect\&. \fBALL\fP and \fBNONE\fP are case insensitive\&. +.TP +\fBdisable\fP +A list of VCSs you don\&'t want \fBvcs_info\fP to test for +repositories (checked in the \fB\-init\-\fP context, too)\&. Only used if +\fBenable\fP contains \fBALL\fP\&. +.TP +\fBdisable\-patterns\fP +A list of patterns that are checked against \fB$PWD\fP\&. If a pattern +matches, \fBvcs_info\fP will be disabled\&. This style is checked in the +\fB:vcs_info:\-init\-:*:\-all\-\fP context\&. +.RS +.PP +Say, \fB~/\&.zsh\fP is a directory under version control, in which you do +not want \fBvcs_info\fP to be active, do: +.RS +.nf +\fBzstyle \&':vcs_info:*' disable\-patterns "${(b)HOME}/\&.zsh(|/*)"\fP +.fi +.RE +.RE +.TP +\fBuse\-quilt\fP +If enabled, the \fBquilt\fP support code is active in `addon\&' mode\&. +See \fBQuilt Support\fP for details\&. +.TP +\fBquilt\-standalone\fP +If enabled, `standalone\&' mode detection is attempted if no VCS is active +in a given directory\&. See \fBQuilt Support\fP for details\&. +.TP +\fBquilt\-patch\-dir\fP +Overwrite the value of the \fB$QUILT_PATCHES\fP environment variable\&. See +\fBQuilt Support\fP for details\&. +.TP +\fBquiltcommand\fP +When \fBquilt\fP itself is called in quilt support, the value of this style +is used as the command name\&. +.TP +\fBcheck\-for\-changes\fP +If enabled, this style causes the \fB%c\fP and \fB%u\fP format escapes to show +when the working directory has uncommitted changes\&. The strings displayed by +these escapes can be controlled via the \fBstagedstr\fP and \fBunstagedstr\fP +styles\&. The only backends that currently support this option are \fBgit\fP, +\fBhg\fP, and \fBbzr\fP (the latter two only support unstaged)\&. +.RS +.PP +For this style to be evaluated with the \fBhg\fP backend, the \fBget\-revision\fP +style needs to be set and the \fBuse\-simple\fP style needs to be unset\&. The +latter is the default; the former is not\&. +.PP +With the \fBbzr\fP backend, \fIlightweight checkouts\fP only honor this style if +the \fBuse\-server\fP style is set\&. +.PP +Note, the actions taken if this style is enabled are potentially expensive +(read: they may be slow, depending on how big the current repository is)\&. +Therefore, it is disabled by default\&. +.RE +.TP +\fBcheck\-for\-staged\-changes\fP +This style is like \fBcheck\-for\-changes\fP, but it never checks the worktree +files, only the metadata in the \fB\&.${vcs}\fP dir\&. Therefore, +this style initializes only the \fB%c\fP escape (with \fBstagedstr\fP) but +not the \fB%u\fP escape\&. This style is faster than \fBcheck\-for\-changes\fP\&. +.RS +.PP +In the \fBgit\fP backend, this style checks for changes in the index\&. +Other backends do not currently implement this style\&. +.PP +This style is disabled by default\&. +.RE +.TP +\fBstagedstr\fP +This string will be used in the \fB%c\fP escape if there are staged changes in +the repository\&. +.TP +\fBunstagedstr\fP +This string will be used in the \fB%u\fP escape if there are unstaged changes +in the repository\&. +.TP +\fBcommand\fP +This style causes \fBvcs_info\fP to use the supplied string as the command +to use as the VCS\&'s binary\&. Note, that setting this in '\fB:vcs_info:*\fP' is +not a good idea\&. +.RS +.PP +If the value of this style is empty (which is the default), the used binary +name is the name of the backend in use (e\&.g\&. \fBsvn\fP is used in an \fBsvn\fP +repository)\&. +.PP +The \fBrepo\-root\-name\fP part in the context is always the default \fB\-all\-\fP +when this style is looked up\&. +.PP +For example, this style can be used to use binaries from non\-default +installation directories\&. Assume, \fBgit\fP is installed in /usr/bin but +your sysadmin installed a newer version in /usr/local/bin\&. Instead of +changing the order of your \fB$PATH\fP parameter, you can do this: +.RS +.nf +\fBzstyle \&':vcs_info:git:*:\-all\-' command /usr/local/bin/git\fP +.fi +.RE +.RE +.TP +\fBuse\-server\fP +This is used by the Perforce backend (\fBp4\fP) to decide if it should +contact the Perforce server to find out if a directory is managed +by Perforce\&. This is the only reliable way of doing this, but runs +the risk of a delay if the server name cannot be found\&. If the +server (more specifically, the \fIhost\fP\fB:\fP\fIport\fP pair describing the +server) cannot be contacted, its name is put into the associative array +\fBvcs_info_p4_dead_servers\fP and is not contacted again during the session +until it is removed by hand\&. If you do not set this style, the \fBp4\fP +backend is only usable if you have set the environment variable +\fBP4CONFIG\fP to a file name and have corresponding files in the root +directories of each Perforce client\&. See comments in the function +\fBVCS_INFO_detect_p4\fP for more detail\&. +.RS +.PP +The Bazaar backend (\fBbzr\fP) uses this to permit contacting the server +about lightweight checkouts, see the \fBcheck\-for\-changes\fP style\&. +.RE +.TP +\fBuse\-simple\fP +If there are two different ways of gathering +information, you can select the simpler one by setting this style to true; +the default is to use the not\-that\-simple code, which is potentially a lot +slower but might be more accurate in all possible cases\&. This style is +used by the \fBbzr\fP, \fBhg\fP, and \fBgit\fP backends\&. In the case of \fBhg\fP it will invoke +the external hexdump program to parse the binary dirstate cache file; this +method will not return the local revision number\&. +.TP +\fBget\-revision\fP +If set to true, vcs_info goes the extra mile to figure out the revision of +a repository\&'s work tree (currently for the \fBgit\fP and \fBhg\fP backends, +where this kind of information is not always vital)\&. For \fBgit\fP, the +hash value of the currently checked out commit is available via the \fB%i\fP +expansion\&. With \fBhg\fP, the local revision number and the corresponding +global hash are available via \fB%i\fP\&. +.TP +\fBget\-mq\fP +If set to true, the \fBhg\fP backend will look for a Mercurial Queue (\fBmq\fP) +patch directory\&. Information will be available via the `\fB%m\fP\&' replacement\&. +.TP +\fBget\-bookmarks\fP +If set to true, the \fBhg\fP backend will try to get a list of current +bookmarks\&. They will be available via the `\fB%m\fP\&' replacement\&. +.RS +.PP +The default is to generate a comma\-separated list of all bookmark names +that refer to the currently checked out revision\&. If a bookmark is active, +its name is suffixed an asterisk and placed first in the list\&. +.RE +.TP +\fBuse\-prompt\-escapes\fP +Determines if we assume that the assembled +string from \fBvcs_info\fP includes prompt escapes\&. (Used by +\fBvcs_info_lastmsg\fP\&.) +.TP +\fBdebug\fP +Enable debugging output to track possible problems\&. Currently this style +is only used by \fBvcs_info\fP\&'s hooks system\&. +.TP +\fBhooks\fP +A list style that defines hook\-function names\&. See \fBHooks in vcs_info\fP +below for details\&. +.TP +.PD 0 +\fBpatch\-format\fP +.TP +.PD +\fBnopatch\-format\fP +This pair of styles format the patch information used by the \fB%m\fP expando in +formats and actionformats for the \fBgit\fP and \fBhg\fP backends\&. The value is +subject to certain \fB%\fP\-expansions described below\&. +The expanded value is made available in the global \fBbackend_misc\fP array as +\fB${backend_misc[patches]}\fP (also if a \fBset\-patch\-format\fP hook is used)\&. +.TP +\fBget\-unapplied\fP +This boolean style controls whether a backend should attempt to gather a list +of unapplied patches (for example with Mercurial Queue patches)\&. +.RS +.PP +Used by the \fBquilt\fP, \fBhg\fP, and \fBgit\fP backends\&. +.RE +.PP +The default values for these styles in all contexts are: +.PP +.PD 0 +.TP +\fBformats\fP +" (%s)\-[%b]%u%c\-" +.TP +\fBactionformats\fP +" (%s)\-[%b|%a]%u%c\-" +.TP +\fBbranchformat\fP +"%b:%r" (for bzr, svn, svk and hg) +.TP +\fBnvcsformats\fP +"" +.TP +\fBhgrevformat\fP +"%r:%h" +.TP +\fBmax\-exports\fP +2 +.TP +\fBenable\fP +ALL +.TP +\fBdisable\fP +(empty list) +.TP +\fBdisable\-patterns\fP +(empty list) +.TP +\fBcheck\-for\-changes\fP +false +.TP +\fBcheck\-for\-staged\-changes\fP +false +.TP +\fBstagedstr\fP +(string: "S") +.TP +\fBunstagedstr\fP +(string: "U") +.TP +\fBcommand\fP +(empty string) +.TP +\fBuse\-server\fP +false +.TP +\fBuse\-simple\fP +false +.TP +\fBget\-revision\fP +false +.TP +\fBget\-mq\fP +true +.TP +\fBget\-bookmarks\fP +false +.TP +\fBuse\-prompt\-escapes\fP +true +.TP +\fBdebug\fP +false +.TP +\fBhooks\fP +(empty list) +.TP +\fBuse\-quilt\fP +false +.TP +\fBquilt\-standalone\fP +false +.TP +\fBquilt\-patch\-dir\fP +empty \- use \fB$QUILT_PATCHES\fP +.TP +\fBquiltcommand\fP +quilt +.TP +\fBpatch\-format\fP +\fIbackend dependent\fP +.TP +\fBnopatch\-format\fP +\fIbackend dependent\fP +.TP +\fBget\-unapplied\fP +false +.PD +.PP +In normal \fBformats\fP and \fBactionformats\fP the following replacements are +done: +.PP +.PD 0 +.TP +\fB%s\fP +The VCS in use (git, hg, svn, etc\&.)\&. +.TP +\fB%b\fP +Information about the current branch\&. +.TP +\fB%a\fP +An identifier that describes the action\&. Only makes sense in +\fBactionformats\fP\&. +.TP +\fB%i\fP +The current revision number or identifier\&. For \fBhg\fP +the \fBhgrevformat\fP style may be used to customize the output\&. +.TP +\fB%c\fP +The string from the \fBstagedstr\fP style if there are staged +changes in the repository\&. +.TP +\fB%u\fP +The string from the \fBunstagedstr\fP style if there are +unstaged changes in the repository\&. +.TP +\fB%R\fP +The base directory of the repository\&. +.TP +\fB%r\fP +The repository name\&. If \fB%R\fP is \fB/foo/bar/repoXY\fP, \fB%r\fP +is \fBrepoXY\fP\&. +.TP +\fB%S\fP +A subdirectory within a repository\&. If \fB$PWD\fP is +\fB/foo/bar/repoXY/beer/tasty\fP, \fB%S\fP is \fBbeer/tasty\fP\&. +.PD +.PD 0 +.TP +.PD +\fB%m\fP +A "misc" replacement\&. It is at the discretion of the backend to +decide what this replacement expands to\&. +.RS +.PP +The \fBhg\fP and \fBgit\fP backends use this expando to display patch information\&. +\fBhg\fP sources patch information from the \fBmq\fP extensions; \fBgit\fP from in\-progress +\fBrebase\fP and \fBcherry\-pick\fP operations and from the \fBstgit\fP extension\&. The \fBpatch\-format\fP +and \fBnopatch\-format\fP styles control the generated string\&. The former is used +when at least one patch from the patch queue has been applied, and the latter +otherwise\&. +.PP +The \fBhg\fP backend displays bookmark information in this expando (in addition +to \fBmq\fP information)\&. See the \fBget\-mq\fP and \fBget\-bookmarks\fP styles\&. Both +of these styles may be enabled at the same time\&. If both are enabled, both +resulting strings will be shown separated by a semicolon (that cannot currently +be customized)\&. +.PP +The \fBquilt\fP `standalone\&' backend sets this expando to the same value as the +\fB%Q\fP expando\&. +.RE +.TP +\fB%Q\fP +Quilt series information\&. +When quilt is used (either in `addon\&' mode or as a `standalone' backend), +this expando is set to the quilt series\&' \fBpatch\-format\fP string\&. +The \fBset\-patch\-format\fP hook and \fBnopatch\-format\fP style are honoured\&. +.RS +.PP +See \fBQuilt Support\fP below for details\&. +.RE +.PP +In \fBbranchformat\fP these replacements are done: +.PP +.PD 0 +.TP +\fB%b\fP +The branch name\&. For \fBhg\fP, the branch name can include a +topic name\&. +.TP +\fB%r\fP +The current revision number or the \fBhgrevformat\fP style for +\fBhg\fP\&. +.PD +.PP +In \fBhgrevformat\fP these replacements are done: +.PP +.PD 0 +.TP +\fB%r\fP +The current local revision number\&. +.TP +\fB%h\fP +The current global revision identifier\&. +.PD +.PP +In \fBpatch\-format\fP and \fBnopatch\-format\fP these replacements are done: +.PP +.PD 0 +.TP +\fB%p\fP +The name of the top\-most applied patch; may be overridden by the \fBapplied\-string\fP hook\&. +.TP +\fB%u\fP +The number of unapplied patches; may be overridden by the \fBunapplied\-string\fP hook\&. +.TP +\fB%n\fP +The number of applied patches\&. +.TP +\fB%c\fP +The number of unapplied patches\&. +.TP +\fB%a\fP +The number of all patches (\fB%a = %n + %c\fP)\&. +.TP +\fB%g\fP +The names of active \fBmq\fP guards (\fBhg\fP backend)\&. +.TP +\fB%G\fP +The number of active \fBmq\fP guards (\fBhg\fP backend)\&. +.PD +.PP +Not all VCS backends have to support all replacements\&. For \fBnvcsformats\fP +no replacements are performed at all, it is just a string\&. +.PP +.SS "Oddities" +.PP +If you want to use the \fB%b\fP (bold off) prompt expansion in \fBformats\fP, +which expands \fB%b\fP itself, use \fB%%b\fP\&. That will cause the \fBvcs_info\fP +expansion to replace \fB%%b\fP with \fB%b\fP, so that zsh\&'s prompt expansion +mechanism can handle it\&. Similarly, to hand down \fB%b\fP from +\fBbranchformat\fP, use \fB%%%%b\fP\&. Sorry for this inconvenience, but it +cannot be easily avoided\&. Luckily we do not clash with a lot of prompt +expansions and this only needs to be done for those\&. +.PP +When one of the \fBgen\-applied\-string\fP, \fBgen\-unapplied\-string\fP, and +\fBset\-patch\-format\fP hooks is defined, +applying \fB%\fP\-escaping (`\fBfoo=${foo//\&'%'/%%}\fP') to the interpolated values +for use in the prompt is the responsibility of those hooks (jointly); +when neither of those hooks is defined, \fBvcs_info\fP handles escaping by itself\&. +We regret this coupling, but it was required for backwards compatibility\&. +.PP +.SS "Quilt Support" +.PP +\fBQuilt\fP is not a version control system, therefore this is not implemented +as a backend\&. It can help keeping track of a series of patches\&. People use it +to keep a set of changes they want to use on top of software packages (which +is tightly integrated into the package build process \- the Debian project +does this for a large number of packages)\&. Quilt can also help individual +developers keep track of their own patches on top of real version control +systems\&. +.PP +The \fBvcs_info\fP integration tries to support both ways of using quilt by +having two slightly different modes of operation: `addon\&' mode and +`standalone\&' mode)\&. +.PP +Quilt integration is off by default; to enable it, set the \fBuse\-quilt\fP style, +and add \fB%Q\fP to your \fBformats\fP or \fBactionformats\fP style: +.RS +.nf +\fBzstyle \&':vcs_info:*' use\-quilt true\fP +.fi +.RE +.PP +Styles looked up from the Quilt support code include `\fB\&.quilt\-\fP\fIquilt\-mode\fP\&' +in the \fIvcs\-string\fP part of the context, where \fIquilt\-mode\fP is either +\fBaddon\fP or \fBstandalone\fP\&. +Example: \fB:vcs_info:git\&.quilt\-addon:default:\fP\fIrepo\-root\-name\fP\&. +.PP +For `addon\&' mode to become active \fBvcs_info\fP must have already detected a +real version control system controlling the directory\&. If that is the case, +a directory that holds quilt\&'s patches needs to be found\&. That directory is +configurable via the `\fBQUILT_PATCHES\fP\&' environment variable\&. If that +variable exists its value is used, otherwise the value `\fBpatches\fP\&' is +assumed\&. The value from \fB$QUILT_PATCHES\fP can be overwritten using the +`\fBquilt\-patch\-dir\fP\&' style\&. (Note: you can use \fBvcs_info\fP to keep the value +of \fB$QUILT_PATCHES\fP correct all the time via the \fBpost\-quilt\fP hook)\&. +.PP +When the directory in question is found, quilt is assumed to be active\&. To +gather more information, \fBvcs_info\fP looks for a directory called `\&.pc\&'; +Quilt uses that directory to track its current state\&. If this directory does +not exist we know that quilt has not done anything to the working directory +(read: no patches have been applied yet)\&. +.PP +If patches are applied, \fBvcs_info\fP will try to find out which\&. If you want +to know which patches of a series are not yet applied, you need to activate +the \fBget\-unapplied\fP style in the appropriate context\&. +.PP +\fBvcs_info\fP allows for very detailed control over how the gathered +information is presented (see +the \fBConfiguration\fP and \fBHooks in vcs_info\fP sections), +all of which are documented below\&. Note there are a number of +other patch tracking systems that work on top of a certain version control +system (like \fBstgit\fP for \fBgit\fP, or \fBmq\fP for \fBhg\fP); the configuration +for systems like that are generally configured the same way as the \fBquilt\fP +support\&. +.PP +If the \fBquilt\fP support is working in `addon\&' mode, the produced string is +available as a simple format replacement (\fB%Q\fP to be precise), which can +be used in \fBformats\fP and \fBactionformats\fP; see below for details)\&. +.PP +If, on the other hand, the support code is working in `standalone\&' mode, +\fBvcs_info\fP will pretend as if \fBquilt\fP were an actual version control +system\&. That means that the version control system identifier (which +otherwise would be something like `svn\&' or `cvs') will be set to +`\fB\-quilt\-\fP\&'\&. This has implications on the used style context where this +identifier is the second element\&. \fBvcs_info\fP will have filled in a proper +value for the "repository\&'s" root directory and the string containing the +information about quilt\&'s state will be available as the `misc' replacement +(and \fB%Q\fP for compatibility with `addon\&' mode)\&. +.PP +What is left to discuss is how `standalone\&' mode is detected\&. The detection +itself is a series of searches for directories\&. You can have this detection +enabled all the time in every directory that is not otherwise under version +control\&. If you know there is only a limited set of trees where you would +like \fBvcs_info\fP to try and look for Quilt in `standalone\&' mode to minimise +the amount of searching on every call to \fBvcs_info\fP, there are a number of +ways to do that: +.PP +Essentially, `standalone\&' mode detection is controlled by a style called +`\fBquilt\-standalone\fP\&'\&. It is a string style and its value can have different +effects\&. The simplest values are: `\fBalways\fP\&' to run detection every time +\fBvcs_info\fP is run, and `\fBnever\fP\&' to turn the detection off entirely\&. +.PP +If the value of \fBquilt\-standalone\fP is something else, it is interpreted +differently\&. If the value is the name of a scalar variable the value of that +variable is checked and that value is used in the same `always\&'/`never' way +as described above\&. +.PP +If the value of \fBquilt\-standalone\fP is an array, the elements of that array +are used as directory names under which you want the detection to be active\&. +.PP +If \fBquilt\-standalone\fP is an associative array, the keys are taken as +directory names under which you want the detection to be active, but only if +the corresponding value is the string `\fBtrue\fP\&'\&. +.PP +Last, but not least, if the value of \fBquilt\-standalone\fP is the name of a +function, the function is called without arguments and the return value +decides whether detection should be active\&. A `0\&' return value is true; a +non\-zero return value is interpreted as false\&. +.PP +Note, if there is both a function and a variable by the name of +\fBquilt\-standalone\fP, the function will take precedence\&. +.PP +.SS "Function Descriptions (Public API)" +.PP +.PD 0 +.TP +.PD +\fBvcs_info\fP [\fIuser\-context\fP] +The main function, that runs all backends and assembles all data into +\fB${vcs_info_msg_*_}\fP\&. This is the function you want to call from +\fBprecmd\fP if you want to include up\-to\-date information in your prompt (see +\fBVariable Description\fP +below)\&. If an argument is given, that string will be +used instead of \fBdefault\fP in the \fIuser\-context\fP field of the style +context\&. +.TP +\fBvcs_info_hookadd\fP +Statically registers a number of functions to a given hook\&. The hook needs +to be given as the first argument; what follows is a list of hook\-function +names to register to the hook\&. The `\fB+vi\-\fP\&' prefix needs to be left out +here\&. See \fBHooks in vcs_info\fP +below for details\&. +.TP +\fBvcs_info_hookdel\fP +Remove hook\-functions from a given hook\&. The hook needs to be given as the +first non\-option argument; what follows is a list of hook\-function +names to un\-register from the hook\&. If `\fB\-a\fP\&' is used as the first +argument, \fBall\fP occurrences of the functions are unregistered\&. Otherwise +only the last occurrence is removed (if a function was registered to a hook +more than once)\&. The `\fB+vi\-\fP\&' prefix needs to be left out here\&. +See \fBHooks in vcs_info\fP +below for details\&. +.TP +\fBvcs_info_lastmsg\fP +Outputs the current values of \fB${vcs_info_msg_*_}\fP\&. +Takes into account the value of the \fBuse\-prompt\-escapes\fP style in +\fB\&':vcs_info:formats:command:\-all\-'\fP\&. It also only prints \fBmax\-exports\fP +values\&. +.TP +\fBvcs_info_printsys\fP [\fIuser\-context\fP] +Prints a list of all +supported version control systems\&. Useful to find out possible contexts +(and which of them are enabled) or values for the \fBdisable\fP style\&. +.TP +\fBvcs_info_setsys\fP +Initializes \fBvcs_info\fP\&'s internal list of +available backends\&. With this function, you can add support for new VCSs +without restarting the shell\&. +.PP +All functions named \fBVCS_INFO_*\fP are for internal use only\&. +.PP +.SS "Variable Description" +.PP +.PD 0 +.TP +.PD +\fB${vcs_info_msg_\fP\fIN\fP\fB_}\fP (Note the trailing underscore) +Where \fIN\fP is an integer, e\&.g\&., \fBvcs_info_msg_0_\fP\&. These variables +are the storage for the informational message the last \fBvcs_info\fP call +has assembled\&. These are strongly connected to the \fBformats\fP, +\fBactionformats\fP and \fBnvcsformats\fP styles described above\&. Those styles +are lists\&. The first member of that list gets expanded into +\fB${vcs_info_msg_0_}\fP, the second into \fB${vcs_info_msg_1_}\fP +and the Nth into \fB${vcs_info_msg_N\-1_}\fP\&. (See the \fBmax\-exports\fP +style above\&.) +.PP +All variables named \fBVCS_INFO_*\fP are for internal use only\&. +.PP +.SS "Hooks in vcs_info" +.PP +Hooks are places in \fBvcs_info\fP where you can run your own code\&. That +code can communicate with the code that called it and through that, +change the system\&'s behaviour\&. +.PP +For configuration, hooks change the style context: +.RS +.nf +\fB:vcs_info:\fIvcs\-string\fP+\fIhook\-name\fP:\fIuser\-context\fP:\fIrepo\-root\-name\fP\fP +.fi +.RE +.PP +To register functions to a hook, you need to list them in the \fBhooks\fP +style in the appropriate context\&. +.PP +Example: +.RS +.nf +\fBzstyle \&':vcs_info:*+foo:*' hooks bar baz\fP +.fi +.RE +.PP +This registers functions to the hook `foo\&' for all backends\&. In order to +avoid namespace problems, all registered function names are prepended by +a `\fB+vi\-\fP\&', so the actual functions called for the `foo' hook are +`\fB+vi\-bar\fP\&' and `\fB+vi\-baz\fP'\&. +.PP +If you would like to register a function to a hook regardless of the +current context, you may use the \fBvcs_info_hookadd\fP function\&. To remove +a function that was added like that, the \fBvcs_info_hookdel\fP function +can be used\&. +.PP +If something seems weird, you can enable the `debug\&' boolean style in +the proper context and the hook\-calling code will print what it tried +to execute and whether the function in question existed\&. +.PP +When you register more than one function to a hook, all functions are +executed one after another until one function returns non\-zero or until +all functions have been called\&. Context\-sensitive hook functions are +executed \fBbefore\fP statically registered ones (the ones added by +\fBvcs_info_hookadd\fP)\&. +.PP +You may pass data between functions via an associative array, \fBuser_data\fP\&. +For example: +.RS +.nf +\fB ++vi\-git\-myfirsthook(){ + user_data[myval]=$myval +} ++vi\-git\-mysecondhook(){ + # do something with ${user_data[myval]} +}\fP +.fi +.RE +.PP +There are a number of variables that are special in hook contexts: +.PP +.PD 0 +.TP +.PD +\fBret\fP +The return value that the hooks system will return to the caller\&. The +default is an integer `zero\&'\&. If and how a changed \fBret\fP value changes +the execution of the caller depends on the specific hook\&. See the hook +documentation below for details\&. +.TP +\fBhook_com\fP +An associated array which is used for bidirectional communication from +the caller to hook functions\&. The used keys depend on the specific hook\&. +.TP +\fBcontext\fP +The active context of the hook\&. Functions that wish to change this +variable should make it local scope first\&. +.TP +\fBvcs\fP +The current VCS after it was detected\&. The same values as in the +enable/disable style are used\&. Available in all hooks except \fBstart\-up\fP\&. +.PP +Finally, the full list of currently available hooks: +.PP +.PD 0 +.TP +.PD +\fBstart\-up\fP +Called after starting \fBvcs_info\fP but before the VCS in this directory is +determined\&. It can be used to deactivate \fBvcs_info\fP temporarily if +necessary\&. When \fBret\fP is set to \fB1\fP, \fBvcs_info\fP aborts and does +nothing; when set to \fB2\fP, \fBvcs_info\fP sets up everything as if no +version control were active and exits\&. +.TP +\fBpre\-get\-data\fP +Same as \fBstart\-up\fP but after the VCS was detected\&. +.TP +\fBgen\-hg\-bookmark\-string\fP +Called in the Mercurial backend when a bookmark string is generated; the +\fBget\-revision\fP and \fBget\-bookmarks\fP styles must be true\&. +.RS +.PP +This hook gets the names of the Mercurial bookmarks that +\fBvcs_info\fP collected from `hg\&'\&. +.PP +If a bookmark is active, the key \fB${hook_com[hg\-active\-bookmark]}\fP is +set to its name\&. The key is otherwise unset\&. +.PP +When setting \fBret\fP to non\-zero, the string in +\fB${hook_com[hg\-bookmark\-string]}\fP will be used in the \fB%m\fP escape in +\fBformats\fP and \fBactionformats\fP and will be available in the global +\fBbackend_misc\fP array as \fB${backend_misc[bookmarks]}\fP\&. +.RE +.TP +\fBgen\-applied\-string\fP +Called in the \fBgit\fP (with \fBstgit\fP or during rebase or merge), and \fBhg\fP +(with \fBmq\fP) backends and in \fBquilt\fP support when the \fBapplied\-string\fP +is generated; the \fBuse\-quilt\fP zstyle must be true for \fBquilt\fP (the \fBmq\fP +and \fBstgit\fP backends are active by default)\&. +.RS +.PP +The arguments to this hook describe applied patches +in the opposite order, which means that the first argument is the +top\-most patch and so forth\&. +.PP +When the patches\&' log messages can be extracted, those are embedded +within each argument after a space, so each argument is of the form +`\fIpatch\-name\fP \fIfirst line of the log message\fP\&', where \fIpatch\-name\fP +contains no whitespace\&. The \fBmq\fP backend passes arguments of +the form `\fIpatch name\fP\&', with possible embedded spaces, but without +extracting the patch\&'s log message\&. +.PP +When setting \fBret\fP to non\-zero, the string in +\fB${hook_com[applied\-string]}\fP will be +available as \fB%p\fP in the \fBpatch\-format\fP and \fBnopatch\-format\fP styles\&. +This hook is, in concert with \fBset\-patch\-format\fP, responsible for +\fB%\fP\-escaping that value for use in the prompt\&. +(See the \fBOddities\fP section\&.) +.PP +The \fBquilt\fP backend passes to this hook the inputs +\fB${hook_com[quilt\-patches\-dir]}\fP and, if it has been +determined, \fB${hook_com[quilt\-pc\-dir]}\fP\&. +.RE +.TP +\fBgen\-unapplied\-string\fP +Called in the \fBgit\fP (with \fBstgit\fP or during rebase), and \fBhg\fP (with +\fBmq\fP) backend and in \fBquilt\fP support when the \fBunapplied\-string\fP is +generated; the \fBget\-unapplied\fP style must be true\&. +.RS +.PP +This hook gets the names of all unapplied patches which \fBvcs_info\fP +in order, which means that the first argument is +the patch next\-in\-line to be applied and so forth\&. +.PP +The format of each argument is as for \fBgen\-applied\-string\fP, above\&. +.PP +When setting \fBret\fP to non\-zero, the string in +\fB${hook_com[unapplied\-string]}\fP will be available as \fB%u\fP in the +\fBpatch\-format\fP and \fBnopatch\-format\fP styles\&. +This hook is, in concert with \fBset\-patch\-format\fP, responsible for +\fB%\fP\-escaping that value for use in the prompt\&. +(See the \fBOddities\fP section\&.) +.PP +The \fBquilt\fP backend passes to this hook the inputs +\fB${hook_com[quilt\-patches\-dir]}\fP and, if it has been +determined, \fB${hook_com[quilt\-pc\-dir]}\fP\&. +.RE +.TP +\fBgen\-mqguards\-string\fP +Called in the \fBhg\fP backend when \fBguards\-string\fP is generated; the +\fBget\-mq\fP style must be true (default)\&. +.RS +.PP +This hook gets the names of any active \fBmq\fP guards\&. +.PP +When setting \fBret\fP to non\-zero, the string in +\fB${hook_com[guards\-string]}\fP will be used in the \fB%g\fP escape in the +\fBpatch\-format\fP and \fBnopatch\-format\fP styles\&. +.RE +.TP +\fBno\-vcs\fP +This hooks is called when no version control system was detected\&. +.RS +.PP +The `\fBhook_com\fP\&' parameter is not used\&. +.RE +.TP +\fBpost\-backend\fP +Called as soon as the backend has finished collecting information\&. +.RS +.PP +The `\fBhook_com\fP\&' keys available are as for the \fBset\-message\fP hook\&. +.RE +.TP +\fBpost\-quilt\fP +Called after the \fBquilt\fP support is done\&. The following information +is passed as arguments to the hook: 1\&. the quilt\-support mode (`addon\&' or +`standalone\&'); 2\&. the directory that contains the patch series; 3\&. the +directory that holds quilt\&'s status information (the `\&.pc' directory) or +the string \fB"\-nopc\-"\fP if that directory wasn\&'t found\&. +.RS +.PP +The `hook_com\&' parameter is not used\&. +.RE +.TP +\fBset\-branch\-format\fP +Called before `\fBbranchformat\fP\&' is set\&. The only argument to the +hook is the format that is configured at this point\&. +.RS +.PP +The `\fBhook_com\fP\&' keys considered are `\fBbranch\fP' and `\fBrevision\fP'\&. +They are set to the values figured out so far by \fBvcs_info\fP and any +change will be used directly when the actual replacement is done\&. +.PP +If \fBret\fP is set to non\-zero, the string in +\fB${hook_com[branch\-replace]}\fP will be used unchanged as the +`\fB%b\fP\&' replacement in the variables set by \fBvcs_info\fP\&. +.RE +.TP +\fBset\-hgrev\-format\fP +Called before a `\fBhgrevformat\fP\&' is set\&. The only argument to the +hook is the format that is configured at this point\&. +.RS +.PP +The `\fBhook_com\fP\&' keys considered are `\fBhash\fP' and `\fBlocalrev\fP'\&. +They are set to the values figured out so far by \fBvcs_info\fP and any +change will be used directly when the actual replacement is done\&. +.PP +If \fBret\fP is set to non\-zero, the string in +\fB${hook_com[rev\-replace]}\fP will be used unchanged as the +`\fB%i\fP\&' replacement in the variables set by \fBvcs_info\fP\&. +.RE +.TP +\fBpre\-addon\-quilt\fP +This hook is used when \fBvcs_info\fP\&'s quilt functionality is active in "addon" +mode (quilt used on top of a real version control system)\&. It is activated +right before any quilt specific action is taken\&. +.RS +.PP +Setting the `\fBret\fP\&' variable in this hook to a non\-zero value avoids any +quilt specific actions from being run at all\&. +.RE +.TP +\fBset\-patch\-format\fP +This hook is used to control some of the possible expansions in +\fBpatch\-format\fP and \fBnopatch\-format\fP styles with patch queue systems such as +quilt, mqueue and the like\&. +.RS +.PP +This hook is used in the \fBgit\fP, \fBhg\fP and \fBquilt\fP backends\&. +.PP +The hook allows the control of the \fB%p\fP (\fB${hook_com[applied]}\fP) and \fB%u\fP +(\fB${hook_com[unapplied]}\fP) expansion in all backends that use the hook\&. With +the mercurial backend, the \fB%g\fP (\fB${hook_com[guards]}\fP) expansion is +controllable in addition to that\&. +.PP +If \fBret\fP is set to non\-zero, the string in \fB${hook_com[patch\-replace]}\fP +will be used unchanged instead of an expanded format from \fBpatch\-format\fP or +\fBnopatch\-format\fP\&. +.PP +This hook is, in concert with the \fBgen\-applied\-string\fP or +\fBgen\-unapplied\-string\fP hooks if they are defined, responsible for +\fB%\fP\-escaping the final \fBpatch\-format\fP value for use in the prompt\&. +(See the \fBOddities\fP section\&.) +.PP +The \fBquilt\fP backend passes to this hook the inputs +\fB${hook_com[quilt\-patches\-dir]}\fP and, if it has been +determined, \fB${hook_com[quilt\-pc\-dir]}\fP\&. +.RE +.TP +\fBset\-message\fP +Called each time before a `\fBvcs_info_msg_\fP\fIN\fP\fB_\fP\&' message is set\&. +It takes two arguments; the first being the `\fIN\fP\&' in the message +variable name, the second is the currently configured \fBformats\fP or +\fBactionformats\fP\&. +.RS +.PP +There are a number of `\fBhook_com\fP\&' keys, that are used here: +`\fBaction\fP\&', `\fBbranch\fP', `\fBbase\fP', `\fBbase\-name\fP', `\fBsubdir\fP', +`\fBstaged\fP\&', `\fBunstaged\fP', `\fBrevision\fP', `\fBmisc\fP', `\fBvcs\fP' +and one `\fBmiscN\fP\&' entry for each backend\-specific data field (\fBN\fP +starting at zero)\&. They are set to the values figured out so far by +\fBvcs_info\fP and any change will be used directly when the actual +replacement is done\&. +.PP +Since this hook is triggered multiple times (once for each configured +\fBformats\fP or \fBactionformats\fP), each of the `\fBhook_com\fP\&' keys mentioned +above (except for the \fBmiscN\fP entries) has an `\fB_orig\fP\&' counterpart, +so even if you changed a value to your liking you can still get the +original value in the next run\&. Changing the `\fB_orig\fP\&' values is +probably not a good idea\&. +.PP +If \fBret\fP is set to non\-zero, the string in +\fB${hook_com[message]}\fP will be used unchanged as the message by +\fBvcs_info\fP\&. +.RE +.PP +If all of this sounds rather confusing, take a look at +the \fBExamples\fP section below +and also in the \fBMisc/vcs_info\-examples\fP file in the Zsh source\&. +They contain some explanatory code\&. +.PP +.SS "Examples" +.PP +Don\&'t use \fBvcs_info\fP at all (even though it's in your prompt): +.RS +.nf +\fBzstyle \&':vcs_info:*' enable NONE\fP +.fi +.RE +.PP +Disable the backends for \fBbzr\fP and \fBsvk\fP: +.RS +.nf +\fBzstyle \&':vcs_info:*' disable bzr svk\fP +.fi +.RE +.PP +Disable everything \fIbut\fP \fBbzr\fP and \fBsvk\fP: +.RS +.nf +\fBzstyle \&':vcs_info:*' enable bzr svk\fP +.fi +.RE +.PP +Provide a special formats for \fBgit\fP: +.RS +.nf +\fBzstyle \&':vcs_info:git:*' formats ' GIT, BABY! [%b]' +zstyle \&':vcs_info:git:*' actionformats ' GIT ACTION! [%b|%a]'\fP +.fi +.RE +.PP +All \fB%x\fP expansion in all sorts of formats (\fBformats\fP, \fBactionformats\fP, +\fBbranchformat\fP, you name it) are done using the `\fBzformat\fP\&' builtin from +the `\fBzsh/zutil\fP\&' module\&. That means you can do everything with these +\fB%x\fP items what zformat supports\&. In particular, if you want something +that is really long to have a fixed width, like a hash in a mercurial +branchformat, you can do this: \fB%12\&.12i\fP\&. That\&'ll shrink the 40 character +hash to its 12 leading characters\&. The form is actually +`\fB%\fP\fImin\fP\fB\&.\fP\fImax\fP\fBx\fP\&'\&. More is possible\&. +See the section `The zsh/zutil Module\&' in \fIzshmodules\fP(1) for details\&. +.PP +Use the quicker \fBbzr\fP backend +.RS +.nf +\fBzstyle \&':vcs_info:bzr:*' use\-simple true\fP +.fi +.RE +.PP +If you do use \fBuse\-simple\fP, please report if it does `the\-right\-thing[tm]\&'\&. +.PP +Display the revision number in yellow for \fBbzr\fP and \fBsvn\fP: +.RS +.nf +\fBzstyle \&':vcs_info:(svn|bzr):*' \e + branchformat \&'%b%%F{yellow}:%r'\fP +.fi +.RE +.PP +The doubled percent sign is explained in +the \fBOddities\fP section\&. +.PP +Alternatively, one can use the raw colour codes directly: +.PP +.RS +.nf +\fBzstyle \&':vcs_info:(svn|bzr):*' \e + branchformat \&'%b%{'${fg[yellow]}'%}:%r'\fP +.fi +.RE +.PP +Normally when a variable is interpolated into a format string, the variable +needs to be \fB%\fP\-escaped\&. In this example we skipped that because we assume +the value of \fB${fg[yellow]}\fP doesn\&'t contain any \fB%\fP signs\&. +.PP +Make sure you enclose the color codes in \fB%{\fP\fI\&.\&.\&.\fP\fB%}\fP +if you want to use the string provided by \fBvcs_info\fP in prompts\&. +.PP +Here is how to print the VCS information as a command (not in a prompt): +.RS +.nf +\fBvcsi() { vcs_info interactive; vcs_info_lastmsg }\fP +.fi +.RE +.PP +This way, you can even define different formats for output via +\fBvcs_info_lastmsg\fP in the \&'\fB:vcs_info:*:interactive:*\fP' namespace\&. +.PP +Now as promised, some code that uses hooks: +say, you\&'d like to replace the string `svn' by `subversion' in +\fBvcs_info\fP\&'s \fB%s\fP \fBformats\fP replacement\&. +.PP +First, we will tell \fBvcs_info\fP to call a function when populating +the message variables with the gathered information: +.RS +.nf +\fBzstyle \&':vcs_info:*+set\-message:*' hooks svn2subversion\fP +.fi +.RE +.PP +Nothing happens\&. Which is reasonable, since we didn\&'t define the actual +function yet\&. To see what the hooks subsystem is trying to do, enable the +`\fBdebug\fP\&' style: +.RS +.nf +\fBzstyle \&':vcs_info:*+*:*' debug true\fP +.fi +.RE +.PP +That should give you an idea what is going on\&. Specifically, the function +that we are looking for is `\fB+vi\-svn2subversion\fP\&'\&. Note, the `\fB+vi\-\fP' +prefix\&. So, everything is in order, just as documented\&. When you are done +checking out the debugging output, disable it again: +.RS +.nf +\fBzstyle \&':vcs_info:*+*:*' debug false\fP +.fi +.RE +.PP +Now, let\&'s define the function: +.RS +.nf +\fB +function +vi\-svn2subversion() { + [[ ${hook_com[vcs_orig]} == svn ]] && hook_com[vcs]=subversion +}\fP +.fi +.RE +.PP +Simple enough\&. And it could have even been simpler, if only we had +registered our function in a less generic context\&. If we do it only in +the `\fBsvn\fP\&' backend's context, we don't need to test which the active +backend is: +.RS +.nf +\fBzstyle \&':vcs_info:svn+set\-message:*' hooks svn2subversion\fP +.fi +.RE +.RS +.nf +\fB +function +vi\-svn2subversion() { + hook_com[vcs]=subversion +}\fP +.fi +.RE +.PP +And finally a little more elaborate example, that uses a hook to create +a customised bookmark string for the \fBhg\fP backend\&. +.PP +Again, we start off by registering a function: +.RS +.nf +\fBzstyle \&':vcs_info:hg+gen\-hg\-bookmark\-string:*' hooks hgbookmarks\fP +.fi +.RE +.PP +And then we define the `\fB+vi\-hgbookmarks\fP\&' function: +.RS +.nf +\fB +function +vi\-hgbookmarks() { + # The default is to connect all bookmark names by + # commas\&. This mixes things up a little\&. + # Imagine, there\&'s one type of bookmarks that is + # special to you\&. Say, because it\&'s *your* work\&. + # Those bookmarks look always like this: "sh/*" + # (because your initials are sh, for example)\&. + # This makes the bookmarks string use only those + # bookmarks\&. If there\&'s more than one, it + # concatenates them using commas\&. + # The bookmarks returned by `hg\&' are available in + # the function\&'s positional parameters\&. + local s="${(Mj:,:)@:#sh/*}" + # Now, the communication with the code that calls + # the hook functions is done via the hook_com[] + # hash\&. The key at which the `gen\-hg\-bookmark\-string\&' + # hook looks is `hg\-bookmark\-string\&'\&. So: + hook_com[hg\-bookmark\-string]=$s + # And to signal that we want to use the string we + # just generated, set the special variable `ret\&' to + # something other than the default zero: + ret=1 + return 0 +}\fP +.fi +.RE +.PP +Some longer examples and code snippets which might be useful are available in +the examples file located at Misc/vcs_info\-examples in the Zsh source +directory\&. +.PP +This concludes our guided tour through zsh\&'s \fBvcs_info\fP\&. +.PP +.SH "PROMPT THEMES" +.PP +.SS "Installation" +.PP +You should make sure all the functions from the \fBFunctions/Prompts\fP +directory of the source distribution are available; they all begin with +the string `\fBprompt_\fP\&' except for the special function `\fBpromptinit\fP'\&. +You also need the `\fBcolors\fP\&' and `\fBadd\-zsh\-hook\fP' functions from +\fBFunctions/Misc\fP\&. +All these functions may already be installed on your system; if not, +you will need to find them and copy them\&. The directory should appear as +one of the elements of the \fBfpath\fP array (this should already be the +case if they were installed), and at least the function \fBpromptinit\fP +should be autoloaded; it will autoload the rest\&. Finally, to initialize +the use of the system you need to call the \fBpromptinit\fP function\&. The +following code in your \fB\&.zshrc\fP will arrange for this; assume the +functions are stored in the directory \fB~/myfns\fP: +.PP +.RS +.nf +\fBfpath=(~/myfns $fpath) +autoload \-U promptinit +promptinit\fP +.fi +.RE +.PP +.SS "Theme Selection" +.PP +Use the \fBprompt\fP command to select your preferred theme\&. This command +may be added to your \fB\&.zshrc\fP following the call to \fBpromptinit\fP in +order to start zsh with a theme already selected\&. +.PP +.PD 0 +.TP +.PD 0 +\fBprompt\fP [ \fB\-c\fP | \fB\-l\fP ] +.TP +.PD 0 +\fBprompt\fP [ \fB\-p\fP | \fB\-h\fP ] [ \fItheme\fP \&.\&.\&. ] +.TP +.PD +\fBprompt\fP [ \fB\-s\fP ] \fItheme\fP [ \fIarg\fP \&.\&.\&. ] +Set or examine the prompt theme\&. With no options and a \fItheme\fP +argument, the theme with that name is set as the current theme\&. The +available themes are determined at run time; use the \fB\-l\fP option to see +a list\&. The special \fItheme\fP `\fBrandom\fP\&' selects at random one of the +available themes and sets your prompt to that\&. +.RS +.PP +In some cases the \fItheme\fP may be modified by one or more arguments, +which should be given after the theme name\&. See the help for each theme +for descriptions of these arguments\&. +.PP +Options are: +.PP +.PD 0 +.TP +\fB\-c\fP +Show the currently selected theme and its parameters, if any\&. +.TP +\fB\-l\fP +List all available prompt themes\&. +.TP +\fB\-p\fP +Preview the theme named by \fItheme\fP, or all themes if no +\fItheme\fP is given\&. +.TP +\fB\-h\fP +Show help for the theme named by \fItheme\fP, or for the +\fBprompt\fP function if no \fItheme\fP is given\&. +.TP +\fB\-s\fP +Set \fItheme\fP as the current theme and save state\&. +.PD +.RE +.TP +\fBprompt_\fP\fItheme\fP\fB_setup\fP +Each available \fItheme\fP has a setup function which is called by the +\fBprompt\fP function to install that theme\&. This function may define +other functions as necessary to maintain the prompt, including functions +used to preview the prompt or provide help for its use\&. You should not +normally call a theme\&'s setup function directly\&. +.PP +.SS "Utility Themes" +.PP +.PD 0 +.TP +.PD +\fBprompt off\fP +The theme `\fBoff\fP\&' sets all the prompt variables to minimal values with +no special effects\&. +.TP +\fBprompt default\fP +The theme `\fBdefault\fP\&' sets all prompt variables to the same state as +if an interactive zsh was started with no initialization files\&. +.TP +\fBprompt restore\fP +The special theme `\fBrestore\fP\&' erases all theme settings and sets prompt +variables to their state before the first time the `\fBprompt\fP\&' function +was run, provided each theme has properly defined its cleanup (see below)\&. +.RS +.PP +Note that you can undo `\fBprompt off\fP\&' and `\fBprompt default\fP' with +`\fBprompt restore\fP\&', but a second restore does not undo the first\&. +.RE +.PP +.SS "Writing Themes" +.PP +The first step for adding your own theme is to choose a name for it, +and create a file `\fBprompt_\fIname\fP_setup\fP\&' in a directory in your +\fBfpath\fP, such as \fB~/myfns\fP in the example above\&. The file should +at minimum contain assignments for the prompt variables that your +theme wishes to modify\&. By convention, themes use \fBPS1\fP, \fBPS2\fP, +\fBRPS1\fP, etc\&., rather than the longer \fBPROMPT\fP and \fBRPROMPT\fP\&. +.PP +The file is autoloaded as a function in the current shell context, so +it may contain any necessary commands to customize your theme, including +defining additional functions\&. To make some complex tasks easier, your +setup function may also do any of the following: +.PP +.PD 0 +.TP +.PD +Assign \fBprompt_opts\fP +The array \fBprompt_opts\fP may be assigned any of \fB"bang"\fP, \fB"cr"\fP, +\fB"percent"\fP, \fB"sp"\fP, and/or \fB"subst"\fP as values\&. The corresponding +setopts (\fBpromptbang\fP, etc\&.) are turned on, all other prompt\-related +options are turned off\&. The \fBprompt_opts\fP array preserves setopts even +beyond the scope of \fBlocaloptions\fP, should your function need that\&. +.TP +Modify hooks +Use of \fBadd\-zsh\-hook\fP and \fBadd\-zle\-hook\-widget\fP is recommended (see +the \fBManipulating Hook Functions\fP section above)\&. +All hooks that follow the naming pattern \fBprompt_\fP\fItheme\fP\fB_\fP\fIhook\fP +are automatically removed when the prompt theme changes or is disabled\&. +.TP +Declare cleanup +If your function makes any other changes that should be undone when the +theme is disabled, your setup function may call +.RS +.PP +.RS +.nf +\fBprompt_cleanup \fIcommand\fP\fP +.fi +.RE +.PP +where \fIcommand\fP should be suitably quoted\&. If your theme is ever +disabled or replaced by another, \fIcommand\fP is executed with \fBeval\fP\&. +You may declare more than one such cleanup hook\&. +.RE +.TP +Define preview +Define or autoload a function \fBprompt_\fP\fIname\fP\fB_preview\fP to display +a simulated version of your prompt\&. A simple default previewer is +defined by \fBpromptinit\fP for themes that do not define their own\&. +This preview function is called by `\fBprompt \-p\fP\&'\&. +.TP +Provide help +Define or autoload a function \fBprompt_\fP\fIname\fP\fB_help\fP to display +documentation or help text for your theme\&. +This help function is called by `\fBprompt \-h\fP\&'\&. +.PP +.SH "ZLE FUNCTIONS" +.PP +.SS "Widgets" +.PP +These functions all implement user\-defined ZLE widgets (see +\fIzshzle\fP(1)) which can be bound to keystrokes in interactive shells\&. To use them, +your \fB\&.zshrc\fP should contain lines of the form +.PP +.RS +.nf +\fBautoload \fIfunction\fP +zle \-N \fIfunction\fP\fP +.fi +.RE +.PP +followed by an appropriate \fBbindkey\fP command to associate the function +with a key sequence\&. Suggested bindings are described below\&. +.PP +.PD 0 +.TP +.PD +bash\-style word functions +If you are looking for functions to implement moving over and editing +words in the manner of bash, where only alphanumeric characters are +considered word characters, you can use the functions described in +the next section\&. The following is sufficient: +.RS +.PP +.RS +.nf +\fBautoload \-U select\-word\-style +select\-word\-style bash\fP +.fi +.RE +.PP +.RE +.TP +.PD 0 +\fBforward\-word\-match\fP, \fBbackward\-word\-match\fP +.TP +.PD 0 +\fBkill\-word\-match\fP, \fBbackward\-kill\-word\-match\fP +.TP +.PD 0 +\fBtranspose\-words\-match\fP, \fBcapitalize\-word\-match\fP +.TP +.PD 0 +\fBup\-case\-word\-match\fP, \fBdown\-case\-word\-match\fP +.TP +.PD 0 +\fBdelete\-whole\-word\-match\fP, \fBselect\-word\-match\fP +.TP +.PD +\fBselect\-word\-style\fP, \fBmatch\-word\-context\fP, \fBmatch\-words\-by\-style\fP +The first eight `\fB\-match\fP\&' functions are drop\-in replacements for the +builtin widgets without the suffix\&. By default they behave in a similar +way\&. However, by the use of styles and the function \fBselect\-word\-style\fP, +the way words are matched can be altered\&. \fBselect\-word\-match\fP is intended +to be used as a text object in vi mode but with custom word styles\&. For +comparison, the widgets described in \fIzshzle\fP(1) under Text Objects use fixed definitions of words, compatible +with the \fBvim\fP editor\&. +.RS +.PP +The simplest way of configuring the functions is to use +\fBselect\-word\-style\fP, which can either be called as a normal function with +the appropriate argument, or invoked as a user\-defined widget that will +prompt for the first character of the word style to be used\&. The first +time it is invoked, the first eight \fB\-match\fP functions will automatically +replace the builtin versions, so they do not need to be loaded explicitly\&. +.PP +The word styles available are as follows\&. Only the first character +is examined\&. +.PP +.PD 0 +.TP +.PD +\fBbash\fP +Word characters are alphanumeric characters only\&. +.TP +\fBnormal\fP +As in normal shell operation: word characters are alphanumeric characters +plus any characters present in the string given by the parameter +\fB$WORDCHARS\fP\&. +.TP +\fBshell\fP +Words are complete shell command arguments, possibly including complete +quoted strings, or any tokens special to the shell\&. +.TP +\fBwhitespace\fP +Words are any set of characters delimited by whitespace\&. +.TP +\fBdefault\fP +Restore the default settings; this is usually the same as `\fBnormal\fP\&'\&. +.PP +All but `\fBdefault\fP\&' can be input as an upper case character, which has +the same effect but with subword matching turned on\&. In this case, words +with upper case characters are treated specially: each separate run of +upper case characters, or an upper case character followed by any number of +other characters, is considered a word\&. The style \fBsubword\-range\fP +can supply an alternative character range to the default `\fB[:upper:]\fP\&'; +the value of the style is treated as the contents of a `\fB[\fP\fI\&.\&.\&.\fP\fB]\fP\&' +pattern (note that the outer brackets should not be supplied, only +those surrounding named ranges)\&. +.PP +More control can be obtained using the \fBzstyle\fP command, as described in +\fIzshmodules\fP(1)\&. Each style is looked up in the +context \fB:zle:\fP\fIwidget\fP where \fIwidget\fP is the name of the +user\-defined widget, not the name of the function implementing it, so in +the case of the definitions supplied by \fBselect\-word\-style\fP the +appropriate contexts are \fB:zle:forward\-word\fP, and so on\&. The function +\fBselect\-word\-style\fP itself always defines styles for the context +`\fB:zle:*\fP\&' which can be overridden by more specific (longer) patterns as +well as explicit contexts\&. +.PP +The style \fBword\-style\fP specifies the rules to use\&. This may have the +following values\&. +.PP +.PD 0 +.TP +.PD +\fBnormal\fP +Use the standard shell rules, i\&.e\&. alphanumerics and \fB$WORDCHARS\fP, unless +overridden by the styles \fBword\-chars\fP or \fBword\-class\fP\&. +.TP +\fBspecified\fP +Similar to \fBnormal\fP, but \fIonly\fP the specified characters, and not also +alphanumerics, are considered word characters\&. +.TP +\fBunspecified\fP +The negation of specified\&. The given characters are those which will +\fInot\fP be considered part of a word\&. +.TP +\fBshell\fP +Words are obtained by using the syntactic rules for generating shell +command arguments\&. In addition, special tokens which are never command +arguments such as `\fB()\fP\&' are also treated as words\&. +.TP +\fBwhitespace\fP +Words are whitespace\-delimited strings of characters\&. +.PP +The first three of those rules usually use \fB$WORDCHARS\fP, but the value +in the parameter can be overridden by the style \fBword\-chars\fP, which works +in exactly the same way as \fB$WORDCHARS\fP\&. In addition, the style +\fBword\-class\fP uses character class syntax to group characters and takes +precedence over \fBword\-chars\fP if both are set\&. The \fBword\-class\fP style +does not include the surrounding brackets of the character class; for +example, `\fB\-:[:alnum:]\fP\&' is a valid \fBword\-class\fP to include all +alphanumerics plus the characters `\fB\-\fP\&' and `\fB:\fP'\&. Be careful +including `\fB]\fP\&', `\fB^\fP' and `\fB\-\fP' as these are special inside +character classes\&. +.PP +\fBword\-style\fP may also have `\fB\-subword\fP\&' appended to its value to +turn on subword matching, as described above\&. +.PP +The style \fBskip\-chars\fP is mostly useful for +\fBtranspose\-words\fP and similar functions\&. If set, it gives a count of +characters starting at the cursor position which will not be considered +part of the word and are treated as space, regardless of what they actually +are\&. For example, if +.PP +.RS +.nf +\fBzstyle \&':zle:transpose\-words' skip\-chars 1\fP +.fi +.RE +.PP +has been set, and \fBtranspose\-words\-match\fP is called with the cursor on +the \fIX\fP of \fBfoo\fP\fIX\fP\fBbar\fP, where \fIX\fP can be any character, then +the resulting expression is \fBbar\fP\fIX\fP\fBfoo\fP\&. +.PP +Finer grained control can be obtained by setting the style \fBword\-context\fP +to an array of pairs of entries\&. Each pair of entries consists of a +\fIpattern\fP and a \fIsubcontext\fP\&. The shell argument the cursor is on is +matched against each \fIpattern\fP in turn until one matches; if it does, +the context is extended by a colon and the corresponding \fIsubcontext\fP\&. +Note that the test is made against the original word on the line, with no +stripping of quotes\&. Special handling is done between words: the current +context is examined and if it contains the string \fBbetween\fP the word +is set to a single space; else if it is contains the string \fBback\fP, +the word before the cursor is considered, else the word after cursor is +considered\&. Some examples are given below\&. +.PP +The style \fBskip\-whitespace\-first\fP is only used with the +\fBforward\-word\fP widget\&. If it is set to true, then \fBforward\-word\fP +skips any non\-word\-characters, followed by any non\-word\-characters: +this is similar to the behaviour of other word\-orientated widgets, +and also that used by other editors, however it differs from the +standard zsh behaviour\&. When using \fBselect\-word\-style\fP the widget +is set in the context \fB:zle:*\fP to \fBtrue\fP if the word style is +\fBbash\fP and \fBfalse\fP otherwise\&. It may be overridden by setting it in +the more specific context \fB:zle:forward\-word*\fP\&. +.PP +It is possible to create widgets with specific behaviour by defining +a new widget implemented by the appropriate generic function, then +setting a style for the context of the specific widget\&. For example, +the following defines a widget \fBbackward\-kill\-space\-word\fP using +\fBbackward\-kill\-word\-match\fP, the generic widget implementing +\fBbackward\-kill\-word\fP behaviour, and ensures that the new widget +always implements space\-delimited behaviour\&. +.PP +.RS +.nf +\fBzle \-N backward\-kill\-space\-word backward\-kill\-word\-match +zstyle :zle:backward\-kill\-space\-word word\-style space\fP +.fi +.RE +.PP +The widget \fBbackward\-kill\-space\-word\fP can now be bound to a key\&. +.PP +Here are some further examples of use of the styles, actually taken from the +simplified interface in \fBselect\-word\-style\fP: +.PP +.RS +.nf +\fBzstyle \&':zle:*' word\-style standard +zstyle \&':zle:*' word\-chars ''\fP +.fi +.RE +.PP +Implements bash\-style word handling for all widgets, i\&.e\&. only +alphanumerics are word characters; equivalent to setting +the parameter \fBWORDCHARS\fP empty for the given context\&. +.PP +.RS +.nf +\fBstyle \&':zle:*kill*' word\-style space\fP +.fi +.RE +.PP +Uses space\-delimited words for widgets with the word `kill\&' in the name\&. +Neither of the styles \fBword\-chars\fP nor \fBword\-class\fP is used in this case\&. +.PP +Here are some examples of use of the \fBword\-context\fP style to extend +the context\&. +.PP +.RS +.nf +\fBzstyle \&':zle:*' word\-context \e + "*/*" filename "[[:space:]]" whitespace +zstyle \&':zle:transpose\-words:whitespace' word\-style shell +zstyle \&':zle:transpose\-words:filename' word\-style normal +zstyle \&':zle:transpose\-words:filename' word\-chars ''\fP +.fi +.RE +.PP +This provides two different ways of using \fBtranspose\-words\fP depending on +whether the cursor is on whitespace between words or on a filename, here +any word containing a \fB/\fP\&. On whitespace, complete arguments as defined +by standard shell rules will be transposed\&. In a filename, only +alphanumerics will be transposed\&. Elsewhere, words will be transposed +using the default style for \fB:zle:transpose\-words\fP\&. +.PP +The word matching and all the handling of \fBzstyle\fP settings is actually +implemented by the function \fBmatch\-words\-by\-style\fP\&. This can be used to +create new user\-defined widgets\&. The calling function should set the local +parameter \fBcurcontext\fP to \fB:zle:\fP\fIwidget\fP, create the local +parameter \fBmatched_words\fP and call \fBmatch\-words\-by\-style\fP with no +arguments\&. On return, \fBmatched_words\fP will be set to an array with the +elements: (1) the start of the line (2) the word before the cursor (3) any +non\-word characters between that word and the cursor (4) any non\-word +character at the cursor position plus any remaining non\-word characters +before the next word, including all characters specified by the +\fBskip\-chars\fP style, (5) the word at or following the cursor (6) any +non\-word characters following that word (7) the remainder of the line\&. Any +of the elements may be an empty string; the calling function should test +for this to decide whether it can perform its function\&. +.PP +If the variable \fBmatched_words\fP is defined by the caller to +\fBmatch\-words\-by\-style\fP as an associative array (\fBlocal \-A +matched_words\fP), then the seven values given above should be retrieved +from it as elements named \fBstart\fP, \fBword\-before\-cursor\fP, +\fBws\-before\-cursor\fP, \fBws\-after\-cursor\fP, \fBword\-after\-cursor\fP, +\fBws\-after\-word\fP, and \fBend\fP\&. In addition the element +\fBis\-word\-start\fP is 1 if the cursor is on the start of a word or +subword, or on white space before it (the cases can be distinguished by +testing the \fBws\-after\-cursor\fP element) and 0 otherwise\&. This form is +recommended for future compatibility\&. +.PP +It is possible to pass options with arguments to \fBmatch\-words\-by\-style\fP +to override the use of styles\&. The options are: +.PD 0 +.TP +\fB\-w\fP +\fIword\-style\fP +.TP +\fB\-s\fP +\fIskip\-chars\fP +.TP +\fB\-c\fP +\fIword\-class\fP +.TP +\fB\-C\fP +\fIword\-chars\fP +.TP +\fB\-r\fP +\fIsubword\-range\fP +.PD +.PP +For example, \fBmatch\-words\-by\-style \-w shell \-c 0\fP may be used to +extract the command argument around the cursor\&. +.PP +The \fBword\-context\fP style is implemented by the function +\fBmatch\-word\-context\fP\&. This should not usually need to be called +directly\&. +.RE +.TP +\fBbracketed\-paste\-magic\fP +The \fBbracketed\-paste\fP widget (see the subsection `Miscellaneous\&' in +\fIzshzle\fP(1)) +inserts pasted text literally into the editor buffer rather than interpret +it as keystrokes\&. This disables some common usages where the self\-insert +widget is replaced in order to accomplish some extra processing\&. An +example is the contributed \fBurl\-quote\-magic\fP widget described below\&. +.RS +.PP +The \fBbracketed\-paste\-magic\fP widget is meant to replace \fBbracketed\-paste\fP +with a wrapper that re\-enables these self\-insert actions, and other +actions as selected by zstyles\&. Therefore this widget is installed with + +.RS +.nf +\fBautoload \-Uz bracketed\-paste\-magic +zle \-N bracketed\-paste bracketed\-paste\-magic\fP +.fi +.RE +.PP +Other than enabling some widget processing, \fBbracketed\-paste\-magic\fP +attempts to replicate \fBbracketed\-paste\fP as faithfully as possible\&. +.PP +The following zstyles may be set to control processing of pasted text\&. +All are looked up in the context `\fB:bracketed\-paste\-magic\fP\&'\&. +.PP +.PD 0 +.TP +.PD +\fBactive\-widgets\fP +A list of patterns matching widget names that should be activated during +the paste\&. All other key sequences are processed as self\-insert\-unmeta\&. +The default is `\fBself\-*\fP\&' so any user\-defined widgets named with that +prefix are active along with the builtin self\-insert\&. +.RS +.PP +If this style is not set (explicitly deleted) or set to an empty value, +no widgets are active and the pasted text is inserted literally\&. If the +value includes `\fBundefined\-key\fP\&', any unknown sequences are discarded +from the pasted text\&. +.RE +.TP +\fBinactive\-keys\fP +The inverse of \fBactive\-widgets\fP, a list of key sequences that always use +\fBself\-insert\-unmeta\fP even when bound to an active widget\&. Note that +this is a list of literal key sequences, not patterns\&. +.TP +\fBpaste\-init\fP +A list of function names, called in widget context (but not as widgets)\&. +The functions are called in order until one of them returns a non\-zero +status\&. The parameter `\fBPASTED\fP\&' contains the initial state of the +pasted text\&. All other ZLE parameters such as `\fBBUFFER\fP\&' have their +normal values and side\-effects, and full history is available, so for +example \fBpaste\-init\fP functions may move words from \fBBUFFER\fP into +\fBPASTED\fP to make those words visible to the \fBactive\-widgets\fP\&. +.RS +.PP +A non\-zero return from a \fBpaste\-init\fP function does \fInot\fP prevent the +paste itself from proceeding\&. +.PP +Loading \fBbracketed\-paste\-magic\fP defines \fBbackward\-extend\-paste\fP, a +helper function for use in \fBpaste\-init\fP\&. +.PP +.RS +.nf +\fBzstyle :bracketed\-paste\-magic paste\-init \e + backward\-extend\-paste\fP +.fi +.RE +.PP +When a paste would insert into the middle of a word or append text to a +word already on the line, \fBbackward\-extend\-paste\fP moves the prefix +from \fBLBUFFER\fP into \fBPASTED\fP so that the \fBactive\-widgets\fP see the +full word so far\&. This may be useful with \fBurl\-quote\-magic\fP\&. +.RE +.TP +\fBpaste\-finish\fP +Another list of function names called in order until one returns non\-zero\&. +These functions are called \fIafter\fP the pasted text has been processed +by the \fBactive\-widgets\fP, but \fIbefore\fP it is inserted into `\fBBUFFER\fP\&'\&. +ZLE parameters have their normal values and side\-effects\&. +.RS +.PP +A non\-zero return from a \fBpaste\-finish\fP function does \fInot\fP prevent +the paste itself from proceeding\&. +.PP +Loading \fBbracketed\-paste\-magic\fP also defines \fBquote\-paste\fP, a helper +function for use in \fBpaste\-finish\fP\&. +.PP +.RS +.nf +\fBzstyle :bracketed\-paste\-magic paste\-finish \e + quote\-paste +zstyle :bracketed\-paste\-magic:finish quote\-style \e + qqq\fP +.fi +.RE +.PP +When the pasted text is inserted into \fBBUFFER\fP, it is quoted per the +\fBquote\-style\fP value\&. To forcibly turn off the built\-in numeric prefix +quoting of \fBbracketed\-paste\fP, use: +.PP +.RS +.nf +\fBzstyle :bracketed\-paste\-magic:finish quote\-style \e + none\fP +.fi +.RE +.RE +.PP +\fIImportant:\fP During \fBactive\-widgets\fP processing of the paste (after +\fBpaste\-init\fP and before \fBpaste\-finish\fP), \fBBUFFER\fP starts empty and +history is restricted, so cursor motions, etc\&., may not pass outside of +the pasted content\&. Text assigned to \fBBUFFER\fP by the active widgets +is copied back into \fBPASTED\fP before \fBpaste\-finish\fP\&. +.RE +.TP +\fBcopy\-earlier\-word\fP +This widget works like a combination of \fBinsert\-last\-word\fP and +\fBcopy\-prev\-shell\-word\fP\&. Repeated invocations of the widget retrieve +earlier words on the relevant history line\&. With a numeric argument +\fIN\fP, insert the \fIN\fPth word from the history line; \fIN\fP may be +negative to count from the end of the line\&. +.RS +.PP +If \fBinsert\-last\-word\fP has been used to retrieve the last word on a +previous history line, repeated invocations will replace that word with +earlier words from the same line\&. +.PP +Otherwise, the widget applies to words on the line currently being edited\&. +The \fBwidget\fP style can be set to the name of another widget that should +be called to retrieve words\&. This widget must accept the same three +arguments as \fBinsert\-last\-word\fP\&. +.RE +.TP +\fBcycle\-completion\-positions\fP +After inserting an unambiguous string into the command line, the new +function based completion system may know about multiple places in +this string where characters are missing or differ from at least one +of the possible matches\&. It will then place the cursor on the +position it considers to be the most interesting one, i\&.e\&. the one +where one can disambiguate between as many matches as possible with as +little typing as possible\&. +.RS +.PP +This widget allows the cursor to be easily moved to the other interesting +spots\&. It can be invoked repeatedly to cycle between all positions +reported by the completion system\&. +.RE +.TP +\fBdelete\-whole\-word\-match\fP +This is another function which works like the \fB\-match\fP functions +described immediately above, i\&.e\&. using styles to decide the word +boundaries\&. However, it is not a replacement for any existing function\&. +.RS +.PP +The basic behaviour is to delete the word around the cursor\&. There is no +numeric argument handling; only the single word around the cursor is +considered\&. If the widget contains the string \fBkill\fP, the removed text +will be placed in the cutbuffer for future yanking\&. This can be obtained +by defining \fBkill\-whole\-word\-match\fP as follows: +.PP +.RS +.nf +\fBzle \-N kill\-whole\-word\-match delete\-whole\-word\-match\fP +.fi +.RE +.PP +and then binding the widget \fBkill\-whole\-word\-match\fP\&. +.RE +.TP +\fBup\-line\-or\-beginning\-search\fP, \fBdown\-line\-or\-beginning\-search\fP +These widgets are similar to the builtin functions \fBup\-line\-or\-search\fP +and \fBdown\-line\-or\-search\fP: if in a multiline buffer they move up or +down within the buffer, otherwise they search for a history line matching +the start of the current line\&. In this case, however, they search for +a line which matches the current line up to the current cursor position, in +the manner of \fBhistory\-beginning\-search\-backward\fP and \fB\-forward\fP, rather +than the first word on the line\&. +.TP +\fBedit\-command\-line\fP +Edit the command line using your visual editor, as in \fBksh\fP\&. +.RS +.PP +.RS +.nf +\fBbindkey \-M vicmd v edit\-command\-line\fP +.fi +.RE +.PP +The editor to be used can also be specified using the \fBeditor\fP style in +the context of the widget\&. It is specified as an array of command and +arguments: +.PP +.RS +.nf +\fBzstyle :zle:edit\-command\-line editor gvim \-f\fP +.fi +.RE +.RE +.TP +\fBexpand\-absolute\-path\fP +Expand the file name under the cursor to an absolute path, resolving +symbolic links\&. Where possible, the initial path segment is turned +into a named directory or reference to a user\&'s home directory\&. +.TP +\fBhistory\-search\-end\fP +This function implements the widgets +\fBhistory\-beginning\-search\-backward\-end\fP and +\fBhistory\-beginning\-search\-forward\-end\fP\&. These commands work by first +calling the corresponding builtin widget (see +`History Control\&' in \fIzshzle\fP(1)) and then moving the cursor to the end of the line\&. The original cursor +position is remembered and restored before calling the builtin widget a +second time, so that the same search is repeated to look farther through +the history\&. +.RS +.PP +Although you \fBautoload\fP only one function, the commands to use it are +slightly different because it implements two widgets\&. +.PP +.RS +.nf +\fBzle \-N history\-beginning\-search\-backward\-end \e + history\-search\-end +zle \-N history\-beginning\-search\-forward\-end \e + history\-search\-end +bindkey \&'\ee^P' history\-beginning\-search\-backward\-end +bindkey \&'\ee^N' history\-beginning\-search\-forward\-end\fP +.fi +.RE +.RE +.TP +\fBhistory\-beginning\-search\-menu\fP +This function implements yet another form of history searching\&. The +text before the cursor is used to select lines from the history, +as for \fBhistory\-beginning\-search\-backward\fP except that all matches are +shown in a numbered menu\&. Typing the appropriate digits inserts the +full history line\&. Note that leading zeroes must be typed (they are only +shown when necessary for removing ambiguity)\&. The entire history is +searched; there is no distinction between forwards and backwards\&. +.RS +.PP +With a numeric argument, the search is not anchored to the start of +the line; the string typed by the use may appear anywhere in the line +in the history\&. +.PP +If the widget name contains `\fB\-end\fP\&' the cursor is moved to the end of +the line inserted\&. If the widget name contains `\fB\-space\fP\&' any space +in the text typed is treated as a wildcard and can match anything (hence +a leading space is equivalent to giving a numeric argument)\&. Both +forms can be combined, for example: +.PP +.RS +.nf +\fBzle \-N history\-beginning\-search\-menu\-space\-end \e + history\-beginning\-search\-menu\fP +.fi +.RE +.RE +.TP +\fBhistory\-pattern\-search\fP +The function \fBhistory\-pattern\-search\fP implements widgets which prompt +for a pattern with which to search the history backwards or forwards\&. The +pattern is in the usual zsh format, however the first character may be +\fB^\fP to anchor the search to the start of the line, and the last character +may be \fB$\fP to anchor the search to the end of the line\&. If the +search was not anchored to the end of the line the cursor is positioned +just after the pattern found\&. +.RS +.PP +The commands to create bindable widgets are similar to those in the +example immediately above: +.PP +.RS +.nf +\fBautoload \-U history\-pattern\-search +zle \-N history\-pattern\-search\-backward history\-pattern\-search +zle \-N history\-pattern\-search\-forward history\-pattern\-search\fP +.fi +.RE +.RE +.TP +\fBincarg\fP +Typing the keystrokes for this widget with the cursor placed on or to the +left of an integer causes that integer to be incremented by one\&. With a +numeric argument, the number is incremented by the amount of the +argument (decremented if the numeric argument is negative)\&. The shell +parameter \fBincarg\fP may be set to change the default increment to +something other than one\&. +.RS +.PP +.RS +.nf +\fBbindkey \&'^X+' incarg\fP +.fi +.RE +.RE +.TP +\fBincremental\-complete\-word\fP +This allows incremental completion of a word\&. After starting this +command, a list of completion choices can be shown after every character +you type, which you can delete with \fB^H\fP or \fBDEL\fP\&. Pressing return +accepts the completion so far and returns you to normal editing (that is, +the command line is \fInot\fP immediately executed)\&. You can hit \fBTAB\fP to +do normal completion, \fB^G\fP to abort back to the state when you started, +and \fB^D\fP to list the matches\&. +.RS +.PP +This works only with the new function based completion system\&. +.PP +.RS +.nf +\fBbindkey \&'^Xi' incremental\-complete\-word\fP +.fi +.RE +.RE +.TP +\fBinsert\-composed\-char\fP +This function allows you to compose characters that don\&'t appear on the +keyboard to be inserted into the command line\&. The command is followed by +two keys corresponding to ASCII characters (there is no prompt)\&. For +accented characters, the two keys are a base character followed by a code +for the accent, while for other special characters the two characters +together form a mnemonic for the character to be inserted\&. The +two\-character codes are a subset of those given by RFC 1345 (see for +example \fBhttp://www\&.faqs\&.org/rfcs/rfc1345\&.html\fP)\&. +.RS +.PP +The function may optionally be followed by up to two characters which +replace one or both of the characters read from the keyboard; if both +characters are supplied, no input is read\&. For example, +\fBinsert\-composed\-char a:\fP can be used within a widget to insert an a with +umlaut into the command line\&. This has the advantages over use of a +literal character that it is more portable\&. +.PP +For best results zsh should have been built with support for multibyte +characters (configured with \fB\-\-enable\-multibyte\fP); however, the function +works for the limited range of characters available in single\-byte +character sets such as ISO\-8859\-1\&. +.PP +The character is converted into the local representation and +inserted into the command line at the cursor position\&. +(The conversion is done within the shell, using whatever facilities +the C library provides\&.) With a numeric argument, the character and its +code are previewed in the status line +.PP +The function may be run outside zle in which case it prints the character +(together with a newline) to standard output\&. Input is still read from +keystrokes\&. +.PP +See \fBinsert\-unicode\-char\fP for an alternative way of inserting Unicode +characters using their hexadecimal character number\&. +.PP +The set of accented characters is reasonably complete up to Unicode +character U+0180, the set of special characters less so\&. However, it +is very sporadic from that point\&. Adding new characters is easy, +however; see the function \fBdefine\-composed\-chars\fP\&. Please send any +additions to \fBzsh\-workers@zsh\&.org\fP\&. +.PP +The codes for the second character when used to accent the first are as +follows\&. Note that not every character can take every accent\&. +.PD 0 +.TP +\fB!\fP +Grave\&. +.TP +\fB\&'\fP +Acute\&. +.TP +\fB>\fP +Circumflex\&. +.TP +\fB?\fP +Tilde\&. (This is not \fB~\fP as RFC 1345 does not assume that +character is present on the keyboard\&.) +.TP +\fB\-\fP +Macron\&. (A horizontal bar over the base character\&.) +.TP +\fB(\fP +Breve\&. (A shallow dish shape over the base character\&.) +.TP +\fB\&.\fP +Dot above the base character, or in the case of \fBi\fP no dot, +or in the case of \fBL\fP and \fBl\fP a centered dot\&. +.TP +\fB:\fP +Diaeresis (Umlaut)\&. +.TP +\fBc\fP +Cedilla\&. +.TP +\fB_\fP +Underline, however there are currently no underlined characters\&. +.TP +\fB/\fP +Stroke through the base character\&. +.TP +\fB"\fP +Double acute (only supported on a few letters)\&. +.TP +\fB;\fP +Ogonek\&. (A little forward facing hook at the bottom right +of the character\&.) +.TP +\fB<\fP +Caron\&. (A little v over the letter\&.) +.TP +\fB0\fP +Circle over the base character\&. +.TP +\fB2\fP +Hook over the base character\&. +.TP +\fB9\fP +Horn over the base character\&. +.PD +.PP +The most common characters from the Arabic, Cyrillic, Greek and Hebrew +alphabets are available; consult RFC 1345 for the appropriate sequences\&. +In addition, a set of two letter codes not in RFC 1345 are available for +the double\-width characters corresponding to ASCII characters from \fB!\fP +to \fB~\fP (0x21 to 0x7e) by preceding the character with \fB^\fP, for +example \fB^A\fP for a double\-width \fBA\fP\&. +.PP +The following other two\-character sequences are understood\&. +.PP +.PD 0 +.TP +.PD +ASCII characters +These are already present on most keyboards: +.PD 0 +.TP +\fB<(\fP +Left square bracket +.TP +\fB//\fP +Backslash (solidus) +.TP +\fB)>\fP +Right square bracket +.TP +\fB(!\fP +Left brace (curly bracket) +.TP +\fB!!\fP +Vertical bar (pipe symbol) +.TP +\fB!)\fP +Right brace (curly bracket) +.TP +\fB\&'?\fP +Tilde +.PD +.TP +Special letters +Characters found in various variants of the Latin alphabet: +.PD 0 +.TP +\fBss\fP +Eszett (scharfes S) +.TP +\fBD\-\fP, \fBd\-\fP +Eth +.TP +\fBTH\fP, \fBth\fP +Thorn +.TP +\fBkk\fP +Kra +.TP +\fB\&'n\fP +\&'n +.TP +\fBNG\fP, \fBng\fP +Ng +.TP +\fBOI\fP, \fBoi\fP +Oi +.TP +\fByr\fP +yr +.TP +\fBED\fP +ezh +.PD +.TP +Currency symbols +.PD 0 +.TP +\fBCt\fP +Cent +.TP +\fBPd\fP +Pound sterling (also lira and others) +.TP +\fBCu\fP +Currency +.TP +\fBYe\fP +Yen +.TP +\fBEu\fP +Euro (N\&.B\&. not in RFC 1345) +.PD +.TP +Punctuation characters +References to "right" quotes indicate the shape (like a 9 rather than 6) +rather than their grammatical use\&. (For example, a "right" low double +quote is used to open quotations in German\&.) +.PD 0 +.TP +\fB!I\fP +Inverted exclamation mark +.TP +\fBBB\fP +Broken vertical bar +.TP +\fBSE\fP +Section +.TP +\fBCo\fP +Copyright +.TP +\fB\-a\fP +Spanish feminine ordinal indicator +.TP +\fB<<\fP +Left guillemet +.TP +\fB\-\fP\fB\-\fP +Soft hyphen +.TP +\fBRg\fP +Registered trade mark +.TP +\fBPI\fP +Pilcrow (paragraph) +.TP +\fB\-o\fP +Spanish masculine ordinal indicator +.TP +\fB>>\fP +Right guillemet +.TP +\fB?I\fP +Inverted question mark +.TP +\fB\-1\fP +Hyphen +.TP +\fB\-N\fP +En dash +.TP +\fB\-M\fP +Em dash +.TP +\fB\-3\fP +Horizontal bar +.TP +\fB:3\fP +Vertical ellipsis +.TP +\fB\&.3\fP +Horizontal midline ellipsis +.TP +\fB!2\fP +Double vertical line +.TP +\fB=2\fP +Double low line +.TP +\fB\&'6\fP +Left single quote +.TP +\fB\&'9\fP +Right single quote +.TP +\fB\&.9\fP +"Right" low quote +.TP +\fB9\&'\fP +Reversed "right" quote +.TP +\fB"6\fP +Left double quote +.TP +\fB"9\fP +Right double quote +.TP +\fB:9\fP +"Right" low double quote +.TP +\fB9"\fP +Reversed "right" double quote +.TP +\fB/\-\fP +Dagger +.TP +\fB/=\fP +Double dagger +.PD +.TP +Mathematical symbols +.PD 0 +.TP +\fBDG\fP +Degree +.TP +\fB\-2\fP, \fB+\-\fP, \fB\-+\fP +\- sign, +/\- sign, \-/+ sign +.TP +\fB2S\fP +Superscript 2 +.TP +\fB3S\fP +Superscript 3 +.TP +\fB1S\fP +Superscript 1 +.TP +\fBMy\fP +Micro +.TP +\fB\&.M\fP +Middle dot +.TP +\fB14\fP +Quarter +.TP +\fB12\fP +Half +.TP +\fB34\fP +Three quarters +.TP +\fB*X\fP +Multiplication +.TP +\fB\-:\fP +Division +.TP +\fB%0\fP +Per mille +.TP +\fBFA\fP, \fBTE\fP, \fB/0\fP +For all, there exists, empty set +.TP +\fBdP\fP, \fBDE\fP, \fBNB\fP +Partial derivative, delta (increment), del +(nabla) +.TP +\fB(\-\fP, \fB\-)\fP +Element of, contains +.TP +\fB*P\fP, \fB+Z\fP +Product, sum +.TP +\fB*\-\fP, \fBOb\fP, \fBSb\fP +Asterisk, ring, bullet +.TP +\fBRT\fP, \fB0(\fP, \fB00\fP +Root sign, proportional to, infinity +.PD +.TP +Other symbols +.PD 0 +.TP +\fBcS\fP, \fBcH\fP, \fBcD\fP, \fBcC\fP +Card suits: spades, hearts, diamonds, +clubs +.TP +\fBMd\fP, \fBM8\fP, \fBM2\fP, \fBMb\fP, \fBMx\fP, \fBMX\fP +Musical notation: +crotchet (quarter note), quaver (eighth note), semiquavers (sixteenth +notes), flag sign, natural sign, sharp sign +.TP +\fBFm\fP, \fBMl\fP +Female, male +.PD +.TP +Accents on their own +.PD 0 +.TP +\fB\&'>\fP +Circumflex (same as caret, \fB^\fP) +.TP +\fB\&'!\fP +Grave (same as backtick, \fB`\fP) +.TP +\fB\&',\fP +Cedilla +.TP +\fB\&':\fP +Diaeresis (Umlaut) +.TP +\fB\&'m\fP +Macron +.TP +\fB\&''\fP +Acute +.PD +.RE +.TP +\fBinsert\-files\fP +This function allows you type a file pattern, and see the results of the +expansion at each step\&. When you hit return, all expansions are inserted +into the command line\&. +.RS +.PP +.RS +.nf +\fBbindkey \&'^Xf' insert\-files\fP +.fi +.RE +.RE +.TP +\fBinsert\-unicode\-char\fP +When first executed, the user inputs a set of hexadecimal digits\&. +This is terminated with another call to \fBinsert\-unicode\-char\fP\&. +The digits are then turned into the corresponding Unicode character\&. +For example, if the widget is bound to \fB^XU\fP, the character sequence +`\fB^XU 4 c ^XU\fP\&' inserts \fBL\fP (Unicode U+004c)\&. +.RS +.PP +See \fBinsert\-composed\-char\fP for a way of inserting characters +using a two\-character mnemonic\&. +.RE + +.TP +.PD 0 +\fBnarrow\-to\-region \fP[ \fB\-p\fP \fIpre\fP ] [ \fB\-P\fP \fIpost\fP ] +.TP +.PD 0 +\fB \fP[ \fB\-S\fP \fIstatepm\fP | \fB\-R\fP \fIstatepm\fP | [ \fB\-l\fP \fIlbufvar\fP ] [ \fB\-r\fP \fIrbufvar\fP ] ] +.TP +.PD 0 +\fB \fP[ \fB\-n\fP ] [ \fIstart\fP \fIend\fP ] +.TP +.PD +\fBnarrow\-to\-region\-invisible\fP +Narrow the editable portion of the buffer to the region between the cursor +and the mark, which may be in either order\&. The region may not be empty\&. +.RS +.PP +\fBnarrow\-to\-region\fP may be used as a widget or called as a function from a +user\-defined widget; by default, the text outside the editable area remains +visible\&. A \fBrecursive\-edit\fP is performed and the original widening +status is then restored\&. Various options and arguments are available when +it is called as a function\&. +.PP +The options \fB\-p\fP \fIpretext\fP and \fB\-P\fP \fIposttext\fP may be +used to replace the text before and after the display for the duration of +the function; either or both may be an empty string\&. +.PP +If the option \fB\-n\fP is also given, \fIpretext\fP or \fIposttext\fP will only +be inserted if there is text before or after the region respectively which +will be made invisible\&. +.PP +Two numeric arguments may be given which will be used instead of the cursor +and mark positions\&. +.PP +The option \fB\-S\fP \fIstatepm\fP is used to narrow according to the other +options while saving the original state in the parameter with name +\fIstatepm\fP, while the option \fB\-R\fP \fIstatepm\fP is used to restore the +state from the parameter; note in both cases the \fIname\fP of the parameter +is required\&. In the second case, other options and arguments are +irrelevant\&. When this method is used, no \fBrecursive\-edit\fP is performed; +the calling widget should call this function with the option \fB\-S\fP, +perform its own editing on the command line or pass control to the user +via `\fBzle recursive\-edit\fP\&', then call this function with the option +\fB\-R\fP\&. The argument \fIstatepm\fP must be a suitable name for an ordinary +parameter, except that parameters beginning with the prefix \fB_ntr_\fP are +reserved for use within \fBnarrow\-to\-region\fP\&. Typically the parameter will +be local to the calling function\&. +.PP +The options \fB\-l\fP \fIlbufvar\fP and \fB\-r\fP \fIrbufvar\fP may be used to +specify parameters where the widget will store the resulting text from +the operation\&. The parameter \fIlbufvar\fP will contain \fBLBUFFER\fP +and \fIrbufvar\fP will contain \fBRBUFFER\fP\&. Neither of these two options +may be used with \fB\-S\fP or \fB\-R\fP\&. +.PP +\fBnarrow\-to\-region\-invisible\fP is a simple widget which calls +\fBnarrow\-to\-region\fP with arguments which replace any text outside the +region with `\fB\&.\&.\&.\fP\&'\&. It does not take any arguments\&. +.PP +The display is restored (and the widget returns) upon any zle command +which would usually cause the line to be accepted or aborted\&. Hence an +additional such command is required to accept or abort the current line\&. +.PP +The return status of both widgets is zero if the line was accepted, else +non\-zero\&. +.PP +Here is a trivial example of a widget using this feature\&. +.RS +.nf +\fBlocal state +narrow\-to\-region \-p $\&'Editing restricted region\en' \e + \-P \&'' \-S state +zle recursive\-edit +narrow\-to\-region \-R state\fP +.fi +.RE +.RE +.TP +\fBpredict\-on\fP +This set of functions implements predictive typing using history search\&. +After \fBpredict\-on\fP, typing characters causes the editor to look backward +in the history for the first line beginning with what you have typed so +far\&. After \fBpredict\-off\fP, editing returns to normal for the line found\&. +In fact, you often don\&'t even need to use \fBpredict\-off\fP, because if the +line doesn\&'t match something in the history, adding a key performs +standard completion, and then inserts itself if no completions were found\&. +However, editing in the middle of a line is liable to confuse prediction; +see the \fBtoggle\fP style below\&. +.RS +.PP +With the function based completion system (which is needed for this), you +should be able to type \fBTAB\fP at almost any point to advance the cursor +to the next ``interesting\&'' character position (usually the end of the +current word, but sometimes somewhere in the middle of the word)\&. And of +course as soon as the entire line is what you want, you can accept with +return, without needing to move the cursor to the end first\&. +.PP +The first time \fBpredict\-on\fP is used, it creates several additional +widget functions: +.PP +.PD 0 +.TP +\fBdelete\-backward\-and\-predict\fP +Replaces the \fBbackward\-delete\-char\fP +widget\&. You do not need to bind this yourself\&. +.TP +\fBinsert\-and\-predict\fP +Implements predictive typing by replacing the +\fBself\-insert\fP widget\&. You do not need to bind this yourself\&. +.TP +\fBpredict\-off\fP +Turns off predictive typing\&. +.PD +.PP +Although you \fBautoload\fP only the \fBpredict\-on\fP function, it is +necessary to create a keybinding for \fBpredict\-off\fP as well\&. +.PP +.RS +.nf +\fBzle \-N predict\-on +zle \-N predict\-off +bindkey \&'^X^Z' predict\-on +bindkey \&'^Z' predict\-off\fP +.fi +.RE +.RE +.TP +\fBread\-from\-minibuffer\fP +This is most useful when called as a function from inside a widget, but will +work correctly as a widget in its own right\&. It prompts for a value +below the current command line; a value may be input using all of the +standard zle operations (and not merely the restricted set available +when executing, for example, \fBexecute\-named\-cmd\fP)\&. The value is then +returned to the calling function in the parameter \fB$REPLY\fP and the +editing buffer restored to its previous state\&. If the read was aborted +by a keyboard break (typically \fB^G\fP), the function returns status 1 +and \fB$REPLY\fP is not set\&. +.RS +.PP +If one argument is supplied to the function it is taken as a prompt, +otherwise `\fB? \fP\&' is used\&. If two arguments are supplied, they are the +prompt and the initial value of \fB$LBUFFER\fP, and if a third argument is +given it is the initial value of \fB$RBUFFER\fP\&. This provides a default +value and starting cursor placement\&. Upon return the entire buffer is the +value of \fB$REPLY\fP\&. +.PP +One option is available: `\fB\-k\fP \fInum\fP\&' specifies that \fInum\fP +characters are to be read instead of a whole line\&. The line editor is not +invoked recursively in this case, so depending on the terminal settings +the input may not be visible, and only the input keys are placed in +\fB$REPLY\fP, not the entire buffer\&. Note that unlike the \fBread\fP builtin +\fInum\fP must be given; there is no default\&. +.PP +The name is a slight misnomer, as in fact the shell\&'s own minibuffer is +not used\&. Hence it is still possible to call \fBexecuted\-named\-cmd\fP and +similar functions while reading a value\&. +.RE +.TP +\fBreplace\-argument\fP, \fBreplace\-argument\-edit\fP +The function \fBreplace\-argument\fP can be used to replace a command +line argument in the current command line or, if the current command +line is empty, in the last command line executed (the new command line +is not executed)\&. Arguments are as delimited by standard shell syntax, +.RS +.PP +If a numeric argument is given, that specifies the argument to be +replaced\&. 0 means the command name, as in history expansion\&. +A negative numeric argument counts backward from the last word\&. +.PP +If no numeric argument is given, the current argument is replaced; +this is the last argument if the previous history line is being used\&. +.PP +The function prompts for a replacement argument\&. +.PP +If the widget contains the string \fBedit\fP, for example is defined as +.PP +.RS +.nf +\fBzle \-N replace\-argument\-edit replace\-argument\fP +.fi +.RE +.PP +then the function presents the current value of the argument for +editing, otherwise the editing buffer for the replacement is +initially empty\&. +.RE +.TP +.PD 0 +\fBreplace\-string\fP, \fBreplace\-pattern\fP +.TP +.PD +\fBreplace\-string\-again\fP, \fBreplace\-pattern\-again\fP +The function \fBreplace\-string\fP implements three widgets\&. +If defined under the same name as the function, it prompts for two +strings; the first (source) string will be replaced by the second +everywhere it occurs in the line editing buffer\&. +.RS +.PP +If the widget name contains the word `\fBpattern\fP\&', for example by +defining the widget using the command `\fBzle \-N replace\-pattern +replace\-string\fP\&', then the matching is performed using zsh patterns\&. All +zsh extended globbing patterns can be used in the source string; note +that unlike filename generation the pattern does not need to match an +entire word, nor do glob qualifiers have any effect\&. In addition, the +replacement string can contain parameter or command substitutions\&. +Furthermore, a `\fB&\fP\&' in the replacement string will be replaced with +the matched source string, and a backquoted digit `\fB\e\fP\fIN\fP\&' will be +replaced by the \fIN\fPth parenthesised expression matched\&. The form +`\fB\e{\fP\fIN\fP\fB}\fP\&' may be used to protect the digit from following +digits\&. +.PP +If the widget instead contains the word `\fBregex\fP\&' (or `\fBregexp\fP'), +then the matching is performed using regular expressions, respecting +the setting of the option \fBRE_MATCH_PCRE\fP (see the description of the +function \fBregexp\-replace\fP below)\&. The special replacement facilities +described above for pattern matching are available\&. +.PP +By default the previous source or replacement string will not be offered +for editing\&. However, this feature can be activated by setting the style +\fBedit\-previous\fP in the context \fB:zle:\fP\fIwidget\fP (for example, +\fB:zle:replace\-string\fP) to \fBtrue\fP\&. In addition, a positive +numeric argument forces the previous values to be offered, a negative or +zero argument forces them not to be\&. +.PP +The function \fBreplace\-string\-again\fP can be used to repeat the previous +replacement; no prompting is done\&. As with \fBreplace\-string\fP, if the name +of the widget contains the word `\fBpattern\fP\&' or `\fBregex\fP', pattern or +regular expression matching is performed, else a literal string +replacement\&. Note that the previous source and replacement text are the +same whether pattern, regular expression or string matching is used\&. +.PP +In addition, \fBreplace\-string\fP shows the previous replacement above +the prompt, so long as there was one during the current session; if the +source string is empty, that replacement will be repeated without +the widget prompting for a replacement string\&. +.PP +For example, starting from the line: +.PP +.RS +.nf +\fBprint This line contains fan and fond\fP +.fi +.RE +.PP +and invoking \fBreplace\-pattern\fP with the source string +`\fBf(?)n\fP\&' and +the replacement string `\fBc\e1r\fP\&' produces the not very useful line: +.PP +.RS +.nf +\fBprint This line contains car and cord\fP +.fi +.RE +.PP +The range of the replacement string can be limited by using the +\fBnarrow\-to\-region\-invisible\fP widget\&. One limitation of the current +version is that \fBundo\fP will cycle through changes to the replacement +and source strings before undoing the replacement itself\&. +.RE +.TP +\fBsend\-invisible\fP +This is similar to read\-from\-minibuffer in that it may be called as a +function from a widget or as a widget of its own, and interactively reads +input from the keyboard\&. However, the input being typed is concealed and +a string of asterisks (`\fB*\fP\&') is shown instead\&. The value is saved in +the parameter \fB$INVISIBLE\fP to which a reference is inserted into the +editing buffer at the restored cursor position\&. If the read was aborted +by a keyboard break (typically \fB^G\fP) or another escape from editing such +as \fBpush\-line\fP, \fB$INVISIBLE\fP is set to empty and the original buffer +is restored unchanged\&. +.RS +.PP +If one argument is supplied to the function it is taken as a prompt, +otherwise `\fBNon\-echoed text: \fP\&' is used (as in emacs)\&. If a second and +third argument are supplied they are used to begin and end the reference +to \fB$INVISIBLE\fP that is inserted into the buffer\&. The default is to +open with \fB${\fP, then \fBINVISIBLE\fP, and close with \fB}\fP, but many +other effects are possible\&. +.RE +.TP +\fBsmart\-insert\-last\-word\fP +This function may replace the \fBinsert\-last\-word\fP widget, like so: +.RS +.PP +.RS +.nf +\fBzle \-N insert\-last\-word smart\-insert\-last\-word\fP +.fi +.RE +.PP +With a numeric argument, or when passed command line arguments in a call +from another widget, it behaves like \fBinsert\-last\-word\fP, except that +words in comments are ignored when \fBINTERACTIVE_COMMENTS\fP is set\&. +.PP +Otherwise, the rightmost ``interesting\&'' word from the previous command is +found and inserted\&. The default definition of ``interesting\&'' is that the +word contains at least one alphabetic character, slash, or backslash\&. +This definition may be overridden by use of the \fBmatch\fP style\&. The +context used to look up the style is the widget name, so usually the +context is \fB:insert\-last\-word\fP\&. However, you can bind this function to +different widgets to use different patterns: +.PP +.RS +.nf +\fBzle \-N insert\-last\-assignment smart\-insert\-last\-word +zstyle :insert\-last\-assignment match \&'[[:alpha:]][][[:alnum:]]#=*' +bindkey \&'\ee=' insert\-last\-assignment\fP +.fi +.RE +.PP +If no interesting word is found and the \fBauto\-previous\fP style is set to +a true value, the search continues upward through the history\&. When +\fBauto\-previous\fP is unset or false (the default), the widget must be +invoked repeatedly in order to search earlier history lines\&. +.RE +.TP +\fBtranspose\-lines\fP +Only useful with a multi\-line editing buffer; the lines here are +lines within the current on\-screen buffer, not history lines\&. +The effect is similar to the function of the same name in Emacs\&. +.RS +.PP +Transpose the current line with the previous line and move the cursor +to the start of the next line\&. Repeating this (which can be done by +providing a positive numeric argument) has the effect of moving +the line above the cursor down by a number of lines\&. +.PP +With a negative numeric argument, requires two lines above the +cursor\&. These two lines are transposed and the cursor moved to the +start of the previous line\&. Using a numeric argument less than \-1 +has the effect of moving the line above the cursor up by minus that +number of lines\&. +.RE +.TP +\fBurl\-quote\-magic\fP +This widget replaces the built\-in \fBself\-insert\fP to make it easier to +type URLs as command line arguments\&. As you type, the input character is +analyzed and, if it may need quoting, the current word is checked for a +URI scheme\&. If one is found and the current word is not already in +quotes, a backslash is inserted before the input character\&. +.RS +.PP +Styles to control quoting behavior: +.PP +.PD 0 +.TP +.PD +\fBurl\-metas\fP +This style is looked up in the context `\fB:url\-quote\-magic:\fP\fIscheme\fP\&' +(where \fIscheme\fP is that of the current URL, e\&.g\&. "\fBftp\fP")\&. The value +is a string listing the characters to be treated as globbing +metacharacters when appearing in a URL using that scheme\&. The default is +to quote all zsh extended globbing characters, excluding \&'\fB<\fP' and +\&'\fB>\fP' but including braces (as in brace expansion)\&. See also +\fBurl\-seps\fP\&. +.TP +\fBurl\-seps\fP +Like \fBurl\-metas\fP, but lists characters that should be considered command +separators, redirections, history references, etc\&. The default is to +quote the standard set of shell separators, excluding those that overlap +with the extended globbing characters, but including \&'\fB<\fP' and +\&'\fB>\fP' and the first character of \fB$histchars\fP\&. +.TP +\fBurl\-globbers\fP +This style is looked up in the context `\fB:url\-quote\-magic\fP\&'\&. The values +form a list of command names that are expected to do their own globbing +on the URL string\&. This implies that they are aliased to use the +`\fBnoglob\fP\&' modifier\&. When the first word on the line matches one of the +values \fIand\fP the URL refers to a local file (see \fBurl\-local\-schema\fP), +only the \fBurl\-seps\fP characters are quoted; the \fBurl\-metas\fP are left +alone, allowing them to affect command\-line parsing, completion, etc\&. The +default values are a literal `\fBnoglob\fP\&' plus (when the \fBzsh/parameter\fP +module is available) any commands aliased to the helper function +`\fBurlglobber\fP\&' or its alias `\fBgloburl\fP'\&. +.TP +\fBurl\-local\-schema\fP +This style is always looked up in the context `\fB:urlglobber\fP\&', even +though it is used by both url\-quote\-magic and urlglobber\&. The values form +a list of URI schema that should be treated as referring to local files by +their real local path names, as opposed to files which are specified +relative to a web\-server\-defined document root\&. The defaults are +"\fBftp\fP" and "\fBfile\fP"\&. +.TP +\fBurl\-other\-schema\fP +Like \fBurl\-local\-schema\fP, but lists all other URI schema upon which +\fBurlglobber\fP and \fBurl\-quote\-magic\fP should act\&. If the URI on the +command line does not have a scheme appearing either in this list or in +\fBurl\-local\-schema\fP, it is not magically quoted\&. The default values are +"\fBhttp\fP", "\fBhttps\fP", and "\fBftp\fP"\&. When a scheme appears both here +and in \fBurl\-local\-schema\fP, it is quoted differently depending on whether +the command name appears in \fBurl\-globbers\fP\&. +.PP +Loading \fBurl\-quote\-magic\fP also defines a helper function `\fBurlglobber\fP\&' +and aliases `\fBgloburl\fP\&' to `\fBnoglob urlglobber\fP'\&. This function takes +a local URL apart, attempts to pattern\-match the local file portion of the +URL path, and then puts the results back into URL format again\&. +.RE +.TP +\fBvi\-pipe\fP +This function reads a movement command from the keyboard and then +prompts for an external command\&. The part of the buffer covered by +the movement is piped to the external command and then replaced by +the command\&'s output\&. If the movement command is bound to vi\-pipe, +the current line is used\&. +.RS +.PP +The function serves as an example for reading a vi movement command +from within a user\-defined widget\&. +.RE +.TP +\fBwhich\-command\fP +This function is a drop\-in replacement for the builtin widget +\fBwhich\-command\fP\&. It has enhanced behaviour, in that it correctly +detects whether or not the command word needs to be expanded as an +alias; if so, it continues tracing the command word from the expanded +alias until it reaches the command that will be executed\&. +.RS +.PP +The style \fBwhence\fP is available in the context \fB:zle:$WIDGET\fP; this +may be set to an array to give the command and options that will be used to +investigate the command word found\&. The default is \fBwhence \-c\fP\&. +.RE +.TP +\fBzcalc\-auto\-insert\fP +This function is useful together with the \fBzcalc\fP function described in +the section `Mathematical Functions\&'\&. +It should be bound to a key representing a binary operator such +as `\fB+\fP\&', `\fB\-\fP', `\fB*\fP' or `\fB/\fP'\&. When running in zcalc, +if the key occurs at the start of the line or immediately following +an open parenthesis, the text \fB"ans "\fP is inserted before the +representation of the key itself\&. This allows easy use of the +answer from the previous calculation in the current line\&. The +text to be inserted before the symbol typed can be modified by setting +the variable \fBZCALC_AUTO_INSERT_PREFIX\fP\&. +.RS +.PP +Hence, for example, typing `\fB+12\fP\&' followed by return adds 12 +to the previous result\&. +.PP +If zcalc is in RPN mode (\fB\-r\fP option) the effect of this binding is +automatically suppressed as operators alone on a line are meaningful\&. +.PP +When not in zcalc, the key simply inserts the symbol itself\&. +.RE +.PP +.SS "Utility Functions" +.PP +These functions are useful in constructing widgets\&. They +should be loaded with `\fBautoload \-U\fP \fIfunction\fP\&' and called +as indicated from user\-defined widgets\&. +.PP +.PD 0 +.TP +.PD +\fBsplit\-shell\-arguments\fP +This function splits the line currently being edited into shell arguments +and whitespace\&. The result is stored in the array \fBreply\fP\&. The array +contains all the parts of the line in order, starting with any whitespace +before the first argument, and finishing with any whitespace after the last +argument\&. Hence (so long as the option \fBKSH_ARRAYS\fP is not set) +whitespace is given by odd indices in the array and arguments by +even indices\&. Note that no stripping of quotes is done; joining together +all the elements of \fBreply\fP in order is guaranteed to produce the +original line\&. +.RS +.PP +The parameter \fBREPLY\fP is set to the index of the word in \fBreply\fP which +contains the character after the cursor, where the first element has index +1\&. The parameter \fBREPLY2\fP is set to the index of the character under the +cursor in that word, where the first character has index 1\&. +.PP +Hence \fBreply\fP, \fBREPLY\fP and \fBREPLY2\fP should all be made local to +the enclosing function\&. +.PP +See the function \fBmodify\-current\-argument\fP, described below, for +an example of how to call this function\&. +.RE +.TP +\fBmodify\-current\-argument\fP [ \fIexpr\-using\-\fP\fB$ARG\fP | \fIfunc\fP ] +This function provides a simple method of allowing user\-defined widgets +to modify the command line argument under the cursor (or immediately to the +left of the cursor if the cursor is between arguments)\&. +.RS +.PP +The argument can be an expression which when evaluated operates on the shell +parameter \fBARG\fP, which will have been set to the command line argument +under the cursor\&. The expression should be suitably quoted to prevent +it being evaluated too early\&. +.PP +Alternatively, if the argument does not contain the string \fBARG\fP, it +is assumed to be a shell function, to which the current command line +argument is passed as the only argument\&. The function should set the +variable \fBREPLY\fP to the new value for the command line argument\&. +If the function returns non\-zero status, so does the calling function\&. +.PP +For example, a user\-defined widget containing the following code +converts the characters in the argument under the cursor into all upper +case: +.PP +.RS +.nf +\fBmodify\-current\-argument \&'${(U)ARG}'\fP +.fi +.RE +.PP +The following strips any quoting from the current word (whether backslashes +or one of the styles of quotes), and replaces it with single quoting +throughout: +.PP +.RS +.nf +\fBmodify\-current\-argument \&'${(qq)${(Q)ARG}}'\fP +.fi +.RE +.PP +The following performs directory expansion on the command line +argument and replaces it by the absolute path: +.PP +.RS +.nf +\fBexpand\-dir() { + REPLY=${~1} + REPLY=${REPLY:a} +} +modify\-current\-argument expand\-dir\fP +.fi +.RE +.PP +In practice the function \fBexpand\-dir\fP would probably not be defined +within the widget where \fBmodify\-current\-argument\fP is called\&. +.RE +.PP +.SS "Styles" +.PP +The behavior of several of the above widgets can be controlled by the use +of the \fBzstyle\fP mechanism\&. In particular, widgets that interact with +the completion system pass along their context to any completions that +they invoke\&. +.PP +.PD 0 +.TP +.PD +\fBbreak\-keys\fP +This style is used by the \fBincremental\-complete\-word\fP widget\&. Its value +should be a pattern, and all keys matching this pattern will cause the +widget to stop incremental completion without the key having any further +effect\&. Like all styles used directly by +\fBincremental\-complete\-word\fP, this style is looked up using the +context `\fB:incremental\fP\&'\&. +.TP +\fBcompleter\fP +The \fBincremental\-complete\-word\fP and \fBinsert\-and\-predict\fP widgets set +up their top\-level context name before calling completion\&. This allows +one to define different sets of completer functions for normal completion +and for these widgets\&. For example, to use completion, approximation and +correction for normal completion, completion and correction for +incremental completion and only completion for prediction one could use: +.RS +.PP +.RS +.nf +\fBzstyle \&':completion:*' completer \e + _complete _correct _approximate +zstyle \&':completion:incremental:*' completer \e + _complete _correct +zstyle \&':completion:predict:*' completer \e + _complete\fP +.fi +.RE +.PP +It is a good idea to restrict the completers used in prediction, because +they may be automatically invoked as you type\&. The \fB_list\fP and +\fB_menu\fP completers should never be used with prediction\&. The +\fB_approximate\fP, \fB_correct\fP, \fB_expand\fP, and \fB_match\fP completers may +be used, but be aware that they may change characters anywhere in the word +behind the cursor, so you need to watch carefully that the result is what +you intended\&. +.RE +.TP +\fBcursor\fP +The \fBinsert\-and\-predict\fP widget uses this style, in the context +`\fB:predict\fP\&', to decide where to place the cursor after completion has +been tried\&. Values are: +.RS +.PP +.PD 0 +.TP +.PD +\fBcomplete\fP +The cursor is left where it was when completion finished, but only if +it is after a character equal to the one just inserted by the user\&. If +it is after another character, this value is the same as `\fBkey\fP\&'\&. +.TP +\fBkey\fP +The cursor is left +after the \fIn\fPth occurrence of the character just inserted, where +\fIn\fP is the number of times that character appeared in the word +before completion was attempted\&. In short, this has the effect of +leaving the cursor after the character just typed even if the +completion code found out that no other characters need to be inserted +at that position\&. +.PP +Any other value for this style unconditionally leaves the cursor at the +position where the completion code left it\&. +.RE +.TP +\fBlist\fP +When using the \fBincremental\-complete\-word\fP widget, this style says +if the matches should be listed on every key press (if they fit on the +screen)\&. Use the context prefix `\fB:completion:incremental\fP\&'\&. +.RS +.PP +The \fBinsert\-and\-predict\fP widget uses this style to decide if the +completion should be shown even if there is only one possible completion\&. +This is done if the value of this style is the string \fBalways\fP\&. In this +case the context is `\fB:predict\fP\&' (\fInot\fP `\fB:completion:predict\fP')\&. +.RE +.TP +\fBmatch\fP +This style is used by \fBsmart\-insert\-last\-word\fP to provide a pattern +(using full \fBEXTENDED_GLOB\fP syntax) that matches an interesting word\&. +The context is the name of the widget to which \fBsmart\-insert\-last\-word\fP +is bound (see above)\&. The default behavior of \fBsmart\-insert\-last\-word\fP +is equivalent to: +.RS +.PP +.RS +.nf +\fBzstyle :insert\-last\-word match \&'*[[:alpha:]/\e\e]*'\fP +.fi +.RE +.PP +However, you might want to include words that contain spaces: +.PP +.RS +.nf +\fBzstyle :insert\-last\-word match \&'*[[:alpha:][:space:]/\e\e]*'\fP +.fi +.RE +.PP +Or include numbers as long as the word is at least two characters long: +.PP +.RS +.nf +\fBzstyle :insert\-last\-word match \&'*([[:digit:]]?|[[:alpha:]/\e\e])*'\fP +.fi +.RE +.PP +The above example causes redirections like "2>" to be included\&. +.RE +.TP +\fBprompt\fP +The \fBincremental\-complete\-word\fP widget shows the value of this +style in the status line during incremental completion\&. The string +value may contain any of the following substrings in the manner of +the \fBPS1\fP and other prompt parameters: +.RS +.PP +.PD 0 +.TP +.PD +\fB%c\fP +Replaced by the name of the completer function that generated the +matches (without the leading underscore)\&. +.TP +\fB%l\fP +When the \fBlist\fP style is set, +replaced by `\fB\&.\&.\&.\fP\&' if the list of matches is too long to fit on the +screen and with an empty string otherwise\&. If the \fBlist\fP style is +`false\&' or not set, `\fB%l\fP' is always removed\&. +.TP +\fB%n\fP +Replaced by the number of matches generated\&. +.TP +\fB%s\fP +Replaced by `\fB\-no match\-\fP\&', `\fB\-no prefix\-\fP', or an empty string +if there is no completion matching the word on the line, if the +matches have no common prefix different from the word on the line, or +if there is such a common prefix, respectively\&. +.TP +\fB%u\fP +Replaced by the unambiguous part of all matches, if there +is any, and if it is different from the word on the line\&. +.PP +Like `\fBbreak\-keys\fP\&', this uses the `\fB:incremental\fP' context\&. +.RE +.TP +\fBstop\-keys\fP +This style is used by the \fBincremental\-complete\-word\fP widget\&. Its value +is treated similarly to the one for the \fBbreak\-keys\fP style (and uses +the same context: `\fB:incremental\fP\&')\&. However, in +this case all keys matching the pattern given as its value will stop +incremental completion and will then execute their usual function\&. +.TP +\fBtoggle\fP +This boolean style is used by \fBpredict\-on\fP and its related widgets in +the context `\fB:predict\fP\&'\&. If set to one of the standard `true' values, +predictive typing is automatically toggled off in situations where it is +unlikely to be useful, such as when editing a multi\-line buffer or after +moving into the middle of a line and then deleting a character\&. The +default is to leave prediction turned on until an explicit call to +\fBpredict\-off\fP\&. +.TP +\fBverbose\fP +This boolean style is used by \fBpredict\-on\fP and its related widgets in +the context `\fB:predict\fP\&'\&. If set to one of the standard `true' values, +these widgets display a message below the prompt when the predictive state +is toggled\&. This is most useful in combination with the \fBtoggle\fP style\&. +The default does not display these messages\&. +.TP +\fBwidget\fP +This style is similar to the \fBcommand\fP style: For widget functions that +use \fBzle\fP to call other widgets, this style can sometimes be used to +override the widget which is called\&. The context for this style is the +name of the calling widget (\fInot\fP the name of the calling function, +because one function may be bound to multiple widget names)\&. +.RS +.PP +.RS +.nf +\fBzstyle :copy\-earlier\-word widget smart\-insert\-last\-word\fP +.fi +.RE +.PP +Check the documentation for the calling widget or function to determine +whether the \fBwidget\fP style is used\&. +.RE +.PP +.SH "EXCEPTION HANDLING" +.PP +Two functions are provided to enable zsh to provide exception handling in a +form that should be familiar from other languages\&. +.PP +.PD 0 +.TP +.PD +\fBthrow\fP \fIexception\fP +The function \fBthrow\fP throws the named \fIexception\fP\&. The name is +an arbitrary string and is only used by the \fBthrow\fP and \fBcatch\fP +functions\&. An exception is for the most part treated the same as a +shell error, i\&.e\&. an unhandled exception will cause the shell to abort all +processing in a function or script and to return to the top level in an +interactive shell\&. +.TP +\fBcatch\fP \fIexception\-pattern\fP +The function \fBcatch\fP returns status zero if an exception was thrown and +the pattern \fIexception\-pattern\fP matches its name\&. Otherwise it +returns status 1\&. \fIexception\-pattern\fP is a standard +shell pattern, respecting the current setting of the \fBEXTENDED_GLOB\fP +option\&. An alias \fBcatch\fP is also defined to prevent the argument to the +function from matching filenames, so patterns may be used unquoted\&. Note +that as exceptions are not fundamentally different from other shell errors +it is possible to catch shell errors by using an empty string as the +exception name\&. The shell variable \fBCAUGHT\fP is set by \fBcatch\fP to the +name of the exception caught\&. It is possible to rethrow an exception by +calling the \fBthrow\fP function again once an exception has been caught\&. +.PP +The functions are designed to be used together with the \fBalways\fP construct +described in +\fIzshmisc\fP(1)\&. This is important as only this +construct provides the required support for exceptions\&. A typical example +is as follows\&. +.PP +.RS +.nf +\fB{ + # "try" block + # \&.\&.\&. nested code here calls "throw MyExcept" +} always { + # "always" block + if catch MyExcept; then + print "Caught exception MyExcept" + elif catch \&''; then + print "Caught a shell error\&. Propagating\&.\&.\&." + throw \&'' + fi + # Other exceptions are not handled but may be caught further + # up the call stack\&. +}\fP +.fi +.RE +.PP +If all exceptions should be caught, the following idiom might be +preferable\&. +.PP +.RS +.nf +\fB{ + # \&.\&.\&. nested code here throws an exception +} always { + if catch *; then + case $CAUGHT in + (MyExcept) + print "Caught my own exception" + ;; + (*) + print "Caught some other exception" + ;; + esac + fi +}\fP +.fi +.RE +.PP +In common with exception handling in other languages, the exception may be +thrown by code deeply nested inside the `try\&' block\&. However, note that it +must be thrown inside the current shell, not in a subshell forked for a +pipeline, parenthesised current\-shell construct, or some form of +command or process substitution\&. +.PP +The system internally uses the shell variable \fBEXCEPTION\fP to record the +name of the exception between throwing and catching\&. One drawback of this +scheme is that if the exception is not handled the variable \fBEXCEPTION\fP +remains set and may be incorrectly recognised as the name of an exception +if a shell error subsequently occurs\&. Adding \fBunset EXCEPTION\fP at the +start of the outermost layer of any code that uses exception handling will +eliminate this problem\&. +.PP +.SH "MIME FUNCTIONS" +.PP +Three functions are available to provide handling of files recognised by +extension, for example to dispatch a file \fBtext\&.ps\fP when executed as a +command to an appropriate viewer\&. +.PP +.PD 0 +.TP +.PD 0 +\fBzsh\-mime\-setup\fP [ \fB\-fv\fP ] [ \fB\-l\fP [ \fIsuffix\fP \&.\&.\&. ] ] +.TP +.PD +\fBzsh\-mime\-handler\fP [ \fB\-l\fP ] \fIcommand argument\fP \&.\&.\&. +These two functions use the files \fB~/\&.mime\&.types\fP and \fB/etc/mime\&.types\fP, +which associate types and extensions, as well as \fB~/\&.mailcap\fP and +\fB/etc/mailcap\fP files, which associate types and the programs that +handle them\&. These are provided on many systems with the Multimedia +Internet Mail Extensions\&. +.RS +.PP +To enable the system, the function \fBzsh\-mime\-setup\fP should be +autoloaded and run\&. This allows files with extensions to be treated +as executable; such files be completed by the function completion system\&. +The function \fBzsh\-mime\-handler\fP should not need to be called by the +user\&. +.PP +The system works by setting up suffix aliases with `\fBalias \-s\fP\&'\&. +Suffix aliases already installed by the user will not be overwritten\&. +.PP +For suffixes defined in lower case, upper case variants will also +automatically be handled (e\&.g\&. \fBPDF\fP is automatically handled if +handling for the suffix \fBpdf\fP is defined), but not vice versa\&. +.PP +Repeated calls to \fBzsh\-mime\-setup\fP do not override the existing +mapping between suffixes and executable files unless the option \fB\-f\fP +is given\&. Note, however, that this does not override existing suffix +aliases assigned to handlers other than \fBzsh\-mime\-handler\fP\&. +.PP +Calling \fBzsh\-mime\-setup\fP with the option \fB\-l\fP lists the existing +mappings without altering them\&. Suffixes to list (which may contain +pattern characters that should be quoted from immediate interpretation +on the command line) may be given as additional arguments, otherwise +all suffixes are listed\&. +.PP +Calling \fBzsh\-mime\-setup\fP with the option +\fB\-v\fP causes verbose output to be shown during the setup operation\&. +.PP +The system respects the \fBmailcap\fP flags \fBneedsterminal\fP and +\fBcopiousoutput\fP; see \fImailcap\fP(4) or \fImailcap\fP(5) +(the man page\&'s name varies across platforms)\&. +.PP +The functions use the following styles, which are defined with the +\fBzstyle\fP builtin command (see \fIzshmodules\fP(1))\&. They should be defined +before \fBzsh\-mime\-setup\fP is run\&. The contexts used all +start with \fB:mime:\fP, with additional components in some cases\&. +It is recommended that a trailing \fB*\fP (suitably quoted) be appended +to style patterns in case the system is extended in future\&. Some +examples are given below\&. +.PP +For files that have multiple suffixes, e\&.g\&. \fB\&.pdf\&.gz\fP, where the +context includes the suffix it will be looked up starting with the +longest possible suffix until a match for the style is found\&. +For example, if \fB\&.pdf\&.gz\fP produces a match for the handler, that +will be used; otherwise the handler for \fB\&.gz\fP will be used\&. Note +that, owing to the way suffix aliases work, it is always required that +there be a handler for the shortest possible suffix, so in this example +\fB\&.pdf\&.gz\fP can only be handled if \fB\&.gz\fP is also handled (though +not necessarily in the same way)\&. Alternatively, if no handling +for \fB\&.gz\fP on its own is needed, simply adding the command +.PP +.RS +.nf +\fBalias \-s gz=zsh\-mime\-handler\fP +.fi +.RE +.PP +to the initialisation code is sufficient; \fB\&.gz\fP will not be handled +on its own, but may be in combination with other suffixes\&. +.PP +.PD 0 +.TP +.PD +\fBcurrent\-shell\fP +If this boolean style is true, the mailcap handler for the context in +question is run using the \fBeval\fP builtin instead of by starting a new +\fBsh\fP process\&. This is more efficient, but may not work in the occasional +cases where the mailcap handler uses strict POSIX syntax\&. +.TP +\fBdisown\fP +If this boolean style is true, mailcap handlers started in the +background will be disowned, i\&.e\&. not subject to job control within +the parent shell\&. Such handlers nearly always produce their own +windows, so the only likely harmful side effect of setting the style is +that it becomes harder to kill jobs from within the shell\&. +.TP +\fBexecute\-as\-is\fP +This style gives a list of patterns to be matched against files +passed for execution with a handler program\&. If the file matches +the pattern, the entire command line is executed in its current form, +with no handler\&. This is useful for files which might have suffixes +but nonetheless be executable in their own right\&. If the style +is not set, the pattern \fB*(*) *(/)\fP is used; +hence executable files are executed directly and not passed to a +handler, and the option \fBAUTO_CD\fP may be used to change to directories +that happen to have MIME suffixes\&. +.TP +\fBexecute\-never\fP +This style is useful in combination with \fBexecute\-as\-is\fP\&. It is +set to an array of patterns corresponding to full paths to files that +should never be treated as executable, even if the file passed to +the MIME handler matches \fBexecute\-as\-is\fP\&. This is useful for file +systems that don\&'t handle execute permission or that contain executables +from another operating system\&. For example, if \fB/mnt/windows\fP is a +Windows mount, then +.RS +.PP +.RS +.nf +\fBzstyle \&':mime:*' execute\-never '/mnt/windows/*'\fP +.fi +.RE +.PP +will ensure that any files found in that area will be executed as MIME +types even if they are executable\&. As this example shows, the complete +file name is matched against the pattern, regardless of how the file +was passed to the handler\&. The file is resolved to a full path using +the \fB:P\fP modifier described in +the subsection `Modifiers\&' in \fIzshexpn\fP(1); +this means that symbolic links are resolved where possible, so that +links into other file systems behave in the correct fashion\&. +.RE +.TP +\fBfile\-path\fP +Used if the style \fBfind\-file\-in\-path\fP is true for the same context\&. +Set to an array of directories that are used for searching for the +file to be handled; the default is the command path given by the +special parameter \fBpath\fP\&. The shell option \fBPATH_DIRS\fP is respected; +if that is set, the appropriate path will be searched even if the +name of the file to be handled as it appears on the command line contains +a `\fB/\fP\&'\&. +The full context is \fB:mime:\&.\fP\fIsuffix\fP\fB:\fP, as described for the style +\fBhandler\fP\&. +.TP +\fBfind\-file\-in\-path\fP +If set, allows files whose names do not contain absolute paths +to be searched for in the command path or the path specified by the +\fBfile\-path\fP style\&. If the file is not found in the path, it is looked +for locally (whether or not the current directory is in the path); if it is +not found locally, the handler will abort unless the \fBhandle\-nonexistent\fP +style is set\&. Files found in the path are tested as described for +the style \fBexecute\-as\-is\fP\&. +The full context is \fB:mime:\&.\fP\fIsuffix\fP\fB:\fP, as described for the style +\fBhandler\fP\&. +.TP +\fBflags\fP +Defines flags to go with a handler; the context is as for the +\fBhandler\fP style, and the format is as for the flags in \fBmailcap\fP\&. +.TP +\fBhandle\-nonexistent\fP +By default, arguments that don\&'t correspond to files are not passed +to the MIME handler in order to prevent it from intercepting commands found +in the path that happen to have suffixes\&. This style may be set to +an array of extended glob patterns for arguments that will be passed to the +handler even if they don\&'t exist\&. If it is not explicitly set it +defaults to \fB[[:alpha:]]#:/*\fP which allows URLs to be passed to the MIME +handler even though they don\&'t exist in that format in the file system\&. +The full context is \fB:mime:\&.\fP\fIsuffix\fP\fB:\fP, as described for the style +\fBhandler\fP\&. +.TP +\fBhandler\fP +Specifies a handler for a suffix; the suffix is given by the context as +\fB:mime:\&.\fP\fIsuffix\fP\fB:\fP, and the format of the handler is exactly +that in \fBmailcap\fP\&. Note in particular the `\fB\&.\fP\&' and trailing colon +to distinguish this use of the context\&. This overrides any handler +specified by the \fBmailcap\fP files\&. If the handler requires a terminal, +the \fBflags\fP style should be set to include the word \fBneedsterminal\fP, +or if the output is to be displayed through a pager (but not if the +handler is itself a pager), it should include \fBcopiousoutput\fP\&. +.TP +\fBmailcap\fP +A list of files in the format of \fB~/\&.mailcap\fP and +\fB/etc/mailcap\fP to be read during setup, replacing the default list +which consists of those two files\&. The context is \fB:mime:\fP\&. +A \fB+\fP in the list will be replaced by the default files\&. +.TP +\fBmailcap\-priorities\fP +This style is used to resolve multiple mailcap entries for the same MIME +type\&. It consists of an array of the following elements, in descending +order of priority; later entries will be used if earlier entries are +unable to resolve the entries being compared\&. If none of the tests +resolve the entries, the first entry encountered is retained\&. +.RS +.PP +.PD 0 +.TP +.PD +\fBfiles\fP +The order of files (entries in the \fBmailcap\fP style) read\&. Earlier +files are preferred\&. (Note this does not resolve entries in the same file\&.) +.TP +\fBpriority\fP +The priority flag from the mailcap entry\&. The priority is an integer +from 0 to 9 with the default value being 5\&. +.TP +\fBflags\fP +The test given by the \fBmailcap\-prio\-flags\fP option is used to resolve +entries\&. +.TP +\fBplace\fP +Later entries are preferred; as the entries are strictly ordered, this +test always succeeds\&. +.PP +Note that as this style is handled during initialisation, the context +is always \fB:mime:\fP, with no discrimination by suffix\&. +.RE +.TP +\fBmailcap\-prio\-flags\fP +This style is used when the keyword \fBflags\fP is encountered in the +list of tests specified by the \fBmailcap\-priorities\fP style\&. +It should be set to a list of patterns, each of which is tested against +the flags specified in the mailcap entry (in other words, the sets of +assignments found with some entries in the mailcap file)\&. Earlier +patterns in the list are preferred to later ones, and matched patterns +are preferred to unmatched ones\&. +.TP +\fBmime\-types\fP +A list of files in the format of \fB~/\&.mime\&.types\fP and +\fB/etc/mime\&.types\fP to be read during setup, replacing the default list +which consists of those two files\&. The context is \fB:mime:\fP\&. +A \fB+\fP in the list will be replaced by the default files\&. +.TP +\fBnever\-background\fP +If this boolean style is set, the handler for the given context is +always run in the foreground, even if the flags provided in the mailcap +entry suggest it need not be (for example, it doesn\&'t require a +terminal)\&. +.TP +\fBpager\fP +If set, will be used instead of \fB$PAGER\fP or \fBmore\fP to handle +suffixes where the \fBcopiousoutput\fP flag is set\&. The context is +as for \fBhandler\fP, i\&.e\&. \fB:mime:\&.\fP\fIsuffix\fP\fB:\fP for handling +a file with the given \fIsuffix\fP\&. +.PP +Examples: +.PP +.RS +.nf +\fBzstyle \&':mime:*' mailcap ~/\&.mailcap /usr/local/etc/mailcap +zstyle \&':mime:\&.txt:' handler less %s +zstyle \&':mime:\&.txt:' flags needsterminal\fP +.fi +.RE +.PP +When \fBzsh\-mime\-setup\fP is subsequently run, it will look for +\fBmailcap\fP entries in the two files given\&. Files of suffix \fB\&.txt\fP +will be handled by running `\fBless\fP \fIfile\&.txt\fP\&'\&. The flag +\fBneedsterminal\fP is set to show that this program must run attached to a +terminal\&. +.PP +As there are several steps to dispatching a command, the following +should be checked if attempting to execute a file by extension +\fB\&.\fP\fIext\fP does not have the expected effect\&. +.PP +The command `\fBalias \-s\fP \fIext\fP\&' should show +`\fBps=zsh\-mime\-handler\fP\&'\&. If it shows something else, another suffix +alias was already installed and was not overwritten\&. If it shows +nothing, no handler was installed: this is most likely because no +handler was found in the \fB\&.mime\&.types\fP and \fBmailcap\fP combination for +\fB\&.ext\fP files\&. In that case, appropriate handling should be added to +\fB~/\&.mime\&.types\fP and \fBmailcap\fP\&. +.PP +If the extension is handled by \fBzsh\-mime\-handler\fP but the file is +not opened correctly, either the handler defined for the type is +incorrect, or the flags associated with it are in appropriate\&. Running +\fBzsh\-mime\-setup \-l\fP will show the handler and, if there are any, the +flags\&. A \fB%s\fP in the handler is replaced by the file (suitably quoted +if necessary)\&. Check that the handler program listed lists and can +be run in the way shown\&. Also check that the flags \fBneedsterminal\fP or +\fBcopiousoutput\fP are set if the handler needs to be run under a +terminal; the second flag is used if the output should be sent to a pager\&. +An example of a suitable \fBmailcap\fP entry for such a program is: +.PP +.RS +.nf +\fBtext/html; /usr/bin/lynx \&'%s'; needsterminal\fP +.fi +.RE +.PP +Running `\fBzsh\-mime\-handler \-l\fP \fIcommand line\fP\&' prints the command +line that would be executed, simplified to remove the effect of any +flags, and quoted so that the output can be run as a complete zsh +command line\&. This is used by the completion system to decide how to +complete after a file handled by \fBzsh\-mime\-setup\fP\&. +.RE +.TP +\fBpick\-web\-browser\fP +This function is separate from the two MIME functions described above +and can be assigned directly to a suffix: +.RS +.PP +.RS +.nf +\fBautoload \-U pick\-web\-browser +alias \-s html=pick\-web\-browser\fP +.fi +.RE +.PP +It is provided as an intelligent front end to dispatch a web browser\&. +It may be run as either a function or a shell script\&. The status +255 is returned if no browser could be started\&. +.PP +Various styles are available to customize the choice of browsers: +.PP +.PD 0 +.TP +.PD +\fBbrowser\-style\fP +The value of the style is an array giving preferences in decreasing order +for the type of browser to use\&. The values of elements may be +.RS +.PP +.PD 0 +.TP +.PD +\fBrunning\fP +Use a GUI browser that is already running when an X Window display is +available\&. The browsers listed in the \fBx\-browsers\fP style are tried +in order until one is found; if it is, the file will be displayed in +that browser, so the user may need to check whether it has appeared\&. +If no running browser is found, one is not started\&. Browsers other than +Firefox, Opera and Konqueror are assumed to understand the Mozilla +syntax for opening a URL remotely\&. +.TP +\fBx\fP +Start a new GUI browser when an X Window display is available\&. Search for +the availability of one of the browsers listed in the \fBx\-browsers\fP style +and start the first one that is found\&. No check is made for an already +running browser\&. +.TP +\fBtty\fP +Start a terminal\-based browser\&. Search for the availability of one +of the browsers listed in the \fBtty\-browsers\fP style and start the +first one that is found\&. +.PP +If the style is not set the default \fBrunning x tty\fP is used\&. +.RE +.TP +\fBx\-browsers\fP +An array in decreasing order +of preference of browsers to use when running under the X Window System\&. +The array consists of the command name under which to start the +browser\&. They are looked up in the context \fB:mime:\fP (which may +be extended in future, so appending `\fB*\fP\&' is recommended)\&. For +example, +.RS +.PP +.RS +.nf +\fBzstyle \&':mime:*' x\-browsers opera konqueror firefox\fP +.fi +.RE +.PP +specifies that \fBpick\-web\-browser\fP should first look for a running +instance of Opera, Konqueror or Firefox, in that order, and if it +fails to find any should attempt to start Opera\&. The default is +\fBfirefox mozilla netscape opera konqueror\fP\&. +.RE +.TP +\fBtty\-browsers\fP +An array similar to \fBx\-browsers\fP, except that it gives browsers to +use when no X Window display is available\&. The default is +\fBelinks links lynx\fP\&. +.TP +\fBcommand\fP +If it is set this style is used to pick the command +used to open a page for a browser\&. The context is +\fB:mime:browser:new:$browser:\fP to start a new browser or +\fB:mime:browser:running:$browser:\fP to open a URL in a browser already +running on the current X display, where \fB$browser\fP is the value matched +in the \fBx\-browsers\fP or \fBtty\-browsers\fP style\&. The escape sequence +\fB%b\fP in the style\&'s value will be replaced by the browser, while \fB%u\fP +will be replaced by the URL\&. If the style is not set, the default for all +new instances is equivalent to \fB%b %u\fP and the defaults for using running +browsers are equivalent to the values \fBkfmclient openURL %u\fP for +Konqueror, \fBfirefox \-new\-tab %u\fP for Firefox, \fBopera \-newpage %u\fP +for Opera, and \fB%b \-remote "openUrl(%u)"\fP for all others\&. +.RE +.PP +.SH "MATHEMATICAL FUNCTIONS" +.PP +.PD 0 +.TP +.PD +\fBzcalc\fP [ \fB\-erf\fP ] [ \fIexpression\fP \&.\&.\&. ] +A reasonably powerful calculator based on zsh\&'s arithmetic evaluation +facility\&. The syntax is similar to that of formulae in most programming +languages; see +the section `Arithmetic Evaluation\&' in \fIzshmisc\fP(1) for details\&. +.RS +.PP +Non\-programmers should note that, as in many other programming +languages, expressions involving only integers (whether constants +without a `\fB\&.\fP\&', variables containing such constants as strings, or +variables declared to be integers) are by default evaluated using +integer arithmetic, which is not how an ordinary desk calculator +operates\&. To force floating point operation, pass the option \fB\-f\fP; +see further notes below\&. +.PP +If the file \fB~/\&.zcalcrc\fP exists it will be sourced inside the function +once it is set up and about to process the command line\&. This +can be used, for example, to set shell options; \fBemulate \-L zsh\fP +and \fBsetopt extendedglob\fP are in effect at this point\&. Any +failure to source the file if it exists is treated as fatal\&. +As with other initialisation files, the directory \fB$ZDOTDIR\fP is used +instead of \fB$HOME\fP if it is set\&. +.PP +The mathematical library \fBzsh/mathfunc\fP will be loaded if it is +available; see +the section `The zsh/mathfunc Module\&' in \fIzshmodules\fP(1)\&. The mathematical functions +correspond to the raw system libraries, so trigonometric functions are +evaluated using radians, and so on\&. +.PP +Each line typed is evaluated as an expression\&. The prompt shows a number, +which corresponds to a positional parameter where the result of that +calculation is stored\&. For example, the result of the calculation on the +line preceded by `\fB4> \fP\&' is available as \fB$4\fP\&. The last value +calculated is available as \fBans\fP\&. Full command line editing, including +the history of previous calculations, is available; the history is saved in +the file \fB~/\&.zcalc_history\fP\&. To exit, enter a blank line or type `\fB:q\fP\&' +on its own (`\fBq\fP\&' is allowed for historical compatibility)\&. +.PP +A line ending with a single backslash is treated in the same fashion +as it is in command line editing: the backslash is removed, the +function prompts for more input (the prompt is preceded by `\fB\&.\&.\&.\fP\&' +to indicate this), and the lines are combined into one to get the final +result\&. In addition, if the input so far contains more open than +close parentheses \fBzcalc\fP will prompt for more input\&. +.PP +If arguments are given to \fBzcalc\fP on start up, they are used to prime the +first few positional parameters\&. A visual indication of this is given when +the calculator starts\&. +.PP +The constants \fBPI\fP (3\&.14159\&.\&.\&.) and \fBE\fP (2\&.71828\&.\&.\&.) are provided\&. +Parameter assignment is possible, but note that all parameters will be +put into the global namespace unless the \fB:local\fP special command is +used\&. The function creates local variables whose names start with +\fB_\fP, so users should avoid doing so\&. The variables \fBans\fP (the last +answer) and \fBstack\fP (the stack in RPN mode) may be referred to +directly; \fBstack\fP is an array but elements of it are numeric\&. Various +other special variables are used locally with their standard meaning, +for example \fBcompcontext\fP, \fBmatch\fP, \fBmbegin\fP, \fBmend\fP, \fBpsvar\fP\&. +.PP +The output base can be initialised by passing the option `\fB\-#\fP\fIbase\fP\&', +for example `\fBzcalc \-#16\fP\&' (the `\fB#\fP' may have to be quoted, depending +on the globbing options set)\&. +.PP +If the option `\fB\-e\fP\&' is set, the function runs non\-interactively: +the arguments are treated as expressions to be evaluated as if entered +interactively line by line\&. +.PP +If the option `\fB\-f\fP\&' is set, all numbers are treated as floating +point, hence for example the expression `\fB3/4\fP\&' evaluates to 0\&.75 +rather than 0\&. Options must appear in separate words\&. +.PP +If the option `\fB\-r\fP\&' is set, RPN (Reverse Polish Notation) mode is +entered\&. This has various additional properties: +.PD 0 +.TP +.PD +Stack +Evaluated values are maintained in a stack; this is contained in +an array named \fBstack\fP with the most recent value in \fB${stack[1]}\fP\&. +.TP +Operators and functions +If the line entered matches an operator (\fB+\fP, \fB\-\fP, \fB*\fP, +\fB/\fP, \fB**\fP, \fB^\fP, \fB|\fP or \fB&\fP) or a function supplied by the +\fBzsh/mathfunc\fP library, the bottom element or elements of the stack +are popped to use as the argument or arguments\&. The higher elements +of stack (least recent) are used as earlier arguments\&. The result is +then pushed into \fB${stack[1]}\fP\&. +.TP +Expressions +Other expressions are evaluated normally, printed, and added to the +stack as numeric values\&. The syntax within expressions on a single line +is normal shell arithmetic (not RPN)\&. +.TP +Stack listing +If an integer follows the option \fB\-r\fP with no space, then +on every evaluation that many elements of the stack, where available, +are printed instead of just the most recent result\&. Hence, for example, +\fBzcalc \-r4\fP shows \fB$stack[4]\fP to \fB$stack[1]\fP each time results +are printed\&. +.TP +Duplication: \fB=\fP +The pseudo\-operator \fB=\fP causes the most recent element of +the stack to be duplicated onto the stack\&. +.TP +\fBpop\fP +The pseudo\-function \fBpop\fP causes the most recent element of +the stack to be popped\&. A `\fB>\fP\&' on its own has the same effect\&. +.TP +\fB>\fP\fIident\fP +The expression \fB>\fP followed (with no space) by a shell identifier +causes the most recent element of the stack to be popped and +assigned to the variable with that name\&. The variable is +local to the \fBzcalc\fP function\&. +.TP +\fB<\fP\fIident\fP +The expression \fB<\fP followed (with no space) by a shell identifier +causes the value of the variable with that name to be pushed +onto the stack\&. \fIident\fP may be an integer, in which +case the previous result with that number (as shown before +the \fB>\fP in the standard \fBzcalc\fP prompt) is put on the stack\&. +.TP +Exchange: \fBxy\fP +The pseudo\-function \fBxy\fP causes the most recent two elements of +the stack to be exchanged\&. `\fB<>\fP\&' has the same effect\&. +.PP +The prompt is configurable via the parameter \fBZCALCPROMPT\fP, which +undergoes standard prompt expansion\&. The index of the current entry is +stored locally in the first element of the array \fBpsvar\fP, which can be +referred to in \fBZCALCPROMPT\fP as `\fB%1v\fP\&'\&. The default prompt is +`\fB%1v> \fP\&'\&. +.PP +The variable \fBZCALC_ACTIVE\fP is set within the function and can +be tested by nested functions; it has the value \fBrpn\fP if RPN mode is +active, else 1\&. +.PP +A few special commands are available; these are introduced by a colon\&. +For backward compatibility, the colon may be omitted for certain +commands\&. Completion is available if \fBcompinit\fP has been run\&. +.PP +The output precision may be specified within zcalc by special commands +familiar from many calculators\&. +.PD 0 +.TP +.PD +\fB:norm\fP +The default output format\&. It corresponds to the printf \fB%g\fP +specification\&. Typically this shows six decimal digits\&. +.TP +\fB:sci\fP \fIdigits\fP +Scientific notation, corresponding to the printf \fB%g\fP output format with +the precision given by \fIdigits\fP\&. This produces either fixed point or +exponential notation depending on the value output\&. +.TP +\fB:fix\fP \fIdigits\fP +Fixed point notation, corresponding to the printf \fB%f\fP output format with +the precision given by \fIdigits\fP\&. +.TP +\fB:eng\fP \fIdigits\fP +Exponential notation, corresponding to the printf \fB%E\fP output format with +the precision given by \fIdigits\fP\&. +.TP +\fB:raw\fP +Raw output: this is the default form of the output from a math +evaluation\&. This may show more precision than the number actually +possesses\&. +.PP +Other special commands: +.PD 0 +.TP +.PD +\fB:!\fP\fIline\&.\&.\&.\fP +Execute \fIline\&.\&.\&.\fP as a normal shell command line\&. Note that it +is executed in the context of the function, i\&.e\&. with local variables\&. +Space is optional after \fB:!\fP\&. +.TP +\fB:local\fP \fIarg\fP \&.\&.\&. +Declare variables local to the function\&. Other variables +may be used, too, but they will be taken from or put into the global +scope\&. +.TP +\fB:function\fP \fIname\fP [ \fIbody\fP ] +Define a mathematical function or (with no \fIbody\fP) delete it\&. +\fB:function\fP may be abbreviated to \fB:func\fP or simply \fB:f\fP\&. +The \fIname\fP may contain the same characters as a shell function name\&. +The function is defined using \fBzmathfuncdef\fP, see below\&. +.RS +.PP +Note that \fBzcalc\fP takes care of all quoting\&. Hence for example: +.PP +.RS +.nf +\fB:f cube $1 * $1 * $1\fP +.fi +.RE +.PP +defines a function to cube the sole argument\&. Functions so defined, or +indeed any functions defined directly or indirectly using \fBfunctions +\-M\fP, are available to execute by typing only the name on the line in RPN +mode; this pops the appropriate number of arguments off the stack +to pass to the function, i\&.e\&. 1 in the case of the example \fBcube\fP +function\&. If there are optional arguments only the mandatory +arguments are supplied by this means\&. +.RE +.TP +\fB[#\fP\fIbase\fP\fB]\fP +This is not a special command, rather part of normal arithmetic +syntax; however, when this form appears on a line by itself the default +output radix is set to \fIbase\fP\&. Use, for example, `\fB[#16]\fP\&' to display +hexadecimal output preceded by an indication of the base, or `\fB[##16]\fP\&' +just to display the raw number in the given base\&. Bases themselves are +always specified in decimal\&. `\fB[#]\fP\&' restores the normal output format\&. +Note that setting an output base suppresses floating point output; use +`\fB[#]\fP\&' to return to normal operation\&. +.TP +\fB$\fP\fIvar\fP +Print out the value of var literally; does not affect the calculation\&. +To use the value of var, omit the leading `\fB$\fP\&'\&. +.PP +See the comments in the function for a few extra tips\&. +.RE +.TP +.PD 0 +\fBmin(\fP\fIarg\fP\fB, \&.\&.\&.)\fP +.TP +.PD 0 +\fBmax(\fP\fIarg\fP\fB, \&.\&.\&.)\fP +.TP +.PD 0 +\fBsum(\fP\fIarg\fP\fB, \&.\&.\&.)\fP +.TP +.PD +\fBzmathfunc\fP +The function \fBzmathfunc\fP defines the three mathematical functions +\fBmin\fP, \fBmax\fP, and \fBsum\fP\&. The functions \fBmin\fP and \fBmax\fP take +one or more arguments\&. The function \fBsum\fP takes zero or more arguments\&. +Arguments can be of different types (ints and floats)\&. +.RS +.PP +Not to be confused with the \fBzsh/mathfunc\fP module, described in +the section `The zsh/mathfunc Module\&' in \fIzshmodules\fP(1)\&. +.RE +.TP +\fBzmathfuncdef\fP [ \fImathfunc\fP [ \fIbody\fP ] ] +A convenient front end to \fBfunctions \-M\fP\&. +.RS +.PP +With two arguments, define a mathematical function named \fImathfunc\fP +which can be used in any form of arithmetic evaluation\&. \fIbody\fP +is a mathematical expression to implement the function\&. It may +contain references to position parameters \fB$1\fP, \fB$2\fP, \&.\&.\&. +to refer to mandatory parameters and \fB${1:\-\fP\fIdefvalue\fP\fB}\fP \&.\&.\&. +to refer to optional parameters\&. Note that the forms must be +strictly adhered to for the function to calculate the correct number +of arguments\&. The implementation is held in a shell function named +\fBzsh_math_func_\fP\fImathfunc\fP; usually the user will not need +to refer to the shell function directly\&. Any existing function +of the same name is silently replaced\&. +.PP +With one argument, remove the mathematical function \fImathfunc\fP +as well as the shell function implementation\&. +.PP +With no arguments, list all \fImathfunc\fP functions in a form +suitable for restoring the definition\&. +The functions have not necessarily been defined by \fBzmathfuncdef\fP\&. +.RE +.PP +.SH "USER CONFIGURATION FUNCTIONS" +.PP +The \fBzsh/newuser\fP module comes with a function to aid in configuring +shell options for new users\&. If the module is installed, this function can +also be run by hand\&. It is available even if the module\&'s default +behaviour, namely running the function for a new user logging in without +startup files, is inhibited\&. +.PP +.PD 0 +.TP +.PD +\fBzsh\-newuser\-install\fP [ \fB\-f\fP ] +The function presents the user with various options for customizing +their initialization scripts\&. Currently only \fB~/\&.zshrc\fP is handled\&. +\fB$ZDOTDIR/\&.zshrc\fP is used instead if the parameter \fBZDOTDIR\fP is +set; this provides a way for the user to configure a file without +altering an existing \fB\&.zshrc\fP\&. +.RS +.PP +By default the function exits immediately if it finds any of the files +\fB\&.zshenv\fP, \fB\&.zprofile\fP, \fB\&.zshrc\fP, or \fB\&.zlogin\fP in the appropriate +directory\&. The option \fB\-f\fP is required in order to force the function +to continue\&. Note this may happen even if \fB\&.zshrc\fP itself does not +exist\&. +.PP +As currently configured, the function will exit immediately if the +user has root privileges; this behaviour cannot be overridden\&. +.PP +Once activated, the function\&'s behaviour is supposed to be +self\-explanatory\&. Menus are present allowing the user to alter +the value of options and parameters\&. Suggestions for improvements are +always welcome\&. +.PP +When the script exits, the user is given the opportunity to save the new +file or not; changes are not irreversible until this point\&. However, +the script is careful to restrict changes to the file only to a group +marked by the lines `\fB# Lines configured by zsh\-newuser\-install\fP\&' and +`\fB# End of lines configured by zsh\-newuser\-install\fP\&'\&. In addition, +the old version of \fB\&.zshrc\fP is saved to a file with the suffix +\fB\&.zni\fP appended\&. +.PP +If the function edits an existing \fB\&.zshrc\fP, it is up to the user +to ensure that the changes made will take effect\&. For example, if +control usually returns early from the existing \fB\&.zshrc\fP the lines +will not be executed; or a later initialization file may override +options or parameters, and so on\&. The function itself does not attempt to +detect any such conflicts\&. +.RE +.PP +.SH "OTHER FUNCTIONS" +.PP +There are a large number of helpful functions in the \fBFunctions/Misc\fP +directory of the zsh distribution\&. Most are very simple and do not +require documentation here, but a few are worthy of special mention\&. +.PP +.SS "Descriptions" +.PP +.PD 0 +.TP +.PD +\fBcolors\fP +This function initializes several associative arrays to map color names to +(and from) the ANSI standard eight\-color terminal codes\&. These are used +by the prompt theme system (see above)\&. You seldom should need to run +\fBcolors\fP more than once\&. +.RS +.PP +The eight base colors are: \fBblack\fP, \fBred\fP, \fBgreen\fP, \fByellow\fP, +\fBblue\fP, \fBmagenta\fP, \fBcyan\fP, and \fBwhite\fP\&. Each of these has codes for +foreground and background\&. In addition there are seven intensity attributes: +\fBbold\fP, \fBfaint\fP, \fBstandout\fP, \fBunderline\fP, \fBblink\fP, \fBreverse\fP, +and \fBconceal\fP\&. Finally, there are seven codes used to negate attributes: +\fBnone\fP (reset all attributes to the defaults), \fBnormal\fP +(neither bold nor faint), \fBno\-standout\fP, \fBno\-underline\fP, \fBno\-blink\fP, +\fBno\-reverse\fP, and \fBno\-conceal\fP\&. +.PP +Some terminals do not support all combinations of colors and intensities\&. +.PP +The associative arrays are: +.PP +.PD 0 +.TP +.PD 0 +\fBcolor\fP +.TP +.PD +\fBcolour\fP +Map all the color names to their integer codes, and integer codes to the +color names\&. The eight base names map to the foreground color codes, as +do names prefixed with `\fBfg\-\fP\&', such as `\fBfg\-red\fP'\&. Names prefixed +with `\fBbg\-\fP\&', such as `\fBbg\-blue\fP', refer to the background codes\&. The +reverse mapping from code to color yields base name for foreground codes +and the \fBbg\-\fP form for backgrounds\&. +.RS +.PP +Although it is a misnomer to call them `colors\&', these arrays also map the +other fourteen attributes from names to codes and codes to names\&. +.RE +.TP +.PD 0 +\fBfg\fP +.TP +.PD 0 +\fBfg_bold\fP +.TP +.PD +\fBfg_no_bold\fP +Map the eight basic color names to ANSI terminal escape sequences that set +the corresponding foreground text properties\&. The \fBfg\fP sequences change +the color without changing the eight intensity attributes\&. +.TP +.PD 0 +\fBbg\fP +.TP +.PD 0 +\fBbg_bold\fP +.TP +.PD +\fBbg_no_bold\fP +Map the eight basic color names to ANSI terminal escape sequences that set +the corresponding background properties\&. The \fBbg\fP sequences change the +color without changing the eight intensity attributes\&. +.PP +In addition, the scalar parameters \fBreset_color\fP and \fBbold_color\fP are +set to the ANSI terminal escapes that turn off all attributes and turn on +bold intensity, respectively\&. +.RE +.TP +\fBfned\fP [ \fB\-x\fP \fInum\fP ] \fIname\fP +Same as \fBzed \-f\fP\&. This function does not appear in the zsh +distribution, but can be created by linking \fBzed\fP to the name \fBfned\fP +in some directory in your \fBfpath\fP\&. +.TP +\fBhisted\fP [ [ \fIname\fP ] \fIsize\fP ] +Same as \fBzed \-h\fP\&. This function does not appear in the zsh +distribution, but can be created by linking \fBzed\fP to the name \fBhisted\fP +in some directory in your \fBfpath\fP\&. +.TP +\fBis\-at\-least\fP \fIneeded\fP [ \fIpresent\fP ] +Perform a greater\-than\-or\-equal\-to comparison of two strings having the +format of a zsh version number; that is, a string of numbers and text with +segments separated by dots or dashes\&. If the \fIpresent\fP string is not +provided, \fB$ZSH_VERSION\fP is used\&. Segments are paired left\-to\-right in +the two strings with leading non\-number parts ignored\&. If one string has +fewer segments than the other, the missing segments are considered zero\&. +.RS +.PP +This is useful in startup files to set options and other state that are +not available in all versions of zsh\&. +.PP +.RS +.nf +\fBis\-at\-least 3\&.1\&.6\-15 && setopt NO_GLOBAL_RCS +is\-at\-least 3\&.1\&.0 && setopt HIST_REDUCE_BLANKS +is\-at\-least 2\&.6\-17 || print "You can\&'t use is\-at\-least here\&."\fP +.fi +.RE +.RE +.TP +\fBnslookup\fP [ \fIarg\fP \&.\&.\&. ] +This wrapper function for the \fBnslookup\fP command requires the +\fBzsh/zpty\fP module (see +\fIzshmodules\fP(1))\&. It behaves exactly like the standard \fBnslookup\fP +except that it provides customizable prompts (including a right\-side +prompt) and completion of nslookup commands, host names, etc\&. (if you use +the function\-based completion system)\&. Completion styles may be set with +the context prefix `\fB:completion:nslookup\fP\&'\&. +.RS +.PP +See also the \fBpager\fP, \fBprompt\fP and \fBrprompt\fP styles below\&. +.RE +.TP +\fBregexp\-replace\fP \fIvar\fP \fIregexp\fP \fIreplace\fP +Use regular expressions to perform a global search and replace operation +on a variable\&. POSIX extended regular expressions (ERE) are used, +unless the option \fBRE_MATCH_PCRE\fP has been set, in which case +Perl\-compatible regular expressions are used +(this requires the shell to be linked against the \fBpcre\fP +library)\&. +.RS +.PP +\fIvar\fP is the name of the variable containing the string to be matched\&. +The variable will be modified directly by the function\&. The +variables \fBMATCH\fP, \fBMBEGIN\fP, \fBMEND\fP, \fBmatch\fP, \fBmbegin\fP, \fBmend\fP +should be avoided as these are used by the regular expression code\&. +.PP +\fIregexp\fP is the regular expression to match against the string\&. +.PP +\fIreplace\fP is the replacement text\&. This can contain parameter, command +and arithmetic expressions which will be replaced: in particular, a +reference to \fB$MATCH\fP will be replaced by the text matched by the pattern\&. +.PP +The return status is 0 if at least one match was performed, else 1\&. +.PP +Note that if using POSIX EREs, the \fB^\fP or word boundary operators +(where available) may not work properly\&. +.RE +.TP +\fBrun\-help\fP \fIcmd\fP +This function is designed to be invoked by the \fBrun\-help\fP ZLE widget, +in place of the default alias\&. See `Accessing On\-Line Help\&' +above for setup instructions\&. +.RS +.PP +In the discussion which follows, if \fIcmd\fP is a file system path, it is +first reduced to its rightmost component (the file name)\&. +.PP +Help is first sought by looking for a file named \fIcmd\fP in the directory +named by the \fBHELPDIR\fP parameter\&. If no file is found, an assistant +function, alias, or command named \fBrun\-help\-\fIcmd\fP\fP is sought\&. If +found, the assistant is executed with the rest of the current command line +(everything after the command name \fIcmd\fP) as its arguments\&. When +neither file nor assistant is found, the external command +`\fBman\fP \fIcmd\fP\&' is run\&. +.PP +An example assistant for the "ssh" command: +.PP +.RS +.nf +\fBrun\-help\-ssh() { + emulate \-LR zsh + local \-a args + # Delete the "\-l username" option + zparseopts \-D \-E \-a args l: + # Delete other options, leaving: host command + args=(${@:#\-*}) + if [[ ${#args} \-lt 2 ]]; then + man ssh + else + run\-help $args[2] + fi +}\fP +.fi +.RE +.PP +Several of these assistants are provided in the \fBFunctions/Misc\fP +directory\&. These must be autoloaded, or placed as executable scripts in +your search path, in order to be found and used by \fBrun\-help\fP\&. +.PP +.PD 0 +.TP +.PD 0 +\fBrun\-help\-btrfs\fP +.TP +.PD 0 +\fBrun\-help\-git\fP +.TP +.PD 0 +\fBrun\-help\-ip\fP +.TP +.PD 0 +\fBrun\-help\-openssl\fP +.TP +.PD 0 +\fBrun\-help\-p4\fP +.TP +.PD 0 +\fBrun\-help\-sudo\fP +.TP +.PD 0 +\fBrun\-help\-svk\fP +.TP +.PD +\fBrun\-help\-svn\fP +Assistant functions for the +\fBbtrfs\fP, +\fBgit\fP, +\fBip\fP, +\fBopenssl\fP, +\fBp4\fP, +\fBsudo\fP, +\fBsvk\fP, +and +\fBsvn\fP, +commands\&. +.RE +.TP +\fBtetris\fP +Zsh was once accused of not being as complete as Emacs, +because it lacked a Tetris game\&. This function was written to +refute this vicious slander\&. +.RS +.PP +This function must be used as a ZLE widget: +.PP +.RS +.nf +\fBautoload \-U tetris +zle \-N tetris +bindkey \fIkeys\fP tetris\fP +.fi +.RE +.PP +To start a game, execute the widget by typing the \fIkeys\fP\&. Whatever command +line you were editing disappears temporarily, and your keymap is also +temporarily replaced by the Tetris control keys\&. The previous editor state +is restored when you quit the game (by pressing `\fBq\fP\&') or when you lose\&. +.PP +If you quit in the middle of a game, the next invocation of the \fBtetris\fP +widget will continue where you left off\&. If you lost, it will start a new +game\&. +.RE +.TP +\fBtetriscurses\fP +This is a port of the above to zcurses\&. The input handling is improved +a bit so that moving a block sideways doesn\&'t automatically advance a +timestep, and the graphics use unicode block graphics\&. +.RS +.PP +This version does not save the game state between invocations, and is not +invoked as a widget, but rather as: +.PP +.RS +.nf +\fBautoload \-U tetriscurses +tetriscurses\fP +.fi +.RE +.RE +.TP +\fBzargs\fP [ \fIoption\fP \&.\&.\&. \fB\-\fP\fB\-\fP ] [ \fIinput\fP \&.\&.\&. ] [ \fB\-\fP\fB\-\fP \fIcommand\fP [ \fIarg\fP \&.\&.\&. ] ] +This function has a similar purpose to GNU xargs\&. Instead of +reading lines of arguments from the standard input, it takes them from +the command line\&. This is useful because zsh, especially with recursive +glob operators, often can construct a command line for a shell function +that is longer than can be accepted by an external command\&. +.RS +.PP +The \fIoption\fP list represents options of the \fBzargs\fP command itself, +which are the same as those of \fBxargs\fP\&. The \fIinput\fP list is the +collection of strings (often file names) that become the arguments of the +\fBcommand\fP, analogous to the standard input of \fBxargs\fP\&. Finally, the +\fIarg\fP list consists of those arguments (usually options) that are +passed to the \fIcommand\fP each time it runs\&. The \fIarg\fP list precedes +the elements from the \fBinput\fP list in each run\&. If no \fIcommand\fP is +provided, then no \fIarg\fP list may be provided, and in that event the +default command is `\fBprint\fP\&' with arguments `\fB\-r \-\fP\fB\-\fP'\&. +.PP +For example, to get a long \fBls\fP listing of all non\-hidden plain files +in the current directory or its subdirectories: +.PP +.RS +.nf +\fBautoload \-U zargs +zargs \-\- **/*(\&.) \-\- ls \-ld \-\-\fP +.fi +.RE +.PP +The first and third occurrences of `\fB\-\fP\fB\-\fP\&' are used to mark the end +of options for \fBzargs\fP and \fBls\fP respectively to guard against +filenames starting with `\fB\-\fP\&', while the second is used to separate the +list of files from the command to run (`\fBls \-ld \-\-\fP\&')\&. +.PP +The first `\fB\-\fP\fB\-\fP\&' would also be needed if there was a chance the +list might be empty as in: +.PP +.RS +.nf +\fBzargs \-r \-\- \&./*\&.back(#qN) \-\- rm \-f\fP +.fi +.RE +.PP +In the event that the string `\fB\-\fP\fB\-\fP\&' is or may be an \fIinput\fP, the +\fB\-e\fP option may be used to change the end\-of\-inputs marker\&. Note that +this does \fInot\fP change the end\-of\-options marker\&. For example, to use +`\fB\&.\&.\fP\&' as the marker: +.PP +.RS +.nf +\fBzargs \-e\&.\&. \-\- **/*(\&.) \&.\&. ls \-ld \-\-\fP +.fi +.RE +.PP +This is a good choice in that example because no plain file can be named +`\fB\&.\&.\fP\&', but the best end\-marker depends on the circumstances\&. +.PP +The options \fB\-i\fP, \fB\-I\fP, \fB\-l\fP, \fB\-L\fP, and \fB\-n\fP differ slightly +from their usage in \fBxargs\fP\&. There are no input lines for \fBzargs\fP to +count, so \fB\-l\fP and \fB\-L\fP count through the \fIinput\fP list, and \fB\-n\fP +counts the number of arguments passed to each execution of \fIcommand\fP, +\fIincluding\fP any \fIarg\fP list\&. Also, any time \fB\-i\fP or \fB\-I\fP is used, +each \fIinput\fP is processed separately as if by `\fB\-L\fP \fB1\fP\&'\&. +.PP +For details of the other \fBzargs\fP options, see the \fIxargs\fP(1) man page (but note +the difference in function between \fBzargs\fP and \fBxargs\fP) or run +\fBzargs\fP with the \fB\-\fP\fB\-help\fP option\&. +.RE +.TP +.PD 0 +\fBzed\fP [ \fB\-f\fP [ \fB\-x\fP \fInum\fP ] ] \fIname\fP +.TP +.PD 0 +\fBzed\fP [ \fB\-h\fP [ \fIname\fP ] \fIsize\fP ] +.TP +.PD +\fBzed \-b\fP +This function uses the ZLE editor to edit a file or function\&. +.RS +.PP +Only one \fIname\fP argument is allowed\&. +If the \fB\-f\fP option is given, the name is taken to be that of +a function; if the function is marked for autoloading, \fBzed\fP searches +for it in the \fBfpath\fP and loads it\&. Note that functions edited this way +are installed into the current shell, but \fInot\fP written back to the +autoload file\&. In this case the \fB\-x\fP option specifies that leading +tabs indenting the function according to syntax should be converted into +the given number of spaces; `\fB\-x 2\fP\&' is consistent with the layout +of functions distributed with the shell\&. +.PP +Without \fB\-f\fP, \fIname\fP is the path name of the file to edit, which need +not exist; it is created on write, if necessary\&. With \fB\-h\fP, the file is +presumed to contain history events\&. +.PP +When no file name is provided for \fB\-h\fP the current shell history is edited +in place\&. The history is renumbered when zed exits successfully\&. +.PP +When editing history, multi\-line events must have a trailing backslash on +every line before the last\&. +.PP +While editing, the function sets the main keymap to \fBzed\fP and the +vi command keymap to \fBzed\-vicmd\fP\&. These will be copied from the existing +\fBmain\fP and \fBvicmd\fP keymaps if they do not exist the first time \fBzed\fP +is run\&. They can be used to provide special key bindings used only in zed\&. +.PP +If it creates the keymap, \fBzed\fP rebinds the return key to insert a line +break and `\fB^X^W\fP\&' to accept the edit in the \fBzed\fP keymap, and binds +`\fBZZ\fP\&' to accept the edit in the \fBzed\-vicmd\fP keymap\&. +.PP +The bindings alone can be installed by running `\fBzed \-b\fP\&'\&. This is +suitable for putting into a startup file\&. Note that, if rerun, +this will overwrite the existing \fBzed\fP and \fBzed\-vicmd\fP keymaps\&. +.PP +Completion is available, and styles may be set with the context prefix +`\fB:completion:zed:\fP\&'\&. +.PP +A zle widget \fBzed\-set\-file\-name\fP is available\&. This can be called +by name from within zed using `\fB\eex zed\-set\-file\-name\fP\&' or can be +bound to a key in either of the \fBzed\fP or \fBzed\-vicmd\fP keymaps after +`\fBzed \-b\fP\&' has been run\&. When the widget is called, it prompts for +a new name for the file being edited\&. When zed exits the file will be +written under that name and the original file will be left alone\&. The +widget has no effect when invoked from `\fBzed \-f\fP\&'\&. The completion +context is changed to `\fB:completion:zed\-set\-file\-name:\fP\&'\&. When editing +the current history with `\fBzed \-h\fP\&', the history is first updated and +then the file is written, but the global setting of \fBHISTFILE\fP is not +altered\&. +.PP +While \fBzed\-set\-file\-name\fP is running, zed uses the keymap +\fBzed\-normal\-keymap\fP, which is linked from the main keymap in effect +at the time zed initialised its bindings\&. (This is to make the return key +operate normally\&.) The result is that if the main keymap has been changed, +the widget won\&'t notice\&. This is not a concern for most users\&. +.RE +.TP +.PD 0 +\fBzcp\fP [ \fB\-finqQvwW\fP ] \fIsrcpat\fP \fIdest\fP +.TP +.PD +\fBzln\fP [ \fB\-finqQsvwW\fP ] \fIsrcpat\fP \fIdest\fP +Same as \fBzmv \-C\fP and \fBzmv \-L\fP, respectively\&. These functions do not +appear in the zsh distribution, but can be created by linking \fBzmv\fP to +the names \fBzcp\fP and \fBzln\fP in some directory in your \fBfpath\fP\&. +.TP +\fBzkbd\fP +See `Keyboard Definition\&' +above\&. + +.TP +.PD 0 +\fBzmv\fP [ \fB\-finqQsvwW\fP ] [ \fB\-C\fP | \fB\-L\fP | \fB\-M\fP | \-{\fBp\fP|\fBP\fP} \fIprogram\fP ] [ \fB\-o\fP \fIoptstring\fP ] +.TP +.PD +\fB \fP\fIsrcpat\fP \fIdest\fP +Move (usually, rename) files matching the pattern \fIsrcpat\fP to +corresponding files having names of the form given by \fIdest\fP, where +\fIsrcpat\fP contains parentheses surrounding patterns which will be +replaced in turn by \fB$1\fP, \fB$2\fP, \&.\&.\&. in \fIdest\fP\&. For example, +.RS +.PP +.RS +.nf +\fBzmv \&'(*)\&.lis' '$1\&.txt'\fP +.fi +.RE +.PP +renames `\fBfoo\&.lis\fP\&' to `\fBfoo\&.txt\fP', `\fBmy\&.old\&.stuff\&.lis\fP' to +`\fBmy\&.old\&.stuff\&.txt\fP\&', and so on\&. +.PP +The pattern is always treated as an \fBEXTENDED_GLOB\fP pattern\&. Any file +whose name is not changed by the substitution is simply ignored\&. Any +error (a substitution resulted in an empty string, two substitutions gave +the same result, the destination was an existing regular file and \fB\-f\fP +was not given) causes the entire function to abort without doing +anything\&. +.PP +In addition to pattern replacement, the variable \fB$f\fP can be referred +to in the second (replacement) argument\&. This makes it possible to +use variable substitution to alter the argument; see examples below\&. +.PP +Options: +.PP +.PD 0 +.TP +\fB\-f\fP +Force overwriting of destination files\&. Not currently +passed down to the \fBmv\fP/\fBcp\fP/\fBln\fP command due to vagaries of +implementations (but you can use \fB\-o\-f\fP to do that)\&. +.TP +\fB\-i\fP +Interactive: show each line to be executed and ask the user +whether to execute it\&. `\fBY\fP\&' or `\fBy\fP' will execute it, anything else will +skip it\&. Note that you just need to type one character\&. +.TP +\fB\-n\fP +No execution: print what would happen, but don\&'t do it\&. +.TP +\fB\-q\fP +Turn bare glob qualifiers off: now assumed by default, so +this has no effect\&. +.TP +\fB\-Q\fP +Force bare glob qualifiers on\&. Don\&'t turn this on unless +you are actually using glob qualifiers in a pattern\&. +.TP +\fB\-s\fP +Symbolic, passed down to \fBln\fP; only works with \fB\-L\fP\&. +.TP +\fB\-v\fP +Verbose: print each command as it\&'s being executed\&. +.TP +\fB\-w\fP +Pick out wildcard parts of the pattern, as described above, +and implicitly add parentheses for referring to them\&. +.TP +\fB\-W\fP +Just like \fB\-w\fP, with the addition of turning wildcards in +the replacement pattern into sequential \fB${1}\fP \&.\&. \fB${N}\fP references\&. +.TP +\fB\-C\fP +.TP +\fB\-L\fP +.TP +\fB\-M\fP +Force \fBcp\fP, \fBln\fP or \fBmv\fP, respectively, regardless of +the name of the function\&. +.TP +\fB\-p\fP \fIprogram\fP +Call \fIprogram\fP instead of \fBcp\fP, \fBln\fP or +\fBmv\fP\&. Whatever it does, it should at least understand the form +`\fIprogram\fP \fB\-\fP\fB\-\fP \fIoldname\fP \fInewname\fP\&' +where \fIoldname\fP and \fInewname\fP are filenames generated by \fBzmv\fP\&. +\fIprogram\fP will be split into words, so might be e\&.g\&. the name +of an archive tool plus a copy or rename subcommand\&. +.TP +\fB\-P\fP \fIprogram\fP +As \fB\-p\fP \fIprogram\fP, except that +\fIprogram\fP does not accept a following \fB\-\fP\fB\-\fP to indicate the +end of options\&. In this case filenames must already be in a sane +form for the program in question\&. +.TP +\fB\-o\fP \fIoptstring\fP +The \fIoptstring\fP is split into words and +passed down verbatim to the \fBcp\fP, \fBln\fP or \fBmv\fP command called to +perform the work\&. It should probably begin with a `\fB\-\fP\&'\&. +.PD +.PP +Further examples: +.PP +.RS +.nf +\fBzmv \-v \&'(* *)' '${1// /_}'\fP +.fi +.RE +.PP +For any file in the current directory with at least one space in the name, +replace every space by an underscore and display the commands executed\&. +.PP +.RS +.nf +\fBzmv \-v \&'* *' '${f// /_}'\fP +.fi +.RE +.PP +This does exactly the same by referring to the file name stored in \fB$f\fP\&. +.PP +For more complete examples and other implementation details, see the +\fBzmv\fP source file, usually located in one of the directories named in +your \fBfpath\fP, or in \fBFunctions/Misc/zmv\fP in the zsh distribution\&. +.RE +.TP +\fBzrecompile\fP +See `Recompiling Functions\&' +above\&. +.TP +\fBzstyle+\fP \fIcontext\fP \fIstyle\fP \fIvalue\fP [ \fB+\fP \fIsubcontext\fP \fIstyle\fP \fIvalue\fP \&.\&.\&. ] +This makes defining styles a bit simpler by using a single `\fB+\fP\&' as a +special token that allows you to append a context name to the previously +used context name\&. Like this: +.RS +.PP +.RS +.nf +\fBzstyle+ \&':foo:bar' \fIstyle1\fP \fIvalue1\fP \e + +\&':baz' \fIstyle2\fP \fIvalue2\fP \e + +\&':frob' \fIstyle3\fP \fIvalue3\fP\fP +.fi +.RE +.PP +This defines \fIstyle1\fP with \fIvalue1\fP for the context \fB:foo:bar\fP as usual, +but it also defines \fIstyle2\fP with \fIvalue2\fP for the context +\fB:foo:bar:baz\fP and \fIstyle3\fP with \fIvalue3\fP for \fB:foo:bar:frob\fP\&. Any +\fIsubcontext\fP may be the empty string to re\-use the first context +unchanged\&. +.RE +.PP +.SS "Styles" +.PP +.PD 0 +.TP +.PD +\fBinsert\-tab\fP +The \fBzed\fP function \fIsets\fP this style in context `\fB:completion:zed:*\fP\&' +to turn off completion when \fBTAB\fP is typed at the beginning of a line\&. +You may override this by setting your own value for this context and style\&. +.TP +\fBpager\fP +The \fBnslookup\fP function looks up this style in the context +`\fB:nslookup\fP\&' to determine the program used to display output that does +not fit on a single screen\&. +.TP +.PD 0 +\fBprompt\fP +.TP +.PD +\fBrprompt\fP +The \fBnslookup\fP function looks up this style in the context +`\fB:nslookup\fP\&' to set the prompt and the right\-side prompt, respectively\&. +The usual expansions for the \fBPS1\fP and \fBRPS1\fP parameters may be used +(see +EXPANSION OF PROMPT SEQUENCES in \fIzshmisc\fP(1))\&. |