diff options
Diffstat (limited to 'Doc/Zsh/calsys.yo')
-rw-r--r-- | Doc/Zsh/calsys.yo | 547 |
1 files changed, 547 insertions, 0 deletions
diff --git a/Doc/Zsh/calsys.yo b/Doc/Zsh/calsys.yo new file mode 100644 index 000000000..61226d39d --- /dev/null +++ b/Doc/Zsh/calsys.yo @@ -0,0 +1,547 @@ +texinode(Calendar Function System)(TCP Function System)(Zsh Modules)(Top) +chapter(Calendar Function System) +cindex(calendar function system) +cindex(zsh/datetime, function system based on) +sect(Description) + +The shell is supplied with a series of functions to replace and enhance the +traditional Unix tt(calendar) programme, which warns the user of imminent +or future events, details of which are stored in a text file (typically +tt(calendar) in the user's home directory). The version provided here +includes a mechanism for alerting the user when an event is due. + +In addition a function tt(age) is provided that can be used in a glob +qualifier; it allows files to be selected based on their modification +times. + +The format of the tt(calendar) file and the dates used there in and in +the tt(age) function are described first, then the functions that can +be called to examine and modify the tt(calendar) file. + +The functions here depend on the availability of the tt(zsh/datetime) +module which is usually installed with the shell. The library function +tt(strptime+LPAR()RPAR()) must be available; it is present on most recent +operating systems. + +startmenu() +menu(Calendar File and Date Formats) +menu(Calendar System User Functions) +menu(Calendar Styles) +menu(Calendar Utility Functions) +menu(Calendar Bugs) +endmenu() + + +texinode(Calendar File and Date Formats)(Calendar System User Functions)()(Calendar Function System) +sect(File and Date Formats) + +subsect(Calendar File Format) + +The calendar file is by default tt(~/calendar). This can be configured +by the tt(calendar-file) style, see +ifzman(the section STYLES below)\ +ifnzman(noderef(Calendar Styles)). The basic format consists +of a series of separate lines, with no indentation, each including +a date and time specification followed by a description of the event. + +Various enhancements to this format are supported, based on the syntax +of Emacs calendar mode. An indented line indicates a continuation line +that continues the description of the event from the preceeding line +(note the date may not be continued in this way). An initial ampersand +(tt(&)) is ignored for compatibility. + +The Emacs extension that a date with no description may refer to a number +of succeeding events at different times is not supported. + +Unless the tt(done-file) style has been altered, any events which +have been processed are appended to the file with the same name as the +calendar file with the suffix tt(.done), hence tt(~/calendar.done) by +default. + +An example is shown below. + +subsect(Date Format) + +The format of the date and time is designed to allow flexibility without +admitting ambiguity. Note that there is no localization support; month and +day names must be in English (though only the first three letters are +significant) and separator characters are fixed. Furthermore, time zones +are not handled; all times are assumed to be local. + +It is recommended that, rather than exploring the intricacies of the +system, users find a date format that is natural to them and stick to it. +This will avoid unexpected effects. Various key facts should be noted. + +startitemize() +itemiz(In particular, note the confusion between +var(month)tt(/)var(day)tt(/)var(year) and +var(day)tt(/)var(month)tt(/)var(year) when the month is numeric; these +formats should be avoided if at all possible. Many alternatives are +available.) +itemiz(The year must be given in full to avoid confusion, and only years +from 1900 to 2099 inclusive are matched.) +enditemize() + +The following give some obvious examples; users finding here +a format they like and not subject to vagaries of style may skip +the full description. As dates and times are matched separately +(even though the time may be embedded in the date), any date format +may be mixed with any format for the time of day provide the +separators are clear (whitespace, colons, commas). + +example(2007/04/03 13:13 +2007/04/03:13:13 +2007/04/03 1:13 pm +3rd April 2007, 13:13 +April 3rd 2007 1:13 p.m. +Apr 3, 2007 13:13 +Tue Apr 03 13:13:00 2007 +13:13 2007/apr/3) + +More detailed rules follow. + +Times are parsed and extracted before dates. They must use colons +to separate hours and minutes, though a dot is allowed before seconds +if they are present. This limits time formats to the following: + +startitemize() +itemiz(var(HH)tt(:)var(MM)[tt(:)var(SS)[tt(.)var(FFFFF)]] [tt(am)|tt(pm)|tt(a.m.)|tt(p.m.)]) +itemiz(var(HH)tt(:)var(MM)tt(.)var(SS)[tt(.)var(FFFFF)] [tt(am)|tt(pm)|tt(a.m.)|tt(p.m.)]) +enditemize() + +Here, square brackets indicate optional elements, possibly with +alternatives. Fractions of a second are recognised but ignored. For +absolute times (the normal format require by the tt(calendar) file and the +tt(age) function) a date is mandatory but a time of day is not; the time +returned is at the start of the date. One variation is allowed: if +tt(a.m.) or tt(p.m.) or one of their variants is present, an hour without a +minute is allowed, e.g. tt(3 p.m.). + +Time zones are not handled, though if one is matched following a time +specification it will be removed to allow a surrounding date to be +parsed. This only happens if the format of the timezone is not too +unusual. The following are examples of forms that are understood: + +example(+0100 +GMT +GMT-7 +CET+1CDT) + +Any part of the timezone that is not numeric must have exactly three +capital letters in the name. + +Dates suffer from the ambiguity between var(DD)tt(/)var(MM)tt(/)var(YYYY) +and var(MM)tt(/)var(DD)tt(/)var(YYYY). It is recommended this form is +avoided with purely numeric dates, but use of ordinals, +eg. tt(3rd/04/2007), will resolve the ambiguity as the ordinal is always +parsed as the day of the month. Years must be four digits (and the first +two must be tt(19) or tt(20)); tt(03/04/08) is not recognised. Other +numbers may have leading zeroes, but they are not required. The following +are handled: + +startitemize() +itemiz(var(YYYY)tt(/)var(MM)tt(/)var(DD)) +itemiz(var(YYYY)tt(-)var(MM)tt(-)var(DD)) +itemiz(var(YYYY)tt(/)var(MNM)tt(/)var(DD)) +itemiz(var(YYYY)tt(-)var(MNM)tt(-)var(DD)) +itemiz(var(DD)[tt(th)|tt(st)|tt(rd)] var(MNM)[tt(,)] [ var(YYYY) ]) +itemiz(var(MNM) var(DD)[tt(th)|tt(st)|tt(rd)][tt(,)] [ var(YYYY) ]) +itemiz(var(DD)[tt(th)|tt(st)|tt(rd)]tt(/)var(MM)[tt(,)] var(YYYY)) +itemiz(var(DD)[tt(th)|tt(st)|tt(rd)]tt(/)var(MM)tt(/)var(YYYY)) +itemiz(var(MM)tt(/)var(DD)[tt(th)|tt(st)|tt(rd)][tt(,)] var(YYYY)) +itemiz(var(MM)tt(/)var(DD)[tt(th)|tt(st)|tt(rd)]tt(/)var(YYYY)) +enditemize() + +Here, var(MNM) is at least the first three letters of a month name, +matched case-insensitively. The remainder of the month name may appear but +its contents are irrelevant, so janissary, febrile, martial, apricot, +maybe, junta, etc. are happily handled. + +Where the year is shown as optional, the current year is assumed. There +are only two such cases, the form tt(Jun 20) or tt(14 September) (the only +two commonly occurring forms, apart from a "the" in some forms of English, +which isn't currently supported). Such dates will of course become +ambiguous in the future, so should ideally be avoided. + +Times may follow dates with a colon, e.g. tt(1965/07/12:09:45); this is in +order to provide a format with no whitespace. A comma and whitespace are +allowed, e.g. tt(1965/07/12, 09:45). Currently the order of these +separators is not checked, so illogical formats such as tt(1965/07/12, : +,09:45) will also be matched. For simplicity such variations are not shown +in the list above. Otherwise, a time is only recognised as being +associated with a date if there is only whitespace in between, or if the +time was embedded in the date. + +Days of the week are not scanned, but will be ignored if they occur +at the start of the date pattern only. + +For example, the standard date format: + +example(Fri Aug 18 17:00:48 BST 2006) + +is handled by matching var(HH)tt(:)var(MM)tt(:)var(SS) and removing it +together with the matched (but unused) time zone. This leaves the following: + +example(Fri Aug 18 2006) + +tt(Fri) is ignored and the rest is matched according to the standard rules. + +subsect(Relative Time Format) + +In certain places relative times are handled. Here, a date is not allowed; +instead a combination of various supported periods are allowed, together +with an optional time. The periods must be in order from most to +least significant. + +The periods handled, with possible abbreviations are: + +startitem() +item(Years)( +tt(years), tt(yrs), tt(ys), tt(year), tt(yr), tt(y). +Currently a year is 365.25 days, not a calendar year. +) +item(Months)( +tt(months), tt(mons), tt(mnths), tt(mths), tt(month), tt(mon), +tt(mnth), tt(mth). Note that tt(m), tt(ms), tt(mn), tt(mns) +are ambiguous and are em(not) handled. Currently a month is a period +of 30 days rather than a calendar month. +) +item(Weeks)( +tt(weeks), tt(wks), tt(ws), tt(week), tt(wk), tt(w) +) +item(Days)( +tt(days), tt(dys), tt(ds), tt(day), tt(dy), tt(d) +) +item(Minutes)( +tt(minutes), tt(mins), tt(minute), tt(min), but em(not) tt(m), +tt(ms), tt(mn) or tt(mns) +) +item(Seconds)( +tt(seconds), tt(secs), tt(ss), tt(second), tt(sec), tt(s) +) +enditem() + +Spaces between the numbers are optional, but are required between items, +although a comma may be used (with or without spaces). + +Here are some examples: + +example(30 years 3 months 4 days 3:42:41 +14 days 5 hours +4d,10hr) + +subsect(Example) + +Here is an example calendar file. It uses a consistent date format, +as recommended above. The second entry has a continuation line. + +example(Feb 1, 2006 14:30 Pointless bureaucratic meeting +Mar 27, 2006 11:00 Mutual recrimination and finger pointing + Bring water pistol and waterproofs +Apr 10, 2006 13:30 Even more pointless blame assignment exercise) + + +texinode(Calendar System User Functions)(Calendar Styles)(Calendar File and Date Formats)(Calendar Function System) +sect(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. + +subsect(Calendar system functions) + +startitem() +findex(calendar) +xitem(tt(calendar) [ tt(-dDsv) ] [ tt(-C) var(calfile) ] [ -n var(num) ] [ tt(-S) var(showprog) ] [ [ var(start) ] var(end) ])( +item(tt(calendar -r) [ tt(-dDrsv) ] [ tt(-C) var(calfile) ] [ -n var(num) ] [ tt(-S) var(showprog) ] [ var(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 var(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. + +var(end) may start with a tt(+), 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 var(start) is also given, show events starting from that time and date. +The word tt(now) can be used to indicate the current time. + +To implement an alert when events are due, include tt(calendar -s) in your +tt(~/.zshrc) file. + +Options: + +startitem() +item(tt(-C) var(calfile))( +Explicitly specify a calendar file instead of the value of +the tt(calendar-file) style or the the default tt(~/calendar). +) +item(tt(-d))( +Move any events that have passed from the calendar file to the +"done" file, as given by the tt(done-file) style or the default +which is the calendar file with tt(.done) appended. This option +is implied by the tt(-s) option. +) +item(tt(-D))( +Turns off the option tt(-d), even if the tt(-s) option is also present. +) +item(tt(-n) var(num), tt(-)var(num))( +Show at least var(num) events, if present in the calendar file, regardless +of the tt(start) and tt(end). +) +item(tt(-r))( +Show all the remaining options in the calendar, ignoring the given tt(end) +time. The tt(start) time is respected; any argument given is treated +as a tt(start) time. +) +item(tt(-s))( +Use the shell's tt(sched) command to schedule a timed event that +will warn the user when an event is due. Note that the tt(sched) command +only runs if the shell is at an interactive prompt; a foreground taks +blocks the scheduled task from running until it is finished. + +The timed event usually runs the programme tt(calendar_show) to show +the event, as described in +ifzman(the section UTILITY FUNCTIONS below)\ +ifnzman(noderef(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 tt(warn-time) or +for a single calendar entry by including tt(WARN) var(reltime) in the first +line of the entry, where var(reltime) is one of the usual relative time +formats. + +It is safe to run tt(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 tt(-d) +option. Use tt(-D) to prevent this. +) +item(tt(-S) var(showprog))( +Explicitly specify a programme to be used for showing events instead +of the value of the tt(show-prog) style or the default tt(calendar_show). +) +item(tt(-v))( +Verbose: show more information about stages of processing. +) +enditem() +) +findex(calendar_add) +item(tt(calendar_add) var(event ...))( +Adds a single event to the calendar in the appropriate location. +Using this function ensures that the calendar file is sorted in date +and time order. It also makes special arrangments for locking +the file will it is altered. The old calendar is left in a file +with the suffix tt(.old). +) +findex(calendar_sort) +item(tt(calendar_sort))( +Sorts the calendar file into date and time order. The old calendar is +left in a file with the suffix tt(.old). +) +enditem() + +subsect(Glob qualifiers) +findex(age) + +The function tt(age) can be autoloaded and use separately from +the calendar system, although it uses the function tt(calendar_scandate) +for date formatting. It requires the tt(zsh/stat) builtin, which +makes available the builtin tt(stat). This may conflict with an +external programme of the same name; if it does, the builtin may be +disabled for normal operation by including the following code in +an initialization file: + +example(zmodload -i zsh/stat +disable stat) + +tt(age) selects files having a given modification time for use +as a glob qualifer. The format of the date is the same as that +understood by the calendar system, described in +ifzman(the section FILE AND DATE FORMATS above)\ +ifnzman(noderef(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. + +example(print *+LPAR()e:age 2006/10/04 2006/10/09:+RPAR()) + +The example above matches all files modified between the start of those +dates. + +example(print *+LPAR()e:age 2006/10/04+RPAR()) + +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). + +example(print *+LPAR()e-age 2006/10/04:10:15 2006/10/04:10:45-RPAR()) + +The example above supplies times. Note that whitespace within the time and +date specification must be quoted to ensure tt(age) receives the correct +arguments, hence the use of the additional colon to separate the date and +time. + +example(AGEREF1=2006/10/04:10:15 +AGEREF2=2006/10/04:10:45 +print *+LPAR()PLUS()age+RPAR()) + +This shows the same example before using another form of argument +passing. The dates and times in the parameters tt(AGEREF1) and tt(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. + + +texinode(Calendar Styles)(Calendar Utility Functions)(Calendar System User Functions)(Calendar Function System) +sect(Styles) + +The zsh style mechanism using the tt(zstyle) command is describe in +ifzman(zmanref(zshmodules))\ +ifnzman(noderef(The zsh/zutil Module)). This is the same mechanism +used in the completion system. + +The styles below are all examined in the context +tt(:datetime:)var(function)tt(:), for example tt(:datetime:calendar:). + +startitem() +kindex(calendar-file) +item(tt(calendar-file))( +The location of the main calendar. The default is tt(~/calendar). +) +kindex(done-file) +item(tt(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 tt(.done). +The style may be set to an empty string in which case a "done" file +will not be maintained. +) +kindex(show-prog) +item(tt(show-prog))( +The programme run by tt(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 tt(calendar -s) uses +a start time and stop time equal to one another to indicate alerts +for specific events. + +The default is the function tt(calendar_show). +) +kindex(warn-time) +item(tt(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 tt(EVENT) var(reltime). +The default is 5 minutes. +) +enditem() + + +texinode(Calendar Utility Functions)(Calendar Bugs)(Calendar Styles)(Calendar Function System) +sect(Utility functions) + +startitem() +findex(calendar_lockfiles) +item(tt(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 +var(file)tt(.lockfile). Otherwise, however, the function is not +specific to the calendar system. Three attempts are made to lock +the file before giving up. + +The files locked are appended to the array tt(lockfiles), which should +be local to the caller. + +If all files were successully, status zero is returned, else status one. +) +findex(calendar_read) +item(tt(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 +tt(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. +) +findex(calendar_scandate) +item(tt(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 +ifzman(the section FILE AND DATE FORMATS above)\ +ifnzman(noderef(Calendar File and Date Formats). The parameter tt(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: +startitem() +item(tt(-a))( +The date and time are anchored to the start of the argument; they +will not be matched if there is preceeding text. +) +item(tt(-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. +) +item(tt(-d))( +Enable additional debugging output. +) +item(tt(-r))( +The arguments passed is to be parsed as a relative time. +) +item(tt(-s))( +In addition to setting tt(REPLY), set tt(REPLY2) to the remainder of +the argument after the date and time have been stripped. This is +empty if the option tt(-A) was given. +) +enditem() +) +findex(calendar_show) +item(tt(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 tt(DISPLAY) is set and the start and end times are +the same (indicating a scheduled event), the function uses the +command tt(xmessage) to display a window with the event details. +) +enditem() + +texinode(Calendar Bugs)(Calendar Utility Functions)()(Calendar Function System) +sect(Bugs) + +There is no tt(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. + +Recurrent events are not yet supported. + +The tt(calendar_show) function is currently hardwired to use tt(xmessage) +for displaying alerts on X Window System displays. This should be +configurable and ideally integrate better with the desktop. + +tt(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. |