# bash autocomplete.
# usage: _foo() { _autocomplete "{foo,bar}" } ; complete -F _foo foo
# there are also options like -o nospace. see man for more info.
_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.
_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 by grepping file names.
_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.
_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
}