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

Re: [PATCH 1/2] __arguments: New completion function for _arguments.



Daniel Shahaf wrote:
> > _compadd could define a pattern to complete compadd options for
> > all commands named _*.

I've attached a patch to do this.

It is a post pattern and I don't have any real commands named with an
initial _ on my system. Perhaps it should also call _default for
non-option arguments?

It also checks $service and handles a few functions specially. I
couldn't be bothered to make this more extensive because, well, it is
all a bit meta and of questionable value. And, no I don't think these
need separating into __ functions.

> > > +  _arguments -A '-*' : \

> Hmm.  How about «-A '-*|:|(!|)\(*'»?

I'd have expected it to be the same as the pattern used at the top of
_arguments - '-([AMO]*|[0CRSWnsw])' but that doesn't seem to work. I
wonder if some bug means it only works with -*

> > > +    "-C[modify \$curcontext for \`->action' (requires \`local curcontext')]" \
> > 
> > This is instead of the $context array.
> > Should only be used where multiple valid states is not a possibility.
>
> There isn't room to say all this inside the brackets.
>
> > I fear that the note in parentheses implies just `local curcontext' and
> > not local curcontext="$curcontext" is needed.
>
> Good point.  How about deleting the parenthetical?  Or replacing it by
> "(see manual)"?

I'd remove it. There's room in the square brackets for one of the
points. - "instead of $context". Descriptions are truncated if needed so
less important information coming at the end doesn't do much harm.

>
> > > +    "-R[when \`->action' matches, return 300]" \
> > 
> > I don't think that really gets used much [[ -n $state ]] is more
> > readable.
>
> How does this affect the patch?  Are you suggesting to hide (with «!»)
> this too?

Not really, it was just an aside.

Oliver

diff --git a/Completion/Zsh/Command/_compadd b/Completion/Zsh/Command/_compadd
index 781fa2af8..9c92cda76 100644
--- a/Completion/Zsh/Command/_compadd
+++ b/Completion/Zsh/Command/_compadd
@@ -1,47 +1,94 @@
-#compdef compadd
+#compdef compadd -P _*
 
-local curcontext="$curcontext" state line ret=1
+local curcontext="$curcontext" ret=1
+local -a state line args
 typeset -A opt_args
 
-_arguments -C -s -S -A "-*" \
-  '-P+[specify prefix]:prefix' \
-  '-S+[specify suffix]:suffix' \
-  '-p+[specify hidden prefix]:hidden prefix' \
-  '-s+[specify hidden suffix]:hidden suffix' \
-  '-i+[specify ignored prefix]:ignored prefix' \
-  '-I+[specify ignored suffix]:ignored suffix' \
-  '(-k)-a[matches are elements of specified arrays]' \
-  '(-a)-k[matches are keys of specified associative arrays]' \
-  '-d+[specify display strings]:array:_parameters -g "*array*"' \
-  '-l[list display strings one per line, not in columns]' \
+args=(
+  '-P+[specify prefix]:prefix'
+  '-S+[specify suffix]:suffix'
+  '-p+[specify hidden prefix]:hidden prefix'
+  '-s+[specify hidden suffix]:hidden suffix'
+  '-i+[specify ignored prefix]:ignored prefix'
+  '-I+[specify ignored suffix]:ignored suffix'
   '-o[specify order for matches by match string not by display string]:: : _values -s , order
     "match[order by match not by display string]"
     "nosort[matches are pre-ordered]"
     "numeric[order numerically]"
-    "reverse[order backwards]"' \
-  '(-1 -E)-J+[specify match group]:group' \
-  '!-V+:group' \
-  '(-J -E)-1[remove only consecutive duplicates from group]' \
-  '-2[preserve all duplicates]' \
-  '(-x)-X[specify explanation]:explanation' \
-  '(-X)-x[specify unconditional explanation]:explanation' \
-  '-q[make suffix autoremovable]' \
-  '-r+[specify character class for suffix autoremoval]:character class' \
-  '-R+[specify function for suffix autoremoval]:function:_functions' \
-  '-f[mark matches as being files]' \
-  '-e[mark matches as being parameters]' \
-  '-W[specify location for matches marked as files]' \
-  '-F+[specify array of ignore patterns]:array:_parameters -g "*array*"' \
-  '-Q[disable quoting of possible completions]' \
-  '*-M[specify matching specifications]' \
-  '-n[hide matches in completion listing]' \
-  '-U[disable internal matching of completion candidates]' \
-  '-O+[populate array with matches instead of adding them]:array:_parameters -g "*array*"' \
-  '-A+[populate array with expanded matches instead of adding them]:array:_parameters -g "*array*"' \
-  '-D+[delete elements from array corresponding to non-matching candidates]:array:_parameters -g "*array*"' \
-  '-C[add special match that expands to all other matches]' \
-  '(-1 -J)-E+[add specified number of display only matches]:number' \
-  '*:candidate:->candidates' && ret=0
+    "reverse[order backwards]"'
+  '(-1 -E)-J+[specify match group]:group'
+  '!-V+:group'
+  '(-J -E)-1[remove only consecutive duplicates from group]'
+  '-2[preserve all duplicates]'
+  '(-x)-X[specify explanation]:explanation'
+  '(-X)-x[specify unconditional explanation]:explanation'
+  '-q[make suffix autoremovable]'
+  '-r+[specify character class for suffix autoremoval]:character class'
+  '-R+[specify function for suffix autoremoval]:function:_functions'
+  '-F+[specify array of ignore patterns]:array:_parameters -g "*array*"'
+  '-Q[disable quoting of possible completions]'
+  '*-M[specify matching specifications]'
+  '-n[hide matches in completion listing]'
+  '-O+[populate array with matches instead of adding them]:array:_parameters -g "*array*"'
+  '-A+[populate array with expanded matches instead of adding them]:array:_parameters -g "*array*"'
+  '-D+[delete elements from array corresponding to non-matching candidates]:array:_parameters -g "*array*"'
+)
+
+case $service in
+  compadd|_(path_|)files)
+    args+=(
+      '-W[specify location for matches marked as files]'
+    )
+  ;|
+  compadd)
+    args+=(
+      '(-k)-a[matches are elements of specified arrays]'
+      '(-a)-k[matches are keys of specified associative arrays]'
+      '-d+[specify display strings]:array:_parameters -g "*array*"'
+      '-l[list display strings one per line, not in columns]'
+      '-f[mark matches as being files]'
+      '-e[mark matches as being parameters]'
+      '-C[add special match that expands to all other matches]'
+      '(-1 -J)-E+[add specified number of display only matches]:number'
+      '-U[disable internal matching of completion candidates]'
+      '*:candidate:->candidates'
+    )
+  ;;
+  _dates)
+    args=( ${args:#([(][^)]##\)|)-[12noOAD]*}
+      '-f[specify format for matches]:format:_date_formats'
+      '-F[select a future rather than past date]'
+    )
+  ;;
+  _(path_|)files)
+    args=( ${args:#([(][^)]##\)|)-[OAD]*}
+      '-g+[specify file glob pattern]:glob pattern'
+      '-/[complete only directories]'
+    )
+  ;;
+  _parameters)
+    args+=(
+      '-g+[specify pattern to filter parameter type by]:pattern'
+    )
+  ;;
+  _pids)
+    args+=( '-m+[pattern to filter process command line by]:pattern' )
+  ;;
+  _process_names)
+    args+=(
+      '-a[include all processes]'
+      '-t[use truncated process names]'
+    )
+  ;;
+  _sys_calls)
+    args+=(
+      '-a[add "all" as an additional match]'
+      '-n[add "none" as an additional match]'
+    )
+  ;;
+esac
+
+_arguments -C -s -S -A "-*" $args && ret=0
 
 if [[ -n $state ]]; then
   if (( $+opt_args[-a] )); then




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