LoginSignup
1
2

More than 5 years have passed since last update.

bash completionつくる

Last updated at Posted at 2016-08-14

いちいち確認するより他のパッケージのを参考にしていけば楽。/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
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2