Autocomplete Phing targets on the command line
Shortly after writing my last post, it crossed my mind that it would be nice if I could autocomplete the targets in my Phing build file on the command line.
In order to do this, I read Buddy Lindsey’s Quick and Dirty Write Your Own Bash Autocomplete and made it do what I needed!
Start by creating a new bash completion file in the bash_completion.d directory. This file needs executable permission. This directory can usually be found at /etc/bash_completion.d, but on OS X using Homebrew, it’s at /usr/local/etc/bash_completion.d.
This is the file:
# Store this file in /etc/bash_completion.d/phing _phing () { local cur prev COMPREPLY=() buildfile=build.xml _get_comp_words_by_ref cur prev [ ! -f $buildfile ] && return 0 COMPREPLY=( $( compgen -W "$( phing -l | tr -s '\-' | sed s/^-/\|/ | tr -d '\|' \ | sed s/\ \ .*\// \ | sed s/Buildfile.*// | sed s/Default\ target:// | sed s/Subtargets:// \ | sed s/Main\ targets:// \ | tr -s ' ' \ | sed 's/[^[:print:]]//g' | sed s/\\[.*// | tr '\n' ' ' | tr -s '\n' 2>/dev/null )" \ -- "$cur" ) ) } complete -F _phing phing
It’s a bit messy because my knowledge of sed/tr isn’t too hot. What we do is create a list of words for the -W option to compgen by running phing -l and then manipulating the output to remove everyting that isn’t a target name using various sed and tr commands.
Once done, compgen creates the wordlist used by complete when you press tab after the word phing on the command line.
very nice