Subject: Re: Regression: broken completion on modification time
From: Oliver Kiddle <[email-masked]>
To: zsh-workers <[email-masked]>
Date: Wed, 15 Jun 2016 18:32:57 +0200
List-Id: Zsh Workers List <zsh-workers.zsh.org>

Bart wrote:
> } It should probably at least bail out if the complist module isn't loaded as
> } per this patch. Or have you got any better ideas on what to check for?
>
> You suggested:
> > Looking for select in $_def_menu_style 

I tried a number of combinations to see if this would work. It falls
down where the menu-select widget is used directly. Checking for
$WIDGET wouldn't help with that because the menu-select widget doesn't
cause all the completion functions to run, it just turns on menu
selection with whatever completion list we already have.

Another option would be to set a different value for compstate[list] so
users with default setup get a calendar listed: menu selection is not
actually needed for the calendar to display. I'm not sure this is
especially helpful, however, because it is only by using menu selection
to select a specific date that the function is useful.

> There's also the issue noted in workers/35770 (hopefully zsh.org is back
> up) where the substitution of the descriptions for the actual values
> (e.g. before/since for -/+) is confusing if the "format" style is not
> set and the layout is poor when the "group-name" style is not set.

Not having group-name set results in poor format in general.

Looking back at that mail, the complaint is that it does not tell you
"what the syntax is without selecting the entry itself". I prefer
to keep things compact to allow space for the calendar. How about
using a style such as the following. We have an extra-verbose style in
_path_commands and this uses that though I could be persuaded to use
just verbose. I'll allow time for comments before doing anything for
_find.

Oliver

diff --git a/Completion/Zsh/Type/_globquals b/Completion/Zsh/Type/_globquals
index 2523eb3..4eca7ba 100644
--- a/Completion/Zsh/Type/_globquals
+++ b/Completion/Zsh/Type/_globquals
@@ -1,7 +1,7 @@
 #autoload
 
 local state=qual expl char delim timespec
-local -a alts tdisp sdisp
+local -a alts tdisp sdisp tmatch smatch
 local -A specmap
 
 while [[ -n $PREFIX ]]; do
@@ -118,11 +118,26 @@ while [[ -n $PREFIX ]]; do
       timespec=$PREFIX[1]
       if ! compset -P '[Mwhmsd]' && [[ -z $PREFIX ]]; then
 	tdisp=( seconds minutes hours days weeks Months )
-        alts+=( "time-specifiers:time specifier:compadd -E 0 -d tdisp -S '' - s m h d w M" )
+	tmatch=( s m h d w M )
+	if zstyle -t ":completion:${curcontext}:time-specifiers" extra-verbose; then
+	  zstyle -s ":completion:${curcontext}:time-specifiers" list-separator sep || sep=--
+          print -v tdisp -f "%s ${sep//(#m)[%\\]/$MATCH$MATCH} %s\0" ${tmatch:^^tdisp}
+	  tdisp=( ${(0)tdisp} )
+	fi
+	alts+=( "time-specifiers:time specifier:compadd -E 0 -d tdisp -S '' -a tmatch" )
       fi
       if ! compset -P '[-+]' && [[ -z $PREFIX ]]; then
 	sdisp=( before exactly since )
-        alts+=("senses:sense:compadd -E 0 -d sdisp -S '' - + '' -")
+	smatch=( - '' + )
+	if zstyle -t ":completion:${curcontext}:senses" extra-verbose; then
+	  zstyle -s ":completion:${curcontext}:senses" list-separator sep || sep=--
+	  sdisp=( "- $sep before" "+ $sep since" )
+	  smatch=( - + )
+	else
+	  sdisp=( before exactly since )
+	  smatch=( - '' + )
+	fi
+        alts+=( "senses:sense:compadd -E 0 -d sdisp -S '' -a smatch" )
       fi
       specmap=( M months w weeks h hours m minutes s seconds '(|+|-|d)' days)
       alts+=('digits:digit ('${${specmap[(K)$timespec]}:-invalid time specifier}'):_dates -f ${${timespec/[-+]/d}:-d} -S ""' )