From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14993 invoked by alias); 11 Jul 2013 22:38:32 -0000 Mailing-List: contact zsh-users-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Users List List-Post: List-Help: X-Seq: 17865 Received: (qmail 10645 invoked from network); 11 Jul 2013 22:38:17 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 Received-SPF: pass (ns1.primenet.com.au: SPF record at websitewelcome.com designates 67.18.34.19 as permitted sender) Message-ID: <51DF2E90.4070606@goots.org> Date: Thu, 11 Jul 2013 23:15:44 +0100 From: Nick Cross User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130625 Thunderbird/17.0.7 MIME-Version: 1.0 To: Peter Stephenson CC: zsh-users@zsh.org Subject: Re: Make Completion References: <51DD616D.2090200@goots.org> <20130711105453.1615bb3b@pwslap01u.europe.root.pri> In-Reply-To: <20130711105453.1615bb3b@pwslap01u.europe.root.pri> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gator3039.hostgator.com X-AntiAbuse: Original Domain - zsh.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - goots.org X-BWhitelist: no X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: ([192.168.0.47]) [94.170.26.95]:49850 X-Source-Auth: goots@goots.org X-Email-Count: 1 X-Source-Cap: cm5jO3JuYztnYXRvcjMwMzkuaG9zdGdhdG9yLmNvbQ== One problem I have noticed when completing the options list is that it no longer seems to complete the makefile targets if the Makefile is selected using e.g. -f Makefile.FOO (so there is no default named Makefile in the directory). The "file=($opt_args[(K)(-f|--file|--makefile)])" does not seem to be returning a valid string/file Regards Nick On 11/07/13 10:54, Peter Stephenson wrote: > On Wed, 10 Jul 2013 14:28:13 +0100 > Nick Cross wrote: >> Am I right in thinking that the make completion under ZSH (5.0.2 on >> Fedora18) does not complete the command line -* options (as opposed to >> Bash which does) ? I have tried "make -" and nothing happens - in >> bash it prints out a menu of the - options (e.g. --debug). > > Yes, it's fairly basic in terms of options, though quite smart about > looking inside makefiles. > > Currently it's quite hard to update since it doesn't use _arguments. As > a first step, this fixes that problem, so it should be much easier to > add further GNU option handling as a next step (or further variants if > desired). > > Lightly tested --- I don't think I've completely broken it but 100% > satisfaction not guaranteed. > > diff --git a/Completion/Unix/Command/_make b/Completion/Unix/Command/_make > index 53e2e1b..72d16bb 100644 > --- a/Completion/Unix/Command/_make > +++ b/Completion/Unix/Command/_make > @@ -148,7 +148,9 @@ _make-findBasedir () { > _make() { > > local prev="$words[CURRENT-1]" file expl tmp is_gnu dir incl match > - local -A TARGETS VARIABLES > + local context state line > + local -a option_specs > + local -A TARGETS VARIABLES opt_args > local ret=1 > > _pick_variant -r is_gnu gnu=GNU unix -v -f > @@ -156,21 +158,43 @@ _make() { > if [[ $is_gnu == gnu ]] > then > incl="(-|)include" > + # TBD: update option_specs > + option_specs=( > + '-C[change directory first]:directory:->dir' > + '-I[include directory for makefiles]:directory:->dir' > + '-f[specify makefile]:makefile:->file' > + '-o[specify file not to remake]:file not to remake:->file' > + '-W[pretend file was modified]:file to treat as modified:->file' > + ) > else > + # Basic make options only. > incl=.include > + option_specs=( > + '-C[change directory first]:directory:->dir' > + '-I[include directory for makefiles]:directory:->dir' > + '-f[specify makefile]:makefile:->file' > + '-o[specify file not to remake]:file not to remake:->file' > + '-W[pretend file was modified]:file to treat as modified:->file' > + ) > fi > > - if [[ "$prev" == -[CI] ]] > - then > + _arguments -s $option_specs \ > + '*:make target:->target' && ret=0 > + > + case $state in > + (dir) > _files -W ${(q)$(_make-findBasedir ${words[1,CURRENT-1]})} -/ && ret=0 > - elif [[ "$prev" == -[foW] ]] > - then > + ;; > + > + (file) > _files -W ${(q)$(_make-findBasedir $words)} && ret=0 > - else > - file="$words[(I)-f]" > - if (( file )) > + ;; > + > + (target) > + file=($opt_args[(K)(-f|--file|--makefile)]) > + file=$file[1] > + if [[ -n $file ]] > then > - file=${~words[file+1]} > [[ $file == [^/]* ]] && file=${(q)$(_make-findBasedir $words)}/$file > [[ -r $file ]] || file= > else > @@ -222,7 +246,7 @@ _make() { > compadd -S '=' -- ${(k)VARIABLES} && ret=0 > done > fi > - fi > + esac > > return ret > } > > > pws >