1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2026-01-03 20:51:07 +01:00

34721: new glob qualifier functions before, after

This commit is contained in:
Peter Stephenson 2015-03-16 15:07:35 +00:00
parent 236da69842
commit 235e9bd1bf
4 changed files with 166 additions and 8 deletions

View file

@ -1,3 +1,8 @@
2015-03-16 Peter Stephenson <p.stephenson@samsung.com>
* 34721: Doc/Zsh/calsys.yo, Functions/Calendar/after,
Functions/Calendar/before: new glob qualifier functions.
2015-03-16 Daniel Shahaf <d.s@daniel.shahaf.name>
* 34671 plus tweaks: Completion/Base/Utility/_describe

View file

@ -10,9 +10,9 @@ 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.
In addition functions tt(age), tt(before) and tt(after) are provided
that can be used in a glob qualifier; they allow 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
@ -122,10 +122,10 @@ 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.).
tt(age), tt(before) and tt(after) functions) 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
@ -605,8 +605,10 @@ left in a file with the suffix tt(.old).
enditem()
subsect(Glob qualifiers)
findex(age)
startitem()
item(tt(age))(
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, but uses
@ -675,6 +677,23 @@ example(print *+LPAR()e-age :file1 :file2-+RPAR())
matches all files modified no earlier than tt(file1) and
no later than tt(file2); precision here is to the nearest second.
)
xitem(tt(after))
item(tt(before))(
findex(after)
findex(before)
The functions tt(after) and tt(before) are simpler versions of tt(age)
that take just one argument. The argument is parsed similarly to an
argument of tt(age); if it is not given the variable tt(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:
example(print *+LPAR()e-after 12:00-RPAR()
print *+LPAR()e-after today:12:00-RPAR())
)
enditem()
texinode(Calendar Styles)(Calendar Utility Functions)(Calendar System User Functions)(Calendar Function System)
sect(Styles)

67
Functions/Calendar/after Normal file
View file

@ -0,0 +1,67 @@
# Glob qualifier function, e.g
#
# print *(e:after 2014/08/01:)
# print *(e-after today:12:00-)
#
# If named before:
# Match files modified before a given time.
#
# If named after:
# Match files modified after a given time. Use as glob qualifier.
# N.B.: "after" actually includes the given time as it is to second
# precision (it would be inconvenient to exclude the first second of a date).
# It should therefore more logically be called "from", but that's a less
# obvious name.
#
# File to test is in $REPLY.
#
# Similar to age, but only takes at most one data, which is
# compared directly with the current time.
emulate -L zsh
zmodload -F zsh/stat b:zstat
zmodload -i zsh/parameter
autoload -Uz calendar_scandate
local timefmt
local -a vals tmp
[[ -e $REPLY ]] || return 1
zstat -A vals +mtime -- $REPLY || return 1
if (( $# == 1 )); then
if [[ $1 = :* ]]; then
timefmt="%Y/%m/%d:%H:%M:%S"
zstat -A tmp -F $timefmt +mtime -- ${1#:} || return 1
local AGEREF=$tmp[1]
else
local AGEREF=$1
fi
fi
integer mtime=$vals[1] date1 date2
local REPLY REPLY2
# allow a time only (meaning today)
if calendar_scandate -t $AGEREF; then
date1=$REPLY
case $0 in
(after)
(( mtime >= date1 ))
;;
(before)
(( mtime < date1 ))
;;
(*)
print "$0: must be named 'after' or 'before'" >&2
return 1
;;
esac
else
return 1
fi

67
Functions/Calendar/before Normal file
View file

@ -0,0 +1,67 @@
# Glob qualifier function, e.g
#
# print *(e:after 2014/08/01:)
# print *(e-after today:12:00-)
#
# If named before:
# Match files modified before a given time.
#
# If named after:
# Match files modified after a given time. Use as glob qualifier.
# N.B.: "after" actually includes the given time as it is to second
# precision (it would be inconvenient to exclude the first second of a date).
# It should therefore more logically be called "from", but that's a less
# obvious name.
#
# File to test is in $REPLY.
#
# Similar to age, but only takes at most one data, which is
# compared directly with the current time.
emulate -L zsh
zmodload -F zsh/stat b:zstat
zmodload -i zsh/parameter
autoload -Uz calendar_scandate
local timefmt
local -a vals tmp
[[ -e $REPLY ]] || return 1
zstat -A vals +mtime -- $REPLY || return 1
if (( $# == 1 )); then
if [[ $1 = :* ]]; then
timefmt="%Y/%m/%d:%H:%M:%S"
zstat -A tmp -F $timefmt +mtime -- ${1#:} || return 1
local AGEREF=$tmp[1]
else
local AGEREF=$1
fi
fi
integer mtime=$vals[1] date1 date2
local REPLY REPLY2
# allow a time only (meaning today)
if calendar_scandate -t $AGEREF; then
date1=$REPLY
case $0 in
(after)
(( mtime >= date1 ))
;;
(before)
(( mtime < date1 ))
;;
(*)
print "$0: must be named 'after' or 'before'" >&2
return 1
;;
esac
else
return 1
fi