获取auto_complete的值列表

时间:2015-11-11 08:53:59

标签: bash bash-completion

我有以下工作bash_completion代码

 _supdeploy()
{
    local cur prev opts cword
    _init_completion || return

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    first="${COMP_WORDS[1]}"
    opts="option1 option2 --help"

    case "${first}" in
        option1)
            if [[ "$cur" == * ]]; then
               COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
            fi
            return 0
            ;;
        option2)
            if [[ "$cur" == * ]]; then
               COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
            fi
            return 0
            ;;

        *)
            COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
            return 0
            ;;
    esac
} &&
complete -F _supdeploy supdeploy

当我选中时,我首先得到opts的列表,如果我使用其中一个选项,再次按Tab键,我会得到这些选项的arg列表。

我要做的是预先填充其中一些参数,这些参数具有分配给它们的值以及可供选择的列表。 我看到的所有例子都是从顶级使用这些例子,比如我的选择中的opts,但我想在第二级使用它。 我已经尝试在case循环中实现第二个if,并检查例如$cur是否为arg之一。 但它从未奏效,仍然只是在标签上打印完整列表。

1 个答案:

答案 0 :(得分:0)

如果您想在--arg1案例中列出option1的可能选项,可以检查上一个字(prev="{COMP_WORDS[COMP_CWORD-1]}")是否等于--arg1

    case "$first" in
        option1)
            case "$prev" in
              --arg1)
               COMPREPLY=( $( compgen -W 'A Ba Bb C' -- "$cur" ) )
               return 0
               ;;

              --arg2)
               COMPREPLY=( $( compgen -W '11 12 2 3' -- "$cur" ) )
               return 0
               ;;

              *)
                COMPREPLY=( $( compgen -W '--arg1 --arg2 --arg3 --help' -- "$cur" ) )
                return 0
                ;;
            esac
            ;;

        option2)

如果检查前一个单词不够灵活,您可以实现更复杂的逻辑。从手册页:

COMP_WORDS
       An array variable (see Arrays below) consisting of the  individ-
       ual  words  in the current command line.  The line is split into
       words as readline  would  split  it,  using  COMP_WORDBREAKS  as
       described above.  This variable is available only in shell func-
       tions invoked by the  programmable  completion  facilities  (see
       Programmable Completion below).