Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: PATCH: _ps1234, _date_formats: Complete strftime formats for %D{}



Mikael Magnusson wrote:
> 
> PS, my strftime(3) says it handles %E and %O, and it does work with date +%Ey,
> but zsh just prints the literal %Ey. Is it handled wrong by us or not
> by the libc like the manpage claims?

Looking at the source, it seems only - is treated as a modifier.
It'd be nice for it to be updated if it can remain portable.

>  Completion/Unix/Type/_ps1234       | 14 +++++--

Shouldn't this be in Completion/Zsh/Type?

> +else
> +  _default "$@"

I really don't think _default is applicable there. The function is only
for completing date formats. If the calling function needs that, it
should do it itself. If _default is somehow needed, the return status
should be considered.

> +  compset -P "*"
> +  _describe -t date-format-specifier 'date format specifier' '(%)' -S ''

Using _describe to complete just % seems rather overkill. An _wanted
would do. However, it'd be better to use a prefix for the % and use
compset -P to cut off complete format specifiers or unrelated
characters. The patch below does that and adds a case statement to
select some OS specific additions.

It'd perhaps be nice to complete format specifiers and modifiers with a
different tag and description.

Oliver

diff --git a/Completion/Unix/Type/_date_formats b/Completion/Unix/Type/_date_formats
index 3dd2fa5..f9c80c9 100644
--- a/Completion/Unix/Type/_date_formats
+++ b/Completion/Unix/Type/_date_formats
@@ -1,80 +1,105 @@
 #autoload
 
+local flag
 local -a specs
-local exps bs
+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'
+  )
 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)'



Messages sorted by: Reverse Date, Date, Thread, Author