summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Kiddle <opk@zsh.org>2015-07-07 23:06:01 +0200
committerOliver Kiddle <opk@zsh.org>2015-07-07 23:06:01 +0200
commit1b4bdcdf3e99ee3b61b9bed8e3705dc2821ce6c4 (patch)
treebe59e9159c0723c4be1139cd07e33257af610103
parent396f68971fef574160e780c01d12a58747f5d224 (diff)
downloadzsh-1b4bdcdf3e99ee3b61b9bed8e3705dc2821ce6c4.tar.gz
zsh-1b4bdcdf3e99ee3b61b9bed8e3705dc2821ce6c4.zip
35700: complete OS specific date format specifiers and put % in a prefix
-rw-r--r--ChangeLog3
-rw-r--r--Completion/Unix/Type/_date_formats168
2 files changed, 100 insertions, 71 deletions
diff --git a/ChangeLog b/ChangeLog
index 0c60eedf9..8164236d2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2015-07-06 Oliver Kiddle <opk@zsh.org>
+ * 35700: Completion/Unix/Type/_date_formats: complete OS specific
+ date format specifiers and put % in a prefix
+
* 35718: Completion/Unix/Command/_find, Completion/Unix/Type/_dates,
Completion/Zsh/Type/_globquals: new calendar style date completion
diff --git a/Completion/Unix/Type/_date_formats b/Completion/Unix/Type/_date_formats
index 3dd2fa507..2daf82049 100644
--- a/Completion/Unix/Type/_date_formats
+++ b/Completion/Unix/Type/_date_formats
@@ -1,80 +1,106 @@
#autoload
-local -a specs
-local exps bs
+local flag
+local -aU specs
+local -A exclusion
-if [[ -z $compstate[quote] ]]; then
- bs='\'
-fi
+exclusion=(
+ 'E' '[-_^#cCgGxXyY]'
+ 'O' '[-_^#BdeHImMSuUVwWy]'
+ '-' '[OEdegHIjklmMSUz]'
+ '_' '[OEdgHIjmMSUz]'
+ '0' '[Oekl]'
+ '^' '[OEaAbBchP]'
+ '#' '[OEaAbBchpPrXZ]'
+)
+
+compset -P '(%[0-9EO_\\^#-]#[^0-9%EO_\\^#-]|[^%])#'
+compset -S '%*'
+specs=(
+ 'a:abbreviated day name'
+ 'A:full day name'
+ 'b:abbreviated month name'
+ 'B:full month name'
+ 'c:preferred locale date and time'
+ 'C:2-digit century'
+ 'd:day of month (01-31)'
+ 'D:american format month/day/year (%m/%d/%y)'
+ 'e:day of month ( 1-31)'
+ 'E:alternate representation'
+ 'F:ISO 8601 year-month-date (%Y-%m-%d)'
+ 'G:4-digit ISO 8601 week-based year'
+ 'g:2-digit ISO 8601 week-based year'
+ 'h:abbreviated month name'
+ 'H:hour (00-23)'
+ 'I:hour (01-12)'
+ 'j:day of year (001-366)'
+ 'k:hour ( 1-23)'
+ 'l:hour ( 1-12)'
+ 'm:month (01-12)'
+ 'M:minute (00-59)'
+ 'n:newline'
+ 'O:alternative format modifier'
+ 'p:locale dependent AM/PM'
+ 'r:locale dependent a.m. or p.m. time (%I:%M:%S %p)'
+ 'R:24-hour notation time (%H:%M)'
+ 's:seconds since the epoch'
+ 'S:seconds (00-60)'
+ 't:tab'
+ 'T:24-hour notation with seconds (%H:%M:%S)'
+ 'u:day of week (1-7, 1=monday)'
+ 'U:week number of current year, sunday based (00-53)'
+ 'V:ISO 8601 week number of current year, week 1 has 4 days in current year (01-53)'
+ 'w:day of week (0-6, 0=sunday)'
+ 'W:week number of current year, monday based (00-53)'
+ 'x:locale dependent date representation without time'
+ 'X:locale dependent time representation without date'
+ 'y:2-digit year (00-99)'
+ 'Y:full year'
+ 'z:UTC offset'
+ 'Z:timezone name'
+ '%:A %'
+)
-false
-if [[ $PREFIX == *%(|[-EO]|<->) ]]; then
- specs=()
- if [[ $PREFIX != *<-> ]]; then
+case $OSTYPE in
+ freebsd*|linux-gnu|solaris2.<11->)
specs+=(
- 'a:abbreviated day name'
- 'A:full day name'
- 'b:abbreviated month name'
- 'B:full month name'
- 'c:preferred locale date and time'
- 'C:2-digit century'
- 'd:day of month (01-31)'
- 'D:american format month/day/year (%m/%d/%y)'
- 'e:day of month ( 1-31)'
- 'E:alternate representation'
- 'F:ISO 8601 year-month-date (%Y-%m-%d)'
- 'G:4-digit ISO 8601 week-based year'
- 'g:2-digit ISO 8601 week-based year'
- 'h:abbreviated month name'
- 'H:hour (00-23)'
- 'I:hour (01-12)'
- 'j:day of year (001-366)'
- 'k:hour ( 1-23)'
- 'l:hour ( 1-12)'
- 'm:month (01-12)'
- 'M:minute (00-59)'
- 'n:newline'
- 'O:alternative format modifier'
- 'p:locale dependent AM/PM'
- 'P:lower case locale dependent am/pm'
- 'r:locale dependent a.m. or p.m. time (%I:%M:%S %p)'
- 'R:24-hour notation time (%H:%M)'
- 's:seconds since the epoch'
- 'S:seconds (00-60)'
- 't:tab'
- 'T:24-hour notation with seconds (%H:%M:%S)'
- 'u:day of week (1-7, 1=monday)'
- 'U:week number of current year, sunday based (00-53)'
- 'V:ISO 8601 week number of current year, week 1 has 4 days in current year (01-53)'
- 'w:day of week (0-6, 0=sunday)'
- 'W:week number of current year, monday based (00-53)'
- 'x:locale dependent date representation without time'
- 'X:locale dependent time representation without date'
- 'y:2-digit year (00-99)'
- 'Y:full year'
- 'z:UTC offset'
- 'Z:timezone name'
- '%:A %'
- '-:strip leading space or zero (gnu extension)'
+ "-:don't pad numeric values"
+ '#:swap case of alphabetic characters'
+ '0:left pad numeric values with zeroes'
+ '^:convert lowercase characters to uppercase'
+ '_:left pad numeric values with spaces'
)
- if [[ $1 == zsh ]]; then
- specs+=(
- 'f:day of month (1-31)'
- 'K:hour (0-23)'
- 'L:hour (0-12)'
- )
- fi
- fi
- if [[ $1 == zsh ]]; then
+ ;|
+ linux-gnu|solaris2.<11->)
specs+=(
- '.:fractional part of seconds since epoch'
+ 'P:lower case locale dependent am/pm'
)
- fi
- compset -P "*"
- _describe -t date-format-specifier 'date format specifier' specs -S ''
- _message -e date-format-precision 'precision for %%. (1-6)'
-else
- _default "$@"
- compset -P "*"
- _describe -t date-format-specifier 'date format specifier' '(%)' -S ''
+ ;|
+ freebsd*)
+ specs+=( 'v:date in short form (%e-%b-%Y)' )
+ ;|
+ solaris2.<11->|freebsd*)
+ specs+=( '+:localized representation of date and time' )
+ ;;
+ solaris2.<-10>)
+ specs=( ${specs:#[EOs]:*} )
+ ;;
+esac
+
+if [[ $1 == zsh ]]; then
+ specs+=(
+ 'f:day of month (1-31)'
+ 'K:hour (0-23)'
+ 'L:hour (0-12)'
+ '.:fractional part of seconds since epoch'
+ "-:don't pad numeric values"
+ )
fi
+
+for flag in ${(s..)PREFIX#%}; do
+ (( $+exclusion[$flag] )) && specs=( ${(M)specs:#${~exclusion[$flag]}:*} )
+done
+
+_describe -t date-format-specifier 'date format specifier' specs \
+ -p "${(Q)PREFIX:-%}" -S ''
+_message -e date-format-precision 'precision for %%. (1-6)'