diff options
Diffstat (limited to 'assets/info/zsh.info-5')
| -rw-r--r-- | assets/info/zsh.info-5 | 7230 |
1 files changed, 7230 insertions, 0 deletions
diff --git a/assets/info/zsh.info-5 b/assets/info/zsh.info-5 new file mode 100644 index 00000000..5720d6b2 --- /dev/null +++ b/assets/info/zsh.info-5 @@ -0,0 +1,7230 @@ +This is zsh.info, produced by makeinfo version 4.8 from ./zsh.texi. + +INFO-DIR-SECTION Utilities +START-INFO-DIR-ENTRY +* ZSH: (zsh). The Z Shell Manual. +END-INFO-DIR-ENTRY + + +File: zsh.info, Node: Calendar System User Functions, Next: Calendar Styles, Prev: Calendar File and Date Formats, Up: Calendar Function System + +23.3 User Functions +=================== + +This section describes functions that are designed to be called +directly by the user. The first part describes those functions +associated with the user's calendar; the second part describes the use +in glob qualifiers. + + + +23.3.1 Calendar system functions +-------------------------------- + + +calendar [ -abdDsv ] [ -C CALFILE ] [ -n NUM ] [ -S SHOWPROG ] + [ [ START ] END ] +calendar -r [ -abdDrsv ] [ -C CALFILE ] [ -n NUM ] [ -S SHOWPROG ] + [ START ] + Show events in the calendar. + + With no arguments, show events from the start of today until the + end of the next working day after today. In other words, if today + is Friday, Saturday, or Sunday, show up to the end of the + following Monday, otherwise show today and tomorrow. + + If END is given, show events from the start of today up to the time + and date given, which is in the format described in the previous + section. Note that if this is a date the time is assumed to be + midnight at the start of the date, so that effectively this shows + all events before the given date. + + END may start with a +, in which case the remainder of the + specification is a relative time format as described in the + previous section indicating the range of time from the start time + that is to be included. + + If START is also given, show events starting from that time and + date. The word now can be used to indicate the current time. + + To implement an alert when events are due, include calendar -s in + your ~/.zshrc file. + + Options: + + + -a + Show all items in the calendar, regardless of the start and + end. + + -b + Brief: don't display continuation lines (i.e. indented lines + following the line with the date/time), just the first line. + + -B LINES + Brief: display at most the first LINES lines of the calendar + entry. `-B 1' is equivalent to `-b'. + + -C CALFILE + Explicitly specify a calendar file instead of the value of + the calendar-file style or the default ~/calendar. + + -d + Move any events that have passed from the calendar file to the + "done" file, as given by the done-file style or the default + which is the calendar file with .done appended. This option + is implied by the -s option. + + -D + Turns off the option -d, even if the -s option is also + present. + + -n NUM, -NUM + Show at least NUM events, if present in the calendar file, + regardless of the start and end. + + -r + Show all the remaining options in the calendar, ignoring the + given END time. The START time is respected; any argument + given is treated as a START time. + + -s + Use the shell's sched command to schedule a timed event that + will warn the user when an event is due. Note that the sched + command only runs if the shell is at an interactive prompt; a + foreground task blocks the scheduled task from running until + it is finished. + + The timed event usually runs the programme calendar_show to + show the event, as described in *Note Calendar Utility + Functions::. + + By default, a warning of the event is shown five minutes + before it is due. The warning period can be configured by + the style warn-time or for a single calendar entry by + including WARN RELTIME in the first line of the entry, where + RELTIME is one of the usual relative time formats. + + A repeated event may be indicated by including RPT RELDATE in + the first line of the entry. After the scheduled event has + been displayed it will be re-entered into the calendar file + at a time RELDATE after the existing event. Note that this + is currently the only use made of the repeat count, so that + it is not possible to query the schedule for a recurrence of + an event in the calendar until the previous event has passed. + + If RPT is used, it is also possible to specify that certain + recurrences of an event are rescheduled or cancelled. This is + done with the OCCURRENCE keyword, followed by whitespace and + the date and time of the occurrence in the regular sequence, + followed by whitespace and either the date and time of the + rescheduled event or the exact string CANCELLED. In this + case the date and time must be in exactly the "date with + local time" format used by the text/calendar MIME type (RFC + 2445), <YYYY><MM><DD>T<HH><MM><SS> (note the presence of the + literal character T). The first word (the regular + recurrence) may be something other than a proper date/time to + indicate that the event is additional to the normal sequence; + a convention that retains the formatting appearance is + XXXXXXXXTXXXXXX. + + Furthermore, it is useful to record the next regular + recurrence (as then the displayed date may be for a + rescheduled event so cannot be used for calculating the + regular sequence). This is specified by RECURRENCE and a + time or date in the same format. calendar_add adds such an + indication when it encounters a recurring event that does not + include one, based on the headline date/time. + + If calendar_add is used to update occurrences the UID keyword + described there should be present in both the existing entry + and the added occurrence in order to identify recurring event + sequences. + + For example, + + + Thu May 6, 2010 11:00 Informal chat RPT 1 week + # RECURRENCE 20100506T110000 + # OCCURRENCE 20100513T110000 20100513T120000 + # OCCURRENCE 20100520T110000 CANCELLED + + The event that occurs at 11:00 on 13th May 2010 is + rescheduled an hour later. The event that occurs a week + later is cancelled. The occurrences are given on a + continuation line starting with a # character so will not + usually be displayed as part of the event. As elsewhere, no + account of time zones is taken with the times. After the next + event occurs the headline date/time will be `Thu May 13, 2010 + 12:00' while the RECURRENCE date/time will be + `20100513T110000' (note that cancelled and moved events are + not taken account of in the RECURRENCE, which records what + the next regular recurrence is, but they are accounted for in + the headline date/time). + + It is safe to run calendar -s to reschedule an existing event + (if the calendar file has changed, for example), and also to + have it running in multiples instances of the shell since the + calendar file is locked when in use. + + By default, expired events are moved to the "done" file; see + the -d option. Use -D to prevent this. + + -S SHOWPROG + Explicitly specify a programme to be used for showing events + instead of the value of the show-prog style or the default + calendar_show. + + -v + Verbose: show more information about stages of processing. + This is useful for confirming that the function has + successfully parsed the dates in the calendar file. + + +calendar_add [ -BL ] EVENT ... + Adds a single event to the calendar in the appropriate location. + The event can contain multiple lines, as described in *Note + Calendar File and Date Formats::. Using this function ensures + that the calendar file is sorted in date and time order. It also + makes special arrangements for locking the file while it is + altered. The old calendar is left in a file with the suffix .old. + + The option -B indicates that backing up the calendar file will be + handled by the caller and should not be performed by calendar_add. + The option -L indicates that calendar_add does not need to lock + the calendar file as it is already locked. These options will not + usually be needed by users. + + If the style reformat-date is true, the date and time of the new + entry will be rewritten into the standard date format: see the + descriptions of this style and the style date-format. + + The function can use a unique identifier stored with each event to + ensure that updates to existing events are treated correctly. The + entry should contain the word UID, followed by whitespace, + followed by a word consisting entirely of hexadecimal digits of + arbitrary length (all digits are significant, including leading + zeroes). As the UID is not directly useful to the user, it is + convenient to hide it on an indented continuation line starting + with a #, for example: + + + Aug 31, 2007 09:30 Celebrate the end of the holidays + # UID 045B78A0 + + The second line will not be shown by the calendar function. + + It is possible to specify the RPT keyword followed by CANCELLED + instead of a relative time. This causes any matched event or + series of events to be cancelled (the original event does not have + to be marked as recurring in order to be cancelled by this + method). A UID is required in order to match an existing event in + the calendar. + + calendar_add will attempt to manage recurrences and occurrences of + repeating events as described for event scheduling by calendar -s + above. To reschedule or cancel a single event calendar_add should + be called with an entry that includes the correct UID but does + _not_ include the RPT keyword as this is taken to mean the entry + applies to a series of repeating events and hence replaces all + existing information. Each rescheduled or cancelled occurrence + must have an OCCURRENCE keyword in the entry passed to + calendar_add which will be merged into the calendar file. Any + existing reference to the occurrence is replaced. An occurrence + that does not refer to a valid existing event is added as a + one-off occurrence to the same calendar entry. + +calendar_edit + This calls the user's editor to edit the calendar file. If there + are arguments, they are taken as the editor to use (the file name + is appended to the commands); otherwise, the editor is given by the + variable VISUAL, if set, else the variable EDITOR. + + If the calendar scheduler was running, then after editing the file + calendar -s is called to update it. + + This function locks out the calendar system during the edit. + Hence it should be used to edit the calendar file if there is any + possibility of a calendar event occurring meanwhile. Note this + can lead to another shell with calendar functions enabled hanging + waiting for a lock, so it is necessary to quit the editor as soon + as possible. + +calendar_parse CALENDAR-ENTRY + This is the internal function that analyses the parts of a calendar + entry, which is passed as the only argument. The function returns + status 1 if the argument could not be parsed as a calendar entry + and status 2 if the wrong number of arguments were passed; it also + sets the parameter reply to an empty associative array. Otherwise, + it returns status 0 and sets elements of the associative array + reply as follows: + + + time + The time as a string of digits in the same units as + $EPOCHSECONDS + + schedtime + The regularly scheduled time. This may differ from the + actual event time time if this is a recurring event and the + next occurrence has been rescheduled. Then time gives the + actual time and schedtime the time of the regular recurrence + before modification. + + text1 + The text from the line not including the date and time of the + event, but including any WARN or RPT keywords and values. + + warntime + Any warning time given by the WARN keyword as a string of + digits containing the time at which to warn in the same units + as $EPOCHSECONDS. (Note this is an absolute time, not the + relative time passed down.) Not set no WARN keyword and + value were matched. + + warnstr + The raw string matched after the WARN keyword, else unset. + + rpttime + Any recurrence time given by the RPT keyword as a string of + digits containing the time of the recurrence in the same units + as $EPOCHSECONDS. (Note this is an absolute time.) Not set + if no RPT keyword and value were matched. + + schedrpttime + The next regularly scheduled occurrence of a recurring event + before modification. This may differ from rpttime, which is + the actual time of the event that may have been rescheduled + from the regular time. + + rptstr + The raw string matched after the RPT keyword, else unset. + + text2 + The text from the line after removal of the date and any + keywords and values. + + + +calendar_showdate [ -r ] [ -f FMT ] DATE-SPEC ... + The given DATE-SPEC is interpreted and the corresponding date and + time printed. If the initial DATE-SPEC begins with a + or - it is + treated as relative to the current time; DATE-SPECs after the + first are treated as relative to the date calculated so far and a + leading + is optional in that case. This allows one to use the + system as a date calculator. For example, calendar_showdate '+1 + month, 1st Friday' shows the date of the first Friday of next + month. + + With the option -r nothing is printed but the value of the date and + time in seconds since the epoch is stored in the parameter REPLY. + + With the option -f FMT the given date/time conversion format is + passed to strftime; see notes on the date-format style below. + + In order to avoid ambiguity with negative relative date + specifications, options must occur in separate words; in other + words, -r and -f should not be combined in the same word. + +calendar_sort + Sorts the calendar file into date and time order. The old + calendar is left in a file with the suffix .old. + + + +23.3.2 Glob qualifiers +---------------------- + + +age + The function age can be autoloaded and use separately from the + calendar system, although it uses the function calendar_scandate + for date formatting. It requires the zsh/stat builtin, but uses + only the builtin zstat. + + age selects files having a given modification time for use as a + glob qualifier. The format of the date is the same as that + understood by the calendar system, described in *Note Calendar + File and Date Formats::. + + The function can take one or two arguments, which can be supplied + either directly as command or arguments, or separately as shell + parameters. + + + print *(e:age 2006/10/04 2006/10/09:) + + The example above matches all files modified between the start of + those dates. The second argument may alternatively be a relative + time introduced by a +: + + + print *(e:age 2006/10/04 +5d:) + + The example above is equivalent to the previous example. + + In addition to the special use of days of the week, today and + yesterday, times with no date may be specified; these apply to + today. Obviously such uses become problematic around midnight. + + + print *(e-age 12:00 13:30-) + + The example above shows files modified between 12:00 and 13:00 + today. + + + print *(e:age 2006/10/04:) + + The example above matches all files modified on that date. If the + second argument is omitted it is taken to be exactly 24 hours + after the first argument (even if the first argument contains a + time). + + + print *(e-age 2006/10/04:10:15 2006/10/04:10:45-) + + The example above supplies times. Note that whitespace within the + time and date specification must be quoted to ensure age receives + the correct arguments, hence the use of the additional colon to + separate the date and time. + + + AGEREF=2006/10/04:10:15 + AGEREF2=2006/10/04:10:45 + print *(+age) + + This shows the same example before using another form of argument + passing. The dates and times in the parameters AGEREF and AGEREF2 + stay in effect until unset, but will be overridden if any argument + is passed as an explicit argument to age. Any explicit argument + causes both parameters to be ignored. + + Instead of an explicit date and time, it's possible to use the + modification time of a file as the date and time for either + argument by introducing the file name with a colon: + + + print *(e-age :file1-) + + matches all files created on the same day (24 hours starting from + midnight) as file1. + + + print *(e-age :file1 :file2-) + + matches all files modified no earlier than file1 and no later than + file2; precision here is to the nearest second. + +after +before + The functions after and before are simpler versions of age that + take just one argument. The argument is parsed similarly to an + argument of age; if it is not given the variable AGEREF is + consulted. As the names of the functions suggest, a file matches + if its modification time is after or before the time and date + specified. If a time only is given the date is today. + + The two following examples are therefore equivalent: + print *(e-after 12:00-) + print *(e-after today:12:00-) + + + + +File: zsh.info, Node: Calendar Styles, Next: Calendar Utility Functions, Prev: Calendar System User Functions, Up: Calendar Function System + +23.4 Styles +=========== + +The zsh style mechanism using the zstyle command is describe in *Note +The zsh/zutil Module::. This is the same mechanism used in the +completion system. + +The styles below are all examined in the context :datetime:FUNCTION:, +for example :datetime:calendar:. + + +calendar-file + The location of the main calendar. The default is ~/calendar. + +date-format + A strftime format string (see man page strftime(3)) with the zsh + extensions providing various numbers with no leading zero or space + if the number is a single digit as described for the %D{STRING} + prompt format in *Note Prompt Expansion::. + + This is used for outputting dates in calendar, both to support the + -v option and when adding recurring events back to the calendar + file, and in calendar_showdate as the final output format. + + If the style is not set, the default used is similar the standard + system format as output by the date command (also known as `ctime + format'): `%a %b %d %H:%M:%S %Z %Y'. + +done-file + The location of the file to which events which have passed are + appended. The default is the calendar file location with the + suffix .done. The style may be set to an empty string in which + case a "done" file will not be maintained. + +reformat-date + Boolean, used by calendar_add. If it is true, the date and time + of new entries added to the calendar will be reformatted to the + format given by the style date-format or its default. Only the + date and time of the event itself is reformatted; any subsidiary + dates and times such as those associated with repeat and warning + times are left alone. + +show-prog + The programme run by calendar for showing events. It will be + passed the start time and stop time of the events requested in + seconds since the epoch followed by the event text. Note that + calendar -s uses a start time and stop time equal to one another + to indicate alerts for specific events. + + The default is the function calendar_show. + +warn-time + The time before an event at which a warning will be displayed, if + the first line of the event does not include the text EVENT + RELTIME. The default is 5 minutes. + + + + +File: zsh.info, Node: Calendar Utility Functions, Next: Calendar Bugs, Prev: Calendar Styles, Up: Calendar Function System + +23.5 Utility functions +====================== + + +calendar_lockfiles + Attempt to lock the files given in the argument. To prevent + problems with network file locking this is done in an ad hoc + fashion by attempting to create a symbolic link to the file with + the name FILE.lockfile. No other system level functions are used + for locking, i.e. the file can be accessed and modified by any + utility that does not use this mechanism. In particular, the user + is not prevented from editing the calendar file at the same time + unless calendar_edit is used. + + Three attempts are made to lock the file before giving up. If the + module zsh/zselect is available, the times of the attempts are + jittered so that multiple instances of the calling function are + unlikely to retry at the same time. + + The files locked are appended to the array lockfiles, which should + be local to the caller. + + If all files were successfully locked, status zero is returned, + else status one. + + This function may be used as a general file locking function, + although this will only work if only this mechanism is used to + lock files. + +calendar_read + This is a backend used by various other functions to parse the + calendar file, which is passed as the only argument. The array + calendar_entries is set to the list of events in the file; no + pruning is done except that ampersands are removed from the start + of the line. Each entry may contain multiple lines. + +calendar_scandate + This is a generic function to parse dates and times that may be + used separately from the calendar system. The argument is a date + or time specification as described in *Note Calendar File and Date + Formats::. The parameter REPLY is set to the number of seconds + since the epoch corresponding to that date or time. By default, + the date and time may occur anywhere within the given argument. + + Returns status zero if the date and time were successfully parsed, + else one. + + Options: + -a + The date and time are anchored to the start of the argument; + they will not be matched if there is preceding text. + + -A + The date and time are anchored to both the start and end of + the argument; they will not be matched if the is any other + text in the argument. + + -d + Enable additional debugging output. + + -m + Minus. When -R ANCHOR_TIME is also given the relative time is + calculated backwards from ANCHOR_TIME. + + -r + The argument passed is to be parsed as a relative time. + + -R ANCHOR_TIME + The argument passed is to be parsed as a relative time. The + time is relative to ANCHOR_TIME, a time in seconds since the + epoch, and the returned value is the absolute time + corresponding to advancing ANCHOR_TIME by the relative time + given. This allows lengths of months to be correctly taken + into account. If the final day does not exist in the given + month, the last day of the final month is given. For + example, if the anchor time is during 31st January 2007 and + the relative time is 1 month, the final time is the same time + of day during 28th February 2007. + + -s + In addition to setting REPLY, set REPLY2 to the remainder of + the argument after the date and time have been stripped. + This is empty if the option -A was given. + + -t + Allow a time with no date specification. The date is assumed + to be today. The behaviour is unspecified if the iron tongue + of midnight is tolling twelve. + + +calendar_show + The function used by default to display events. It accepts a + start time and end time for events, both in epoch seconds, and an + event description. + + The event is always printed to standard output. If the command + line editor is active (which will usually be the case) the command + line will be redisplayed after the output. + + If the parameter DISPLAY is set and the start and end times are + the same (indicating a scheduled event), the function uses the + command xmessage to display a window with the event details. + + + + +File: zsh.info, Node: Calendar Bugs, Prev: Calendar Utility Functions, Up: Calendar Function System + +23.6 Bugs +========= + +As the system is based entirely on shell functions (with a little +support from the zsh/datetime module) the mechanisms used are not as +robust as those provided by a dedicated calendar utility. Consequently +the user should not rely on the shell for vital alerts. + +There is no calendar_delete function. + +There is no localization support for dates and times, nor any support +for the use of time zones. + +Relative periods of months and years do not take into account the +variable number of days. + +The calendar_show function is currently hardwired to use xmessage for +displaying alerts on X Window System displays. This should be +configurable and ideally integrate better with the desktop. + +calendar_lockfiles hangs the shell while waiting for a lock on a file. +If called from a scheduled task, it should instead reschedule the event +that caused it. + + +File: zsh.info, Node: TCP Function System, Next: Zftp Function System, Prev: Calendar Function System, Up: Top + +24 TCP Function System +********************** + + + +24.1 Description +================ + +A module zsh/net/tcp is provided to provide network I/O over TCP/IP +from within the shell; see its description in *Note Zsh Modules::. +This manual page describes a function suite based on the module. If +the module is installed, the functions are usually installed at the +same time, in which case they will be available for autoloading in the +default function search path. In addition to the zsh/net/tcp module, +the zsh/zselect module is used to implement timeouts on read +operations. For troubleshooting tips, consult the corresponding advice +for the zftp functions described in *Note Zftp Function System::. + +There are functions corresponding to the basic I/O operations open, +close, read and send, named tcp_open etc., as well as a function +tcp_expect for pattern match analysis of data read as input. The +system makes it easy to receive data from and send data to multiple +named sessions at once. In addition, it can be linked with the shell's +line editor in such a way that input data is automatically shown at the +terminal. Other facilities available including logging, filtering and +configurable output prompts. + +To use the system where it is available, it should be enough to +`autoload -U tcp_open' and run tcp_open as documented below to start a +session. The tcp_open function will autoload the remaining functions. + + + +* Menu: + +* TCP Functions:: +* TCP Parameters:: +* TCP Examples:: +* TCP Bugs:: + + + +File: zsh.info, Node: TCP Functions, Next: TCP Parameters, Up: TCP Function System + +24.2 TCP User Functions +======================= + + + +24.2.1 Basic I/O +---------------- + + +tcp_open [ -qz ] HOST PORT [ SESS ] +tcp_open [ -qz ] [ -s SESS | -l SESS[,...] ] ... +tcp_open [ -qz ] [ -a FD | -f FD ] [ SESS ] + Open a new session. In the first and simplest form, open a TCP + connection to host HOST at port PORT; numeric and symbolic forms + are understood for both. + + If SESS is given, this becomes the name of the session which can be + used to refer to multiple different TCP connections. If SESS is + not given, the function will invent a numeric name value (note + this is _not_ the same as the file descriptor to which the session + is attached). It is recommended that session names not include + `funny' characters, where funny characters are not well-defined + but certainly do not include alphanumerics or underscores, and + certainly do include whitespace. + + In the second case, one or more sessions to be opened are given by + name. A single session name is given after -s and a + comma-separated list after -l; both options may be repeated as + many times as necessary. A failure to open any session causes + tcp_open to abort. The host and port are read from the file + .ztcp_sessions in the same directory as the user's zsh + initialisation files, i.e. usually the home directory, but + $ZDOTDIR if that is set. The file consists of lines each giving a + session name and the corresponding host and port, in that order + (note the session name comes first, not last), separated by + whitespace. + + The third form allows passive and fake TCP connections. If the + option -a is used, its argument is a file descriptor open for + listening for connections. No function front-end is provided to + open such a file descriptor, but a call to `ztcp -l PORT' will + create one with the file descriptor stored in the parameter + $REPLY. The listening port can be closed with `ztcp -c FD'. A + call to `tcp_open -a FD' will block until a remote TCP connection + is made to PORT on the local machine. At this point, a session is + created in the usual way and is largely indistinguishable from an + active connection created with one of the first two forms. + + If the option -f is used, its argument is a file descriptor which + is used directly as if it were a TCP session. How well the + remainder of the TCP function system copes with this depends on + what actually underlies this file descriptor. A regular file is + likely to be unusable; a FIFO (pipe) of some sort will work + better, but note that it is not a good idea for two different + sessions to attempt to read from the same FIFO at once. + + If the option -q is given with any of the three forms, tcp_open + will not print informational messages, although it will in any + case exit with an appropriate status. + + If the line editor (zle) is in use, which is typically the case if + the shell is interactive, tcp_open installs a handler inside zle + which will check for new data at the same time as it checks for + keyboard input. This is convenient as the shell consumes no CPU + time while waiting; the test is performed by the operating system. + Giving the option -z to any of the forms of tcp_open prevents the + handler from being installed, so data must be read explicitly. + Note, however, this is not necessary for executing complete sets + of send and read commands from a function, as zle is not active at + this point. Generally speaking, the handler is only active when + the shell is waiting for input at a command prompt or in the vared + builtin. The option has no effect if zle is not active; `[[ -o + zle]]' will test for this. + + The first session to be opened becomes the current session and + subsequent calls to tcp_open do not change it. The current + session is stored in the parameter $TCP_SESS; see below for more + detail about the parameters used by the system. + + The function tcp_on_open, if defined, is called when a session is + opened. See the description below. + +tcp_close [ -qn ] [ -a | -l SESS[,...] | SESS ... ] + Close the named sessions, or the current session if none is given, + or all open sessions if -a is given. The options -l and -s are + both handled for consistency with tcp_open, although the latter is + redundant. + + If the session being closed is the current one, $TCP_SESS is unset, + leaving no current session, even if there are other sessions still + open. + + If the session was opened with tcp_open -f, the file descriptor is + closed so long as it is in the range 0 to 9 accessible directly + from the command line. If the option -n is given, no attempt will + be made to close file descriptors in this case. The -n option is + not used for genuine ztcp session; the file descriptors are always + closed with the session. + + If the option -q is given, no informational messages will be + printed. + +tcp_read [ -bdq ] [ -t TO ] [ -T TO ] + [ -a | -u FD[,...] | -l SESS[,...] | -s SESS ... ] + Perform a read operation on the current session, or on a list of + sessions if any are given with -u, -l or -s, or all open sessions + if the option -a is given. Any of the -u, -l or -s options may be + repeated or mixed together. The -u option specifies a file + descriptor directly (only those managed by this system are + useful), the other two specify sessions as described for tcp_open + above. + + The function checks for new data available on all the sessions + listed. Unless the -b option is given, it will not block waiting + for new data. Any one line of data from any of the available + sessions will be read, stored in the parameter $TCP_LINE, and + displayed to standard output unless $TCP_SILENT contains a + non-empty string. When printed to standard output the string + $TCP_PROMPT will be shown at the start of the line; the default + form for this includes the name of the session being read. See + below for more information on these parameters. In this mode, + tcp_read can be called repeatedly until it returns status 2 which + indicates all pending input from all specified sessions has been + handled. + + With the option -b, equivalent to an infinite timeout, the function + will block until a line is available to read from one of the + specified sessions. However, only a single line is returned. + + The option -d indicates that all pending input should be drained. + In this case tcp_read may process multiple lines in the manner + given above; only the last is stored in $TCP_LINE, but the + complete set is stored in the array $tcp_lines. This is cleared + at the start of each call to tcp_read. + + The options -t and -T specify a timeout in seconds, which may be a + floating point number for increased accuracy. With -t the timeout + is applied before each line read. With -T, the timeout applies to + the overall operation, possibly including multiple read operations + if the option -d is present; without this option, there is no + distinction between -t and -T. + + The function does not print informational messages, but if the + option -q is given, no error message is printed for a non-existent + session. + + A return status of 2 indicates a timeout or no data to read. Any + other non-zero return status indicates some error condition. + + See tcp_log for how to control where data is sent by tcp_read. + +tcp_send [ -cnq ] [ -s SESS | -l SESS[,...] ] DATA ... +tcp_send [ -cnq ] -a DATA ... + Send the supplied data strings to all the specified sessions in + turn. The underlying operation differs little from a `print -r' + to the session's file descriptor, although it attempts to prevent + the shell from dying owing to a SIGPIPE caused by an attempt to + write to a defunct session. + + The option -c causes tcp_send to behave like cat. It reads lines + from standard input until end of input and sends them in turn to + the specified session(s) exactly as if they were given as DATA + arguments to individual tcp_send commands. + + The option -n prevents tcp_send from putting a newline at the end + of the data strings. + + The remaining options all behave as for tcp_read. + + The data arguments are not further processed once they have been + passed to tcp_send; they are simply passed down to print -r. + + If the parameter $TCP_OUTPUT is a non-empty string and logging is + enabled then the data sent to each session will be echoed to the + log file(s) with $TCP_OUTPUT in front where appropriate, much in + the manner of $TCP_PROMPT. + + + +24.2.2 Session Management +------------------------- + + +tcp_alias [ -q ] ALIAS=SESS ... +tcp_alias [ -q ] [ ALIAS ... ] +tcp_alias -d [ -q ] ALIAS ... + This function is not particularly well tested. + + The first form creates an alias for a session name; ALIAS can then + be used to refer to the existing session SESS. As many aliases + may be listed as required. + + The second form lists any aliases specified, or all aliases if + none. + + The third form deletes all the aliases listed. The underlying + sessions are not affected. + + The option -q suppresses an inconsistently chosen subset of error + messages. + +tcp_log [ -asc ] [ -n | -N ] [ LOGFILE ] + With an argument LOGFILE, all future input from tcp_read will be + logged to the named file. Unless -a (append) is given, this file + will first be truncated or created empty. With no arguments, show + the current status of logging. + + With the option -s, per-session logging is enabled. Input from + tcp_read is output to the file LOGFILE.SESS. As the session is + automatically discriminated by the filename, the contents are raw + (no $TCP_PROMPT). The option -a applies as above. Per-session + logging and logging of all data in one file are not mutually + exclusive. + + The option -c closes all logging, both complete and per-session + logs. + + The options -n and -N respectively turn off or restore output of + data read by tcp_read to standard output; hence `tcp_log -cn' turns + off all output by tcp_read. + + The function is purely a convenient front end to setting the + parameters $TCP_LOG, $TCP_LOG_SESS, $TCP_SILENT, which are + described below. + +tcp_rename OLD NEW + Rename session OLD to session NEW. The old name becomes invalid. + +tcp_sess [ SESS [ COMMAND [ ARG ... ] ] ] + With no arguments, list all the open sessions and associated file + descriptors. The current session is marked with a star. For use + in functions, direct access to the parameters $tcp_by_name, + $tcp_by_fd and $TCP_SESS is probably more convenient; see below. + + With a SESS argument, set the current session to SESS. This is + equivalent to changing $TCP_SESS directly. + + With additional arguments, temporarily set the current session + while executing `COMMAND ARG ...'. COMMAND is re-evaluated so as + to expand aliases etc., but the remaining ARGs are passed through + as that appear to tcp_sess. The original session is restored when + tcp_sess exits. + + + +24.2.3 Advanced I/O +------------------- + + +tcp_command SEND-OPTION ... SEND-ARGUMENT ... + This is a convenient front-end to tcp_send. All arguments are + passed to tcp_send, then the function pauses waiting for data. + While data is arriving at least every $TCP_TIMEOUT (default 0.3) + seconds, data is handled and printed out according to the current + settings. Status 0 is always returned. + + This is generally only useful for interactive use, to prevent the + display becoming fragmented by output returned from the + connection. Within a programme or function it is generally better + to handle reading data by a more explicit method. + +tcp_expect [ -q ] [ -p VAR | -P VAR ] [ -t TO | -T TO ] + [ -a | -s SESS | -l SESS[,...] ] PATTERN ... + Wait for input matching any of the given PATTERNs from any of the + specified sessions. Input is ignored until an input line matches + one of the given patterns; at this point status zero is returned, + the matching line is stored in $TCP_LINE, and the full set of + lines read during the call to tcp_expect is stored in the array + $tcp_expect_lines. + + Sessions are specified in the same way as tcp_read: the default is + to use the current session, otherwise the sessions specified by -a, + -s, or -l are used. + + Each PATTERN is a standard zsh extended-globbing pattern; note + that it needs to be quoted to avoid it being expanded immediately + by filename generation. It must match the full line, so to match + a substring there must be a `*' at the start and end. The line + matched against includes the $TCP_PROMPT added by tcp_read. It is + possible to include the globbing flags `#b' or `#m' in the + patterns to make backreferences available in the parameters + $MATCH, $match, etc., as described in the base zsh documentation + on pattern matching. + + Unlike tcp_read, the default behaviour of tcp_expect is to block + indefinitely until the required input is found. This can be + modified by specifying a timeout with -t or -T; these function as + in tcp_read, specifying a per-read or overall timeout, + respectively, in seconds, as an integer or floating-point number. + As tcp_read, the function returns status 2 if a timeout occurs. + + The function returns as soon as any one of the patterns given + match. If the caller needs to know which of the patterns matched, + the option -p VAR can be used; on return, $var is set to the + number of the pattern using ordinary zsh indexing, i.e. the first + is 1, and so on. Note the absence of a `$' in front of VAR. To + avoid clashes, the parameter cannot begin with `_expect'. The + index -1 is used if there is a timeout and 0 if there is no match. + + The option -P VAR works similarly to -p, but instead of numerical + indexes the regular arguments must begin with a prefix followed by + a colon: that prefix is then used as a tag to which VAR is set + when the argument matches. The tag timeout is used if there is a + timeout and the empty string if there is no match. Note it is + acceptable for different arguments to start with the same prefix + if the matches do not need to be distinguished. + + The option -q is passed directly down to tcp_read. + + As all input is done via tcp_read, all the usual rules about + output of lines read apply. One exception is that the parameter + $tcp_lines will only reflect the line actually matched by + tcp_expect; use $tcp_expect_lines for the full set of lines read + during the function call. + +tcp_proxy + This is a simple-minded function to accept a TCP connection and + execute a command with I/O redirected to the connection. Extreme + caution should be taken as there is no security whatsoever and + this can leave your computer open to the world. Ideally, it + should only be used behind a firewall. + + The first argument is a TCP port on which the function will listen. + + The remaining arguments give a command and its arguments to + execute with standard input, standard output and standard error + redirected to the file descriptor on which the TCP session has + been accepted. If no command is given, a new zsh is started. + This gives everyone on your network direct access to your account, + which in many cases will be a bad thing. + + The command is run in the background, so tcp_proxy can then accept + new connections. It continues to accept new connections until + interrupted. + +tcp_spam [ -ertv ] [ -a | -s SESS | -l SESS[,...] ] CMD [ ARG ... ] + Execute `CMD [ ARG ... ]' for each session in turn. Note this + executes the command and arguments; it does not send the command + line as data unless the -t (transmit) option is given. + + The sessions may be selected explicitly with the standard -a, -s or + -l options, or may be chosen implicitly. If none of the three + options is given the rules are: first, if the array $tcp_spam_list + is set, this is taken as the list of sessions, otherwise all + sessions are taken. Second, any sessions given in the array + $tcp_no_spam_list are removed from the list of sessions. + + Normally, any sessions added by the `-a' flag or when all sessions + are chosen implicitly are spammed in alphabetic order; sessions + given by the $tcp_spam_list array or on the command line are + spammed in the order given. The -r flag reverses the order + however it was arrived it. + + The -v flag specifies that a $TCP_PROMPT will be output before each + session. This is output after any modification to TCP_SESS by the + user-defined tcp_on_spam function described below. (Obviously that + function is able to generate its own output.) + + If the option -e is present, the line given as `CMD [ ARG ... ]' + is executed using eval, otherwise it is executed without any + further processing. + +tcp_talk + This is a fairly simple-minded attempt to force input to the line + editor to go straight to the default TCP_SESS. + + An escape string, $TCP_TALK_ESCAPE, default `:', is used to allow + access to normal shell operation. If it is on its own at the + start of the line, or followed only by whitespace, the line editor + returns to normal operation. Otherwise, the string and any + following whitespace are skipped and the remainder of the line + executed as shell input without any change of the line editor's + operating mode. + + The current implementation is somewhat deficient in terms of use + of the command history. For this reason, many users will prefer + to use some form of alternative approach for sending data easily + to the current session. One simple approach is to alias some + special character (such as `%') to `tcp_command --'. + +tcp_wait + The sole argument is an integer or floating point number which + gives the seconds to delay. The shell will do nothing for that + period except wait for input on all TCP sessions by calling + tcp_read -a. This is similar to the interactive behaviour at the + command prompt when zle handlers are installed. + + + +24.2.4 `One-shot' file transfer +------------------------------- + + +tcp_point PORT +tcp_shoot HOST PORT + This pair of functions provide a simple way to transfer a file + between two hosts within the shell. Note, however, that bulk data + transfer is currently done using cat. tcp_point reads any data + arriving at PORT and sends it to standard output; tcp_shoot + connects to PORT on HOST and sends its standard input. Any unused + PORT may be used; the standard mechanism for picking a port is to + think of a random four-digit number above 1024 until one works. + + To transfer a file from host woodcock to host springes, on + springes: + + + tcp_point 8091 >output_file + + and on woodcock: + + + tcp_shoot springes 8091 <input_file + + As these two functions do not require tcp_open to set up a TCP + connection first, they may need to be autoloaded separately. + + + +24.3 TCP User-defined Functions +=============================== + +Certain functions, if defined by the user, will be called by the +function system in certain contexts. This facility depends on the +module zsh/parameter, which is usually available in interactive shells +as the completion system depends on it. None of the functions need be +defined; they simply provide convenient hooks when necessary. + +Typically, these are called after the requested action has been taken, +so that the various parameters will reflect the new state. + + +tcp_on_alias ALIAS FD + When an alias is defined, this function will be called with two + arguments: the name of the alias, and the file descriptor of the + corresponding session. + +tcp_on_awol SESS FD + If the function tcp_fd_handler is handling input from the line + editor and detects that the file descriptor is no longer reusable, + by default it removes it from the list of file descriptors handled + by this method and prints a message. If the function tcp_on_awol + is defined it is called immediately before this point. It may + return status 100, which indicates that the normal handling should + still be performed; any other return status indicates that no + further action should be taken and the tcp_fd_handler should return + immediately with the given status. Typically the action of + tcp_on_awol will be to close the session. + + The variable TCP_INVALIDATE_ZLE will be a non-empty string if it is + necessary to invalidate the line editor display using `zle -I' + before printing output from the function. + + (`AWOL' is military jargon for `absent without leave' or some + variation. It has no pre-existing technical meaning known to the + author.) + +tcp_on_close SESS FD + This is called with the name of a session being closed and the file + descriptor which corresponded to that session. Both will be + invalid by the time the function is called. + +tcp_on_open SESS FD + This is called after a new session has been defined with the + session name and file descriptor as arguments. If it returns a + non-zero status, opening the session is assumed to fail and the + session is closed again; however, tcp_open will continue to + attempt to open any remaining sessions given on the command line. + +tcp_on_rename OLDSESS FD NEWSESS + This is called after a session has been renamed with the three + arguments old session name, file descriptor, new session name. + +tcp_on_spam SESS COMMAND ... + This is called once for each session spammed, just _before_ a + command is executed for a session by tcp_spam. The arguments are + the session name followed by the command list to be executed. If + tcp_spam was called with the option -t, the first command will be + tcp_send. + + This function is called after $TCP_SESS is set to reflect the + session to be spammed, but before any use of it is made. Hence it + is possible to alter the value of $TCP_SESS within this function. + For example, the session arguments to tcp_spam could include extra + information to be stripped off and processed in tcp_on_spam. + + If the function sets the parameter $REPLY to `done', the command + line is not executed; in addition, no prompt is printed for the -v + option to tcp_spam. + +tcp_on_unalias ALIAS FD + This is called with the name of an alias and the corresponding + session's file descriptor after an alias has been deleted. + + + +24.4 TCP Utility Functions +========================== + +The following functions are used by the TCP function system but will +rarely if ever need to be called directly. + + +tcp_fd_handler + This is the function installed by tcp_open for handling input from + within the line editor, if that is required. It is in the format + documented for the builtin `zle -F' in *Note Zle Builtins:: . + + While active, the function sets the parameter TCP_HANDLER_ACTIVE + to 1. This allows shell code called internally (for example, by + setting tcp_on_read) to tell if is being called when the shell is + otherwise idle at the editor prompt. + +tcp_output [ -q ] -P PROMPT -F FD -S SESS + This function is used for both logging and handling output to + standard output, from within tcp_read and (if $TCP_OUTPUT is set) + tcp_send. + + The PROMPT to use is specified by -P; the default is the empty + string. It can contain: + %c + Expands to 1 if the session is the current session, otherwise + 0. Used with ternary expressions such as `%(c.-.+)' to + output `+' for the current session and `-' otherwise. + + %f + Replaced by the session's file descriptor. + + %s + Replaced by the session name. + + %% + Replaced by a single `%'. + + + The option -q suppresses output to standard output, but not to any + log files which are configured. + + The -S and -F options are used to pass in the session name and file + descriptor for possible replacement in the prompt. + + + + +File: zsh.info, Node: TCP Parameters, Next: TCP Examples, Prev: TCP Functions, Up: TCP Function System + +24.5 TCP User Parameters +======================== + +Parameters follow the usual convention that uppercase is used for +scalars and integers, while lowercase is used for normal and +associative array. It is always safe for user code to read these +parameters. Some parameters may also be set; these are noted +explicitly. Others are included in this group as they are set by the +function system for the user's benefit, i.e. setting them is typically +not useful but is benign. + +It is often also useful to make settable parameters local to a function. +For example, `local TCP_SILENT=1' specifies that data read during the +function call will not be printed to standard output, regardless of the +setting outside the function. Likewise, `local TCP_SESS=SESS' sets a +session for the duration of a function, and `local TCP_PROMPT=' +specifies that no prompt is used for input during the function. + + +tcp_expect_lines + Array. The set of lines read during the last call to tcp_expect, + including the last ($TCP_LINE). + +tcp_filter + Array. May be set directly. A set of extended globbing patterns + which, if matched in tcp_output, will cause the line not to be + printed to standard output. The patterns should be defined as + described for the arguments to tcp_expect. Output of line to log + files is not affected. + +TCP_HANDLER_ACTIVE + Scalar. Set to 1 within tcp_fd_handler to indicate to functions + called recursively that they have been called during an editor + session. Otherwise unset. + +TCP_LINE + The last line read by tcp_read, and hence also tcp_expect. + +TCP_LINE_FD + The file descriptor from which $TCP_LINE was read. + ${tcp_by_fd[$TCP_LINE_FD]} will give the corresponding session + name. + +tcp_lines + Array. The set of lines read during the last call to tcp_read, + including the last ($TCP_LINE). + +TCP_LOG + May be set directly, although it is also controlled by tcp_log. + The name of a file to which output from all sessions will be sent. + The output is proceeded by the usual $TCP_PROMPT. If it is not an + absolute path name, it will follow the user's current directory. + +TCP_LOG_SESS + May be set directly, although it is also controlled by tcp_log. + The prefix for a set of files to which output from each session + separately will be sent; the full filename is ${TCP_LOG_SESS}.SESS. + Output to each file is raw; no prompt is added. If it is not an + absolute path name, it will follow the user's current directory. + +tcp_no_spam_list + Array. May be set directly. See tcp_spam for how this is used. + +TCP_OUTPUT + May be set directly. If a non-empty string, any data sent to a + session by tcp_send will be logged. This parameter gives the + prompt to be used in a file specified by $TCP_LOG but not in a + file generated from $TCP_LOG_SESS. The prompt string has the same + format as TCP_PROMPT and the same rules for its use apply. + +TCP_PROMPT + May be set directly. Used as the prefix for data read by tcp_read + which is printed to standard output or to the log file given by + $TCP_LOG, if any. Any `%s', `%f' or `%%' occurring in the string + will be replaced by the name of the session, the session's + underlying file descriptor, or a single `%', respectively. The + expression `%c' expands to 1 if the session being read is the + current session, else 0; this is most useful in ternary + expressions such as `%(c.-.+)' which outputs `+' if the session is + the current one, else `-'. + + If the prompt starts with %P, this is stripped and the complete + result of the previous stage is passed through standard prompt + %-style formatting before being output. + +TCP_READ_DEBUG + May be set directly. If this has non-zero length, tcp_read will + give some limited diagnostics about data being read. + +TCP_SECONDS_START + This value is created and initialised to zero by tcp_open. + + The functions tcp_read and tcp_expect use the shell's SECONDS + parameter for their own timing purposes. If that parameter is not + of floating point type on entry to one of the functions, it will + create a local parameter SECONDS which is floating point and set + the parameter TCP_SECONDS_START to the previous value of $SECONDS. + If the parameter is already floating point, it is used without a + local copy being created and TCP_SECONDS_START is not set. As the + global value is zero, the shell elapsed time is guaranteed to be + the sum of $SECONDS and $TCP_SECONDS_START. + + This can be avoided by setting SECONDS globally to a floating point + value using `typeset -F SECONDS'; then the TCP functions will never + make a local copy and never set TCP_SECONDS_START to a non-zero + value. + +TCP_SESS + May be set directly. The current session; must refer to one of the + sessions established by tcp_open. + +TCP_SILENT + May be set directly, although it is also controlled by tcp_log. + If of non-zero length, data read by tcp_read will not be written to + standard output, though may still be written to a log file. + +tcp_spam_list + Array. May be set directly. See the description of the function + tcp_spam for how this is used. + +TCP_TALK_ESCAPE + May be set directly. See the description of the function tcp_talk + for how this is used. + +TCP_TIMEOUT + May be set directly. Currently this is only used by the function + tcp_command, see above. + + + +24.6 TCP User-defined Parameters +================================ + +The following parameters are not set by the function system, but have a +special effect if set by the user. + + +tcp_on_read + This should be an associative array; if it is not, the behaviour is + undefined. Each key is the name of a shell function or other + command, and the corresponding value is a shell pattern (using + EXTENDED_GLOB). Every line read from a TCP session directly or + indirectly using tcp_read (which includes lines read by + tcp_expect) is compared against the pattern. If the line matches, + the command given in the key is called with two arguments: the + name of the session from which the line was read, and the line + itself. + + If any function called to handle a line returns a non-zero status, + the line is not output. Thus a tcp_on_read handler containing only + the instruction `return 1' can be used to suppress output of + particular lines (see, however, tcp_filter above). However, the + line is still stored in TCP_LINE and tcp_lines; this occurs after + all tcp_on_read processing. + + + +24.7 TCP Utility Parameters +=========================== + +These parameters are controlled by the function system; they may be read +directly, but should not usually be set by user code. + + +tcp_aliases + Associative array. The keys are the names of sessions established + with tcp_open; each value is a space-separated list of aliases + which refer to that session. + +tcp_by_fd + Associative array. The keys are session file descriptors; each + value is the name of that session. + +tcp_by_name + Associative array. The keys are the names of sessions; each value + is the file descriptor associated with that session. + + + + +File: zsh.info, Node: TCP Examples, Next: TCP Bugs, Prev: TCP Parameters, Up: TCP Function System + +24.8 TCP Examples +================= + +Here is a trivial example using a remote calculator. + +To create a calculator server on port 7337 (see the dc manual page for +quite how infuriating the underlying command is): + + + tcp_proxy 7337 dc + +To connect to this from the same host with a session also named `dc': + + + tcp_open localhost 7337 dc + +To send a command to the remote session and wait a short while for +output (assuming dc is the current session): + + + tcp_command 2 4 + p + +To close the session: + + + tcp_close + +The tcp_proxy needs to be killed to be stopped. Note this will not +usually kill any connections which have already been accepted, and also +that the port is not immediately available for reuse. + +The following chunk of code puts a list of sessions into an xterm +header, with the current session followed by a star. + + + print -n "\033]2;TCP:" ${(k)tcp_by_name:/$TCP_SESS/$TCP_SESS\*} "\a" + + + +File: zsh.info, Node: TCP Bugs, Prev: TCP Examples, Up: TCP Function System + +24.9 TCP Bugs +============= + +The function tcp_read uses the shell's normal read builtin. As this +reads a complete line at once, data arriving without a terminating +newline can cause the function to block indefinitely. + +Though the function suite works well for interactive use and for data +arriving in small amounts, the performance when large amounts of data +are being exchanged is likely to be extremely poor. + + +File: zsh.info, Node: Zftp Function System, Next: User Contributions, Prev: TCP Function System, Up: Top + +25 Zftp Function System +*********************** + + + +25.1 Description +================ + +This describes the set of shell functions supplied with the source +distribution as an interface to the zftp builtin command, allowing you +to perform FTP operations from the shell command line or within +functions or scripts. The interface is similar to a traditional FTP +client (e.g. the ftp command itself, see man page ftp(1)), but as it is +entirely done within the shell all the familiar completion, editing and +globbing features, and so on, are present, and macros are particularly +simple to write as they are just ordinary shell functions. + +The prerequisite is that the zftp command, as described in *Note The +zsh/zftp Module:: , must be available in the version of zsh installed +at your site. If the shell is configured to load new commands at run +time, it probably is: typing `zmodload zsh/zftp' will make sure (if +that runs silently, it has worked). If this is not the case, it is +possible zftp was linked into the shell anyway: to test this, type +`which zftp' and if zftp is available you will get the message `zftp: +shell built-in command'. + +Commands given directly with zftp builtin may be interspersed between +the functions in this suite; in a few cases, using zftp directly may +cause some of the status information stored in shell parameters to +become invalid. Note in particular the description of the variables +$ZFTP_TMOUT, $ZFTP_PREFS and $ZFTP_VERBOSE for zftp. + + + +* Menu: + +* Installation:: +* Zftp Functions:: +* Miscellaneous Features:: + + + +File: zsh.info, Node: Installation, Next: Zftp Functions, Up: Zftp Function System + +25.2 Installation +================= + +You should make sure all the functions from the Functions/Zftp +directory of the source distribution are available; they all begin with +the two letters `zf'. They may already have been installed on your +system; otherwise, you will need to find them and copy them. The +directory should appear as one of the elements of the $fpath array +(this should already be the case if they were installed), and at least +the function zfinit should be autoloaded; it will autoload the rest. +Finally, to initialize the use of the system you need to call the +zfinit function. The following code in your .zshrc will arrange for +this; assume the functions are stored in the directory ~/myfns: + + + fpath=(~/myfns $fpath) + autoload -U zfinit + zfinit + +Note that zfinit assumes you are using the zmodload method to load the +zftp command. If it is already built into the shell, change zfinit to +zfinit -n. It is helpful (though not essential) if the call to zfinit +appears after any code to initialize the new completion system, else +unnecessary compctl commands will be given. + + + + +File: zsh.info, Node: Zftp Functions, Next: Miscellaneous Features, Prev: Installation, Up: Zftp Function System + +25.3 Functions +============== + +The sequence of operations in performing a file transfer is essentially +the same as that in a standard FTP client. Note that, due to a quirk +of the shell's getopts builtin, for those functions that handle options +you must use `--' rather than `-' to ensure the remaining arguments are +treated literally (a single `-' is treated as an argument). + + + +25.3.1 Opening a connection +--------------------------- + + +zfparams [ HOST [ USER [ PASSWORD ... ] ] ] + Set or show the parameters for a future zfopen with no arguments. + If no arguments are given, the current parameters are displayed + (the password will be shown as a line of asterisks). If a HOST is + given, and either the USER or PASSWORD is not, they will be + prompted for; also, any parameter given as `?' will be prompted + for, and if the `?' is followed by a string, that will be used as + the prompt. As zfopen calls zfparams to store the parameters, + this usually need not be called directly. + + A single argument `-' will delete the stored parameters. This will + also cause the memory of the last directory (and so on) on the + other host to be deleted. + +zfopen [ -1 ] [ HOST [ USER [ PASSWORD [ ACCOUNT ] ] ] ] + If HOST is present, open a connection to that host under username + USER with password PASSWORD (and, on the rare occasions when it is + necessary, account ACCOUNT). If a necessary parameter is missing + or given as `?' it will be prompted for. If HOST is not present, + use a previously stored set of parameters. + + If the command was successful, and the terminal is compatible with + xterm or is sun-cmd, a summary will appear in the title bar, + giving the local host:directory and the remote host:directory; + this is handled by the function zftp_chpwd, described below. + + Normally, the HOST, USER and PASSWORD are internally recorded for + later re-opening, either by a zfopen with no arguments, or + automatically (see below). With the option `-1', no information is + stored. Also, if an open command with arguments failed, the + parameters will not be retained (and any previous parameters will + also be deleted). A zfopen on its own, or a zfopen -1, never + alters the stored parameters. + + Both zfopen and zfanon (but not zfparams) understand URLs of the + form ftp://HOST/PATH... as meaning to connect to the HOST, then + change directory to PATH (which must be a directory, not a file). + The `ftp://' can be omitted; the trailing `/' is enough to trigger + recognition of the PATH. Note prefixes other than `ftp:' are not + recognized, and that all characters after the first slash beyond + HOST are significant in PATH. + +zfanon [ -1 ] HOST + Open a connection HOST for anonymous FTP. The username used is + `anonymous'. The password (which will be reported the first time) + is generated as USER@HOST; this is then stored in the shell + parameter $EMAIL_ADDR which can alternatively be set manually to a + suitable string. + + + +25.3.2 Directory management +--------------------------- + + +zfcd [ DIR ] +zfcd - +zfcd OLD NEW + Change the current directory on the remote server: this is + implemented to have many of the features of the shell builtin cd. + + In the first form with DIR present, change to the directory DIR. + The command `zfcd ..' is treated specially, so is guaranteed to + work on non-UNIX servers (note this is handled internally by + zftp). If DIR is omitted, has the effect of `zfcd ~'. + + The second form changes to the directory previously current. + + The third form attempts to change the current directory by + replacing the first occurrence of the string OLD with the string + NEW in the current directory. + + Note that in this command, and indeed anywhere a remote filename is + expected, the string which on the local host corresponds to `~' is + converted back to a `~' before being passed to the remote machine. + This is convenient because of the way expansion is performed on + the command line before zfcd receives a string. For example, + suppose the command is `zfcd ~/foo'. The shell will expand this + to a full path such as `zfcd /home/user2/pws/foo'. At this stage, + zfcd recognises the initial path as corresponding to `~' and will + send the directory to the remote host as ~/foo, so that the `~' + will be expanded by the server to the correct remote host + directory. Other named directories of the form `~name' are not + treated in this fashion. + +zfhere + Change directory on the remote server to the one corresponding to + the current local directory, with special handling of `~' as in + zfcd. For example, if the current local directory is ~/foo/bar, + then zfhere performs the effect of `zfcd ~/foo/bar'. + +zfdir [ -rfd ] [ - ] [ DIR-OPTIONS ] [ DIR ] + Produce a long directory listing. The arguments DIR-OPTIONS and + DIR are passed directly to the server and their effect is + implementation dependent, but specifying a particular remote + directory DIR is usually possible. The output is passed through a + pager given by the environment variable $PAGER, or `more' if that + is not set. + + The directory is usually cached for re-use. In fact, two caches + are maintained. One is for use when there is no DIR-OPTIONS or + DIR, i.e. a full listing of the current remote directory; it is + flushed when the current remote directory changes. The other is + kept for repeated use of zfdir with the same arguments; for + example, repeated use of `zfdir /pub/gnu' will only require the + directory to be retrieved on the first call. Alternatively, this + cache can be re-viewed with the -r option. As relative + directories will confuse zfdir, the -f option can be used to force + the cache to be flushed before the directory is listed. The + option -d will delete both caches without showing a directory + listing; it will also delete the cache of file names in the + current remote directory, if any. + +zfls [ LS-OPTIONS ] [ DIR ] + List files on the remote server. With no arguments, this will + produce a simple list of file names for the current remote + directory. Any arguments are passed directly to the server. No + pager and no caching is used. + + + +25.3.3 Status commands +---------------------- + + +zftype [ TYPE ] + With no arguments, show the type of data to be transferred, + usually ASCII or binary. With an argument, change the type: the + types `A' or `ASCII' for ASCII data and `B' or `BINARY', `I' or + `IMAGE' for binary data are understood case-insensitively. + +zfstat [ -v ] + Show the status of the current or last connection, as well as the + status of some of zftp's status variables. With the -v option, a + more verbose listing is produced by querying the server for its + version of events, too. + + + +25.3.4 Retrieving files +----------------------- + +The commands for retrieving files all take at least two options. -G +suppresses remote filename expansion which would otherwise be performed +(see below for a more detailed description of that). -t attempts to +set the modification time of the local file to that of the remote file: +see the description of the function zfrtime below for more information. + + +zfget [ -Gtc ] FILE1 ... + Retrieve all the listed files FILE1 ... one at a time from the + remote server. If a file contains a `/', the full name is passed + to the remote server, but the file is stored locally under the + name given by the part after the final `/'. The option -c (cat) + forces all files to be sent as a single stream to standard output; + in this case the -t option has no effect. + +zfuget [ -Gvst ] FILE1 ... + As zfget, but only retrieve files where the version on the remote + server is newer (has a later modification time), or where the + local file does not exist. If the remote file is older but the + files have different sizes, or if the sizes are the same but the + remote file is newer, the user will usually be queried. With the + option -s, the command runs silently and will always retrieve the + file in either of those two cases. With the option -v, the + command prints more information about the files while it is + working out whether or not to transfer them. + +zfcget [ -Gt ] FILE1 ... + As zfget, but if any of the local files exists, and is shorter than + the corresponding remote file, the command assumes that it is the + result of a partially completed transfer and attempts to transfer + the rest of the file. This is useful on a poor connection which + keeps failing. + + Note that this requires a commonly implemented, but non-standard, + version of the FTP protocol, so is not guaranteed to work on all + servers. + +zfgcp [ -Gt ] REMOTE-FILE LOCAL-FILE +zfgcp [ -Gt ] RFILE1 ... LDIR + This retrieves files from the remote server with arguments behaving + similarly to the cp command. + + In the first form, copy REMOTE-FILE from the server to the local + file LOCAL-FILE. + + In the second form, copy all the remote files RFILE1 ... into the + local directory LDIR retaining the same basenames. This assumes + UNIX directory semantics. + + + +25.3.5 Sending files +-------------------- + + +zfput [ -r ] FILE1 ... + Send all the FILE1 ... given separately to the remote server. If a + filename contains a `/', the full filename is used locally to find + the file, but only the basename is used for the remote file name. + + With the option -r, if any of the FILES are directories they are + sent recursively with all their subdirectories, including files + beginning with `.'. This requires that the remote machine + understand UNIX file semantics, since `/' is used as a directory + separator. + +zfuput [ -vs ] FILE1 ... + As zfput, but only send files which are newer than their remote + equivalents, or if the remote file does not exist. The logic is + the same as for zfuget, but reversed between local and remote + files. + +zfcput FILE1 ... + As zfput, but if any remote file already exists and is shorter + than the local equivalent, assume it is the result of an + incomplete transfer and send the rest of the file to append to the + existing part. As the FTP append command is part of the standard + set, this is in principle more likely to work than zfcget. + +zfpcp LOCAL-FILE REMOTE-FILE +zfpcp LFILE1 ... RDIR + This sends files to the remote server with arguments behaving + similarly to the cp command. + + With two arguments, copy LOCAL-FILE to the server as REMOTE-FILE. + + With more than two arguments, copy all the local files LFILE1 ... + into the existing remote directory RDIR retaining the same + basenames. This assumes UNIX directory semantics. + + A problem arises if you attempt to use zfpcp LFILE1 RDIR, i.e. the + second form of copying but with two arguments, as the command has + no simple way of knowing if RDIR corresponds to a directory or a + filename. It attempts to resolve this in various ways. First, if + the RDIR argument is `.' or `..' or ends in a slash, it is assumed + to be a directory. Secondly, if the operation of copying to a + remote file in the first form failed, and the remote server sends + back the expected failure code 553 and a reply including the + string `Is a directory', then zfpcp will retry using the second + form. + + + +25.3.6 Closing the connection +----------------------------- + + +zfclose + Close the connection. + + + +25.3.7 Session management +------------------------- + + +zfsession [ -lvod ] [ SESSNAME ] + Allows you to manage multiple FTP sessions at once. By default, + connections take place in a session called `default'; by giving the + command `zfsession SESSNAME' you can change to a new or existing + session with a name of your choice. The new session remembers its + own connection, as well as associated shell parameters, and also + the host/user parameters set by zfparams. Hence you can have + different sessions set up to connect to different hosts, each + remembering the appropriate host, user and password. + + With no arguments, zfsession prints the name of the current + session; with the option -l it lists all sessions which currently + exist, and with the option -v it gives a verbose list showing the + host and directory for each session, where the current session is + marked with an asterisk. With -o, it will switch to the most + recent previous session. + + With -d, the given session (or else the current one) is removed; + everything to do with it is completely forgotten. If it was the + only session, a new session called `default' is created and made + current. It is safest not to delete sessions while background + commands using zftp are active. + +zftransfer SESS1:FILE1 SESS2:FILE2 + Transfer files between two sessions; no local copy is made. The + file is read from the session SESS1 as FILE1 and written to session + SESS2 as file FILE2; FILE1 and FILE2 may be relative to the + current directories of the session. Either SESS1 or SESS2 may be + omitted (though the colon should be retained if there is a + possibility of a colon appearing in the file name) and defaults to + the current session; FILE2 may be omitted or may end with a slash, + in which case the basename of FILE1 will be added. The sessions + SESS1 and SESS2 must be distinct. + + The operation is performed using pipes, so it is required that the + connections still be valid in a subshell, which is not the case + under versions of some operating systems, presumably due to a + system bug. + + + +25.3.8 Bookmarks +---------------- + +The two functions zfmark and zfgoto allow you to `bookmark' the present +location (host, user and directory) of the current FTP connection for +later use. The file to be used for storing and retrieving bookmarks is +given by the parameter $ZFTP_BMFILE; if not set when one of the two +functions is called, it will be set to the file .zfbkmarks in the +directory where your zsh startup files live (usually ~). + + +zfmark [ BOOKMARK ] + If given an argument, mark the current host, user and directory + under the name BOOKMARK for later use by zfgoto. If there is no + connection open, use the values for the last connection + immediately before it was closed; it is an error if there was + none. Any existing bookmark under the same name will be silently + replaced. + + If not given an argument, list the existing bookmarks and the + points to which they refer in the form USER@HOST:DIRECTORY; this + is the format in which they are stored, and the file may be edited + directly. + +zfgoto [ -n ] BOOKMARK + Return to the location given by BOOKMARK, as previously set by + zfmark. If the location has user `ftp' or `anonymous', open the + connection with zfanon, so that no password is required. If the + user and host parameters match those stored for the current + session, if any, those will be used, and again no password is + required. Otherwise a password will be prompted for. + + With the option -n, the bookmark is taken to be a nickname stored + by the ncftp program in its bookmark file, which is assumed to be + ~/.ncftp/bookmarks. The function works identically in other ways. + Note that there is no mechanism for adding or modifying ncftp + bookmarks from the zftp functions. + + + +25.3.9 Other functions +---------------------- + +Mostly, these functions will not be called directly (apart from +zfinit), but are described here for completeness. You may wish to +alter zftp_chpwd and zftp_progress, in particular. + + +zfinit [ -n ] + As described above, this is used to initialize the zftp function + system. The -n option should be used if the zftp command is + already built into the shell. + +zfautocheck [ -dn ] + This function is called to implement automatic reopening + behaviour, as described in more detail below. The options must + appear in the first argument; -n prevents the command from + changing to the old directory, while -d prevents it from setting + the variable do_close, which it otherwise does as a flag for + automatically closing the connection after a transfer. The host + and directory for the last session are stored in the variable + $zflastsession, but the internal host/user/password parameters + must also be correctly set. + +zfcd_match PREFIX SUFFIX + This performs matching for completion of remote directory names. + If the remote server is UNIX, it will attempt to persuade the + server to list the remote directory with subdirectories marked, + which usually works but is not guaranteed. On other hosts it + simply calls zfget_match and hence completes all files, not just + directories. On some systems, directories may not even look like + filenames. + +zfget_match PREFIX SUFFIX + This performs matching for completion of remote filenames. It + caches files for the current directory (only) in the shell + parameter $zftp_fcache. It is in the form to be called by the -K + option of compctl, but also works when called from a widget-style + completion function with PREFIX and SUFFIX set appropriately. + +zfrglob VARNAME + Perform remote globbing, as describes in more detail below. + VARNAME is the name of a variable containing the pattern to be + expanded; if there were any matches, the same variable will be set + to the expanded set of filenames on return. + +zfrtime LFILE RFILE [ TIME ] + Set the local file LFILE to have the same modification time as the + remote file RFILE, or the explicit time TIME in FTP format + CCYYMMDDhhmmSS for the GMT timezone. This uses the shell's + zsh/datetime module to perform the conversion from GMT to local + time. + +zftp_chpwd + This function is called every time a connection is opened, or + closed, or the remote directory changes. This version alters the + title bar of an xterm-compatible or sun-cmd terminal emulator to + reflect the local and remote hostnames and current directories. + It works best when combined with the function chpwd. In + particular, a function of the form + + + chpwd() { + if [[ -n $ZFTP_USER ]]; then + zftp_chpwd + else + # usual chpwd e.g put host:directory in title bar + fi + } + + fits in well. + +zftp_progress + This function shows the status of the transfer. It will not write + anything unless the output is going to a terminal; however, if you + transfer files in the background, you should turn off progress + reports by hand using `zstyle ':zftp:*' progress none'. Note also + that if you alter it, any output _must_ be to standard error, as + standard output may be a file being received. The form of the + progress meter, or whether it is used at all, can be configured + without altering the function, as described in the next section. + +zffcache + This is used to implement caching of files in the current + directory for each session separately. It is used by zfget_match + and zfrglob. + + + + +File: zsh.info, Node: Miscellaneous Features, Prev: Zftp Functions, Up: Zftp Function System + +25.4 Miscellaneous Features +=========================== + + + +25.4.1 Configuration +-------------------- + + + +Various styles are available using the standard shell style mechanism, +described in *Note The zsh/zutil Module::. Briefly, the command `zstyle +':zftp:*' STYLE VALUE ...'. defines the STYLE to have value VALUE; +more than one value may be given, although that is not useful in the +cases described here. These values will then be used throughout the +zftp function system. For more precise control, the first argument, +which gives a context in which the style applies, can be modified to +include a particular function, as for example `:zftp:zfget': the style +will then have the given value only in the zfget function. Values for +the same style in different contexts may be set; the most specific +function will be used, where strings are held to be more specific than +patterns, and longer patterns and shorter patterns. Note that only the +top level function name, as called by the user, is used; calling of +lower level functions is transparent to the user. Hence modifications +to the title bar in zftp_chpwd use the contexts :zftp:zfopen, +:zftp:zfcd, etc., depending where it was called from. The following +styles are understood: + + +progress + Controls the way that zftp_progress reports on the progress of a + transfer. If empty, unset, or `none', no progress report is made; + if `bar' a growing bar of inverse video is shown; if `percent' (or + any other string, though this may change in future), the + percentage of the file transferred is shown. The bar meter + requires that the width of the terminal be available via the + $COLUMNS parameter (normally this is set automatically). If the + size of the file being transferred is not available, bar and + percent meters will simply show the number of bytes transferred so + far. + + When zfinit is run, if this style is not defined for the context + :zftp:*, it will be set to `bar'. + +update + Specifies the minimum time interval between updates of the + progress meter in seconds. No update is made unless new data has + been received, so the actual time interval is limited only by + $ZFTP_TIMEOUT. + + As described for progress, zfinit will force this to default to 1. + +remote-glob + If set to `1', `yes' or `true', filename generation (globbing) is + performed on the remote machine instead of by zsh itself; see + below. + +titlebar + If set to `1', `yes' or `true', zftp_chpwd will put the remote + host and remote directory into the titlebar of terminal emulators + such as xterm or sun-cmd that allow this. + + As described for progress, zfinit will force this to default to 1. + +chpwd + If set to `1' `yes' or `true', zftp_chpwd will call the function + chpwd when a connection is closed. This is useful if the remote + host details were put into the terminal title bar by zftp_chpwd + and your usual chpwd also modifies the title bar. + + When zfinit is run, it will determine whether chpwd exists and if + so it will set the default value for the style to 1 if none exists + already. + + +Note that there is also an associative array zfconfig which contains +values used by the function system. This should not be modified or +overwritten. + + + +25.4.2 Remote globbing +---------------------- + + + +The commands for retrieving files usually perform filename generation +(globbing) on their arguments; this can be turned off by passing the +option -G to each of the commands. Normally this operates by +retrieving a complete list of files for the directory in question, then +matching these locally against the pattern supplied. This has the +advantage that the full range of zsh patterns (respecting the setting +of the option EXTENDED_GLOB) can be used. However, it means that the +directory part of a filename will not be expanded and must be given +exactly. If the remote server does not support the UNIX directory +semantics, directory handling is problematic and it is recommended that +globbing only be used within the current directory. The list of files +in the current directory, if retrieved, will be cached, so that +subsequent globs in the same directory without an intervening zfcd are +much faster. + +If the remote-glob style (see above) is set, globbing is instead +performed on the remote host: the server is asked for a list of matching +files. This is highly dependent on how the server is implemented, +though typically UNIX servers will provide support for basic glob +patterns. This may in some cases be faster, as it avoids retrieving +the entire list of directory contents. + + + +25.4.3 Automatic and temporary reopening +---------------------------------------- + + + +As described for the zfopen command, a subsequent zfopen with no +parameters will reopen the connection to the last host (this includes +connections made with the zfanon command). Opened in this fashion, the +connection starts in the default remote directory and will remain open +until explicitly closed. + +Automatic re-opening is also available. If a connection is not +currently open and a command requiring a connection is given, the last +connection is implicitly reopened. In this case the directory which +was current when the connection was closed again becomes the current +directory (unless, of course, the command given changes it). Automatic +reopening will also take place if the connection was close by the +remote server for whatever reason (e.g. a timeout). It is not +available if the -1 option to zfopen or zfanon was used. + +Furthermore, if the command issued is a file transfer, the connection +will be closed after the transfer is finished, hence providing a +one-shot mode for transfers. This does not apply to directory changing +or listing commands; for example a zfdir may reopen a connection but +will leave it open. Also, automatic closure will only ever happen in +the same command as automatic opening, i.e a zfdir directly followed by +a zfget will never close the connection automatically. + +Information about the previous connection is given by the zfstat +function. So, for example, if that reports: + + + Session: default + Not connected. + Last session: ftp.bar.com:/pub/textfiles + +then the command zfget file.txt will attempt to reopen a connection to +ftp.bar.com, retrieve the file /pub/textfiles/file.txt, and immediately +close the connection again. On the other hand, zfcd .. will open the +connection in the directory /pub and leave it open. + +Note that all the above is local to each session; if you return to a +previous session, the connection for that session is the one which will +be reopened. + + + +25.4.4 Completion +----------------- + +Completion of local and remote files, directories, sessions and +bookmarks is supported. The older, compctl-style completion is defined +when zfinit is called; support for the new widget-based completion +system is provided in the function Completion/Zsh/Command/_zftp, which +should be installed with the other functions of the completion system +and hence should automatically be available. + + +File: zsh.info, Node: User Contributions, Prev: Zftp Function System, Up: Top + +26 User Contributions +********************* + + + +26.1 Description +================ + +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. + + + +* Menu: + +* Utilities:: +* Recent Directories:: +* Other Directory Functions:: +* Version Control Information:: +* Prompt Themes:: +* ZLE Functions:: +* Exception Handling:: +* MIME Functions:: +* Mathematical Functions:: +* User Configuration Functions:: +* Other Functions:: + + + +File: zsh.info, Node: Utilities, Next: Recent Directories, Up: User Contributions + +26.2 Utilities +============== + + + +26.2.1 Accessing On-Line Help +----------------------------- + + + +The key sequence ESC h is normally bound by ZLE to execute the run-help +widget (see *Note Zsh Line Editor::). This invokes the run-help +command with the command word from the current input line as its +argument. By default, run-help is an alias for the man command, so +this often fails when the command word is a shell builtin or a +user-defined function. By redefining the run-help alias, one can +improve the on-line help provided by the shell. + +The helpfiles utility, found in the Util 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 run-help function, found in +Functions/Misc, searches for these helpfiles and performs several other +tests to produce the most complete help possible for the command. + +Help files are installed by default to a subdirectory of /usr/share/zsh +or /usr/local/share/zsh. + +To create your own help files with helpfiles, choose or create a +directory where the individual command help files will reside. For +example, you might choose ~/zsh_help. If you unpacked the zsh +distribution in your home directory, you would use the commands: + + + mkdir ~/zsh_help + perl ~/zsh-5.8.1/Util/helpfiles ~/zsh_help + +The HELPDIR parameter tells run-help 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: + + + HELPDIR=~/zsh_help + +To use the run-help function, you need to add lines something like the +following to your .zshrc or equivalent startup file: + + + unalias run-help + autoload run-help + +Note that in order for `autoload run-help' to work, the run-help file +must be in one of the directories named in your fpath array (see *Note +Parameters Used By The Shell::). This should already be the case if +you have a standard zsh installation; if it is not, copy +Functions/Misc/run-help to an appropriate directory. + + + +26.2.2 Recompiling Functions +---------------------------- + + + +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 zcompile 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 fpath, zsh +won't check whether any of its source files has changed. + +The zrecompile autoloadable function, found in Functions/Misc, can be +used to keep function digests up to date. + + +zrecompile [ -qt ] [ NAME ... ] +zrecompile [ -qt ] -p ARG ... [ -- ARG ... ] + This tries to find *.zwc 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 + .zwc file. + + In the first form, each NAME is the name of a compiled file or a + directory containing *.zwc files that should be checked. If no + arguments are given, the directories and *.zwc files in fpath are + used. + + When -t 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 -q option quiets + the chatty output that describes what zrecompile is doing. + + Without the -t 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. + + If the -p option is given, the ARGs are interpreted as one or more + sets of arguments for zcompile, separated by `--'. For example: + + + zrecompile -p \ + -R ~/.zshrc -- \ + -M ~/.zcompdump -- \ + ~/zsh/comp.zwc ~/zsh/Completion/*/_* + + This compiles ~/.zshrc into ~/.zshrc.zwc if that doesn't exist or + if it is older than ~/.zshrc. The compiled file will be marked for + reading instead of mapping. The same is done for ~/.zcompdump and + ~/.zcompdump.zwc, but this compiled file is marked for mapping. The + last line re-creates the file ~/zsh/comp.zwc if any of the files + matching the given pattern is newer than it. + + Without the -p option, zrecompile does not create function digests + that do not already exist, nor does it add new functions to the + digest. + + +The following shell loop is an example of a method for creating function +digests for all functions in your fpath, assuming that you have write +permission to the directories: + + + for ((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 + +The -U and -z options are appropriate for functions in the default zsh +installation fpath; you may need to use different options for your +personal function directories. + +Once the digests have been created and your fpath modified to refer to +them, you can keep them up to date by running zrecompile with no +arguments. + + + +26.2.3 Keyboard Definition +-------------------------- + + + +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 zkbd utility, +found in Functions/Misc, can help you quickly create key bindings for +your configuration. + +Run zkbd either as an autoloaded function, or as a shell script: + + + zsh -f ~/zsh-5.8.1/Functions/Misc/zkbd + +When you run zkbd, 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; zkbd warns you if it finds anything out of the +ordinary, such as a Delete key that sends neither ^H nor ^?. + +The keystrokes read by zkbd are recorded as a definition for an +associative array named key, written to a file in the subdirectory +.zkbd within either your HOME or ZDOTDIR directory. The name of the +file is composed from the TERM, VENDOR and OSTYPE parameters, joined by +hyphens. + +You may read this file into your .zshrc or another startup file with +the `source' or `.' commands, then reference the key parameter in +bindkey commands, like this: + + + source ${ZDOTDIR:-$HOME}/.zkbd/$TERM-$VENDOR-$OSTYPE + [[ -n ${key[Left]} ]] && bindkey "${key[Left]}" backward-char + [[ -n ${key[Right]} ]] && bindkey "${key[Right]}" forward-char + # etc. + +Note that in order for `autoload zkbd' to work, the zkdb file must be +in one of the directories named in your fpath array (see *Note +Parameters Used By The Shell::). This should already be the case if +you have a standard zsh installation; if it is not, copy +Functions/Misc/zkbd to an appropriate directory. + + + +26.2.4 Dumping Shell State +-------------------------- + + + +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 *Note Mailing Lists::), but +sometimes one of the zsh developers will need to recreate your +environment in order to track the problem down. + +The script named reporter, found in the Util directory of the +distribution, is provided for this purpose. (It is also possible to +autoload reporter, but reporter is not installed in fpath by default.) +This script outputs a detailed dump of the shell state, in the form of +another script that can be read with `zsh -f' to recreate that state. + +To use reporter, read the script into your shell with the `.' command +and redirect the output into a file: + + + . ~/zsh-5.8.1/Util/reporter > zsh.report + +You should check the zsh.report 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. + +You can also use reporter 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 aliases, options, and zstyles +states may be useful because they include only changes from the +defaults. The bindings state may be useful if you have created any of +your own keymaps, because reporter arranges to dump the keymap creation +commands as well as the bindings for every keymap. + +As is usual with automated tools, if you create a startup file with +reporter, you should edit the results to remove unnecessary commands. +Note that if you're using the new completion system, you should _not_ +dump the functions state to your startup files with reporter; use the +compdump function instead (see *Note Completion System::). + + +reporter [ STATE ... ] + Print to standard output the indicated subset of the current shell + state. The STATE arguments may be one or more of: + + + all + Output everything listed below. + + aliases + Output alias definitions. + + bindings + Output ZLE key maps and bindings. + + completion + Output old-style compctl commands. New completion is covered + by functions and zstyles. + + functions + Output autoloads and function definitions. + + limits + Output limit commands. + + options + Output setopt commands. + + styles + Same as zstyles. + + variables + Output shell parameter assignments, plus export commands for + any environment variables. + + zstyles + Output zstyle commands. + + If the STATE is omitted, all is assumed. + + With the exception of `all', every STATE can be abbreviated by any + prefix, even a single letter; thus a is the same as aliases, z is + the same as zstyles, etc. + + +26.2.5 Manipulating Hook Functions +---------------------------------- + + + + +add-zsh-hook [ -L | -dD ] [ -Uzk ] HOOK FUNCTION + Several functions are special to the shell, as described in the + section Special Functions, *Note Functions::, 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 add-zsh-hook provides a simple way of adding or + removing functions from the array. + + HOOK is one of chpwd, periodic, precmd, preexec, zshaddhistory, + zshexit, or zsh_directory_name, the special functions in question. + Note that zsh_directory_name is called in a different way from + the other functions, but may still be manipulated as a hook. + + FUNCTION 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. + + If the option -L is given, the current values for the hook arrays + are listed with typeset. + + If the option -d is given, the FUNCTION is removed from the array + of functions to be executed. + + If the option -D is given, the FUNCTION is treated as a pattern + and any matching names of functions are removed from the array of + functions to be executed. + + The options -U, -z and -k are passed as arguments to autoload for + FUNCTION. For functions contributed with zsh, the options -Uz are + appropriate. + +add-zle-hook-widget [ -L | -dD ] [ -Uzk ] HOOK WIDGETNAME + Several widget names are special to the line editor, as described + in the section Special Widgets, *Note Zle Widgets::, 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 + add-zle-hook-widget maintains a similar array and arranges for the + special widget to invoke those additional widgets. + + HOOK is one of isearch-exit, isearch-update, line-pre-redraw, + line-init, line-finish, history-line-set, or keymap-select, + corresponding to each of the special widgets zle-isearch-exit, + etc. The special widget names are also accepted as the HOOK + argument. + + WIDGETNAME 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 + zle WIDGETNAME -Nw -- "$@" + + Note that this means that the `WIDGET' special parameter tracks the + WIDGETNAME when the widget function is called, rather than tracking + the name of the corresponding special hook widget. + + If the option -d is given, the WIDGETNAME is removed from the + array of widgets to be executed. + + If the option -D is given, the WIDGETNAME is treated as a pattern + and any matching names of widgets are removed from the array. + + If WIDGETNAME does not name an existing widget when added to the + array, it is assumed that a shell function also named WIDGETNAME is + meant to provide the implementation of the widget. This name is + therefore marked for autoloading, and the options -U, -z and -k are + passed as arguments to autoload as with add-zsh-hook. The widget + is also created with `zle -N WIDGETNAME' to cause the + corresponding function to be loaded the first time the hook is + called. + + The arrays of WIDGETNAME are currently maintained in zstyle + contexts, one for each HOOK context, with a style of `widgets'. + If the -L option is given, this set of styles is listed with + `zstyle -L'. This implementation may change, and the special + widgets that refer to the styles are created only if + add-zle-hook-widget 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. + + + + +File: zsh.info, Node: Recent Directories, Next: Other Directory Functions, Prev: Utilities, Up: User Contributions + +26.3 Remembering Recent Directories +=================================== + +The function cdr 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 pushd, popd +and dirs 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. + +Note that the pushd directory stack is not actually modified or used by +cdr unless you configure it to do so as described in the configuration +section below. + + + +26.3.1 Installation +------------------- + +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 add-zsh-hook function described above: + + + autoload -Uz chpwd_recent_dirs cdr add-zsh-hook + add-zsh-hook chpwd chpwd_recent_dirs + +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. + + + +26.3.2 Use +---------- + +All direct user interaction is via the cdr function. + +The argument to cdr is a number N corresponding to the Nth 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 +recent-dirs-file style below. + +If you set the recent-dirs-default style described below cdr will +behave the same as cd if given a non-numeric argument, or more than one +argument. The recent directory list is updated just the same however +you change directory. + +If the argument is omitted, 1 is assumed. This is similar to pushd's +behaviour of swapping the two most recent directories on the stack. + +Completion for the argument to cdr is available if compinit has been +run; menu selection is recommended, using: + + + zstyle ':completion:*:*:cdr:*:*' menu selection + +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. + + + +26.3.3 Options +-------------- + +The behaviour of cdr may be modified by the following options. + + +-l + lists the numbers and the corresponding directories in abbreviated + form (i.e. with ~ 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. + +-r + sets the variable reply to the current set of directories. Nothing + is printed and the directory is not changed. + +-e + 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 from and contain an absolute + path, i.e. they start with /. Usually the first entry should be + left as the current directory. + +-p 'PATTERN' + 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. '*removeme*') are + needed to remove entries with a given substring. + + 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 -P instead of + -p. + + + +26.3.4 Configuration +-------------------- + +Configuration is by means of the styles mechanism that should be +familiar from completion; if not, see the description of the zstyle +command in *Note The zsh/zutil Module::. The context for setting styles +should be ':chpwd:*' in case the meaning of the context is extended in +future, for example: + + + zstyle ':chpwd:*' recent-dirs-max 0 + +sets the value of the recent-dirs-max style to 0. In practice the +style name is specific enough that a context of '*' should be fine. + +An exception is recent-dirs-insert, which is used exclusively by the +completion system and so has the usual completion system context +(':completion:*' if nothing more specific is needed), though again '*' +should be fine in practice. + + +recent-dirs-default + 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. + +recent-dirs-file + The file where the list of directories is saved. The default is + ${ZDOTDIR:-$HOME}/.chpwd-recent-dirs, i.e. this is in your home + directory unless you have set the variable ZDOTDIR to point + somewhere else. Directory names are saved in $'...' quoted form, + so each line in the file can be supplied directly to the shell as + an argument. + + 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 + can appear in the list to indicate the default + file should be read at that point. This allows effects like the + following: + + + zstyle ':chpwd:*' recent-dirs-file \ + ~/.chpwd-recent-dirs-${TTY##*/} + + + 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. + + It is possible to use zstyle -e to make the directory configurable + at run time: + + + zstyle -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 + } + + In this example, if the current directory is ~/text/writing or a + directory under it, then use a special file for saving recent + directories, else use the default. + +recent-dirs-insert + Used by completion. If recent-dirs-default is true, then setting + this to true 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. + + If the value of the style is always, then only recent directories + will be completed; in that case, use the cd command when you want + to complete other directories. + + If the value is fallback, recent directories will be tried first, + then normal directory completion is performed if recent directory + completion failed to find a match. + + Finally, if the value is both then both sets of completions are + presented; the usual tag mechanism can be used to distinguish + results, with recent directories tagged as recent-dirs. Note that + the recent directories inserted are abbreviated with directory + names where appropriate. + +recent-dirs-max + 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. + +recent-dirs-prune + This style is an array determining what directories should (or + should not) be added to the recent list. Elements of the array + can include: + + + parent + 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. + + pattern:PATTERN + 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, + 'pattern:/tmp(|/*)' stops /tmp or its descendants from being + added. The EXTENDED_GLOB option is always turned on for + these patterns. + + +recent-dirs-pushd + If set to true, cdr will use pushd instead of cd 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. + + + +26.3.5 Use with dynamic directory naming +---------------------------------------- + +It is possible to refer to recent directories using the dynamic +directory name syntax by using the supplied function +zsh_directory_name_cdr a hook: + + + autoload -Uz add-zsh-hook + add-zsh-hook -Uz zsh_directory_name zsh_directory_name_cdr + +When this is done, ~[1] will refer to the most recent directory other +than $PWD, and so on. Completion after ~[... also works. + + + +26.3.6 Details of directory handling +------------------------------------ + +This section is for the curious or confused; most users will not need +to know this information. + +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. + +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 cd -q or pushd -q to avoid +side effects if the change to the directory is to be invisible at the +command line. See the contents of the function chpwd_recent_dirs for +more details. + + + + +File: zsh.info, Node: Other Directory Functions, Next: Version Control Information, Prev: Recent Directories, Up: User Contributions + +26.4 Abbreviated dynamic references to directories +================================================== + +The dynamic directory naming system is described in the subsection +_Dynamic named directories_ of *Note Filename Expansion::. In this, a +reference to ~[...] is expanded by a function found by the hooks +mechanism. + +The contributed function zsh_directory_name_generic 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. + +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: +g + 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. + +p + The name of a project within your git area. + +s + 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. + +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. + + + +26.4.1 Usage +------------ + +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. + +Then arrange for the wrapper to be run as a zsh_directory_name hook: + + + autoload -Uz add-zsh-hook zsh_diretory_name_generic zdn_mywrapper + add-zsh-hook -U zsh_directory_name zdn_mywrapper + + +26.4.2 Configuration +-------------------- + +The wrapper function should define a local associative array zdn_top. +Alternatively, this can be set with a style called mapping. The +context for the style is :zdn:WRAPPER-NAME where WRAPPER-NAME is the +function calling zsh_directory_name_generic; for example: + + + zstyle :zdn:zdn_mywrapper: mapping zdn_mywrapper_top + +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 :default: specifies a variable in the form /:VAR (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 zdn_top have the same format as zdn_top itself, but +contain relative paths. + +For example, + + + local -A zdn_top=( + g ~/git + ga ~/alternate/git + gs /scratch/$USER/git/:second2 + :default: /:second1 + ) + +This specifies the behaviour of a directory referred to as ~[g:...] or +~[ga:...] or ~[gs:...]. Later path components are optional; in that +case ~[g] expands to ~/git, and so on. gs expands to +/scratch/$USER/git and uses the associative array second2 to match the +second component; g and ga use the associative array second1 to match +the second component. + +When expanding a name to a directory, if the first component is not g or +ga or gs, 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). + +For components after the first, a relative path is expected, but note +that multiple levels may still appear. Here is an example of second1: + + + local -A second1=( + p myproject + s somproject + os otherproject/subproject/:third + ) + +The path as found from zdn_top is extended with the matching directory, +so ~[g:p] becomes ~/git/myproject. The slash between is added +automatically (it's not possible to have a later component modify the +name of a directory already matched). Only os specifies a variable for +a third component, and there's no :default:, so it's an error to use a +name like ~[g:p:x] or ~[ga:s:y] because there's nowhere to look up the +x or y. + +The associative arrays need to be visible within this function; the +generic function therefore uses internal variable names beginning _zdn_ +in order to avoid clashes. Note that the variable reply needs to be +passed back to the shell, so should not be local in the calling +function. + +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. + + + +26.4.3 Complete example +----------------------- + +Here is a full fictitious but usable autoloadable definition of the +example function defined by the code above. So ~[gs:p:s] expands to +/scratch/$USER/git/myscratchproject/top/srcdir (with $USER also +expanded). + + + local -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 "$@ + +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: + + + typeset -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 + +and the function zdn_mywrapper would contain only the following: + + + zsh_directory_name_generic "$@" + + + +File: zsh.info, Node: Version Control Information, Next: Prompt Themes, Prev: Other Directory Functions, Up: User Contributions + +26.5 Gathering information from version control systems +======================================================= + + + +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. + +In order to do that, you may use the vcs_info function. + +The following VCSs are supported, showing the abbreviated name by which +they are referred to within the system: +Bazaar (bzr) + `https://bazaar.canonical.com/' + +Codeville (cdv) + `http://freecode.com/projects/codeville/' + +Concurrent Versioning System (cvs) + `https://www.nongnu.org/cvs/' + +Darcs (darcs) + `http://darcs.net/' + +Fossil (fossil) + `https://fossil-scm.org/' + +Git (git) + `https://git-scm.com/' + +GNU arch (tla) + `https://www.gnu.org/software/gnu-arch/' + +Mercurial (hg) + `https://www.mercurial-scm.org/' + +Monotone (mtn) + `https://monotone.ca/' + +Perforce (p4) + `https://www.perforce.com/' + +Subversion (svn) + `https://subversion.apache.org/' + +SVK (svk) + `https://svk.bestpractical.com/' + +There is also support for the patch management system quilt +(`https://savannah.nongnu.org/projects/quilt'). See *Note vcs_info +Quilt Support:: below for details. + +To load vcs_info: + + + autoload -Uz vcs_info + +It can be used in any existing prompt, because it does not require any +specific $psvar entries to be available. + + + +* Menu: + +* vcs_info Quickstart:: +* vcs_info Configuration:: +* vcs_info Oddities:: +* vcs_info Quilt Support:: +* vcs_info API:: +* vcs_info Variables:: +* vcs_info Hooks:: +* vcs_info Examples:: + + + +File: zsh.info, Node: vcs_info Quickstart, Next: vcs_info Configuration, Up: Version Control Information + +26.5.1 Quickstart +----------------- + +To get this feature working quickly (including colors), you can do the +following (assuming, you loaded vcs_info properly - see above): + + + zstyle ':vcs_info:*' actionformats \ + '%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 \ + '%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%# ' + +Obviously, the last two lines are there for demonstration. You need to +call vcs_info from your precmd function. Once that is done you need a +_single quoted_ '${vcs_info_msg_0_}' in your prompt. + +To be able to use '${vcs_info_msg_0_}' directly in your prompt like +this, you will need to have the PROMPT_SUBST option enabled. + +Now call the vcs_info_printsys utility from the command line: + + + % 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 + +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: + + + zstyle ':vcs_info:*' disable bzr cdv darcs mtn svk tla + +You may also pick a few from that list and enable only those: + + + zstyle ':vcs_info:*' enable git cvs svn + +If you rerun vcs_info_printsys after one of these commands, you will +see the backends listed in the disable style (or backends not in the +enable style - if you used that) marked as disabled by a hash sign. +That means the detection of these systems is skipped _completely_. No +wasted time there. + + + + +File: zsh.info, Node: vcs_info Configuration, Next: vcs_info Oddities, Prev: vcs_info Quickstart, Up: Version Control Information + +26.5.2 Configuration +-------------------- + +The vcs_info feature can be configured via zstyle. + +First, the context in which we are working: + :vcs_info:VCS-STRING:USER-CONTEXT:REPO-ROOT-NAME + + +VCS-STRING + is one of: git, git-svn, git-p4, hg, hg-git, hg-hgsubversion, + hg-hgsvn, darcs, bzr, cdv, mtn, svn, cvs, svk, tla, p4 or fossil. + This is followed by `.quilt-QUILT-MODE' in Quilt mode (see *Note + vcs_info Quilt Support:: for details) and by `+HOOK-NAME' while + hooks are active (see *Note vcs_info Hooks:: for details). + + Currently, hooks in quilt mode don't add the `.quilt-QUILT-MODE' + information. This may change in the future. + +USER-CONTEXT + is a freely configurable string, assignable by the user as the + first argument to vcs_info (see its description below). + +REPO-ROOT-NAME + is the name of a repository in which you want a style to match. + So, if you want a setting specific to /usr/src/zsh, with that + being a CVS checkout, you can set REPO-ROOT-NAME to zsh to make it + so. + + +There are three special values for VCS-STRING: The first is named +-init-, that is in effect as long as there was no decision what VCS +backend to use. The second is -preinit-; it is used _before_ vcs_info +is run, when initializing the data exporting variables. The third +special value is formats and is used by the vcs_info_lastmsg for +looking up its styles. + +The initial value of REPO-ROOT-NAME is -all- and it is replaced with +the actual name, as soon as it is known. Only use this part of the +context for defining the formats, actionformats or branchformat styles, +as it is guaranteed that REPO-ROOT-NAME is set up correctly for these +only. For all other styles, just use '*' instead. + +There are two pre-defined values for USER-CONTEXT: +default + the one used if none is specified + +command + used by vcs_info_lastmsg to lookup its styles + +You can of course use ':vcs_info:*' to match all VCSs in all +user-contexts at once. + +This is a description of all styles that are looked up. + + +formats + A list of formats, used when actionformats is not used (which is + most of the time). + +actionformats + 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. + +branchformat + Some backends replace %b 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. + +nvcsformats + These "formats" are set when we didn't detect a version control + system for the current directory or vcs_info was disabled. This is + useful if you want vcs_info to completely take over the generation + of your prompt. You would do something like + PS1='${vcs_info_msg_0_}' to accomplish that. + +hgrevformat + hg 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 branchformat) to include either or both. It's + only useful when get-revision is true. Note, the full 40-character + revision id is not available (except when using the use-simple + option) because executing hg more than once per prompt is too + slow; you may customize this behavior using hooks. + +max-exports + Defines the maximum number of vcs_info_msg_*_ variables vcs_info + will set. + +enable + A list of backends you want to use. Checked in the -init- context. + If this list contains an item called NONE no backend is used at + all and vcs_info will do nothing. If this list contains ALL, + vcs_info will use all known backends. Only with ALL in enable will + the disable style have any effect. ALL and NONE are case + insensitive. + +disable + A list of VCSs you don't want vcs_info to test for repositories + (checked in the -init- context, too). Only used if enable contains + ALL. + +disable-patterns + A list of patterns that are checked against $PWD. If a pattern + matches, vcs_info will be disabled. This style is checked in the + :vcs_info:-init-:*:-all- context. + + Say, ~/.zsh is a directory under version control, in which you do + not want vcs_info to be active, do: + zstyle ':vcs_info:*' disable-patterns "${(b)HOME}/.zsh(|/*)" + +use-quilt + If enabled, the quilt support code is active in `addon' mode. See + *Note vcs_info Quilt Support:: for details. + +quilt-standalone + If enabled, `standalone' mode detection is attempted if no VCS is + active in a given directory. See *Note vcs_info Quilt Support:: + for details. + +quilt-patch-dir + Overwrite the value of the $QUILT_PATCHES environment variable. See + *Note vcs_info Quilt Support:: for details. + +quiltcommand + When quilt itself is called in quilt support, the value of this + style is used as the command name. + +check-for-changes + If enabled, this style causes the %c and %u format escapes to show + when the working directory has uncommitted changes. The strings + displayed by these escapes can be controlled via the stagedstr and + unstagedstr styles. The only backends that currently support this + option are git, hg, and bzr (the latter two only support unstaged). + + For this style to be evaluated with the hg backend, the + get-revision style needs to be set and the use-simple style needs + to be unset. The latter is the default; the former is not. + + With the bzr backend, _lightweight checkouts_ only honor this + style if the use-server style is set. + + 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. + +check-for-staged-changes + This style is like check-for-changes, but it never checks the + worktree files, only the metadata in the .${vcs} dir. Therefore, + this style initializes only the %c escape (with stagedstr) but not + the %u escape. This style is faster than check-for-changes. + + In the git backend, this style checks for changes in the index. + Other backends do not currently implement this style. + + This style is disabled by default. + +stagedstr + This string will be used in the %c escape if there are staged + changes in the repository. + +unstagedstr + This string will be used in the %u escape if there are unstaged + changes in the repository. + +command + This style causes vcs_info to use the supplied string as the + command to use as the VCS's binary. Note, that setting this in + ':vcs_info:*' is not a good idea. + + 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. svn is + used in an svn repository). + + The repo-root-name part in the context is always the default -all- + when this style is looked up. + + For example, this style can be used to use binaries from + non-default installation directories. Assume, git is installed in + /usr/bin but your sysadmin installed a newer version in + /usr/local/bin. Instead of changing the order of your $PATH + parameter, you can do this: + zstyle ':vcs_info:git:*:-all-' command /usr/local/bin/git + +use-server + This is used by the Perforce backend (p4) 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 host:port pair describing the + server) cannot be contacted, its name is put into the associative + array vcs_info_p4_dead_servers and is not contacted again during + the session until it is removed by hand. If you do not set this + style, the p4 backend is only usable if you have set the + environment variable P4CONFIG to a file name and have + corresponding files in the root directories of each Perforce + client. See comments in the function VCS_INFO_detect_p4 for more + detail. + + The Bazaar backend (bzr) uses this to permit contacting the server + about lightweight checkouts, see the check-for-changes style. + +use-simple + 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 bzr and hg backends. In the case of hg it + will invoke the external hexdump program to parse the binary + dirstate cache file; this method will not return the local + revision number. + +get-revision + If set to true, vcs_info goes the extra mile to figure out the + revision of a repository's work tree (currently for the git and hg + backends, where this kind of information is not always vital). For + git, the hash value of the currently checked out commit is + available via the %i expansion. With hg, the local revision number + and the corresponding global hash are available via %i. + +get-mq + If set to true, the hg backend will look for a Mercurial Queue (mq) + patch directory. Information will be available via the `%m' + replacement. + +get-bookmarks + If set to true, the hg backend will try to get a list of current + bookmarks. They will be available via the `%m' replacement. + + 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. + +use-prompt-escapes + Determines if we assume that the assembled string from vcs_info + includes prompt escapes. (Used by vcs_info_lastmsg.) + +debug + Enable debugging output to track possible problems. Currently this + style is only used by vcs_info's hooks system. + +hooks + A list style that defines hook-function names. See *Note vcs_info + Hooks:: below for details. + +patch-format +nopatch-format + This pair of styles format the patch information used by the %m + expando in formats and actionformats for the git and hg backends. + The value is subject to certain %-expansions described below. The + expanded value is made available in the global backend_misc array + as ${backend_misc[patches]} (also if a set-patch-format hook is + used). + +get-unapplied + This boolean style controls whether a backend should attempt to + gather a list of unapplied patches (for example with Mercurial + Queue patches). + + Used by the quilt and hg backends. + + +The default values for these styles in all contexts are: + + +formats + " (%s)-[%b]%u%c-" + +actionformats + " (%s)-[%b|%a]%u%c-" + +branchformat + "%b:%r" (for bzr, svn, svk and hg) + +nvcsformats + "" + +hgrevformat + "%r:%h" + +max-exports + 2 + +enable + ALL + +disable + (empty list) + +disable-patterns + (empty list) + +check-for-changes + false + +check-for-staged-changes + false + +stagedstr + (string: "S") + +unstagedstr + (string: "U") + +command + (empty string) + +use-server + false + +use-simple + false + +get-revision + false + +get-mq + true + +get-bookmarks + false + +use-prompt-escapes + true + +debug + false + +hooks + (empty list) + +use-quilt + false + +quilt-standalone + false + +quilt-patch-dir + empty - use $QUILT_PATCHES + +quiltcommand + quilt + +patch-format + BACKEND DEPENDENT + +nopatch-format + BACKEND DEPENDENT + +get-unapplied + false + +In normal formats and actionformats the following replacements are done: + + +%s + The VCS in use (git, hg, svn, etc.). + +%b + Information about the current branch. + +%a + An identifier that describes the action. Only makes sense in + actionformats. + +%i + The current revision number or identifier. For hg the hgrevformat + style may be used to customize the output. + +%c + The string from the stagedstr style if there are staged changes in + the repository. + +%u + The string from the unstagedstr style if there are unstaged + changes in the repository. + +%R + The base directory of the repository. + +%r + The repository name. If %R is /foo/bar/repoXY, %r is repoXY. + +%S + A subdirectory within a repository. If $PWD is + /foo/bar/repoXY/beer/tasty, %S is beer/tasty. + +%m + A "misc" replacement. It is at the discretion of the backend to + decide what this replacement expands to. + + The hg and git backends use this expando to display patch + information. hg sources patch information from the mq extensions; + git from in-progress rebase and cherry-pick operations and from + the stgit extension. The patch-format and nopatch-format 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. + + The hg backend displays bookmark information in this expando (in + addition to mq information). See the get-mq and get-bookmarks + 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). + + The quilt `standalone' backend sets this expando to the same value + as the %Q expando. + +%Q + Quilt series information. When quilt is used (either in `addon' + mode or as a `standalone' backend), this expando is set to quilt + series' patch-format string. The set-patch-format hook and + nopatch-format style are honoured. + + See *Note vcs_info Quilt Support:: below for details. + + +In branchformat these replacements are done: + + +%b + The branch name. + +%r + The current revision number or the hgrevformat style for hg. + +In hgrevformat these replacements are done: + + +%r + The current local revision number. + +%h + The current global revision identifier. + +In patch-format and nopatch-format these replacements are done: + + +%p + The name of the top-most applied patch; may be overridden by the + applied-string hook. + +%u + The number of unapplied patches; may be overridden by the + unapplied-string hook. + +%n + The number of applied patches. + +%c + The number of unapplied patches. + +%a + The number of all patches (%a = %n + %c). + +%g + The names of active mq guards (hg backend). + +%G + The number of active mq guards (hg backend). + +Not all VCS backends have to support all replacements. For nvcsformats +no replacements are performed at all, it is just a string. + + + + +File: zsh.info, Node: vcs_info Oddities, Next: vcs_info Quilt Support, Prev: vcs_info Configuration, Up: Version Control Information + +26.5.3 Oddities +--------------- + +If you want to use the %b (bold off) prompt expansion in formats, which +expands %b itself, use %%b. That will cause the vcs_info expansion to +replace %%b with %b, so that zsh's prompt expansion mechanism can +handle it. Similarly, to hand down %b from branchformat, use %%%%b. +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. + +When one of the gen-applied-string, gen-unapplied-string, and +set-patch-format hooks is defined, applying %-escaping +(`foo=${foo//'%'/%%}') to the interpolated values for use in the prompt +is the responsibility of those hooks (jointly); when neither of those +hooks is defined, vcs_info handles escaping by itself. We regret this +coupling, but it was required for backwards compatibility. + + + + +File: zsh.info, Node: vcs_info Quilt Support, Next: vcs_info API, Prev: vcs_info Oddities, Up: Version Control Information + +26.5.4 Quilt Support +-------------------- + +`Quilt' 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. + +The vcs_info integration tries to support both ways of using quilt by +having two slightly different modes of operation: `addon' mode and +`standalone' mode). + +Quilt integration is off by default; to enable it, set the use-quilt +style, and add %Q to your formats or actionformats style: + zstyle ':vcs_info:*' use-quilt true + +Styles looked up from the Quilt support code include `.quilt-QUILT-MODE' +in the VCS-STRING part of the context, where QUILT-MODE is either addon +or standalone. Example: +:vcs_info:git.quilt-addon:default:REPO-ROOT-NAME. + +For `addon' mode to become active vcs_info 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 `QUILT_PATCHES' environment variable. +If that variable exists its value is used, otherwise the value +`patches' is assumed. The value from $QUILT_PATCHES can be overwritten +using the `quilt-patches' style. (Note: you can use vcs_info to keep +the value of $QUILT_PATCHES correct all the time via the post-quilt +hook). + +When the directory in question is found, quilt is assumed to be active. +To gather more information, vcs_info 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). + +If patches are applied, vcs_info 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 get-unapplied style in the appropriate context. + +vcs_info allows for very detailed control over how the gathered +information is presented (see *Note vcs_info Configuration:: and *Note +vcs_info Hooks::), 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 stgit for `git', or mq for `hg'); the +configuration for systems like that are generally configured the same +way as the `quilt' support. + +If the `quilt' support is working in `addon' mode, the produced string +is available as a simple format replacement (%Q to be precise), which +can be used in formats and actionformats; see below for details). + +If, on the other hand, the support code is working in `standalone' mode, +vcs_info will pretend as if quilt 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 +`-quilt-'. This has implications on the used style context where this +identifier is the second element. vcs_info 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 %Q for compatibility with `addon' mode). + +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 vcs_info to try and look for Quilt in +`standalone' mode to minimise the amount of searching on every call to +vcs_info, there are a number of ways to do that: + +Essentially, `standalone' mode detection is controlled by a style called +`quilt-standalone'. It is a string style and its value can have +different effects. The simplest values are: `always' to run detection +every time vcs_info is run, and `never' to turn the detection off +entirely. + +If the value of quilt-standalone 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. + +If the value of quilt-standalone is an array, the elements of that array +are used as directory names under which you want the detection to be +active. + +If quilt-standalone 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 `true'. + +Last, but not least, if the value of quilt-standalone 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. + +Note, if there is both a function and a variable by the name of +quilt-standalone, the function will take precedence. + + + + +File: zsh.info, Node: vcs_info API, Next: vcs_info Variables, Prev: vcs_info Quilt Support, Up: Version Control Information + +26.5.5 Function Descriptions (Public API) +----------------------------------------- + + +vcs_info [USER-CONTEXT] + The main function, that runs all backends and assembles all data + into ${vcs_info_msg_*_}. This is the function you want to call from + precmd if you want to include up-to-date information in your + prompt (see *Note vcs_info Variables:: below). If an argument is + given, that string will be used instead of default in the + USER-CONTEXT field of the style context. + +vcs_info_hookadd + 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 `+vi-' + prefix needs to be left out here. See *Note vcs_info Hooks:: below + for details. + +vcs_info_hookdel + 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 `-a' is used + as the first argument, all 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 `+vi-' + prefix needs to be left out here. See *Note vcs_info Hooks:: + below for details. + +vcs_info_lastmsg + Outputs the last ${vcs_info_msg_*_} value. Takes into account the + value of the use-prompt-escapes style in + ':vcs_info:formats:command:-all-'. It also only prints max-exports + values. + +vcs_info_printsys [USER-CONTEXT] + 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 disable style. + +vcs_info_setsys + Initializes vcs_info's internal list of available backends. With + this function, you can add support for new VCSs without restarting + the shell. + + +All functions named VCS_INFO_* are for internal use only. + + + + +File: zsh.info, Node: vcs_info Variables, Next: vcs_info Hooks, Prev: vcs_info API, Up: Version Control Information + +26.5.6 Variable Description +--------------------------- + + +${vcs_info_msg_N_} (Note the trailing underscore) + Where N is an integer, e.g., vcs_info_msg_0_. These variables are + the storage for the informational message the last vcs_info call + has assembled. These are strongly connected to the formats, + actionformats and nvcsformats styles described above. Those styles + are lists. The first member of that list gets expanded into + ${vcs_info_msg_0_}, the second into ${vcs_info_msg_1_} and the Nth + into ${vcs_info_msg_N-1_}. (See the max-exports style above.) + + +All variables named VCS_INFO_* are for internal use only. + + + + +File: zsh.info, Node: vcs_info Hooks, Next: vcs_info Examples, Prev: vcs_info Variables, Up: Version Control Information + +26.5.7 Hooks in vcs_info +------------------------ + +Hooks are places in vcs_info 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. + +For configuration, hooks change the style context: + :vcs_info:VCS-STRING+HOOK-NAME:USER-CONTEXT:REPO-ROOT-NAME + +To register functions to a hook, you need to list them in the hooks +style in the appropriate context. + +Example: + zstyle ':vcs_info:*+foo:*' hooks bar baz + +This registers functions to the hook `foo' for all backends. In order to +avoid namespace problems, all registered function names are prepended by +a `+vi-', so the actual functions called for the `foo' hook are +`+vi-bar' and `+vi-baz'. + +If you would like to register a function to a hook regardless of the +current context, you may use the vcs_info_hookadd function. To remove a +function that was added like that, the vcs_info_hookdel function can be +used. + +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. + +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 before statically registered ones (the ones added by +vcs_info_hookadd). + +You may pass data between functions via an associative array, user_data. +For example: + + +vi-git-myfirsthook(){ + user_data[myval]=$myval + } + +vi-git-mysecondhook(){ + # do something with ${user_data[myval]} + } + +There are a number of variables that are special in hook contexts: + + +ret + The return value that the hooks system will return to the caller. + The default is an integer `zero'. If and how a changed ret value + changes the execution of the caller depends on the specific hook. + See the hook documentation below for details. + +hook_com + An associated array which is used for bidirectional communication + from the caller to hook functions. The used keys depend on the + specific hook. + +context + The active context of the hook. Functions that wish to change this + variable should make it local scope first. + +vcs + The current VCS after it was detected. The same values as in the + enable/disable style are used. Available in all hooks except + start-up. + + +Finally, the full list of currently available hooks: + + +start-up + Called after starting vcs_info but before the VCS in this + directory is determined. It can be used to deactivate vcs_info + temporarily if necessary. When ret is set to 1, vcs_info aborts + and does nothing; when set to 2, vcs_info sets up everything as if + no version control were active and exits. + +pre-get-data + Same as start-up but after the VCS was detected. + +gen-hg-bookmark-string + Called in the Mercurial backend when a bookmark string is + generated; the get-revision and get-bookmarks styles must be true. + + This hook gets the names of the Mercurial bookmarks that vcs_info + collected from `hg'. + + If a bookmark is active, the key ${hook_com[hg-active-bookmark]} is + set to its name. The key is otherwise unset. + + When setting ret to non-zero, the string in + ${hook_com[hg-bookmark-string]} will be used in the %m escape in + formats and actionformats and will be available in the global + backend_misc array as ${backend_misc[bookmarks]}. + +gen-applied-string + Called in the git (with stgit or during rebase or merge), and hg + (with mq) backends and in quilt support when the applied-string is + generated; the use-quilt zstyle must be true for quilt (the mq and + stgit backends are active by default). + + This hook gets the names of all applied patches which vcs_info + collected so far in the opposite order, which means that the first + argument is the top-most patch and so forth. + + When setting ret to non-zero, the string in + ${hook_com[applied-string]} will be available as %p in the + patch-format and nopatch-format styles. This hook is, in concert + with set-patch-format, responsible for %-escaping that value for + use in the prompt. (See *Note vcs_info Oddities::.) + +gen-unapplied-string + Called in the git (with stgit or during rebase), and hg (with mq) + backend and in quilt support when the unapplied-string is + generated; the get-unapplied style must be true. + + This hook gets the names of all unapplied patches which vcs_info + collected so far in order, which means that the first argument is + the patch next-in-line to be applied and so forth. + + When setting ret to non-zero, the string in + ${hook_com[unapplied-string]} will be available as %u in the + patch-format and nopatch-format styles. This hook is, in concert + with set-patch-format, responsible for %-escaping that value for + use in the prompt. (See *Note vcs_info Oddities::.) + +gen-mqguards-string + Called in the hg backend when guards-string is generated; the + get-mq style must be true (default). + + This hook gets the names of any active mq guards. + + When setting ret to non-zero, the string in + ${hook_com[guards-string]} will be used in the %g escape in the + patch-format and nopatch-format styles. + +no-vcs + This hooks is called when no version control system was detected. + + The `hook_com' parameter is not used. + +post-backend + Called as soon as the backend has finished collecting information. + + The `hook_com' keys available are as for the set-message hook. + +post-quilt + Called after the quilt 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 "-nopc-" if that + directory wasn't found. + + The `hook_com' parameter is not used. + +set-branch-format + Called before `branchformat' is set. The only argument to the hook + is the format that is configured at this point. + + The `hook_com' keys considered are `branch' and `revision'. They + are set to the values figured out so far by vcs_info and any + change will be used directly when the actual replacement is done. + + If ret is set to non-zero, the string in + ${hook_com[branch-replace]} will be used unchanged as the `%b' + replacement in the variables set by vcs_info. + +set-hgrev-format + Called before a `hgrevformat' is set. The only argument to the + hook is the format that is configured at this point. + + The `hook_com' keys considered are `hash' and `localrev'. They + are set to the values figured out so far by vcs_info and any + change will be used directly when the actual replacement is done. + + If ret is set to non-zero, the string in ${hook_com[rev-replace]} + will be used unchanged as the `%i' replacement in the variables + set by vcs_info. + +pre-addon-quilt + This hook is used when vcs_info'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. + + Setting the `ret' variable in this hook to a non-zero value avoids + any quilt specific actions from being run at all. + +set-patch-format + This hook is used to control some of the possible expansions in + patch-format and nopatch-format styles with patch queue systems + such as quilt, mqueue and the like. + + This hook is used in the git, hg and quilt backends. + + The hook allows the control of the %p (${hook_com[applied]}) and %u + (${hook_com[unapplied]}) expansion in all backends that use the + hook. With the mercurial backend, the %g (${hook_com[guards]}) + expansion is controllable in addition to that. + + If ret is set to non-zero, the string in ${hook_com[patch-replace]} + will be used unchanged instead of an expanded format from + patch-format or nopatch-format. + + This hook is, in concert with the gen-applied-string or + gen-unapplied-string hooks if they are defined, responsible for + %-escaping the final patch-format value for use in the prompt. + (See *Note vcs_info Oddities::.) + +set-message + Called each time before a `vcs_info_msg_N_' message is set. It + takes two arguments; the first being the `N' in the message + variable name, the second is the currently configured formats or + actionformats. + + There are a number of `hook_com' keys, that are used here: + `action', `branch', `base', `base-name', `subdir', `staged', + `unstaged', `revision', `misc', `vcs' and one `miscN' entry for + each backend-specific data field (N starting at zero). They are + set to the values figured out so far by vcs_info and any change + will be used directly when the actual replacement is done. + + Since this hook is triggered multiple times (once for each + configured formats or actionformats), each of the `hook_com' keys + mentioned above (except for the miscN entries) has an `_orig' + counterpart, so even if you changed a value to your liking you can + still get the original value in the next run. Changing the `_orig' + values is probably not a good idea. + + If ret is set to non-zero, the string in ${hook_com[message]} will + be used unchanged as the message by vcs_info. + + +If all of this sounds rather confusing, take a look at *Note vcs_info +Examples:: and also in the Misc/vcs_info-examples file in the Zsh +source. They contain some explanatory code. + + + + +File: zsh.info, Node: vcs_info Examples, Prev: vcs_info Hooks, Up: Version Control Information + +26.5.8 Examples +--------------- + +Don't use vcs_info at all (even though it's in your prompt): + zstyle ':vcs_info:*' enable NONE + +Disable the backends for bzr and svk: + zstyle ':vcs_info:*' disable bzr svk + +Disable everything _but_ bzr and svk: + zstyle ':vcs_info:*' enable bzr svk + +Provide a special formats for git: + zstyle ':vcs_info:git:*' formats ' GIT, BABY! [%b]' + zstyle ':vcs_info:git:*' actionformats ' GIT ACTION! [%b|%a]' + +All %x expansion in all sorts of formats (formats, actionformats, +branchformat, you name it) are done using the `zformat' builtin from +the `zsh/zutil' module. That means you can do everything with these %x +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: %12.12i. That'll shrink the 40 character +hash to its 12 leading characters. The form is actually `%MIN.MAXx'. +More is possible. See *Note The zsh/zutil Module:: for details. + +Use the quicker bzr backend + zstyle ':vcs_info:bzr:*' use-simple true + +If you do use use-simple, please report if it does +`the-right-thing[tm]'. + +Display the revision number in yellow for bzr and svn: + zstyle ':vcs_info:(svn|bzr):*' \ + branchformat '%b%{'${fg[yellow]}'%}:%r' + +If you want colors, make sure you enclose the color codes in %{...%} if +you want to use the string provided by vcs_info in prompts. + +Here is how to print the VCS information as a command (not in a prompt): + alias vcsi='vcs_info command; vcs_info_lastmsg' + +This way, you can even define different formats for output via +vcs_info_lastmsg in the ':vcs_info:*:command:*' namespace. + +Now as promised, some code that uses hooks: say, you'd like to replace +the string `svn' by `subversion' in vcs_info's %s formats replacement. + +First, we will tell vcs_info to call a function when populating the +message variables with the gathered information: + zstyle ':vcs_info:*+set-message:*' hooks svn2subversion + +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 `debug' style: + zstyle ':vcs_info:*+*:*' debug true + +That should give you an idea what is going on. Specifically, the +function that we are looking for is `+vi-svn2subversion'. Note, the +`+vi-' prefix. So, everything is in order, just as documented. When you +are done checking out the debugging output, disable it again: + zstyle ':vcs_info:*+*:*' debug false + +Now, let's define the function: + + function +vi-svn2subversion() { + [[ ${hook_com[vcs_orig]} == svn ]] && hook_com[vcs]=subversion + } + +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 `svn' backend's context, we don't need to test which the active +backend is: + zstyle ':vcs_info:svn+set-message:*' hooks svn2subversion + + + function +vi-svn2subversion() { + hook_com[vcs]=subversion + } + +And finally a little more elaborate example, that uses a hook to create +a customised bookmark string for the hg backend. + +Again, we start off by registering a function: + zstyle ':vcs_info:hg+gen-hg-bookmark-string:*' hooks hgbookmarks + +And then we define the `+vi-hgbookmarks' function: + + 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 + } + +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. + +This concludes our guided tour through zsh's vcs_info. + + + + +File: zsh.info, Node: Prompt Themes, Next: ZLE Functions, Prev: Version Control Information, Up: User Contributions + +26.6 Prompt Themes +================== + + + +26.6.1 Installation +------------------- + +You should make sure all the functions from the Functions/Prompts +directory of the source distribution are available; they all begin with +the string `prompt_' except for the special function`promptinit'. You +also need the `colors' and `add-zsh-hook' functions from Functions/Misc. +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 fpath array (this should already be the +case if they were installed), and at least the function promptinit +should be autoloaded; it will autoload the rest. Finally, to initialize +the use of the system you need to call the promptinit function. The +following code in your .zshrc will arrange for this; assume the +functions are stored in the directory ~/myfns: + + + fpath=(~/myfns $fpath) + autoload -U promptinit + promptinit + + +26.6.2 Theme Selection +---------------------- + +Use the prompt command to select your preferred theme. This command +may be added to your .zshrc following the call to promptinit in order +to start zsh with a theme already selected. + + +prompt [ -c | -l ] +prompt [ -p | -h ] [ THEME ... ] +prompt [ -s ] THEME [ ARG ... ] + Set or examine the prompt theme. With no options and a THEME + argument, the theme with that name is set as the current theme. + The available themes are determined at run time; use the -l option + to see a list. The special THEME `random' selects at random one + of the available themes and sets your prompt to that. + + In some cases the THEME 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. + + Options are: + + + -c + Show the currently selected theme and its parameters, if any. + + -l + List all available prompt themes. + + -p + Preview the theme named by THEME, or all themes if no THEME + is given. + + -h + Show help for the theme named by THEME, or for the prompt + function if no THEME is given. + + -s + Set THEME as the current theme and save state. + +prompt_THEME_setup + Each available THEME has a setup function which is called by the + prompt 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. + + + +26.6.3 Utility Themes +--------------------- + + +prompt off + The theme `off' sets all the prompt variables to minimal values + with no special effects. + +prompt default + The theme `default' sets all prompt variables to the same state as + if an interactive zsh was started with no initialization files. + +prompt restore + The special theme `restore' erases all theme settings and sets + prompt variables to their state before the first time the `prompt' + function was run, provided each theme has properly defined its + cleanup (see below). + + Note that you can undo `prompt off' and `prompt default' with + `prompt restore', but a second restore does not undo the first. + + + +26.6.4 Writing Themes +--------------------- + +The first step for adding your own theme is to choose a name for it, +and create a file `prompt_NAME_setup' in a directory in your fpath, +such as ~/myfns 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 PS1, PS2, RPS1, etc., rather than +the longer PROMPT and RPROMPT. + +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: + + +Assign prompt_opts + The array prompt_opts may be assigned any of "bang", "cr", + "percent", "sp", and/or "subst" as values. The corresponding + setopts (promptbang, etc.) are turned on, all other prompt-related + options are turned off. The prompt_opts array preserves setopts + even beyond the scope of localoptions, should your function need + that. + +Modify precmd and preexec + Use of add-zsh-hook is recommended. The precmd and preexec hooks + are automatically adjusted if the prompt theme changes or is + disabled. + +Declare cleanup + If your function makes any other changes that should be undone + when the theme is disabled, your setup function may call + prompt_cleanup COMMAND + where COMMAND should be suitably quoted. If your theme is ever + disabled or replaced by another, COMMAND is executed with eval. + You may declare more than one such cleanup hook. + +Define preview + Define or autoload a function prompt_NAME_preview to display a + simulated version of your prompt. A simple default previewer is + defined by promptinit for themes that do not define their own. + This preview function is called by `prompt -p'. + +Provide help + Define or autoload a function prompt_NAME_help to display + documentation or help text for your theme. This help function is + called by `prompt -h'. + + + + +File: zsh.info, Node: ZLE Functions, Next: Exception Handling, Prev: Prompt Themes, Up: User Contributions + +26.7 ZLE Functions +================== + + + +26.7.1 Widgets +-------------- + +These functions all implement user-defined ZLE widgets (see *Note Zsh +Line Editor::) which can be bound to keystrokes in interactive shells. +To use them, your .zshrc should contain lines of the form + + + autoload FUNCTION + zle -N FUNCTION + +followed by an appropriate bindkey command to associate the function +with a key sequence. Suggested bindings are described below. + + +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: + + + autoload -U select-word-style + select-word-style bash + + +forward-word-match, backward-word-match +kill-word-match, backward-kill-word-match +transpose-words-match, capitalize-word-match +up-case-word-match, down-case-word-match +delete-whole-word-match, select-word-match +select-word-style, match-word-context, match-words-by-style + The first eight `-match' 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 + select-word-style, the way words are matched can be altered. + select-word-match is intended to be used as a text object in vi + mode but with custom word styles. For comparison, the widgets + described in *Note Text Objects:: use fixed definitions of words, + compatible with the vim editor. + + The simplest way of configuring the functions is to use + select-word-style, 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 -match + functions will automatically replace the builtin versions, so they + do not need to be loaded explicitly. + + The word styles available are as follows. Only the first character + is examined. + + + bash + Word characters are alphanumeric characters only. + + normal + As in normal shell operation: word characters are + alphanumeric characters plus any characters present in the + string given by the parameter $WORDCHARS. + + shell + Words are complete shell command arguments, possibly + including complete quoted strings, or any tokens special to + the shell. + + whitespace + Words are any set of characters delimited by whitespace. + + default + Restore the default settings; this is usually the same as + `normal'. + + + All but `default' 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 subword-range can supply an alternative character range + to the default `[:upper:]'; the value of the style is treated as + the contents of a `[...]' pattern (note that the outer brackets + should not be supplied, only those surrounding named ranges). + + More control can be obtained using the zstyle command, as + described in *Note The zsh/zutil Module::. Each style is looked + up in the context :zle:WIDGET where WIDGET 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 select-word-style the + appropriate contexts are :zle:forward-word, and so on. The + function select-word-style itself always defines styles for the + context `:zle:*' which can be overridden by more specific (longer) + patterns as well as explicit contexts. + + The style word-style specifies the rules to use. This may have the + following values. + + + normal + Use the standard shell rules, i.e. alphanumerics and + $WORDCHARS, unless overridden by the styles word-chars or + word-class. + + specified + Similar to normal, but _only_ the specified characters, and + not also alphanumerics, are considered word characters. + + unspecified + The negation of specified. The given characters are those + which will _not_ be considered part of a word. + + shell + Words are obtained by using the syntactic rules for + generating shell command arguments. In addition, special + tokens which are never command arguments such as `()' are + also treated as words. + + whitespace + Words are whitespace-delimited strings of characters. + + + The first three of those rules usually use $WORDCHARS, but the + value in the parameter can be overridden by the style word-chars, + which works in exactly the same way as $WORDCHARS. In addition, + the style word-class uses character class syntax to group + characters and takes precedence over word-chars if both are set. + The word-class style does not include the surrounding brackets of + the character class; for example, `-:[:alnum:]' is a valid + word-class to include all alphanumerics plus the characters `-' + and `:'. Be careful including `]', `^' and `-' as these are + special inside character classes. + + word-style may also have `-subword' appended to its value to turn + on subword matching, as described above. + + The style skip-chars is mostly useful for transpose-words 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 + + + zstyle ':zle:transpose-words' skip-chars 1 + + has been set, and transpose-words-match is called with the cursor + on the X of fooXbar, where X can be any character, then the + resulting expression is barXfoo. + + Finer grained control can be obtained by setting the style + word-context to an array of pairs of entries. Each pair of + entries consists of a PATTERN and a SUBCONTEXT. The shell + argument the cursor is on is matched against each PATTERN in turn + until one matches; if it does, the context is extended by a colon + and the corresponding SUBCONTEXT. 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 between the word + is set to a single space; else if it is contains the string back, + the word before the cursor is considered, else the word after + cursor is considered. Some examples are given below. + + The style skip-whitespace-first is only used with the forward-word + widget. If it is set to true, then forward-word 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 select-word-style the widget + is set in the context :zle:* to true if the word style is bash and + false otherwise. It may be overridden by setting it in the more + specific context :zle:forward-word*. + + 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 + backward-kill-space-word using backward-kill-word-match, the + generic widget implementing backward-kill-word behaviour, and + ensures that the new widget always implements space-delimited + behaviour. + + + zle -N backward-kill-space-word backward-kill-word-match + zstyle :zle:backward-kill-space-word word-style space + + The widget backward-kill-space-word can now be bound to a key. + + Here are some further examples of use of the styles, actually + taken from the simplified interface in select-word-style: + + + zstyle ':zle:*' word-style standard + zstyle ':zle:*' word-chars '' + + Implements bash-style word handling for all widgets, i.e. only + alphanumerics are word characters; equivalent to setting the + parameter WORDCHARS empty for the given context. + + + style ':zle:*kill*' word-style space + + Uses space-delimited words for widgets with the word `kill' in the + name. Neither of the styles word-chars nor word-class is used in + this case. + + Here are some examples of use of the word-context style to extend + the context. + + + zstyle ':zle:*' word-context \ + "*/*" 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 '' + + This provides two different ways of using transpose-words + depending on whether the cursor is on whitespace between words or + on a filename, here any word containing a /. 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 + :zle:transpose-words. + + The word matching and all the handling of zstyle settings is + actually implemented by the function match-words-by-style. This + can be used to create new user-defined widgets. The calling + function should set the local parameter curcontext to :zle:WIDGET, + create the local parameter matched_words and call + match-words-by-style with no arguments. On return, matched_words + 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 skip-chars + 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. + + If the variable matched_words is defined by the caller to + match-words-by-style as an associative array (local -A + matched_words), then the seven values given above should be + retrieved from it as elements named start, word-before-cursor, + ws-before-cursor, ws-after-cursor, word-after-cursor, + ws-after-word, and end. In addition the element is-word-start 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 + ws-after-cursor element) and 0 otherwise. This form is + recommended for future compatibility. + + It is possible to pass options with arguments to + match-words-by-style to override the use of styles. The options + are: + -w + WORD-STYLE + + -s + SKIP-CHARS + + -c + WORD-CLASS + + -C + WORD-CHARS + + -r + SUBWORD-RANGE + + For example, match-words-by-style -w shell -c 0 may be used to + extract the command argument around the cursor. + + The word-context style is implemented by the function + match-word-context. This should not usually need to be called + directly. + +bracketed-paste-magic + The bracketed-paste widget (see *Note Miscellaneous:: in *Note Zle + Widgets::) 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 + url-quote-magic widget described below. + + The bracketed-paste-magic widget is meant to replace + bracketed-paste with a wrapper that re-enables these self-insert + actions, and other actions as selected by zstyles. Therefore this + widget is installed with + + autoload -Uz bracketed-paste-magic + zle -N bracketed-paste bracketed-paste-magic + + Other than enabling some widget processing, bracketed-paste-magic + attempts to replicate bracketed-paste as faithfully as possible. + + The following zstyles may be set to control processing of pasted + text. All are looked up in the context `:bracketed-paste-magic'. + + + active-widgets + 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 `self-*' so + any user-defined widgets named with that prefix are active + along with the builtin self-insert. + + 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 `undefined-key', + any unknown sequences are discarded from the pasted text. + + inactive-keys + The inverse of active-widgets, a list of key sequences that + always use self-insert-unmeta even when bound to an active + widget. Note that this is a list of literal key sequences, + not patterns. + + paste-init + 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 `PASTED' + contains the initial state of the pasted text. All other ZLE + parameters such as `BUFFER' have their normal values and + side-effects, and full history is available, so for example + paste-init functions may move words from BUFFER into PASTED + to make those words visible to the active-widgets. + + A non-zero return from a paste-init function does _not_ + prevent the paste itself from proceeding. + + Loading bracketed-paste-magic defines backward-extend-paste, a + helper function for use in paste-init. + + + zstyle :bracketed-paste-magic paste-init \ + backward-extend-paste + + When a paste would insert into the middle of a word or append + text to a word already on the line, backward-extend-paste + moves the prefix from LBUFFER into PASTED so that the + active-widgets see the full word so far. This may be useful + with url-quote-magic. + + paste-finish + Another list of function names called in order until one + returns non-zero. These functions are called _after_ the + pasted text has been processed by the active-widgets, but + _before_ it is inserted into `BUFFER'. ZLE parameters have + their normal values and side-effects. + + A non-zero return from a paste-finish function does _not_ + prevent the paste itself from proceeding. + + Loading bracketed-paste-magic also defines quote-paste, a + helper function for use in paste-finish. + + + zstyle :bracketed-paste-magic paste-finish \ + quote-paste + zstyle :bracketed-paste-magic:finish quote-style \ + qqq + + When the pasted text is inserted into BUFFER, it is quoted + per the quote-style value. To forcibly turn off the built-in + numeric prefix quoting of bracketed-paste, use: + + + zstyle :bracketed-paste-magic:finish quote-style \ + none + + + _Important:_ During active-widgets processing of the paste (after + paste-init and before paste-finish), BUFFER starts empty and + history is restricted, so cursor motions, etc., may not pass + outside of the pasted content. Text assigned to BUFFER by the + active widgets is copied back into PASTED before paste-finish. + +copy-earlier-word + This widget works like a combination of insert-last-word and + copy-prev-shell-word. Repeated invocations of the widget retrieve + earlier words on the relevant history line. With a numeric + argument N, insert the Nth word from the history line; N may be + negative to count from the end of the line. + + If insert-last-word 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. + + Otherwise, the widget applies to words on the line currently being + edited. The widget 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 insert-last-word. + +cycle-completion-positions + 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. + + 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. + +delete-whole-word-match + This is another function which works like the -match functions + described immediately above, i.e. using styles to decide the word + boundaries. However, it is not a replacement for any existing + function. + + 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 kill, + the removed text will be placed in the cutbuffer for future + yanking. This can be obtained by defining kill-whole-word-match + as follows: + + + zle -N kill-whole-word-match delete-whole-word-match + + and then binding the widget kill-whole-word-match. + +up-line-or-beginning-search, down-line-or-beginning-search + These widgets are similar to the builtin functions + up-line-or-search and down-line-or-search: 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 + history-beginning-search-backward and -forward, rather than the + first word on the line. + +edit-command-line + Edit the command line using your visual editor, as in ksh. + + + bindkey -M vicmd v edit-command-line + +expand-absolute-path + 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. + +history-search-end + This function implements the widgets + history-beginning-search-backward-end and + history-beginning-search-forward-end. These commands work by first + calling the corresponding builtin widget (see *Note History + Control::) 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. + + Although you autoload only one function, the commands to use it are + slightly different because it implements two widgets. + + + zle -N history-beginning-search-backward-end \ + history-search-end + zle -N history-beginning-search-forward-end \ + history-search-end + bindkey '\e^P' history-beginning-search-backward-end + bindkey '\e^N' history-beginning-search-forward-end + +history-beginning-search-menu + This function implements yet another form of history searching. + The text before the cursor is used to select lines from the + history, as for history-beginning-search-backward 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. + + 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. + + If the widget name contains `-end' the cursor is moved to the end + of the line inserted. If the widget name contains `-space' 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: + + + zle -N history-beginning-search-menu-space-end \ + history-beginning-search-menu + +history-pattern-search + The function history-pattern-search 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 ^ to anchor the search to the start of the + line, and the last character may be $ 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. + + The commands to create bindable widgets are similar to those in the + example immediately above: + + + autoload -U history-pattern-search + zle -N history-pattern-search-backward history-pattern-search + zle -N history-pattern-search-forward history-pattern-search + +incarg + 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 incarg may be set to change the + default increment to something other than one. + + + bindkey '^X+' incarg + +incremental-complete-word + 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 ^H or DEL. Pressing + return accepts the completion so far and returns you to normal + editing (that is, the command line is _not_ immediately executed). + You can hit TAB to do normal completion, ^G to abort back to the + state when you started, and ^D to list the matches. + + This works only with the new function based completion system. + + + bindkey '^Xi' incremental-complete-word + +insert-composed-char + 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 + `http://www.faqs.org/rfcs/rfc1345.html'). + + 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, insert-composed-char a: 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. + + For best results zsh should have been built with support for + multibyte characters (configured with -enable-multibyte); however, + the function works for the limited range of characters available + in single-byte character sets such as ISO-8859-1. + + 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 + + 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. + + See insert-unicode-char for an alternative way of inserting Unicode + characters using their hexadecimal character number. + + 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 define-composed-chars. Please + send any additions to zsh-workers@zsh.org. + + The codes for the second character when used to accent the first + are as follows. Note that not every character can take every + accent. + ! + Grave. + + ' + Acute. + + > + Circumflex. + + ? + Tilde. (This is not ~ as RFC 1345 does not assume that + character is present on the keyboard.) + + - + Macron. (A horizontal bar over the base character.) + + ( + Breve. (A shallow dish shape over the base character.) + + . + Dot above the base character, or in the case of i no dot, or + in the case of L and l a centered dot. + + : + Diaeresis (Umlaut). + + c + Cedilla. + + _ + Underline, however there are currently no underlined + characters. + + / + Stroke through the base character. + + " + Double acute (only supported on a few letters). + + ; + Ogonek. (A little forward facing hook at the bottom right of + the character.) + + < + Caron. (A little v over the letter.) + + 0 + Circle over the base character. + + 2 + Hook over the base character. + + 9 + Horn over the base character. + + 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 ! to ~ (0x21 to 0x7e) by + preceding the character with ^, for example ^A for a double-width + A. + + The following other two-character sequences are understood. + + + ASCII characters + These are already present on most keyboards: + <( + Left square bracket + + // + Backslash (solidus) + + )> + Right square bracket + + (! + Left brace (curly bracket) + + !! + Vertical bar (pipe symbol) + + !) + Right brace (curly bracket) + + '? + Tilde + + Special letters + Characters found in various variants of the Latin alphabet: + ss + Eszett (scharfes S) + + D-, d- + Eth + + TH, th + Thorn + + kk + Kra + + 'n + 'n + + NG, ng + Ng + + OI, oi + Oi + + yr + yr + + ED + ezh + + Currency symbols + + Ct + Cent + + Pd + Pound sterling (also lira and others) + + Cu + Currency + + Ye + Yen + + Eu + Euro (N.B. not in RFC 1345) + + 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.) + !I + Inverted exclamation mark + + BB + Broken vertical bar + + SE + Section + + Co + Copyright + + -a + Spanish feminine ordinal indicator + + << + Left guillemet + + -- + Soft hyphen + + Rg + Registered trade mark + + PI + Pilcrow (paragraph) + + -o + Spanish masculine ordinal indicator + + >> + Right guillemet + + ?I + Inverted question mark + + -1 + Hyphen + + -N + En dash + + -M + Em dash + + -3 + Horizontal bar + + :3 + Vertical ellipsis + + .3 + Horizontal midline ellipsis + + !2 + Double vertical line + + =2 + Double low line + + '6 + Left single quote + + '9 + Right single quote + + .9 + "Right" low quote + + 9' + Reversed "right" quote + + "6 + Left double quote + + "9 + Right double quote + + :9 + "Right" low double quote + + 9" + Reversed "right" double quote + + /- + Dagger + + /= + Double dagger + + Mathematical symbols + + DG + Degree + + -2, +-, -+ + - sign, +/- sign, -/+ sign + + 2S + Superscript 2 + + 3S + Superscript 3 + + 1S + Superscript 1 + + My + Micro + + .M + Middle dot + + 14 + Quarter + + 12 + Half + + 34 + Three quarters + + *X + Multiplication + + -: + Division + + %0 + Per mille + + FA, TE, /0 + For all, there exists, empty set + + dP, DE, NB + Partial derivative, delta (increment), del (nabla) + + (-, -) + Element of, contains + + *P, +Z + Product, sum + + *-, Ob, Sb + Asterisk, ring, bullet + + RT, 0(, 00 + Root sign, proportional to, infinity + + Other symbols + + cS, cH, cD, cC + Card suits: spades, hearts, diamonds, clubs + + Md, M8, M2, Mb, Mx, MX + Musical notation: crotchet (quarter note), quaver + (eighth note), semiquavers (sixteenth notes), flag sign, + natural sign, sharp sign + + Fm, Ml + Female, male + + Accents on their own + + '> + Circumflex (same as caret, ^) + + '! + Grave (same as backtick, `) + + ', + Cedilla + + ': + Diaeresis (Umlaut) + + 'm + Macron + + " + Acute + + +insert-files + 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. + + + bindkey '^Xf' insert-files + +insert-unicode-char + When first executed, the user inputs a set of hexadecimal digits. + This is terminated with another call to insert-unicode-char. The + digits are then turned into the corresponding Unicode character. + For example, if the widget is bound to ^XU, the character sequence + `^XU 4 c ^XU' inserts L (Unicode U+004c). + + See insert-composed-char for a way of inserting characters using a + two-character mnemonic. + +narrow-to-region [ -p PRE ] [ -P POST ] + [ -S STATEPM | -R STATEPM | [ -l LBUFVAR ] [ -r RBUFVAR ] ] + [ -n ] [ START END ] +narrow-to-region-invisible + 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. + + narrow-to-region 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 recursive-edit is performed and + the original widening status is then restored. Various options + and arguments are available when it is called as a function. + + The options -p PRETEXT and -P POSTTEXT 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. + + If the option -n is also given, PRETEXT or POSTTEXT will only be + inserted if there is text before or after the region respectively + which will be made invisible. + + Two numeric arguments may be given which will be used instead of + the cursor and mark positions. + + The option -S STATEPM is used to narrow according to the other + options while saving the original state in the parameter with name + STATEPM, while the option -R STATEPM is used to restore the state + from the parameter; note in both cases the _name_ of the parameter + is required. In the second case, other options and arguments are + irrelevant. When this method is used, no recursive-edit is + performed; the calling widget should call this function with the + option -S, perform its own editing on the command line or pass + control to the user via `zle recursive-edit', then call this + function with the option -R. The argument STATEPM must be a + suitable name for an ordinary parameter, except that parameters + beginning with the prefix _ntr_ are reserved for use within + narrow-to-region. Typically the parameter will be local to the + calling function. + + The options -l LBUFVAR and -r RBUFVAR may be used to specify + parameters where the widget will store the resulting text from the + operation. The parameter LBUFVAR will contain LBUFFER and RBUFVAR + will contain RBUFFER. Neither of these two options may be used + with -S or -R. + + narrow-to-region-invisible is a simple widget which calls + narrow-to-region with arguments which replace any text outside the + region with `...'. It does not take any arguments. + + 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. + + The return status of both widgets is zero if the line was + accepted, else non-zero. + + Here is a trivial example of a widget using this feature. + local state + narrow-to-region -p $'Editing restricted region\n' \ + -P '' -S state + zle recursive-edit + narrow-to-region -R state + +predict-on + This set of functions implements predictive typing using history + search. After predict-on, typing characters causes the editor to + look backward in the history for the first line beginning with + what you have typed so far. After predict-off, editing returns to + normal for the line found. In fact, you often don't even need to + use predict-off, 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 + toggle style below. + + With the function based completion system (which is needed for + this), you should be able to type TAB 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. + + The first time predict-on is used, it creates several additional + widget functions: + + + delete-backward-and-predict + Replaces the backward-delete-char widget. You do not need to + bind this yourself. + + insert-and-predict + Implements predictive typing by replacing the self-insert + widget. You do not need to bind this yourself. + + predict-off + Turns off predictive typing. + + Although you autoload only the predict-on function, it is + necessary to create a keybinding for predict-off as well. + + + zle -N predict-on + zle -N predict-off + bindkey '^X^Z' predict-on + bindkey '^Z' predict-off + +read-from-minibuffer + 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, + execute-named-cmd). The value is then returned to the calling + function in the parameter $REPLY and the editing buffer restored + to its previous state. If the read was aborted by a keyboard + break (typically ^G), the function returns status 1 and $REPLY is + not set. + + If one argument is supplied to the function it is taken as a + prompt, otherwise `? ' is used. If two arguments are supplied, + they are the prompt and the initial value of $LBUFFER, and if a + third argument is given it is the initial value of $RBUFFER. This + provides a default value and starting cursor placement. Upon + return the entire buffer is the value of $REPLY. + + One option is available: `-k NUM' specifies that NUM 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 $REPLY, not the entire buffer. Note that unlike the + read builtin NUM must be given; there is no default. + + The name is a slight misnomer, as in fact the shell's own + minibuffer is not used. Hence it is still possible to call + executed-named-cmd and similar functions while reading a value. + +replace-argument, replace-argument-edit + The function replace-argument 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, + + 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. + + If no numeric argument is given, the current argument is replaced; + this is the last argument if the previous history line is being + used. + + The function prompts for a replacement argument. + + If the widget contains the string edit, for example is defined as + + + zle -N replace-argument-edit replace-argument + + then the function presents the current value of the argument for + editing, otherwise the editing buffer for the replacement is + initially empty. + +replace-string, replace-pattern +replace-string-again, replace-pattern-again + The function replace-string 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. + + If the widget name contains the word `pattern', for example by + defining the widget using the command `zle -N replace-pattern + replace-string', 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 `&' in the + replacement string will be replaced with the matched source + string, and a backquoted digit `\N' will be replaced by the Nth + parenthesised expression matched. The form `\{N}' may be used to + protect the digit from following digits. + + If the widget instead contains the word `regex' (or `regexp'), + then the matching is performed using regular expressions, + respecting the setting of the option RE_MATCH_PCRE (see the + description of the function regexp-replace below). The special + replacement facilities described above for pattern matching are + available. + + By default the previous source or replacement string will not be + offered for editing. However, this feature can be activated by + setting the style edit-previous in the context :zle:WIDGET (for + example, :zle:replace-string) to true. In addition, a positive + numeric argument forces the previous values to be offered, a + negative or zero argument forces them not to be. + + The function replace-string-again can be used to repeat the + previous replacement; no prompting is done. As with + replace-string, if the name of the widget contains the word + `pattern' or `regex', 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. + + In addition, replace-string 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. + + For example, starting from the line: + + + print This line contains fan and fond + + and invoking replace-pattern with the source string `f(?)n' and + the replacement string `c\1r' produces the not very useful line: + + + print This line contains car and cord + + The range of the replacement string can be limited by using the + narrow-to-region-invisible widget. One limitation of the current + version is that undo will cycle through changes to the replacement + and source strings before undoing the replacement itself. + +send-invisible + 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 (`*') is shown + instead. The value is saved in the parameter $INVISIBLE 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 ^G) or another escape from editing such as push-line, + $INVISIBLE is set to empty and the original buffer is restored + unchanged. + + If one argument is supplied to the function it is taken as a + prompt, otherwise `Non-echoed text: ' is used (as in emacs). If a + second and third argument are supplied they are used to begin and + end the reference to $INVISIBLE that is inserted into the buffer. + The default is to open with ${, then INVISIBLE, and close with }, + but many other effects are possible. + +smart-insert-last-word + This function may replace the insert-last-word widget, like so: + + + zle -N insert-last-word smart-insert-last-word + + With a numeric argument, or when passed command line arguments in + a call from another widget, it behaves like insert-last-word, + except that words in comments are ignored when + INTERACTIVE_COMMENTS is set. + + 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 match style. The context used to look up the style + is the widget name, so usually the context is :insert-last-word. + However, you can bind this function to different widgets to use + different patterns: + + + zle -N insert-last-assignment smart-insert-last-word + zstyle :insert-last-assignment match '[[:alpha:]][][[:alnum:]]#=*' + bindkey '\e=' insert-last-assignment + + If no interesting word is found and the auto-previous style is set + to a true value, the search continues upward through the history. + When auto-previous is unset or false (the default), the widget + must be invoked repeatedly in order to search earlier history + lines. + +transpose-lines + 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. + + 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. + + 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. + +url-quote-magic + This widget replaces the built-in self-insert 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. + + Styles to control quoting behavior: + + + url-metas + This style is looked up in the context + `:url-quote-magic:SCHEME' (where SCHEME is that of the + current URL, e.g. "ftp"). 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 '<' and + '>' but including braces (as in brace expansion). See also + url-seps. + + url-seps + Like url-metas, 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 '<' and '>' and + the first character of $histchars. + + url-globbers + This style is looked up in the context `:url-quote-magic'. + 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 `noglob' modifier. When the + first word on the line matches one of the values _and_ the + URL refers to a local file (see url-local-schema), only the + url-seps characters are quoted; the url-metas are left alone, + allowing them to affect command-line parsing, completion, + etc. The default values are a literal `noglob' plus (when + the zsh/parameter module is available) any commands aliased + to the helper function `urlglobber' or its alias `globurl'. + + url-local-schema + This style is always looked up in the context `:urlglobber', + 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 + "ftp" and "file". + + url-other-schema + Like url-local-schema, but lists all other URI schema upon + which urlglobber and url-quote-magic should act. If the URI + on the command line does not have a scheme appearing either + in this list or in url-local-schema, it is not magically + quoted. The default values are "http", "https", and "ftp". + When a scheme appears both here and in url-local-schema, it + is quoted differently depending on whether the command name + appears in url-globbers. + + + Loading url-quote-magic also defines a helper function `urlglobber' + and aliases `globurl' to `noglob urlglobber'. 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. + +vi-pipe + 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. + + The function serves as an example for reading a vi movement command + from within a user-defined widget. + +which-command + This function is a drop-in replacement for the builtin widget + which-command. 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. + + The style whence is available in the context :zle:$WIDGET; 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 + whence -c. + +zcalc-auto-insert + This function is useful together with the zcalc function described + in *Note Mathematical Functions::. It should be bound to a key + representing a binary operator such as `+', `-', `*' or `/'. When + running in zcalc, if the key occurs at the start of the line or + immediately following an open parenthesis, the text "ans " 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 ZCALC_AUTO_INSERT_PREFIX. + + Hence, for example, typing `+12' followed by return adds 12 to the + previous result. + + If zcalc is in RPN mode (-r option) the effect of this binding is + automatically suppressed as operators alone on a line are + meaningful. + + When not in zcalc, the key simply inserts the symbol itself. + + + +26.7.2 Utility Functions +------------------------ + +These functions are useful in constructing widgets. They should be +loaded with `autoload -U FUNCTION' and called as indicated from +user-defined widgets. + + +split-shell-arguments + This function splits the line currently being edited into shell + arguments and whitespace. The result is stored in the array + reply. 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 KSH_ARRAYS 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 reply in order is guaranteed to produce the original line. + + The parameter REPLY is set to the index of the word in reply which + contains the character after the cursor, where the first element + has index 1. The parameter REPLY2 is set to the index of the + character under the cursor in that word, where the first character + has index 1. + + Hence reply, REPLY and REPLY2 should all be made local to the + enclosing function. + + See the function modify-current-argument, described below, for an + example of how to call this function. + +modify-current-argument [ EXPR-USING-$ARG | FUNC ] + 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). + + The argument can be an expression which when evaluated operates on + the shell parameter ARG, 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. + + Alternatively, if the argument does not contain the string ARG, 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 REPLY to the new value for the command line + argument. If the function returns non-zero status, so does the + calling function. + + For example, a user-defined widget containing the following code + converts the characters in the argument under the cursor into all + upper case: + + + modify-current-argument '${(U)ARG}' + + 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: + + + modify-current-argument '${(qq)${(Q)ARG}}' + + The following performs directory expansion on the command line + argument and replaces it by the absolute path: + + + expand-dir() { + REPLY=${~1} + REPLY=${REPLY:a} + } + modify-current-argument expand-dir + + In practice the function expand-dir would probably not be defined + within the widget where modify-current-argument is called. + + + +26.7.3 Styles +------------- + +The behavior of several of the above widgets can be controlled by the +use of the zstyle mechanism. In particular, widgets that interact with +the completion system pass along their context to any completions that +they invoke. + + +break-keys + This style is used by the incremental-complete-word 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 + incremental-complete-word, this style is looked up using the + context `:incremental'. + +completer + The incremental-complete-word and insert-and-predict 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: + + + zstyle ':completion:*' completer \ + _complete _correct _approximate + zstyle ':completion:incremental:*' completer \ + _complete _correct + zstyle ':completion:predict:*' completer \ + _complete + + It is a good idea to restrict the completers used in prediction, + because they may be automatically invoked as you type. The _list + and _menu completers should never be used with prediction. The + _approximate, _correct, _expand, and _match 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. + +cursor + The insert-and-predict widget uses this style, in the context + `:predict', to decide where to place the cursor after completion + has been tried. Values are: + + + complete + 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 `key'. + + key + The cursor is left after the Nth occurrence of the character + just inserted, where N 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. + + + Any other value for this style unconditionally leaves the cursor + at the position where the completion code left it. + +list + When using the incremental-complete-word widget, this style says + if the matches should be listed on every key press (if they fit on + the screen). Use the context prefix `:completion:incremental'. + + The insert-and-predict 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 + always. In this case the context is `:predict' (_not_ + `:completion:predict'). + +match + This style is used by smart-insert-last-word to provide a pattern + (using full EXTENDED_GLOB syntax) that matches an interesting word. + The context is the name of the widget to which + smart-insert-last-word is bound (see above). The default behavior + of smart-insert-last-word is equivalent to: + + + zstyle :insert-last-word match '*[[:alpha:]/\\]*' + + However, you might want to include words that contain spaces: + + + zstyle :insert-last-word match '*[[:alpha:][:space:]/\\]*' + + Or include numbers as long as the word is at least two characters + long: + + + zstyle :insert-last-word match '*([[:digit:]]?|[[:alpha:]/\\])*' + + The above example causes redirections like "2>" to be included. + +prompt + The incremental-complete-word 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 PS1 and other prompt parameters: + + + %c + Replaced by the name of the completer function that generated + the matches (without the leading underscore). + + %l + When the list style is set, replaced by `...' if the list of + matches is too long to fit on the screen and with an empty + string otherwise. If the list style is `false' or not set, + `%l' is always removed. + + %n + Replaced by the number of matches generated. + + %s + Replaced by `-no match-', `-no prefix-', 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. + + %u + Replaced by the unambiguous part of all matches, if there is + any, and if it is different from the word on the line. + + + Like `break-keys', this uses the `:incremental' context. + +stop-keys + This style is used by the incremental-complete-word widget. Its + value is treated similarly to the one for the break-keys style + (and uses the same context: `:incremental'). However, in this + case all keys matching the pattern given as its value will stop + incremental completion and will then execute their usual function. + +toggle + This boolean style is used by predict-on and its related widgets in + the context `:predict'. 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 predict-off. + +verbose + This boolean style is used by predict-on and its related widgets in + the context `:predict'. 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 toggle style. The default does not display these + messages. + +widget + This style is similar to the command style: For widget functions + that use zle 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 (_not_ the name of the + calling function, because one function may be bound to multiple + widget names). + + + zstyle :copy-earlier-word widget smart-insert-last-word + + Check the documentation for the calling widget or function to + determine whether the widget style is used. + + + + +File: zsh.info, Node: Exception Handling, Next: MIME Functions, Prev: ZLE Functions, Up: User Contributions + +26.8 Exception Handling +======================= + +Two functions are provided to enable zsh to provide exception handling +in a form that should be familiar from other languages. + + +throw EXCEPTION + The function throw throws the named EXCEPTION. The name is an + arbitrary string and is only used by the throw and catch + 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. + +catch EXCEPTION-PATTERN + The function catch returns status zero if an exception was thrown + and the pattern EXCEPTION-PATTERN matches its name. Otherwise it + returns status 1. EXCEPTION-PATTERN is a standard shell pattern, + respecting the current setting of the EXTENDED_GLOB option. An + alias catch 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 + CAUGHT is set by catch to the name of the exception caught. It is + possible to rethrow an exception by calling the throw function + again once an exception has been caught. + + +The functions are designed to be used together with the always construct +described in *Note Complex Commands::. This is important as only this +construct provides the required support for exceptions. A typical +example is as follows. + + + { + # "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. + } + +If all exceptions should be caught, the following idiom might be +preferable. + + + { + # ... 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 + } + +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. + +The system internally uses the shell variable EXCEPTION 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 +EXCEPTION remains set and may be incorrectly recognised as the name of +an exception if a shell error subsequently occurs. Adding unset +EXCEPTION at the start of the outermost layer of any code that uses +exception handling will eliminate this problem. + + + + +File: zsh.info, Node: MIME Functions, Next: Mathematical Functions, Prev: Exception Handling, Up: User Contributions + +26.9 MIME Functions +=================== + +Three functions are available to provide handling of files recognised by +extension, for example to dispatch a file text.ps when executed as a +command to an appropriate viewer. + + +zsh-mime-setup [ -fv ] [ -l [ SUFFIX ... ] ] +zsh-mime-handler [ -l ] COMMAND ARGUMENT ... + These two functions use the files ~/.mime.types and + /etc/mime.types, which associate types and extensions, as well as + ~/.mailcap and /etc/mailcap files, which associate types and the + programs that handle them. These are provided on many systems + with the Multimedia Internet Mail Extensions. + + To enable the system, the function zsh-mime-setup 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 zsh-mime-handler should not need + to be called by the user. + + The system works by setting up suffix aliases with `alias -s'. + Suffix aliases already installed by the user will not be + overwritten. + + For suffixes defined in lower case, upper case variants will also + automatically be handled (e.g. PDF is automatically handled if + handling for the suffix pdf is defined), but not vice versa. + + Repeated calls to zsh-mime-setup do not override the existing + mapping between suffixes and executable files unless the option -f + is given. Note, however, that this does not override existing + suffix aliases assigned to handlers other than zsh-mime-handler. + + Calling zsh-mime-setup with the option -l 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. + + Calling zsh-mime-setup with the option -v causes verbose output to + be shown during the setup operation. + + The system respects the mailcap flags needsterminal and + copiousoutput, see man page mailcap(4). + + The functions use the following styles, which are defined with the + zstyle builtin command (*Note The zsh/zutil Module::). They + should be defined before zsh-mime-setup is run. The contexts used + all start with :mime:, with additional components in some cases. + It is recommended that a trailing * (suitably quoted) be appended + to style patterns in case the system is extended in future. Some + examples are given below. + + For files that have multiple suffixes, e.g. .pdf.gz, 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 .pdf.gz produces a match for the handler, that will be + used; otherwise the handler for .gz 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 .pdf.gz can only be handled if .gz is also handled (though + not necessarily in the same way). Alternatively, if no handling + for .gz on its own is needed, simply adding the command + + + alias -s gz=zsh-mime-handler + + to the initialisation code is sufficient; .gz will not be handled + on its own, but may be in combination with other suffixes. + + + current-shell + If this boolean style is true, the mailcap handler for the + context in question is run using the eval builtin instead of + by starting a new sh process. This is more efficient, but + may not work in the occasional cases where the mailcap + handler uses strict POSIX syntax. + + disown + 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. + + execute-as-is + 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 + *(*) *(/) is used; hence executable files are executed + directly and not passed to a handler, and the option AUTO_CD + may be used to change to directories that happen to have MIME + suffixes. + + execute-never + This style is useful in combination with execute-as-is. 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 execute-as-is. This + is useful for file systems that don't handle execute + permission or that contain executables from another operating + system. For example, if /mnt/windows is a Windows mount, then + + + zstyle ':mime:*' execute-never '/mnt/windows/*' + + 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 :P + modifier described in *Note Modifiers::; this means that + symbolic links are resolved where possible, so that links + into other file systems behave in the correct fashion. + + file-path + Used if the style find-file-in-path 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 path. The shell + option PATH_DIRS 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 `/'. The full context is :mime:.SUFFIX:, as described for + the style handler. + + find-file-in-path + 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 file-path 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 handle-nonexistent style is + set. Files found in the path are tested as described for the + style execute-as-is. The full context is :mime:.SUFFIX:, as + described for the style handler. + + flags + Defines flags to go with a handler; the context is as for the + handler style, and the format is as for the flags in mailcap. + + handle-nonexistent + 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 [[:alpha:]]#:/* 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 :mime:.SUFFIX:, as + described for the style handler. + + handler + Specifies a handler for a suffix; the suffix is given by the + context as :mime:.SUFFIX:, and the format of the handler is + exactly that in mailcap. Note in particular the `.' and + trailing colon to distinguish this use of the context. This + overrides any handler specified by the mailcap files. If the + handler requires a terminal, the flags style should be set to + include the word needsterminal, or if the output is to be + displayed through a pager (but not if the handler is itself a + pager), it should include copiousoutput. + + mailcap + A list of files in the format of ~/.mailcap and /etc/mailcap + to be read during setup, replacing the default list which + consists of those two files. The context is :mime:. A + in + the list will be replaced by the default files. + + mailcap-priorities + 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. + + + files + The order of files (entries in the mailcap style) read. + Earlier files are preferred. (Note this does not + resolve entries in the same file.) + + priority + The priority flag from the mailcap entry. The priority + is an integer from 0 to 9 with the default value being 5. + + flags + The test given by the mailcap-prio-flags option is used + to resolve entries. + + place + Later entries are preferred; as the entries are strictly + ordered, this test always succeeds. + + + Note that as this style is handled during initialisation, the + context is always :mime:, with no discrimination by suffix. + + mailcap-prio-flags + This style is used when the keyword flags is encountered in + the list of tests specified by the mailcap-priorities 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. + + mime-types + A list of files in the format of ~/.mime.types and + /etc/mime.types to be read during setup, replacing the + default list which consists of those two files. The context + is :mime:. A + in the list will be replaced by the default + files. + + never-background + 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). + + pager + If set, will be used instead of $PAGER or more to handle + suffixes where the copiousoutput flag is set. The context is + as for handler, i.e. :mime:.SUFFIX: for handling a file with + the given SUFFIX. + + + Examples: + + + zstyle ':mime:*' mailcap ~/.mailcap /usr/local/etc/mailcap + zstyle ':mime:.txt:' handler less %s + zstyle ':mime:.txt:' flags needsterminal + + When zsh-mime-setup is subsequently run, it will look for mailcap + entries in the two files given. Files of suffix .txt will be + handled by running `less FILE.TXT'. The flag needsterminal is set + to show that this program must run attached to a terminal. + + As there are several steps to dispatching a command, the following + should be checked if attempting to execute a file by extension + .EXT does not have the expected effect. + + The command `alias -s EXT' should show `ps=zsh-mime-handler'. 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 .mime.types and mailcap combination for .ext files. + In that case, appropriate handling should be added to + ~/.mime.types and mailcap. + + If the extension is handled by zsh-mime-handler 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 zsh-mime-setup -l will show the handler and, if there are + any, the flags. A %s 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 needsterminal or copiousoutput 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 mailcap entry + for such a program is: + + + text/html; /usr/bin/lynx '%s'; needsterminal + + Running `zsh-mime-handler -l COMMAND LINE' 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 zsh-mime-setup. + +pick-web-browser + This function is separate from the two MIME functions described + above and can be assigned directly to a suffix: + + + autoload -U pick-web-browser + alias -s html=pick-web-browser + + 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. + + Various styles are available to customize the choice of browsers: + + + browser-style + 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 + + + running + Use a GUI browser that is already running when an X + Window display is available. The browsers listed in the + x-browsers 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. + + x + Start a new GUI browser when an X Window display is + available. Search for the availability of one of the + browsers listed in the x-browsers style and start the + first one that is found. No check is made for an already + running browser. + + tty + Start a terminal-based browser. Search for the + availability of one of the browsers listed in the + tty-browsers style and start the first one that is found. + + + If the style is not set the default running x tty is used. + + x-browsers + 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 :mime: (which may be extended in + future, so appending `*' is recommended). For example, + + + zstyle ':mime:*' x-browsers opera konqueror firefox + + specifies that pick-web-browser 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 firefox mozilla netscape opera + konqueror. + + tty-browsers + An array similar to x-browsers, except that it gives browsers + to use when no X Window display is available. The default is + elinks links lynx. + + command + If it is set this style is used to pick the command used to + open a page for a browser. The context is + :mime:browser:new:$browser: to start a new browser or + :mime:browser:running:$browser: to open a URL in a browser + already running on the current X display, where $browser is + the value matched in the x-browsers or tty-browsers style. + The escape sequence %b in the style's value will be replaced + by the browser, while %u will be replaced by the URL. If the + style is not set, the default for all new instances is + equivalent to %b %u and the defaults for using running + browsers are equivalent to the values kfmclient openURL %u for + Konqueror, firefox -new-tab %u for Firefox, opera -newpage %u + for Opera, and %b -remote "openUrl(%u)" for all others. + + + + + +File: zsh.info, Node: Mathematical Functions, Next: User Configuration Functions, Prev: MIME Functions, Up: User Contributions + +26.10 Mathematical Functions +============================ + + +zcalc [ -erf ] [ EXPRESSION ... ] + A reasonably powerful calculator based on zsh's arithmetic + evaluation facility. The syntax is similar to that of formulae in + most programming languages; see *Note Arithmetic Evaluation:: for + details. + + Non-programmers should note that, as in many other programming + languages, expressions involving only integers (whether constants + without a `.', 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 -f; + see further notes below. + + If the file ~/.zcalcrc 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; emulate -L zsh + and setopt extendedglob 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 $ZDOTDIR is used instead + of $HOME if it is set. + + The mathematical library zsh/mathfunc will be loaded if it is + available; see *Note The zsh/mathfunc Module::. The mathematical + functions correspond to the raw system libraries, so trigonometric + functions are evaluated using radians, and so on. + + 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 `4> ' is available as $4. + The last value calculated is available as ans. Full command line + editing, including the history of previous calculations, is + available; the history is saved in the file ~/.zcalc_history. To + exit, enter a blank line or type `:q' on its own (`q' is allowed + for historical compatibility). + + 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 `...' 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 zcalc will prompt + for more input. + + If arguments are given to zcalc on start up, they are used to + prime the first few positional parameters. A visual indication of + this is given when the calculator starts. + + The constants PI (3.14159...) and E (2.71828...) are provided. + Parameter assignment is possible, but note that all parameters + will be put into the global namespace unless the :local special + command is used. The function creates local variables whose names + start with _, so users should avoid doing so. The variables ans + (the last answer) and stack (the stack in RPN mode) may be + referred to directly; stack is an array but elements of it are + numeric. Various other special variables are used locally with + their standard meaning, for example compcontext, match, mbegin, + mend, psvar. + + The output base can be initialised by passing the option `-#BASE', + for example `zcalc -#16' (the `#' may have to be quoted, depending + on the globbing options set). + + If the option `-e' is set, the function runs non-interactively: + the arguments are treated as expressions to be evaluated as if + entered interactively line by line. + + If the option `-f' is set, all numbers are treated as floating + point, hence for example the expression `3/4' evaluates to 0.75 + rather than 0. Options must appear in separate words. + + If the option `-r' is set, RPN (Reverse Polish Notation) mode is + entered. This has various additional properties: + Stack + Evaluated values are maintained in a stack; this is contained + in an array named stack with the most recent value in + ${stack[1]}. + + Operators and functions + If the line entered matches an operator (+, -, *, /, **, ^, | + or &) or a function supplied by the zsh/mathfunc 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 ${stack[1]}. + + 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). + + Stack listing + If an integer follows the option -r 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, zcalc -r4 shows $stack[4] to + $stack[1] each time results are printed. + + Duplication: = + The pseudo-operator = causes the most recent element of the + stack to be duplicated onto the stack. + + pop + The pseudo-function pop causes the most recent element of the + stack to be popped. A `>' on its own has the same effect. + + >IDENT + The expression > 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 zcalc function. + + <IDENT + The expression < followed (with no space) by a shell + identifier causes the value of the variable with that name to + be pushed onto the stack. IDENT may be an integer, in which + case the previous result with that number (as shown before + the > in the standard zcalc prompt) is put on the stack. + + Exchange: xy + The pseudo-function xy causes the most recent two elements of + the stack to be exchanged. `<>' has the same effect. + + + The prompt is configurable via the parameter ZCALCPROMPT, which + undergoes standard prompt expansion. The index of the current + entry is stored locally in the first element of the array psvar, + which can be referred to in ZCALCPROMPT as `%1v'. The default + prompt is `%1v> '. + + The variable ZCALC_ACTIVE is set within the function and can be + tested by nested functions; it has the value rpn if RPN mode is + active, else 1. + + 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 compinit has been + run. + + The output precision may be specified within zcalc by special + commands familiar from many calculators. + :norm + The default output format. It corresponds to the printf %g + specification. Typically this shows six decimal digits. + + :sci DIGITS + Scientific notation, corresponding to the printf %g output + format with the precision given by DIGITS. This produces + either fixed point or exponential notation depending on the + value output. + + :fix DIGITS + Fixed point notation, corresponding to the printf %f output + format with the precision given by DIGITS. + + :eng DIGITS + Exponential notation, corresponding to the printf %E output + format with the precision given by DIGITS. + + :raw + Raw output: this is the default form of the output from a + math evaluation. This may show more precision than the + number actually possesses. + + + Other special commands: + :!LINE... + Execute LINE... 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 :!. + + :local ARG ... + Declare variables local to the function. Other variables may + be used, too, but they will be taken from or put into the + global scope. + + :function NAME [ BODY ] + Define a mathematical function or (with no BODY) delete it. + :function may be abbreviated to :func or simply :f. The NAME + may contain the same characters as a shell function name. + The function is defined using zmathfuncdef, see below. + + Note that zcalc takes care of all quoting. Hence for example: + + + :f cube $1 * $1 * $1 + + defines a function to cube the sole argument. Functions so + defined, or indeed any functions defined directly or + indirectly using functions -M, 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 cube function. + If there are optional arguments only the mandatory arguments + are supplied by this means. + + [#BASE] + 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 BASE. Use, for + example, `[#16]' to display hexadecimal output preceded by an + indication of the base, or `[##16]' just to display the raw + number in the given base. Bases themselves are always + specified in decimal. `[#]' restores the normal output format. + Note that setting an output base suppresses floating point + output; use `[#]' to return to normal operation. + + $VAR + Print out the value of var literally; does not affect the + calculation. To use the value of var, omit the leading `$'. + + + See the comments in the function for a few extra tips. + +min(ARG, ...) +max(ARG, ...) +sum(ARG, ...) +zmathfunc + The function zmathfunc defines the three mathematical functions + min, max, and sum. The functions min and max take one or more + arguments. The function sum takes zero or more arguments. + Arguments can be of different types (ints and floats). + + Not to be confused with the zsh/mathfunc module, described in + *Note The zsh/mathfunc Module::. + +zmathfuncdef [ MATHFUNC [ BODY ] ] + A convenient front end to functions -M. + + With two arguments, define a mathematical function named MATHFUNC + which can be used in any form of arithmetic evaluation. BODY is a + mathematical expression to implement the function. It may contain + references to position parameters $1, $2, ... to refer to + mandatory parameters and ${1:-DEFVALUE} ... 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 + zsh_math_func_MATHFUNC; usually the user will not need to refer to + the shell function directly. Any existing function of the same + name is silently replaced. + + With one argument, remove the mathematical function MATHFUNC as + well as the shell function implementation. + + With no arguments, list all MATHFUNC functions in a form suitable + for restoring the definition. The functions have not necessarily + been defined by zmathfuncdef. + + + + +File: zsh.info, Node: User Configuration Functions, Next: Other Functions, Prev: Mathematical Functions, Up: User Contributions + +26.11 User Configuration Functions +================================== + +The zsh/newuser 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. + + +zsh-newuser-install [ -f ] + The function presents the user with various options for customizing + their initialization scripts. Currently only ~/.zshrc is handled. + $ZDOTDIR/.zshrc is used instead if the parameter ZDOTDIR is set; + this provides a way for the user to configure a file without + altering an existing .zshrc. + + By default the function exits immediately if it finds any of the + files .zshenv, .zprofile, .zshrc, or .zlogin in the appropriate + directory. The option -f is required in order to force the + function to continue. Note this may happen even if .zshrc itself + does not exist. + + As currently configured, the function will exit immediately if the + user has root privileges; this behaviour cannot be overridden. + + 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. + + 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 `# Lines configured by + zsh-newuser-install' and `# End of lines configured by + zsh-newuser-install'. In addition, the old version of .zshrc is + saved to a file with the suffix .zni appended. + + If the function edits an existing .zshrc, 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 .zshrc 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. + + + + +File: zsh.info, Node: Other Functions, Prev: User Configuration Functions, Up: User Contributions + +26.12 Other Functions +===================== + +There are a large number of helpful functions in the Functions/Misc +directory of the zsh distribution. Most are very simple and do not +require documentation here, but a few are worthy of special mention. + + + +26.12.1 Descriptions +-------------------- + + +colors + 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 (*Note Prompt Themes::). + You seldom should need to run colors more than once. + + The eight base colors are: black, red, green, yellow, blue, + magenta, cyan, and white. Each of these has codes for foreground + and background. In addition there are seven intensity attributes: + bold, faint, standout, underline, blink, reverse, and conceal. + Finally, there are seven codes used to negate attributes: none + (reset all attributes to the defaults), normal (neither bold nor + faint), no-standout, no-underline, no-blink, no-reverse, and + no-conceal. + + Some terminals do not support all combinations of colors and + intensities. + + The associative arrays are: + + + color + colour + 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 `fg-', such + as `fg-red'. Names prefixed with `bg-', such as `bg-blue', + refer to the background codes. The reverse mapping from code + to color yields base name for foreground codes and the bg- + form for backgrounds. + + 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. + + fg + fg_bold + fg_no_bold + Map the eight basic color names to ANSI terminal escape + sequences that set the corresponding foreground text + properties. The fg sequences change the color without + changing the eight intensity attributes. + + bg + bg_bold + bg_no_bold + Map the eight basic color names to ANSI terminal escape + sequences that set the corresponding background properties. + The bg sequences change the color without changing the eight + intensity attributes. + + + In addition, the scalar parameters reset_color and bold_color are + set to the ANSI terminal escapes that turn off all attributes and + turn on bold intensity, respectively. + +fned [ -x NUM ] NAME + Same as zed -f. This function does not appear in the zsh + distribution, but can be created by linking zed to the name fned + in some directory in your fpath. + +is-at-least NEEDED [ PRESENT ] + 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 PRESENT string is not provided, $ZSH_VERSION 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. + + This is useful in startup files to set options and other state + that are not available in all versions of zsh. + + + is-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." + +nslookup [ ARG ... ] + This wrapper function for the nslookup command requires the + zsh/zpty module (see *Note The zsh/zpty Module::). It behaves + exactly like the standard nslookup 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 `:completion:nslookup'. + + See also the pager, prompt and rprompt styles below. + +regexp-replace VAR REGEXP REPLACE + Use regular expressions to perform a global search and replace + operation on a variable. POSIX extended regular expressions are + used, unless the option RE_MATCH_PCRE has been set, in which case + Perl-compatible regular expressions are used (this requires the + shell to be linked against the pcre library). + + VAR is the name of the variable containing the string to be + matched. The variable will be modified directly by the function. + The variables MATCH, MBEGIN, MEND, match, mbegin, mend should be + avoided as these are used by the regular expression code. + + REGEXP is the regular expression to match against the string. + + REPLACE is the replacement text. This can contain parameter, + command and arithmetic expressions which will be replaced: in + particular, a reference to $MATCH will be replaced by the text + matched by the pattern. + + The return status is 0 if at least one match was performed, else 1. + +run-help CMD + This function is designed to be invoked by the run-help ZLE widget, + in place of the default alias. See `Accessing On-Line Help' + (*Note Utilities::) for setup instructions. + + In the discussion which follows, if CMD is a file system path, it + is first reduced to its rightmost component (the file name). + + Help is first sought by looking for a file named CMD in the + directory named by the HELPDIR parameter. If no file is found, an + assistant function, alias, or command named run-help-CMD is + sought. If found, the assistant is executed with the rest of the + current command line (everything after the command name CMD) as + its arguments. When neither file nor assistant is found, the + external command `man CMD' is run. + + An example assistant for the "ssh" command: + + + run-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 + } + + Several of these assistants are provided in the Functions/Misc + directory. These must be autoloaded, or placed as executable + scripts in your search path, in order to be found and used by + run-help. + + + run-help-git + run-help-ip + run-help-openssl + run-help-p4 + run-help-sudo + run-help-svk + run-help-svn + Assistant functions for the git, ip, openssl, p4, sudo, svk, + and svn, commands. + + +tetris + 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. + + This function must be used as a ZLE widget: + + + autoload -U tetris + zle -N tetris + bindkey KEYS tetris + + To start a game, execute the widget by typing the KEYS. 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 `q') or when you lose. + + If you quit in the middle of a game, the next invocation of the + tetris widget will continue where you left off. If you lost, it + will start a new game. + +tetriscurses + 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. + + This version does not save the game state between invocations, and + is not invoked as a widget, but rather as: + + + autoload -U tetriscurses + tetriscurses + +zargs [ OPTION ... -- ] [ INPUT ... ] [ -- COMMAND [ ARG ... ] ] + 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. + + The OPTION list represents options of the zargs command itself, + which are the same as those of xargs. The INPUT list is the + collection of strings (often file names) that become the arguments + of the command, analogous to the standard input of xargs. + Finally, the ARG list consists of those arguments (usually + options) that are passed to the COMMAND each time it runs. The + ARG list precedes the elements from the input list in each run. + If no COMMAND is provided, then no ARG list may be provided, and + in that event the default command is `print' with arguments `-r + --'. + + For example, to get a long ls listing of all non-hidden plain files + in the current directory or its subdirectories: + + + autoload -U zargs + zargs -- **/*(.) -- ls -ld -- + + The first and third occurrences of `--' are used to mark the end + of options for zargs and ls respectively to guard against + filenames starting with `-', while the second is used to separate + the list of files from the command to run (`ls -ld -'). + + The first `--' would also be needed if there was a chance the list + might be empty as in: + + + zargs -r -- ./*.back(#qN) -- rm -f + + In the event that the string `--' is or may be an INPUT, the -e + option may be used to change the end-of-inputs marker. Note that + this does _not_ change the end-of-options marker. For example, to + use `..' as the marker: + + + zargs -e.. -- **/*(.) .. ls -ld -- + + This is a good choice in that example because no plain file can be + named `..', but the best end-marker depends on the circumstances. + + The options -i, -I, -l, -L, and -n differ slightly from their + usage in xargs. There are no input lines for zargs to count, so + -l and -L count through the INPUT list, and -n counts the number + of arguments passed to each execution of COMMAND, _including_ any + ARG list. Also, any time -i or -I is used, each INPUT is + processed separately as if by `-L 1'. + + For details of the other zargs options, see man page xargs(1) (but + note the difference in function between zargs and xargs) or run + zargs with the --help option. + +zed [ -f [ -x NUM ] ] NAME +zed -b + This function uses the ZLE editor to edit a file or function. + + Only one NAME argument is allowed. If the -f option is given, the + name is taken to be that of a function; if the function is marked + for autoloading, zed searches for it in the fpath and loads it. + Note that functions edited this way are installed into the current + shell, but _not_ written back to the autoload file. In this case + the -x option specifies that leading tabs indenting the function + according to syntax should be converted into the given number of + spaces; `-x 2' is consistent with the layout of functions + distributed with the shell. + + Without -f, NAME is the path name of the file to edit, which need + not exist; it is created on write, if necessary. + + While editing, the function sets the main keymap to zed and the vi + command keymap to zed-vicmd. These will be copied from the + existing main and vicmd keymaps if they do not exist the first + time zed is run. They can be used to provide special key bindings + used only in zed. + + If it creates the keymap, zed rebinds the return key to insert a + line break and `^X^W' to accept the edit in the zed keymap, and + binds `ZZ' to accept the edit in the zed-vicmd keymap. + + The bindings alone can be installed by running `zed -b'. This is + suitable for putting into a startup file. Note that, if rerun, + this will overwrite the existing zed and zed-vicmd keymaps. + + Completion is available, and styles may be set with the context + prefix `:completion:zed'. + + A zle widget zed-set-file-name is available. This can be called by + name from within zed using `\ex zed-set-file-name' (note, however, + that because of zed's rebindings you will have to type ^j at the + end instead of the return key), or can be bound to a key in either + of the zed or zed-vicmd keymaps after `zed -b' 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 with `zed -f'. + + While zed-set-file-name is running, zed uses the keymap + zed-normal-keymap, 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. + +zcp [ -finqQvwW ] SRCPAT DEST +zln [ -finqQsvwW ] SRCPAT DEST + Same as zmv -C and zmv -L, respectively. These functions do not + appear in the zsh distribution, but can be created by linking zmv + to the names zcp and zln in some directory in your fpath. + +zkbd + See `Keyboard Definition' (*Note Utilities::). + +zmv [ -finqQsvwW ] [ -C | -L | -M | -{p|P} PROGRAM ] [ -o OPTSTRING ] + SRCPAT DEST + Move (usually, rename) files matching the pattern SRCPAT to + corresponding files having names of the form given by DEST, where + SRCPAT contains parentheses surrounding patterns which will be + replaced in turn by $1, $2, ... in DEST. For example, + + + zmv '(*).lis' '$1.txt' + + renames `foo.lis' to `foo.txt', `my.old.stuff.lis' to + `my.old.stuff.txt', and so on. + + The pattern is always treated as an EXTENDED_GLOB 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 -f was not given) causes the entire + function to abort without doing anything. + + In addition to pattern replacement, the variable $f can be + referrred to in the second (replacement) argument. This makes it + possible to use variable substitution to alter the argument; see + examples below. + + Options: + + + -f + Force overwriting of destination files. Not currently passed + down to the mv/cp/ln command due to vagaries of + implementations (but you can use -o-f to do that). + + -i + Interactive: show each line to be executed and ask the user + whether to execute it. `Y' or `y' will execute it, anything + else will skip it. Note that you just need to type one + character. + + -n + No execution: print what would happen, but don't do it. + + -q + Turn bare glob qualifiers off: now assumed by default, so + this has no effect. + + -Q + Force bare glob qualifiers on. Don't turn this on unless you + are actually using glob qualifiers in a pattern. + + -s + Symbolic, passed down to ln; only works with -L. + + -v + Verbose: print each command as it's being executed. + + -w + Pick out wildcard parts of the pattern, as described above, + and implicitly add parentheses for referring to them. + + -W + Just like -w, with the addition of turning wildcards in the + replacement pattern into sequential ${1} .. ${N} references. + + -C + -L + -M + Force cp, ln or mv, respectively, regardless of the name of + the function. + + -p PROGRAM + Call PROGRAM instead of cp, ln or mv. Whatever it does, it + should at least understand the form + PROGRAM -- OLDNAME NEWNAME + where OLDNAME and NEWNAME are filenames generated by zmv. + PROGRAM will be split into words, so might be e.g. the name + of an archive tool plus a copy or rename subcommand. + + -P PROGRAM + As -p PROGRAM, except that PROGRAM does not accept a + following -- to indicate the end of options. In this case + filenames must already be in a sane form for the program in + question. + + -o OPTSTRING + The OPTSTRING is split into words and passed down verbatim to + the cp, ln or mv command called to perform the work. It + should probably begin with a `-'. + + Further examples: + + + zmv -v '(* *)' '${1// /_}' + + 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. + + + zmv -v '* *' '${f// /_}' + + This does exactly the same by referring to the file name stored in + $f. + + For more complete examples and other implementation details, see + the zmv source file, usually located in one of the directories + named in your fpath, or in Functions/Misc/zmv in the zsh + distribution. + +zrecompile + See `Recompiling Functions' (*Note Utilities::). + +zstyle+ CONTEXT STYLE VALUE [ + SUBCONTEXT STYLE VALUE ... ] + This makes defining styles a bit simpler by using a single `+' as a + special token that allows you to append a context name to the + previously used context name. Like this: + + + zstyle+ ':foo:bar' STYLE1 VALUE1 \ + +':baz' STYLE2 VALUE2 \ + +':frob' STYLE3 VALUE3 + + This defines STYLE1 with VALUE1 for the context :foo:bar as usual, + but it also defines STYLE2 with VALUE2 for the context + :foo:bar:baz and STYLE3 with VALUE3 for :foo:bar:frob. Any + SUBCONTEXT may be the empty string to re-use the first context + unchanged. + + + +26.12.2 Styles +-------------- + + +insert-tab + The zed function _sets_ this style in context `:completion:zed:*' + to turn off completion when TAB is typed at the beginning of a + line. You may override this by setting your own value for this + context and style. + +pager + The nslookup function looks up this style in the context + `:nslookup' to determine the program used to display output that + does not fit on a single screen. + +prompt +rprompt + The nslookup function looks up this style in the context + `:nslookup' to set the prompt and the right-side prompt, + respectively. The usual expansions for the PS1 and RPS1 + parameters may be used (see *Note Prompt Expansion::). + + |
