bash completionつくる

いちいち確認するより他のパッケージのを参考にしていけば楽。/usr/share/bash-completion/completions/以下を参照。

```
    case $prev in
        -b|-h|--help|-p)
            return 0
            ;;
        -n)
            COMPREPLY=( $( compgen -W "{1..$(_ncpus)}" -- "$cur" ) )
            return 0
            ;;
    esac
```
ほー bash だと echo "{1..100}" みたいにすると展開するのね

```
    if [[ "$cur" == -* ]]; then
        local helpopts=$( _parse_help "$1" )
        COMPREPLY=( $( compgen -W "${helpopts//#/} -2 -3 -4 -5 -6 -7 -8 -9" \
            -- "$cur" ) )
        return 0
    fi
```

なんで [[ ]] と二重にカッコなのか。


## 作った
```
_snapper()
{
    local configdir="/etc/snapper/configs"
    local cur prev words cword
    _init_completion || return

    local GLOGAL_SNAPPER_OPTIONS='
        -q --quiet
        -v --verbose
        --utc
        --iso
        -t --table-style
        -c --config
        -r --root
        --no-dbus
        --version
        --help
    '

    # see if the user selected a command already
    local COMMANDS=(
        "list-configs" "create-config" "delete-config" "set-config"
        "list" "ls"
        "create" "modify" "delete" "remove" "rm"
        "mount" "umount"
        "status" "diff" "xadiff"
        "undochange" "rollback"
        "setup-quota"
        "cleanup")

    local command i
    for (( i=0; i < ${#words[@]}-1; i++ )); do
        if [[ ${COMMANDS[@]} =~ ${words[i]} ]]; then
            command=${words[i]}
            break
        fi
    done

    # supported options per command
    if [[ "$cur" == -* ]]; then
        case $command in
            create-config)
                COMPREPLY=( $( compgen -W '--fstype -f
                  --templete -t' -- "$cur" ) )
                return 0
                ;;
            list|ls)
                COMPREPLY=( $( compgen -W '--type -t
                  --all-configs -a' -- "$cur" ) )
                return 0
                ;;
            create)
                COMPREPLY=( $( compgen -W '--type -t
                  --pre-number
                  --print-number -p
                  --description -d
                  --cleanup-algorithm -c
                  --userdata -u
                  --command' -- "$cur" ) )
                return 0
                ;;
            modify)
                COMPREPLY=( $( compgen -W '--description -d
                  --cleanup-algorithm -c
                  --userdata -u' -- "$cur" ) )
                return 0
                ;;
            delete|remove|rm)
                COMPREPLY=( $( compgen -W '--sync -s
                  ' -- "$cur" ) )
                return 0
                ;;
            status)
                COMPREPLY=( $( compgen -W '--output -o
                    ' -- "$cur" ) )
                return 0
                ;;
            diff)
                COMPREPLY=( $( compgen -W '--input -i
                    --diff-cmd
                    --extensions -x' -- "$cur" ) )
                return 0
                ;;
            undochange)
                COMPREPLY=( $( compgen -W '--input -i
                    ' -- "$cur" ) )
                return 0
                ;;
            rollback)
                COMPREPLY=( $( compgen -W '--print-number -p
                    --description -d
                    --cleanup-algorithm -c
                    --userdata -u' -- "$cur" ) )
                return 0
                ;;
            *)
                COMPREPLY=( $( compgen -W "$GLOGAL_SNAPPER_OPTIONS" -- "$cur" ) )
                return 0
                ;;
        esac
    fi

    # specific command arguments
    if [[ -n $command ]]; then
        case $command in
            create-config)
                case "$prev" in
                     --fstype|-f)
                        COMPREPLY=( $( compgen -W 'btrfs ext4 lvm(xfs) lvm(ext4)
                        ' -- "$cur" ) )
                        ;;
                esac
                return 0
                ;;
            list)
                case "$prev" in
                    --type|-t)
                        COMPREPLY=( $( compgen -W 'all single pre-post
                        ' -- "$cur" ) )
                        ;;
                esac
                return 0
                ;;
            create)
                case "$prev" in
                    --type|-t)
                        COMPREPLY=( $( compgen -W 'single pre post
                        ' -- "$cur" ) )
                        ;;
                --pre-number)
                # get .snapshot directory
                        COMPREPLY=( $( compgen -W '
                        ' -- "$cur" ) )
                        ;;
                --cleanup-algorithm|-c)
                        COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
                        ' -- "$cur" ) )
                        ;;
                esac
                return 0
                ;;
            modify)
                case "$prev" in
                    --cleanup-algorithm|-c)
                        COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
                        ' -- "$cur" ) )
                        ;;
                esac
                return 0
                ;;
            status)
                case "$prev" in
                    --output|-o)
                        COMPREPLY=( $( compgen -f -- "$cur" ) )
                        ;;
                esac
                return 0
                ;;
            diff)
                return 0
                ;;
            undochange)
                return 0
                ;;
            rollback)
                case "$prev" in
                    --cleanup-algorithm|-c)
                        COMPREPLY=( $( compgen -W 'empty-pre-post timeline number
                        ' -- "$cur" ) )
                        ;;
                esac
                return 0
                ;;
        esac
    fi

    # no command yet, show what commands we have
    if [ "$command" = "" ]; then
        COMPREPLY=( $( compgen -W '${COMMANDS[@]}' -- "$cur" ) )
    fi

    return 0
} &&
complete -F _snapper snapper
```