--- title: "Linux command auto-completion" parent: Linux --- sources: [ask Ubuntu]() (parameters) and [stackoverflow]() (path completion) ___ ## Use: A way for my custom commands to have their parameters/arguments be auto-completed rather than having to type out the entire word, plus it can be used to show the different options that are available ## Simple options For commands that only care about options rather than file paths #### Example code: ```bash _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 } ## `foo` would show autocomplete above wordlist complete -F _foo foo ``` ###### (You place this in the /etc/bash_completion.d/ directory) Or if you don't want to lose where it is by putting it in that obscure directory, you can source in in your .bashrc by adding this line: ```bash source /path/to/your/autocomplete.sh ``` ___ Or you can make one automatically with my `command_autocomp_maker.sh` custom command that I made so that I can easily transfer over my commands without there being an annoying bridge of config between them and since they are pretty simple themselves ## Complex options + file paths source: [stack overflow]() For commands that are more specific, you can add options for parameters to include `/path/` completion, such as: `command1 --install /path/to/file` where you can set it to only have the `--install` parameter include `/path/` completion. ```bash __command_name_autocomplete() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--help -h --install -i --run -r --rebuild -rb --show-running-containers -ps --stop -s --remove -rm --logs -l --bash -b --sass -css --unit-tests -t" containers="nginx php mysql mongo node" sass="watch" # By default, autocomplete with options if [[ ${prev} == command_name ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi # By default, autocomplete with options if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi # For --install and -i options, autocomplete with folder if [ ${prev} == --install ] || [ ${prev} == -i ] ; then COMPREPLY=( $(compgen -d -- ${cur}) ) return 0 fi # For --stop --remove --logs and --bash, autocomplete with containers if [ ${prev} == --stop ] || [ ${prev} == -s ] || [ ${prev} == --remove ] || [ ${prev} == -rm ] || [ ${prev} == --logs ] || [ ${prev} == -l ] || [ ${prev} == --bash ] || [ ${prev} == -b ] ; then COMPREPLY=( $(compgen -W "${containers}" -- ${cur}) ) return 0 fi # For --sass and -css, complete with sass options if [ ${prev} == --sass ] || [ ${prev} == -css ] ; then COMPREPLY=( $(compgen -W "${sass}" -- ${cur}) ) return 0 fi # For --unit-tests and -t, complete with relative to command_name folder paths if [ ${prev} == --unit-tests ] || [ ${prev} == -t ] ; then COMPREPLY=( $(compgen -d -- ${cur}) ) return 0 fi } complete -o filenames -F __command_name_autocomplete command_name ``` #commands/source #commands/complete