1

My programm can have the following format:

<command_name> <arguments> <options> -hosts <host1> <host2> ... <hostn> (<more_arguments>) ...

I am trying to set bash auto-completion, and based on debian-administration's article, I have done host completion like this :

(...)
case "${prev}" in
    -hosts)
        _known_hosts_real -a "$cur"
        return 0
        ;;
    (...)
(...)

Of course after writing -hosts bash is able to complete the name of a single host, but not multiple hosts. Is there a beautiful way to achieve this hack without completing hosts when we deal with other arguments than -hosts?

3
  • try to read multiple command line of being supported by auto completed , and rewrite your autocompletion. – PersianGulf Nov 19 '14 at 17:17
  • Why is zsh tagged? – Bratchley Nov 19 '14 at 18:08
  • My bad, I thought it was kind of similar. – denaitre Nov 20 '14 at 8:02
0

If you ignore the (<more_arguments>) case then you can just check whether -hosts is one of the earlier words:

(...)
for ((i=1;i<COMP_CWORD;i++)); do 
  if [ "-hosts" == "${COMP_WORDS[i]}" ]; then 
    _known_hosts_real -a "$cur" 
    return 0 
  fi 
done 
case "${prev}" in 
1
  • Thanks, I am using this hack for the moment. Some alternatives may exist, avoiding to check every word and considering the <more_arguments> case. – denaitre Nov 20 '14 at 8:05
0

I'm not sure if it's possible to create such autocompletion rule for space-separated hosts values. But if you don't mind using comma-separated lists then:

_myhost () {
  local cur prev opts
  _get_comp_words_by_ref cur prev

  opts='-hosts'
  servers='name1 name2 name3'

  if [[ ${cur} == -* ]] ; then
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
  else
    case "${prev}" in
      -hosts)
        if [[ "$cur" == *,* ]]; then
          local realcur prefix
          realcur=${cur##*,}
          prefix=${cur%,*}
          COMPREPLY=( $(compgen -W "${servers}" -P "${prefix}," -- ${realcur}) )
        else
          COMPREPLY=( $(compgen -W "${servers}" -- ${cur}) )
        fi
        ;;
      *)
        # do nothing
        ;;
    esac
  fi
}
complete -F _myhost myhost

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.