diff options
| author | Craig Jennings <c@cjennings.net> | 2024-04-07 13:41:34 -0500 | 
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2024-04-07 13:41:34 -0500 | 
| commit | 754bbf7a25a8dda49b5d08ef0d0443bbf5af0e36 (patch) | |
| tree | f1190704f78f04a2b0b4c977d20fe96a828377f1 /assets/info/zsh.info-5 | |
new repository
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::). + + | 
