# Bash autocomplete. # There are also options like -o nospace. see man for more info. # Usage: _foo() { _autocomplete "{foo,bar}" } ; complete -F _foo foo function _autocomplete() { local IFS=$'\n' local commands="${*}" COMPREPLY=() local cur="${COMP_WORDS[COMP_CWORD]}" local prev="${COMP_WORDS[COMP_CWORD-1]}" local command="${COMP_WORDS[0]}" COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) ) return 0 } # Autocomplete only first argument. function _autocomplete_first() { local IFS=$'\n' local commands="${*}" COMPREPLY=() local cur="${COMP_WORDS[COMP_CWORD]}" local prev="${COMP_WORDS[COMP_CWORD-1]}" local command="${COMP_WORDS[0]}" if [[ "${prev}" = "${command}" ]]; then COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) ) return 0 fi } # Autocomplete only first argument and the rest with files. function _autocomplete_first_ls() { local IFS=$'\n' local commands="${*}" COMPREPLY=() local cur="${COMP_WORDS[COMP_CWORD]}" local prev="${COMP_WORDS[COMP_CWORD-1]}" local command="${COMP_WORDS[0]}" if [[ "${prev}" = "${command}" ]]; then COMPREPLY=( $(compgen -W "${commands}" -- ${cur}) ) return 0 else COMPREPLY=( $(compgen -W "$(ls)" -- ${cur}) ) return 0 fi } # Autocomplete by grepping file names. function _autocomplete_grep() { local IFS=$'\n' COMPREPLY=() local pattern="${1}" local cur="${COMP_WORDS[COMP_CWORD]}" local prev="${COMP_WORDS[COMP_CWORD-1]}" local command="${COMP_WORDS[0]}" COMPREPLY=( $(compgen -W "$(ls | grep -E ${pattern})" -- ${cur}) ) return 0 } # Autocomplete nested program. function _autocomplete_nested() { # local IFS=$'\n' local cur prev words cword split i _init_completion -s || return for ((i = 1; i <= cword; i++)); do if [[ ${words[i]} != -* ]]; then local PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin local root_command=${words[i]} _command_offset ${i} return fi done }