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

Re: I wonder if this can be improved a bit

Matt Armstrong wrote:
> I'm implementing a completion system for Perforce's

>     a=( ${(f)"$(p4 -s help commands 2>&1)"} )
>     a=( ${(M)a:#info:   *} )
>     a=( ${a/(#b)info:   #([a-z0-9]##) */$match[1]} )

you can nest those substitutions if you want, not that it makes
much difference.

>     typeset -A _p4_cmds
>     _p4_cmds=()
>     for i in $a; do
>         _p4_cmds[$a]=""

should that not be _p4_cmds[$i]=""

> So now _p4_cmds is an associative array of available sub commands.
> Here I have annotated questions about this code.
>     # This requires EXTENDED_GLOB to be set
>     setopt extendedglob
> Can I depend on the completion widgets setting EXTENDED_GLOB for me?

Yes. The _comp_options array contains the list of options set for

>     local a
>     a=( ${(f)"$(p4 -s help commands 2>&1)"} )
> I will eventually change this to the more correct
> "$(_call_program commands p4 -s help commands) ".

I'd use $words[1] instead of p4 so that it will work if p4 is not in
the path but is specified with its location.

>     a=( ${(M)a:#info:   *} )
>                      ^^^
> The whitespace there is a space followed by a tab character.  Is there
> any more readable way to include a tab character?  A \t escape sequence?


In some circumstances, you may also be able to make use of [[:blank:]].

> Is there a simple way to turn an array (a b c) into (a "" b "" c "")?
> Then I could assign _p4_cmds in one statement and dump the loop.

See my -workers post on this question.


This email has been scanned for all viruses by the MessageLabs SkyScan service. For more information on a pro-active anti-virus service working around the clock, around the globe visit http://www.messagelabs.com/

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