have rake &&
_rake()
{
    local cur prev rakef i

    COMPREPLY=()
    cur=${COMP_WORDS[COMP_CWORD]}
    prev=${COMP_WORDS[COMP_CWORD-1]}
    rakef="Rakefile"

    if [[ "$prev" == "-f" ]]; then
        _filedir
        return 0
    fi

    if [[ "$cur" == *=* ]]; then
        prev=${cur/=*/}
        cur=${cur/*=/}
        if [[ "$prev" == "--rakefile=" ]]; then
            _filedir -o nospace
            return 0
        fi
    fi

    if [[ "$cur" == -* ]]; then
        COMPREPLY=( $( compgen -W '-n -H -I -N -P -q -f\
            -r -s -T -t -h -v -V\
            --dry-run --help '--libdir=' --nosearch --prereqs --quiet\
            '--rakefile=' '--require=' --silent --tasks --trace --usage\
            --verbose --version'\
            -- $cur ))
    else

        for (( i=0; i < ${#COMP_WORDS[@]}; i++)); do
            case "${COMP_WORDS[i]}" in
            -f)
                eval rakef=${COMP_WORDS[i+1]}
                break
                ;;
            --rakefile=*|--rakefile\=*)
                eval rakef=${COMP_WORDS[i]/*=/}
                break
                ;;
            esac
        done

        [ ! -f $rakef ] && return 0

        COMPREPLY=( $( rake -s -f "$rakef" -T | \
            awk -F ' ' '/^rake / { print $2 }' | \
            command grep "^$cur" ))

    fi
} &&
complete -F _rake $filenames rake
