Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: [PATCH 1/2] __arguments: New completion function for _arguments.
- X-seq: zsh-workers 48378
- From: Oliver Kiddle <opk@xxxxxxx>
- To: Zsh workers <zsh-workers@xxxxxxx>
- Subject: Re: [PATCH 1/2] __arguments: New completion function for _arguments.
- Date: Sat, 03 Apr 2021 01:58:21 +0200
- Archived-at: <https://zsh.org/workers/48378>
- Archived-at: <http://www.zsh.org/sympa/arcsearch_id/zsh-workers/2021-04/15909-1617407901.853986%40YG9A.ovow.2A9B>
- In-reply-to: <20210401173305.GB11180@tarpaulin.shahaf.local2>
- List-id: <zsh-workers.zsh.org>
- References: <20210401000026.23570-1-danielsh@tarpaulin.shahaf.local2> <96182-1617281582.024669@4LIl.h-KW.lXZv> <20210401173305.GB11180@tarpaulin.shahaf.local2>
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