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

Re: [SUBMIT] _ant completion function

On 16 Aug, Bill Burton wrote:

> Here's my version of an _ant function for Ant completion support in
> versions 1.3 to 1.5.

Great, thanks. As I suggested in the previous mail, I've gone through
this and merged it with the _ant I posted last week. The _arguments
sections were almost the same and I've used the call-command style to
select between your ant -projecthelp parsing and my sed solution.

> zsh I'd appreciate it.  There's also a minor cosmetic issue in that the
> default target is printed with a leading space.  The problem is I couldn't
> figure out how to do a substitution while condtitionally removing a
> trailing space.  Using ? or * didn't work for me to make a space optional.

Just using ${default_target# } does the job. The other cosmetic issue
was that targets without a description were added with an empty
description instead of with no description. I've attempted to fix this,
hopefully without breaking the rest of it. How do you specify target
descriptions in a build.xml file?

> Suggested improvements
> * A number of the options support completing on a classname.  However,
> this doesn't work unless the class file is in a package under the current
> directory.  It would be desirable to complete on any class in the
> classpath.  Since Ant's classpath isn't exposed, the best guess would be
> to use a classpath of $ANT_HOME/lib/*.jar.

On the 4.1 branch, there is a _java_class function which is meant to do
this but I can't entirely make sense of what it is doing and how to get
it to use $ANT_HOME/lib/*.jar as you suggest. It ought to use
_multi_parts too.

Certainly, this can still be improved. For zsh 4.0, the _java_class
stuff will need the be replaced with the state from Bill's function, the
-e option passed  to _message needs to go and the $ANT_ARGS stuff needs
to go. So don't expect this to work properly on 4.0.


Index: _ant
RCS file: /cvsroot/zsh/zsh/Completion/Unix/Command/_ant,v
retrieving revision 1.1
diff -u -r1.1 _ant
--- _ant	9 Aug 2002 15:28:24 -0000	1.1
+++ _ant	19 Aug 2002 14:44:00 -0000
@@ -1,8 +1,9 @@
 #compdef ant -value-,ANT_ARGS,-default-
 typeset -A opt_args
-local state line curcontext="$curcontext"
+local buildfile tmp state line curcontext="$curcontext"
 local target='*:target:->target'
+#local CLASSPATH="$ANT_HOME/lib/*.jar"
 if [[ $service = *ANT_ARGS* ]]; then
   compset -q
@@ -22,17 +23,73 @@
   '-emacs[produce logging information without adornments]' \
   '(-l -logfile)'{-l,-logfile}'[use specified file for
log]:logfile:_files' \
   '-logger[the class which is to perform
logging]:classname:_java_class' \
-  '-listener[add an instance of class as a project
listener]:classname:_java_class' \
-  '(-f -file -buildfile)'{-f,-file,-buildfile}'[use specified build
file]:build file:_files' \
-  '*-D[specify property with value to use]:property' \
+  '*-listener[add an instance of class as a project
listener]:classname:_java_class' \
+  '(-f -file -buildfile -find)'{-f,-file,-buildfile}'[use specified
build file]:build file:_files' \
+  '*-D[specify property with value to use]:property:->property' \
   '-propertyfile[load properties from specfied file]:property
file:_files' \
   '-inputhandler[specify class which will handle input
requests]:class:_java_class' \
-  '-find[search for buildfile]:file:_files' \
+  '(-f -file -buildfile)-find[search for build file towards the root of
filesystem]:build file:(build.xml)' \
   $target && return
-if [[ -n $state ]]; then
-  targets=( $(sed -n 's/ *<target name="\([^"]*\)".*/\1/p' < build.xml)
-  # ant can be used to get a list of targets for us like this but it is
-  # targets=( ${${(M)${(f)"$(_call_program targets $words[1]
-projecthelp)"}:# *}# } )
-  _wanted targets expl target compadd -a targets
+case $state in
+  property)
+    if compset -P '*='; then
+      _default
+    else
+      _message -e properties 'property name'
+    fi
+  ;;
+  target)
+    if zstyle -t ":completion:${curcontext}:targets" call-command; then
+      # Run ant -projecthelp also passing any of -find, -buildfile or
-f options.
+      # Parse output into an array of the format "target:description".
+      # For the array to be set with correct argument boundaries, the
+      # set statement needs to be eval'd.  On Cygwin, need to kill \r's
+      # from Java or parsing will fail.
+      eval set -A tmp "${$(_call_program targets "$words[1]" $buildxml
-projecthelp |
+	while read target desc
+	do
+          # This loop reads ant -projecthelp output from versions 1.3
to 1.5
+          ln="${target}${desc:+:$desc}"
+          [[ $target = "" ]] && continue  # skip blank lines
+          case $ln in
+              (Buildfile:*)
+                  buildfile=$desc
+              ;;
+              (Default:target:*)
+                  # with version 1.5, target is on the same line
+                  default_target="${${desc/target:/}# }"
+                  # versions 1.3 and 1.4 with default target on a
separate line
+                  if [[ -z $default_target ]]; then
+                      read junk
+                      read default_target junk
+                  fi
+                  # Output target again indicating its the default one.
+                  print -n "'${default_target}:(Default target) ' "
+              ;;
+	      *)
+              ;;
+              (*)
+                  # Return target and description
+                  print -n "'$ln' "
+              ;;
+          esac
+	done
+      )//$'\015'}"
+      _describe 'target' tmp
+    else
+      if [[ -n $opt_args[-find] ]]; then
+	buildfile=( (../)#${opt_args[-find]:-build.xml}(N[-1]) )
+      else
+	buildfile=${(v)opt_args[(I)(-f|-file|-buildfile)]:-build.xml}
+      fi
+      if [[ -f $buildfile ]]; then
+	targets=( $(sed -n 's/ *<target name="\([^"]*\)".*/\1/p' <
$buildfile) )
+	_wanted targets expl target compadd -a targets
+      else
+	_message -e targets target
+      fi
+    fi
+  ;;

This e-mail and any attachment is for authorised use by the intended recipient(s) only.  It may contain proprietary material, confidential information and/or be subject to legal privilege.  It should not be copied, disclosed to, retained or used by, any other party.  If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender.  Thank you.

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