Autocomplete Composer Script Names on the Command Line
Read on to learn how to use JSON to create an autocomplete functionality in a bash completion file, using only a few lines of JSON code.
Join the DZone community and get the full member experience.
Join For FreeAs 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/.
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:]_' '[\n*]' | 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 the composer, we create a list of words for the -W option to compgen by running the 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 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.
This is very helpful for when my memory fails me!
Published at DZone with permission of Rob Allen, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments