As I add more and more of my own script targets to my composer.json files, I find that it would be helpful to have tab autocomplete in bash. I asked on Twitter and didn’t get an immediate solution and as I had already done something similar for Phing, I rolled up my sleeves and wrote my own.

Start by creating a new bash completion file called composer 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/ (assuming you have already installed with brew install bash-completion ).

This is the file:

# Store this file in /etc/bash_completion.d/composer _composer_scripts() { local cur prev _get_comp_words_by_ref -n : cur COMPREPLY=() prev="${COMP_WORDS[COMP_CWORD-1]}" # # Complete the arguments to some of the commands. # if [ "$prev" != "composer" ] ; then local opts=$(composer $prev -h --no-ansi | tr -cs '[=-=][:alpha:]_' '[

*]' | grep '^-') COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi if [[ "$cur" == -* ]]; then COMPREPLY=( $( compgen -W '-h -q -v -V -n -d \ --help --quiet --verbose --version --ansi --no-ansi \ --no-interaction --profile --working-dir' -- "$cur" ) ) else local scripts=$(composer --no-ansi 2> /dev/null | awk '/^ +[a-z]+/ { print $1 }') COMPREPLY=( $(compgen -W "${scripts}" -- ${cur}) ) fi __ltrim_colon_completions "$cur" return 0 } complete -F _composer_scripts composer 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 # Store this file in /etc/bash_completion.d/composer _composer_scripts ( ) { local cur prev _get_comp_words_by_ref - n : cur COMPREPLY = ( ) prev = "${COMP_WORDS[COMP_CWORD-1]}" # # Complete the arguments to some of the commands. # if [ "$prev" != "composer" ] ; then local opts = $ ( composer $prev - h -- no - ansi | tr - cs '[=-=][:alpha:]_' '[

*]' | grep '^-' ) COMPREPLY = ( $ ( compgen - W "${opts}" -- $ { cur } ) ) return 0 fi if [ [ "$cur" == - * ] ] ; then COMPREPLY = ( $ ( compgen - W ' - h - q - v - V - n - d \ -- help -- quiet -- verbose -- version -- ansi -- no - ansi \ -- no - interaction -- profile -- working - dir ' -- "$cur" ) ) else local scripts = $ ( composer -- no - ansi 2 > / dev / null | awk '/^ +[a-z]+/ { print $1 }' ) COMPREPLY = ( $ ( compgen - W "${scripts}" -- $ { cur } ) ) fi __ltrim_colon _ completions "$cur" return 0 } complete - F _composer_scripts composer

(Note that __ltrim_colon_completions is only in recent versions of bash-completion, so you may need to remove this line.)

Reading from the bottom, to get the list of commands to composer, we create a list of words for the -W option to compgen by running composer --no-ansi and then manipulating the output to remove everything that isn’t a command using awk. We also create a separate list of flag arguments when the user types a hyphen and then presses tab.

Finally, we also autocomplete flags for any subcommand by running composer {cmd} -h --no-ansi and using tr and grep to limit the list to just words starting with a hyphen.

That’s it. Now composer {tab} will autocomplete both built-in composer commands and also custom scripts!

As you can see, in this example, in addition to the built-in commands like dump-autoload and show , you can also see my custom scripts, including apiary-fetch and .

This is very helpful for when my memory fails me!