Cet article est la suite de: L’auto complétion programmable en bash: partie 10.

Complétion des options longues - suite

Aujourd’hui on voit que _get_comp_words_by_ref peut être appellée avec une option bien utile qui modifie COMP_WORDBREAKS.

La variable COMP_WORDBREAKS contient les caractères qui permettent de splitter les mots pour la complétion. Voici son contenu:

$  echo $COMP_WORDBREAKS 
"'><=;|&(:

On voit que = en fait partie, et c’est ce qui rendait un peu compliqué le code de la dernière fois. Grâce à l’option -n de la fonction _get_comp_words_by_ref, on va pouvoir simplifier ça:

_mytool_long_options()
{
    case $1 in
        --format)
            options='dot documentation'
            ;;
    esac
    COMPREPLY=( $( compgen -W "$options" -- "$2" ) )
}

_mytool()
{
    local cur prev command options
    COMPREPLY=( )
    _get_comp_words_by_ref -n = cur prev
    commands='new compile test'

    if [[ $COMP_CWORD -eq 1 ]]; then
        COMPREPLY=( $( compgen -W "$commands" -- "$cur" ) )
    elif [[ "$cur" == --*=* ]]; then
        _split_longopt
        _mytool_long_options "$prev" "$cur" 
    elif [[ "$cur" == -* ]]; then
        command=${COMP_WORDS[1]}
        case $command in
            new)
                options='--without-test'
                ;;
            compile)
                options='--verbose'
                ;;
            test)
                options='--format='
                compopt -o nospace
                ;;
        esac
        COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
    fi
}
complete -F _mytool mytool

Ce code fait la même chose que celui du dernier article, mais est bien plus simple et lisible.

À demain.