summary refs log tree commit diff
path: root/Completion/Unix/Command
diff options
context:
space:
mode:
authorJun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>2016-11-24 21:33:15 +0900
committerJun-ichi Takimoto <takimoto-j@kba.biglobe.ne.jp>2016-11-24 21:33:15 +0900
commitfe2d87767ddf4f6d325dbc76a0b6e6dc624ce556 (patch)
tree90f25792625267a9b8663aff185b2cef6435e3ac /Completion/Unix/Command
parentb3a88a53d379d6b59ccee468723a034f65fd757d (diff)
downloadzsh-fe2d87767ddf4f6d325dbc76a0b6e6dc624ce556.tar.gz
zsh-fe2d87767ddf4f6d325dbc76a0b6e6dc624ce556.tar.xz
zsh-fe2d87767ddf4f6d325dbc76a0b6e6dc624ce556.zip
40005: call _date_formats from _date
also update both files for darwin etc.
Diffstat (limited to 'Completion/Unix/Command')
-rw-r--r--Completion/Unix/Command/_date97
1 files changed, 69 insertions, 28 deletions
diff --git a/Completion/Unix/Command/_date b/Completion/Unix/Command/_date
index ff3bac398..16b34d7d6 100644
--- a/Completion/Unix/Command/_date
+++ b/Completion/Unix/Command/_date
@@ -1,57 +1,98 @@
 #compdef date gdate
 
-local -a args alts
+local curcontext="$curcontext" state state_descr line ret=1
+local -A opt_args
+local -a opts args
+
+opts=( -s -w -C )
 
 if _pick_variant gnu="Free Software Foundation" unix --version; then
+  local d='(-d --date -f --file -r --reference -s --set)'
+  local f='(-I --iso-8601 -R --rfc-2822 --rfc-3339)'
   args=(
-    '-d[output specified date]:time string'
-    '-f[output dates specified in file]:file:_files'
-    '-I-[iso-8601]:precision:(date hours minutes seconds)'
-    '-r[reference]:file:_files'
-    '-R[RFC2822 format]'
-    '-s[set]:time string'
-    '--rfc-3339=-[output date and time in RFC 3339 format]:output type:(date seconds ns)'
-    --
-    '*=FILE*:file:_files'
-    '*=DATEFILE*:date file:_files'
+    $d{-d+,--date=}'[output date specified by string]:time string'
+    $d{-f+,--file=}'[output dates specified in file]:file:_files'
+    $d{-r+,--reference=}'[output last modification time of specified file]:file:_files'
+    $d{-s+,--set=}'[set time]:time string'
+    $f{-I-,--iso-8601=-}'[display in ISO 8601 format]::precision:(date hours minutes seconds ns)'
+    $f{-R,--rfc-2822}'[display in RFC2822 format]'
+    $f'--rfc-3339=-[display in RFC 3339 format]:precision:(date seconds ns)'
+    '(-u --utc --universal)'{-u,--utc,--universal}'[display or set time in UTC]'
+    '(- :)--help[output help and exit]'
+    '(- :)--version[output version info and exit]'
   )
 else
+  args=( '-u[display or set time in UTC]' )
   case "$OSTYPE" in
     solaris*)
-      args=( '-a:adjustment' )
+      args+=( '-a:adjustment' )
     ;;
-    darwin*|dragonfly*|netbsd*|openbsd*)
-      args+=( '-r[specify reference time]:seconds since epoch' )
-    ;|
-    freebsd*|darwin*|dragonfly*|netbsd*|openbsd*)
-      args=(
-	'-n[only set time on current machine]'
-	'-d:daylight saving time value'
+    freebsd*|dragonfly*|darwin*|netbsd*|openbsd*)
+      opts+=( -A '-*' )
+      args+=(
 	'-j[do not try to set date]'
-	'-t:minutes west of GMT'
+	'2:format or date:->fmt_date'
+      )
+    ;|
+    freebsd*|dragonfly*|darwin*|netbsd*)
+      args+=( '-n[only set time on current machine]' )
+    ;|
+    freebsd*|dragonfly*|darwin*|openbsd*)
+      args+=(
+	'-d+:daylight saving time value'
+	'-t+:minutes west of GMT'
+      )
+    ;|
+    dragonfly*|darwin*|netbsd*|openbsd*)
+      args+=(
+	'-r+[output date specified by reference time]:seconds since epoch'
       )
     ;|
     freebsd*)
+      local -a alts
       alts=(
 	'seconds:sec:_guard "(0x[0-9a-fA-F]#|[0-9]#)" "seconds since epoch"'
 	'files:file:_files'
       )
       args+=(
-	'-r[reference time: file modification or literal time]:reference: _alternative $alts'
-	'-R[RFC2822 format]'
+	'-r+[reference time: file modification or literal time]:reference: _alternative $alts'
       )
     ;|
     freebsd*|dragonfly*|darwin*)
-      args+=( '-f:parsing format' '-v:adjustment value' )
+      args+=(
+	'-f+[use specified format for input]:parsing format:_date_formats:new date:'
+	'*-v+[adjust and print (but not set) date]:[+-]value[ymwdHMS]:'
+      )
     ;;
+    freebsd*|dragonfly*)
+      args+=( '-R[display in RFC2822 format]' )
+    ;|
+    openbsd*|netbsd*) args=+( '-a[gradually skew]' )
+    ;|
     openbsd*)
       args+=( '-z[specify timezone for output]:time zone:_time_zone')
     ;|
-    openbsd*|netbsd*) args=( '-a[gradually skew]' ) ;;
+    netbsd*)
+      args+=( '-d[output date specified by string]:time string:' )
+    ;;
   esac
 fi
 
-_arguments \
-  '-u[display or set time in UTC]' \
-  ': :_guard "^--*" "format or date"' \
-  "$args[@]"
+_arguments $opts : $args \
+  '1:format or date:->fmt_date' && ret=0
+
+case $state in
+  (fmt_date)
+    local expl
+    if compset -P '+'; then
+      _wanted date-formats expl 'output format' _date_formats && ret=0
+    elif [[ $words[CURRENT] != -* ]]; then
+      # TODO: in most cases it should be possible to determine which
+      # (or both or neither) of the +format and/or date is allowed
+      # depending on the options already on the command line
+      _message -e date-formats '+format or date' && ret=0
+    fi
+    ;;
+esac
+
+return ret