How to create script with auto-complete?
When I use program like svn
and I type in Gnome Terminal:
svn upd
and hit Tab it's autocompleted to:
svn update
Is it possible to do something like that in my custom bash script?
You'll have to create a new file:
/etc/bash_completion.d/foo
For a static autocompletion (--help
/ --verbose
for instance) add this:
_foo()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --verbose --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _foo foo
-
COMP_WORDS
is an array containing all individual words in the current command line. -
COMP_CWORD
is an index of the word containing the current cursor position. -
COMPREPLY
is an array variable from which Bash reads the possible completions.
And the compgen
command returns the array of elements from --help
, --verbose
and --version
matching the current word "${cur}"
:
compgen -W "--help --verbose --version" -- "<userinput>"
Source
Here is a complete tutorial.
Let's have an example of script called admin.sh
to which you would like to have autocomplete working.
#!/bin/bash
while [ $# -gt 0 ]; do
arg=$1
case $arg in
option_1)
# do_option_1
;;
option_2)
# do_option_2
;;
shortlist)
echo option_1 option_2 shortlist
;;
*)
echo Wrong option
;;
esac
shift
done
Note the option shortlist
. Calling the script with this option will print out all possible options for this script.
And here you have the autocomplete script:
_script()
{
_script_commands=$(/path/to/your/script.sh shortlist)
local cur
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )
return 0
}
complete -o nospace -F _script ./admin.sh
Note that the last argument to complete is the name of the script you want to add autocompletion to. All you need to do is to add your autocomplete script to bashrc as
source /path/to/your/autocomplete.sh
or copy it to /etc/bash.completion.d
You can use the Programmable Completion. Have look at /etc/bash_completion
and /etc/bash_completion.d/*
for some examples.