Search code examples
bashshellautocomplete

Using the Bash autocompletion of another command


When I create a command that wraps an existing command with some sugar, I'd like the new command to support the autocompletion of the original command. Is there a way to tell Bash to reuse the autocompletion script of another command?

Silly example:

cat > ~/ls-on-steroids.sh <<EOF
echo "Here are some goodies!"
ls "$@"
EOF
chmod +x ~/ls-on-steroids.sh

Now, how do I configure my new script such that when I type:

~/ls-on-steroids.sh <TAB><TAB>

I'd like the same behavior as with:

ls <TAB><TAB>

Preferably in a portable, repeatable manner, without having to manually track down the location of ls's autocomplete script.


Solution

  • You have to configure it manually, but it's relatively simple to copy completions from an existing command. First, run complete -p ls to see what, if any, command was defined for ls. If nothing comes up, ls doesn't use any special completions. You are probably expecting to see something like the following as the output, though

    complete -o default -F _longopt ls
    

    which says that the function _longopt is called to generate completions for the command ls, and if that doesn't generate any results, use the bash default completion. You can apply the same function to ls_on_steroids by simply running

    complete -o default -F _longopt ls_on_steroids
    

    (i.e., replace ls with ls_on_steroids as the final argument in the command printed by complete -p).