zsh-workers
 help / color / mirror / Atom feed
From: Oliver Kiddle <opk@zsh.org>
To: Zsh workers <zsh-workers@zsh.org>
Subject: Re: [PATCH 1/2] __arguments: New completion function for _arguments.
Date: Sat, 03 Apr 2021 01:58:21 +0200
Message-ID: <15909-1617407901.853986@YG9A.ovow.2A9B> (raw)
In-Reply-To: <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


  parent reply	other threads:[~2021-04-02 23:58 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-01  0:00 Daniel Shahaf
2021-04-01  0:00 ` [PATCH 2/2] ___arguments: New completion function for __arguments Daniel Shahaf
2021-04-01 12:53 ` [PATCH 1/2] __arguments: New completion function for _arguments Oliver Kiddle
2021-04-01 17:33   ` Daniel Shahaf
2021-04-01 22:34     ` _arguments -n / $NORMARG (was: Re: [PATCH 1/2] __arguments: New completion function for _arguments.) Daniel Shahaf
2021-04-09 19:24       ` Oliver Kiddle
2021-04-09 22:52         ` Daniel Shahaf
2021-04-02 23:58     ` Oliver Kiddle [this message]
2021-04-10 20:41       ` [PATCH 1/2] __arguments: New completion function for _arguments Lawrence Velázquez
2021-04-13 11:28         ` Daniel Shahaf
2021-04-17 12:25       ` Daniel Shahaf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=15909-1617407901.853986@YG9A.ovow.2A9B \
    --to=opk@zsh.org \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

zsh-workers

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://inbox.vuxu.org/zsh-workers

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 zsh-workers zsh-workers/ http://inbox.vuxu.org/zsh-workers \
		zsh-workers@zsh.org
	public-inbox-index zsh-workers

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.zsh.workers


code repositories for the project(s) associated with this inbox:

	https://git.vuxu.org/mirror/zsh/

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git