From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28183 invoked from network); 26 Apr 2001 14:35:44 -0000 Received: from sunsite.dk (130.225.51.30) by ns1.primenet.com.au with SMTP; 26 Apr 2001 14:35:44 -0000 Received: (qmail 23408 invoked by alias); 26 Apr 2001 14:35:31 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 14117 Received: (qmail 23380 invoked from network); 26 Apr 2001 14:35:30 -0000 From: Sven Wischnowsky Date: Thu, 26 Apr 2001 16:35:23 +0200 (MET DST) Message-Id: <200104261435.QAA05286@beta.informatik.hu-berlin.de> To: zsh-workers@sunsite.dk Subject: Re: problem with _arguments exclusion lists In-Reply-To: <3AE828D4.A2EC6AEE@u.genie.co.uk> Oliver Kiddle wrote: > ... > > But if the word is empty, and the pattern matches, it does offer both > message and options. I think this check should come before the > _message and an empty $PREFIX$SUFFIX should prevent the failed return. > Like this: > [[ -n $PREFIX$SUFFIX && "$PREFIX$SUFFIX" != $~1 ]] && return 1 If we do that, no options will be completed after, e.g. `pine -c' (with your patch), because then the action returned zero. > The completion for vncserver (patch below) could use this so that it > offers display numbers before the initial `:' is typed. I admit that I never thought about using this in a normal-argument spec (non-option-argument). Isn't that already covered enough by the normal behaviour of _arguments? I.e., using some other action for that argument that displays the message and handles the colon (I don't know how this argument has to look like...). > When, in the first message you say `the new behaviour of completing > options if the action returns non-zero', I would have said that the > behaviour was to be not claiming to complete the message when actions > return non-zero so that completing other things, like options isn't > blocked. That part of the `behaviour' depends on whatever the action does, obviously. And I think that the current behaviour of _guard is at least a good default. As I said, we can give it an option to say what should be done (returned) if the word is the empty string. > > No, -w (now -W since I swapped them), makes it complete options > > regardless of the return value of the action. What you're seeing > > here > > is the new default behaviour of trying to complete options if the > > action returns non-zero. > > Oh. I thought it was going to not complete single letter options > unless it had -W and -s and always complete long options. So how do I > get _pine to work properly (use of _guard for _pine also in the > patch): > > valid > pine -cr4 produces an error message > > so pine -r offers other single letter options including -c pine > -c should offer -conf, -character-set etc but not other single > letter options like -r. It should also offer numbers. [See? That last one... that's what you get with the current behaviour of _guard and _arguments.] > I thought the > _arguments -W option was going to allow it to offer single letter > options like -r for any command which allows options between an option > and its argument where they are all in the same word. So -W wouldn't be > used for pine and the -r option wouldn't be offered between -c and its > number argument. Ah, right. That makes sense. Patch below. Bye Sven Index: Completion/Base/Utility/_arguments =================================================================== RCS file: /cvsroot/zsh/zsh/Completion/Base/Utility/_arguments,v retrieving revision 1.4 diff -u -r1.4 _arguments --- Completion/Base/Utility/_arguments 2001/04/26 12:13:37 1.4 +++ Completion/Base/Utility/_arguments 2001/04/26 14:34:38 @@ -182,7 +182,7 @@ -R) rawret=yes; shift;; -w) optarg=yes; shift;; -s) singopt=(-s); shift;; - -W) alwopt=yes; shift;; + -W) alwopt=arg; shift;; esac done @@ -282,7 +282,7 @@ eval ws\=\( "${action[3,-3]}" \) _describe -t "$subc" "$descr" ws -M "$matcher" "$subopts[@]" || - alwopt=yes + alwopt=${alwopt:-yes} tried=yes elif [[ "$action" = \(*\) ]]; then @@ -292,7 +292,7 @@ eval ws\=\( "${action[2,-2]}" \) _all_labels "$subc" expl "$descr" compadd "$subopts[@]" -a - ws || - alwopt=yes + alwopt=${alwopt:-yes} tried=yes elif [[ "$action" = \{*\} ]]; then @@ -301,7 +301,7 @@ while _next_label "$subc" expl "$descr"; do eval "$action[2,-2]" && ret=0 done - (( ret )) && alwopt=yes + (( ret )) && alwopt=${alwopt:-yes} tried=yes elif [[ "$action" = \ * ]]; then @@ -311,7 +311,7 @@ while _next_label "$subc" expl "$descr"; do "$action[@]" && ret=0 done - (( ret )) && alwopt=yes + (( ret )) && alwopt=${alwopt:-yes} tried=yes else @@ -321,7 +321,7 @@ while _next_label "$subc" expl "$descr"; do "$action[1]" "$subopts[@]" "$expl[@]" "${(@)action[2,-1]}" && ret=0 done - (( ret )) && alwopt=yes + (( ret )) && alwopt=${alwopt:-yes} tried=yes fi fi @@ -340,7 +340,8 @@ PREFIX="$origpre" IPREFIX="$origipre" - if comparguments -s single; then + if [[ -z "$alwopt" || -z "$tried" || "$alwopt" = arg ]] && + comparguments -s single; then if [[ "$single" = direct ]]; then _all_labels options expl option \ Index: Doc/Zsh/compsys.yo =================================================================== RCS file: /cvsroot/zsh/zsh/Doc/Zsh/compsys.yo,v retrieving revision 1.119 diff -u -r1.119 compsys.yo --- Doc/Zsh/compsys.yo 2001/04/26 13:03:24 1.119 +++ Doc/Zsh/compsys.yo 2001/04/26 14:34:41 @@ -2938,17 +2938,18 @@ normally not complete the other option directly after `tt(-a)', but it would allow that if given the tt(-w) option. -Similarly, the option tt(-W) may be given to force completion of options -even after options that get an argument in the same word. For example, -if a command takes the options `tt(a)' and `tt(b)', where `tt(a)' needs -an argument in the same word, directly after the option character, -tt(_arguments) would normally only execute the action for that argument -and not offer other options as possible completions. If given the -tt(-W) option, it will offer other options as possible completions after -executing the action for the argument. Note that, depending on the -action, this may mean that the other options can't really be completed, -but at least they will be listed. For more control, use an utility -function like tt(_guard) in the argument's action. +Similarly, the option tt(-W) may be given together with tt(-s) to force +completion of single-letter options even after options that get an +argument in the same word. For example, if a command takes the options +`tt(a)' and `tt(b)', where `tt(a)' needs an argument in the same word, +directly after the option character, tt(_arguments) would normally only +execute the action for that argument and not offer other single-letter +options as possible completions. If given the tt(-W) option, it will +offer other options as possible completions after executing the action +for the argument. Note that, depending on the action, this may mean +that the other options can't really be completed, but at least they will +be listed. For more control, use an utility function like tt(_guard) in +the argument's action. The forms of var(optspec) are: -- Sven Wischnowsky wischnow@informatik.hu-berlin.de