Bash 每个参数具有多个参数值的自动完成

Bash Autocompletion with multiple argument values per argument

我第一次尝试实现制表符补全 - 它必须在 GIT Bash 中工作,并且它适用于我编写的 python 脚本(使用 argparser)

该脚本基本上有两个参数 --option_a--option_b,它们接受单个和多个参数值,例如script --option_a steakscript --option_a steak burger pizza 均有效。但是仍然有一组选项可供选择,因此您无法输入任何内容。

我已经完成了大部分:

已经完成的工作

OPTION_A_VALUES="bread pizza steak burger"
OPTION_B_VALUES="apple banana"

_autocomplete () {                
  COMPREPLY=()   
  local cur=${COMP_WORDS[COMP_CWORD]}
  local prev=${COMP_WORDS[COMP_CWORD-1]}

  case "$prev" in
   "--option_a")
       COMPREPLY=( $( compgen -W "$OPTION_A_VALUES" -- $cur ) )  
       return 0 
       ;;
  "--option_b")
        COMPREPLY=( $( compgen -W "$OPTION_B_VALUES" -- $cur ) )
        return 0 
       ;;
 esac

  if [[ ${cur} == -* ]]
    then
      COMPREPLY=($(compgen -W "--option_a --option_b" -- $cur ) )
    return 0
  fi
}

complete -o nospace -F _autocomplete script

script 是 python 脚本的别名。

问题

基本上我还需要做的是支持所有可能的参数值的自动完成 - 目前它在完成一个后停止:

当然,在完成 pizza 并输入 --<TAB><TAB> 之后,脚本应该会再次提示 --option_a --option_b

任何有关如何修改我的自动完成脚本以完成这项工作的帮助将不胜感激! 提前致谢。

你可以试试这个

_autocomplete () {
  COMPREPLY=()
  local cur=${COMP_WORDS[COMP_CWORD]}
  local prev=${COMP_WORDS[COMP_CWORD-1]}

  if [[ ${cur} == -* ]]
    then
      COMPREPLY=($(compgen -W "--option_a --option_b" -- $cur ) )
    return 0
  fi

  case "$prev" in
   --option_a|bread|pizza|steak|burger)
       COMPREPLY=( $( compgen -W "$OPTION_A_VALUES" -- $cur ) )
       return 0
       ;;
   --option_b|apple|banana)
       COMPREPLY=( $( compgen -W "$OPTION_B_VALUES" -- $cur ) )
       return 0
       ;;
 esac

}

想法是

如果 cur- 开头,compgen 立即获得 option_a option_b

如果 prev--option_a bread pizza steak burger 之一,它会再次获取值