From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2627 invoked from network); 21 Aug 2004 18:11:41 -0000 Received: from news.dotsrc.org (HELO a.mx.sunsite.dk) (130.225.247.88) by ns1.primenet.com.au with SMTP; 21 Aug 2004 18:11:41 -0000 Received: (qmail 26867 invoked from network); 21 Aug 2004 18:11:36 -0000 Received: from sunsite.dk (130.225.247.90) by a.mx.sunsite.dk with SMTP; 21 Aug 2004 18:11:36 -0000 Received: (qmail 24247 invoked by alias); 21 Aug 2004 18:11:23 -0000 Mailing-List: contact zsh-workers-help@sunsite.dk; run by ezmlm Precedence: bulk X-No-Archive: yes X-Seq: 20277 Received: (qmail 24237 invoked from network); 21 Aug 2004 18:11:23 -0000 Received: from unknown (HELO a.mx.sunsite.dk) (130.225.247.88) by 130.225.247.90 with SMTP; 21 Aug 2004 18:11:23 -0000 Received: (qmail 25927 invoked from network); 21 Aug 2004 18:09:25 -0000 Received: from dsl3-63-249-88-2.cruzio.com (HELO binome.blorf.net) (63.249.88.2) by a.mx.sunsite.dk with SMTP; 21 Aug 2004 18:09:22 -0000 Received: by binome.blorf.net (Postfix, from userid 1000) id 64F1F2845; Sat, 21 Aug 2004 11:09:20 -0700 (PDT) Date: Sat, 21 Aug 2004 11:09:20 -0700 From: Wayne Davison To: Hugo Haas Cc: zsh-workers@sunsite.dk, 262247@bugs.debian.org Subject: Re: Bug#262247: zsh: Improved make completion Message-ID: <20040821180920.GA24266@blorf.net> References: <20040730101751.GA11905@larve.net> <20040730153054.GA4059@scowler.net> <20040730165133.GL12279@larve.net> <20040818150736.GI4753@larve.net> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="y0ulUmNC+osPPQO6" Content-Disposition: inline In-Reply-To: <20040818150736.GI4753@larve.net> User-Agent: Mutt/1.5.6+20040722i X-Spam-Checker-Version: SpamAssassin 2.63 on a.mx.sunsite.dk X-Spam-Level: X-Spam-Status: No, hits=-1.4 required=6.0 tests=BAYES_20 autolearn=no version=2.63 X-Spam-Hits: -1.4 --y0ulUmNC+osPPQO6 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, Aug 18, 2004 at 11:07:36AM -0400, Hugo Haas wrote: > Attached is an attempt at doing this. It seems to work, though I only > enabled it for the gnu case. I tried your patch, and it ignored targets that had dependencies (since it only matched a colon at the end of the line). Here's my attempt at a zsh-only verson of _make. It not only follows include files, but it expands variables too. I tried to make it handle both gnu and non-gnu include files, but I assume that the ".include <...>" form needs more code to handle where the include really resides. Since the patch was larger than the new _make script, I'm just attaching the new _make script here. Give it a try and see how you like it. Also, feel free to suggest how to improve it (for instance, I'd like to know if the eval statements can be replaced with something else). ..wayne.. --y0ulUmNC+osPPQO6 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=_make #compdef make gmake pmake dmake local prev="$words[CURRENT-1]" file expl tmp is_gnu cmdargs dir incl expandVars() { local open close var val tmp=$1 ret=$1 while :; do var=${tmp#*\$} if [[ $var != $tmp ]]; then tmp=$var case $var in (\(*) open='(' close=')' ;; ({*) open='{' close='}' ;; ([[:alnum:]]*) open='' close='' var=${(s::)var[1]} ;; (*) continue ;; esac if [[ $open != '' ]]; then var=${var#$open} var=${var%%$close*} fi case $var in ([[:alnum:]_]#) eval val=\${$var} val=$(expandVars $val) ret=${ret//\$$open$var$close/$val} ;; esac else print $ret return fi done } parseMakefile() { local input var val TAB=$'\t' dir=$1 while read input; do case "$input " in ([[:alnum:]][^$TAB:= ]#[ $TAB]#=*) var=${input%%[ $TAB]#=*} val=${input#*=} val=${val##[ $TAB]#} eval $var=\$val ;; ([[:alnum:]][^$TAB:= ]#[ $TAB]#:=*) var=${input%%[ $TAB]#:=*} val=${input#*=} val=${val##[ $TAB]#} val=$(expandVars $val) eval $var=\$val ;; ([[:alnum:]][^$TAB:=]#:[^=]*) input=${input%%:*} print $(expandVars $input) ;; ($incl *) local f=${input##$incl ##} if [[ $incl = '.include' ]]; then f=${f#[\"<]} f=${f%[\">]} fi f=$(expandVars $f) case $f in (/*) ;; (*) f=$dir/$f ;; esac if [ -r $f ]; then parseMakefile ${f%%/[^/]##} < $f fi ;; esac done } _pick_variant -r is_gnu gnu=GNU unix -v -f if [[ $is_gnu = gnu ]]; then incl=include else incl=.include fi if [[ "$prev" = -[CI] ]]; then _files -/ elif [[ "$prev" = -[foW] ]]; then _files else file="$words[(I)-f]" if (( file )); then file="$words[file+1]" elif [[ -e Makefile ]]; then file=Makefile elif [[ -e makefile ]]; then file=makefile elif [[ $is_gnu = gnu && -e GNUmakefile ]]; then file=GNUmakefile else file='' fi if [[ -n "$file" ]] && _tags targets; then if [[ $is_gnu = gnu ]] && zstyle -t ":completion:${curcontext}:targets" call-command; then tmp=( $(_call_program targets "$words[1]" -nsp --no-print-directory -f "$file" .PHONY 2> /dev/null | parseMakefile $PWD) ) else tmp=( $(parseMakefile $PWD < $file) ) fi _wanted targets expl 'make target' compadd -a tmp && return 0 fi compstate[parameter]="${PREFIX%%\=*}" compset -P 1 '*=' _value "$@" fi --y0ulUmNC+osPPQO6--